icon-9.4.3/0002775000175000017500000000000010336137166012013 5ustar chrishchrishicon-9.4.3/bin/0002775000175000017500000000000010336137151012555 5ustar chrishchrishicon-9.4.3/bin/.placeholder0000664000175000017500000000000007140713035015024 0ustar chrishchrishicon-9.4.3/doc/0002775000175000017500000000000010336137231012551 5ustar chrishchrishicon-9.4.3/doc/clnroff.sed0000664000175000017500000000017710334226630014702 0ustar chrishchrish# sed(1) directives for cleaning up nroff(1) formatted man page /^User Commands/d /^ICONT/d /^University/d s/.//g s/’/'/g icon-9.4.3/doc/files.htm0000664000175000017500000001670710334231663014400 0ustar chrishchrish File Organization in Version 9.4 of Icon

[Icon home]

File Organization in Version 9.4 of Icon

Gregg M. Townsend
Department of Computer Science
The University of Arizona

www.cs.arizona.edu/icon/v943/files.htm
Last updated November 8, 2005

Introduction

Version 9.4 of Icon introduced several changes to the organization of Icon's files under Unix and the methods for finding them. These changes, which are described below, simplify the installation and use of Icon.

Library procedure inclusion

As Icon evolved, the procedures from the Icon program library became more important to basic Icon programs, and vital to graphics programs; yet the IPL had been treated as a separate product. A complete Icon system required two downloads and two installation efforts, with proper coordination.

With Icon 9.4, the complete set of basic and graphics library procedures is included with every binary Icon distribution. Also present are the associated $include files and a selected few programs from the library — notably VIB, the visual interface builder.

Source distributions of Icon 9.4 include the full library, which also continues to be available separately.

Installation directory structure

An Icon binary distribution unpacks to produce an icon directory containing bin, lib, man, and doc subdirectories. Building Icon from source produces these same directories.

The bin directory contains executables of icont, the Icon translator; iconx, the Icon interpreter; a few library programs including vib; and libcfunc.so, the loadable C functions. There is a symbolic link from icon to icont. Files in this directory are system dependent.

The lib directory holds $include files and "ucode" (.u1/.u2) files of program library procedures. This directory is system independent.

The man directory holds the Unix man page for icont, and the doc directory holds HTML (.htm) documentation files. These directories are also system independent.

This structure is similar to that of binary distributions of Icon 9.3. The main difference is that the lib directory no longer holds just a subset of the procedure collection, and the few files from the former include directory have moved into lib.

Installation location

The icon directory can be installed in any public or private area as long as its internal structure is preserved. When upgrading an existing Icon installation, replacing the previous Icon directory with the new one may provide the smoothest transition. Old Icon binaries will continue to function correctly with the new interpreter.

In order to consider packaging Icon binaries in Linux RPM files, or other similar packages, it is necessary to define a "canonical" location for installing Icon. The suggested canonical system installation location for Icon is /opt/icon. The /opt directory is present today on most Unix systems and is the location recommended by the emerging File Hierarchy Standard (FHS), www.pathname.com/fhs.

For convenience of use it may be desirable to provide symbolic links from a directory such as /opt/bin or /usr/local/bin to programs in the Icon bin directory. If this is done, the list should include at least icon, icont, iconx, and vib.

Automatic inference of iconx location

Past versions of icont were configured to know the location of iconx in order to embed this in generated binaries. The iconx location was configured by editing src/h/path.h in source builds or by using the patchstr utility to edit the icont executable when installing a binary distribution.

In version 9.4, icont deduces its own location, and from this it infers the location of iconx in the same directory. No configuration of icont is needed, and the correct path is embedded automatically, requiring only that icont and iconx reside in the same directory.

It is still possible to configure a fixed path in icont using the patchstr utility. If this is done, the configured path is used instead of the inferred path.

Automatic search for iconx at execution

The path that icont embeds in an Icon executable makes binary distributions of Icon programs difficult because the embedded path must be edited to match the installed location of iconx. The ipatch utility performed this task when installing binary distributions of Icon 9.3.

Icon 9.4 implements a simple search in the shell script that heads each generated Icon executable. The new header script searches for iconx in these places:

  1. in the location specified by the ICONX environment variable
  2. in the same directory as executing binary
  3. in a location specified in the script itself (as generated by icont or as patched later)
  4. in the command search path ($PATH)

The second item is the key: If there is a copy of iconx in the same directory as the executing program, it is found automatically and used as the interpreter. An Icon program can now be distributed in binary form simply by including an iconx executable in the same directory as the program executable.

The ipatch utility has been modified to recognize both old and new headers, and can still be used to edit the path embedded in an Icon executable.

Automatic library access

The ability to figure out its own location also lets icont provide automatic access to library procedures. The inferred location of the lib directory is implicitly appended to the paths, if any, specified by LPATH and IPATH environment variables. To use only the standard library files, no environment variables need be set.

In a similar manner, iconx creates or alters the FPATH environment variable before beginning execution of an Icon program. This provides transparent access to the library's loadable C functions without requiring explicit user action.

No Setup step

With the changes above, the executable files in an Icon binary distribution are ready for use without modification. The annoying and error-prone Setup step that was necessary with previous versions is no longer required. With Icon 9.4, installation can be as simple as just unpacking the tar file and adding its bin directory to the search path.


icon-9.4.3/doc/install.htm0000664000175000017500000000452710334231663014741 0ustar chrishchrish Installing Binaries of Version 9.4 of Icon

[Icon home]

Installing Binaries of Version 9.4 of Icon

Gregg M. Townsend
Department of Computer Science
The University of Arizona

www.cs.arizona.edu/icon/v943/install.htm
Last updated November 8, 2005

 

These instructions explain how to install Unix binaries of Version 9.4 of Icon. For instructions on building an Icon source package, see Building Icon from Source.

Installing a Private Copy of Icon

To install Icon in your own directory, just unpack the tar file. This produces a directory with four subdirectories: bin, lib, doc, and man. Add the bin directory to your shell's search path.

For instructions on building and running Icon programs, see the man pages for icon and icont. For information about the Icon language, see the documentation guide.

Installing a Public Copy of Icon

A single copy of Icon can be shared among users by unpacking it in a public area, or moving it there. We suggest renaming the directory to /opt/icon for new installations, but any location is acceptable. It is only important that the bin and lib directories retain those names as members of a common parent directory. (More details about the Icon file organization are available separately.)

You can make symbolic links from other locations to programs in the Icon bin directory. For example, you can link /usr/local/bin/icon to /opt/icon/bin/icon. If you do this, link all of icon, icont, iconx, and (if present) vib.


icon-9.4.3/doc/lb80.jpg0000664000175000017500000000536607273403523014036 0ustar chrishchrishJFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222P<"/!1"AQa$2Rq#1 q!14QR3SACa ?1{ -IƼ;J@6|/#s_Zqֶ8^`b7Ϸ7y-8h>Ƽ/GHQ.1_XɦƘ[*UbAɥŋW+SX.IP9#><}fϻ$TJʓ`N`$t2_WQ  -?yZyYN/fJipR@ ?z͸0m \CHm@8܁%'O|Mc@lr?m$b^R9(M/&=)l4$m#!fҧJi ,#A#9> 0й6BEʲ'հI$Tn+@|U&W$!% v 5J܊Y͜>DO 83ŲckFܛzDS<3LvZoZk.jGc_n9nGw) *\sɿ(2;ͳbJ1`$Tc)EmsZ )) qd}v ]"sBJQ1jN25gc@ȑ\uj:TWGB(cq{_JaQkT4v [1`cVF< #vK¡c>&WvJYZT'I(U^Vʛy)X̆ckҷ/l^SmfLaX,ߟQzv0:ZaĦL ՟˛~gTr~CuJ>Ems)8ѓ cđX~!/=z@X⤅2'ދ%" AG (]I8ّDCs$VZM&u*SDdWeֵ㢞Puz;XuL7Ò,TX7s0&P݋n5?d*|ZV7uPHl [&*,Z>DݒQ-zwdPU<:E!*G m=e,P!_c~?͵7tܕ,2WL[|U)&R;~PiN.lDvQF_sUNҤ-Gj3 ǿ9|\7T]@fКUDUC 9RvMBai [e xto! q3B?udtp-QBV¬nIf8*q?\ҊiRiLd^@ "ްu \I]-o* %&^}t3v^c1nFK =Ġ@mdzg0We )RroRYI?5;vK 7Dm҄KQS&rlcxn1V,1٘-|qJM+\9XUKT3 E߰2*sLJ1}q[m)X^5/Anc<|{Rg^&bRc$,GuVBlyluLdZWKIJ]3ǒ )U^VѰ%Hqo]˰{[ݓ zuS)SvT6hkS1U %\VWI>oѺn*$fQ1Gj *JJ2=^<ʉ'="^t/ U$S{F#3A 2Ǿ;d9uee_^(c$Nsi0e®!r,k6*ٜR,zBrV_i _\M&NɅ %1)a-cbF?"4D Q]6M#6=W\Kk)ا11UtR,79 r~ǢNҧ:.W\eC'ȱX Xg~cCC{UDuW$En>29-Ú+~{{~=;k%Y$⒤F=,,~jt{Xn;Qg0ĔV E&P% p\OT^Kb|`@ěq޸nN0~3!v1F~'M,ҤdJd KP2i"M/a.#*1ZWȥB262VY/2f& MinZ֑Cؿicon-9.4.3/doc/gb80.jpg0000664000175000017500000000441607203016260014013 0ustar chrishchrishJFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222P<"9 !1A"Qaq2#3B4CRSd)!1AQ"aq ?;GfU{i^,QWPgY&8Ln᪵Ah-?yYȞF?('>Ί*6E4tƠF+(VӴr~:_L .U3Tf6ygbO$5]7S-lP]? Wo3ӥHK0%<'9fƱ iO3I]QHSp~]vvֆx%M-C5:RZY0K/Fp<_yIkvFiP/VKuOkZ^COf$}2z0xކ6Ye2,gf,yO?}9!틧-*uTRlCN~H?N]MO"2 U$͑NC8&'Rw ;K:q>4dJ&+-298>OSmSiVRONr`:9q4OUhʧycK:)u_:?/k僅 m\V!)PLx:a_y܂*ŹY"DъUiNIG2jM_5UzQ92N3 ~zstIAqz:}5'I $DJx=9œ{S3rT_Fp=| nJgK%Αgb3$JlcH5Dv|2F}{S\X|a|MpiujX&}Rא(,kR F1cα:]!ךP]GGP` tLX6GSEn^T&e"T¤+O7qO5O85$t u`y$gۍFӍJPX)$`NЩUYP: $]oʶ. >0to<_ȷAJ]Y{ʬZB>@OFqUT%3G%O֕>qSJePFgt#-PnX/Qjۦ{-(Rq VcA.&X3߁l\g^hGTe&1dp}*IƱ HC\H!Bha4041PdHsή0DWj9Iye)XfP;,Ld ?^; \c#rs~ҵfCޑU~eaE 鳗GJ<ա-ʚ:g]XP\UϷB;7 5+SYWP:S8Qt q Ȭy}PEt =C|14GqktqVP*9@ik*㬵lH+h1S5Pa @p΅mPsp$!KsO[4q#jNrԭX 8?&}DMP/=&QIl`5G”W2ĭ2Lc:76t~1:麡dY;^Micon-9.4.3/doc/faq.htm0000664000175000017500000004445510336135114014042 0ustar chrishchrish Icon Programming Language FAQ

Frequently Asked Questions about the Icon programming language

www.cs.arizona.edu/icon/faq.htm
Last updated November 14, 2005

Learning about Icon
A1. What is Icon?
A2. What is Icon good for?
A3. What are Icon's distinguishing characteristics?
A4. What is the Icon program library?
A5. Where can I learn more about Icon?
A6. Where are some simple examples?
A7. How about comprehensive documentation?

Implementations
B1. What platforms support Icon?
B2. How do I get started with Icon?
B3. Is there a Unicode version of Icon?
B4. What happened to the compiler?

Administration
C1. What is the Icon Project?
C2. How often is the on-line material updated?
C3. Where did Icon come from?
C4. Where is Icon going?

Support
D1. Is there a users' group for Icon?
D2. How do I get technical support?

Programming
E1. Why doesn't read() work with every?
E2. Why doesn't string invocation such as "foo"() work?
E3. How can I call a C function?
E4. Can I open a bidirectional pipe?


Learning about Icon

A1. What is Icon?

Icon is a very high level general-purpose programming language with extensive features for processing strings (text) and data structures. Icon is an imperative, procedural language with a syntax that is reminiscent of C and Pascal, but with semantics at a much higher level.

Icon has a novel expression-evaluation mechanism that integrates goal-directed evaluation and backtracking with conventional control structures. It has a string scanning facility for pattern matching that avoids the tedious details usually associated with analyzing strings. Icon's built-in data structures include sets and tables with associative lookup, lists that can be used as vectors or stacks and queues, and records.

Icon is a strongly, though not statically, typed language. It provides transparent automatic type conversion: For example, if an integer is used in an operation that requires a string, the integer is automatically converted to a string.

Several implementations of Icon have high-level graphics facilities with an easily programmed window interface.

Icon manages storage automatically. Objects are created as needed during program execution and space is reclaimed by garbage collection as needed. The sizes of strings and data structures are limited only by the amount of available memory.

A2. What is Icon good for?

As a general-purpose programming language with a large computational repertoire, Icon can be used for most programming tasks. It's especially strong at building software tools, for processing text, and for experimental and research applications.

Icon is designed to make programming easy; it emphasizes the value of programmer's time and the importance of getting programs to work quickly. Consequently, Icon is used both for short, one-shot tasks and for very complex applications.

A3. What are Icon's distinguishing characteristics?

  • A high-level, general-purpose programming language
  • Friendly line-oriented syntax (no semicolons needed)
  • Emphasis on programmer productivity
  • Usually interpreted
  • Evolved from programming languages (vs. scripting languages)
  • Procedural control flow plus generators and goal-directed evaluation
  • Values have types; variables are typeless, accept any value
  • Static scoping: global or (procedure) local
  • Automatic garbage collection
  • All integers have arbitrary precision
  • Uses strings (not chars) as basic text datatype
  • Has lists that function as arrays, queues, and stacks
  • Also has sets, tables, records (structs), reals (doubles), more
  • No second-class "primitive types"
  • Not "object-oriented" (no classes, inheritance, or instance methods)
  • No exception catching
  • No concurrency (no threads, monitors, semaphores, or synchronization)
  • Has co-expressions (coroutines)
  • Basic least-common-denominator system interface (a la ANSI C)
  • Procedural graphics (event-driven paradigm available but not mandated)
  • Retained windows (programs are never called to repaint)
  • Simple GUI builder that can re-edit its generated code
  • Turtle graphics package
  • Large library of contributed procedures and programs

A4. What is the Icon program library?

The library is a collection of programs and procedures written in Icon. User contributions are welcome and form a significant portion of the library.

Library procedures effectively augment the built-in functions available to an Icon program. A wide variety of procedures currently exists, and most graphically-based programs are built around library procedures.

The programs in the library range from simple demonstrations to handy tools to complex graphical applications.

The library is a resource for both new and experienced programmers. In addition to their basic utility, its programs and procedures serve as examples of how things can be written in Icon.

The library is indexed at www.cs.arizona.edu/icon/library/ipl.htm.

A5. Where can I learn more about Icon?

Here are some good places to start.

A6. Where are some simple examples?

For some simple text-based programs, see any of those introductory documents in the preceding question. For some simple graphics programs, see www.cs.arizona.edu/icon/gb/progs/progs.htm.

Many more examples, typically larger, are found in the Icon program library; see the indexes of Basic Programs and Graphics Programs.

A7. How about comprehensive documentation?

Two books define the Icon language. The core language is covered in The Icon Programming Language (third edition), by Griswold and Griswold. Graphics facilities are described in Graphics Programming in Icon by Griswold, Jeffery, and Townsend. These books contain both tutorial and reference material.

Icon's internals are detailed in The Implementation of the Icon Programming Language by Griswold and Griswold. Although considerable changes have occurred since Version 6, described in the book, the basic structure of Icon remains the same. Two technical reports, IPD112 and IPD239, describe subsequent changes.

Printed copies of the Language and Graphics books are available from Jeffery Systems (www.zianet.com/jeffery/books). All three books can be downloaded at no charge from the Icon books page, www.cs.arizona.edu/icon/books.htm.

The Icon Programming Language Handbook, by Thomas W. Christopher, is available on the web at www.tools-of-computing.com/tc/CS/iconprog.pdf.

An on-line index to the Icon program library is found at www.cs.arizona.edu/icon/library/ipl.htm.

There is a large amount of additional information at the Icon web site, www.cs.arizona.edu/icon.


Implementations

B1. What platforms support Icon?

Current implementations with graphics support are available for Unix (including Linux) and Windows. The Unix implementation also runs on Darwin, the Macintosh development environment, or the Cygwin environment under Windows. Older versions of Icon are available for some other systems. An alternative Java-based implementation for Unix, Jcon, is also available.

B2. How do I get started with Icon?

Version 9.4.3 of Icon for Unix can be downloaded from www.cs.arizona.edu/icon/v943. Source and binary packages are available, each with the complete Icon program library.

Version 9.3 of Icon for Windows is compatible at the source level with version 9.4.3. It can be downloaded from www.cs.arizona.edu/icon/v93w.htm. The Version 9.4.3 library can be obtained separately from www.cs.arizona.edu/icon/v943.

For older implementations, start at www.cs.arizona.edu/icon/implver.htm. Jcon is at www.cs.arizona.edu/icon/jcon.

B3. Is there a Unicode version of Icon?

No. Icon is defined in terms of 8-bit characters, and changing this presents several design challenges that would likely break existing programs. Also, modifying the C implementation is probably infeasible, but a Unicode version of Jcon might be possible.

B4. What happened to the compiler?

For a while, Unix distributions included both an interpreter and a compiler; but the interpreter is is usually fast enough even for production work, and most people found that using the compiler wasn't worth the extra compilation time or the hassles involved. We no longer advertise the compiler or produce binaries for it. It is still part of the source code distribution, and we have not deliberately broken it, but we no longer support it and we cannot offer help if problems arise.


Administration

C1. What is the Icon Project?

The Icon Project is a name used by the group that distributes and supports the Icon programming language. The project maintains the Icon web site at www.cs.arizona.edu/icon. A non-commercial organization, the project is supported by the Department of Computer Science at the University of Arizona.

C2. How often is the on-line material updated?

New material is added when it's available. Established implementations usually are updated only when there's a new version. This typically is every year or two. The Icon program library is updated on a similar schedule.

C3. Where did Icon come from?

Icon is the latest in a series of high-level programming languages designed to facilitate programming tasks involving strings and structures. The original language, SNOBOL, was developed at Bell Telephone Laboratories in the early 1960s. SNOBOL evolved into SNOBOL4, which is still in use. Subsequent languages were developed at the University of Arizona with support from the National Science Foundation. Although it has similar objectives and many similar capabilities, Icon bears little superficial resemblance to SNOBOL4.

Icon implementations were developed by faculty, staff, and students at the University of Arizona, with significant contributions from volunteers around the world. An Icon history by Ralph and Madge Griswold appears in the preprints of the second History of Programming Languages Conference (HOPL-II), ACM SIGPLAN Notices, March 1993 (Vol 28, No 3).

The name Icon is not an acronym, nor does it stand for anything in particular, although the word iconoclastic was mentioned when the name was chosen. The name predates the now common use of icon to refer to small images used in graphical user interfaces. This sometimes misleads people into thinking that Icon is designed to create or manipulate icons, but there's no good solution to that problem.

C4. Where is Icon going?

We continue to use Icon on a daily basis, but no significant changes are planned. We expect to support the Unix version for the forseeable future, and to distribute ports to other systems as supplied by volunteers.

The Unicon project is developing an object-oriented language based on Icon. For more information, see unicon.sourceforge.net. An earlier object-oriented extension to Icon, Idol, can be found in the Icon program library.


Support

D1. Is there a users' group for Icon?

There is no official Icon users' group, but the Usenet newsgroup comp.lang.icon is dedicated to issues relating to the Icon language.

D2. How do I get technical support?

The Icon Project is not a commercial organization, and its capacity for providing technical support is limited. Please use the appropriate resource when you need assistance:


Programming

E1. Why doesn't read() work with every?

every s := read() do {...} doesn't loop because read() produces a single value and then fails if resumed. Other "consumer" procedures such as get() and pop() work the same way. Use a while loop with these procedures, and save every for use with generators such as !x or key(T).

E2. Why doesn't string invocation such as "foo"() work?

String invocation works if the procedure is present; the catch is that the linker removes unreferenced procedures. To ensure a procedure's presence, reference it in the main() procedure. A simple reference suffices, as in refs := [foo, bar, baz]; it's not necessary to actually call it.

(Why does the linker remove unreferenced procedures? Because this can save huge amounts of memory for programs that use the library.)

E3. How can I call a C function?

You can't call an arbitrary C function, but if you're willing to write a function to Icon's specifications, there are two approaches. Under Unix, which provides loadfunc(), you can load one or more functions from a shared library, and then treat them as if they had been written in Icon. Some examples can be found in the cfuncs and packs/loadfuncs directories of the Icon program library. The more cumbersome approach is to add code to the Icon interpreter and rebuild it; some hooks are provided for this purpose. Both approaches are discussed in Calling C Functions from Icon, www.cs.arizona.edu/icon/docs/ipd240.htm.

The Jcon implementation allows Icon programs to call Java code that is written to Jcon specifications.

E4. Can I open a bidirectional pipe?

No, this is not possible. Although the concept is simple — write a line to a program via a pipe, then read that program's output — it probably wouldn't work. Most I/O libraries don't write anything to a pipe until they've filled a buffer, and the most likely consequence would be a deadlock, with each program waiting for the other to send more data.


This FAQ is edited by Gregg Townsend. It includes contributions from Ralph Griswold, Cliff Hathaway, Clint Jeffery, Bob Alexander, and Todd Proebsting. icon-9.4.3/doc/faq.txt0000664000175000017500000003536310336135347014077 0ustar chrishchrish Frequently Asked Questions about the Icon programming language www.cs.arizona.edu/icon/faq.htm Last updated November 14, 2005 Learning about Icon A1. What is Icon? A2. What is Icon good for? A3. What are Icon's distinguishing characteristics? A4. What is the Icon program library? A5. Where can I learn more about Icon? A6. Where are some simple examples? A7. How about comprehensive documentation? Implementations B1. What platforms support Icon? B2. How do I get started with Icon? B3. Is there a Unicode version of Icon? B4. What happened to the compiler? Administration C1. What is the Icon Project? C2. How often is the on-line material updated? C3. Where did Icon come from? C4. Where is Icon going? Support D1. Is there a users' group for Icon? D2. How do I get technical support? Programming E1. Why doesn't read() work with every? E2. Why doesn't string invocation such as "foo"() work? E3. How can I call a C function? E4. Can I open a bidirectional pipe? _________________________________________________________________ Learning about Icon A1. What is Icon? Icon is a very high level general-purpose programming language with extensive features for processing strings (text) and data structures. Icon is an imperative, procedural language with a syntax that is reminiscent of C and Pascal, but with semantics at a much higher level. Icon has a novel expression-evaluation mechanism that integrates goal-directed evaluation and backtracking with conventional control structures. It has a string scanning facility for pattern matching that avoids the tedious details usually associated with analyzing strings. Icon's built-in data structures include sets and tables with associative lookup, lists that can be used as vectors or stacks and queues, and records. Icon is a strongly, though not statically, typed language. It provides transparent automatic type conversion: For example, if an integer is used in an operation that requires a string, the integer is automatically converted to a string. Several implementations of Icon have high-level graphics facilities with an easily programmed window interface. Icon manages storage automatically. Objects are created as needed during program execution and space is reclaimed by garbage collection as needed. The sizes of strings and data structures are limited only by the amount of available memory. A2. What is Icon good for? As a general-purpose programming language with a large computational repertoire, Icon can be used for most programming tasks. It's especially strong at building software tools, for processing text, and for experimental and research applications. Icon is designed to make programming easy; it emphasizes the value of programmer's time and the importance of getting programs to work quickly. Consequently, Icon is used both for short, one-shot tasks and for very complex applications. A3. What are Icon's distinguishing characteristics? * A high-level, general-purpose programming language * Friendly line-oriented syntax (no semicolons needed) * Emphasis on programmer productivity * Usually interpreted * Evolved from programming languages (vs. scripting languages) * Procedural control flow plus generators and goal-directed evaluation * Values have types; variables are typeless, accept any value * Static scoping: global or (procedure) local * Automatic garbage collection * All integers have arbitrary precision * Uses strings (not chars) as basic text datatype * Has lists that function as arrays, queues, and stacks * Also has sets, tables, records (structs), reals (doubles), more * No second-class "primitive types" * Not "object-oriented" (no classes, inheritance, or instance methods) * No exception catching * No concurrency (no threads, monitors, semaphores, or synchronization) * Has co-expressions (coroutines) * Basic least-common-denominator system interface (a la ANSI C) * Procedural graphics (event-driven paradigm available but not mandated) * Retained windows (programs are never called to repaint) * Simple GUI builder that can re-edit its generated code * Turtle graphics package * Large library of contributed procedures and programs A4. What is the Icon program library? The library is a collection of programs and procedures written in Icon. User contributions are welcome and form a significant portion of the library. Library procedures effectively augment the built-in functions available to an Icon program. A wide variety of procedures currently exists, and most graphically-based programs are built around library procedures. The programs in the library range from simple demonstrations to handy tools to complex graphical applications. The library is a resource for both new and experienced programmers. In addition to their basic utility, its programs and procedures serve as examples of how things can be written in Icon. The library is indexed at www.cs.arizona.edu/icon/library/ipl.htm. A5. Where can I learn more about Icon? Here are some good places to start. * Ralph Griswold's overview: www.cs.arizona.edu/icon/docs/ipd266.htm * Dave Hanson's introduction: www.cs.arizona.edu/icon/intro.htm * Bill Mitchell's introduction and slides: www.mitchellsoftwareengineering.com/icon * John Shipman's tutorial: www.nmt.edu/tcc/help/lang/icon A6. Where are some simple examples? For some simple text-based programs, see any of those introductory documents in the preceding question. For some simple graphics programs, see www.cs.arizona.edu/icon/gb/progs/progs.htm. Many more examples, typically larger, are found in the Icon program library; see the indexes of Basic Programs and Graphics Programs. A7. How about comprehensive documentation? Two books define the Icon language. The core language is covered in The Icon Programming Language (third edition), by Griswold and Griswold. Graphics facilities are described in Graphics Programming in Icon by Griswold, Jeffery, and Townsend. These books contain both tutorial and reference material. Icon's internals are detailed in The Implementation of the Icon Programming Language by Griswold and Griswold. Although considerable changes have occurred since Version 6, described in the book, the basic structure of Icon remains the same. Two technical reports, IPD112 and IPD239, describe subsequent changes. Printed copies of the Language and Graphics books are available from Jeffery Systems (www.zianet.com/jeffery/books). All three books can be downloaded at no charge from the Icon books page, www.cs.arizona.edu/icon/books.htm. The Icon Programming Language Handbook, by Thomas W. Christopher, is available on the web at www.tools-of-computing.com/tc/CS/iconprog.pdf. An on-line index to the Icon program library is found at www.cs.arizona.edu/icon/library/ipl.htm. There is a large amount of additional information at the Icon web site, www.cs.arizona.edu/icon. _________________________________________________________________ Implementations B1. What platforms support Icon? Current implementations with graphics support are available for Unix (including Linux) and Windows. The Unix implementation also runs on Darwin, the Macintosh development environment, or the Cygwin environment under Windows. Older versions of Icon are available for some other systems. An alternative Java-based implementation for Unix, Jcon, is also available. B2. How do I get started with Icon? Version 9.4.3 of Icon for Unix can be downloaded from www.cs.arizona.edu/icon/v943. Source and binary packages are available, each with the complete Icon program library. Version 9.3 of Icon for Windows is compatible at the source level with version 9.4.3. It can be downloaded from www.cs.arizona.edu/icon/v93w.htm. The Version 9.4.3 library can be obtained separately from www.cs.arizona.edu/icon/v943. For older implementations, start at www.cs.arizona.edu/icon/implver.htm. Jcon is at www.cs.arizona.edu/icon/jcon. B3. Is there a Unicode version of Icon? No. Icon is defined in terms of 8-bit characters, and changing this presents several design challenges that would likely break existing programs. Also, modifying the C implementation is probably infeasible, but a Unicode version of Jcon might be possible. B4. What happened to the compiler? For a while, Unix distributions included both an interpreter and a compiler; but the interpreter is is usually fast enough even for production work, and most people found that using the compiler wasn't worth the extra compilation time or the hassles involved. We no longer advertise the compiler or produce binaries for it. It is still part of the source code distribution, and we have not deliberately broken it, but we no longer support it and we cannot offer help if problems arise. _________________________________________________________________ Administration C1. What is the Icon Project? The Icon Project is a name used by the group that distributes and supports the Icon programming language. The project maintains the Icon web site at www.cs.arizona.edu/icon. A non-commercial organization, the project is supported by the Department of Computer Science at the University of Arizona. C2. How often is the on-line material updated? New material is added when it's available. Established implementations usually are updated only when there's a new version. This typically is every year or two. The Icon program library is updated on a similar schedule. C3. Where did Icon come from? Icon is the latest in a series of high-level programming languages designed to facilitate programming tasks involving strings and structures. The original language, SNOBOL, was developed at Bell Telephone Laboratories in the early 1960s. SNOBOL evolved into SNOBOL4, which is still in use. Subsequent languages were developed at the University of Arizona with support from the National Science Foundation. Although it has similar objectives and many similar capabilities, Icon bears little superficial resemblance to SNOBOL4. Icon implementations were developed by faculty, staff, and students at the University of Arizona, with significant contributions from volunteers around the world. An Icon history by Ralph and Madge Griswold appears in the preprints of the second History of Programming Languages Conference (HOPL-II), ACM SIGPLAN Notices, March 1993 (Vol 28, No 3). The name Icon is not an acronym, nor does it stand for anything in particular, although the word iconoclastic was mentioned when the name was chosen. The name predates the now common use of icon to refer to small images used in graphical user interfaces. This sometimes misleads people into thinking that Icon is designed to create or manipulate icons, but there's no good solution to that problem. C4. Where is Icon going? We continue to use Icon on a daily basis, but no significant changes are planned. We expect to support the Unix version for the forseeable future, and to distribute ports to other systems as supplied by volunteers. The Unicon project is developing an object-oriented language based on Icon. For more information, see unicon.sourceforge.net. An earlier object-oriented extension to Icon, Idol, can be found in the Icon program library. _________________________________________________________________ Support D1. Is there a users' group for Icon? There is no official Icon users' group, but the Usenet newsgroup comp.lang.icon is dedicated to issues relating to the Icon language. D2. How do I get technical support? The Icon Project is not a commercial organization, and its capacity for providing technical support is limited. Please use the appropriate resource when you need assistance: * For programming questions, submit a query to the Usenet newsgroup comp.lang.icon. * For porting assistance or Unix problems, contact icon-project@cs.arizona.edu. * For problems with the Windows implementation, contact the implementor, jeffery@cs.nmsu.edu. * For general information and additional documentation, visit the Icon web site: www.cs.arizona.edu/icon. _________________________________________________________________ Programming E1. Why doesn't read() work with every? every s := read() do {...} doesn't loop because read() produces a single value and then fails if resumed. Other "consumer" procedures such as get() and pop() work the same way. Use a while loop with these procedures, and save every for use with generators such as !x or key(T). E2. Why doesn't string invocation such as "foo"() work? String invocation works if the procedure is present; the catch is that the linker removes unreferenced procedures. To ensure a procedure's presence, reference it in the main() procedure. A simple reference suffices, as in refs := [foo, bar, baz]; it's not necessary to actually call it. (Why does the linker remove unreferenced procedures? Because this can save huge amounts of memory for programs that use the library.) E3. How can I call a C function? You can't call an arbitrary C function, but if you're willing to write a function to Icon's specifications, there are two approaches. Under Unix, which provides loadfunc(), you can load one or more functions from a shared library, and then treat them as if they had been written in Icon. Some examples can be found in the cfuncs and packs/loadfuncs directories of the Icon program library. The more cumbersome approach is to add code to the Icon interpreter and rebuild it; some hooks are provided for this purpose. Both approaches are discussed in Calling C Functions from Icon, www.cs.arizona.edu/icon/docs/ipd240.htm. The Jcon implementation allows Icon programs to call Java code that is written to Jcon specifications. E4. Can I open a bidirectional pipe? No, this is not possible. Although the concept is simple — write a line to a program via a pipe, then read that program's output — it probably wouldn't work. Most I/O libraries don't write anything to a pipe until they've filled a buffer, and the most likely consequence would be a deadlock, with each program waiting for the other to send more data. _________________________________________________________________ This FAQ is edited by Gregg Townsend. It includes contributions from Ralph Griswold, Cliff Hathaway, Clint Jeffery, Bob Alexander, and Todd Proebsting. icon-9.4.3/doc/icon.txt0000664000175000017500000000365010334226630014244 0ustar chrishchrishICON(1) ICON(1) NAME icon - execute Icon program SYNOPSIS icon sourcefile [ arg ... ] icon -P 'program' [ arg ... ] DESCRIPTION Icon is a simple interface for executing programs written in the Icon programming language. The source code is translated and linked, then executed with the given list of arguments. Without -P, a single source file is read; its name must be given exactly and need not end in .icn. A sourcefile name of - reads the source code from standard input. With -P, a small program can be embedded within a larger shell script. In this case the program argument is a complete Icon program, typically given as a multi-line quoted string. Translation and linking is silent, suppressing progress messages, and undeclared identifiers are diagnosed. This mirrors the behavior of the icont command when run with -s and -u options. An Icon source file can be made directly executable by setting the appropriate permission bits and beginning it with a shell header. If the first line of the file is #!/usr/bin/env icon then icon is found on the command search path and called to process the program upon execution. ENVIRONMENT The environment variables described under icont(1) can also be used with the icon command. Normally, none of these are needed. SEE ALSO icont(1), the full-featured interface supporting separate compilation, multiple source files, and other features. The Icon Programming Language. Griswold and Griswold, Peer-to-Peer, third edition, 1996. Graphics Programming in Icon. Griswold, Jeffery, and Townsend, Peer- to-Peer, 1998. Version 9.4.3 of Icon. http://www.cs.arizona.edu/icon/v943. icon-9.4.3/doc/ib80.jpg0000664000175000017500000000163207547162717014036 0ustar chrishchrishJFIFHHC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222P7"3!"A14Qqr2a#%bd(a$34AQ!"#12 ?ڴ-+~fRr}H O]Rݤz[W5_?,K%C)n>eKaTC|H{k cr爉9SOwð-竌eP7V'39*Cתk5Z(Pr7ell~k)ᚧpb EUJңһm b8N~~y[F!F\X!H1W+c_}iK1?cWH аk )$v$>3گxv"nv#'N-pk8JXK sd-;YDEɫU^L+[Йd;f$A.VV9XW%ا+~$S5oï8jvAB癷d DN(+_|^Djeg@ǚ1RUKPs31a?d}bEM:f*U߽o)tzl᪂A%NwB;31|ٍKC|ijb"$B"&1icon-9.4.3/doc/relnotes.htm0000664000175000017500000001737110334750556015136 0ustar chrishchrish Release Notes for Version 9.4.3 of Icon

[Icon home]

Release Notes for Version 9.4.3 of Icon

Gregg M. Townsend
Department of Computer Science
The University of Arizona

www.cs.arizona.edu/icon/v943/relnotes.htm
Last updated November 10, 2005

Introduction

Version 9.4.3 of Icon is a minor update to version 9.4.2 of Icon. It incorporates configuration, documentation, and library updates. Some minor bugs have been fixed.

The Icon language is unchanged, and this Unix implementation remains compatible at the source level with Icon 9.3 for Windows.

Changes in version 9.4.3

Notable changes in this latest version are listed here. Some code cleanup work and documentation editing has also been done.

Configurations

The system-specific Icon configurations have been reorganized and renamed; new names focus on operating systems rather than CPU architectures. The several BSD configurations have been merged into one.

The macintosh configuration now supports the loadfunc function. This configuration has also been revised to anticipate Apple's announced migration to the x86 architecture.

A new porting guide has been written, and a new posix configuration has been added as a starting point in constructing new ports.

Library changes

As usual, several files in the Icon program library have been added or edited. The core library files, however, remain stable. Notable changes include:

procs/dijkstra		new procedures implement Dijkstra's control structures
procs/html		add procedure for canonicalization of paths
procs/matrix2		new procedures for matrix manipulation
procs/nestlist		new procedures for representing nested lists as strings
procs/printf		add %e format and fix a rounding problem

progs/noise		new program for producing a random bitstream
progs/unclog		improve logic for combining adjacent entries

gprogs/dlgvu		improve coverage map; allow altitude in GPS data
gprogs/gallery		faster thumbnail loading for JPEG images
gprogs/img		many new features
gprogs/sier		better color choices
gprogs/trkvu		accept GPS track logs with altitude as the last field
The undocumented save function, which only worked on a few platforms, has been removed.

Earlier feature additions

These features appeared in earlier releases of Icon that followed publication of the Icon books.

Millions of colors

(new with version 9.4.2 of Icon)

Icon's X-windows interface no longer limits each window to 256 colors at one time. Median-cut quantization selects image colors when writing a GIF file.

Scriptable source files

(new with version 9.4.1 of Icon)

An Icon source file can be made executable under Unix by prefixing it with a comment line

#!/usr/bin/env icon
and setting its execute permission bit. This uses a new icon command, which in another form allows a small Icon program to be embedded within a shell script. See the man page for details. The traditional icont command remains available for less specialized purposes.

Path searching

(new with version 9.4.0 of Icon)

Under Unix, colons (:) may now separate directories in the LPATH and IPATH environment variables as an alternative to spaces. The Icon translator and linker search these paths when looking for $include and link files respectively.

The Icon program library is now searched automatically, but LPATH and IPATH can still be set to control the search order. For version 9.4, the effective path in each case is:

  1. The current directory
  2. Any directories named by the environment variable
  3. The Icon library directory

Other changes affect the configuration of Icon at installation time and the way executable Icon programs locate the interpreter. These changes, which are transparent to most users, are discussed in more detail on the File Organization page.

Reading directory contents

(new with version 9.3.2 of Icon)

The files in a directory can be listed by opening the directory as a file. Subsequent reads return the names of the files contained in the directory. The names are returned in no particular order, and for Unix, the directories "." and ".." are included.

Reading foreign text files

(new with version 9.3.1 of Icon)

The function read() recognizes three kinds of line terminators when reading a file opened in translated mode: Windows (CR+LF), Macintosh (CR), or Unix (LF). Consequently, text files created on one platform can be read by an Icon program running on a different platform.

Limitations, bugs, and problems

Large integers cannot be used with i to j, with seq(), or with integer-valued keywords.

Large-integer literals are constructed at run-time, so such literals are best kept outside of loops.

Conversion of a large integer to a string is quadratic in the length of the integer. Conversion of a very large integer may take a long time.

An "evaluation stack overflow" can occur when a procedure is called with a huge number (thousands or more) of arguments. The capacity can be increased by setting the environment variable MSTKSIZE or COEXPSIZE, as appropriate.

Stack overflow checking uses a heuristic that is not always effective. Stack overflow in a co-expression is especially likely to escape detection and cause a mysterious program malfunction.

Pathologically nested structures can provoke a memory or segmentation fault during garbage collection by reaching the stack limit. The stack limit can be raised by the limit or ulimit shell command.

If an expression such as x := create expr is used in a loop, and x is not a global variable, uncollectable co-expressions accumulate with each iteration. This problem can be circumvented by making x a global variable or by assigning a value to x before the create operation, as in

x := &null
x := create expr

Integer overflow on exponentiation may not be detected during execution. Such overflow may occur during type conversion.

Documentation

See the documentation guide for an overview of the available Icon documentation.

For installation instructions, see Installing Binaries or Building from Source as appropriate.

Acknowledgments

Arthur Eschenlauer contributed the matrix2 and nestlist libraries. Frank Lhota contributed the dijkstra library. Nolan Clayton contributed revisions to the img program. Michael Glass contributed revisions to the printf procedure. Chris Tenaglia and Andreas Almroth contributed configuration files.


icon-9.4.3/doc/port.htm0000664000175000017500000001755710334231663014266 0ustar chrishchrish Porting the Icon Implementation

[Icon home]

Porting the Icon Implementation

Gregg M. Townsend
Department of Computer Science
The University of Arizona

www.cs.arizona.edu/icon/v943/port.htm
Last updated November 8, 2005

Introduction

This document describes how to port a source release of Icon to a new platform. It assumes familiarity with the process by which Icon is built from source using an existing configuration.

Requirements

Icon expects the underlying system to conform to certain standards that are met by most modern systems. These are not necessarily the latest standards but rather versions that have already been widely implemented. Newer standards maintain compatibility and present no problems.

POSIX Commands

Icon is build using Makefiles and shell scripts, as defined by POSIX.2 (IEEE 1003.2-1992). Additionally, Icon uses Makefile includes, which are provided by nearly all modern Unix systems although they are not part of the 1992 standard.

C Compiler

Icon requires a production-quality compiler supporting ANSI C (X3.159-1989). Production quality implies correctness, robustness, and the ability to handle large files and complicated expressions.

C Data Sizes

Icon places the following requirements on C data sizes:
  • chars must be 8 bits.
  • ints must be 16, 32, or 64 bits.
  • longs and pointers must be 32 or 64 bits.
  • All pointers must be the same length.
  • Pointers and longs must be the same length.
If your C data sizes do not meet these requirements, do not attempt to configure Icon.

POSIX Library

In addition to the standard C library, Icon uses the library functions specified by POSIX.1 (IEEE 1993.1-1996). In particular, Icon uses POSIX threads and semaphores to implement context switching for co-expressions. This eliminates the need for specialized assembly-language code, some of which can still be seen in older configurations.

The Porting Process

Every different Icon configuration has its own subdirectory in the config directory of the Icon source tree. To add a new configuration, create a new directory and copy in the define.h, Makedefs, and status files from the posix configuration directory.

The porting process involves repeating these steps until the system is working:

  1. Edit the configuration files as described below.
  2. Configure: make Configure name=newdirectory
  3. Build: make
  4. Test: make Test
If a configuration parameter is changed it is necessary to reconfigure and rebuild from the beginning.

The Icon source code has proven to be robust and portable. Most porting problems are related to command options and library locations, the things that are configured in the Makedefs file.

If the system builds smoothly, but problems are revealed by make Test, try removing any C optimization options. New compilers are often stressed beyond their capabilities by Icon.

It is best to start by building just the basic Icon system. When that is working, repeat with make X-Configure instead of make Configure to build Icon with graphics. (Note that make Test does not test graphics, and so you should also execute bin/colrbook as an additional manual test.) Finally, when those configurations are working, you may wish to enable dynamic loading as described in a later section.

Configuration Parameters

Icon is set up by editing three files in the configuration directory of a particular platform. You can examine the files in other directories to see working examples. After a configuration file is changed, Icon must be reconfigured and rebuilt from the beginning (step 2 above). These instructions assume that you are starting from copies of the posix configuration files.

define.h

Edit the comment at the beginning of define.h, but otherwise leave this file alone. Although some older configurations may define additional values, they are not needed here.

Makedefs

The critical configuration work is done by editing the Makedefs file. The parameters set here are:
CC
The command name for the C compiler. Typical values are cc, gcc, or c89.
CFLAGS
C compiler flags. A path specification for the X11 libraries is usually needed. Include –O to optimize the C code, but remove it if it causes problems.
CFDYN
C compiler flags for generating dynamic libraries, usually a flag that generates position-independent code. A typical value is –fPIC.
RLINK
General runtime libraries. Many systems require –lm to link the math library. Some systems also require –ldl to link dlopen().
TLIBS
Thread library. Some systems require –lpthread or other values (see examples in other configurations) to link the threads library.
XLIBS
Linker specifications for the X Windows library. Many systems need both a path and a library name here.
XPMDEFS
Definitions for building the XPM library. Change this (see other examples) if problems occur while building the src/xpm directory.
GDIR
Leave this alone.

status

The status file is not used by the build process, but it should be edited to document the target platform, and it should be updated whenever the configuration changes.

Dynamic Loading

Icon's optional dynamic loading facility allows Icon programs to call specially written user C code via the built-in loadfunc procedure. Dynamic loading is enabled by
  1. Editing config/name/define.h to add #define LoadFunc at the end.
  2. Editing ipl/cfuncs/mklib.sh to add a new case to the shell script that builds a shared library from a set of C object files.
  3. Reconfiguring, rebuilding, and retesting as usual. If dynamic loading is enabled in define.h, it is tested by make Test.

The second step is the hardest; on many systems, documentation that discusses shared libraries is scant or nonexistent.

If problems are found while building, check especially the definitions of the Makedefs parameters CFDYN and RLINK.

Feedback

Please let us know if you complete a port to a new platform. Review the status file one last time and make sure it is correct. Send the files from the new configuration directory (and also mklib.sh, if changed) to icon-project@cs.arizona.edu. Please also tell us the values reported on that platform by the uname -p and uname -m commands.


icon-9.4.3/doc/wwwcube.gif0000664000175000017500000001372107273403524014734 0ustar chrishchrishGIF89a >bJFLh4fftZ..4bvz$VroyjIVVUd@oq?`'131 3d?q 3#q#_&,[J0p'? 4` e3m)_ps""%%22%̉11m͔4&HƇ4Fgo#0+F#`NƉ`\ށtbBSb0/1dq hQsf\:"HgI5`:w?X<>1C, >@ =91M3(E8Ŕ 2|1cWKhR@kuw]4@Ҭ=4m1crB(_μrg@1}:Q,1|5i:BE}4C)H TsB PЙ:֡Vjvr0jA2aX_]FmQ`R2@M0GJ4^'C5"iA=(n\uTCNƐ}7_Fj O8N]g е i3kG lOv"UBGefs>P_Ņ)&e3<7 7@ vA vvGP"x)CwDV=w&@i䓢i,5%!!ŬȦ %.Vkf\0f8\;\= pЋ{AxP/Pb@: A `Pn-_8b8B<3 3B DUN`aaPB(1cp~X,<@ L?#2*]p33}Q!\BF[2я&[Q Ԏr#PSI6N2O6eK5d3Px@Tڞ4`,,Tm}GS  B@p@8-3$fAG%KI#Uj%  ^B,";‹S@^%*>0)Eh2RiX$1PKV"ŅGz4fyiXxdIz32|Z1 J$1S1<QT$0Gw29GW08@2.=dBKf 3G¢(DHt Sd2J 4$pi|H7hBa8͔`4jӂ >@A%nei' a`0" E2Hڐ+61QTZ@&J5 AhKQseZ&ӔEϩCD$܀"a-E*fjҿ"t[AR5JUIJf) 0PHQ‚k0$P,(MJk f}K@2SL ]:݂t._@׽jJ0[tq1u?j Sr) 4S.`ԟ"`KjPWֶ^ˤp\J׺g>^Wd#60V"ipQH6 ]F;lҸ@IiHQMx-0fY’FxKy@D  r ܰ seȭx2MӒHA$5^WK#"n'48Z! [I4}njp#{Fr,N HZ=&y!H / \w}(Р{jKFu2 03@vj(7A7A*I1;ґ.jSm-(" 8OP"@e>gxVF!|1;r`!q)DpBZ2Fڃe%Aæ2B!hBQ Ds†{h2F,*CԚFPIաE1͓M%CiJ驱GGd>qϟeP`.F4fn-ᡖAg-@aK9  #M py2>eaٖAm) ւ̄&.ف qӃq uFN[7@'H!ZP"uB<O7suTYRڠ8Ey,`sN\ ^6Q&S(c e@3=.;F|KYS[Oi-#;@(~7(>W\ _"(S|+U+3 FZ&:Q u(QO8FG*n$Iy2h $O@M!)6$䇨KP3<3) RcO*Ob3}` BKz(`{j ;CpE ,Bq(n5K`F QD B+7' a}Ggd'(r5F-H-MŇFXYlAQ2%*>q'6 'm%'RB礄6}߷l$0 'x3 x"P^8 g$Y@Gѧ'{OFo)$+YÐ+QvPRzRA!P*,,*p pVQDh!Ekx u &Yn o $`cY2(Qxؘڸ02R060+1s. 1#B. T bT-蒏;+PS;:03-M-.C /@V.;b20/0V -d 9,- U-/ БR38[8<<&0Eⲓ,s8F=RK).ꢔ?W);eVɍj)Ֆnpr9tYvyui w0 pW~?`@&P_}rW X#l3ba`= < 5YPJD @ FŅ`-6pR338^`sa~Hf :53Q[՛`ab`pnE_`VbB&b _-W@[ֹ?wA㘯g t:ao 1Y B [O`) R|`4:\K&y8|,Ă&35: z 9iൠSdzs f=1b E @Ð9 5<#:50P N1^ rO#5mAv :fLa QS* ays:Ռ:2eFfp  6~0Y`n̐ )  p 6<p$!Ԩj6fCrU E E 2d%ij  K"1a0m;2 S;j\]Xjơ:s asz0@hPgM`]4E꺮J=Ff-GIS#ZR$B$qJ?{ &5?Yb&^]bPӪ_4JHKrbh+jbA>D>S6%{qz$xQl&4Q;q "q>@6jh~񱑳u_9W6ʫP3'g=@!Ɓ6ZfhAf4x)$ѫ1G"gP{lDH0ajVD`|fJeP=}`d1vqi1vrq8(A%`[GcZ>iCfzjM%aqnxGO1Ejn@+5k4xV+D1p14y2DBAn"`jxCֺwLw17RtmDK3m[.DAY4;&Di<% g9gExW'#D!;r?CG#$GvNbe>lupPJCFr&#%We"HT/E6nBGA}-q{ FXR#u@IlTDpGeuAG4()$Y}IDygf .^[G!!vf$ s$j"oMΑ& lq|qj񼏣tGÀkK'fG l+*wzC22|ƒ x"d+wlt~7q(n*\hw|(NqGp etF+QXj0IgG$Աw(q τhO(@wt~֡3?@gJ)\}%D!xK`G &A p~Dk'}Ur=+t6GԨCD s`~,Elz B-*P!ʗ}MU na, 8k,Id$1`*"JL[OE%Q=dW-&ըє2G)"@)AVh>#"s2H%R;_rMa5PImܖ H$H~{Kj`Ht$TC!ġ '^XM(dd)hmADD T;*dxpeag)f rL& %rBq$$Lkفg#"ẗ́e-d$ODh4 \&}F"G %PQWeH&B1DQE٭8De"$ ot2u"}{ qDeQ T=8T vt(޼{rحLMϴD+B𛆂]lP D{ŎNEYLJ"^ ')דf yUF@.ۼu@ EQI5=0p/{ z!5n*=5z~*YV*qL=1VOn~#+OWmeK5o*5UҖ &i~*+Ј4k H)1z",ҋ"^YƲrƅKCg8ܨٺpLz|~bRR\O&? @ϔ;9<? <;3QR$29c )e'i` BψE,&'"bGGh4B%B(c@TH'G`l,d)gm,QgH!" %ªgd6q-~ JR.tW~xcF9vdH#I4yeJ+G;icon-9.4.3/doc/blubordr.gif0000664000175000017500000000417607203016260015056 0ustar chrishchrishGIF87a3Ag\<__Gr:\c8ZDmTLyFoN|UaIt?eRZO~[Kw^=bWCjbXQe,3@ dihzlB,`7@<=QaH$ dph:t:$XHvT*l6,h41p8 N*'Yvw"ifjde"l.̈́(նyzF"LOOk,"a܉ @`@vϟ?6H8QExG@iD(SU/"Xx1cTqSy,i*#H&ȔÆU[[EOc`bϟRE AQ+B'*l5 VѲիjqc4%Xe<X&es1}Ŏ#& C`rB4sMVeq(8ܺSf]tÇ؆(y?C}zfv"p" >,TyF[)A&=ӗ_?$^I&'rPv}>vG? dOXepE_ 8J2d#>W 2)bYxZKPq%Fx}UXsW8YyUct yd]vPBHMdSXVl=ɗnCeC`!c)j۽!i9XzZĨqܧ Y! a"9¹UV&dF;vLʝ Ikwu[OypIL7`zQ%G }g *HNu2FҫP6Vfܮ,Ys[f4~jK R@}+ ,ź@+VWM{A[+ R>2 FyA,hђԪepZҼl-BA| X7/d>͵DD3MNtEOeO[LTe0a`W(w=k]rW7P:!H@7d|q/iak=")'V#He2NTO%erfeRl25Il-`mL=TƧ:%H)( %+yodE/AV0١m+&0$_*3c2Kh3e&lf#nb1p^I|6!M)tݬ gɳ"P =鷀Rh,(0G|&Mi ]G=+:njL;icon-9.4.3/doc/cygwin.htm0000664000175000017500000001045010334231662014562 0ustar chrishchrish Icon on Cygwin

[Icon home]

Icon on Cygwin

Gregg M. Townsend
Department of Computer Science
The University of Arizona

www.cs.arizona.edu/icon/v943/cygwin.htm
Last updated November 8, 2005

Introduction

Most contemporary operating systems trace their underlying design to the Unix operating system, as refined and specified today by the POSIX family of standards. Microsoft Windows, however, was developed independently and defines a different set of interfaces for the programmer and the user.

The Cygwin package provides a Unix environment under Microsoft Windows. This allows the latest version of Icon (and many other things) to be built on a Windows system. Successful use of Cygwin requires familiarity with both Windows and Unix.

This document describes some of the peculiarities of the Cygwin port of Version 9.4 of Icon. These differences are not necessarily identified in other documentation.

Building Icon

The Cygwin package is available from www.cygwin.com. A custom installation of the Cygwin system is required; the default installation provides a bare-bones system insufficient for building software. Icon requires a C compiler and the usual tools and utilities available on a standard POSIX development system; these are found in the gcc-core and make packages. The xorg family of packages is also needed to build Icon with graphics enabled.

Icon is built in a Cygwin shell window. The process is the same as on other platforms and uses the configuration named cygwin. See the installation documentation for instructions on building Icon.

Running Icon programs

Icon is run by commands entered in a Cygwin terminal window. The simplest command is "icon prog.icn", which runs the program contained in the source file prog.icn. The translator icont can create executable programs from Icon source code. The Unix-style "man pages" for icon and icont describe the command options in a traditionally cryptic manner.

Interpreter path

Icon programs require an interpreter for execution. On Windows, the path of the interpreter is not embedded in an executable program. The program must be able to find iconx.exe in one of these locations:

  • in the file named by the ICONX environment variable
  • in the same directory as the executable program
  • in the search path

Extra built-in functions

For compatibility with an earlier port of Icon to Windows, this implementation includes some extra built-in functions. The functions are described in section 6.2 of IPD271, which documents that earlier port.

These unsupported functions are not part of Icon on other platforms, so their use renders a program non-portable.

Feature test symbols

The symbols _MS_WINDOWS and _CYGWIN are defined by the Icon preprocessor. The symbol _GRAPHICS is defined if Icon is built with graphics enabled. The symbols _UNIX and _X_WINDOW_SYSTEM are not defined. The corresponding strings are produced or omitted, as appropriate, by the &features keyword.

No dynamic loading

The dynamic loading interface — loadfunc() — is not implemented.

Known bugs

  • Some Unix dependencies cause tests io, tpp, and opts to fail.
  • Resizing a window sends a large number of events to the program.


icon-9.4.3/doc/docguide.htm0000664000175000017500000001607710334435017015060 0ustar chrishchrish Icon Documentation Guide

[Icon home]

Icon Documentation Guide

Gregg M. Townsend
Department of Computer Science
The University of Arizona

www.cs.arizona.edu/icon/v943/docguide.htm
Last updated November 9, 2005

Introduction

Icon is distributed with a small set of documentation pages:

This guide provides an overview of additional available information. Documents designated with IPD numbers are Icon Project Documents found at the Icon web site, www.cs.arizona.edu/icon.

Basic Documentation

The command-line interface to Icon is described by man pages. The icon command executes a program from a single source file and supports script usage. The more general icont command, modeled after cc, supports multiple files, separate compilation, and other features.

The Icon language is defined by

[cover] The Icon Programming Language, Third Edition
Ralph E. Griswold and Madge T. Griswold
Peer-to-Peer Communications, 1996, out of print
ISBN 1-57398-001-3
Downloadable from www.cs.arizona.edu/icon/books.htm

Some introductory material can be found on the web:

The Icon Programming Language Handbook, by Thomas W. Christopher, is available on the web at www.tools-of-computing.com/tc/CS/iconprog.pdf.

Graphics

Icon's graphics facilities are defined by

[cover] Graphics Programming in Icon
Ralph E. Griswold, Clinton L. Jeffery, and Gregg M. Townsend
Peer-to-Peer Communications, 1998, out of print
ISBN 1-57398-009-9
Downloadable from www.cs.arizona.edu/icon/books.htm

Two older reports present an overview of Icon's graphics:

Recent feature additions

A few minor features have been added since the publication of the Icon books:

  • Scriptable source files
  • Path searching improvements
  • Reading directory contents
  • Reading foreign text files
These features are more fully described in the release notes.

Program Library

Program library documentation is contained within the source code. Extracted documentation is available at www.cs.arizona.edu/icon/library/ipl.htm.

Icon Internals

Icon's internals are detailed in

[cover] The Implementation of the Icon Programming Language
Ralph E. Griswold and Madge T. Griswold
Princeton University Press, 1986, out of print
ISBN 0-691-08431-9
Downloadable from www.cs.arizona.edu/icon/books.htm
Although considerable changes have occurred since Version 6, described in the book, the basic structure is the same. Two technical reports describe subsequent changes:

Icon's run-time implementation language is described in IPD261, www.cs.arizona.edu/icon/ftp/doc/ipd261.pdf (PDF).

The construction of loadable C functions is described in the Dynamic Loading section of IPD240, www.cs.arizona.edu/icon/docs/ipd240.htm. Also see the examples in the cfuncs section of the library, which use a simpler set of interface macros.

Technical Reports

The Icon web site provides a large number of technical reports, including "Icon Project Documents" designated by IPD numbers. The index is found at www.cs.arizona.edu/icon/docs/docs.htm.

Many of these reports are historical and describe past research experiments. Those cited above are among the most current, although they may not be completely correct with respect to Version 9.4.

Discussion Group

The Usenet newsgroup comp.lang.icon discusses all aspects of the Icon language and is the best place to ask programming questions.

Other Sources

Other sources of documentation can be found in the Icon FAQ and on the Icon web site, www.cs.arizona.edu/icon.


icon-9.4.3/doc/index.htm0000664000175000017500000000164410334435017014376 0ustar chrishchrish Icon Documentation

[Icon home]

Icon Documentation

Documentation guide

Release notes

Installation instructions (for binary releases)

Build instructions (for source releases)

Porting instructions

File organization

Icon on Macintosh

Icon on Cygwin

Frequently asked questions about Icon


icon-9.4.3/doc/shortcut.gif0000664000175000017500000000010707757524250015125 0ustar chrishchrishGIF87aU,&ijp_ȑengqavYoR;icon-9.4.3/doc/build.htm0000664000175000017500000001272210334231662014365 0ustar chrishchrish Building Version 9.4 of Icon from Source

[Icon home]

Building Version 9.4 of Icon from Source

Gregg M. Townsend
Department of Computer Science
The University of Arizona

www.cs.arizona.edu/icon/v943/build.htm
Last updated November 8, 2005

Introduction

These instructions explain how to build and install the source code of Version 9.4 of Icon under Unix. For instructions on installing a binary release, see Installing Icon Binaries.

These instructions assume that you have unpacked the Icon distribution file into a directory. All commands are issued in that directory.

Configuring

The Icon source package contains configurations for a variety of Unix platforms. Type make Configure to see the list of known configurations. A status report for any system can be viewed by entering

make Status name=name
Choose the configuration name that matches your system's operating system, and be sure to note any special considerations given in its status report.

(If your system is not among those listed, you will need to port the code. This is usually a fairly simple matter that involves copying an existing configuration and editing it to match the target system. See Porting Icon.

Most Unix systems include the X11 window system; type

make X-Configure name=name
to configure Icon with graphics. If your computer does not have the X window system, type
make Configure name=name
to configure Icon without graphics.

Installation using any of the supplied configurations should be routine, but some of those were contributed for systems we cannot test, and it is possible that some minor tweaking may be required. If so, or if you develop a new configuration, we'd like to hear about it by e-mail to icon-project@cs.arizona.edu.

Building

After Configuring, type make to build the Icon system. This single step now builds:

  • The Icon translator and interpreter
  • Program library procedures
  • VIB and other graphics utilities, if graphics are enabled

There may be a few warnings on some platforms, but there should be no fatal errors. If there are problems, fix them in the config/platform directory and repeat the configuration step.

Testing

To verify a successful build, type make Test. This command compiles and executes a series of Icon programs, comparing their outputs with a set of standard results. A normal run concludes with the phrase "All tests passed."

A successful graphics build can be confirmed by executing bin/colrbook, the color book utility, with no arguments. It should display a spectrum of colors along the left and a set of recessed panes to the right. Click anywhere on the spectrum to fill colors in the panes. Click QUIT (in the upper left corner) to exit.

Installing

Icon can be run directly from the location in which it was built. To do this, simply add the bin directory to your shell's search path. See the man pages for icon and icont for instructions on building and running Icon programs.

If you wish to install the binaries elsewhere, choose a location for a directory dedicated to Icon — for example, /opt/icon or /usr/local/icon. If you are replacing an existing directory, delete the old one first. Enter

make Install dest=directory
to create directory and install Icon in its bin, lib, doc, and man subdirectories. All files are created using the default permissions (umask) of the current user.

You can make symbolic links from other locations to programs in the Icon bin directory. For example, you can link /usr/local/bin/icon to /opt/icon/bin/icon. If you do this, link all of icon, icont, iconx, and (if present) vib.

If you'd like to bundle up a gzipped tar file of the binaries created by the build process, enter make Package. Such a package can be used to install binaries on other systems of the same architecture.

Cleaning Up

Type make Clean to remove intermediate files created during the build process. This command preserves the contents of the bin and lib directories, so the built system remains functional.

To restore everything to its original state, type make Pure. This removes all the configuration information and newly built files.


icon-9.4.3/doc/icont.txt0000664000175000017500000001076310334226630014433 0ustar chrishchrish NAME icont - translate Icon program SYNOPSIS icont [ option ... ] file ... [ -x arg ... ] DESCRIPTION Icont translates and links programs written in the Icon language. Translation produces ucode files, suffixed .u1 and .u2, which are linked to produce executable files. Icon executables are shell scripts containing binary data; this data is interpreted by iconx, which must be present at execution time. File names ending in .icn are Icon source files; the .icn suffix may be omitted from command arguments. An argument of - reads from standard input. A name ending in .u, .u1, or .u2 selects both files of a ucode pair. The specified files are combined to produce a single program, which is named by removing the suffix from the first input file. An argument of -x may appear after the file arguments to execute the linked program. Any subsequent arguments are passed to the program. Ucode files produced by translation are normally deleted after linking. If the -c option is given, processing stops after translation and the ucode files are left behind. A directory of such files functions as a linkable library. OPTIONS The following options are recognized by icont: -c Stop after producing ucode files. -f s Enable full string invocation by preserving unreferenced procedures during linking. -o file Write the executable program to the specified file. -s Suppress informative messages during translation and linking. -t Activate runtime tracing by arranging for &trace to have an initial value of -1 upon execution. -u Diagnose undeclared identifiers. -v i Set verbosity level of informative messages to i. -E Direct the results of preprocessing to standard output and inhibit further processing. -N Don't embed iconx path in executable file. -V Announce version and configuration information on standard error. TRANSLATION ENVIRONMENT Two environment variables control file search paths during translation and linking. These variables contain blank- or colon-separated lists of directories to be searched after the current directory and before the standard library. IPATH Directories to search for for ucode files specified in link direc- tives and on the command line. LPATH Directories to search for source files specified in preprocessor $include directives. EXECUTION ENVIRONMENT Several environment variables control the execution of an Icon program. Values in parentheses are the default values. BLKSIZE (500000) The initial size, in bytes, of the allocated block region. COEXPSIZE (2000) The size, in words, of each co-expression stack. ICONCORE If set, a core dump is produced for error termination. ICONX The location of iconx, the icon interpreter, overriding the value built into the executable by icont. Not required if the configura- tion is unchanged since build time or if iconx is in the same directory as the executable. MSTKSIZE (10000) The size, in words, of the main interpreter stack for icont. NOERRBUF By default, &errout is buffered. If this variable is set, &errout is not buffered. QLSIZE (5000) The size, in bytes, of the region used for pointers to strings dur- ing garbage collection. STRSIZE (500000) The initial size, in bytes, of the string space. TRACE The initial value of &trace. If this variable has a value, it overrides the translation-time -t option. SEE ALSO icon(1), a simpler command interface for embedding Icon programs in scripts. The Icon Programming Language. Griswold and Griswold, Peer-to-Peer, third edition, 1996. Graphics Programming in Icon. Griswold, Jeffery, and Townsend, Peer- to-Peer, 1998. Version 9.4.3 of Icon. http://www.cs.arizona.edu/icon/v943. CAVEATS Icon executables are not self-sufficient, but require the iconx inter- preter. When distributing an Icon program in executable form, include a copy of iconx in the same directory. icon-9.4.3/doc/istyle.css0000664000175000017500000000212110317275514014574 0ustar chrishchrish/* style sheet for Icon HTML pages */ BODY { color: black; background: white url(blubordr.gif) repeat-y; } BODY { margin-left: 60px; margin-right: 10px; } BODY, TH, TD { font-family: Helvetica, Arial, sans-serif; } EM,VAR,CITE,DFN { font-style: italic; } STRONG { font-weight: bold; } CODE { font-family: Helvetica, Arial, sans-serif; font-weight: bold;} PRE, TT { font-family: "Lucida Sans Typewriter", Monaco, monospace; } H1,H2,H3,H4,H5,H6 { font-family:Helvetica,Arial,sans-serif; font-weight:bold; } H1 { font-size: 150%; margin-top: 2.0em; margin-bottom: 0.4em; } H2 { font-size: 125%; margin-top: 2.0em; margin-bottom: 0.4em; } H3, H4, H5, H6 { font-size: 100%; margin-top: 1.5em; margin-bottom: 0.2em; } P { margin-top: 0.9em; margin-bottom: 0.0em; } BLOCKQUOTE { margin-top: 0.4em; margin-bottom: 0.4em; } UL, OL { margin-top: 0.4em; margin-bottom: 0.4em; } LI { margin-top: 0.2em; } TH, TD { padding-left: 0.4em; padding-right: 0.4em; } TH, TD { vertical-align: top; text-align: left; } A:link { background: white; color: #06C; } A:visited { background: white; color: #036; } icon-9.4.3/doc/macintosh.htm0000664000175000017500000000541710334435017015256 0ustar chrishchrish Icon on Macintosh

[Icon home]

Icon on Macintosh

Gregg M. Townsend
Department of Computer Science
The University of Arizona

www.cs.arizona.edu/icon/v943/macintosh.htm
Last updated November 9, 2005

Introduction

Because Mac OS X is based on Unix, it can run Icon. There is no special Macintosh interface, so as a practical matter Icon on the Mac is for those who are comfortable using a Unix shell in a Terminal window.

The command-line interface to Icon is described by Unix man pages. The icon command executes a program from a single source file. An Icon program in a simple text file prog.icn is executed by typing icon prog.icn. The more general icont command, modeled after the Unix cc command, supports multiple files, separate compilation, and other features.

Graphics

For graphics, Icon uses the X Window System, generally called X11 in Macintosh documentation. X11 is not normally installed as part of OS X; it must be selected as part of a custom installation. Alternatively, it can be downloaded from Apple.

The X window system does not start automatically. To run an Icon graphics program, you must first start the X11 application and leave it running. The environment variable DISPLAY must be set in the shell that runs an Icon graphics program. For example:

setenv DISPLAY :0.0

Building Icon

Building Icon from source requires the Xcode toolbox. This comes in an extra folder on the OS X installation disc. When installing XCode, be sure to select a custom installation and add X11 to the default set.

Icon is built in a Terminal window. The process is the same as on other platforms and uses the configuration named macintosh. See Building Icon for detailed instructions.

 

icon-9.4.3/doc/cube128.gif0000664000175000017500000001507607203016260014415 0ustar chrishchrishGIF87abZY[bbbXZwobѯodiA8A[W^pppb훚tqx_VTWgdqQLLmixpmzqoz~xnnmaY[luTTTHFMy}nnoLLMooo>?GaPPSSSPh 87.S6,YKb,-3a"=50C.(?L`,@@pH,Ȥrl:ШtJZaP(߆2D,* 6AO! J 8to!! `-# `  #!_! #++# //8J%( ) ` 1((! 'o -+!*` #-bq\:@pF#ָ1[q䶉A1DPo)$<` ,&$Hǎ,h "TAԂN,tPqeHa%j`k#7vE'fSL5˷ 9plAŅ.&x5$ta+ '~غU7f1cS%\H,QF#8{,Ψ#  6B lР w>YkM[pÇ,hS`e1c)SGX}9 R0 dDŽR ?dfw "'އ> c#: #w-,_P"'rP 0# Th0R8`N#rqTd٣KR$xt4>; Q[800ёN@c 1P(XI8ў@!XgGC.~62@xƝd@;Vc&^%d9,'xy $+!M-Ph*oX\0jDH"VQ` pP~r)I>j |_P3Wmp @0f/ ዚ`"5x#㳱;ֽ_9XOrAl ,^0=Tb`Za# XS68ܦ _ Vxh`E!F3;JG_3" l^p*M$#qUH8LA-0^fɁU *))UR5*4Ӕp AC45lnh=`ʊŒ_ 51^AyLahBI`PyjJY_v#Hɉ/w)JFj21kv@K9YysF%dLSs!N+Ew^Q -VW;-@ Rn)0>&I%!"[AS&B `3 XaNG{o!E4pه'Y B #w0=6/ 4%]rO!RXx$"ePP=ԤMQ0u[38u#1vuV($?K$Z}M%6)`bU&'0"IPu<A4b  }4D!(3r40@V.0-ÇJZ$U (P.gf* w/' +z.LJ,3%0RU!dݱI X$/2&5?E('SC,30J[ x%]G1-~_fbP&PPZ!5!Z:E(3(i0u9@, .$P,`TTP5*!dh&gBU")򌐢)$݀JsJ%#]uX2shERJgr4_1`RcP6);[Z+i:Ru!H+ZEg` ɱTe/490W%6]/1$)mC-' u`R 2sX2QSYD-oWB' Qb_$SG^}  P[ )S7`+(0r,M")t'4}5Ņ7e1iᡐhwSCðvŞ'[s !9-OQymA5VZO՟J^t3bYR2~Pw ,.*^ie,.0)Zb4Z6z8:<ڣ>ʣ`B8z_ , JD !58f@ld<`As@EbX7xu^cĆ 4ksQ]c:3!g:AJ 0q"0  dG3=hP`E88i0NG#R(9l lsj;*VW*7x@b*v9`׃e :@͒@%h ) VKF@Vl`4gH8 k(i{HPt,Q @*iJxQ/৵s;j񫦪 zV@0+c'Qcvj% * Ҡ; Ps[` p `=(%@0olg4p̰;f`&@lHgjIpnD, qAٰ>4XD11PAlʆ)Ȱ J ;p1]| F  xgW/+&:0h Zpmr{qcBY*kr p׆%KIjTl s`p. 4K 2Si  P<#}b $x//T׆ tAg0]#Dl oD1 ]Z)»"GH2T@YxWuu%Uq&F3<G_\2k0Rc{ey9 VWu@ʒu^'y>bftJf˷h#ĝ?-QtLR5\EZ&ۑUY}BۑisFj!`dR׮ެD@ TH8?$x,BZǂL[Đ qyBx\r1K3GhEqT-@u$EDx/)08,a90[!}</(2+@s% 1G '%<0< Fq/ X Z /!;"4QJ,4sBt3<9mTJ 7]CEٺ t\##a/rERy4H҇VbGP1o<N¡ *` 5%nIդWAs)> ,o,,)NtR~JrgU-ܺ/`XP_'wy/SZ!UadBQZ.#}#NN, j}d ܻ0!y Am4UJ2L&2UM|=\u3uH;E=BNw0 N0So pMX&'by"T`X䃕 \2`V+S.D O;sc:0*ֱ1LJ]UYQj!0<8AM1MXT~M"VNUwCTP01#"6  2.\u"> Ckq /2嘎1}S疿?RsJ0+K"-JQa3b."U!7G! | UF>DPB Mi L{H4TY' TM F pI`P"$\B%0EHRbD'ʤ{ir߮&pl ˆ*2$(;p")g.͂݇ d%d[y4U">@A֋:*/qUh(-F555X)*V2rXc'&G"Xs$|'<|b^(M1L󘠍P",8/`Q%a~jT L! `"53,PG 283!Q)63.)*3Ր -ao>^1bN4F^j .Q]i-QZ2@`FT*5M CMXNđu`T]9T aPl2{<bfGfiel("Fc#h©CjsDSK3#  wMnNĄ&fdfёib ;cd"gbj4zKd;+b"*g"b##W]2~0Qψ%MQiI4Bx0Ɣ(N`U.ˆ'%qqТT%(v(*QbI\  %Fy2 #\F h Y ,h"/ ^h?1bfpŝ'P>ž2tbHQ;$-)1ԩ()pm36&PQ &9yG:PX13X ) .'a֮ LXm0 y=, ;0ǎ 3 .@A@-#:K 4SCC4@UVU s xjK"RX]nKQ<|hB`PIl.LU5I`-p=LpR%Q]@y]#U}}ߌE\X!PNx84'dߋ5^e (3#N-Ƹuޙ}蠅^;icon-9.4.3/ipl/0002775000175000017500000000000010336137162012573 5ustar chrishchrishicon-9.4.3/ipl/data/0002775000175000017500000000000010336137153013504 5ustar chrishchrishicon-9.4.3/ipl/data/farber.sen0000664000175000017500000020246207423317117015463 0ustar chrishchrishThat job is at the bottom of the rung. There's no point in grasping at straws when you're barking up the wrong tree. The skeleton is there; you just have to sharpen it and put the decorations on the tree. Dig yourself a hole and bury it. That's a ball of another wax. That'll fry the socks off your feet. It's a tempest in a teacup. That curdles my toes. Sex is an aphrodisiac. He's seething at the teeth. Your socks are toast! She has eyes like two holes in a burnt blanket. He's as happy as a pig at high tide. Today I was singing 'Snowflakes roasting on an open file'. To all intensive purposes, the cause is lost. I've milked that dead end for all it's worth. I'm smarting at the seams. It's a white elephant around my neck. Never the twixt should change. She's a virgin who has never been defoliated. This is a magnitude of the first water. Abandon ship all you who enter here! Beware a Trojan bearing a horse. I only read it in snips and snabs. We'll see what comes down the tubes. Its coming down like buckets outside. I see several little worms raising their heads around the corner. They're dying off like fleas. We'll overlook things from top to bottom and bottom to top. That's the whole kit and caboose. They're breathing down my door. Anybody who marries her would stand out like a sore thumb. Trying to do anything is like a tour de force. He knows which side of his bread his goose is buttered on. I'm gaining weight hand over fist. My head is closing in on me. It's the old Paul Revere bit . . . one if by two and two if by one. Good grace is in the eye of the beholder. I'm so proud of myself I could pop a hissy. He's being shifted from shuttle to cock. Don't upset the apple pie. He didn't flinch an eyelid. I can do it with one eye tied behind me. Don't look a dead horse in the mouth. She's trying to feather her own bush. I've got a card in my hole. There's a dark cloud on every rainbow's horizon. They're eating out of our laps. Don't feed the hand that bites you. It goes in one era and out the other. When the tough get going they let sleeping does lie. We threw everything in the kitchen sink at them. Peanut butter jelly go together hand over fist. Not all the irons in the fire will bear fruit or even come home to roost. He's out of his shallow. Don't discombonbulate the apple cart. That took the starch out of my sails. We've been eating our hump for a long time. I wouldn't take him on a ten foot pole. This is a case if the pot calling the fruitcake black. He tried to sweep the skeleton under the rug. It's a new high in lows. Somebody's flubbing his dub. Don't put all you irons on the fire in one pot. It's bouncing like a greased pig. They just want to chew the bull. Judge him by his actions, not his deeds. I don't want to throw a wrench in the ointment. He's the king of queens. Drop the other foot, for Christ's sake! We have some outstanding gray areas. You're treading on thin water. I'm not going to stand for this lying down. They don't see eye for eye with us. Beggars can't look a gift horse in the mouth. Sometimes I don't have both sails in the water. Cheapness doesn't come free. That's the way the cookie bounces. To sweeten the pie, I'll add some cash. A carpenter's son doesn't have shoes. He's somewhere down wind of the innuendo. They are just prostituting the ills of the world. He has the character of navel lint. Don't cast a gander upon the water. I'll sue their pants on backwards. I'm going to put a little variety in your spice of life. I know what we have to do to get our feet off the ground. Everyone has a monkey on their back; you just have to spank your monkey. I smell a needle in the haystack. She hit the nail on the nose. Let he who casts the first stone cast it in concrete. I threw the tie iron in the fire. That's a camel's eye strained through a gnat's tooth. I'd have been bent out of shape like spades. There are too many people in the soup. That's the straw that broke the camel's hump. It might break the straw that holds the camel's back. I'm in for the count. All you have to do is fill in the missing blanks. It gets grained into you. He doesn't know his ass from his rear end. I don't want to stick my hand in the mouth that's feeding me. He's a real jerk-wad. They're arriving like flies. Don't look for a gift in the horse's mouth. They're moving as fast as molasses wheels. There are enough cooks in the pot already. She'll fight it tooth and toenail. A lot of things are going to be bywashed. He's so ego-testicle. Hindsight is 50-50. Half a worm is better than none. All good things come to pass. We're revisiting deja vu. Don't rattle the boat. You're about as observant as a wet hen. More and more people are asking for fewer and fewer pieces of the pie. That problem is getting pushed into the horizon. He's barking down the wrong tree. He's in over his head up to his ass. All the hills of beans in China don't matter. They went after him tooth and fang. They run like flies when he comes near. Beware a horse weaving a Trojan blanket. I don't want to cast a pall on the water. Necessity is the mother of strange bedfellows. He screwed himself into a corner. It's a terrible crutch to bear. I'm as happy as a pig in a blanket. Have it prepared under my signature. I put all my marbles in one basket. He's the pineapple of my eye. Don't look a gift horse in the left foot. Don't let the skeletons out of the bushes. He's a wolf in sheep's underwear. I'm basking in his shadow. He out-positioned me. Too many chiefs spoil the soup. It rolls off like a boulder on a duck's back. That's when I first opened an eyelash. Each of us sleazes by at our own pace. I won't do it if it's the last thing I do! I'm flapping at the gills. That's pushing a dead horse. I think I've lost my bonkers. Stick that in your peace pipe and smoke it. That's a tough nut to carry on your back. He's crazier than Jude's fruitcake. I'm going to down-peddle that aspect. I'd kill a dog to bite that man. I have other cats to fry. Is he an Amazon! They're germs in the rough. I haven't gotten the knack down yet. I gave him a lot of rope and he took it, hook, line, and sinker. It's an off-the-cheek comment. I won't hang my laurels on it. There's laughing on the outside, paneling on the inside. He's king bee. If you're going to break a chicken, you have to scramble a few eggs. I don't always play with a full house of cards. They don't work worth lima beans. Don't throw ruffled feathers on troubled water. Gore no ox before its time. Have we been cast a strange eye at? You're blowing it all out of context. I don't know which dagger to clothe it in. We sure pulled the wool over their socks. Let's get down to brass facts. Let me clarify my fumbling. Step up to the plate and fish or cut bait. Medicate on it. Don't rattle the cage that feeds you. I'm tired from being exhausted. Don't open Pandora's can of worms. He's as batty as a fruitcake. He may be the greatest piece of cheese that ever walked down the plank. We are paying for the sins of serenity. He's running around like a chicken with his ass cut off. That plant looks cyanotic. It's a monkey wrench in your ointment. This befalls on all of us. He wears his finger on his sleeve. Anything he wants is a friend of mine. It was deja vu all over again. Let's play the other side of the coin. It's as dry as mud. It's a sight for sore ears. They don't like to dictate themselves to the problem. He pulled himself up on top of his own bootstraps. Don't twiddle your kneecaps at me! It's about 15 feet as the eye flies. That puts me up a worse creek. That curdles the milk of human kindness. If not us, when? That's a sight for deaf ears. He doesn't have the brain to rub two nickels together. There's only so many times you can beat a dead horse. He's cornered on all sides. I only mentioned it to give you another side of the horse. That's a horse of a different feather. He's as happy as a stuffed pig. He's too smart for his own bootstraps. He would forget his head if it weren't screwed up. He's as crazy as a bloody loon! He popped out of nowhere like a jack-in-the-bean-box. Getting him to do anything is like pulling hen's teeth. Let's kick the bucket with a certain amount of daintiness. By a streak of coincidence, it really happened. When they go downstairs, you can hear neither hide nor hair of them. It's something you're all dying to wait for. This is for your FYI. My mind went blank and I had to wait until the dust cleared. You should talk to her; she's a mind field of information. To coin a cliche, let's have at them. I'm Pepto-bilious. Not by the foggiest stretch of the imagination! The initiative is on the wrong foot. An ounce of prevention is better than pounding the table. They should goose up their technical support. He's got so much zap he can barely twitch. We have to understand the theoretical tenants here. Strange bedfellows flock together. I'm not much for tooting my own galoot. This will shock you nude. I would imagine he chafes a bit. Half a loaf is better than two in the bush. Never accept an out-of-state sanity check. Hands were made before feet. Roll out the Ouija ball. Go fry a kite! I'm as happy as a clam in a fritter. Don't look a Trojan horse in the mouth. There hasn't been much of a peep about it. Let's look at it from the other side of the view. A shoe in time saves nine. I'm a victim of extraneous circumstances. If they do it there won't be a living orgasm left. I never liked you and I always will. Put it on the back of the stove and let it simper. They closed the doors after the barn was stolen. Let me transition away. A look from here would melt his socks. A lot of people my ages are dead at the present time. If I'm going to suffer, I might as well suffer in comfort. That's just putting the gravy on the cake. It happened for the last two hours, including yesterday. It's as predictable as cherry pie. It's like the flood of the Hesperis. I shot my ass in the foot. He's leading down the path to the chicken coup. I speak only with olive branches dripping from the corners of my mouth. I have my neck hung out on an open line. I'm impressed out of my gourd. There is a prolifery of new ideas. He can't hack the other can of worms. He's going to fall flat on his feet. It's like a raft on roller skates. I'm going to have an apocalyptic fit. Everything is mutually intertangled. He has the courage of a second-story man. It's better to be a big fish than a little pond. It's right on the tip of my head. It's burned to shreds. People who live in glass houses should be the last ones to throw the first stone. We brought this can of worms into the open. Things have slowed down to a terrible halt. Today's forecast is for wildly scattered showers. You gotta strike while the shoe is hot or the iron may be on the other foot. You have to bite the bullet, take the bull by the horns and make him face the music. It's like Goliath and Gomorrah. He was guilty of statuary rape. She had a missed conception. Pandora's cat is out of the bag. I enjoy his smiling continence. They also wait who only stand and stare. Let's not get ahead of the bandwagon. He won't last. He's just a flash in the pants. There's nothing like stealing the barn door after the horse is gone. He's letting ground grow under his feet. Those guys weld a lot of power. He's on the back of the pecking order. The world is closing in on my head. I was really impressed by the mask of Two Ton Carmen. It's a silk purse stuffed with sow's ears. You have sowed a festering cow pie of suspicion. I'm as happy as a stuck pig. It goes from tippy top to tippy bottom. If they do that, they'll be committing suicide for the rest of their lives. If you're waiting for Hell to freeze over, you're skating on thin ice. I don't want to be the pie that upset the apple cart. Shit or cut bait. He's a real squash buckler. He's got his intentions crossed. I resent the insinuendoes. Don't burn your bridges until you come to them. You can just take your hand basket to hell! Don't jump off the gun. He's guilty of obfuscation of justice. They've reached a new level of lowness. I've been eating peanuts like they were coming out of my ears. He's a nut-cake. You're not going to get anymore until you've eaten what you've already eaten. You're barking up the wrong lamp post. It floated right to the bottom. That aspect permutes the whole situation. If you want to get your jollies off, watch this! I'm waiting for her to get enough resultage. Get the hot poop right off the vine. We'll have to sandwich everything we do under this one umbrella. If you listen in the right tone of voice, you'll hear what I mean. He's singing a little off-keel. I'm just a hog loose in the woodwork. Don't rock the boat that launched the cat. Where there's smoke, there're mirrors. This thing kills me to the bone. Don't throw the dog's blanket over the horse's nose. It's a tour de farce. She's steel wool and a yard wide. They're dropping his course like flies. Let's put out a smeller. It's been ubiquitously absent I've built enough fudge into that factor. The meeting was a first-class riot squad. Don't look for your balls in someone else's court. That's spilt water under the bridge. Not in a cocked hat, you don't! He bought his own limb and crawled out on it. It's not the only bowl of fish in the ocean. You pay through the noodle for it. Let's kill two dogs with one bone. Speaking off the hand, I'd advise you to quit. I'm losing touch by leaps and bounds. I'm going right out of my bonker. We got the story post hoc. I'm pissed out of my bootstraps. They're grasping for needles. Let's blow out all the stops. I'm close to the edge of my rope. I'm going to hide my nook in a cranny. That really uprooted the apple cart. It might have been a figment of my illusion. He's a shirking violet. I'm a mere fragment of my imagination. It's like trying to squeeze blood out of a stone. I'm creaking at the seams. I think the real crux is the matter. I can meet your objections. Have we gone too fast too far? It's a mute point. The left foot doesn't know what shoe it's in. If you ask him he could wax very quickly on that subject. I'll keep my nose peeled. It's a fool's paradise wrapped in sheep's clothing. I'm the top dog lion. I thought I'd have an aneurism. It drove me to no wits end. She's got a bee in her bonnet and just won't let it go. There's some trash to be separated from the chaff. I'm collapsing around the seams. He was running around like a person with his chicken cut off. It's music to your eyes. I have no personal bones to grind about it. We have the whole gambit to select from. He's being pruned for the job. She's greasing her own spoon. The onus of responsibility lies on his shoulders. Keep your nose to the mark. I'm wound up like a cork. He's as deaf as a bat. If you can't stand the heat, get off the car hood. You're eating like wildfire. When in doubt, tread on oily water. This business is being run by bean-pushers. Get off your Little red Riding Hood. My fuse is running out. Right off the top of my hand, I'd say no. Better to toil in anonymity than to have that happen. Hold on real quick. I'm bored stuffless. You sure take the prize cake. A lot of water has gone over the bridge since then. It's a hairy banana. He's like a wine glass in a storm. We're caught between a rock and a wet spot. It's enough to make you want to rot your socks. Now he's sweating in his own pool. He choked on his own craw. I guess I'm putting all my birds in one pie. Please come here ipso pronto. Don't bite the hand that stabs you in the back. A verbal contract isn't worth the paper it's printed on. What could help might work in retrospect. He wants to get his nose wet in several areas. I'm not sure we're all speaking from the same sheet of music. He's casting a red herring on the face of the water. I want to see the play like a hole in the head. It's all water under the dam. She's flying off the deep end. That's a whole new ball park. I have the self-discipline of a mouse. Don't Chicken-Little me! Don't rock the boat that feeds you. You can't clothe a sow's ear in a silk gown. You've got to get the bull by the teeth. It will take a while to ravel down. Let sleeping uncertainties lie. The meaning of the phrase should be clear after some medication. I wouldn't trust her to throw out the baby with the bath water. A stitch in time wastes nine. My mind is a vacuum of information. That's a measle-worded statement if I ever heard one. Between these words, fathoms have been said. That's just cutting your throat to spite your face. Any night in a storm. Picasso wasn't born in a day. I'm over the hilt. Three hands make for lighter work. We're up to our earballs in garbage. There's a missing gap somewhere. Don't pull a panic button. Let a dead horse rest. The pipeline has ramped up. He has his ass on the wrong end of his head. Now the laugh is on the other foot! Don't throw feathers on oily water. It sticks like sixty. He was a living legend when he was still alive. I'm up to my earballs in confusion. It's a useful ace in the pocket. Don't muddle the waters. Being able to roll with the punches comes with the territory. The grass is always greener when you can't see the forest for the trees. I had to scratch in the back recesses of my memory. To write a really good letter of recommendation, use all the best expletives. I had to throw some feathers on the troubled water. The whole thing is a hairy potpourri. We have a wide range of broad-gauge people. It's a future idea of the past. He's running around like a bull with his head cut off. He's got bees in his belfry. It's like pulling hen's teeth. I'm ground up to a high pitch. Strike while the cat is hot. We're just going to ad-hoc our way through it. This manure must be stopped dead in its tracks. It costs a Jewish princess's ransom. We have a wild card in the soup. I need to glue my nose to the grind stone. I'll be there with spades one. I come to you on bended bootstrap. I wouldn't throw a wet blanket on a cold turkey if I were you. It always looks the worst after the water is under the bridge. I'm too uptight for my own bootstraps. One stitch in nine saves time. Don't look a gift horse in the pocketbook. He gave me a blanket check. I heard it out of the corner of my eyes. Don't strike any bells while the fire is hot. My gourd is up a tree. That's the whole kettle of fish in a nutshell. He's got a tough axe to hoe. He keeps his ear to the vine. I'm going to take a hiatus. I accept it with both barrels. He's the last straw on the camel's back to be called. They're over the pale. Not in a pig's bladder you don't. Don't bury your bridges before you cross them. They've got everything from soup to hairballs. He deserves a well-rounded hand of applause. He's been living off his laurels for years. He's spending a lot of brunt on the task. He's reached the crescent of his success. You're barking your shins on the wrong tree. A buck in the hand is worth two on the books. Let's skin another can of worms. My antipathy runneth over. Boy, he sure gandered her. I was held up about an hour casting feathers on oily water. It causes my goose to bump. He got taken right through the nose. They'll carve that spectrum any way we desire it. Dig a hole and bury it. People in glass houses shouldn't call the kettle black. That's way down in the chicken feed. For all intensive purposes, the act is over. It's enough to drive a bat up the wall. I need to get on my Little Red Riding Horse. This work was the understatement of the year. We'd better jump under the bandwagon before the train leaves the station. We're scraping the bottom of the iceberg. We opened a big ball of worms. His head's too big for his britches. Deep water runs still. I need to find out where his head is coming from. Pour sand on troubled waters. You can lead a pig to pearls, but you can't make a sow's ear drink. A chain is only as strong as its missing link. Put the onus on the other foot. He just sat there like a bump on a wart. Better safe than sadistic. They make strange bedfellows together. To be a leader, you have to develop a spear de corps. He faked a bluff. Don't sink the boat that lays the golden egg. The gremlins have gone off to roost on someone else's canard. We don't want to stick our necks out and get our asses chopped off. Familiarity breed strange bed linen. The idea did cross my head. HE doesn't look like he has a scruple in his head. Put your knuckles to the grindstone. He's got the guts to be courageous. Man cannot eat by bread alone. You're barking up the wrong totem pole. They's chomping their lips at the prospect. Don't disgruntle my feathers. It's as dry as dish water. I don't want to start hurdling profanity. Those are not the smartest cookies under the Christmas tree. If the shoe fits, put it in your mouth. They're spreading like wild flowers. I'm beat up around the gills. He's a real slime-burger. He's as crazy as a fruitcake. He's bailing him out of the woods. He rammed it down their ears. That's a kettle of different fish. Let's stop beating around a dead horse and cut right to the mustard. He's as loony as a jay bird. He doesn't have an ox to grind. He's as happy as clam chowder. He's a lion in a den of Daniels. I'm having a hard time getting my handles around that one. He's as fruity as a loon. He's lying through his britches. He said it thumb in cheek. I had a monumental idea last night, but I didn't like it. I know those woods like the back of my head. I've got to get my ass together. That's like the pot calling the cattle black. One man's curiosity is another man's Pandora's box. He's a fart off the old block. There's more than one way to skin an egg without letting the goose out of the bag. I'll fight to the nail. I'd like to feel you up about taking on the job. I'm keeping me ear to the grindstone. The groundwork is thoroughly broken. I was working my balls to the bone. Go ahead; I'm all ear lobes. She's madder than a wet hornet. All the lemmings are going home to roost. A stop-gap measure is better than no gap at all. I have to get my guts up. It's the straw that broke the ice. If anything, I bend over on the backwards side. It hit me to the core. It's your ball of wax, you unravel it. Your ass is going to be mud. Mother's a little slow around the gills. That's no sweat off my back. Get that albatross off his back! Shoot it up the flag pole. It's a fine-feathered kettle of fish. It's your turn in the bottom of the barrel. That doesn't cut any weight with him. A sock in time saves none. We're biting ourselves in the foot. It's the first inauguration of their idea. It's a fiat accompli. Don't talk to me while I'm interrupting. It goes from one gamut to another. Vision is in the eyes of the beholder. This office requires a president who will work right up to the hilt. That was like getting the horse before the barn. It's as flat as a door knob. It's a lot of passed water under the bridge. I'm stone cold sane. The sink is shipping. He's tossing symbols around like a percussionist in a John Philip Sousa band. It's the greatest little seaport in town. Keep this under your vest. That's the whole ball of snakes. He's become the real vocal point on this. I'm going to scatter them like chaff before the wind. Nobody marches with the same drummer. He's sweating like a stuck pig. That would throw a monkey wrench into their ointment. He won't last as long as a crow flies. Abandon ship, all ye who enter here. That was a mere peanut in the bucket. The bloom is off the pumpkin. How old is your 2-year old? I've been burning the midnight hours. I think you might have hit the nail on the button. Let him fry in his own juice. Don't sweep your dirty laundry under the rug. I'll be there in the next foreseeable future. He's one of the world's greatest flamingo dancers. I only hope your every wish is desired. Don't rattle the cage that rocks the cradle. A whole hog is better than no hole at all. I'm tickled green. In one nose, out the other. I'm going to blow their socks out of the water. Put it in a guinea sack. We're teetering on the edge of the brink. The faculty has cast a jaundiced eye upon the waters. Just say whatever pops into your mouth. She attracted men like flypaper. Don't buy a greased pig in a poke. They're be chick peas in every pot. He's an incremental creep. You can make a prima donna sing, but you can't make her dance. Lay a bugaboo to rest. Let's get out flamingos in a row. We're dragging out dead skeletons. From here on up, it's down hill all the way. I'm sticking my neck out on a ledge. My socks are all bent out of shape. In this vein I will throw out another item for Pandoras' box. I'm going to scream right out of my gourd. It's like finding hen's teeth in August. We have a real messy ball of wax. We got on board at ground zero. I wouldn't touch that with a glass parrot. An avalanche is nipping at their heels. He smokes like a fish. Necessity is a mother. It's going to fall on its ass from within. He's so mad he is spitting wooden nickels. They're a bunch of pushers and shavers. He's screw-loose and fancy free. It's always better to be safe than have your neck out on a limb. It has the potential to peel away a curious can of worms. That took the edge off the pumpkin. I'll take a few pegs out of his sails. A two-pawn approach is necessary. Just because it's there, you don't have to mount it. He's going to go up like tinder smoke. He doesn't know which side his head is buttered on. I think I've lost my gourd. Not on your bootstraps! I have an open mind like a sieve. That's enough to make your sock explode. Give him an inch and he'll screw you. The screws of progress grind fine. I'll bet there's one guy out in the woodwork. You can't make a silk cow out of a sow. No Californian will walk a mile if possible. He has the attention span of a fig newton. I run to my own drummer. We're dislodging some inertia. It's time to take off our gloves and talk from the heart. He hit the nose right on the head. I think I've committed a fore paw. That opens up a whole other kettle of songs. We'd be biting off a new can of worms. He's trying to get his bearing together. Let's pour some holy water on the troubled feathers. That sure takes the steam out of the sails. I'm willing to throw my two cents into the fire. If I've told you a hundred times, I've told you twice. Don't count your high horses before they come home to roost. The atmosphere militates against a solution. Someone is going to be left in the church with his pants on. It flows like water over the stream. An enigma is only as good as it's bottom line. He couldn't see his way out of a paper bag. Put your mouth where your money is. Too many drinks spoil the broth. It's a typical case of alligator mouth and hummingbird ass. It's like a greased pig in a wet blanket. Never judge a book by its contents. They're like two chick peas in a pod. I could count it on the fingers of one thumb. No crumbs gather under his feet. I'm right on the edge of my rope. He was screwed by his own petard. It's a caterpillar in pig's clothing. Fade out in a blaze of glory. I'd like to strike while the inclination is hot. There's no point in spilling milk on a barn door that has hatched. It has more punch to the unch. It's about as satisfactory as falling off a log. I want half a cake and eat it too. We have achieved a wide specter of support. There' more than one way to swing a cat. I had to throw in the white flag. It will spurn a lot of furious action. It goes out one ear and in the other. He's got four sheets in the wind. I'm throwing those ideas to you off the top of my hat. He has a dire need, actually it's half-dire, but he thinks it's double-dire. Together again for the first time. Let's go outside and commiserate with nature. As long as somebody let the cat out of the bag, we might as well spell it correctly. You take the chicken and run with me. She had an aurora of goodness about her. It's the greatest thing since fired whiskey. If you see loose strings that have to be tied down that are not nailed up, see me about it. I'm walking on cloud nine. I'm not going to beat a dead horse to death. He's not breathing a muscle. That really throws a monkey into their wrench. Don't count your chickens before the barn door is closed. That's the other end of the coin. Let them hang in their own juice. That's worse than running chalk up and down your back. There's a lot of credibility in that gap! He's got bells in his batfry. We have to fill the gaff. It's the other end of the kettle of fish. He's a child progeny. He came in on my own volition. No moss grows on his stone. Don't talk to me with your clothes on. Heads are rolling in the aisles. To the cook goes the broth! Don't leave the nest that feeds you. Rolling toads gather no moss. I only hear half of what I believe. You bet your bottom bootie I don't! Don't roll up your nostrils at me. It's crumbling at the seams. The viewpoints run from hot to cold. The onus is on the other foot. We've taken our eyes off the wrong ball. It's not his bag of tea. There are just too many hands to feed. He has his neck out on a limb. I'll hit him right between the teeth. His foot is in his mouth up to his ear. Fry him by his bootstraps. You ninney-wit! Let me throw a monkey into the wrench. Trying to get a doctor on Wednesday is like trying to shoot a horse on Sunday. It's sloppy mismanagement. It's going to knock his socks right off his kneecaps. I'm just about to spring a gasket. Don't talk with your mouth open. I don't give a Ricardo's Montalban what you think. I think he's gone over the bend. It was really amazing to see the spectra of people there. That puts the onus on the other shoe. He's as loony as a fruitcake. We can throw a lot of muscle into the pot. Put yourself in his boat. It's wrought with problems. Don't put all your ducks in one basket. I'm scared out of my witless. They're colder than blue blazes. I want to go into that at short length. It's just a matter of sweeping the rug under the carpet. People who live in ivory towers shouldn't throw glass bricks. Don't oil your feathers with troubled water. If the shoe is on the other foot, wear it. I'm going off tangentially. You're barking up the wrong totem pole. He reminds me of Zorba the Geek. It got left out in the lurch. No one can predict the wheel of fortune as it falls. They're very far and few between. Don't morbidize me! I can't hum a straight tune. A dog under any other coat is still a dog. If the shoe fits, lie in it. It's got all the bugs and whistles. I'm not trying to grind anybody's axes. I'm as happy as a clam in pig's broth. Don't look a gift horse in the face. We're out of hear shot. Don't cast doubts on troubled waters. Don't count your chickens until the barn door is closed. He's got a rat's nest by the tail. We're on the foreskin of modern technology. I'm standing over your shoulder. It' not an easy thing to get your teeth around. May the wind at your back never be your own. He has his crutches around her throat. Men, women, and children first! It's not my cup of pie. This is a really tough wretchimen. That makes me as mad as a wet hatter. It runs the full width of the totem pole. It's raining like a bandit. Too many hands spoil the soap. It's like baiting a dead fish. When you're jumping on sacred cows, you've got to watch your step. It's the blind leading the deaf. Let sleeping dogs bite the hand that feeds them. It's like harnessing a hare to a tortoise. They're cooking on all cylinders. Women don't change their spots. I flew it by ear. There are more feathers here than there are marbles in a candy store. She's got her ass up a tree. Take advantage of the carpe diem. Good riddance aforethought. The hand is on the wall. You're scraping the top of the barrel. My chicken house has come home to roost. That's the way the old ball game bounces. Keep your nose to the plow. You're going to have fun whether you like it or not. I have to get my act in gear. I case my ground very well before I jump into it. Nostalgia just isn't what it used to be. He is as dishonest as the day is long. I'm deathly curious. Sometimes you can learn a lot by watching. Boy, is that decapitated. I've worked my shins to the bone. They keep petering in. The importance of that cannot be underestimated. Omens are made to be broken. He might be barking at a red herring. We're going to where we're going. Pick them up from their bootstraps. He's a fruit-ball. That didn't amount to a hill of worms. It leaks like a fish. Let a sleeping dog call the kettle black. I'm bored out of my tree. I'm losing pens like they were dishwater. It's a mare's nest in sheep's clothing. Let's grab the initiative by the horns. It's time to pour on the midnight oil. If you can't imitate him, don't copy him. I wouldn't take it for granite, if I were you. I'd avoid him like sixty. We can clean ourselves right up to date. Don't pour troubled oil into the water. She was sitting there with an insidious look on her face. I'm working my blood up into a fervor. Don't count your Easter eggs before they hatch. I had her by the nap of the neck. Well, it's no skin off my teeth. It's your turn in the apple cart. It's the old chicken-in-the-egg problem. I'm up to my earballs in garbage. My steam is wearing down. There are too many cooks and not enough Indians. I'm losing my gourd. It's milk under the dam. If you don't want words put in your mouth, don't leave it hanging open. She looks like she's been dead for several years, lately. I'm not a lily-livered sea horse. I'm not sure it's my bag of tea. It's like trying to light a fire under a lead camel. I wouldn't want to be sitting in his shoes. Screw the bastards, full speed ahead! They'll dazzle you out of your socks. He has a wool of steel. I worked my bone to a nubbin. Don't just stand there like a sitting duck. I have people crawling out of my ears. I'd as soon wipe my nose with a pot holder as get in bed with him. They rolled their eyebrows at me. I want quality, not quantity, but lots of it. We can't get through the forest for the trees. He reads memos with a fine tooth comb. He's worse than Godzilla the Hun. It's a mare's nest of rat nests. The wishbone's connected to the kneebone. I'll let it circulate around to my post-frontal lobes. I pulled my feet out from under my rug. I'd lose my screw if it wasn't on my head. That was almost half done unconsciously. Don't father-hen me! I wouldn't give it to a wet dog. It's a mare's nest in sheep's clothing. Tread lightly on the face of the void. This is a land-breaking case. Screwed by my own petard, as it were. It's not my Diet of Worms. I wouldn't do it for a ton of bricks. It rolls off her back like a duck. The die has been cast on the face of the waters. Let me take you under my thumb. They've got the bull by the tail now. Erase that indelibly from your memory. I'm out of my bloomin' loon. The eggs we put all in one basket have come home to roost. You have to take the bitter with the sour. I guess that muddled the waters. You can't get more out of a turnip than you put in. Let me see if I have my eggs on straight. Actually, I'm a day owl. He drinks like a sieve. I see the carrot at the end of the tunnel. He's fruitier than a nut cake. I have my oars in too many boats. Don't look a mixed bag in the mouth. If that happened to me, I'd clean my ears out with a pistol. I'm in transit on that point. Another day, a different dollar. Don't eat with your mouth full. Let me feast your ears. I'm as happy as a clam in pig broth. I don't feel any older than I used to be. That's water under the dam. I need to get my high horse in gear. A stitch in time saves oil on troubled waters. He was stark raving nude. Don't rock the status quo. I'm going to take my vendetta out on them. I's as finished as I'm going to take. There's a lot of blanche here to carte. I'm as happy as a clambake. Let's not drag out dead ghosts. We worked at a meticulous pace. Don't throw a monkey wrench into the apple cart. If they had to stand on their own two feet, they would have gone down the drain a long time ago. There's a little life in the old shoe yet. It's a sight to make your eyes water. I sloughed it under the rug. I haven't bitten off an easy nut. He got up on his highheels. I'm just about to the end of my bee's wax. We don't want a neophyte we have to wet nurse. They've done that before and in the past. It needs a bad case of washing. He's capable of playing every button on his clarinet. Every cloud has a blue horizon. He's breathing down my throat. It's not completely an unblessed advantage. His feet have come home to roost. No sooner said, the better. There's always a rotten monkey in every barrel. We have a difference of agreement. I need to pick up my head and dust it off. Let him be rent from limb to limb. Hindsight is better than a foot in the mouth. If Calvin Coolidge were alive today, he'd turn over in his grave. There are two sides to every marshmallow. What can we do to shore up these problems? There's a vortex swimming around out there. We need an escape goat. This bit of casting oil on troubled feathers is more than I can take. Don't let the camels get their feet in the door. The project is going down the toilet in flames. It's not that kind of zero. I keep stubbing my shins. He takes to water like a duck takes to tarmac. Don't pull an enigma on me. Don't worry, I've got an ace up my hole. We're biting our foot to spite our nose. When you get to the end of your rope, tie a knot and jump off. That just muddles the water. It's a tough nut to hoe. He's three socks to the wind. His limitations are limitless. He was left out on the lurch. My marbles went over the wall. This town is too big for both of us. Nobody's going to put his neck out on a limb. Don't throw out the baby with the sheep dip. He should be gracious for small favors. It puts feathers under my wings. He's clam bait. I'm all puckered down. I've got to put my duff to the grindstone. I was treading on silk gloves. It's no chip off my clock. A bachelor's life is no life for a single man. The sword works two ways. They locked the door after the house was stolen. He's a clod of the first water. Somebody pushed the panic nerve. I have post-naval drip. I guess I'd better get my duff on the road. She's melting out punishment. I may not always be right, but I'm never wrong. My mind slipped into another cog. I wish somebody could drop the other foot. There will be fangs flying. We got another thing out of it that I want to heave in. My laurels have come home to roost. Don't pull out the rug from under the horses in midstream. Gee, it must have fallen into one of my cracks. The horse is stolen before the barn even gets its door closed. Don't rattle the cage that bites you. There's a rotten apple in every barrel. It's under closed doors. When in Rome, do as the Romans do: stay away from the place. There's a lot of bad blood in the water between those two. He's stone blind. Give him enough rope and he will run away with it. We'll put our mouth where our money is. They wrecked havoc in the kitchen. No rocks grow on Charlie. We need to get over organized. I just got indicted into the Hall of Fame. Look at the camera and say 'bird'. They've got their heads squirreled upside down. I need to get my ass together. I'll be ready just in case a windfall comes down the pike. You put all your eggs before the horse. See the forest through the trees. I came within a hair's breathe of it. I've gone over the bend. It went through the palm of my shoe. There were foot-high puddles. The domestic problems are a terrible can of worms. Is there any place we can pull a chink out of the log jam? Run your socks up the flag pole to see if anyone salutes them. That's obviously a very different cup of fish. Let him try this in his own petard! It's an idea whose future is past. Keep the water as firm as possible until a fellow has his feet on the ground. I said it beneath my breath. They are pushing us into a panic that does not exist. That's a two-edged circle. You saw right through my transparency. I can't remember, but it's right on the tip of my head. They fell all over their faces. I'd better get my horse on it's ass. He's within eyeshot of shore. It's like a knife through hot butter. Eventually, I want it now. They just want to shoot the fat. Don't jump on a ship that's going down in flames. Float off into several individual conferees. Don't make a molehill out of a can of beans. He's running around with his chicken cut off. She stepped full-face on it. Too many cooks upset the apple cart. I hear the handwriting on the wall. Fish or get off the pot! The restaurants are terrible -- the town is completely indigestible. I's got rats in his belfry. He went out in a poof of glory. We need to retain our strategic disadvantage. I have too many cooks in the pot already. It dates back to the Holy Roller Empire. I have a rot-gut feeling about that. That was the corker in the bottle. He's off in a cloud of "hearty heigh-ho Silver". Bend over backwards too far and you'll fall flat on your face. I never put on a pair of shoes until I've worn then five years. Things are all up in a heaval. He grates me the wrong way. Do not fumble with a woman's logic. A rocky road is easier to travel than a stone wall. Before they made him they broke the mold. Do it now; don't dingle-dally over it. You have your oar up the wrong tree. I want to get to know them on a face-to-name basis. He's the kind of guy that doesn't like it when anything out of the abnormal happens. Play one excuse against another. A lot of wine has gone under the bridge since we last met. In one follicle, out the other. That really took the steam out of their sails. Friends don't let friends drive them to drink. It's going to go up the tubes. Each day I never cease to be amazed. I need to get my ass on. There are a lot of areas for efficiency reduction. It's a lot like recumbent DNA. I'll feather my own mare's nest, thank you! The grocer's son always has shoes. Some bigger fish knocked on the door, wanting to be fried. Not me, I didn't open my peep. It's a tough road to haul. We'd better jump under the bandwagon before the train leaves the station. That's a pretty dicament. I'm just a cog in the wheel. I'm going to feel it out by the ear. He behaves louder than words. They were made up to the gills. Necessity is the invention of strange bedfellows. I looked at it with some askance. His credentials are too many to mention. He's working like a banshee. I'm woefully glad you're here. All my lemmings came home to roost. Don't jump off the handle. This is a farbarbarism! He's sinking to new heights. Don't cash in your chips until the shill is down. He's feathering his own empire. Get off the stick and do something. I have the mind of a steel trap. His position is not commiserate with his abilities. French-fried hairballs! We sure pulled the wool over his socks. I should have stood in bed. The analogy is a deeply superficial one. Don't pour oil on muddy water. Do it now, before the worm turns. I'm sitting on the edge of my ice. I'm wimping at the seams. Look up that word in your catharsis! They are very far and few between. It's the sine quo non of necessity. He's sawing his limb off. Your wild oats have come home to roost. When I want your opinion, I'll give it to you. It's enough to curl your socks. I'm going to read between your lines. He's foot sore and fancy free. The sock is fried now. Come down off your charlie horse. He doesn't know his hole from an ass in the ground. That's not my sack of worms. Like the shoemaker's children, we have computers running out of our ears. A problem swept under the table occasionally comes home to roost. We've got our necks strung out. We won't turn a deaf shoulder to the problem. My tail feathers have dry rot. One does not want to let the government's nose under the camel. He's got his tail in really deep. I'll keep my eyes out in case I hear anything. Deep water runs in strange ways. He knows which side his pocketbook is buttered on. There's a war in my ointment. The fervor is so deep you can taste it. A nickel ain't worth a dime anymore. I'm going to pass it on to my predecessor. They're coming farther between. After that, we'll break our gums on the computer. There's no point in crying over skim milk. Heads will fry over this. They're breathing down our nose. You get more for your mileage that way. Don't cast any dispersions. Put it on the back burner and let it simper. I'm all raveled up. He's splitting up at the seams. His little red wagon came home to roost. I'm pulling something over on you. Feather your den with somebody else's nest. Don't do anything I wouldn't do standing up in a hammock. You're barking up the wrong tree stump. We were looking out for our own bootstraps. This game is a punctuation point. It's no skin off my stiff upper lip. All the lemmings are coming home to roost. He's the best programmer east of the Mason-Dixon line. Pour midnight oil on troubled waters. I'd better jack up my bootstraps and get going. You're barking down the wrong well. Don't criticize him for lack of inexperience. Don't look a sawhorse in the mouth. He has a marvelous way of extruding you. You've always been the bone of human kindness. We've been sold up stream. They sure dipsied his doodle. I'm creaming off the top of my head. Put that in your teapot and smoke it! That's a different cup of fish. I'm going to cast my rocks to the wind. I don't want to violate anyone's toenails. Godzilla, the Hun. This makes me so sore it gets my dandruff up. I've got other socks to fry. If you want to be heard, go directly to the horse's ear. May I inveigle on you? Let's shoot holes at it. I feel like hell and high water. There's going to be hell and high water to pay. It's a road of hard knocks. Run it up the flag pole and see if it salutes. It's hanging out like a sore tongue. I'll procrastinate when I get around to it. Sometimes fact is stranger than truth. He's foot sure and fancy free. My foot is going out of its mind. We have a real ball of wax to unravel. It sounds like roses to my ears. You can't break an egg without making an omelette. Dishwater is duller than he is. He's in a class by himself with maybe three or four others. Go for the juggler! I'm going to take my venom out on you. I'm just a worm in the ointment. It's as easy as falling off a piece of cake. It's within the pall of reason. If we keep going this way, somebody is going to be left standing at the church with his pants on. Let it slip between the cracks. For a change, the foot is on the other sock. Just cool your horses. Necessity is the mother of strange bed linen. That's their apple cart, let them choke on it. Hair balls of the world, unite! It's an ill wind that doesn't dry someone's clothes. Let me say a word before I throw in the reins. I wouldn't marry her with a twenty-foot pole. Don't bite the hand of the goose that lays the golden eggs. I'm on my last nerve with that person. Pledge now and join the list of growing members. People who live in glass houses shouldn't throw cow pies. I'm just about to lose my gourd. It's going to bog everybody up. Things are going to a hand basket in hell. We all have to die some day, if we live long enough. Clean up your own can of worms! I've had more girls than you've got hair between your teeth. No moss grows under Charlie's rock. He puts his heads on one neck at a time. Let's not drag any more dead herrings across the garden path. Let me throw a monkey wrench in the ointment. To hell with your hand basket! If I could drop dead right now, I'd be the happiest man alive. If you're going to break eggs, you have to make an omelette. Uneasy sits the head ... . I'm up a wrong alley. I really took the bull by the hands. I'm parked somewhere in the boondoggles. Don't through midnight candles on oily water. I'm going to litigate it to the eyeballs. Let me flame your fan. If you'd let me, I'd forget the shirt off my back. Don't cast an eyeball on the face of the water. That's a whole different ball of wax. A hand in the bush is worth two anywhere else. He has feet of molasses. 99% of this game is half mental. That's a matter for sore eyes. It was nothing. You planted the seed and I ran with it. I'd rather be tight than right. He's like sheep in a bullpen. It was a maelstrom around his neck. One pig must be the guinea. Well, darn my socks! He's as quick as an eyelash. Never feed a hungry dog an empty loaf of bread. That's money we'll save right off the top of the hat. He's a young peeksqueek. It's not going to rock any apple carts. It caught me out of the blue. Don't count your chick peas until they hatch. It's not really hide nor hair. We're up to our armpits in frozen alligators. I'll reek the benefits. Let's set up a straw vote and knock it down. We've ported it to every platform under the world. He's as fruity as a loon cake. You need some hair of the chicken. He's downstream from upstage. He'll get his neck in hot water. It's not an easy thing to get your teeth wet on. This wine came from a really great brewery. It's more than the mind can boggle. There aren't any worms in his backyard. I march to a different kettle of fish. Fellow alumni run thicker than water. Better never than late. Wait until the cows come home to roost! It's just a small kink in the ointment. It's perfect, but it will have to do. He's fuming at the seams. Are there any problems we haven't beat out to death? There's some noise afoot about the problem. We have all passed a lot of water since then. He was walking along with his head in the sand. A woman has no hell like a fury scorned. It's a white herring. Let's solve two problems with one bird. That went through my mind and right out the other nostril. Jesus died to save our sins. Don't kiss a gift horse in the mouth. They're falling on hollow ears. He's a bulldog in a china shop. I'm getting my revenge back. That was the pan he was flashed in. I had to make a split decision. I'll give you a definite maybe. Things keep falling out of it, three or four years at a time. I've had it up to the hilt. It plunged all over the place. He faded out of anonymity. It's a Byzantine thicket of quicksand. Let's not open the skeleton in that closet. One back scratches another. Somebody should have waved a flag louder than they did. They're from out neck of the family. It's so unbelievable you wouldn't believe it. I'm going to resolve it by ear. Time and tide strike but once. You are never going to fail unless you try. That solves two stones with one bird. I'm burning my bridges out from under me! I'm looking at it with a jaundiced ear. There must be a Godzilla of those things in there! We're off in a cloud of hooves. I'm casting the dye on the face of the water. The up-kick of all that will be nothing. There's a strong over current here. We'd better toe the yard arm. He's shot in the ass with himself. It's one more cog in the wheel. They run across the gamut. I'm mad enough to fry a wet hen. That's a bird of a different color. And I take the blunt of it! Just remember that, and then forget it. Don't look a charlie horse in the mouth. She's too goody-bunny-shoes for me. Any excuse in a storm. There's a lot of bull in the china shop. Necessity is the mother of reality. You're a sore sight for eyes. He threw an extra wrench into the pot. Pictures speak louder than words. He's taking his half out of our middle. There's one difficult apple in the barrel. Keep your eyes geared to the situation. Watch her -- she gets on the stick very quickly. He was hoisted by a skyhook on his own petard! The ideas sprang full-blown from the hydra's heads. They kicked the tar out of our ass. He didn't even bat an eyebrow. I can't get a straight thought in edgewise. Half the lies they tell me aren't true. It's a small weenie in the fast-food restaurant of life. He flipped his cork. He's paying through the neck. It's the screws of progress. We need to do it ex-post-hasto. I'm as happy as a clam bake. Don't upset the apple sauce. I'm in my reclining years. It's like talking to a needle in a haystack. There is some milk of contention between us. He was putrified with fright. It looks like it's going to go on ad infinitum for a while. I'm just about out of my bonker. One doesn't swallow the whole cake at the first sitting. I'm your frontface in this matter. Those words were very carefully weasled. I worked my toes to the bonenail. That's the wart that sank the camel's back. Cut bait and talk turkey. There's no two ways around it. I'll see it when I believe it. I put the onus entirely on my own shoes. It's a hot issue that dried up. It's the holy grail of naughtiness. I'm as happy as cheese at high tide. His self-esteem doesn't hold water. Look before you turn the other cheek. He doesn't know A from Z. He has his foot in the pie. He's biting the shaft and getting the short end of the problem. Take this time line with a large grain of salt. We're willing to throw away the baby with the bath water. That would have been right up Harry's meat. We're biting the foot the feeds us. Boulder dash! Give him a project to get his teeth wet on. If the harmonica fits, wear it. Now we have some chance to cut new water. Don't put all your flamingos in one basket. We're trying very hard to maintain the high road. Is he gay or an omnivore? Nobody is going to give you the world in a saucer. It's all in knowing when to let a dead horse die. Our company is like a living orgasm. Let's wreck havoc! I'd like to put another foot into the pot. My ears are ringing off the wall. I'm running around like a one-armed paper bandit. Our deal fell through the boards. Our backs are up the wall. It's an old hat and a yard wide. He puts on his shirt one leg at a time like everyone else. Don't put all your ducks in one barrel. The customer is always right-handed. My stomach gets all knotted up in rocks. I'm as happy as a fried clam. I think that we are making an out-and-out molehill of this issue. I'll stay away from that like a 10-foot pole. Part of the verbiage is a language thing. She's got it up to her ears. Everything is going all bananas. There is one niche in his armor. I don't want to rock the boat whose hand is in the cradle. We don't want to get enhangled in that either. My impatience is running out. He's a little clog in a big wheel. Why procrastinate now when you can wait until tomorrow? That sure muddles the water. She's just another chick in the china shop. There's a flaw in the ointment. They are straining at nits. Don't kill the gander that laid the golden egg. He's running off at the seams. Keep your ear peeled! We're getting down to bare tacks. Just use your own excretion. It's a travesty to the human spirit. He's running around like a head with its chicken cut off. I did it sitting flat on my back. Prices are dropping like flies. They're working their bones off. You hit it right on the nail. Row, row, row your boat, gently down the drain. I contributed to the charity of my cause. He's lost his noodles. It's all above and beyond board. I'd like to intersperse a comment. He was hoisted by his own canard. A lot of these arguments are fetious. I heard it out of the corner of my eye. His eyeballs perked up. My ebb is running low. Don't hang you dirty linen on my caboose. Clean up or fly right. Sounds like it's time to sever the apron string. This field of research is so virginal that no human eye has set foot on it. You're too big for your ass. He's as elusive as the abdominal snowman. It's no sweat off my nose. You've overgrown your welcome. He has a brain for a rhubarb. We haven't found a smoking baton. I've got applicants up to the ears. All our feathers came home to roost. Let's raise our horizons. Don't blow a hissie. It's a pot of crock. Don't lead them down the garden path and cut them off at the knees. Let's strike the fire before the iron gets hot. I rushed around like a chicken out of my head. He and his group are two different people. I want to get more fire into the iron. They've beaten the bushes to death. We didn't know which facts were incorrect. Have more discretion in the face of valor. That throws a monkey wrench in the soup. You're skating on thin eggs. Let's roll up our elbows and get to work. It's good to get a taste of someone else's moccasins. My train of thought went out to lunch. Let's get our signals crossed before the meeting. He has a very weak indigestion. My dog was pent up all day. We are on equally unfooted ground. Two thoughts but with a single mind. Take care of two stones with one bird. He's running from gamut to gamut. It's the highest of the lows. There are no easy bullets. This is an exercise in fertility My head is twice its size. It's hot off the vine. Not in a pig's bladder you don't! He's taking the bark off the wrong tree. He's salivating at the chops. We'll cross that bridge after we've burned it behind us. They laid their guts on the line. It's a home of contention. He was hung by his own bootstraps. If you can't stand the heat, get out of the chicken. No dust grows under her feet. Half a brain is better than no loaf at all. Stick that in your hat and smoke it! This program has many weaknesses, but its strongest weakness remains to be seen. He's up a creek with his paddles leaking. I'm willing to listen to the other side of the coin. She's masquerading under false pretenses. There was danger lurking under the tip of an iceberg. Make haste while the snow falls. Any kneecap of yours is a friend of mine. He puts his pants on two legs at a time like everyone else. No loaf is better than half a loaf at all. Every rainbow has a silver lining. He's too clever for his own bananas. He's restoring order to chaos. You can't feed old tricks to a new dog. I'm as happy as a pig in clam broth. That would pry the socks off a dead cat. The aggressor is on the wrong foot. It cuts like a hot knife through solid rock. Hold your cool! The town is a simmering powder keg. It peaked my interest. Somebody is going to have to take a forefront here. Don't count your fleas before they find dogs. I can't underestimate how good he is. In the kingdom of the blind the one-eyed horse is king. This ivory tower we're living in is a glass house. Don't get your eye out of joint. I heard it out of the corner of my ear. The ball is in our lap. In this period of time, its getting very short. I don't trust him farther than you can bat an eye. He's completely lost his gourd. In one mouth and out the other. Those people have no bones to grind. You're bonking up the wrong tree. That fills a lot of gray areas. It's the vilest smell I ever heard. I'll take any warm body in a storm. Let's not cook the goose until it's hatched. I'm walking on thin water. I apologize on cringed knees. I thought I'd fall out of my gourd. You just sawed yourself right off my tree. We're overpaying him, but he's worth it. I'm weighted down with baited breath. By the time we unlock the bandages, he will have gone down the drain. Don't look for a gift in the horse's mouth. The people are too nameless to number. I'm not the brightest bean in the hole. If you want something bad enough, you have to pay the price. I gave him a real mouthful. Put that in your pocket and smoke it! Do you have your screws on right? Just cut a thin slither of it. I'm signing my own death knell. It's spearing like wildflowers! I got you by the nap of your neck. I could tell you stories that would curdle your hair. Gander your eye at that! Put all your money where your marbles are. It's an ill wind that doesn't blow somebody. I have other pigs to fry. Don't pour oil on troubled feathers. It's more than magnificent it's mediocre. The egg is cracked and there's no way to scramble it. I wouldn't give you a pound of belly-button lint for that. I reject it out of the whole cloth. They are unscrupulously honest. The early bird will find his can of worms. Better sorry than safe. She can stew in her own rhubarb. I'll fight him hand and nail. That would drive him right out of his banana. I'll take it one bird at a time. I'm going right over the bend. Let's lurch into the next hour of the show. You're preoccupying the bathroom. He needs to get blown out of his water. I have feedback on both sides of the coin. Don't cut off your ass to spite your face. Conceptual things are in the eye of the beholder. Hey, let's not go off half-crocked. Let's not hurdle into too many puddles at once. The yard arm is in your court. I don't like the feel of this ball of wax. If King Tut were still alive, we'd be dead meat. Misery loves strange bedfellows. I can remember everything -- I have a pornographic mind. He's so far above me I can't reach his bootstraps. We're boggled down. It was oozing right out of the lurches. Right off the top of my cuff, I don' know what to say. Cast an eyeball over troubled waters. There's no place in the bowl for another spoon to stir the broth. You really can't compare us -- our similarities are different. He has his pot in too many pies. That's a different jar of worms. Take it with a block of salt. He's procrastinating like a bandit. I'm up against a blind wall. I don't want to throw another monkey at the wrench right now. It fills a well-needed gap. I'm not going to get side tracked onto a tangent. He has his priorities screwed on right. I have to put my knuckles to the grindstone. Old habits die young. You're barking up a tree with no branches. Indiscretion is the better part of valor. That restaurant is so crowded no one goes there anymore. We might as well be hanged for an inch as for a mile. They were hunkering for a shut out. Don't throw out the bath water with the baby. I owe you a great gratitude of thanks. Go fly your little red wagon somewhere else. Let's talk to the horse's mouth. He's as ugly as Godzilla the Hun. Let's throw some feathers on the oily water. Make hash while time flies. I don't toe to any cow. I'm being raped over the coals. We need to rein in our horns. Don't cut off the limb you've got your neck strung out on. Just remember, this too will come to pass It sure hits the people between the head. It's a hiatus on the face of the void. It's a mecca of people. The early worm catches the fish. He's just a big bullyrag. It looks real enough to be artificial. The foot that rocks the cradle is usually in the mouth. I want to see him get a good hands-on feel. The fruits of our labors are about to be felt. It's a catch 20-20. If the sock fits, wear it. It was an infringement of my imagination. History is just a repetition of the past. We're treading on new water. It may seem incredulous, but it's true. You can blow it up and down. Who needs mental health when you can have Prozac? He's a splitting image of the candidate. Those guys are as independent as hogs on ice. Give him a square shake. I'll descend on them to the bone. Don't make a tempest out of a teapot. In the last year, you've turned around 150%. They unspaded some real down to earth data. That old witch gave me the eagle eye. It's a slap in the chaps. Nobody could fill his socks. It's another millstone in the millpond of life. As a token of my unfliching love ... . Does he think he walks on water any differently than anyone else? It went over like a thud. I'm listening with baited ears. If the onus fits, wear it. Would you please cast a jaundiced gander at this? They're atrophying on the vine. He waxed incensive. I'm talking up a dead alley. My off-the-head reaction is negative. The lights are so bright the air is opaque. He'll grease any palm that will pat his ass. At the end of every pot of gold, there's a rainbow. Any storm in a port. I read the sign, but it went in one ear and out the other. They sucked all the cream off the crop. No problem is so formidable that you can't just walk away from it. I'm going to throw myself into the teeth of the gamut. I'm going to clean your cake! We definitely don't want to nail ourselves into a corner. I have a green thumb up to my elbow. It hit the epitome of it. Don't throw the baby out with the dishwasher. The circuit breaker just kicked in. Dot your t's and cross your i's. It's time for me to get my high-horse on. I'm as happy as a pig at high tide. He's running around like a head with its chicken cut off. They don't stand a tea bag's chance in hell. Your irons in the fire are coming home to roost. He's like Godzilla the Hun. The future is not what it used to be. Their attitude is to let lying dogs sleep. That's an unexpected surprise. Everything is ipso facto. It's a hairy can of worms. That's getting to the crotch of the matter. If there's no fire, don't make waves. We just have to take the grit in our teeth and do it. Today was like the day Rome was built in; we can't afford to have any fiddlers. She'll show up if she cares which side her ass is buttered on. I'm going to put my horn in. He rules with an iron thumb. We haven't begun to scratch the tip of the iceberg. Judas Proust! I'm a little woozy around the gills. There is no surefool way of proceeding. Everything's all ruffled over. It is better to have tried and failed than never to have failed at all. It was a heart-rendering decision. We need to screw our noses to the grindstone. He disappeared from nowhere. Let's bend a few lapels. I'll lend you a jaundiced ear. I'm soaked to the teeth. I was bleeding like a pig stuck in a trough. Why put off today what you can do tomorrow? You're barking your shins up the wrong tree. I'm not going to bail him out of his own juice. Mind your own petard! I want to embark upon your qualms. She makes Raquel Welch look like Twiggy standing backwards. A squeaking hinge gathers no moss. There's less money in the pie than there used to be. Those are good practices to avoid. I won't kick a gift horse in the mouth. I just pulled those out of the seat of my pants. They descended on me like a hoar of locust. He's sharp as a whip. Straighten up or fly right. Rome wasn't built on good intentions alone. I'll buckle my nose down. Let them fry in their socks. It's like asking a man to stop eating in the middle of a starvation diet. I sit corrected. Have the seeds we've sown fallen on deaf ears? She'll whine bloody murder. Does it joggle any bells? Thanks giving is early this year because the first Thursday fell on a Monday. Don't stick your oar in muddy waters. I have reasonably zero desire to do it. I'm torn between a rock and a hard place. It's a virgin field pregnant with possibilities. I listen with a very critical eye. I'm ready to go when the bell opens. He's faster than the naked eye. He has an utter lack of disregard. He's faster than a weeping alligator. icon-9.4.3/ipl/data/palin.sen0000664000175000017500000002750707140713044015325 0ustar chrishchrish"Degenerate Moslem, a cad!" Eva saved a camel so Meta reneged. "Deliver desserts," demanded Nemesis, "emended, named, stressed, reviled." "Do nine men interpret?" "Nine men," I nod. "Go, droop aloof," sides reversed, is "fool a poor dog." "Knight, I ask nary rank," saith gink. "Ma," Jerome raps pot top, "spare more jam!" "Naomi, sex at noon taxes", I moan. "Norah's moods," Naomi moans, "doom Sharon." "Not New York," Roy went on. "Not for Cecil?" asks Alice Crofton. "Novrad," sides reversed, is "Darvon." "Now dine," said I as Enid won. "Pooh," smiles Eva, "have Selim's hoop." "Rats gnash teeth," sang Star. "Reviled did I live," said I, "as evil I did deliver." "Revolt, love!" raved Eva. "Revolt, lover!" "Sal is not in?" Ruth asks. "Ah, turn it on, Silas." "Sirrah! Deliver deified desserts detartrated!" stressed deified, reviled Harris. "Slang is not suet, is it?" Euston signals. "So I darn on," a Canon radios. "Stop!" nine myriad murmur. "Put up rum, rum, dairymen, in pots." "Stop, Syrian, I start at rats in airy spots" "Sue," Tom smiles, "Selim smote us." "Suit no regrets." A motto, Master Gerontius. "Warden in a Cap," Mac's pup scamp, a canine draw. 'Tis Ivan on a visit. A Toyota. A dog! A panic in a pagoda! A new order began, a more Roman age bred Rowena. A rod, not a bar, a baton, Dora. A slut nixes sex in Tulsa. A war at Tarawa! Able was I ere I saw Elba. Adam, I'm Ada! Adelberta was I ere I saw a trebled "A". Ah, Aristides opposed it, sir, aha! Ah, Satan sees Natasha. Al lets Della call Ed, Stella. All erotic, I lose my lyme solicitor, Ella. Amiced was I ere I saw Decima. Analytic Paget saw an inn in a waste-gap city, Lana. Anne, I stay a day at Sienna. Anne, I vote more cars race Rome-to-Vienna. Arden saw I was Nedra. Are we not drawn onwards, we Jews, drawn onward to new era? Are we not, Rae, near to new era? Ban campus motto, "Bottoms up, MacNab." Bob: "Did Anna peep?" Anna: "Did Bob?" Bog dirt up a sidetrack carted is a putrid gob. Damosel, a poem? A carol? Or a cameo pale? (So mad!) Deer frisk, sir, freed. Degas, are we not drawn onward, we freer few, drawn onward to new eras aged? Delia and Edna ailed. Delia sailed as sad Elias ailed. Delia sailed, Eva waved, Elias ailed. Delia's debonair dahlias, poor, drop, or droop. Sail, Hadrian; Obed sailed. Delia, here we nine were hailed. Deliver, Eva, him I have reviled. Dennis and Edna sinned. Dennis sinned. Dennis, no misfit can act if Simon sinned. Deny me not; atone, my Ned. Di, did I as I said I did? Did Dean aid Diana? Ed did. Did Hannah say as Hannah did? Did I do, O God, did I as I said I'd do? Good, I did! Did I draw Della too tall, Edward? I did? Did Ione take Kate? No, I did. Dior Droid. Do Good's deeds live on? No, Evil's deeds do, O God. Do not start at rats to nod. Doc, note, I dissent. A fast never prevents a fatness. I diet on cod. Dog, as a devil deified, lived as a god. Doom an evil deed, liven a mood. Dora tended net, a rod. Drab Red, no londer bard. Drab as a fool, as aloof as a bard. Draw -- aye, no melody -- dole-money award. Draw no dray a yard onward. Draw pupil's pup's lip upward. Draw, O Caesar, erase a coward. Draw, O coward! Eel-fodder, stack-cats red do flee. Egad! Loretta has Adams as mad as a hatter. Old age! Egad, a base life defiles a bad age. Egad, a base tone denotes a bad age. Emil asleep, ALlen yodelled "Oy." Nella peels a lime. Emil, asleep, Hannah peels a lime. Enid and Edna dine. Ere hypocrisies or poses are in, my hymn I erase. So prose I, sir, copy here. Euston saw I was not Sue. Eva, Lave! Eva, can I pose as Aesop in a cave? Eva, can I stab bats in a cave? Evade me, Dave. Eve damned Eden, mad Eve. Eve saw diamond, erred, no maid was Eve. Eve, mad Adam, Eve! Eve, man, am Eve! Evil is a name of a foeman, as I live. Ewer of miry rim for ewe. Flee to me, remote elf. Gate-man sees name, garage-man sees name-tag. God, a red nugget! A fat egg under a dog! Goddesses so pay a possessed dog. Golf, No, sir, prefer prison flog. Ha! Robed Selim smiles, Deborah! Ha! I rush to my lion oily moths, Uriah! Ha! On, on, o Noah! Harass selfless Sarah! Harass sensuousness, Sarah. He Goddam Mad Dog, Eh? He lived as a devil, eh? Help Max, Enid -- in example, "H." Here so long? No loser, eh? I did roar again, Niagara! ... or did I? I made border bard's drowsy swords; drab, red-robed am I. I maim nine men in Saginaw; wan, I gas nine men in Miami. I maim nine more hero-men in Miami. I moan, "Live on, O evil Naomi!" I moan, Naomi. I roamed under it as a tired, nude Maori. I saw desserts; I'd no lemons, alas no melon. Distressed was I. I saw thee, madame, eh? 'Twas I. I tip away a wapiti. I told Edna how to get a mate: "Go two-handed." Loti. I, Marian, I too fall; a foot-in-air am I. I, man, am regal; a German am I. In a regal age ran I. In airy Sahara's level, Sarah, a Syrian, I. La, Mr. O'Neill, lie normal. Ladle histolytic city lots I held, Al. Lapp, Mac? No, sir, prison-camp pal. Lay a wallaby baby ball away, Al. Leon sees Noel. Lepers repel. Lew, Otto has a hot towel. Lewd did I live, and, Edna, evil I did dwel. Lewd did I live; evil I did dwel. Live dirt up a sidetrack carted is a putrid evil. Live dirt, up a side-track carted, is a putrid evil. Live not on evil deed, live not on evil. Live not on evil. Live on evasions? No, I save no evil. Live on, Time; emit no evil. Live was I ere I saw Evil. Live was I ere I saw evil. Ma is a nun, as I am. Ma is as selfless as I am. Mad Zeus, no live devil, lived evil on Suez dam. Mad? Am I, madam? Madam, I'm Adam. Madam, in Eden I'm Adam! Madame, not one man is selfless; I name not one Madam. Marge let a moody baby doom a telegram. Marge lets Norah see Sharon's telegram. Marge, let's "went." I await news telegram. Max, I stay away at six A.M. May a moody baby doom a yam? Milestones? Oh, 'twas I saw those, not Selim. Mirth, sir, a gay asset? No, don't essay a garish trim. Moorgate got nine men in to get a groom. Moors dine, nip -- in Enid's room. Mother Eve's noose we soon sever, eh, Tom? Mother at song no star, eh Tom? Must sell at tallest sum. Name I -- Major-General Clare -- negro Jamie Man. Name now one man. Naomi, did I moan? Ned, I am a maiden. Ned, go gag Ogden. Nella risks all: "I will ask Sir Allen." Nella won't set a test now, Allen. Nella's simple hymn: "I attain my help, Miss Allen." Nella, demand a lad named Allen. Nemo, we revere women. Never a foot too far, even. Never odd or even. Niagara, O roar again! No Dot nor Ottawa, "legal age" law at Toronto, Don. No benison, no sin, Ebon. No evil Shahs live on. No ham came, sir, now siege is won. Rise, MacMahon. No lemons, no melon. No misses ordered roses, Simon. No mists or frost, Simon. No waste, grab a bar, get saw on. No word, no bond, row on. No, Hal, I led Delilah on. No, is Ivy's order a red rosy vision? No, it can assess an action. No, it is open on one position. No, it is opposed; Art sees Trade's opposition. No, it is opposition. No, it never propagates if I set a "gap" or prevention. No, it's a bar of gold, a bad log for a bastion. No, miss, it is Simon. No, set a maple here, help a mate, son. No. I save on final perusal, a sure plan if no evasion. Noel saw I was Leon. Noel sees Leon. Noel, did I not rub Burton? I did, Leon. Noel, lets egg Estelle on. Nomists reign at Tangier, St. Simon. Nor I nor Emma had level'd a hammer on iron. Nor I, fool, ah no? We won halo -- of iron. Nora, alert, saws goldenrod-adorned logs, wastrel Aaron! Norah's foes order red rose of Sharon. Norma is as selfless as I am, Ron. Not I, no hotel, cycle to Honiton. Now Eve, we're here, we've won. Now Ned, I am a maiden nun; Ned, I am a maiden won. Now do I repay a period won. Now do I report "Sea Moth" to Maestro, period? Won. Now ere we nine were held idle here, we nine were won. Now saw ye no mosses or foam, or aroma of roses. So money was won. Now, Ned, I am a maiden won. Now, sir, a war is won! Nurse's onset abates, noses run. Nurse, I spy gypsies, run! Nurse, save rare vases, run! O gnats, tango! O render gnostic illicit song, red Nero. Oh who was it I saw, oh who? On tub, Edward imitated a cadet; a timid raw debut, no? Pa's a sap. Paget saw an inn in a waste gap. Pat and Edna tap. Peel's lager on red rum did murder no regal sleep. Poor Dan is in a droop. Pull a bat! I held a ladle, hit a ball up. Pull up if I pull up. Pull up, Eva, we're here, wave, pull up. Pusillanimity obsesses Boy Tim in "All Is Up." Puss, a legacy! Rat in a snug, unsanitary cage, lass, up! Rats live on no evil star. Red Roses run no risk, sir, on nurses order. Red now on level -- no wonder. Red root put up to order. Red? Rum, eh? 'Twas I saw the murder. Refasten Gipsy's pig-net safer. Reg, no lone car won, now race no longer. Regard a mere mad rager. Remit Rome cargo to go to Grace Mortimer. Repel evil as a live leper. Resume so pacific a pose, muser. Retracting, I sign it, Carter. Revenge my baby, meg? Never! Revered now I live on. O did I do no evil, I wonder ever? Revolt on Yale, Democrats edit "Noon-Tide Star." Come, delay not lover. Rise to vote, Sir. Rise, morning is red, no wonder-sign in Rome, Sir. Rise, sir lapdog! Revolt, lover! God, pal, rise, sir! Ron, Eton mistress asserts I'm no tenor. Roy Ames, I was a wise mayor. Roy, am I mayor? Sail on, game vassal! Lacy callas save magnolias! Saladin enrobes a baroness, Senora, base-born Enid, alas. Salisbury moor, sir, is roomy. Rub Silas. See few owe fees. See, slave, I demonstrate yet arts no medieval sees. Selim's tired, no wonder, it's miles. Semite, be sure! Damn a man-made ruse betimes. Senile felines. Set a broom on no moor, Bates. Sex at noon taxes. Sh! Tom sees moths. Si, we'll let Dad tell Lewis. Sir, I demand, I am a maid named Iris. Sir, I soon saw Bob was no Osiris. Sir, I'm Iris! Sire, was I ere I saw Eris? Sis, Sargasso moss a grass is. Sit on a potato pan, Otis. Six at party, no pony-trap, taxis. Slap-dab set-up, Mistress Ann asserts, imputes bad pals. Snug & raw was I ere I saw war & guns. Snug Satraps eye Sparta's guns. So may Apollo pay Amos. So may Obadiah aid a boy, Amos. So may Obadiah, even in Nineveh, aid a boy, Amos. So may get Arts award. Draw a strategy, Amos. So remain a mere man. I am Eros. Solo gigolos. Some men interpret nine memos. Sore was I ere I saw Eros. Sore was I ere I saw Eros. St. Eloi, venin saved a mad Eva's nine violets. St. Simon sees no mists. Star? Come, Donna Melba, I'm an amiable man -- no Democrats! Stella won no wallets. Step on hose-pipes? Oh no, pets. Step on no pets! Stephen, my hat! Ah, what a hymn, eh, pets? Stiff, o dairyman, in a myriad of fits. Stop! Murder us not tonsured rumpots! Stop, Syrian, I see bees in airy spots. Stop, Syrian, I start at rats in airy spots. Straw? No, too stupid a fad. I put soot on warts. Stressed was I ere I saw desserts. Sue, dice, do, to decide us. Sums are not set as a test on Erasmus. Telegram, Margelet! Ten animals I slam in a net. Ten dip a rapid net. Ten? No bass orchestra tarts, eh? Cross a bonnet! Tenet C is a basis, a basic tenet. Tennis set won now Tess in net. Tense, I snap Sharon roses, or Norah's pansies net. Tessa's in Italy, Latin is asset. Tide-net safe, soon, Allin. A manilla noose fastened it. To nets, ah, no, son, haste not. Too bad, I hid a boot. Too far away, no mere clay or royal ceremony, a war afoot. Too far, Edna, wander afoot. Too hot to hoot. Top step -- Sara's pet spot. Top step's pup's pet spot. Tracy, no panic in a pony-cart. Trade ye no mere moneyed art. Trap a rat! Stare, piper, at Star apart. Tuna nut. Unglad, I tar a tidal gnu. War-distended nets I draw. Ward nurses run "draw." Was it a bar or a bat I saw? Was it a rat I saw? Was it felt? I had a hit left, I saw. Was raw tap ale not a reviver at one lap at Warsaw? We seven, Eve, sew. We'll let Dad tell Lew. Won race, so loth to lose car now. Won't I repaper? Repaper it now. Won't lovers revolt now? Wonders in Italy, Latin is "Red" now. Yawn a more Roman way. Yes, Mark, cable to hotel, "Back Ramsey." Yes, Syd, Owen saved Eva's new Odyssey. Yo! Bottoms up, U.S. Motto, boy! Yreka Bakery. Zeus was deified, saw Suez. icon-9.4.3/ipl/data/dickens.txt0000664000175000017500000000114707140713044015664 0ustar chrishchrishIt was the best of times, it was the worst of times, it was the age of wisdom, it was the age of foolishness, it was the epoch of belief, it was the epoch of incredulity, it was the season of Light, it was the season of Darkness, it was the spring of hope, it was the winter of dispair, we had everything before us, we had nothing before us, we were all going direct to Heaven, we were all going direct the other way -- in short, the period was so far like the present period, that some of its noisiest authorities insisted on its being received, for good or for evil, in the superlative degree of comparison only. icon-9.4.3/ipl/data/gilbert.txt0000664000175000017500000000035507140713044015674 0ustar chrishchrish My object all sublime I shall achieve in time -- To let the punishment fit the crime -- The punishment fit the crime; And make each prisoner pent Unwillingly represent A source of innocent merriment! Of innocent merriment! icon-9.4.3/ipl/data/termcap.dos0000664000175000017500000000442507140713044015647 0ustar chrishchrishansi|color|ansi-color|ibm|ibmpc|ANSI.SYS color:\ :co#80:li#25:bs:pt:bl=^G:le=^H:do=^J:\ :cl=\E[H\E[2J:ce=\E[K:\ :ho=\E[H:cm=\E[%i%d;%dH:\ :up=\E[A:do=\E[B:le=\E[C:ri=\E[D:nd=\E[C:\ :ti=\E[0;44m:te=\E[0m:\ :so=\E[1;35;44m:se=\E[0;44m:\ :us=\E[1;31;44m:ue=\E[0;44m:\ :mb=\E[5m:md=\E[1m:me=\E[0;44m: mono|ansi-mono|ANSI.SYS:\ :co#80:li#25:bs:pt:bl=^G:le=^H:do=^J:\ :cl=\E[H\E[2J:ce=\E[K:\ :ho=\E[H:cm=\E[%i%d;%dH:\ :up=\E[A:do=\E[B:le=\E[C:ri=\E[D:nd=\E[C:\ :so=\E[7m:se=\E[m:us=\E[4m:ue=\E[m:\ :mb=\E[5m:md=\E[1m:me=\E[m: nnansi-mono|NNANSI.SYS:\ :co#80:li#25:bs:pt:bl=^G:le=^H:do=^J:\ :cl=\E[2J:cd=\E[J:ce=\E[K:\ :ho=\E[H:cm=\E[%i%d;%dH:\ :up=\E[A:do=\E[B:le=\E[C:ri=\E[D:nd=\E[C:\ :so=\E[7m:se=\E[2m:\ :us=\E[4m:ue=\E[24m:\ :mb=\E[5m:md=\E[1m:mh=\E[2m:mr=\E[7m:me=\E[m:\ :al=\E[L:dl=\E[M:ic=\E[@:dc=\E[P: nnansi|nnansi-color|NNANSI.SYS color:\ :co#80:li#25:bs:pt:bl=^G:le=^H:do=^J:\ :cl=\E[2J:cd=\E[J:ce=\E[K:\ :ho=\E[H:cm=\E[%i%d;%dH:\ :up=\E[A:do=\E[B:le=\E[C:ri=\E[D:nd=\E[C:\ :ti=\E[0;44m:te=\E[0m:\ :so=\E[1;35;44m:se=\E[2;37m:\ :us=\E[4m:ue=\E[24m:\ :mb=\E[5m:md=\E[1m:mh=\E[2m:mr=\E[7m:me=\E[0;44m:\ :al=\E[L:dl=\E[M:ic=\E[@:dc=\E[P: nansi-mono|zansi-mono|N/ZANSI.SYS:\ :co#80:li#25:bs:pt:bl=^G:le=^H:do=^J:\ :cl=\E[2J:ce=\E[K:\ :ho=\E[H:cm=\E[%i%d;%dH:\ :up=\E[A:do=\E[B:le=\E[C:ri=\E[D:nd=\E[C:\ :ti=\E[0m:te=\E[0m:\ :so=\E[7;35m:se=\E[0m:\ :us=\E[1;31m:ue=\E[0m:\ :mb=\E[5m:md=\E[1m:mr=\E[7m:me=\E[m:\ :al=\E[L:dl=\E[M:ic=\E[@:dc=\E[P: nansi|zansi|nansi-color|zansi-color|N/ZANSI.SYS color:\ :co#80:li#25:bs:pt:bl=^G:le=^H:do=^J:\ :cl=\E[2J:ce=\E[K:\ :ho=\E[H:cm=\E[%i%d;%dH:\ :up=\E[A:do=\E[B:le=\E[C:ri=\E[D:nd=\E[C:\ :ti=\E[0;44m:te=\E[0m:\ :so=\E[1;35;44m:se=\E[0;44m:\ :us=\E[1;31;44m:ue=\E[0;44m:\ :mb=\E[5m:md=\E[1m:mr=\E[7m:me=\E[0;44m:\ :al=\E[L:dl=\E[M:ic=\E[@:dc=\E[P: AX|ANSI X3.64|full ANSI X3.64 (1977) standard:\ :co#80:li#25:bs:pt:am:mi:bl=^G:le=^H:\ :cl=\E[2J:ce=\E[K:cd=\E[J:\ :ho=\E[H:cm=\E[%i%d;%dH:cs=\E[%i%d;%dr:\ :up=\E[A:do=\E[B:le=\E[C:ri=\E[D:nd=\E[C:\ :UP=\E[%dA:DO=\E[%dB:LE=\E[%dC:RI=\E[%dD:\ :so=\E[7m:se=\E[m:us=\E[4m:ue=\E[m:\ :mb=\E[5m:md=\E[1m:mr=\E[7m:me=\E[m:as=^N:ae=^O:\ :ku=\E[A:kd=\E[B:kl=\E[C:kr=\E[D:kb=^H:\ :kn#4:k1=\EOP:k2=\EOQ:k3=\EOR:k4=\EOS:\ :im=\E[4h:ei=\E[4l:al=\E[L:dl=\E[M:ic=\E[@:dc=\E[P:sf=\ED:sr=\EM: icon-9.4.3/ipl/data/README0000664000175000017500000000161507140713044014363 0ustar chrishchrish *.csg data for csg.icn *.krs data for kross.icn *.lbl data for labels.icn *.rsg data for rsg.icn *.tok sample output of syntactic token counting *.tur data for turing.icn *.txt plain text chart.gmr data for ichartp.icn conman.sav data for conman.icn farber.sen ``Farberisms'' header skeleton header for Icon program files hebcalen.dat data read by hebcalen.dat hebcalen.hlp help file for hebcalen.dat hebcalpi.hlp data read by ProIcon version of hebcalen.dat icon.wrd English words containing the substring ``icon'' ihelp.dat data for ihelp.icn noci.wrd English words containing the substring ``noci'' palin.sen Palindromic sentences pt*.gmr data for pt.icn sample.grh sample data for graphpak.icn skeleton.icn skeleton used to create/update Icon programs termcap.dos termcap data for MS-DOS termcap2.dos alternative termcap data for MS-DOS verse.dat vocabulary for verse.icn icon-9.4.3/ipl/data/skeleton.icn0000664000175000017500000000117307140713044016021 0ustar chrishchrish############################################################################ # # File: # # Subject: Program # # Author: # # Date: # ############################################################################ # # This file is in the public domain. # ############################################################################ # # # ############################################################################ # # Requires: # ############################################################################ # # Links: # ############################################################################ procedure main() end icon-9.4.3/ipl/data/egg.krs0000664000175000017500000000003707140713044014763 0ustar chrishchrishand eggplants elephants purple icon-9.4.3/ipl/data/poem.rsg0000664000175000017500000000122707140713044015157 0ustar chrishchrish::= ; ::= , . ::= . ::= ::=he|she|the shadowy figure|the boy|a child ::=outlines|casts toward|stares at|captures|damns ::=lingers|pauses|reflects|alights|hesitates|turns away|returns|kneels|stares ::=and |but |and |while ::=slowly|silently|darkly|with fear|expectantly|fearfully ::=waiting|pointing|breathing ::=
::=a|the ::=sky|void|abyss|star|darkness|lake|moon|cloud ::=while|as|momentarily|frozen, 10 icon-9.4.3/ipl/data/ihelp.dat0000664000175000017500000007217307701605472015315 0ustar chrishchrishIcon Programming Language Version 8.6 Help Summaries Help summaries are available for each of the Icon executable programs (icont, iconx), and for many aspects of the Icon language itself. To see the help summaries, enter one of the following commands: ihelp icont # Icon translator & linker ihelp iconx # Icon interpreter ihelp expressions # summary of expressions & precedence ihelp functions # summary of functions ihelp operations # summary of operations ihelp keywords # list of keywords ihelp datatypes # list of Icon datatypes ihelp reserved # list of reserved words ihelp escapes # list of string escape sequences ihelp abbreviations # abbreviations used in help files ihelp # information on specific function ihelp about # bibliography and credits for help file - abs(N) : N # compute absolute value Produces the absolute value of N. - acos(r1) : r2 # compute arc cosine Produces the arc cosine of r1 in the range of 0 to pi for r1 in the range of -1 to 1. - any(c,s,i1,i2) : i3 # locate initial character Succeeds and produces i1 + 1 if s[i1] is in c and i2 > i1, but fails otherwise. Defaults: s &subject i1 &pos if s defaulted, otherwise 1 i2 0 - args(p) : i # get number of procedure arguments Produces the number of arguments for procedure p. For built-in procedures with a variable number of arguments, the value produced is -1. For declared procedures with a variable number of arguments, the value returned is the negative of the number of formal prameters. - bal(c1,c2,c3,s,i1,i2) : i3,i4,...,in # locate balanced characters Generates the sequence of integer positions in s preceding a character of c1 in s[i1:i2] that is balanced with respect to the characters of c2 and c3, but fails if there is no such position. Defaults: c1 &cset c2 '(' c3 ')' s &subject i1 &pos if s defaulted, otherwise 1 i2 0 - callout(x,x1,x2,...,xn) : xm # call external function Calls the external function specified by x with arguments x1, x2, ..., xn. The mechanism for locating the function specified by x is system dependent. - center(s1,i,s2) : s3 # position string at center Produces a string of size i in which s1 is centered, with s2 used for padding at left and right as necessary. Defaults: i 1 s2 " " (blank) - char(i) : s # produce character Produces a string of length 1 consisting of the character whose internal representation is i. - chdir(s) : n # change directory Changes the directory to s but fails if there is no such directory or if the change cannot be made. - close(f) : f # close file Produces f after closing it unless f was opened with the pipe ("p") option, in which case the integer exit status of the command is returned. - collect(i1,i2) : n # perform garbage collection Causes a garbage collectionin region i1, requesting i2 bytes of space in that region. It fails if the requested space is not available. The regions are identified as follows: 1 Static region 2 String region 3 Block region If i1 is 0, a collection is done, but no region is identified and i2 has no effect. The value of i2 is ignored for the static region. Defaults: i1 0 i2 0 - copy(x1) : x2 # copy value Produces a copy of x1 if x1 is a structure; otherwise it produces x1. - cos(r1) : r2 # compute cosine Produces the cosine of r1 in radians. - cset(x) # convert to cset Produces a cset resulting from converting x, but fails if the conversion is not possible. - delay(i) : n # delay execution Delays execution i milliseconds. - delete(X,x) : X # delete element If X is a set, deletes x from X. If X is a table, deletes the element for key x from X. Produces X. - detab(s1,i1,i2,...,in) : s2 # remove tabs Produces a string based on s1 in which each tab character is replaced by one or more blanks. Tab stops are at i1, i2, ..., in, with additional stops obtained by repeating the last interval. Default: i1 9 - display(i,f) : n # display variables Writes the image of the current co-expression and the values of the local variables in the current procedure call. If i > 0, the local variables in the i preceding procedure calls are displayed as well. After all local variables are displayed, the values of global variables are displayed. Output is written to f. Defaults: i &level f &errout - dtor(r1) : r2 # convert degrees to radians Produces the radian equivalent of r1 given in degrees. - entab(s1,i1,i2,...,in) : s2 # insert tabs Produces a string based on s1 in which runs of blanks are replaced by tabs. Tab stops are at i1, i2, ..., in, with additional stops obtained by repeating the last interval. Default: i1 9 - errorclear() : n # clear error indication Clears the indications of the last error. - exit(i) # exit program Terminates the program with exit status i. Default: i normal exit (system dependent) - exp(r1) : r2 # compute exponential Produces e raised to the power r1. - find(s1,s2,i1,i2) : i3,i4,...,in # find string Generates the sequence of integer positions in s2 at which s1 occurs as a substring in s2[i1:i2], but fails if there is no such position. Defaults: s2 &subject i1 &pos if s2 defaulted, otherwise 1 i2 0 - flush(f) : n # flush I/O buffer Flushes the input/output buffers for f. - function() : s1,s2,...,sn # generate function names Generates the names of the Icon (built-in) functions. - get(L) : x # get value from list Produces the leftmost element of L and removes it from L, but fails if L is empty; synonym for pop(L). - getenv(s1) : s2 # get value of environment variable Produces the value of environment variable s1, but fails if the variable is not set or environment variables are not supported. - iand(i1,i2) : i3 # compute bit-wise "and" Produces the bitwise "and" of i1 and i2. - icom(i1) : i2 # compute bit-wise complement Produces the bitwise complement (1's complement) of i1. - image(x) : s # produce string image Produces a string image of x. - insert(X,x1,x2) : X # insert element If X is a table, inserts the key x1 with value x2 into X. If X is a set, inserts x1 into X. Produces X. Default: x2 &null - integer(x) : i # convert to integer Produces the integer resulting from converting x, but fails if the conversion is not possible. - ior(i1,i2) : i3 # compute bit-wise inclusive "or" Produces the bitwise inclusive "or" of i1 and i2 - ishift(i1,i2) : i3 # shift bits Produces the result of shifting the bits in i1 by i2 positions. Positive values of i2 shift to the left, negative to the right. Vacated bit positions are zero-filled. - ixor(i1,i2) : i3 # compute bit-wise exclusive "or" Produces the bitwise exclusive "or" of i1 and i2. - key(T) : x1,x2,...,xn # generate keys from table Generates the keys in table T. - left(s1,i,s2) : s3 # position string at left Produces a string of size i in which s1 is positioned at the left, with s2 used for padding on the right as necessary. Defaults: i 1 s2 " " (blank) - list(i,x) : L # create list Produces a list of size i in which each value is x. Defaults: i 0 x &null - log(r1,r2) : r3 # compute logarithm Produces the logarithm of r1 to the base r2. Default: r2 e - many(c,s,i1,i2) : i3 # locate many characters Succeeds and produces the position in s after the longest initial sequence of characters in c in s[i1:i2]. It fails if s[i1] is not in c. Defaults: s &subject i1 &pos if s defaulted, otherwise 1 i2 0 - map(s1,s2,s3) : s4 # map characters Produces a string of size *s1 obtained by mapping characters of s1 that occur in s2 into corresponding characters in s3. Defaults: s2 string(&ucase) s3 string(&lcase) - match(s1,s2,i1,i2) : i3 # match initial string Produces i1 + *s1 if s1 == s2[i1+:*s1], but fails otherwise. Defaults: s2 &subject i1 &pos if s2 defaulted, otherwise 1 i2 0 - member(X,x) : x # test for membership If X is a set, succeeds if x is a member of X, but fails otherwise. If X is a table, succeeds if x is a key of an element in X, but fails otherwise. Produces x if it succeeds. - mmout(x) : n # write text to allocation history Writes s to the allocation history file. s is given no interpretation. - mmpause(s) : n # write pause to allocation history Writes s to the allocation history file as a pause point with identification s. Default: s "programmed pause" - mmshow(x,s) : n # redraw in allocation history Specifies redrawing of x in the allocation history file. The color is defined by s as follows: "b" black "g" gray "w" white "h" highlight; blinking black and white if possible "r" normal color If x is not in an allocated region, has no effect. Default: s "r" - move(i) : s # move scanning position Produces &subject[&pos:&pos + i] and assigns i + &pos to &pos, but fails if i is out of range; reverses assignment to &pos if resumed. - name(x) : s # produce name Produces the name of the variable x. If x is an identifier or a keyword that is a variable, the name of the identifier or keyword is produced. If x is a record field reference, the record name and field name are produced with a separating period. If x is a string, the name of the string and the subscript range are shown. If x is a subscripted list or table, the type name followed by the subscripting expression is produced. - numeric(x) : N # convert to numeric Produces an integer or real number resulting from converting x, but fails if the conversion is not possible. - open(s1,s2) : f # open file Produces a file resulting from opening s1 according to options in s2, but fails if the file cannot be opened. The options are: "r" open for reading "w" open for writing "a" open for writing in append mode "b" open for reading and writing "c" create "t" translate line termination sequences to linefeeds "u" do not translate line termination sequences to linefeeds "p" pipe to/from a command -- UNIX The default mode is to translate line termination sequences to linefeeds on input and conversely on output. The untranslated mode should be used when reading and writing binary files. Default: s2 "rt" - ord(s) : i # produce ordinal Produces an integer (ordinal) between 0 and 255 that is the internal representation of the single character in s. - pop(L) : x # pop from list Produces the leftmost element of L and removes it from L, but fails if L is empty; synonym for get(L). - pos(i1) : i2 # test scanning position Produces &pos if &pos = i1, but fails otherwise. - proc(x,i) : p # convert to procedure Produces a procedure corresponding to the value of x, but fails if x does not correspond to a procedure. If x is the string name of an operator, i specifies the number of arguments: 1 for unary (prefix), 2 for binary (infix), and 3 for ternary. Default: i 1 - pull(L) : x # pull from list Produces the rightmost element of L and removes it from L, but fails if L is empty. - push(L,x) : L # push onto list Adds x to the left end of L and produces L. - put(L,x) : L # put onto list Adds x to the right end of L and produces L. - read(f) : s # read line Produces the next line from f, but fails on end of file. Default: f &input - reads(f,i) : s # read string Produces a string consisting of the next i characters from f, or the remaining characters of f if fewer remain, but fails on an end of file. In reads(), unlike read(), line termination sequences have no special significance. reads() should be used for reading binary data. Defaults: f &input i 1 - real(x) : r # convert to real Produces a real number resulting from type conversion of x, but fails if the conversion is not possible. - remove(s) : n # remove file Removes (deletes) the file named s, but fails if s cannot be removed. - rename(s1,s2) : n # rename file Renames the file named s1 to be s2, but fails if the renaming cannot be done. - repl(s1,i) : s2 # replicate string Produces a string consisting of i concatenations of s1. - reverse(s1) : s2 # reverse string Produces a string consisting of the reversal of s. - right(s1,i,s2) : s3 # position string at right Produces a string of size i in which s1 is positioned at the right, with s2 used for padding on the left as necessary. Defaults: i 1 s2 " " (blank) - rtod(r1) : r2 # convert radians to degrees Produces the degree equivalent of r1 given in radians. - runerr(i,x) # terminate with run-time error Terminates program execution with error i and offending value x. Default: x no offending value - seek(f,i) : f # seek to position in file Seeks to position i in f, but fails if the seek cannot be performed. The first byte in the file is at position 1. seek(f,0) seeks to the end of file f. - seq(i1,i2) : i3,i4,... # generate sequence of integers Generates an endless sequence of integers starting at i1 with increments of i2. Defaults: i1 1 i2 1 - set(L) : S # create set Produces a set whose members are the distinct values in the list L. Default: L [] - sin(r1) : r2 # compute sine Produces the sine of r1 given in radians. - sort(X,i) : L # sort structure Produces a list containing values from X. If X is a list or a set, sort(X,i) produces the values of X in sorted order. If X is a table, sort(X,i)produces a list obtained by sorting the elements of X, depending on the value of i. For Produces a list according to i: i = (1 | 2) Produces a list of two-element lists of key/value pairs from X; ordered by keys for i = 1, by values for i = 2. i = (3 | 4) Produces a list of size 2 * *X with each consecutive pair of elements consisting of a key and a value from X; ordered by keys for i = 3, by values for i = 4. Default: i 1 - sortf(X,i) : L # sort list or set by field Produces a sorted list of the values in X. Sorting is primarily by type and in most respects is the same as with sort(X,i). However, among lists and among records, two structures are ordered by comparing their ith fields. i can be negative but not zero. Two structures having the equal ith fields are ordered as they would be in regular sorting, but structures lacking an ith field appear before structures having them. Default: i 1 - sqrt(r1) : r2 # compute square root Produces the square root of r1. - stop(x1,x2,...,xn) # stop execution Terminates program execution with an error status after writing strings x1,x2,...,xn. If xi is a file, subsequent output is to xi. Initial output is to standard error output. Default: xi "" (empty string) - string(x) : s # convert to string Produces a string resulting from converting x, but fails if the conversion is not possible. - system(s) : i # call system function Calls the C library function "system" to execute s and produces the resulting integer exit status. - tab(i) : s # set scanning position Produces &subject[&pos:i] and assigns i to &pos, but fails if i is out of range. It reverses assignment to &pos if resumed. - table(x) : T # create table Produces a table with a default value x. Default: x &null - tan(r1) : r2 # compute tangent Produces the tangent of r1 given in radians. - trim(s1,c) : s2 # trim string Produces a string consisting of the characters of s1 up to the trailing characters contained in c. Default: c ' ' (blank) - type(x) : s # produce type name Produces a string corresponding to the type of x. - upto(c,s,i1,i2) : i3,i4,...,in # locate characters Generates the sequence of integer positions in s preceding a character of c in s[i1:i2]. It fails if there is no such position. Defaults: s &subject i1 &pos if s defaulted, otherwise 1 i2 0 - variable(s) : x # produce variable Produces the variable for the identifier or keyword named s, but fails if there is no such variable. Local identifiers override global identifiers. - where(f) : i # produce position in file Produces the current byte position in f. The first byte in the file is at position 1. - write(x1,x2,...,xn) : xn # write line Writes strings x1,x2,...,xn with a line termination sequence added at the end. If xi is a file, subsequent output is to xi. Initial output is to standard output. Default: xi "" (empty string) - writes(x1,x2,...,xn) # write string Writes strings x1,x2,...,xn without a line termination sequence added at the end. If xi is a file, subsequent output is to xi. Initial output is to standard output. Default: xi "" (empty string) - icont -- Icon translator and linker icont [option...] file... -c # translate only (no link) -o file # name icode file "file" -s # suppress progress messages -t # give &trace initial value of -1 -u # issue warnings for undeclared identifiers See also: ihelp iconx - iconx -- Icon interpreter The Icon interpreter is normally invoked automatically when the name of an Icon program is entered as a command, but it can be invoked explicitly, too. iconx icode_file_name [arguments for Icon program.] Shell environment variables recognized by iconx =============================================== Name Default Description -------- ------- ----------------------- TRACE 0 Initial value for &trace. NOERRBUF undefined If set, &errout is not buffered. STRSIZE 65000 Initial size (bytes) of string region (strings). BLOCKSIZE 65000 Initial size (bytes) of block region (most objects). COEXPSIZE 2000 Size (long words) of co-expression blocks. MSTKSIZE 10000 Size (long words) of main interpreter stack. STATSIZE 20480 Initial size (bytes) of static region (co-expression blocks). STATINCR 1/4 of Increment used to expand static region. STATSIZE See also: ihelp icont - Expressions shown in order of decreasing precedence. Items in groups (as separated by empty lines) have equal precedence. High Precedence Expressions (expr) # grouping {expr1;expr2;...} # compound x(expr1,expr2,...) # invocation x{expr1,expr2,...} # " [expr1,expr2,...] # list expr.F # field reference expr1[expr2] # subscript expr1[expr2:expr3] # section expr1[expr2+:expr3] # " expr1[expr2-:expr3] # " Prefix Expressions not expr # success/failure reversal | expr # repeated alternation ! expr # element generation * expr # size + expr # numeric value - expr # negative . expr # value (dereference) / expr # null \ expr # non-null = expr # match and tab ? expr # random value ~ expr # cset complement @ expr # activation ^ expr # refresh Infix Expressions expr1 \ expr2 # limitation expr1 @ expr2 # transmission expr1 ! expr2 # invocation expr1 ^ expr2 # power expr1 * expr2 # product expr1 / expr2 # quotient expr1 % expr2 # remainder expr1 ** expr2 # intersection expr1 + expr2 # sum expr1 - expr2 # numeric difference expr1 ++ expr2 # union expr1 -- expr2 # cset or set difference expr1 || expr2 # string concatenation expr1 ||| expr2 # list concatenation expr1 < expr2 # numeric comparison expr1 <= expr2 # " expr1 = expr2 # " expr1 >= expr2 # " expr1 > expr2 # " expr1 ~= expr2 # " expr1 << expr2 # string comparison expr1 <<= expr2 # " expr1 == expr2 # " expr1 >>= expr2 # " expr1 >> expr2 # " expr1 ~== expr2 # " expr1 === expr2 # value comparison expr1 ~=== expr2 # " expr1 | expr2 # alternation expr1 to expr2 by expr3 # integer generation expr1 := expr2 # assignment expr1 <- expr2 # reversible assignment expr1 :=: expr2 # exchange expr1 <-> expr2 # reversible exchange expr1 op:= expr2 # (augmented assignments) expr1 ? expr2 # string scanning expr1 & expr2 # conjunction Low Precedence Expressions break [expr] # break from loop case expr0 of { # case selection expr1:expr2 ... [default:exprn] } create expr # co-expression creation every expr1 [do expr2] # iterate over generated values fail # failure of procedure if expr1 then exp2 [else exp3] # if-then-else next # go to top of loop repeat expr # loop return expr # return from procedure suspend expr1 [do expr2] # suspension of procedure until expr1 [do expr2] # until-loop while expr1 [do expr2] # while-loop - Functions and datatypes of arguments and produced values: abs(N) : N # compute absolute value acos(r1) : r2 # compute arc cosine any(c,s,i1,i2) : i3 # locate initial character args(p) : i # get number of procedure arguments bal(c1,c2,c3,s,i1,i2) : i3,i4,...,in # locate balanced characters callout(x,x1,x2,...,xn) : xm # call external function center(s1,i,s2) : s3 # position string at center char(i) : s # produce character chdir(s) : n # change directory close(f) : f # close file collect(i1,i2) : n # perform garbage collection copy(x1) : x2 # copy value cos(r1) : r2 # compute cosine cset(x) # convert to cset delay(i) : n # delay execution delete(X,x) : X # delete element detab(s1,i1,i2,...,in) : s2 # remove tabs display(i,f) : n # display variables dtor(r1) : r2 # convert degrees to radians entab(s1,i1,i2,...,in) : s2 # insert tabs errorclear() : n # clear error indication exit(i) # exit program exp(r1) : r2 # compute exponential find(s1,s2,i1,i2) : i3,i4,...,in # find string flush(f) : n # flush I/O buffer function() : s1,s2,...,sn # generate function names get(L) : x # get value from list getenv(s1) : s2 # get value of environment variable iand(i1,i2) : i3 # compute bit-wise "and" icom(i1) : i2 # compute bit-wise complement image(x) : s # produce string image insert(X,x1,x2) : X # insert element integer(x) : i # convert to integer ior(i1,i2) : i3 # compute bit-wise inclusive "or" ishift(i1,i2) : i3 # shift bits ixor(i1,i2) : i3 # compute bit-wise exclusive "or" key(T) : x1,x2,...,xn # generate keys from table left(s1,i,s2) : s3 # position string at left list(i,x) : L # create list log(r1,r2) : r3 # compute logarithm many(c,s,i1,i2) : i3 # locate many characters map(s1,s2,s3) : s4 # map characters match(s1,s2,i1,i2) : i3 # match initial string member(X,x) : x # test for membership mmout(x) : n # write text to allocation history mmpause(s) : n # write pause to allocation history mmshow(x,s) : n # redraw in allocation history move(i) : s # move scanning position name(x) : s # produce name numeric(x) : N # convert to numeric open(s1,s2) : f # open file ord(s) : i # produce ordinal pop(L) : x # pop from list pos(i1) : i2 # test scanning position proc(x,i) : p # convert to procedure pull(L) : x # pull from list push(L,x) : L # push onto list put(L,x) : L # put onto list read(f) : s # read line reads(f,i) : s # read string real(x) : r # convert to real remove(s) : n # remove file rename(s1,s2) : n # rename file repl(s1,i) : s2 # replicate string reverse(s1) : s2 # reverse string right(s1,i,s2) : s3 # position string at right rtod(r1) : r2 # convert radians to degrees runerr(i,x) # terminate with run-time error seek(f,i) : f # seek to position in file seq(i1,i2) : i3,i4,... # generate sequence of integers set(L) : S # create set sin(r1) : r2 # compute sine sort(X,i) : L # sort structure sortf(X,i) : L # sort list or set by field sqrt(r1) : r2 # compute square root stop(x1,x2,...,xn) # stop execution string(x) : s # convert to string system(s) : i # call system function tab(i) : s # set scanning position table(x) : T # create table tan(r1) : r2 # compute tangent trim(s1,c) : s2 # trim string type(x) : s # produce type name upto(c,s,i1,i2) : i3,i4,...,in # locate characters variable(s) : x # produce variable where(f) : i # produce position in file write(x1,x2,...,xn) : xn # write line writes(x1,x2,...,xn) # write string - Operations and required datatypes prefix operations +N : N # compute positive -N : N # compute negative ~c1 : c2 # compute cset complement =s1 : s2 # match string in scanning @C : x # activate co-expression ^C1 : C2 # create refreshed co-expression *x : i # compute size ?x1 : x2 # generate random value !x : x1,x2,...,xn # generate values /x : x # check for null value \x : x # check for non-null value .x : x # dereference variable infix operations N1 + N2 : N3 # compute sum N1 - N2 : N3 # compute difference N1 * N2 : N3 # compute product N1 / N2 : N3 # compute quotient N1 % N2 : N3 # compute remainder N1 ^ N2 : N3 # compute exponential x1 ++ x2 : x3 # compute cset or set union x1 -- x2 : x3 # compute cset or set difference x1 ** x2 : x3 # compute cset or set intersection s1 || s2 : s3 # concatenate strings L1 ||| L2 : L3 # concatenate lists R.F : x # get field of record x1 @ C : x2 # transmission value to co-expression x1 & x2 : x2 # evaluate in conjunction N1 < N2 : N2 # compare numerically N1 <= N2 : N2 # " N1 = N2 : N2 # " N1 >= N2 : N2 # " N1 > N2 : N2 # " N1 ~= N2 : N2 # " s1 << s2 : s2 # compare lexically s1 <<= s2 : s2 # " s1 == s2 : s2 # " s1 >>= s2 : s2 # " s1 >> s2 : s2 # " s1 ~== s2 : s2 # " x1 === x2 : x2 # compare values x1 ~=== x2 : x2 # " x1 := x2 : x1 # assign value x1 op:= x2 : x1 # augmented assignment x1 :=: x2 : x1 # exchange values x1 <- x2 : x1 # assign value reversibly x1 <-> x2 : x1 # exchange values reversibly - Keywords &allocated : i1,i2,i3,i4 # accumulated bytes allocated # (total,static,string,block) &ascii : c # cset of ascii characters &clock : s # current time of day &collections : i1,i2,i3,i4 # collection count # (total,static,string,block) &cset : c # cset of all characters ¤t : C # current co-expression &date : s # current date &dateline : s # current date and time &digits : c # cset of digits 0-9 &e : r # base of natural logarithms, 2.71828... &error : i # run-time error conversion control &errornumber : i # run-time error number &errortext : s # run-time error message text &errorvalue : x # run-time error offending value &errout : f # standard error output file &fail # fails &features : s1,s2,...,sn # implementation features &file : s # current source code file name &host : s # string identifying host computer &input : f # standard input file &lcase : c # cset of lower case letters a-z &letters : c # cset of all letters A-Za-z &level : i # level of current procedure call &line : i # current source code line number &main : C # main co-expression &null : n # the null value &output : f # standard output file &phi : r # The golden ratio, 1.61803... &pi : r # The value of pi, 3.14159... &pos : i # string scanning position &random : i # random number seed ®ions : i1,i2,i3 # current region size # (static,string,block) &source : C # activator of current co-expression &storage : i1,i2,i3 # current bytes allocated # (static,string,block) &subject : s # string scanning subject &time : i # current run time in milliseconds &trace : i # procedure tracing control &ucase : c # cset of upper case letters A-Z &version : s # version of Icon - Datatypes null(n) string(s) co-expression(C) table(T) integer(i) cset(c) procedure(p) set(S) real(r) file(f) list(L) (R) (see also "Abbreviations") - Reserved words break do global next repeat to by else if not return until case end initial of static while create every link procedure suspend default fail local record then - Escapes in string and cset constants \b backspace \v vertical tab \d delete(rubout) \' single quote \e escape (altmode) \" double quote \f formfeed \\ backslash \l linefeed (newline) \ddd octal code \n newline (linefeed) \xdd hexadecimal code \r carriage return \^c control code \t horizontal tab - Abbreviations used in Icon help files (and other Icon literature) c cset C co-expression f file L list i integer N numeric (i or r) n null R record (any record type) p procedure S set r real T table s string X any structure type (L, R, S, or T) x any type F field of record - About the Icon Programming Language Help File Information used in this help file was obtained from the following sources: Griswold, Ralph E. and Madge T. Griswold. "The Icon Programming Language, Second Edition", Prentice-Hall, Inc., Englewood Cliffs, New Jersey. 1990. Griswold, Ralph E. ICONT(1), manual page for "UNIX Programmer's Manual", Department of Computer Science, The University of Arizona. 1988. Griswold, Ralph E., Clinton L. Jeffery, Gregg M. Townsend, and Kenneth Walker. "Version 8.6 of the Icon Programming Language", IPD188, Department of Computer Science, The University of Arizona. 1992. Further information on the Icon Programming Language can be obtained from: Icon Project Department of Computer Science Gould-Simpson Building The University of Arizona Tucson, Arizona 85721 U.S.A. (602) 621-2018 icon-project@cs.arizona.edu (Internet) ...{uunet,allegra,noao}!arizona!icon-project (uucpnet) April 2, 1992. icon-9.4.3/ipl/data/sen.rsg0000664000175000017500000000133507140713044015004 0ustar chrishchrish::= . ::=| ::= ::= ::=
|
::=|||
::=a|the ::=black|red|blue|large|hot|choclate|hairy|yawning\ |bleary|checkered|finite|twisted|frumpy ::=very|rather|possibly|frightenly|charmingly\ |willingly|singularly|refreshingly ::=eats|opens|flies|panics|paints|emebllishes ::=molds|burns|gapes|sails|poses|smokes ::=hatbox|zepplin|totilla|cupcake|gorge|sculptor|ashtray\ |cloud|corkscrew|barrel|landslide|jalopy 10 icon-9.4.3/ipl/data/abcd.csg0000664000175000017500000000027007140713044015066 0ustar chrishchrish# a(n)b(n)c(n)d(n) # Fu, p. 94-95. S->aAB A->aAC A->D Dc->cD Dd->dD DC->EC EC->Ed DB->FB Ed->Gd cG->Gc dG->Gd aG->abcD bG->bbcD dFB->dFd dFd->Fdd cF->Fc bF->bbc aF->ab bB->bcd S:5 icon-9.4.3/ipl/data/rsg.tok0000664000175000017500000001021207140713044015006 0ustar chrishchrish Unary operators: 4 !e 6 *e 6 -e 6 =e 2 ?e 7 \e 1 ~e 32 total Binary operators: 11 e1 & e2 5 e1 . e2 42 e1 := e2 3 e1 = e2 6 e1 == e2 1 e1 > e2 6 e1 || e2 2 e1 ||:= e2 1 e1 ||| e2 2 e1 ~= e2 19 e1[e2] 98 total Other operators: 2 (...) 22 [...] 76 e(...) 1 e1 to e2 4 e1[e2:e3] 105 total Control structures: 5 break 2 case 6 case selector 20 e1 ; e2 7 e1 ? e2 1 e1 \ e2 13 e1 | e2 1 every e 2 every e1 do e2 5 fail 8 if e1 then e2 5 if e1 then e2 else e3 2 initial 1 next 1 repeat e 15 return e 1 while e 5 while e1 do e2 100 total Keywords: 1 &digits 5 &errout 1 &input 1 &lcase 1 &output 1 &random 1 &ucase 11 total Literals: 12 0 17 1 4 2 1 3 1 4 1 1000 6 "" 1 "#" 2 "&digit" 2 "&lcase" 2 "&ucase" 2 "'" 1 "'>" 2 "*** cannot open " 1 "*** erroneous line: " 1 "*** excessive symbols remaining" 1 "*** undefined nonterminal: " 1 "*** undefined nonterminal: <" 1 "->" 1 "::=" 7 "<" 1 "<'" 1 "=" 4 ">" 2 ">::=" 1 "@" 1 "\\" 1 "\n" 2 "charset" 1 "l" 2 "lb" 2 "nl" 2 "nonterm" 2 "rb" 1 "s" 2 "string" 1 "t" 1 "tl+s+" 2 "vb" 1 "w" 2 "|" 1 '<' 2 '>' 1 '|' 103 total Variable references: 6 a 3 alist 1 alt 1 alts 1 args 2 builtin 2 chars 4 charset 2 close 1 comment 2 count 1 cset 1 define 1 defn 1 defnon 13 defs 1 error 7 file 2 find 1 gener 1 generate 4 get 2 getrhs 3 goal 1 grammar 3 ifile 6 in 1 integer 2 limit 13 line 2 listimage 1 many 5 move 9 name 2 new 2 nonbrack 2 nonterm 3 nt 2 ofile 2 open 1 options 4 opts 3 out 6 pending 2 plist 1 pop 1 pos 4 prompt 1 prompter 1 push 2 put 1 pwrite 2 read 3 rhs 3 s 3 slist 1 sort 1 source 2 sym 7 symbol 2 symimage 1 syms 11 tab 1 table 2 tswitch 2 type 3 upto 10 write 3 writes 6 x 209 total Field references: 2 chars 3 name 5 total Declarations: 1 global 1 link 11 local 17 procedure 2 record 2 static 34 total Globals: 1 defs 1 ifile 1 in 1 limit 1 prompt 1 tswitch 6 total Locals: 1 a 1 alist 1 chars 1 count 2 file 1 goal 1 line 2 name 1 new 1 nt 1 opts 1 out 1 pending 1 plist 1 rhs 2 s 1 slist 1 symbol 1 x 22 total Statics: 1 builtin 1 nonbrack 2 total Procedure parameters: 2 a 1 alt 1 args 1 defn 1 goal 7 line 1 name 1 ofile 1 sym 1 x 17 total Record fields: 1 chars 1 name 2 total Included files: 1 options 1 total Total tokens: 747 icon-9.4.3/ipl/data/joyce1.txt0000664000175000017500000000164207140713044015436 0ustar chrishchrishWhat special affinities appeared to him to exist between the moon and woman? Her antiquity in preceding and surviving successive tellurian generations: her nocturnal predominance: her satellitic dependence: her luminary reflection: her constancy under all her phases, rising, and setting by her appointed times, waxing and waning: the forced invariablility of her aspect: her indeterminate response to inaffirmative interrogation: her potency over effluent and refluent waters: her power to enamour, to mortify, to invest with beauty, to render insane, to incite and aid delinquency: the tranquil inscrutability of her visage: the terribility of her isolated dominant implacable resplendent propinquity: her omens of tempest and of calm: the stimulation of her light, her motion and her presence: the admonition of her craters, her arid seas, her silence: her splendour, when visible: her attraction, when invisible. icon-9.4.3/ipl/data/joyce2.txt0000664000175000017500000000257607140713044015446 0ustar chrishchrishLynch! Hey? Sign on long o me. Denzille lane this way. Change here for Bawdyhouse. We two, she said, will seek the kips where shady Mary is. Righto, any old time. Laetabuntur in cubilibus suis. You coming long? Whisper, who the sooty hell's the johnny in the black duds? Hush! Sinned against the light and even now that day is at hand when he shall come to judge the world by fire. Pflaap! Ut implerentur scripturae. Strike up a ballad. Then outspake medical Dick to his comrade medical Davy. Christicle, who's this excrement yellow gospeller on the Merrion hall? Elijah is coming washed in the Blood of the Lamb. Come on, you winefizzling ginsizzling booseguzzling existences! Come on, you dog-gone, bullnecked, bettlebrowed, hogjowled, peanutbrained, weaseleyed fourflushers, false alarms and excess baggage! Come on, you triple extract of infamy! Alexander J. Christ Dowie, that's yanked to glory most half this planet from 'Frisco Beach to Vladivostok. The Deity ain't no nickel dime bumshow. I put it to you that he's on the square and a corking fine business proposition. He's the grandest thing yet and don't you forget it. Shout salvation in king Jesus. You'll need to rise precious early, you sinner there, if you want to diddle the Almighty God. Pflaaaap! Not half. He's got a coughmixture with a punch in it for you, my friend, in his backpocket. Just you try it on. icon-9.4.3/ipl/data/joyce3.txt0000664000175000017500000000332307140713044015436 0ustar chrishchrishHe larved ond he larved on he merd such a nauses The Gracehoper feared he would mixplace his fauces. I forgive you, grondt Ondt, said the Gracehoper, weeping, For the sukes of the sakes you are safe in whose keeping. Teach Floh and Luse polkas, show Bienie where's sweet And be sure Vespatilla fines fat ones to heat. As I once played the piper I must now pay the count So saida to Moyhammlet and Marhaba to your Mount! Let who likes lump above so what flies be a full 'un; I could not feel moregruggy if this was prompollen. I pick up your reproof, the horsegift of a friend, For the prize of your save is the price of my spend. Can castwhores pulladeftkiss if oldpollocks forsake 'em Or Culex feel etchy if Pulex don't wake him? A locus to loue, a term it t'embarass, These twain are the twins that tick Homo Vulgaris. Has Aquileone nort winged to go syf Since the Gwyfyn we were in his farrest drewbryf And that Accident Man not beseeked where his story ends Since longsephyring sighs sought heartseast for their orience? We are Wastenot with Want, precondamned, two and true, Till Nolans go volants and Bruneyes come blue. Ere those gidflirts now gadding you quit your mocks for my gropes An extense must impull, an elapse must elopes Of my tectucs takestock, tinktact, and ail's weal; As I view by your farlook hale yourself to my heal. Partiprise my thinwhins whiles my blink points unbroken on Your whole's whercabroads with Tout's trightyright token on. My in risible universe youdly haud find Such oxtrabeeforeness meat soveal behind. Your feats end enormous, your volumes immense, (May the Graces I hoped for sing your Ondtship song sense!), Your genus its worldwide, your spacest sublime! But, Holy Saltmartin, why can't you beat time? icon-9.4.3/ipl/data/chart.gmr0000664000175000017500000000222207140713044015306 0ustar chrishchrishDate: 28 Feb 92 07:08:19 GMT From: uchinews!ellis!goer@uunet.uu.net (Richard L. Goerwitz) Subject: sample BNFs To: icon-group@cs.arizona.edu # # Here, by the way, is the sample grammar offered in the magazine # article that got me wondering about Icon-based chart parsers: # ::= | ::= | ( () | ) | \ ( | | | ) ::= ( | | | ) | \ | | | \ ::=

( | ) | ::= ::= and ::= the | a | his | her ::= her | he | they ::= nurse | nurses | book | books | travel | arrow | arrows | \ fortune | fortunes | report ::= outrageous | silly | blue | green | heavy | white | red | \ black | yellow ::= travel | travels | report | see | suffer ::= hear | see | suffer

::= on | of ::= that -- -Richard L. Goerwitz goer%sophist@uchicago.bitnet goer@sophist.uchicago.edu rutgers!oddjob!gide!sophist!goer icon-9.4.3/ipl/data/icon.wrd0000664000175000017500000001460607423315765015171 0ustar chrishchrishAcousticon AmiCon Amicon Amnicon Amphicondyla Anticonfederacy Applicon Balopticon Chicon Ciconia Ciconiae Ciconiidae Ciconiiformes Cognicon Colicon Conicon Cryptonomicon Cubicon DICON Decepticons Definicon Dendronomicon Diablicon Diconix Didascalicon Digicon Eicon EiconScript Emoticon Epicon Eroticon Ethicon Eticon FICON Fabricon Flexicon Formicon Fornicon Gyricon HOPLICON Helicon Heliconiinae Hellicon Helliconia Heuricon ICON ICONS ICONSIM ICONstructor ICONtemplation ICon IConcepts ISIcon Icon-It! Icon-o-grafics IconAid IconArtist IconAuthor IconMaker IconManager IconMaster IconTroller IconWDEF Iconation Iconclass Iconclaves Iconder Iconer Icones Iconha Iconia Iconica Iconis Iconix Iconixx IconoClass Iconologia Iconologioum Iconolor Iconophile Iconopolis Iconovex Iconscapes Icontact Iconucopia Iconysis ImagICON Indexicon Insecticon Kineticon LiCONiX Licon Logicon Logisticon Lycopersicon MICON MacIcon Mainplicon Matricon Mellicone Micona Miconia Miconozols Minicon Modicon Mosaicon Munreicon MyPicon Mylicon Necronomicon NeoIcon Newvicon Omnicon Opiconsivia POWERIcon Paiconeca Palindromicon Pantechnicon Photoicon Piconet ProIcon Publicon Relicon SCICON SIL-ICON Satyricon Semicon Sentricon Siliconix Siliconsis SlotIcon Spectricon TechniCon Technicon Ticon Ticonderoga Tirjicon TitanIcon Tricon Triconet UNICON Vanilicon Vericon Vicon Wiconisco X-Icon Zericon aeolodicon aeolomelodicon ammoniticone amphicondylous aniconic aniconism anticonceptionist anticonductor anticonfederationism anticonfederationist anticonfederative anticonformist anticonformity anticonscience anticonscription anticonscriptive anticonservatism anticonservative anticonservatively anticonservativeness anticonstitution anticonstitutional anticonstitutionalism anticonstitutionalist anticonstitutionally anticontagion anticontagionist anticontagious anticontagiously anticontagiousness anticonvellent anticonvention anticonventional anticonventionalism anticonventionalist anticonventionally anticonvulsant anticonvulsive apollonicon archicontinent bactriticone baculiticone basilicon biconcave biconcavity biconditional bicondylar bicone biconective biconic biconical biconically biconjugate biconnect biconsonantal biconsonantic bicontinuous biconvex breviconic catholicon cerviconasal chronicon ciconian ciconiid ciconiiform ciconine ciconioid cubicone cubicontravariant cuprosilicon cyberlexicon decepticon deicon desiliconization desiliconize diaconicon diconduinine dicondylian dicondylic diconic diconquinine dicont doxasticon ectepicondylar eirenicon ekasilicon emoticon entepicondylar epicondylar epicondyle epicondylian epicondylic epicontinental epiopticon equiconvex ethnicon etymologicon euphonicon fansicon ferrosilicon genicon harmonicon helicon heliconia heliconian heliconid heliconideous heliconii heliconiidae heliconine heliconist heliconius heliconoid heliopticon hydraulicon hydrosilicon iconalia iconantidyptic iconc iconcepts iconcontruction iconfess iconfirmed iconflaguration iconia iconian iconic iconical iconically iconicity iconics iconifiable iconify iconism iconistical iconistically iconium iconize iconocenter iconocentric iconoclasm iconoclast iconoclastic iconoclastically iconoclasticism iconodule iconodulic iconodulist iconoduly iconogenetic iconogenitors iconograph iconographer iconographic iconographical iconographically iconographist iconography iconolagny iconolater iconolator iconolatrous iconolatry iconological iconologist iconology iconomach iconomachal iconomachian iconomachical iconomachist iconomachy iconomancy iconomania iconomatic iconomatically iconomaticism iconomatography iconometer iconometric iconometrical iconometrically iconometry iconomical iconomicar iconophile iconophilism iconophilist iconophily iconoplast iconopod iconopolis iconoscope iconostas iconostasion iconostasis iconostasium iconotype iconovex icont icontraption iconx iconymus idioticon irenicon kamptilicon kamptulicon lenticonus lexicon lexiconist lexiconize liticontestation longicone magnilicon maniplicon maricon melodicon micomicon miconcave miniconference miniconjou mnemonicon monasticon multiconductor multiconstant nautilicone necromicon necronomicon noniconoclastic noniconoclastically onomasticon opticon organosilicon oriconic orthicon orthiconoscope otacousticon panegyricon panharmonicon paniconograph paniconographic paniconography panmelodicon panopticon pantechnicon periconchal periconchitis picon plumbicon protosilicon quadricone quasicondidently quasiconfident quasiconfining quasiconforming quasicongenial quasicongenially quasicongratulatory quasiconnective quasiconnectively quasiconscientious quasiconscientiously quasiconscious quasiconsequential quasiconsequentially quasiconservative quasiconservatively quasiconsiderate quasiconsiderately quasiconsistent quasiconsistently quasiconsolidated quasiconstant quasiconstantly quasiconstitutional quasiconstitutionally quasiconstrucitvely quasiconstructed quasiconstructive quasiconsuming quasicontent quasicontented quasicontentedly quasicontinual quasicontinually quasicontinuous quasicontinuously quasicontrarily quasicontrary quasicontrasted quasicontrolled quasicontrolling quasiconvenient quasiconveniently quasiconventional quasiconventionally quasiconverted quasiconveyed quasiconvinced rariconstant rubicon rubiconed salpicon satyricon scanticon sciopticon scleroticon semiconcave semiconceal semiconcealed semiconcrete semiconditioned semiconducting semiconduction semiconductive semiconductor semicone semiconfident semiconfinement semiconfluent semiconformist semiconformity semiconic semiconical semiconically semiconjugate semiconnate semiconnection semiconoidal semiconscious semiconsciously semiconsciousness semiconservative semiconsonant semiconsonantal semiconspicuous semicontinent semicontinuous semicontinuum semicontraction semicontradiction semiconventional semiconventionally semiconvergence semiconvergent semiconversion semiconvert silicon silicone-gel silicone siliconic siliconium siliconize siliconizing silicono silicononane simethicone stereopticon stereoridicon stibiconite synonymicon syodicon technicon tele-iconograph testicond theologiconatural theoricon torticone tricon triconch triconodon triconodont triconodonta triconodontid triconodontive triconodontoid triconodonty triconsonantal triconsonantalism triconsonantic triconsonontal trinopticon turriliticone typicon tyrotoxicon uniconoclastic uniconoclastically uniconstant vicon vicondell viconian vicont vicontiel vicontiels vidicon whimicon icon-9.4.3/ipl/data/conman.sav0000664000175000017500000000160707140713044015472 0ustar chrishchrish? is 1.0 at is 1.0 by is 1.0 cc is 1.e-6 century is 3155760000.0 cm is 0.01 cu-cm is 1.e-6 cu-foot is 0.028316847 cu-ft is 0.028316847 cu-in is 1.6387064e-5 cu-m is 1.0 cu-yd is 0.76455486 day is 86400.0 foot is 0.3048 fp is 0.3048 furlong is 201.168 furlong/fortnight is 0.00016630952 furlongs/fortnight is 0.00016630952 gallon is 0.0037871937 gram is 0.001 hour is 3600.0 inch is 0.0254 ip is 0.0254 iph is 7.0555556e-6 kilogram is 1.0 liter is 0.001 m/ is 1.0 meter is 1.0 mil is 1609.344 mile is 1609.344 minut is 60.0 minute is 60.0 mm is 0.001 mp is 1609.344 mph is 0.44704 of is 1.0 pi is 3.14159 print is 1.0 second is 1.0 sq-ft is 0.09290304 sq-in is 0.00064516 sq-yd is 0.83612736 tablespoon is 1.4793725e-5 tim is 1.0 times is 1.0 vol-of-earth is 1.117416e21 volume-of-the-earth is 1.117416e21 yard is 0.9144 year is 31557600.0 10 mph in furlongs/fortnight volume-of-the-earth in tablespoons icon-9.4.3/ipl/data/pas128.cpt0000664000175000017500000051662607140713044015246 0ustar chrishchrishwidth=128 height=128 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 2 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 3 3 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 4 6 4 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 5 10 10 5 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 6 15 20 15 6 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 7 21 35 35 21 7 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 8 28 56 70 56 28 8 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 9 36 84 126 126 84 36 9 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 10 45 120 210 252 210 120 45 10 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 11 55 165 330 462 462 330 165 55 11 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 12 66 220 495 792 924 792 495 220 66 12 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 13 78 286 715 1287 1716 1716 1287 715 286 78 13 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 14 91 364 1001 2002 3003 3432 3003 2002 1001 364 91 14 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 15 105 455 1365 3003 5005 6435 6435 5005 3003 1365 455 105 15 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 16 120 560 1820 4368 8008 11440 12870 11440 8008 4368 1820 560 120 16 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 17 136 680 2380 6188 12376 19448 24310 24310 19448 12376 6188 2380 680 136 17 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 18 153 816 3060 8568 18564 31824 43758 48620 43758 31824 18564 8568 3060 816 153 18 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 19 171 969 3876 11628 27132 50388 75582 92378 92378 75582 50388 27132 11628 3876 969 171 19 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 20 190 1140 4845 15504 38760 77520 125970 167960 184756 167960 125970 77520 38760 15504 4845 1140 190 20 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 21 210 1330 5985 20349 54264 116280 203490 293930 352716 352716 293930 203490 116280 54264 20349 5985 1330 210 21 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 22 231 1540 7315 26334 74613 170544 319770 497420 646646 705432 646646 497420 319770 170544 74613 26334 7315 1540 231 22 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 23 253 1771 8855 33649 100947 245157 490314 817190 1144066 1352078 1352078 1144066 817190 490314 245157 100947 33649 8855 1771 253 23 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 24 276 2024 10626 42504 134596 346104 735471 1307504 1961256 2496144 2704156 2496144 1961256 1307504 735471 346104 134596 42504 10626 2024 276 24 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 25 300 2300 12650 53130 177100 480700 1081575 2042975 3268760 4457400 5200300 5200300 4457400 3268760 2042975 1081575 480700 177100 53130 12650 2300 300 25 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 26 325 2600 14950 65780 230230 657800 1562275 3124550 5311735 7726160 9657700 10400600 9657700 7726160 5311735 3124550 1562275 657800 230230 65780 14950 2600 325 26 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 27 351 2925 17550 80730 296010 888030 2220075 4686825 8436285 13037895 17383860 20058300 20058300 17383860 13037895 8436285 4686825 2220075 888030 296010 80730 17550 2925 351 27 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 28 378 3276 20475 98280 376740 1184040 3108105 6906900 13123110 21474180 30421755 37442160 40116600 37442160 30421755 21474180 13123110 6906900 3108105 1184040 376740 98280 20475 3276 378 28 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 29 406 3654 23751 118755 475020 1560780 4292145 10015005 20030010 34597290 51895935 67863915 77558760 77558760 67863915 51895935 34597290 20030010 10015005 4292145 1560780 475020 118755 23751 3654 406 29 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 30 435 4060 27405 142506 593775 2035800 5852925 14307150 30045015 54627300 86493225 119759850 145422675 155117520 145422675 119759850 86493225 54627300 30045015 14307150 5852925 2035800 593775 142506 27405 4060 435 30 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 31 465 4495 31465 169911 736281 2629575 7888725 20160075 44352165 84672315 141120525 206253075 265182525 300540195 300540195 265182525 206253075 141120525 84672315 44352165 20160075 7888725 2629575 736281 169911 31465 4495 465 31 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 32 496 4960 35960 201376 906192 3365856 10518300 28048800 64512240 129024480 225792840 347373600 471435600 565722720 601080390 565722720 471435600 347373600 225792840 129024480 64512240 28048800 10518300 3365856 906192 201376 35960 4960 496 32 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 33 528 5456 40920 237336 1107568 4272048 13884156 38567100 92561040 193536720 354817320 573166440 818809200 1037158320 1166803110 1166803110 1037158320 818809200 573166440 354817320 193536720 92561040 38567100 13884156 4272048 1107568 237336 40920 5456 528 33 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 34 561 5984 46376 278256 1344904 5379616 18156204 52451256 131128140 286097760 548354040 927983760 1391975640 1855967520 2203961430 2333606220 2203961430 1855967520 1391975640 927983760 548354040 286097760 131128140 52451256 18156204 5379616 1344904 278256 46376 5984 561 34 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 35 595 6545 52360 324632 1623160 6724520 23535820 70607460 183579396 417225900 834451800 1476337800 2319959400 3247943160 4059928950 4537567650 4537567650 4059928950 3247943160 2319959400 1476337800 834451800 417225900 183579396 70607460 23535820 6724520 1623160 324632 52360 6545 595 35 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 36 630 7140 58905 376992 1947792 8347680 30260340 94143280 254186856 600805296 1251677700 2310789600 3796297200 5567902560 7307872110 8597496600 9075135300 8597496600 7307872110 5567902560 3796297200 2310789600 1251677700 600805296 254186856 94143280 30260340 8347680 1947792 376992 58905 7140 630 36 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 37 666 7770 66045 435897 2324784 10295472 38608020 124403620 348330136 854992152 1852482996 3562467300 6107086800 9364199760 12875774670 15905368710 17672631900 17672631900 15905368710 12875774670 9364199760 6107086800 3562467300 1852482996 854992152 348330136 124403620 38608020 10295472 2324784 435897 66045 7770 666 37 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 38 703 8436 73815 501942 2760681 12620256 48903492 163011640 472733756 1203322288 2707475148 5414950296 9669554100 15471286560 22239974430 28781143380 33578000610 35345263800 33578000610 28781143380 22239974430 15471286560 9669554100 5414950296 2707475148 1203322288 472733756 163011640 48903492 12620256 2760681 501942 73815 8436 703 38 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 39 741 9139 82251 575757 3262623 15380937 61523748 211915132 635745396 1676056044 3910797436 8122425444 15084504396 25140840660 37711260990 51021117810 62359143990 68923264410 68923264410 62359143990 51021117810 37711260990 25140840660 15084504396 8122425444 3910797436 1676056044 635745396 211915132 61523748 15380937 3262623 575757 82251 9139 741 39 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 40 780 9880 91390 658008 3838380 18643560 76904685 273438880 847660528 2311801440 5586853480 12033222880 23206929840 40225345056 62852101650 88732378800 113380261800 131282408400 137846528820 131282408400 113380261800 88732378800 62852101650 40225345056 23206929840 12033222880 5586853480 2311801440 847660528 273438880 76904685 18643560 3838380 658008 91390 9880 780 40 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 41 820 10660 101270 749398 4496388 22481940 95548245 350343565 1121099408 3159461968 7898654920 17620076360 35240152720 63432274896 103077446706 151584480450 202112640600 244662670200 269128937220 269128937220 244662670200 202112640600 151584480450 103077446706 63432274896 35240152720 17620076360 7898654920 3159461968 1121099408 350343565 95548245 22481940 4496388 749398 101270 10660 820 41 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 42 861 11480 111930 850668 5245786 26978328 118030185 445891810 1471442973 4280561376 11058116888 25518731280 52860229080 98672427616 166509721602 254661927156 353697121050 446775310800 513791607420 538257874440 513791607420 446775310800 353697121050 254661927156 166509721602 98672427616 52860229080 25518731280 11058116888 4280561376 1471442973 445891810 118030185 26978328 5245786 850668 111930 11480 861 42 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 43 903 12341 123410 962598 6096454 32224114 145008513 563921995 1917334783 5752004349 15338678264 36576848168 78378960360 151532656696 265182149218 421171648758 608359048206 800472431850 960566918220 1052049481860 1052049481860 960566918220 800472431850 608359048206 421171648758 265182149218 151532656696 78378960360 36576848168 15338678264 5752004349 1917334783 563921995 145008513 32224114 6096454 962598 123410 12341 903 43 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 44 946 13244 135751 1086008 7059052 38320568 177232627 708930508 2481256778 7669339132 21090682613 51915526432 114955808528 229911617056 416714805914 686353797976 1029530696964 1408831480056 1761039350070 2012616400080 2104098963720 2012616400080 1761039350070 1408831480056 1029530696964 686353797976 416714805914 229911617056 114955808528 51915526432 21090682613 7669339132 2481256778 708930508 177232627 38320568 7059052 1086008 135751 13244 946 44 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 45 990 14190 148995 1221759 8145060 45379620 215553195 886163135 3190187286 10150595910 28760021745 73006209045 166871334960 344867425584 646626422970 1103068603890 1715884494940 2438362177020 3169870830126 3773655750150 4116715363800 4116715363800 3773655750150 3169870830126 2438362177020 1715884494940 1103068603890 646626422970 344867425584 166871334960 73006209045 28760021745 10150595910 3190187286 886163135 215553195 45379620 8145060 1221759 148995 14190 990 45 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 46 1035 15180 163185 1370754 9366819 53524680 260932815 1101716330 4076350421 13340783196 38910617655 101766230790 239877544005 511738760544 991493848554 1749695026860 2818953098830 4154246671960 5608233007146 6943526580276 7890371113950 8233430727600 7890371113950 6943526580276 5608233007146 4154246671960 2818953098830 1749695026860 991493848554 511738760544 239877544005 101766230790 38910617655 13340783196 4076350421 1101716330 260932815 53524680 9366819 1370754 163185 15180 1035 46 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 47 1081 16215 178365 1533939 10737573 62891499 314457495 1362649145 5178066751 17417133617 52251400851 140676848445 341643774795 751616304549 1503232609098 2741188875414 4568648125690 6973199770790 9762479679106 12551759587422 14833897694226 16123801841550 16123801841550 14833897694226 12551759587422 9762479679106 6973199770790 4568648125690 2741188875414 1503232609098 751616304549 341643774795 140676848445 52251400851 17417133617 5178066751 1362649145 314457495 62891499 10737573 1533939 178365 16215 1081 47 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 48 1128 17296 194580 1712304 12271512 73629072 377348994 1677106640 6540715896 22595200368 69668534468 192928249296 482320623240 1093260079344 2254848913647 4244421484512 7309837001104 11541847896480 16735679449896 22314239266528 27385657281648 30957699535776 32247603683100 30957699535776 27385657281648 22314239266528 16735679449896 11541847896480 7309837001104 4244421484512 2254848913647 1093260079344 482320623240 192928249296 69668534468 22595200368 6540715896 1677106640 377348994 73629072 12271512 1712304 194580 17296 1128 48 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 49 1176 18424 211876 1906884 13983816 85900584 450978066 2054455634 8217822536 29135916264 92263734836 262596783764 675248872536 1575580702584 3348108992991 6499270398159 11554258485616 18851684897584 28277527346376 39049918716424 49699896548176 58343356817424 63205303218876 63205303218876 58343356817424 49699896548176 39049918716424 28277527346376 18851684897584 11554258485616 6499270398159 3348108992991 1575580702584 675248872536 262596783764 92263734836 29135916264 8217822536 2054455634 450978066 85900584 13983816 1906884 211876 18424 1176 49 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 50 1225 19600 230300 2118760 15890700 99884400 536878650 2505433700 10272278170 37353738800 121399651100 354860518600 937845656300 2250829575120 4923689695575 9847379391150 18053528883775 30405943383200 47129212243960 67327446062800 88749815264600 108043253365600 121548660036300 126410606437752 121548660036300 108043253365600 88749815264600 67327446062800 47129212243960 30405943383200 18053528883775 9847379391150 4923689695575 2250829575120 937845656300 354860518600 121399651100 37353738800 10272278170 2505433700 536878650 99884400 15890700 2118760 230300 19600 1225 50 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 51 1275 20825 249900 2349060 18009460 115775100 636763050 3042312350 12777711870 47626016970 158753389900 476260169700 1292706174900 3188675231420 7174519270695 14771069086725 27900908274925 48459472266975 77535155627160 114456658306760 156077261327400 196793068630200 229591913401900 247959266474052 247959266474052 229591913401900 196793068630200 156077261327400 114456658306760 77535155627160 48459472266975 27900908274925 14771069086725 7174519270695 3188675231420 1292706174900 476260169700 158753389900 47626016970 12777711870 3042312350 636763050 115775100 18009460 2349060 249900 20825 1275 51 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 52 1326 22100 270725 2598960 20358520 133784560 752538150 3679075400 15820024220 60403728840 206379406870 635013559600 1768966344600 4481381406320 10363194502115 21945588357420 42671977361650 76360380541900 125994627894135 191991813933920 270533919634160 352870329957600 426384982032100 477551179875952 495918532948104 477551179875952 426384982032100 352870329957600 270533919634160 191991813933920 125994627894135 76360380541900 42671977361650 21945588357420 10363194502115 4481381406320 1768966344600 635013559600 206379406870 60403728840 15820024220 3679075400 752538150 133784560 20358520 2598960 270725 22100 1326 52 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 53 1378 23426 292825 2869685 22957480 154143080 886322710 4431613550 19499099620 76223753060 266783135710 841392966470 2403979904200 6250347750920 14844575908435 32308782859535 64617565719070 119032357903550 202355008436035 317986441828055 462525733568080 623404249591760 779255311989700 903936161908052 973469712824056 973469712824056 903936161908052 779255311989700 623404249591760 462525733568080 317986441828055 202355008436035 119032357903550 64617565719070 32308782859535 14844575908435 6250347750920 2403979904200 841392966470 266783135710 76223753060 19499099620 4431613550 886322710 154143080 22957480 2869685 292825 23426 1378 53 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 54 1431 24804 316251 3162510 25827165 177100560 1040465790 5317936260 23930713170 95722852680 343006888770 1108176102180 3245372870670 8654327655120 21094923659355 47153358767970 96926348578605 183649923622620 321387366339585 520341450264090 780512175396135 1085929983159840 1402659561581460 1683191473897752 1877405874732108 1946939425648112 1877405874732108 1683191473897752 1402659561581460 1085929983159840 780512175396135 520341450264090 321387366339585 183649923622620 96926348578605 47153358767970 21094923659355 8654327655120 3245372870670 1108176102180 343006888770 95722852680 23930713170 5317936260 1040465790 177100560 25827165 3162510 316251 24804 1431 54 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 55 1485 26235 341055 3478761 28989675 202927725 1217566350 6358402050 29248649430 119653565850 438729741450 1451182990950 4353548972850 11899700525790 29749251314475 68248282427325 144079707346575 280576272201225 505037289962205 841728816603675 1300853625660225 1866442158555975 2488589544741300 3085851035479212 3560597348629860 3824345300380220 3824345300380220 3560597348629860 3085851035479212 2488589544741300 1866442158555975 1300853625660225 841728816603675 505037289962205 280576272201225 144079707346575 68248282427325 29749251314475 11899700525790 4353548972850 1451182990950 438729741450 119653565850 29248649430 6358402050 1217566350 202927725 28989675 3478761 341055 26235 1485 55 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 56 1540 27720 367290 3819816 32468436 231917400 1420494075 7575968400 35607051480 148902215280 558383307300 1889912732400 5804731963800 16253249498640 41648951840265 97997533741800 212327989773900 424655979547800 785613562163430 1346766106565880 2142582442263900 3167295784216200 4355031703297275 5574440580220512 6646448384109072 7384942649010080 7648690600760440 7384942649010080 6646448384109072 5574440580220512 4355031703297275 3167295784216200 2142582442263900 1346766106565880 785613562163430 424655979547800 212327989773900 97997533741800 41648951840265 16253249498640 5804731963800 1889912732400 558383307300 148902215280 35607051480 7575968400 1420494075 231917400 32468436 3819816 367290 27720 1540 56 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 57 1596 29260 395010 4187106 36288252 264385836 1652411475 8996462475 43183019880 184509266760 707285522580 2448296039700 7694644696200 22057981462440 57902201338905 139646485582065 310325523515700 636983969321700 1210269541711230 2132379668729310 3489348548829780 5309878226480100 7522327487513475 9929472283517787 12220888964329584 14031391033119152 15033633249770520 15033633249770520 14031391033119152 12220888964329584 9929472283517787 7522327487513475 5309878226480100 3489348548829780 2132379668729310 1210269541711230 636983969321700 310325523515700 139646485582065 57902201338905 22057981462440 7694644696200 2448296039700 707285522580 184509266760 43183019880 8996462475 1652411475 264385836 36288252 4187106 395010 29260 1596 57 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 58 1653 30856 424270 4582116 40475358 300674088 1916797311 10648873950 52179482355 227692286640 891794789340 3155581562280 10142940735900 29752626158640 79960182801345 197548686920970 449972009097765 947309492837400 1847253511032930 3342649210440540 5621728217559090 8799226775309880 12832205713993575 17451799771031262 22150361247847371 26252279997448736 29065024282889672 30067266499541040 29065024282889672 26252279997448736 22150361247847371 17451799771031262 12832205713993575 8799226775309880 5621728217559090 3342649210440540 1847253511032930 947309492837400 449972009097765 197548686920970 79960182801345 29752626158640 10142940735900 3155581562280 891794789340 227692286640 52179482355 10648873950 1916797311 300674088 40475358 4582116 424270 30856 1653 58 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 59 1711 32509 455126 5006386 45057474 341149446 2217471399 12565671261 62828356305 279871768995 1119487075980 4047376351620 13298522298180 39895566894540 109712808959985 277508869722315 647520696018735 1397281501935165 2794563003870330 5189902721473470 8964377427999630 14420954992868970 21631432489303455 30284005485024837 39602161018878633 48402641245296107 55317304280338408 59132290782430712 59132290782430712 55317304280338408 48402641245296107 39602161018878633 30284005485024837 21631432489303455 14420954992868970 8964377427999630 5189902721473470 2794563003870330 1397281501935165 647520696018735 277508869722315 109712808959985 39895566894540 13298522298180 4047376351620 1119487075980 279871768995 62828356305 12565671261 2217471399 341149446 45057474 5006386 455126 32509 1711 59 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 60 1770 34220 487635 5461512 50063860 386206920 2558620845 14783142660 75394027566 342700125300 1399358844975 5166863427600 17345898649800 53194089192720 149608375854525 387221678682300 925029565741050 2044802197953900 4191844505805495 7984465725343800 14154280149473100 23385332420868600 36052387482172425 51915437974328292 69886166503903470 88004802264174740 103719945525634515 114449595062769120 118264581564861424 114449595062769120 103719945525634515 88004802264174740 69886166503903470 51915437974328292 36052387482172425 23385332420868600 14154280149473100 7984465725343800 4191844505805495 2044802197953900 925029565741050 387221678682300 149608375854525 53194089192720 17345898649800 5166863427600 1399358844975 342700125300 75394027566 14783142660 2558620845 386206920 50063860 5461512 487635 34220 1770 60 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 61 1830 35990 521855 5949147 55525372 436270780 2944827765 17341763505 90177170226 418094152866 1742058970275 6566222272575 22512762077400 70539987842520 202802465047245 536830054536825 1312251244423350 2969831763694950 6236646703759395 12176310231149295 22138745874816900 37539612570341700 59437719903041025 87967825456500717 121801604478231762 157890968768078210 191724747789809255 218169540588403635 232714176627630544 232714176627630544 218169540588403635 191724747789809255 157890968768078210 121801604478231762 87967825456500717 59437719903041025 37539612570341700 22138745874816900 12176310231149295 6236646703759395 2969831763694950 1312251244423350 536830054536825 202802465047245 70539987842520 22512762077400 6566222272575 1742058970275 418094152866 90177170226 17341763505 2944827765 436270780 55525372 5949147 521855 35990 1830 61 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 62 1891 37820 557845 6471002 61474519 491796152 3381098545 20286591270 107518933731 508271323092 2160153123141 8308281242850 29078984349975 93052749919920 273342452889765 739632519584070 1849081298960175 4282083008118300 9206478467454345 18412956934908690 34315056105966195 59678358445158600 96977332473382725 147405545359541742 209769429934732479 279692573246309972 349615716557887465 409894288378212890 450883717216034179 465428353255261088 450883717216034179 409894288378212890 349615716557887465 279692573246309972 209769429934732479 147405545359541742 96977332473382725 59678358445158600 34315056105966195 18412956934908690 9206478467454345 4282083008118300 1849081298960175 739632519584070 273342452889765 93052749919920 29078984349975 8308281242850 2160153123141 508271323092 107518933731 20286591270 3381098545 491796152 61474519 6471002 557845 37820 1891 62 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 63 1953 39711 595665 7028847 67945521 553270671 3872894697 23667689815 127805525001 615790256823 2668424446233 10468434365991 37387265592825 122131734269895 366395202809685 1012974972473835 2588713818544245 6131164307078475 13488561475572645 27619435402363035 52728013040874885 93993414551124795 156655690918541325 244382877832924467 357174975294274221 489462003181042451 629308289804197437 759510004936100355 860778005594247069 916312070471295267 916312070471295267 860778005594247069 759510004936100355 629308289804197437 489462003181042451 357174975294274221 244382877832924467 156655690918541325 93993414551124795 52728013040874885 27619435402363035 13488561475572645 6131164307078475 2588713818544245 1012974972473835 366395202809685 122131734269895 37387265592825 10468434365991 2668424446233 615790256823 127805525001 23667689815 3872894697 553270671 67945521 7028847 595665 39711 1953 63 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 64 2016 41664 635376 7624512 74974368 621216192 4426165368 27540584512 151473214816 743595781824 3284214703056 13136858812224 47855699958816 159518999862720 488526937079580 1379370175283520 3601688791018080 8719878125622720 19619725782651120 41107996877935680 80347448443237920 146721427591999680 250649105469666120 401038568751465792 601557853127198688 846636978475316672 1118770292985239888 1388818294740297792 1620288010530347424 1777090076065542336 1832624140942590534 1777090076065542336 1620288010530347424 1388818294740297792 1118770292985239888 846636978475316672 601557853127198688 401038568751465792 250649105469666120 146721427591999680 80347448443237920 41107996877935680 19619725782651120 8719878125622720 3601688791018080 1379370175283520 488526937079580 159518999862720 47855699958816 13136858812224 3284214703056 743595781824 151473214816 27540584512 4426165368 621216192 74974368 7624512 635376 41664 2016 64 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 65 2080 43680 677040 8259888 82598880 696190560 5047381560 31966749880 179013799328 895068996640 4027810484880 16421073515280 60992558771040 207374699821536 648045936942300 1867897112363100 4981058966301600 12321566916640800 28339603908273840 60727722660586800 121455445321173600 227068876035237600 397370533061665800 651687674221131912 1002596421878664480 1448194831602515360 1965407271460556560 2507588587725537680 3009106305270645216 3397378086595889760 3609714217008132870 3609714217008132870 3397378086595889760 3009106305270645216 2507588587725537680 1965407271460556560 1448194831602515360 1002596421878664480 651687674221131912 397370533061665800 227068876035237600 121455445321173600 60727722660586800 28339603908273840 12321566916640800 4981058966301600 1867897112363100 648045936942300 207374699821536 60992558771040 16421073515280 4027810484880 895068996640 179013799328 31966749880 5047381560 696190560 82598880 8259888 677040 43680 2080 65 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 66 2145 45760 720720 8936928 90858768 778789440 5743572120 37014131440 210980549208 1074082795968 4922879481520 20448884000160 77413632286320 268367258592576 855420636763836 2515943049305400 6848956078664700 17302625882942400 40661170824914640 89067326568860640 182183167981760400 348524321356411200 624439409096903400 1049058207282797712 1654284096099796392 2450791253481179840 3413602103063071920 4472995859186094240 5516694892996182896 6406484391866534976 7007092303604022630 7219428434016265740 7007092303604022630 6406484391866534976 5516694892996182896 4472995859186094240 3413602103063071920 2450791253481179840 1654284096099796392 1049058207282797712 624439409096903400 348524321356411200 182183167981760400 89067326568860640 40661170824914640 17302625882942400 6848956078664700 2515943049305400 855420636763836 268367258592576 77413632286320 20448884000160 4922879481520 1074082795968 210980549208 37014131440 5743572120 778789440 90858768 8936928 720720 45760 2145 66 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 67 2211 47905 766480 9657648 99795696 869648208 6522361560 42757703560 247994680648 1285063345176 5996962277488 25371763481680 97862516286480 345780890878896 1123787895356412 3371363686069236 9364899127970100 24151581961607100 57963796707857040 129728497393775280 271250494550621040 530707489338171600 972963730453314600 1673497616379701112 2703342303382594104 4105075349580976232 5864393356544251760 7886597962249166160 9989690752182277136 11923179284862717872 13413576695470557606 14226520737620288370 14226520737620288370 13413576695470557606 11923179284862717872 9989690752182277136 7886597962249166160 5864393356544251760 4105075349580976232 2703342303382594104 1673497616379701112 972963730453314600 530707489338171600 271250494550621040 129728497393775280 57963796707857040 24151581961607100 9364899127970100 3371363686069236 1123787895356412 345780890878896 97862516286480 25371763481680 5996962277488 1285063345176 247994680648 42757703560 6522361560 869648208 99795696 9657648 766480 47905 2211 67 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 68 2278 50116 814385 10424128 109453344 969443904 7392009768 49280065120 290752384208 1533058025824 7282025622664 31368725759168 123234279768160 443643407165376 1469568786235308 4495151581425648 12736262814039336 33516481089577200 82115378669464140 187692294101632320 400978991944396320 801957983888792640 1503671219791486200 2646461346833015712 4376839919762295216 6808417652963570336 9969468706125227992 13750991318793417920 17876288714431443296 21912870037044995008 25336755980333275478 27640097433090845976 28453041475240576740 27640097433090845976 25336755980333275478 21912870037044995008 17876288714431443296 13750991318793417920 9969468706125227992 6808417652963570336 4376839919762295216 2646461346833015712 1503671219791486200 801957983888792640 400978991944396320 187692294101632320 82115378669464140 33516481089577200 12736262814039336 4495151581425648 1469568786235308 443643407165376 123234279768160 31368725759168 7282025622664 1533058025824 290752384208 49280065120 7392009768 969443904 109453344 10424128 814385 50116 2278 68 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 69 2346 52394 864501 11238513 119877472 1078897248 8361453672 56672074888 340032449328 1823810410032 8815083648488 38650751381832 154603005527328 566877686933536 1913212193400684 5964720367660956 17231414395464984 46252743903616536 115631859759041340 269807672771096460 588671286046028640 1202936975833188960 2305629203680278840 4150132566624501912 7023301266595310928 11185257572725865552 16777886359088798328 23720460024918645912 31627280033224861216 39789158751476438304 47249626017378270486 52976853413424121454 56093138908331422716 56093138908331422716 52976853413424121454 47249626017378270486 39789158751476438304 31627280033224861216 23720460024918645912 16777886359088798328 11185257572725865552 7023301266595310928 4150132566624501912 2305629203680278840 1202936975833188960 588671286046028640 269807672771096460 115631859759041340 46252743903616536 17231414395464984 5964720367660956 1913212193400684 566877686933536 154603005527328 38650751381832 8815083648488 1823810410032 340032449328 56672074888 8361453672 1078897248 119877472 11238513 864501 52394 2346 69 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 70 2415 54740 916895 12103014 131115985 1198774720 9440350920 65033528560 396704524216 2163842859360 10638894058520 47465835030320 193253756909160 721480692460864 2480089880334220 7877932561061640 23196134763125940 63484158299081520 161884603662657876 385439532530137800 858478958817125100 1791608261879217600 3508566179513467800 6455761770304780752 11173433833219812840 18208558839321176480 27963143931814663880 40498346384007444240 55347740058143507128 71416438784701299520 87038784768854708790 100226479430802391940 109069992321755544170 112186277816662845432 109069992321755544170 100226479430802391940 87038784768854708790 71416438784701299520 55347740058143507128 40498346384007444240 27963143931814663880 18208558839321176480 11173433833219812840 6455761770304780752 3508566179513467800 1791608261879217600 858478958817125100 385439532530137800 161884603662657876 63484158299081520 23196134763125940 7877932561061640 2480089880334220 721480692460864 193253756909160 47465835030320 10638894058520 2163842859360 396704524216 65033528560 9440350920 1198774720 131115985 12103014 916895 54740 2415 70 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 71 2485 57155 971635 13019909 143218999 1329890705 10639125640 74473879480 461738052776 2560547383576 12802736917880 58104729088840 240719591939480 914734449370024 3201570572795084 10358022441395860 31074067324187580 86680293062207460 225368761961739396 547324136192795676 1243918491347262900 2650087220696342700 5300174441392685400 9964327949818248552 17629195603524593592 29381992672540989320 46171702771135840360 68461490315822108120 95846086442150951368 126764178842844806648 158455223553556008310 187265264199657100730 209296471752557936110 221256270138418389602 221256270138418389602 209296471752557936110 187265264199657100730 158455223553556008310 126764178842844806648 95846086442150951368 68461490315822108120 46171702771135840360 29381992672540989320 17629195603524593592 9964327949818248552 5300174441392685400 2650087220696342700 1243918491347262900 547324136192795676 225368761961739396 86680293062207460 31074067324187580 10358022441395860 3201570572795084 914734449370024 240719591939480 58104729088840 12802736917880 2560547383576 461738052776 74473879480 10639125640 1329890705 143218999 13019909 971635 57155 2485 71 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 72 2556 59640 1028790 13991544 156238908 1473109704 11969016345 85113005120 536211932256 3022285436352 15363284301456 70907466006720 298824321028320 1155454041309504 4116305022165108 13559593014190944 41432089765583440 117754360386395040 312049055023946856 772692898154535072 1791242627540058576 3894005712043605600 7950261662089028100 15264502391210933952 27593523553342842144 47011188276065582912 75553695443676829680 114633193086957948480 164307576757973059488 222610265284995758016 285219402396400814958 345720487753213109040 396561735952215036840 430552741890976325712 442512540276836779204 430552741890976325712 396561735952215036840 345720487753213109040 285219402396400814958 222610265284995758016 164307576757973059488 114633193086957948480 75553695443676829680 47011188276065582912 27593523553342842144 15264502391210933952 7950261662089028100 3894005712043605600 1791242627540058576 772692898154535072 312049055023946856 117754360386395040 41432089765583440 13559593014190944 4116305022165108 1155454041309504 298824321028320 70907466006720 15363284301456 3022285436352 536211932256 85113005120 11969016345 1473109704 156238908 13991544 1028790 59640 2556 72 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 73 2628 62196 1088430 15020334 170230452 1629348612 13442126049 97082021465 621324937376 3558497368608 18385569737808 86270750308176 369731787035040 1454278362337824 5271759063474612 17675898036356052 54991682779774384 159186450151978480 429803415410341896 1084741953178481928 2563935525694593648 5685248339583664176 11844267374132633700 23214764053299962052 42858025944553776096 74604711829408425056 122564883719742412592 190186888530634778160 278940769844931007968 386917842042968817504 507829667681396572974 630939890149613923998 742282223705428145880 827114477843191362552 873065282167813104916 873065282167813104916 827114477843191362552 742282223705428145880 630939890149613923998 507829667681396572974 386917842042968817504 278940769844931007968 190186888530634778160 122564883719742412592 74604711829408425056 42858025944553776096 23214764053299962052 11844267374132633700 5685248339583664176 2563935525694593648 1084741953178481928 429803415410341896 159186450151978480 54991682779774384 17675898036356052 5271759063474612 1454278362337824 369731787035040 86270750308176 18385569737808 3558497368608 621324937376 97082021465 13442126049 1629348612 170230452 15020334 1088430 62196 2628 73 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 74 2701 64824 1150626 16108764 185250786 1799579064 15071474661 110524147514 718406958841 4179822305984 21944067106416 104656320045984 456002537343216 1824010149372864 6726037425812436 22947657099830664 72667580816130436 214178132931752864 588989865562320376 1514545368588823824 3648677478873075576 8249183865278257824 17529515713716297876 35059031427432595752 66072789997853738148 117462737773962201152 197169595549150837648 312751772250377190752 469127658375565786128 665858611887899825472 894747509724365390478 1138769557831010496972 1373222113855042069878 1569396701548619508432 1700179760011004467468 1746130564335626209832 1700179760011004467468 1569396701548619508432 1373222113855042069878 1138769557831010496972 894747509724365390478 665858611887899825472 469127658375565786128 312751772250377190752 197169595549150837648 117462737773962201152 66072789997853738148 35059031427432595752 17529515713716297876 8249183865278257824 3648677478873075576 1514545368588823824 588989865562320376 214178132931752864 72667580816130436 22947657099830664 6726037425812436 1824010149372864 456002537343216 104656320045984 21944067106416 4179822305984 718406958841 110524147514 15071474661 1799579064 185250786 16108764 1150626 64824 2701 74 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 75 2775 67525 1215450 17259390 201359550 1984829850 16871053725 125595622175 828931106355 4898229264825 26123889412400 126600387152400 560658857389200 2280012686716080 8550047575185300 29673694525643100 95615237915961100 286845713747883300 803167998494073240 2103535234151144200 5163222847461899400 11897861344151333400 25778699578994555700 52588547141148893628 101131821425286333900 183535527771815939300 314632333323113038800 509921367799528028400 781879430625942976880 1134986270263465611600 1560606121612265215950 2033517067555375887450 2511991671686052566850 2942618815403661578310 3269576461559623975900 3446310324346630677300 3446310324346630677300 3269576461559623975900 2942618815403661578310 2511991671686052566850 2033517067555375887450 1560606121612265215950 1134986270263465611600 781879430625942976880 509921367799528028400 314632333323113038800 183535527771815939300 101131821425286333900 52588547141148893628 25778699578994555700 11897861344151333400 5163222847461899400 2103535234151144200 803167998494073240 286845713747883300 95615237915961100 29673694525643100 8550047575185300 2280012686716080 560658857389200 126600387152400 26123889412400 4898229264825 828931106355 125595622175 16871053725 1984829850 201359550 17259390 1215450 67525 2775 75 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 76 2850 70300 1282975 18474840 218618940 2186189400 18855883575 142466675900 954526728530 5727160371180 31022118677225 152724276564800 687259244541600 2840671544105280 10830060261901380 38223742100828400 125288932441604200 382460951663844400 1090013712241956540 2906703232645217440 7266758081613043600 17061084191613232800 37676560923145889100 78367246720143449328 153720368566435227528 284667349197102273200 498167861094928978100 824553701122641067200 1291800798425471005280 1916865700889408588480 2695592391875730827550 3594123189167641103400 4545508739241428454300 5454610487089714145160 6212195276963285554210 6715886785906254653200 6892620648693261354600 6715886785906254653200 6212195276963285554210 5454610487089714145160 4545508739241428454300 3594123189167641103400 2695592391875730827550 1916865700889408588480 1291800798425471005280 824553701122641067200 498167861094928978100 284667349197102273200 153720368566435227528 78367246720143449328 37676560923145889100 17061084191613232800 7266758081613043600 2906703232645217440 1090013712241956540 382460951663844400 125288932441604200 38223742100828400 10830060261901380 2840671544105280 687259244541600 152724276564800 31022118677225 5727160371180 954526728530 142466675900 18855883575 2186189400 218618940 18474840 1282975 70300 2850 76 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 77 2926 73150 1353275 19757815 237093780 2404808340 21042072975 161322559475 1096993404430 6681687099710 36749279048405 183746395242025 839983521106400 3527930788646880 13670731806006660 49053802362729780 163512674542432600 507749884105448600 1472474663905800940 3996716944887173980 10173461314258261040 24327842273226276400 54737645114759121900 116043807643289338428 232087615286578676856 438387717763537500728 782835210292031251300 1322721562217570045300 2116354499548112072480 3208666499314879593760 4612458092765139416030 6289715581043371930950 8139631928409069557700 10000119226331142599460 11666805764052999699370 12928082062869540207410 13608507434599516007800 13608507434599516007800 12928082062869540207410 11666805764052999699370 10000119226331142599460 8139631928409069557700 6289715581043371930950 4612458092765139416030 3208666499314879593760 2116354499548112072480 1322721562217570045300 782835210292031251300 438387717763537500728 232087615286578676856 116043807643289338428 54737645114759121900 24327842273226276400 10173461314258261040 3996716944887173980 1472474663905800940 507749884105448600 163512674542432600 49053802362729780 13670731806006660 3527930788646880 839983521106400 183746395242025 36749279048405 6681687099710 1096993404430 161322559475 21042072975 2404808340 237093780 19757815 1353275 73150 2926 77 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 78 3003 76076 1426425 21111090 256851595 2641902120 23446881315 182364632450 1258315963905 7778680504140 43430966148115 220495674290430 1023729916348425 4367914309753280 17198662594653540 62724534168736440 212566476905162380 671262558647881200 1980224548011249540 5469191608792974920 14170178259145435020 34501303587484537440 79065487387985398300 170781452758048460328 348131422929868015284 670475333050116177584 1221222928055568752028 2105556772509601296600 3439076061765682117780 5325020998862991666240 7821124592080019009790 10902173673808511346980 14429347509452441488650 18139751154740212157160 21666924990384142298830 24594887826922539906780 26536589497469056215210 27217014869199032015600 26536589497469056215210 24594887826922539906780 21666924990384142298830 18139751154740212157160 14429347509452441488650 10902173673808511346980 7821124592080019009790 5325020998862991666240 3439076061765682117780 2105556772509601296600 1221222928055568752028 670475333050116177584 348131422929868015284 170781452758048460328 79065487387985398300 34501303587484537440 14170178259145435020 5469191608792974920 1980224548011249540 671262558647881200 212566476905162380 62724534168736440 17198662594653540 4367914309753280 1023729916348425 220495674290430 43430966148115 7778680504140 1258315963905 182364632450 23446881315 2641902120 256851595 21111090 1426425 76076 3003 78 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 79 3081 79079 1502501 22537515 277962685 2898753715 26088783435 205811513765 1440680596355 9036996468045 51209646652255 263926640438545 1244225590638855 5391644226101705 21566576904406820 79923196763389980 275291011073898820 883829035553043580 2651487106659130740 7449416156804224460 19639369867938409940 48671481846629972460 113566790975469935740 249846940146033858628 518912875687916475612 1018606755979984192868 1891698261105684929612 3326779700565170048628 5544632834275283414380 8764097060628673784020 13146145590943010676030 18723298265888530356770 25331521183260952835630 32569098664192653645810 39806676145124354455990 46261812817306682205610 51131477324391596121990 53753604366668088230810 53753604366668088230810 51131477324391596121990 46261812817306682205610 39806676145124354455990 32569098664192653645810 25331521183260952835630 18723298265888530356770 13146145590943010676030 8764097060628673784020 5544632834275283414380 3326779700565170048628 1891698261105684929612 1018606755979984192868 518912875687916475612 249846940146033858628 113566790975469935740 48671481846629972460 19639369867938409940 7449416156804224460 2651487106659130740 883829035553043580 275291011073898820 79923196763389980 21566576904406820 5391644226101705 1244225590638855 263926640438545 51209646652255 9036996468045 1440680596355 205811513765 26088783435 2898753715 277962685 22537515 1502501 79079 3081 79 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 80 3160 82160 1581580 24040016 300500200 3176716400 28987537150 231900297200 1646492110120 10477677064400 60246643120300 315136287090800 1508152231077400 6635869816740560 26958221130508525 101489773667796800 355214207837288800 1159120046626942400 3535316142212174320 10100903263463355200 27088786024742634400 68310851714568382400 162238272822099908200 363413731121503794368 768759815833950334240 1537519631667900668480 2910305017085669122480 5218477961670854978240 8871412534840453463008 14308729894903957198400 21910242651571684460050 31869443856831541032800 44054819449149483192400 57900619847453606481440 72375774809317008101800 86068488962431036661600 97393290141698278327600 104885081691059684352800 107507208733336176461620 104885081691059684352800 97393290141698278327600 86068488962431036661600 72375774809317008101800 57900619847453606481440 44054819449149483192400 31869443856831541032800 21910242651571684460050 14308729894903957198400 8871412534840453463008 5218477961670854978240 2910305017085669122480 1537519631667900668480 768759815833950334240 363413731121503794368 162238272822099908200 68310851714568382400 27088786024742634400 10100903263463355200 3535316142212174320 1159120046626942400 355214207837288800 101489773667796800 26958221130508525 6635869816740560 1508152231077400 315136287090800 60246643120300 10477677064400 1646492110120 231900297200 28987537150 3176716400 300500200 24040016 1581580 82160 3160 80 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 81 3240 85320 1663740 25621596 324540216 3477216600 32164253550 260887834350 1878392407320 12124169174520 70724320184700 375382930211100 1823288518168200 8144022047817960 33594090947249085 128447994798305325 456703981505085600 1514334254464231200 4694436188839116720 13636219405675529520 37189689288205989600 95399637739311016800 230549124536668290600 525652003943603702568 1132173546955454128608 2306279447501851002720 4447824648753569790960 8128782978756524100720 14089890496511308441248 23180142429744410661408 36218972546475641658450 53779686508403225492850 75924263305981024225200 101955439296603089673840 130276394656770614583240 158444263771748044763400 183461779104129314989200 202278371832757962680400 212392290424395860814420 212392290424395860814420 202278371832757962680400 183461779104129314989200 158444263771748044763400 130276394656770614583240 101955439296603089673840 75924263305981024225200 53779686508403225492850 36218972546475641658450 23180142429744410661408 14089890496511308441248 8128782978756524100720 4447824648753569790960 2306279447501851002720 1132173546955454128608 525652003943603702568 230549124536668290600 95399637739311016800 37189689288205989600 13636219405675529520 4694436188839116720 1514334254464231200 456703981505085600 128447994798305325 33594090947249085 8144022047817960 1823288518168200 375382930211100 70724320184700 12124169174520 1878392407320 260887834350 32164253550 3477216600 324540216 25621596 1663740 85320 3240 81 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 82 3321 88560 1749060 27285336 350161812 3801756816 35641470150 293052087900 2139280241670 14002561581840 82848489359220 446107250395800 2198671448379300 9967310565986160 41738112995067045 162042085745554410 585151976303390925 1971038235969316800 6208770443303347920 18330655594514646240 50825908693881519120 132589327027517006400 325948762275979307400 756201128480271993168 1657825550899057831176 3438452994457305131328 6754104096255420793680 12576607627510093891680 22218673475267832541968 37270032926255719102656 59399114976220052319858 89998659054878867151300 129703949814384249718050 177879702602584113899040 232231833953373704257080 288720658428518659346640 341906042875877359752600 385740150936887277669600 414670662257153823494820 424784580848791721628840 414670662257153823494820 385740150936887277669600 341906042875877359752600 288720658428518659346640 232231833953373704257080 177879702602584113899040 129703949814384249718050 89998659054878867151300 59399114976220052319858 37270032926255719102656 22218673475267832541968 12576607627510093891680 6754104096255420793680 3438452994457305131328 1657825550899057831176 756201128480271993168 325948762275979307400 132589327027517006400 50825908693881519120 18330655594514646240 6208770443303347920 1971038235969316800 585151976303390925 162042085745554410 41738112995067045 9967310565986160 2198671448379300 446107250395800 82848489359220 14002561581840 2139280241670 293052087900 35641470150 3801756816 350161812 27285336 1749060 88560 3321 82 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 83 3403 91881 1837620 29034396 377447148 4151918628 39443226966 328693558050 2432332329570 16141841823510 96851050941060 528955739755020 2644778698775100 12165982014365460 51705423561053205 203780198740621455 747194062048945335 2556190212272707725 8179808679272664720 24539426037817994160 69156564288396165360 183415235721398525520 458538089303496313800 1082149890756251300568 2414026679379329824344 5096278545356362962504 10192557090712725925008 19330711723765514685360 34795281102777926433648 59488706401523551644624 96669147902475771422514 149397774031098919471158 219702608869263116869350 307583652416968363617090 410111536555957818156120 520952492381892363603720 630626701304396019099240 727646193812764637422200 800410813194041101164420 839455243105945545123660 839455243105945545123660 800410813194041101164420 727646193812764637422200 630626701304396019099240 520952492381892363603720 410111536555957818156120 307583652416968363617090 219702608869263116869350 149397774031098919471158 96669147902475771422514 59488706401523551644624 34795281102777926433648 19330711723765514685360 10192557090712725925008 5096278545356362962504 2414026679379329824344 1082149890756251300568 458538089303496313800 183415235721398525520 69156564288396165360 24539426037817994160 8179808679272664720 2556190212272707725 747194062048945335 203780198740621455 51705423561053205 12165982014365460 2644778698775100 528955739755020 96851050941060 16141841823510 2432332329570 328693558050 39443226966 4151918628 377447148 29034396 1837620 91881 3403 83 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 84 3486 95284 1929501 30872016 406481544 4529365776 43595145594 368136785016 2761025887620 18574174153080 112992892764570 625806790696080 3173734438530120 14810760713140560 63871405575418665 255485622301674660 950974260789566790 3303384274321653060 10735998891545372445 32719234717090658880 93695990326214159520 252571800009794690880 641953325024894839320 1540687980059747614368 3496176570135581124912 7510305224735692786848 15288835636069088887512 29523268814478240610368 54125992826543441119008 94283987504301478078272 156157854303999323067138 246066921933574690893672 369100382900362036340508 527286261286231480486440 717695188972926181773210 931064028937850181759840 1151579193686288382702960 1358272895117160656521440 1528057007006805738586620 1639866056299986646288080 1678910486211891090247320 1639866056299986646288080 1528057007006805738586620 1358272895117160656521440 1151579193686288382702960 931064028937850181759840 717695188972926181773210 527286261286231480486440 369100382900362036340508 246066921933574690893672 156157854303999323067138 94283987504301478078272 54125992826543441119008 29523268814478240610368 15288835636069088887512 7510305224735692786848 3496176570135581124912 1540687980059747614368 641953325024894839320 252571800009794690880 93695990326214159520 32719234717090658880 10735998891545372445 3303384274321653060 950974260789566790 255485622301674660 63871405575418665 14810760713140560 3173734438530120 625806790696080 112992892764570 18574174153080 2761025887620 368136785016 43595145594 4529365776 406481544 30872016 1929501 95284 3486 84 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 85 3570 98770 2024785 32801517 437353560 4935847320 48124511370 411731930610 3129162672636 21335200040700 131567066917650 738799683460650 3799541229226200 17984495151670680 78682166288559225 319357027877093325 1206459883091241450 4254358535111219850 14039383165867025505 43455233608636031325 126415225043304818400 346267790336008850400 894525125034689530200 2182641305084642453688 5036864550195328739280 11006481794871273911760 22799140860804781674360 44812104450547329497880 83649261641021681729376 148409980330844919197280 250441841808300801145410 402224776237574013960810 615167304833936727234180 896386644186593516826948 1244981450259157662259650 1648759217910776363533050 2082643222624138564462800 2509852088803449039224400 2886329902123966395108060 3167923063306792384874700 3318776542511877736535400 3318776542511877736535400 3167923063306792384874700 2886329902123966395108060 2509852088803449039224400 2082643222624138564462800 1648759217910776363533050 1244981450259157662259650 896386644186593516826948 615167304833936727234180 402224776237574013960810 250441841808300801145410 148409980330844919197280 83649261641021681729376 44812104450547329497880 22799140860804781674360 11006481794871273911760 5036864550195328739280 2182641305084642453688 894525125034689530200 346267790336008850400 126415225043304818400 43455233608636031325 14039383165867025505 4254358535111219850 1206459883091241450 319357027877093325 78682166288559225 17984495151670680 3799541229226200 738799683460650 131567066917650 21335200040700 3129162672636 411731930610 48124511370 4935847320 437353560 32801517 2024785 98770 3570 85 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 86 3655 102340 2123555 34826302 470155077 5373200880 53060358690 459856441980 3540894603246 24464362713336 152902266958350 870366750378300 4538340912686850 21784036380896880 96666661440229905 398039194165652550 1525816910968334775 5460818418202461300 18293741700978245355 57494616774503056830 169870458651940849725 472683015379313668800 1240792915370698380600 3077166430119331983888 7219505855279971192968 16043346345066602651040 33805622655676055586120 67611245311352111172240 128461366091569011227256 232059241971866600926656 398851822139145720342690 652666618045874815106220 1017392081071510741194990 1511553949020530244061128 2141368094445751179086598 2893740668169934025792700 3731402440534914927995850 4592495311427587603687200 5396181990927415434332460 6054252965430758779982760 6486699605818670121410100 6637553085023755473070800 6486699605818670121410100 6054252965430758779982760 5396181990927415434332460 4592495311427587603687200 3731402440534914927995850 2893740668169934025792700 2141368094445751179086598 1511553949020530244061128 1017392081071510741194990 652666618045874815106220 398851822139145720342690 232059241971866600926656 128461366091569011227256 67611245311352111172240 33805622655676055586120 16043346345066602651040 7219505855279971192968 3077166430119331983888 1240792915370698380600 472683015379313668800 169870458651940849725 57494616774503056830 18293741700978245355 5460818418202461300 1525816910968334775 398039194165652550 96666661440229905 21784036380896880 4538340912686850 870366750378300 152902266958350 24464362713336 3540894603246 459856441980 53060358690 5373200880 470155077 34826302 2123555 102340 3655 86 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 87 3741 105995 2225895 36949857 504981379 5843355957 58433559570 512916800670 4000751045226 28005257316582 177366629671686 1023269017336650 5408707663065150 26322377293583730 118450697821126785 494705855605882455 1923856105133987325 6986635329170796075 23754560119180706655 75788358475481302185 227365075426443906555 642553474031254518525 1713475930750012049400 4317959345490030364488 10296672285399303176856 23262852200346573844008 49848969000742658237160 101416867967028166758360 196072611402921122399496 360520608063435612153912 630911064111012321269346 1051518440185020535448910 1670058699117385556301210 2528946030092040985256118 3652922043466281423147726 5035108762615685204879298 6625143108704848953788550 8323897751962502531683050 9988677302355003038019660 11450434956358174214315220 12540952571249428901392860 13124252690842425594480900 13124252690842425594480900 12540952571249428901392860 11450434956358174214315220 9988677302355003038019660 8323897751962502531683050 6625143108704848953788550 5035108762615685204879298 3652922043466281423147726 2528946030092040985256118 1670058699117385556301210 1051518440185020535448910 630911064111012321269346 360520608063435612153912 196072611402921122399496 101416867967028166758360 49848969000742658237160 23262852200346573844008 10296672285399303176856 4317959345490030364488 1713475930750012049400 642553474031254518525 227365075426443906555 75788358475481302185 23754560119180706655 6986635329170796075 1923856105133987325 494705855605882455 118450697821126785 26322377293583730 5408707663065150 1023269017336650 177366629671686 28005257316582 4000751045226 512916800670 58433559570 5843355957 504981379 36949857 2225895 105995 3741 87 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 88 3828 109736 2331890 39175752 541931236 6348337336 64276915527 571350360240 4513667845896 32006008361808 205371886988268 1200635647008336 6431976680401800 31731084956648880 144773075114710515 613156553427009240 2418561960739869780 8910491434304783400 30741195448351502730 99542918594662008840 303153433901925208740 869918549457698425080 2356029404781266567925 6031435276240042413888 14614631630889333541344 33559524485745877020864 73111821201089232081168 151265836967770824995520 297489479369949289157856 556593219466356734553408 991431672174447933423258 1682429504296032856718256 2721577139302406091750120 4199004729209426541557328 6181868073558322408403844 8688030806081966628027024 11660251871320534158667848 14949040860667351485471600 18312575054317505569702710 21439112258713177252334880 23991387527607603115708080 25665205262091854495873760 26248505381684851188961800 25665205262091854495873760 23991387527607603115708080 21439112258713177252334880 18312575054317505569702710 14949040860667351485471600 11660251871320534158667848 8688030806081966628027024 6181868073558322408403844 4199004729209426541557328 2721577139302406091750120 1682429504296032856718256 991431672174447933423258 556593219466356734553408 297489479369949289157856 151265836967770824995520 73111821201089232081168 33559524485745877020864 14614631630889333541344 6031435276240042413888 2356029404781266567925 869918549457698425080 303153433901925208740 99542918594662008840 30741195448351502730 8910491434304783400 2418561960739869780 613156553427009240 144773075114710515 31731084956648880 6431976680401800 1200635647008336 205371886988268 32006008361808 4513667845896 571350360240 64276915527 6348337336 541931236 39175752 2331890 109736 3828 88 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 89 3916 113564 2441626 41507642 581106988 6890268572 70625252863 635627275767 5085018206136 36519676207704 237377895350076 1406007533996604 7632612327410136 38163061637050680 176504160071359395 757929628541719755 3031718514166879020 11329053395044653180 39651686882656286130 130284114043013511570 402696352496587217580 1173071983359623633820 3225947954238964993005 8387464681021308981813 20646066907129375955232 48174156116635210562208 106671345686835109102032 224377658168860057076688 448755316337720114153376 854082698836306023711264 1548024891640804667976666 2673861176470480790141514 4404006643598438948468376 6920581868511832633307448 10380872802767748949961172 14869898879640289036430868 20348282677402500786694872 26609292731987885644139448 33261615914984857055174310 39751687313030682822037590 45430499786320780368042960 49656592789699457611581840 51913710643776705684835560 51913710643776705684835560 49656592789699457611581840 45430499786320780368042960 39751687313030682822037590 33261615914984857055174310 26609292731987885644139448 20348282677402500786694872 14869898879640289036430868 10380872802767748949961172 6920581868511832633307448 4404006643598438948468376 2673861176470480790141514 1548024891640804667976666 854082698836306023711264 448755316337720114153376 224377658168860057076688 106671345686835109102032 48174156116635210562208 20646066907129375955232 8387464681021308981813 3225947954238964993005 1173071983359623633820 402696352496587217580 130284114043013511570 39651686882656286130 11329053395044653180 3031718514166879020 757929628541719755 176504160071359395 38163061637050680 7632612327410136 1406007533996604 237377895350076 36519676207704 5085018206136 635627275767 70625252863 6890268572 581106988 41507642 2441626 113564 3916 89 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 90 4005 117480 2555190 43949268 622614630 7471375560 77515521435 706252528630 5720645481903 41604694413840 273897571557780 1643385429346680 9038619861406740 45795673964460816 214667221708410075 934433788613079150 3789648142708598775 14360771909211532200 50980740277700939310 169935800925669797700 532980466539600729150 1575768335856210851400 4399019937598588626825 11613412635260273974818 29033531588150684937045 68820223023764586517440 154845501803470319664240 331049003855695166178720 673132974506580171230064 1302838015174026137864640 2402107590477110691687930 4221886068111285458118180 7077867820068919738609890 11324588512110271581775824 17301454671279581583268620 25250771682408037986392040 35218181557042789823125740 46957575409390386430834320 59870908646972742699313758 73013303228015539877211900 85182187099351463190080550 95087092576020237979624800 101570303433476163296417400 103827421287553411369671120 101570303433476163296417400 95087092576020237979624800 85182187099351463190080550 73013303228015539877211900 59870908646972742699313758 46957575409390386430834320 35218181557042789823125740 25250771682408037986392040 17301454671279581583268620 11324588512110271581775824 7077867820068919738609890 4221886068111285458118180 2402107590477110691687930 1302838015174026137864640 673132974506580171230064 331049003855695166178720 154845501803470319664240 68820223023764586517440 29033531588150684937045 11613412635260273974818 4399019937598588626825 1575768335856210851400 532980466539600729150 169935800925669797700 50980740277700939310 14360771909211532200 3789648142708598775 934433788613079150 214667221708410075 45795673964460816 9038619861406740 1643385429346680 273897571557780 41604694413840 5720645481903 706252528630 77515521435 7471375560 622614630 43949268 2555190 117480 4005 90 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 91 4095 121485 2672670 46504458 666563898 8093990190 84986896995 783768050065 6426898010533 47325339895743 315502265971620 1917283000904460 10682005290753420 54834293825867556 260462895672870891 1149101010321489225 4724081931321677925 18150420051920130975 65341512186912471510 220916541203370737010 702916267465270526850 2108748802395811580550 5974788273454799478225 16012432572858862601643 40646944223410958911863 97853754611915271454485 223665724827234906181680 485894505659165485842960 1004181978362275337408784 1975970989680606309094704 3704945605651136829552570 6623993658588396149806110 11299753888180205196728070 18402456332179191320385714 28626043183389853165044444 42552226353687619569660660 60468953239450827809517780 82175756966433176253960060 106828484056363129130148078 132884211874988282576525658 158195490327367003067292450 180269279675371701169705350 196657396009496401276042200 205397724721029574666088520 205397724721029574666088520 196657396009496401276042200 180269279675371701169705350 158195490327367003067292450 132884211874988282576525658 106828484056363129130148078 82175756966433176253960060 60468953239450827809517780 42552226353687619569660660 28626043183389853165044444 18402456332179191320385714 11299753888180205196728070 6623993658588396149806110 3704945605651136829552570 1975970989680606309094704 1004181978362275337408784 485894505659165485842960 223665724827234906181680 97853754611915271454485 40646944223410958911863 16012432572858862601643 5974788273454799478225 2108748802395811580550 702916267465270526850 220916541203370737010 65341512186912471510 18150420051920130975 4724081931321677925 1149101010321489225 260462895672870891 54834293825867556 10682005290753420 1917283000904460 315502265971620 47325339895743 6426898010533 783768050065 84986896995 8093990190 666563898 46504458 2672670 121485 4095 91 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 92 4186 125580 2794155 49177128 713068356 8760554088 93080887185 868754947060 7210666060598 53752237906276 362827605867363 2232785266876080 12599288291657880 65516299116620976 315297189498738447 1409563905994360116 5873182941643167150 22874501983241808900 83491932238832602485 286258053390283208520 923832808668641263860 2811665069861082107400 8083537075850611058775 21987220846313662079868 56659376796269821513506 138500698835326230366348 321519479439150177636165 709560230486400392024640 1490076484021440823251744 2980152968042881646503488 5680916595331743138647274 10328939264239532979358680 17923747546768601346534180 29702210220359396517113784 47028499515569044485430158 71178269537077472734705104 103021179593138447379178440 142644710205884004063477840 189004241022796305384108138 239712695931351411706673736 291079702202355285643818108 338464770002738704236997800 376926675684868102445747550 402055120730525975942130720 410795449442059149332177040 402055120730525975942130720 376926675684868102445747550 338464770002738704236997800 291079702202355285643818108 239712695931351411706673736 189004241022796305384108138 142644710205884004063477840 103021179593138447379178440 71178269537077472734705104 47028499515569044485430158 29702210220359396517113784 17923747546768601346534180 10328939264239532979358680 5680916595331743138647274 2980152968042881646503488 1490076484021440823251744 709560230486400392024640 321519479439150177636165 138500698835326230366348 56659376796269821513506 21987220846313662079868 8083537075850611058775 2811665069861082107400 923832808668641263860 286258053390283208520 83491932238832602485 22874501983241808900 5873182941643167150 1409563905994360116 315297189498738447 65516299116620976 12599288291657880 2232785266876080 362827605867363 53752237906276 7210666060598 868754947060 93080887185 8760554088 713068356 49177128 2794155 125580 4186 92 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 93 4278 129766 2919735 51971283 762245484 9473622444 101841441273 961835834245 8079421007658 60962903966874 416579843773639 2595612872743443 14832073558533960 78115587408278856 380813488615359423 1724861095493098563 7282746847637527266 28747684924884976050 106366434222074411385 369749985629115811005 1210090862058924472380 3735497878529723371260 10895202145711693166175 30070757922164273138643 78646597642583483593374 195160075631596051879854 460020178274476408002513 1031079709925550569660805 2199636714507841215276384 4470229452064322469755232 8661069563374624785150762 16009855859571276118005954 28252686811008134325892860 47625957767127997863647964 76730709735928441002543942 118206769052646517220135262 174199449130215920113883544 245665889799022451442656280 331648951228680309447585978 428716936954147717090781874 530792398133706697350491844 629544472205093989880815908 715391445687606806682745350 778981796415394078387878270 812850570172585125274307760 812850570172585125274307760 778981796415394078387878270 715391445687606806682745350 629544472205093989880815908 530792398133706697350491844 428716936954147717090781874 331648951228680309447585978 245665889799022451442656280 174199449130215920113883544 118206769052646517220135262 76730709735928441002543942 47625957767127997863647964 28252686811008134325892860 16009855859571276118005954 8661069563374624785150762 4470229452064322469755232 2199636714507841215276384 1031079709925550569660805 460020178274476408002513 195160075631596051879854 78646597642583483593374 30070757922164273138643 10895202145711693166175 3735497878529723371260 1210090862058924472380 369749985629115811005 106366434222074411385 28747684924884976050 7282746847637527266 1724861095493098563 380813488615359423 78115587408278856 14832073558533960 2595612872743443 416579843773639 60962903966874 8079421007658 961835834245 101841441273 9473622444 762245484 51971283 2919735 129766 4278 93 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 94 4371 134044 3049501 54891018 814216767 10235867928 111315063717 1063677275518 9041256841903 69042324974532 477542747740513 3012192716517082 17427686431277403 92947660966812816 458929076023638279 2105674584108457986 9007607943130625829 36030431772522503316 135114119146959387435 476116419851190222390 1579840847688040283385 4945588740588647843640 14630700024241416537435 40965960067875966304818 108717355564747756732017 273806673274179535473228 655180253906072459882367 1491099888200026977663318 3230716424433391784937189 6669866166572163685031616 13131299015438947254905994 24670925422945900903156716 44262542670579410443898814 75878644578136132189540824 124356667503056438866191906 194937478788574958222679204 292406218182862437334018806 419865338929238371556539824 577314841027702760890242258 760365888182828026538367852 959509335087854414441273718 1160336870338800687231307752 1344935917892700796563561258 1494373242103000885070623620 1591832366587979203662186030 1625701140345170250548615520 1591832366587979203662186030 1494373242103000885070623620 1344935917892700796563561258 1160336870338800687231307752 959509335087854414441273718 760365888182828026538367852 577314841027702760890242258 419865338929238371556539824 292406218182862437334018806 194937478788574958222679204 124356667503056438866191906 75878644578136132189540824 44262542670579410443898814 24670925422945900903156716 13131299015438947254905994 6669866166572163685031616 3230716424433391784937189 1491099888200026977663318 655180253906072459882367 273806673274179535473228 108717355564747756732017 40965960067875966304818 14630700024241416537435 4945588740588647843640 1579840847688040283385 476116419851190222390 135114119146959387435 36030431772522503316 9007607943130625829 2105674584108457986 458929076023638279 92947660966812816 17427686431277403 3012192716517082 477542747740513 69042324974532 9041256841903 1063677275518 111315063717 10235867928 814216767 54891018 3049501 134044 4371 94 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 95 4465 138415 3183545 57940519 869107785 11050084695 121550931645 1174992339235 10104934117421 78083581816435 546585072715045 3489735464257595 20439879147794485 110375347398090219 551876736990451095 2564603660132096265 11113282527239083815 45038039715653129145 171144550919481890751 611230538998149609825 2055957267539230505775 6525429588276688127025 19576288764830064381075 55596660092117382842253 149683315632623723036835 382524028838927292205245 928986927180251995355595 2146280142106099437545685 4721816312633418762600507 9900582591005555469968805 19801165182011110939937610 37802224438384848158062710 68933468093525311347055530 120141187248715542633439638 200235312081192571055732730 319294146291631397088871110 487343696971437395556698010 712271557112100808890558630 997180179956941132446782082 1337680729210530787428610110 1719875223270682440979641570 2119846205426655101672581470 2505272788231501483794869010 2839309159995701681634184878 3086205608690980088732809650 3217533506933149454210801550 3217533506933149454210801550 3086205608690980088732809650 2839309159995701681634184878 2505272788231501483794869010 2119846205426655101672581470 1719875223270682440979641570 1337680729210530787428610110 997180179956941132446782082 712271557112100808890558630 487343696971437395556698010 319294146291631397088871110 200235312081192571055732730 120141187248715542633439638 68933468093525311347055530 37802224438384848158062710 19801165182011110939937610 9900582591005555469968805 4721816312633418762600507 2146280142106099437545685 928986927180251995355595 382524028838927292205245 149683315632623723036835 55596660092117382842253 19576288764830064381075 6525429588276688127025 2055957267539230505775 611230538998149609825 171144550919481890751 45038039715653129145 11113282527239083815 2564603660132096265 551876736990451095 110375347398090219 20439879147794485 3489735464257595 546585072715045 78083581816435 10104934117421 1174992339235 121550931645 11050084695 869107785 57940519 3183545 138415 4465 95 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 96 4560 142880 3321960 61124064 927048304 11919192480 132601016340 1296543270880 11279926456656 88188515933856 624668654531480 4036320536972640 23929614612052080 130815226545884704 662252084388541314 3116480397122547360 13677886187371180080 56151322242892212960 216182590635135019896 782375089917631500576 2667187806537380115600 8581386855815918632800 26101718353106752508100 75172948856947447223328 205279975724741105879088 532207344471551015242080 1311510956019179287560840 3075267069286351432901280 6868096454739518200146192 14622398903638974232569312 29701747773016666409906415 57603389620395959098000320 106735692531910159505118240 189074655342240853980495168 320376499329908113689172368 519529458372823968144603840 806637843263068792645569120 1199615254083538204447256640 1709451737069041941337340712 2334860909167471919875392192 3057555952481213228408251680 3839721428697337542652223040 4625118993658156585467450480 5344581948227203165429053888 5925514768686681770366994528 6303739115624129542943611200 6435067013866298908421603100 6303739115624129542943611200 5925514768686681770366994528 5344581948227203165429053888 4625118993658156585467450480 3839721428697337542652223040 3057555952481213228408251680 2334860909167471919875392192 1709451737069041941337340712 1199615254083538204447256640 806637843263068792645569120 519529458372823968144603840 320376499329908113689172368 189074655342240853980495168 106735692531910159505118240 57603389620395959098000320 29701747773016666409906415 14622398903638974232569312 6868096454739518200146192 3075267069286351432901280 1311510956019179287560840 532207344471551015242080 205279975724741105879088 75172948856947447223328 26101718353106752508100 8581386855815918632800 2667187806537380115600 782375089917631500576 216182590635135019896 56151322242892212960 13677886187371180080 3116480397122547360 662252084388541314 130815226545884704 23929614612052080 4036320536972640 624668654531480 88188515933856 11279926456656 1296543270880 132601016340 11919192480 927048304 61124064 3321960 142880 4560 96 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 97 4656 147440 3464840 64446024 988172368 12846240784 144520208820 1429144287220 12576469727536 99468442390512 712857170465336 4660989191504120 27965935149024720 154744841157936784 793067310934426018 3778732481511088674 16794366584493727440 69829208430263393040 272333912878027232856 998557680552766520472 3449562896455011616176 11248574662353298748400 34683105208922671140900 101274667210054199731428 280452924581688553102416 737487320196292121121168 1843718300490730302802920 4386778025305530720462120 9943363524025869633047472 21490495358378492432715504 44324146676655640642475727 87305137393412625507906735 164339082152306118603118560 295810347874151013485613408 509451154672148967669667536 839905957702732081833776208 1326167301635892760790172960 2006253097346606997092825760 2909066991152580145784597352 4044312646236513861212732904 5392416861648685148283643872 6897277381178550771060474720 8464840422355494128119673520 9969700941885359750896504368 11270096716913884935796048416 12229253884310811313310605728 12738806129490428451365214300 12738806129490428451365214300 12229253884310811313310605728 11270096716913884935796048416 9969700941885359750896504368 8464840422355494128119673520 6897277381178550771060474720 5392416861648685148283643872 4044312646236513861212732904 2909066991152580145784597352 2006253097346606997092825760 1326167301635892760790172960 839905957702732081833776208 509451154672148967669667536 295810347874151013485613408 164339082152306118603118560 87305137393412625507906735 44324146676655640642475727 21490495358378492432715504 9943363524025869633047472 4386778025305530720462120 1843718300490730302802920 737487320196292121121168 280452924581688553102416 101274667210054199731428 34683105208922671140900 11248574662353298748400 3449562896455011616176 998557680552766520472 272333912878027232856 69829208430263393040 16794366584493727440 3778732481511088674 793067310934426018 154744841157936784 27965935149024720 4660989191504120 712857170465336 99468442390512 12576469727536 1429144287220 144520208820 12846240784 988172368 64446024 3464840 147440 4656 97 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 98 4753 152096 3612280 67910864 1052618392 13834413152 157366449604 1573664496040 14005614014756 112044912118048 812325612855848 5373846361969456 32626924340528840 182710776306961504 947812152092362802 4571799792445514692 20573099066004816114 86623575014757120480 342163121308290625896 1270891593430793753328 4448120577007778136648 14698137558808310364576 45931679871275969889300 135957772418976870872328 381727591791742752833844 1017940244777980674223584 2581205620687022423924088 6230496325796261023265040 14330141549331400353509592 31433858882404362065762976 65814642035034133075191231 131629284070068266150382462 251644219545718744111025295 460149430026457132088731968 805261502546299981155280944 1349357112374881049503443744 2166073259338624842623949168 3332420398982499757882998720 4915320088499187142877423112 6953379637389094006997330256 9436729507885199009496376776 12289694242827235919344118592 15362117803534044899180148240 18434541364240853879016177888 21239797658799244686692552784 23499350601224696249106654144 24968060013801239764675820028 25477612258980856902730428600 24968060013801239764675820028 23499350601224696249106654144 21239797658799244686692552784 18434541364240853879016177888 15362117803534044899180148240 12289694242827235919344118592 9436729507885199009496376776 6953379637389094006997330256 4915320088499187142877423112 3332420398982499757882998720 2166073259338624842623949168 1349357112374881049503443744 805261502546299981155280944 460149430026457132088731968 251644219545718744111025295 131629284070068266150382462 65814642035034133075191231 31433858882404362065762976 14330141549331400353509592 6230496325796261023265040 2581205620687022423924088 1017940244777980674223584 381727591791742752833844 135957772418976870872328 45931679871275969889300 14698137558808310364576 4448120577007778136648 1270891593430793753328 342163121308290625896 86623575014757120480 20573099066004816114 4571799792445514692 947812152092362802 182710776306961504 32626924340528840 5373846361969456 812325612855848 112044912118048 14005614014756 1573664496040 157366449604 13834413152 1052618392 67910864 3612280 152096 4753 98 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 99 4851 156849 3764376 71523144 1120529256 14887031544 171200862756 1731030945644 15579278510796 126050526132804 924370524973896 6186171974825304 38000770702498296 215337700647490344 1130522928399324306 5519611944537877494 25144898858450330806 107196674080761936594 428786696323047746376 1613054714739084379224 5719012170438571889976 19146258135816088501224 60629817430084280253876 181889452290252840761628 517685364210719623706172 1399667836569723427057428 3599145865465003098147672 8811701946483283447189128 20560637875127661376774632 45764000431735762419272568 97248500917438495140954207 197443926105102399225573693 383273503615787010261407757 711793649572175876199757263 1265410932572757113244012912 2154618614921181030658724688 3515430371713505892127392912 5498493658321124600506947888 8247740487481686900760421832 11868699725888281149874753368 16390109145274293016493707032 21726423750712434928840495368 27651812046361280818524266832 33796659167774898778196326128 39674339023040098565708730672 44739148260023940935799206928 48467410615025936013782474172 50445672272782096667406248628 50445672272782096667406248628 48467410615025936013782474172 44739148260023940935799206928 39674339023040098565708730672 33796659167774898778196326128 27651812046361280818524266832 21726423750712434928840495368 16390109145274293016493707032 11868699725888281149874753368 8247740487481686900760421832 5498493658321124600506947888 3515430371713505892127392912 2154618614921181030658724688 1265410932572757113244012912 711793649572175876199757263 383273503615787010261407757 197443926105102399225573693 97248500917438495140954207 45764000431735762419272568 20560637875127661376774632 8811701946483283447189128 3599145865465003098147672 1399667836569723427057428 517685364210719623706172 181889452290252840761628 60629817430084280253876 19146258135816088501224 5719012170438571889976 1613054714739084379224 428786696323047746376 107196674080761936594 25144898858450330806 5519611944537877494 1130522928399324306 215337700647490344 38000770702498296 6186171974825304 924370524973896 126050526132804 15579278510796 1731030945644 171200862756 14887031544 1120529256 71523144 3764376 156849 4851 99 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 100 4950 161700 3921225 75287520 1192052400 16007560800 186087894300 1902231808400 17310309456440 141629804643600 1050421051106700 7110542499799200 44186942677323600 253338471349988640 1345860629046814650 6650134872937201800 30664510802988208300 132341572939212267400 535983370403809682970 2041841411062132125600 7332066885177656269200 24865270306254660391200 79776075565900368755100 242519269720337121015504 699574816500972464467800 1917353200780443050763600 4998813702034726525205100 12410847811948286545336800 29372339821610944823963760 66324638306863423796047200 143012501349174257560226775 294692427022540894366527900 580717429720889409486981450 1095067153187962886461165020 1977204582144932989443770175 3420029547493938143902737600 5670048986634686922786117600 9013924030034630492634340800 13746234145802811501267369720 20116440213369968050635175200 28258808871162574166368460400 38116532895986727945334202400 49378235797073715747364762200 61448471214136179596720592960 73470998190814997343905056800 84413487283064039501507937600 93206558875049876949581681100 98913082887808032681188722800 100891344545564193334812497256 98913082887808032681188722800 93206558875049876949581681100 84413487283064039501507937600 73470998190814997343905056800 61448471214136179596720592960 49378235797073715747364762200 38116532895986727945334202400 28258808871162574166368460400 20116440213369968050635175200 13746234145802811501267369720 9013924030034630492634340800 5670048986634686922786117600 3420029547493938143902737600 1977204582144932989443770175 1095067153187962886461165020 580717429720889409486981450 294692427022540894366527900 143012501349174257560226775 66324638306863423796047200 29372339821610944823963760 12410847811948286545336800 4998813702034726525205100 1917353200780443050763600 699574816500972464467800 242519269720337121015504 79776075565900368755100 24865270306254660391200 7332066885177656269200 2041841411062132125600 535983370403809682970 132341572939212267400 30664510802988208300 6650134872937201800 1345860629046814650 253338471349988640 44186942677323600 7110542499799200 1050421051106700 141629804643600 17310309456440 1902231808400 186087894300 16007560800 1192052400 75287520 3921225 161700 4950 100 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 101 5050 166650 4082925 79208745 1267339920 17199613200 202095455100 2088319702700 19212541264840 158940114100040 1192050855750300 8160963550905900 51297485177122800 297525414027312240 1599199100396803290 7995995501984016450 37314645675925410100 163006083742200475700 668324943343021950370 2577824781465941808570 9373908296239788394800 32197337191432316660400 104641345872155029146300 322295345286237489770604 942094086221309585483304 2616928017281415515231400 6916166902815169575968700 17409661513983013070541900 41783187633559231369300560 95696978128474368620010960 209337139656037681356273975 437704928371715151926754675 875409856743430303853509350 1675784582908852295948146470 3072271735332895875904935195 5397234129638871133346507775 9090078534128625066688855200 14683973016669317415420458400 22760158175837441993901710520 33862674359172779551902544920 48375249084532542217003635600 66375341767149302111702662800 87494768693060443692698964600 110826707011209895344085355160 134919469404951176940625649760 157884485473879036845412994400 177620046158113916451089618700 192119641762857909630770403900 199804427433372226016001220056 199804427433372226016001220056 192119641762857909630770403900 177620046158113916451089618700 157884485473879036845412994400 134919469404951176940625649760 110826707011209895344085355160 87494768693060443692698964600 66375341767149302111702662800 48375249084532542217003635600 33862674359172779551902544920 22760158175837441993901710520 14683973016669317415420458400 9090078534128625066688855200 5397234129638871133346507775 3072271735332895875904935195 1675784582908852295948146470 875409856743430303853509350 437704928371715151926754675 209337139656037681356273975 95696978128474368620010960 41783187633559231369300560 17409661513983013070541900 6916166902815169575968700 2616928017281415515231400 942094086221309585483304 322295345286237489770604 104641345872155029146300 32197337191432316660400 9373908296239788394800 2577824781465941808570 668324943343021950370 163006083742200475700 37314645675925410100 7995995501984016450 1599199100396803290 297525414027312240 51297485177122800 8160963550905900 1192050855750300 158940114100040 19212541264840 2088319702700 202095455100 17199613200 1267339920 79208745 4082925 166650 5050 101 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 102 5151 171700 4249575 83291670 1346548665 18466953120 219295068300 2290415157800 21300860967540 178152655364880 1350990969850340 9353014406656200 59458448728028700 348822899204435040 1896724514424115530 9595194602380819740 45310641177909426550 200320729418125885800 831331027085222426070 3246149724808963758940 11951733077705730203370 41571245487672105055200 136838683063587345806700 426936691158392518916904 1264389431507547075253908 3559022103502725100714704 9533094920096585091200100 24325828416798182646510600 59192849147542244439842460 137480165762033599989311520 305034117784512049976284935 647042068027752833283028650 1313114785115145455780264025 2551194439652282599801655820 4748056318241748171853081665 8469505864971767009251442970 14487312663767496200035362975 23774051550797942482109313600 37444131192506759409322168920 56622832535010221545804255440 82237923443705321768906180520 114750590851681844328706298400 153870110460209745804401627400 198321475704270339036784319760 245746176416161072284711004920 292803954878830213786038644160 335504531631992953296502613100 369739687920971826081860022600 391924069196230135646771623956 399608854866744452032002440112 391924069196230135646771623956 369739687920971826081860022600 335504531631992953296502613100 292803954878830213786038644160 245746176416161072284711004920 198321475704270339036784319760 153870110460209745804401627400 114750590851681844328706298400 82237923443705321768906180520 56622832535010221545804255440 37444131192506759409322168920 23774051550797942482109313600 14487312663767496200035362975 8469505864971767009251442970 4748056318241748171853081665 2551194439652282599801655820 1313114785115145455780264025 647042068027752833283028650 305034117784512049976284935 137480165762033599989311520 59192849147542244439842460 24325828416798182646510600 9533094920096585091200100 3559022103502725100714704 1264389431507547075253908 426936691158392518916904 136838683063587345806700 41571245487672105055200 11951733077705730203370 3246149724808963758940 831331027085222426070 200320729418125885800 45310641177909426550 9595194602380819740 1896724514424115530 348822899204435040 59458448728028700 9353014406656200 1350990969850340 178152655364880 21300860967540 2290415157800 219295068300 18466953120 1346548665 83291670 4249575 171700 5151 102 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 103 5253 176851 4421275 87541245 1429840335 19813501785 237762021420 2509710226100 23591276125340 199453516332420 1529143625215220 10704005376506540 68811463134684900 408281347932463740 2245547413628550570 11491919116804935270 54905835780290246290 245631370596035312350 1031651756503348311870 4077480751894186185010 15197882802514693962310 53522978565377835258570 178409928551259450861900 563775374221979864723604 1691326122665939594170812 4823411535010272175968612 13092117023599310191914804 33858923336894767737710700 83518677564340427086353060 196673014909575844429153980 442514283546545649965596455 952076185812264883259313585 1960156853142898289063292675 3864309224767428055581919845 7299250757894030771654737485 13217562183213515181104524635 22956818528739263209286805945 38261364214565438682144676575 61218182743304701891431482520 94066963727516980955126424360 138860755978715543314710435960 196988514295387166097612478920 268620701311891590133107925800 352191586164480084841185947160 444067652120431411321495324680 538550131294991286070749649080 628308486510823167082541257260 705244219552964779378362635700 761663757117201961728631646556 791532924062974587678774064068 791532924062974587678774064068 761663757117201961728631646556 705244219552964779378362635700 628308486510823167082541257260 538550131294991286070749649080 444067652120431411321495324680 352191586164480084841185947160 268620701311891590133107925800 196988514295387166097612478920 138860755978715543314710435960 94066963727516980955126424360 61218182743304701891431482520 38261364214565438682144676575 22956818528739263209286805945 13217562183213515181104524635 7299250757894030771654737485 3864309224767428055581919845 1960156853142898289063292675 952076185812264883259313585 442514283546545649965596455 196673014909575844429153980 83518677564340427086353060 33858923336894767737710700 13092117023599310191914804 4823411535010272175968612 1691326122665939594170812 563775374221979864723604 178409928551259450861900 53522978565377835258570 15197882802514693962310 4077480751894186185010 1031651756503348311870 245631370596035312350 54905835780290246290 11491919116804935270 2245547413628550570 408281347932463740 68811463134684900 10704005376506540 1529143625215220 199453516332420 23591276125340 2509710226100 237762021420 19813501785 1429840335 87541245 4421275 176851 5253 103 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 104 5356 182104 4598126 91962520 1517381580 21243342120 257575523205 2747472247520 26100986351440 223044792457760 1728597141547640 12233149001721760 79515468511191440 477092811067148640 2653828761561014310 13737466530433485840 66397754897095181560 300537206376325558640 1277283127099383624220 5109132508397534496880 19275363554408880147320 68720861367892529220880 231932907116637286120470 742185302773239315585504 2255101496887919458894416 6514737657676211770139424 17915528558609582367883416 46951040360494077929625504 117377600901235194824063760 280191692473916271515507040 639187298456121494394750435 1394590469358810533224910040 2912233038955163172322606260 5824466077910326344645212520 11163559982661458827236657330 20516812941107545952759262120 36174380711952778390391330580 61218182743304701891431482520 99479546957870140573576159095 155285146470821682846557906880 232927719706232524269836860320 335849270274102709412322914880 465609215607278756230720404720 620812287476371674974293872960 796259238284911496162681271840 982617783415422697392244973760 1166858617805814453153290906340 1333552706063787946460903892960 1466907976670166741106994282256 1553196681180176549407405710624 1583065848125949175357548128136 1553196681180176549407405710624 1466907976670166741106994282256 1333552706063787946460903892960 1166858617805814453153290906340 982617783415422697392244973760 796259238284911496162681271840 620812287476371674974293872960 465609215607278756230720404720 335849270274102709412322914880 232927719706232524269836860320 155285146470821682846557906880 99479546957870140573576159095 61218182743304701891431482520 36174380711952778390391330580 20516812941107545952759262120 11163559982661458827236657330 5824466077910326344645212520 2912233038955163172322606260 1394590469358810533224910040 639187298456121494394750435 280191692473916271515507040 117377600901235194824063760 46951040360494077929625504 17915528558609582367883416 6514737657676211770139424 2255101496887919458894416 742185302773239315585504 231932907116637286120470 68720861367892529220880 19275363554408880147320 5109132508397534496880 1277283127099383624220 300537206376325558640 66397754897095181560 13737466530433485840 2653828761561014310 477092811067148640 79515468511191440 12233149001721760 1728597141547640 223044792457760 26100986351440 2747472247520 257575523205 21243342120 1517381580 91962520 4598126 182104 5356 104 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 105 5460 187460 4780230 96560646 1609344100 22760723700 278818865325 3005047770725 28848458598960 249145778809200 1951641934005400 13961746143269400 91748617512913200 556608279578340080 3130921572628162950 16391295291994500150 80135221427528667400 366934961273420740200 1577820333475709182860 6386415635496918121100 24384496062806414644200 87996224922301409368200 300653768484529815341350 974118209889876601705974 2997286799661158774479920 8769839154564131229033840 24430266216285794138022840 64866568919103660297508920 164328641261729272753689264 397569293375151466339570800 919378990930037765910257475 2033777767814932027619660475 4306823508313973705547516300 8736699116865489516967818780 16988026060571785171881869850 31680372923769004779995919450 56691193653060324343150592700 97392563455257480281822813100 160697729701174842465007641615 254764693428691823420134065975 388212866177054207116394767200 568776989980335233682159775200 801458485881381465643043319600 1086421503083650431205014277680 1417071525761283171136975144800 1778877021700334193554926245600 2149476401221237150545535880100 2500411323869602399614194799300 2800460682733954687567898175216 3020104657850343290514399992880 3136262529306125724764953838760 3136262529306125724764953838760 3020104657850343290514399992880 2800460682733954687567898175216 2500411323869602399614194799300 2149476401221237150545535880100 1778877021700334193554926245600 1417071525761283171136975144800 1086421503083650431205014277680 801458485881381465643043319600 568776989980335233682159775200 388212866177054207116394767200 254764693428691823420134065975 160697729701174842465007641615 97392563455257480281822813100 56691193653060324343150592700 31680372923769004779995919450 16988026060571785171881869850 8736699116865489516967818780 4306823508313973705547516300 2033777767814932027619660475 919378990930037765910257475 397569293375151466339570800 164328641261729272753689264 64866568919103660297508920 24430266216285794138022840 8769839154564131229033840 2997286799661158774479920 974118209889876601705974 300653768484529815341350 87996224922301409368200 24384496062806414644200 6386415635496918121100 1577820333475709182860 366934961273420740200 80135221427528667400 16391295291994500150 3130921572628162950 556608279578340080 91748617512913200 13961746143269400 1951641934005400 249145778809200 28848458598960 3005047770725 278818865325 22760723700 1609344100 96560646 4780230 187460 5460 105 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 106 5565 192920 4967690 101340876 1705904746 24370067800 301579589025 3283866636050 31853506369685 277994237408160 2200787712814600 15913388077274800 105710363656182600 648356897091253280 3687529852206503030 19522216864622663100 96526516719523167550 447070182700949407600 1944755294749129923060 7964235968972627303960 30770911698303332765300 112380720985107824012400 388649993406831224709550 1274771978374406417047324 3971405009551035376185894 11767125954225290003513760 33200105370849925367056680 89296835135389454435531760 229195210180832933051198184 561897934636880739093260064 1316948284305189232249828275 2953156758744969793529917950 6340601276128905733167176775 13043522625179463222515335080 25724725177437274688849688630 48668398984340789951877789300 88371566576829329123146512150 154083757108317804624973405800 258090293156432322746830454715 415462423129866665885141707590 642977559605746030536528833175 956989856157389440798554542400 1370235475861716699325203094800 1887879988965031896848057597280 2503493028844933602341989422480 3195948547461617364691901390400 3928353422921571344100462125700 4649887725090839550159730679400 5300872006603557087182092974516 5820565340584297978082298168096 6156367187156469015279353831640 6272525058612251449529907677520 6156367187156469015279353831640 5820565340584297978082298168096 5300872006603557087182092974516 4649887725090839550159730679400 3928353422921571344100462125700 3195948547461617364691901390400 2503493028844933602341989422480 1887879988965031896848057597280 1370235475861716699325203094800 956989856157389440798554542400 642977559605746030536528833175 415462423129866665885141707590 258090293156432322746830454715 154083757108317804624973405800 88371566576829329123146512150 48668398984340789951877789300 25724725177437274688849688630 13043522625179463222515335080 6340601276128905733167176775 2953156758744969793529917950 1316948284305189232249828275 561897934636880739093260064 229195210180832933051198184 89296835135389454435531760 33200105370849925367056680 11767125954225290003513760 3971405009551035376185894 1274771978374406417047324 388649993406831224709550 112380720985107824012400 30770911698303332765300 7964235968972627303960 1944755294749129923060 447070182700949407600 96526516719523167550 19522216864622663100 3687529852206503030 648356897091253280 105710363656182600 15913388077274800 2200787712814600 277994237408160 31853506369685 3283866636050 301579589025 24370067800 1705904746 101340876 4967690 192920 5565 106 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 107 5671 198485 5160610 106308566 1807245622 26075972546 325949656825 3585446225075 35137373005735 309847743777845 2478781950222760 18114175790089400 121623751733457400 754067260747435880 4335886749297756310 23209746716829166130 116048733584145830650 543596699420472575150 2391825477450079330660 9908991263721757227020 38735147667275960069260 143151632683411156777700 501030714391939048721950 1663421971781237641756874 5246176987925441793233218 15738530963776325379699654 44967231325075215370570440 122496940506239379802588440 318492045316222387486729944 791093144817713672144458248 1878846218942069971343088339 4270105043050159025779746225 9293758034873875526697094725 19384123901308368955682511855 38768247802616737911365023710 74393124161778064640727477930 137039965561170119075024301450 242455323685147133748119917950 412174050264750127371803860515 673552716286298988631972162305 1058439982735612696421670540765 1599967415763135471335083375575 2327225332019106140123757637200 3258115464826748596173260692080 4391373017809965499190047019760 5699441576306550967033890812880 7124301970383188708792363516100 8578241148012410894260192805100 9950759731694396637341823653916 11121437347187855065264391142612 11976932527740766993361651999736 12428892245768720464809261509160 12428892245768720464809261509160 11976932527740766993361651999736 11121437347187855065264391142612 9950759731694396637341823653916 8578241148012410894260192805100 7124301970383188708792363516100 5699441576306550967033890812880 4391373017809965499190047019760 3258115464826748596173260692080 2327225332019106140123757637200 1599967415763135471335083375575 1058439982735612696421670540765 673552716286298988631972162305 412174050264750127371803860515 242455323685147133748119917950 137039965561170119075024301450 74393124161778064640727477930 38768247802616737911365023710 19384123901308368955682511855 9293758034873875526697094725 4270105043050159025779746225 1878846218942069971343088339 791093144817713672144458248 318492045316222387486729944 122496940506239379802588440 44967231325075215370570440 15738530963776325379699654 5246176987925441793233218 1663421971781237641756874 501030714391939048721950 143151632683411156777700 38735147667275960069260 9908991263721757227020 2391825477450079330660 543596699420472575150 116048733584145830650 23209746716829166130 4335886749297756310 754067260747435880 121623751733457400 18114175790089400 2478781950222760 309847743777845 35137373005735 3585446225075 325949656825 26075972546 1807245622 106308566 5160610 198485 5671 107 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 108 5778 204156 5359095 111469176 1913554188 27883218168 352025629371 3911395881900 38722819230810 344985116783580 2788629694000605 20592957740312160 139737927523546800 875691012480893280 5089954010045192190 27545633466126922440 139258480300974996780 659645433004618405800 2935422176870551905810 12300816741171836557680 48644138930997717296280 181886780350687116846960 644182347075350205499650 2164452686173176690478824 6909598959706679434990092 20984707951701767172932872 60705762288851540750270094 167464171831314595173158880 440988985822461767289318384 1109585190133936059631188192 2669939363759783643487546587 6148951261992228997122834564 13563863077924034552476840950 28677881936182244482379606580 58152371703925106867047535565 113161371964394802552092501640 211433089722948183715751779380 379495289246317252823144219400 654629373949897261119923778465 1085726766551049116003776022820 1731992699021911685053642703070 2658407398498748167756753916340 3927192747782241611458841012775 5585340796845854736297018329280 7649488482636714095363307711840 10090814594116516466223937832640 12823743546689739675826254328980 15702543118395599603052556321200 18529000879706807531602016459016 21072197078882251702606214796528 23098369874928622058626043142348 24405824773509487458170913508896 24857784491537440929618523018320 24405824773509487458170913508896 23098369874928622058626043142348 21072197078882251702606214796528 18529000879706807531602016459016 15702543118395599603052556321200 12823743546689739675826254328980 10090814594116516466223937832640 7649488482636714095363307711840 5585340796845854736297018329280 3927192747782241611458841012775 2658407398498748167756753916340 1731992699021911685053642703070 1085726766551049116003776022820 654629373949897261119923778465 379495289246317252823144219400 211433089722948183715751779380 113161371964394802552092501640 58152371703925106867047535565 28677881936182244482379606580 13563863077924034552476840950 6148951261992228997122834564 2669939363759783643487546587 1109585190133936059631188192 440988985822461767289318384 167464171831314595173158880 60705762288851540750270094 20984707951701767172932872 6909598959706679434990092 2164452686173176690478824 644182347075350205499650 181886780350687116846960 48644138930997717296280 12300816741171836557680 2935422176870551905810 659645433004618405800 139258480300974996780 27545633466126922440 5089954010045192190 875691012480893280 139737927523546800 20592957740312160 2788629694000605 344985116783580 38722819230810 3911395881900 352025629371 27883218168 1913554188 111469176 5359095 204156 5778 108 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 109 5886 209934 5563251 116828271 2025023364 29796772356 379908847539 4263421511271 42634215112710 383707936014390 3133614810784185 23381587434312765 160330885263858960 1015428940004440080 5965645022526085470 32635587476172114630 166804113767101919220 798903913305593402580 3595067609875170311610 15236238918042388463490 60944955672169553853960 230530919281684834143240 826069127426037322346610 2808635033248526895978474 9074051645879856125468916 27894306911408446607922964 81690470240553307923202966 228169934120166135923428974 608453157653776362462477264 1550574175956397826920506576 3779524553893719703118734779 8818890625752012640610381151 19712814339916263549599675514 42241745014106279034856447530 86830253640107351349427142145 171313743668319909419140037205 324594461687342986267844281020 590928378969265436538895998780 1034124663196214513943067997865 1740356140500946377123699801285 2817719465572960801057418725890 4390400097520659852810396619410 6585600146280989779215594929115 9512533544628096347755859342055 13234829279482568831660326041120 17740303076753230561587245544480 22914558140806256142050192161620 28526286665085339278878810650180 34231543998102407134654572780216 39601197958589059234208231255544 44170566953810873761232257938876 47504194648438109516796956651244 49263609265046928387789436527216 49263609265046928387789436527216 47504194648438109516796956651244 44170566953810873761232257938876 39601197958589059234208231255544 34231543998102407134654572780216 28526286665085339278878810650180 22914558140806256142050192161620 17740303076753230561587245544480 13234829279482568831660326041120 9512533544628096347755859342055 6585600146280989779215594929115 4390400097520659852810396619410 2817719465572960801057418725890 1740356140500946377123699801285 1034124663196214513943067997865 590928378969265436538895998780 324594461687342986267844281020 171313743668319909419140037205 86830253640107351349427142145 42241745014106279034856447530 19712814339916263549599675514 8818890625752012640610381151 3779524553893719703118734779 1550574175956397826920506576 608453157653776362462477264 228169934120166135923428974 81690470240553307923202966 27894306911408446607922964 9074051645879856125468916 2808635033248526895978474 826069127426037322346610 230530919281684834143240 60944955672169553853960 15236238918042388463490 3595067609875170311610 798903913305593402580 166804113767101919220 32635587476172114630 5965645022526085470 1015428940004440080 160330885263858960 23381587434312765 3133614810784185 383707936014390 42634215112710 4263421511271 379908847539 29796772356 2025023364 116828271 5563251 209934 5886 109 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 110 5995 215820 5773185 122391522 2141851635 31821795720 409705619895 4643330358810 46897636623981 426342151127100 3517322746798575 26515202245096950 183712472698171725 1175759825268299040 6981073962530525550 38601232498698200100 199439701243274033850 965708027072695321800 4393971523180763714190 18831306527917558775100 76181194590211942317450 291475874953854387997200 1056600046707722156489850 3634704160674564218325084 11882686679128383021447390 36968358557288302733391880 109584777151961754531125930 309860404360719443846631940 836623091773942498385906238 2159027333610174189382983840 5330098729850117530039241355 12598415179645732343729115930 28531704965668276190210056665 61954559354022542584456123044 129071998654213630384283589675 258143997308427260768567179350 495908205355662895686984318225 915522840656608422806740279800 1625053042165479950481963996645 2774480803697160891066767799150 4558075606073907178181118527175 7208119563093620653867815345300 10976000243801649632025991548525 16098133690909086126971454271170 22747362824110665179416185383175 30975132356235799393247571585600 40654861217559486703637437706100 51440844805891595420929002811800 62757830663187746413533383430396 73832741956691466368862804035760 83771764912399932995440489194420 91674761602248983278029214590120 96767803913485037904586393178460 98527218530093856775578873054432 96767803913485037904586393178460 91674761602248983278029214590120 83771764912399932995440489194420 73832741956691466368862804035760 62757830663187746413533383430396 51440844805891595420929002811800 40654861217559486703637437706100 30975132356235799393247571585600 22747362824110665179416185383175 16098133690909086126971454271170 10976000243801649632025991548525 7208119563093620653867815345300 4558075606073907178181118527175 2774480803697160891066767799150 1625053042165479950481963996645 915522840656608422806740279800 495908205355662895686984318225 258143997308427260768567179350 129071998654213630384283589675 61954559354022542584456123044 28531704965668276190210056665 12598415179645732343729115930 5330098729850117530039241355 2159027333610174189382983840 836623091773942498385906238 309860404360719443846631940 109584777151961754531125930 36968358557288302733391880 11882686679128383021447390 3634704160674564218325084 1056600046707722156489850 291475874953854387997200 76181194590211942317450 18831306527917558775100 4393971523180763714190 965708027072695321800 199439701243274033850 38601232498698200100 6981073962530525550 1175759825268299040 183712472698171725 26515202245096950 3517322746798575 426342151127100 46897636623981 4643330358810 409705619895 31821795720 2141851635 122391522 5773185 215820 5995 110 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 111 6105 221815 5989005 128164707 2264243157 33963647355 441527415615 5053035978705 51540966982791 473239787751081 3943664897925675 30032524991895525 210227674943268675 1359472297966470765 8156833787798824590 45582306461228725650 238040933741972233950 1165147728315969355650 5359679550253459035990 23225278051098322489290 95012501118129501092550 367657069544066330314650 1348075921661576544487050 4691304207382286374814934 15517390839802947239772474 48851045236416685754839270 146553135709250057264517810 419445181512681198377757870 1146483496134661942232538178 2995650425384116687768890078 7489126063460291719422225195 17928513909495849873768357285 41130120145314008533939172595 90486264319690818774666179709 191026558008236172968739712719 387215995962640891152850769025 754052202664090156455551497575 1411431046012271318493724598025 2540575882822088373288704276445 4399533845862640841548731795795 7332556409771068069247886326325 11766195169167527832048933872475 18184119806895270285893806893825 27074133934710735758997445819695 38845496515019751306387639654345 53722495180346464572663756968775 71629993573795286096885009291700 92095706023451082124566440517900 114198675469079341834462386242196 136590572619879212782396187466156 157604506869091399364303293230180 175446526514648916273469703784540 188442565515734021182615607768580 195295022443578894680165266232892 195295022443578894680165266232892 188442565515734021182615607768580 175446526514648916273469703784540 157604506869091399364303293230180 136590572619879212782396187466156 114198675469079341834462386242196 92095706023451082124566440517900 71629993573795286096885009291700 53722495180346464572663756968775 38845496515019751306387639654345 27074133934710735758997445819695 18184119806895270285893806893825 11766195169167527832048933872475 7332556409771068069247886326325 4399533845862640841548731795795 2540575882822088373288704276445 1411431046012271318493724598025 754052202664090156455551497575 387215995962640891152850769025 191026558008236172968739712719 90486264319690818774666179709 41130120145314008533939172595 17928513909495849873768357285 7489126063460291719422225195 2995650425384116687768890078 1146483496134661942232538178 419445181512681198377757870 146553135709250057264517810 48851045236416685754839270 15517390839802947239772474 4691304207382286374814934 1348075921661576544487050 367657069544066330314650 95012501118129501092550 23225278051098322489290 5359679550253459035990 1165147728315969355650 238040933741972233950 45582306461228725650 8156833787798824590 1359472297966470765 210227674943268675 30032524991895525 3943664897925675 473239787751081 51540966982791 5053035978705 441527415615 33963647355 2264243157 128164707 5989005 221815 6105 111 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 112 6216 227920 6210820 134153712 2392407864 36227890512 475491062970 5494563394320 56594002961496 524780754733872 4416904685676756 33976189889821200 240260199935164200 1569699972909739440 9516306085765295355 53739140249027550240 283623240203200959600 1403188662057941589600 6524827278569428391640 28584957601351781525280 118237779169227823581840 462669570662195831407200 1715732991205642874801700 6039380129043862919301984 20208695047185233614587408 64368436076219632994611744 195404180945666743019357080 565998317221931255642275680 1565928677647343140610296048 4142133921518778630001428256 10484776488844408407191115273 25417639972956141593190582480 59058634054809858407707529880 131616384465004827308605352304 281512822327926991743405892428 578242553970877064121590481744 1141268198626731047608402266600 2165483248676361474949276095600 3952006928834359691782428874470 6940109728684729214837436072240 11732090255633708910796618122120 19098751578938595901296820198800 29950314976062798117942740766300 45258253741606006044891252713520 65919630449730487065385085474040 92567991695366215879051396623120 125352488754141750669548766260475 163725699597246368221451449809600 206294381492530423959028826760096 250789248088958554616858573708352 294195079488970612146699480696336 333051033383740315637772997014720 363889092030382937456085311553120 383737587959312915862780874001472 390590044887157789360330532465784 383737587959312915862780874001472 363889092030382937456085311553120 333051033383740315637772997014720 294195079488970612146699480696336 250789248088958554616858573708352 206294381492530423959028826760096 163725699597246368221451449809600 125352488754141750669548766260475 92567991695366215879051396623120 65919630449730487065385085474040 45258253741606006044891252713520 29950314976062798117942740766300 19098751578938595901296820198800 11732090255633708910796618122120 6940109728684729214837436072240 3952006928834359691782428874470 2165483248676361474949276095600 1141268198626731047608402266600 578242553970877064121590481744 281512822327926991743405892428 131616384465004827308605352304 59058634054809858407707529880 25417639972956141593190582480 10484776488844408407191115273 4142133921518778630001428256 1565928677647343140610296048 565998317221931255642275680 195404180945666743019357080 64368436076219632994611744 20208695047185233614587408 6039380129043862919301984 1715732991205642874801700 462669570662195831407200 118237779169227823581840 28584957601351781525280 6524827278569428391640 1403188662057941589600 283623240203200959600 53739140249027550240 9516306085765295355 1569699972909739440 240260199935164200 33976189889821200 4416904685676756 524780754733872 56594002961496 5494563394320 475491062970 36227890512 2392407864 134153712 6210820 227920 6216 112 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 113 6328 234136 6438740 140364532 2526561576 38620298376 511718953482 5970054457290 62088566355816 581374757695368 4941685440410628 38393094575497956 274236389824985400 1809960172844903640 11086006058675034795 63255446334792845595 337362380452228509840 1686811902261142549200 7928015940627369981240 35109784879921209916920 146822736770579605107120 580907349831423654989040 2178402561867838706208900 7755113120249505794103684 26248075176229096533889392 84577131123404866609199152 259772617021886376013968824 761402498167597998661632760 2131926994869274396252571728 5708062599166121770611724304 14626910410363187037192543529 35902416461800550000381697753 84476274027766000000898112360 190675018519814685716312882184 413129206792931819052011244732 859755376298804055864996374172 1719510752597608111729992748344 3306751447303092522557678362200 6117490177510721166731704970070 10892116657519088906619864946710 18672199984318438125634054194360 30830841834572304812093438320920 49049066555001394019239560965100 75208568717668804162833993479820 111177884191336493110276338187560 158487622145096702944436482097160 217920480449507966548600162883595 289078188351388118891000216070075 370020081089776792180480276569696 457083629581488978575887400468448 544984327577929166763558054404688 627246112872710927784472477711056 696940125414123253093858308567840 747626679989695853318866185554592 774327632846470705223111406467256 774327632846470705223111406467256 747626679989695853318866185554592 696940125414123253093858308567840 627246112872710927784472477711056 544984327577929166763558054404688 457083629581488978575887400468448 370020081089776792180480276569696 289078188351388118891000216070075 217920480449507966548600162883595 158487622145096702944436482097160 111177884191336493110276338187560 75208568717668804162833993479820 49049066555001394019239560965100 30830841834572304812093438320920 18672199984318438125634054194360 10892116657519088906619864946710 6117490177510721166731704970070 3306751447303092522557678362200 1719510752597608111729992748344 859755376298804055864996374172 413129206792931819052011244732 190675018519814685716312882184 84476274027766000000898112360 35902416461800550000381697753 14626910410363187037192543529 5708062599166121770611724304 2131926994869274396252571728 761402498167597998661632760 259772617021886376013968824 84577131123404866609199152 26248075176229096533889392 7755113120249505794103684 2178402561867838706208900 580907349831423654989040 146822736770579605107120 35109784879921209916920 7928015940627369981240 1686811902261142549200 337362380452228509840 63255446334792845595 11086006058675034795 1809960172844903640 274236389824985400 38393094575497956 4941685440410628 581374757695368 62088566355816 5970054457290 511718953482 38620298376 2526561576 140364532 6438740 234136 6328 113 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 114 6441 240464 6672876 146803272 2666926108 41146859952 550339251858 6481773410772 68058620813106 643463324051184 5523060198105996 43334780015908584 312629484400483356 2084196562669889040 12895966231519938435 74341452393467880390 400617826787021355435 2024174282713371059040 9614827842888512530440 43037800820548579898160 181932521650500815024040 727730086602003260096160 2759309911699262361197940 9933515682117344500312584 34003188296478602327993076 110825206299633963143088544 344349748145291242623167976 1021175115189484374675601584 2893329493036872394914204488 7839989594035396166864296032 20334973009529308807804267833 50529326872163737037574241282 120378690489566550001279810113 275151292547580685717210994544 603804225312746504768324126916 1272884583091735874917007618904 2579266128896412167594989122516 5026262199900700634287671110544 9424241624813813689289383332270 17009606835029810073351569916780 29564316641837527032253919141070 49503041818890742937727492515280 79879908389573698831332999286020 124257635272670198182073554444920 186386452909005297273110331667380 269665506336433196054712820284720 376408102594604669493036644980755 506998668800896085439600378953670 659098269441164911071480492639771 827103710671265770756367677038144 1002067957159418145339445454873136 1172230440450640094548030532115744 1324186238286834180878330786278896 1444566805403819106412724494122432 1521954312836166558541977592021848 1548655265692941410446222812934512 1521954312836166558541977592021848 1444566805403819106412724494122432 1324186238286834180878330786278896 1172230440450640094548030532115744 1002067957159418145339445454873136 827103710671265770756367677038144 659098269441164911071480492639771 506998668800896085439600378953670 376408102594604669493036644980755 269665506336433196054712820284720 186386452909005297273110331667380 124257635272670198182073554444920 79879908389573698831332999286020 49503041818890742937727492515280 29564316641837527032253919141070 17009606835029810073351569916780 9424241624813813689289383332270 5026262199900700634287671110544 2579266128896412167594989122516 1272884583091735874917007618904 603804225312746504768324126916 275151292547580685717210994544 120378690489566550001279810113 50529326872163737037574241282 20334973009529308807804267833 7839989594035396166864296032 2893329493036872394914204488 1021175115189484374675601584 344349748145291242623167976 110825206299633963143088544 34003188296478602327993076 9933515682117344500312584 2759309911699262361197940 727730086602003260096160 181932521650500815024040 43037800820548579898160 9614827842888512530440 2024174282713371059040 400617826787021355435 74341452393467880390 12895966231519938435 2084196562669889040 312629484400483356 43334780015908584 5523060198105996 643463324051184 68058620813106 6481773410772 550339251858 41146859952 2666926108 146803272 6672876 240464 6441 114 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 115 6555 246905 6913340 153476148 2813729380 43813786060 591486111810 7032112662630 74540394223878 711521944864290 6166523522157180 48857840214014580 355964264416391940 2396826047070372396 14980162794189827475 87237418624987818825 474959279180489235825 2424792109500392414475 11639002125601883589480 52652628663437092428600 224970322471049394922200 909662608252504075120200 3487039998301265621294100 12692825593816606861510524 43936703978595946828305660 144828394596112565471081620 455174954444925205766256520 1365524863334775617298769560 3914504608226356769589806072 10733319087072268561778500520 28174962603564704974668563865 70864299881693045845378509115 170908017361730287038854051395 395529983037147235718490804657 878955517860327190485535121460 1876688808404482379685331745820 3852150711988148042511996741420 7605528328797112801882660233060 14450503824714514323577054442814 26433848459843623762640953249050 46573923476867337105605489057850 79067358460728269969981411656350 129382950208464441769060491801300 204137543662243897013406553730940 310644088181675495455183886112300 456051959245438493327823151952100 646073608931037865547749465265475 883406771395500754932637023934425 1166096938242060996511080871593441 1486201980112430681827848169677915 1829171667830683916095813131911280 2174298397610058239887475986988880 2496416678737474275426361318394640 2768753043690653287291055280401328 2966521118239985664954702086144280 3070609578529107968988200404956360 3070609578529107968988200404956360 2966521118239985664954702086144280 2768753043690653287291055280401328 2496416678737474275426361318394640 2174298397610058239887475986988880 1829171667830683916095813131911280 1486201980112430681827848169677915 1166096938242060996511080871593441 883406771395500754932637023934425 646073608931037865547749465265475 456051959245438493327823151952100 310644088181675495455183886112300 204137543662243897013406553730940 129382950208464441769060491801300 79067358460728269969981411656350 46573923476867337105605489057850 26433848459843623762640953249050 14450503824714514323577054442814 7605528328797112801882660233060 3852150711988148042511996741420 1876688808404482379685331745820 878955517860327190485535121460 395529983037147235718490804657 170908017361730287038854051395 70864299881693045845378509115 28174962603564704974668563865 10733319087072268561778500520 3914504608226356769589806072 1365524863334775617298769560 455174954444925205766256520 144828394596112565471081620 43936703978595946828305660 12692825593816606861510524 3487039998301265621294100 909662608252504075120200 224970322471049394922200 52652628663437092428600 11639002125601883589480 2424792109500392414475 474959279180489235825 87237418624987818825 14980162794189827475 2396826047070372396 355964264416391940 48857840214014580 6166523522157180 711521944864290 74540394223878 7032112662630 591486111810 43813786060 2813729380 153476148 6913340 246905 6555 115 1 0 0 0 0 0 0 0 0 0 0 0 0 1 116 6670 253460 7160245 160389488 2967205528 46627515440 635299897870 7623598774440 81572506886508 786062339088168 6878045467021470 55024363736171760 404822104630406520 2752790311486764336 17376988841260199871 102217581419177646300 562196697805477054650 2899751388680881650300 14063794235102276003955 64291630789038976018080 277622951134486487350800 1134632930723553470042400 4396702606553769696414300 16179865592117872482804624 56629529572412553689816184 188765098574708512299387280 600003349041037771237338140 1820699817779700823065026080 5280029471561132386888575632 14647823695298625331368306592 38908281690636973536447064385 99039262485257750820047072980 241772317243423332884232560510 566438000398877522757344856052 1274485500897474426204025926117 2755644326264809570170866867280 5728839520392630422197328487240 11457679040785260844394656974480 22056032153511627125459714675874 40884352284558138086218007691864 73007771936710960868246442306900 125641281937595607075586900714200 208450308669192711739041903457650 333520493870708338782467045532240 514781631843919392468590439843240 766696047427113988783007038064400 1102125568176476358875572617217575 1529480380326538620480386489199900 2049503709637561751443717895527866 2652298918354491678338929041271356 3315373647943114597923661301589195 4003470065440742155983289118900160 4670715076347532515313837305383520 5265169722428127562717416598795968 5735274161930638952245757366545608 6037130696769093633942902491100640 6141219157058215937976400809912720 6037130696769093633942902491100640 5735274161930638952245757366545608 5265169722428127562717416598795968 4670715076347532515313837305383520 4003470065440742155983289118900160 3315373647943114597923661301589195 2652298918354491678338929041271356 2049503709637561751443717895527866 1529480380326538620480386489199900 1102125568176476358875572617217575 766696047427113988783007038064400 514781631843919392468590439843240 333520493870708338782467045532240 208450308669192711739041903457650 125641281937595607075586900714200 73007771936710960868246442306900 40884352284558138086218007691864 22056032153511627125459714675874 11457679040785260844394656974480 5728839520392630422197328487240 2755644326264809570170866867280 1274485500897474426204025926117 566438000398877522757344856052 241772317243423332884232560510 99039262485257750820047072980 38908281690636973536447064385 14647823695298625331368306592 5280029471561132386888575632 1820699817779700823065026080 600003349041037771237338140 188765098574708512299387280 56629529572412553689816184 16179865592117872482804624 4396702606553769696414300 1134632930723553470042400 277622951134486487350800 64291630789038976018080 14063794235102276003955 2899751388680881650300 562196697805477054650 102217581419177646300 17376988841260199871 2752790311486764336 404822104630406520 55024363736171760 6878045467021470 786062339088168 81572506886508 7623598774440 635299897870 46627515440 2967205528 160389488 7160245 253460 6670 116 1 0 0 0 0 0 0 0 0 0 0 0 1 117 6786 260130 7413705 167549733 3127595016 49594720968 681927413310 8258898672310 89196105660948 867634845974676 7664107806109638 61902409203193230 459846468366578280 3157612416117170856 20129779152746964207 119594570260437846171 664414279224654700950 3461948086486358704950 16963545623783157654255 78355425024141252022035 341914581923525463368880 1412255881858039957393200 5531335537277323166456700 20576568198671642179218924 72809395164530426172620808 245394628147121065989203464 788768447615746283536725420 2420703166820738594302364220 7100729289340833209953601712 19927853166859757718256882224 53556105385935598867815370977 137947544175894724356494137365 340811579728681083704279633490 808210317642300855641577416562 1840923501296351948961370782169 4030129827162283996374892793397 8484483846657439992368195354520 17186518561177891266591985461720 33513711194296887969854371650354 62940384438069765211677722367738 113892124221269098954464449998764 198649053874306567943833343021100 334091590606788318814628804171850 541970802539901050521508948989890 848302125714627731251057485375480 1281477679271033381251597477907640 1868821615603590347658579655281975 2631605948503014979355959106417475 3578984089964100371924104384727766 4701802627992053429782646936799222 5967672566297606276262590342860551 7318843713383856753906950420489355 8674185141788274671297126424283680 9935884798775660078031253904179488 11000443884358766514963173965341576 11772404858699732586188659857646248 12178349853827309571919303301013360 12178349853827309571919303301013360 11772404858699732586188659857646248 11000443884358766514963173965341576 9935884798775660078031253904179488 8674185141788274671297126424283680 7318843713383856753906950420489355 5967672566297606276262590342860551 4701802627992053429782646936799222 3578984089964100371924104384727766 2631605948503014979355959106417475 1868821615603590347658579655281975 1281477679271033381251597477907640 848302125714627731251057485375480 541970802539901050521508948989890 334091590606788318814628804171850 198649053874306567943833343021100 113892124221269098954464449998764 62940384438069765211677722367738 33513711194296887969854371650354 17186518561177891266591985461720 8484483846657439992368195354520 4030129827162283996374892793397 1840923501296351948961370782169 808210317642300855641577416562 340811579728681083704279633490 137947544175894724356494137365 53556105385935598867815370977 19927853166859757718256882224 7100729289340833209953601712 2420703166820738594302364220 788768447615746283536725420 245394628147121065989203464 72809395164530426172620808 20576568198671642179218924 5531335537277323166456700 1412255881858039957393200 341914581923525463368880 78355425024141252022035 16963545623783157654255 3461948086486358704950 664414279224654700950 119594570260437846171 20129779152746964207 3157612416117170856 459846468366578280 61902409203193230 7664107806109638 867634845974676 89196105660948 8258898672310 681927413310 49594720968 3127595016 167549733 7413705 260130 6786 117 1 0 0 0 0 0 0 0 0 0 0 1 118 6903 266916 7673835 174963438 3295144749 52722315984 731522134278 8940826085620 97455004333258 956830951635624 8531742652084314 69566517009302868 521748877569771510 3617458884483749136 23287391568864135063 139724349413184810378 784008849485092547121 4126362365711013405900 20425493710269516359205 95318970647924409676290 420270006947666715390915 1754170463781565420762080 6943591419135363123849900 26107903735948965345675624 93385963363202068351839732 318204023311651492161824272 1034163075762867349525928884 3209471614436484877839089640 9521432456161571804255965932 27028582456200590928210483936 73483958552795356586072253201 191503649561830323224309508342 478759123904575808060773770855 1149021897370981939345857050052 2649133818938652804602948198731 5871053328458635945336263575566 12514613673819723988743088147917 25671002407835331258960180816240 50700229755474779236446357112074 96454095632366653181532094018092 176832508659338864166142172366502 312541178095575666898297793019864 532740644481094886758462147192950 876062393146689369336137753161740 1390272928254528781772566434365370 2129779804985661112502654963283120 3150299294874623728910177133189615 4500427564106605327014538761699450 6210590038467115351280063491145241 8280786717956153801706751321526988 10669475194289659706045237279659773 13286516279681463030169540763349906 15993028855172131425204076844773035 18610069940563934749328380328463168 20936328683134426592994427869521064 22772848743058499101151833822987824 23950754712527042158107963158659608 24356699707654619143838606602026720 23950754712527042158107963158659608 22772848743058499101151833822987824 20936328683134426592994427869521064 18610069940563934749328380328463168 15993028855172131425204076844773035 13286516279681463030169540763349906 10669475194289659706045237279659773 8280786717956153801706751321526988 6210590038467115351280063491145241 4500427564106605327014538761699450 3150299294874623728910177133189615 2129779804985661112502654963283120 1390272928254528781772566434365370 876062393146689369336137753161740 532740644481094886758462147192950 312541178095575666898297793019864 176832508659338864166142172366502 96454095632366653181532094018092 50700229755474779236446357112074 25671002407835331258960180816240 12514613673819723988743088147917 5871053328458635945336263575566 2649133818938652804602948198731 1149021897370981939345857050052 478759123904575808060773770855 191503649561830323224309508342 73483958552795356586072253201 27028582456200590928210483936 9521432456161571804255965932 3209471614436484877839089640 1034163075762867349525928884 318204023311651492161824272 93385963363202068351839732 26107903735948965345675624 6943591419135363123849900 1754170463781565420762080 420270006947666715390915 95318970647924409676290 20425493710269516359205 4126362365711013405900 784008849485092547121 139724349413184810378 23287391568864135063 3617458884483749136 521748877569771510 69566517009302868 8531742652084314 956830951635624 97455004333258 8940826085620 731522134278 52722315984 3295144749 174963438 7673835 266916 6903 118 1 0 0 0 0 0 0 0 0 0 1 119 7021 273819 7940751 182637273 3470108187 56017460733 784244450262 9672348219898 106395830418878 1054285955968882 9488573603719938 78098259661387182 591315394579074378 4139207762053520646 26904850453347884199 163011740982048945441 923733198898277357499 4910371215196105953021 24551856075980529765105 115744464358193926035495 515588977595591125067205 2174440470729232136152995 8697761882916928544611980 33051495155084328469525524 119493867099151033697515356 411589986674853560513664004 1352367099074518841687753156 4243634690199352227365018524 12730904070598056682095055572 36550014912362162732466449868 100512541008995947514282737137 264987608114625679810381761543 670262773466406131285083279197 1627781021275557747406630820907 3798155716309634743948805248783 8520187147397288749939211774297 18385667002278359934079351723483 38185616081655055247703268964157 76371232163310110495406537928314 147154325387841432417978451130166 273286604291705517347674266384594 489373686754914531064439965386366 845281822576670553656759940212814 1408803037627784256094599900354690 2266335321401218151108704187527110 3520052733240189894275221397648490 5280079099860284841412832096472735 7650726858981229055924715894889065 10711017602573720678294602252844691 14491376756423269152986814812672229 18950261912245813507751988601186761 23955991473971122736214778043009679 29279545134853594455373617608122941 34603098795736066174532457173236203 39546398623698361342322808197984232 43709177426192925694146261692508888 46723603455585541259259796981647432 48307454420181661301946569760686328 48307454420181661301946569760686328 46723603455585541259259796981647432 43709177426192925694146261692508888 39546398623698361342322808197984232 34603098795736066174532457173236203 29279545134853594455373617608122941 23955991473971122736214778043009679 18950261912245813507751988601186761 14491376756423269152986814812672229 10711017602573720678294602252844691 7650726858981229055924715894889065 5280079099860284841412832096472735 3520052733240189894275221397648490 2266335321401218151108704187527110 1408803037627784256094599900354690 845281822576670553656759940212814 489373686754914531064439965386366 273286604291705517347674266384594 147154325387841432417978451130166 76371232163310110495406537928314 38185616081655055247703268964157 18385667002278359934079351723483 8520187147397288749939211774297 3798155716309634743948805248783 1627781021275557747406630820907 670262773466406131285083279197 264987608114625679810381761543 100512541008995947514282737137 36550014912362162732466449868 12730904070598056682095055572 4243634690199352227365018524 1352367099074518841687753156 411589986674853560513664004 119493867099151033697515356 33051495155084328469525524 8697761882916928544611980 2174440470729232136152995 515588977595591125067205 115744464358193926035495 24551856075980529765105 4910371215196105953021 923733198898277357499 163011740982048945441 26904850453347884199 4139207762053520646 591315394579074378 78098259661387182 9488573603719938 1054285955968882 106395830418878 9672348219898 784244450262 56017460733 3470108187 182637273 7940751 273819 7021 119 1 0 0 0 0 0 0 0 0 1 120 7140 280840 8214570 190578024 3652745460 59487568920 840261910995 10456592670160 116068178638776 1160681786387760 10542859559688820 87586833265107120 669413654240461560 4730523156632595024 31044058215401404845 189916591435396829640 1086744939880326302940 5834104414094383310520 29462227291176635718126 140296320434174455800600 631333441953785051102700 2690029448324823261220200 10872202353646160680764975 41749257038001257014137504 152545362254235362167040880 531083853774004594211179360 1763957085749372402201417160 5596001789273871069052771680 16974538760797408909460074096 49280918982960219414561505440 137062555921358110246749187005 365500149123621627324664498680 935250381581031811095465040740 2298043794741963878691714100104 5425936737585192491355436069690 12318342863706923493888017023080 26905854149675648684018563497780 56571283083933415181782620687640 114556848244965165743109806892471 223525557551151542913384989058480 420440929679546949765652717514760 762660291046620048412114231770960 1334655509331585084721199905599180 2254084860204454809751359840567504 3675138359029002407203304087881800 5786388054641408045383925585175600 8800131833100474735688053494121225 12930805958841513897337547991361800 18361744461554949734219318147733756 25202394358996989831281417065516920 33441638668669082660738803413858990 42906253386216936243966766644196440 53235536608824717191588395651132620 63882643930589660629906074781359144 74149497419434427516855265371220435 83255576049891287036469069890493120 90432780881778466953406058674156320 95031057875767202561206366742333760 96614908840363322603893139521372656 95031057875767202561206366742333760 90432780881778466953406058674156320 83255576049891287036469069890493120 74149497419434427516855265371220435 63882643930589660629906074781359144 53235536608824717191588395651132620 42906253386216936243966766644196440 33441638668669082660738803413858990 25202394358996989831281417065516920 18361744461554949734219318147733756 12930805958841513897337547991361800 8800131833100474735688053494121225 5786388054641408045383925585175600 3675138359029002407203304087881800 2254084860204454809751359840567504 1334655509331585084721199905599180 762660291046620048412114231770960 420440929679546949765652717514760 223525557551151542913384989058480 114556848244965165743109806892471 56571283083933415181782620687640 26905854149675648684018563497780 12318342863706923493888017023080 5425936737585192491355436069690 2298043794741963878691714100104 935250381581031811095465040740 365500149123621627324664498680 137062555921358110246749187005 49280918982960219414561505440 16974538760797408909460074096 5596001789273871069052771680 1763957085749372402201417160 531083853774004594211179360 152545362254235362167040880 41749257038001257014137504 10872202353646160680764975 2690029448324823261220200 631333441953785051102700 140296320434174455800600 29462227291176635718126 5834104414094383310520 1086744939880326302940 189916591435396829640 31044058215401404845 4730523156632595024 669413654240461560 87586833265107120 10542859559688820 1160681786387760 116068178638776 10456592670160 840261910995 59487568920 3652745460 190578024 8214570 280840 7140 120 1 0 0 0 0 0 0 0 1 121 7260 287980 8495410 198792594 3843323484 63140314380 899749479915 11296854581155 126524771308936 1276749965026536 11703541346076580 98129692824795940 757000487505568680 5399936810873056584 35774581372033999869 220960649650798234485 1276661531315723132580 6920849353974709613460 35296331705271019028646 169758547725351091518726 771629762387959506903300 3321362890278608312322900 13562231801970983941985175 52621459391647417694902479 194294619292236619181178384 683629216028239956378220240 2295040939523376996412596520 7359958875023243471254188840 22570540550071279978512845776 66255457743757628324021579536 186343474904318329661310692445 502562705044979737571413685685 1300750530704653438420129539420 3233294176322995689787179140844 7723980532327156370047150169794 17744279601292115985243453092770 39224197013382572177906580520860 83477137233609063865801184185420 171128131328898580924892427580111 338082405796116708656494795950951 643966487230698492679037706573240 1183101220726166998177766949285720 2097315800378205133133314137370140 3588740369536039894472559746166684 5929223219233457216954663928449304 9461526413670410452587229673057400 14586519887741882781071979079296825 21730937791941988633025601485483025 31292550420396463631556866139095556 43564138820551939565500735213250676 58644033027666072492020220479375910 76347892054886018904705570058055430 96141789995041653435555162295329060 117118180539414377821494470432491764 138032141350024088146761340152579579 157405073469325714553324335261713555 173688356931669753989875128564649440 185463838757545669514612425416490080 191645966716130525165099506263706416 191645966716130525165099506263706416 185463838757545669514612425416490080 173688356931669753989875128564649440 157405073469325714553324335261713555 138032141350024088146761340152579579 117118180539414377821494470432491764 96141789995041653435555162295329060 76347892054886018904705570058055430 58644033027666072492020220479375910 43564138820551939565500735213250676 31292550420396463631556866139095556 21730937791941988633025601485483025 14586519887741882781071979079296825 9461526413670410452587229673057400 5929223219233457216954663928449304 3588740369536039894472559746166684 2097315800378205133133314137370140 1183101220726166998177766949285720 643966487230698492679037706573240 338082405796116708656494795950951 171128131328898580924892427580111 83477137233609063865801184185420 39224197013382572177906580520860 17744279601292115985243453092770 7723980532327156370047150169794 3233294176322995689787179140844 1300750530704653438420129539420 502562705044979737571413685685 186343474904318329661310692445 66255457743757628324021579536 22570540550071279978512845776 7359958875023243471254188840 2295040939523376996412596520 683629216028239956378220240 194294619292236619181178384 52621459391647417694902479 13562231801970983941985175 3321362890278608312322900 771629762387959506903300 169758547725351091518726 35296331705271019028646 6920849353974709613460 1276661531315723132580 220960649650798234485 35774581372033999869 5399936810873056584 757000487505568680 98129692824795940 11703541346076580 1276749965026536 126524771308936 11296854581155 899749479915 63140314380 3843323484 198792594 8495410 287980 7260 121 1 0 0 0 0 0 0 1 122 7381 295240 8783390 207288004 4042116078 66983637864 962889794295 12196604061070 137821625890091 1403274736335472 12980291311103116 109833234170872520 855130180330364620 6156937298378625264 41174518182907056453 256735231022832234354 1497622180966521367065 8197510885290432746040 42217181059245728642106 205054879430622110547372 941388310113310598422026 4092992652666567819226200 16883594692249592254308075 66183691193618401636887654 246916078683884036876080863 877923835320476575559398624 2978670155551616952790816760 9654999814546620467666785360 29930499425094523449767034616 88825998293828908302534425312 252598932648075957985332271981 688906179949298067232724378130 1803313235749633175991543225105 4534044707027649128207308680264 10957274708650152059834329310638 25468260133619272355290603262564 56968476614674688163150033613630 122701334246991636043707764706280 254605268562507644790693611765531 509210537125015289581387223531062 982048893026815201335532502524191 1827067707956865490856804655858960 3280417021104372131311081086655860 5686056169914245027605873883536824 9517963588769497111427223674615988 15390749632903867669541893601506704 24048046301412293233659208752354225 36317457679683871414097580564779850 53023488212338452264582467624578581 74856689240948403197057601352346232 102208171848218012057520955692626586 134991925082552091396725790537431340 172489682049927672340260732353384490 213259970534456031257049632727820824 255150321889438465968255810585071343 295437214819349802700085675414293134 331093430400995468543199463826362995 359152195689215423504487553981139520 377109805473676194679711931680196496 383291933432261050330199012527412832 377109805473676194679711931680196496 359152195689215423504487553981139520 331093430400995468543199463826362995 295437214819349802700085675414293134 255150321889438465968255810585071343 213259970534456031257049632727820824 172489682049927672340260732353384490 134991925082552091396725790537431340 102208171848218012057520955692626586 74856689240948403197057601352346232 53023488212338452264582467624578581 36317457679683871414097580564779850 24048046301412293233659208752354225 15390749632903867669541893601506704 9517963588769497111427223674615988 5686056169914245027605873883536824 3280417021104372131311081086655860 1827067707956865490856804655858960 982048893026815201335532502524191 509210537125015289581387223531062 254605268562507644790693611765531 122701334246991636043707764706280 56968476614674688163150033613630 25468260133619272355290603262564 10957274708650152059834329310638 4534044707027649128207308680264 1803313235749633175991543225105 688906179949298067232724378130 252598932648075957985332271981 88825998293828908302534425312 29930499425094523449767034616 9654999814546620467666785360 2978670155551616952790816760 877923835320476575559398624 246916078683884036876080863 66183691193618401636887654 16883594692249592254308075 4092992652666567819226200 941388310113310598422026 205054879430622110547372 42217181059245728642106 8197510885290432746040 1497622180966521367065 256735231022832234354 41174518182907056453 6156937298378625264 855130180330364620 109833234170872520 12980291311103116 1403274736335472 137821625890091 12196604061070 962889794295 66983637864 4042116078 207288004 8783390 295240 7381 122 1 0 0 0 0 0 1 123 7503 302621 9078630 216071394 4249404082 71025753942 1029873432159 13159493855365 150018229951161 1541096362225563 14383566047438588 122813525481975636 964963414501237140 7012067478708989884 47331455481285681717 297909749205739290807 1754357411989353601419 9695133066256954113105 50414691944536161388146 247272060489867839189478 1146443189543932708969398 5034380962779878417648226 20976587344916160073534275 83067285885867993891195729 313099769877502438512968517 1124839914004360612435479487 3856593990872093528350215384 12633669970098237420457602120 39585499239641143917433819976 118756497718923431752301459928 341424930941904866287866697293 941505112597374025218056650111 2492219415698931243224267603235 6337357942777282304198851905369 15491319415677801188041637990902 36425534842269424415124932573202 82436736748293960518440636876194 179669810861666324206857798319910 377306602809499280834401376471811 763815805687522934372080835296593 1491259430151830490916919726055253 2809116600983680692192337158383151 5107484729061237622167885742514820 8966473191018617158916954970192684 15204019758683742139033097558152812 24908713221673364780969117276122692 39438795934316160903201102353860929 60365503981096164647756789317134075 89340945892022323678680048189358431 127880177453286855461640068976924813 177064861089166415254578557044972818 237200096930770103454246746230057926 307481607132479763736986522890815830 385749652584383703597310365081205314 468410292423894497225305443312892167 550587536708788268668341485999364477 626530645220345271243285139240656129 690245626090210892047687017807502515 736262001162891618184199485661336016 760401738905937245009910944207609328 760401738905937245009910944207609328 736262001162891618184199485661336016 690245626090210892047687017807502515 626530645220345271243285139240656129 550587536708788268668341485999364477 468410292423894497225305443312892167 385749652584383703597310365081205314 307481607132479763736986522890815830 237200096930770103454246746230057926 177064861089166415254578557044972818 127880177453286855461640068976924813 89340945892022323678680048189358431 60365503981096164647756789317134075 39438795934316160903201102353860929 24908713221673364780969117276122692 15204019758683742139033097558152812 8966473191018617158916954970192684 5107484729061237622167885742514820 2809116600983680692192337158383151 1491259430151830490916919726055253 763815805687522934372080835296593 377306602809499280834401376471811 179669810861666324206857798319910 82436736748293960518440636876194 36425534842269424415124932573202 15491319415677801188041637990902 6337357942777282304198851905369 2492219415698931243224267603235 941505112597374025218056650111 341424930941904866287866697293 118756497718923431752301459928 39585499239641143917433819976 12633669970098237420457602120 3856593990872093528350215384 1124839914004360612435479487 313099769877502438512968517 83067285885867993891195729 20976587344916160073534275 5034380962779878417648226 1146443189543932708969398 247272060489867839189478 50414691944536161388146 9695133066256954113105 1754357411989353601419 297909749205739290807 47331455481285681717 7012067478708989884 964963414501237140 122813525481975636 14383566047438588 1541096362225563 150018229951161 13159493855365 1029873432159 71025753942 4249404082 216071394 9078630 302621 7503 123 1 0 0 0 0 1 124 7626 310124 9381251 225150024 4465475476 75275158024 1100899186101 14189367287524 163177723806526 1691114592176724 15924662409664151 137197091529414224 1087776939983212776 7977030893210227024 54343522959994671601 345241204687024972524 2052267161195092892226 11449490478246307714524 60109825010793115501251 297686752434404000577624 1393715250033800548158876 6180824152323811126617624 26010968307696038491182501 104043873230784153964730004 396167055763370432404164246 1437939683881863050948448004 4981433904876454140785694871 16490263960970330948807817504 52219169209739381337891422096 158341996958564575669735279904 460181428660828298040168157221 1282930043539278891505923347404 3433724528296305268442324253346 8829577358476213547423119508604 21828677358455083492240489896271 51916854257947225603166570564104 118862271590563384933565569449396 262106547609960284725298435196104 556976413671165605041259174791721 1141122408497022215206482211768404 2255075235839353425289000561351846 4300376031135511183109256884438404 7916601330044918314360222900897971 14073957920079854781084840712707504 24170492949702359297950052528345496 40112732980357106920002214834275504 64347509155989525684170219629983621 99804299915412325550957891670995004 149706449873118488326436837506492506 217221123345309179140320117166283244 304945038542453270716218626021897631 414264958019936518708825303275030744 544681704063249867191233269120873756 693231259716863467334296887972021144 854159945008278200822615808394097481 1018997829132682765893646929312256644 1177118181929133539911626625240020606 1316776271310556163290972157048158644 1426507627253102510231886503468838531 1496663740068828863194110429868945344 1520803477811874490019821888415218656 1496663740068828863194110429868945344 1426507627253102510231886503468838531 1316776271310556163290972157048158644 1177118181929133539911626625240020606 1018997829132682765893646929312256644 854159945008278200822615808394097481 693231259716863467334296887972021144 544681704063249867191233269120873756 414264958019936518708825303275030744 304945038542453270716218626021897631 217221123345309179140320117166283244 149706449873118488326436837506492506 99804299915412325550957891670995004 64347509155989525684170219629983621 40112732980357106920002214834275504 24170492949702359297950052528345496 14073957920079854781084840712707504 7916601330044918314360222900897971 4300376031135511183109256884438404 2255075235839353425289000561351846 1141122408497022215206482211768404 556976413671165605041259174791721 262106547609960284725298435196104 118862271590563384933565569449396 51916854257947225603166570564104 21828677358455083492240489896271 8829577358476213547423119508604 3433724528296305268442324253346 1282930043539278891505923347404 460181428660828298040168157221 158341996958564575669735279904 52219169209739381337891422096 16490263960970330948807817504 4981433904876454140785694871 1437939683881863050948448004 396167055763370432404164246 104043873230784153964730004 26010968307696038491182501 6180824152323811126617624 1393715250033800548158876 297686752434404000577624 60109825010793115501251 11449490478246307714524 2052267161195092892226 345241204687024972524 54343522959994671601 7977030893210227024 1087776939983212776 137197091529414224 15924662409664151 1691114592176724 163177723806526 14189367287524 1100899186101 75275158024 4465475476 225150024 9381251 310124 7626 124 1 0 0 0 1 125 7750 317750 9691375 234531275 4690625500 79740633500 1176174344125 15290266473625 177367091094050 1854292315983250 17615777001840875 153121753939078375 1224974031512627000 9064807833193439800 62320553853204898625 399584727647019644125 2397508365882117864750 13501757639441400606750 71559315489039423215775 357796577445197116078875 1691402002468204548736500 7574539402357611674776500 32191792460019849617800125 130054841538480192455912505 500210928994154586368894250 1834106739645233483352612250 6419373588758317191734142875 21471697865846785089593512375 68709433170709712286699239600 210561166168303957007626702000 618523425619392873709903437125 1743111472200107189546091504625 4716654571835584159948247600750 12263301886772518815865443761950 30658254716931297039663609404875 73745531616402309095407060460375 170779125848510610536732140013500 380968819200523669658864004645500 819082961281125889766557609987825 1698098822168187820247741386560125 3396197644336375640495482773120250 6555451266974864608398257445790250 12216977361180429497469479785336375 21990559250124773095445063613605475 38244450869782214079034893241053000 64283225930059466217952267362621000 104460242136346632604172434464259125 164151809071401851235128111300978625 249510749788530813877394729177487510 366927573218427667466756954672775750 522166161887762449856538743188180875 719209996562389789425043929296928375 958946662083186385900058572395904500 1237912963780113334525530157092894900 1547391204725141668156912696366118625 1873157774140960966716262737706354125 2196116011061816305805273554552277250 2493894453239689703202598782288179250 2743283898563658673522858660516997175 2923171367321931373425996933337783875 3017467217880703353213932318284164000 3017467217880703353213932318284164000 2923171367321931373425996933337783875 2743283898563658673522858660516997175 2493894453239689703202598782288179250 2196116011061816305805273554552277250 1873157774140960966716262737706354125 1547391204725141668156912696366118625 1237912963780113334525530157092894900 958946662083186385900058572395904500 719209996562389789425043929296928375 522166161887762449856538743188180875 366927573218427667466756954672775750 249510749788530813877394729177487510 164151809071401851235128111300978625 104460242136346632604172434464259125 64283225930059466217952267362621000 38244450869782214079034893241053000 21990559250124773095445063613605475 12216977361180429497469479785336375 6555451266974864608398257445790250 3396197644336375640495482773120250 1698098822168187820247741386560125 819082961281125889766557609987825 380968819200523669658864004645500 170779125848510610536732140013500 73745531616402309095407060460375 30658254716931297039663609404875 12263301886772518815865443761950 4716654571835584159948247600750 1743111472200107189546091504625 618523425619392873709903437125 210561166168303957007626702000 68709433170709712286699239600 21471697865846785089593512375 6419373588758317191734142875 1834106739645233483352612250 500210928994154586368894250 130054841538480192455912505 32191792460019849617800125 7574539402357611674776500 1691402002468204548736500 357796577445197116078875 71559315489039423215775 13501757639441400606750 2397508365882117864750 399584727647019644125 62320553853204898625 9064807833193439800 1224974031512627000 153121753939078375 17615777001840875 1854292315983250 177367091094050 15290266473625 1176174344125 79740633500 4690625500 234531275 9691375 317750 7750 125 1 0 0 1 126 7875 325500 10009125 244222650 4925156775 84431259000 1255914977625 16466440817750 192657357567675 2031659407077300 19470069317824125 170737530940919250 1378095785451705375 10289781864706066800 71385361686398338425 461905281500224542750 2797093093529137508875 15899266005323518471500 85061073128480823822525 429355892934236539294650 2049198579913401664815375 9265941404825816223513000 39766331862377461292576625 162246633998500042073712630 630265770532634778824806755 2334317668639388069721506500 8253480328403550675086755125 27891071454605102281327655250 90181131036556497376292751975 279270599339013669294325941600 829084591787696830717530139125 2361634897819500063255994941750 6459766044035691349494339105375 16979956458608102975813691362700 42921556603703815855529053166825 104403786333333606135070669865250 244524657464912919632139200473875 551747945049034280195596144659000 1200051780481649559425421614633325 2517181783449313710014298996547950 5094296466504563460743224159680375 9951648911311240248893740218910500 18772428628155294105867737231126625 34207536611305202592914543398941850 60235010119906987174479956854658475 102527676799841680296987160603674000 168743468066406098822124701826880125 268612051207748483839300545765237750 413662558859932665112522840478466135 616438323006958481344151683850263260 889093735106190117323295697860956625 1241376158450152239281582672485109250 1678156658645576175325102501692832875 2196859625863299720425588729488799400 2785304168505255002682442853459013525 3420548978866102634873175434072472750 4069273785202777272521536292258631375 4690010464301506009007872336840456500 5237178351803348376725457442805176425 5666455265885590046948855593854781050 5940638585202634726639929251621947875 6034934435761406706427864636568328000 5940638585202634726639929251621947875 5666455265885590046948855593854781050 5237178351803348376725457442805176425 4690010464301506009007872336840456500 4069273785202777272521536292258631375 3420548978866102634873175434072472750 2785304168505255002682442853459013525 2196859625863299720425588729488799400 1678156658645576175325102501692832875 1241376158450152239281582672485109250 889093735106190117323295697860956625 616438323006958481344151683850263260 413662558859932665112522840478466135 268612051207748483839300545765237750 168743468066406098822124701826880125 102527676799841680296987160603674000 60235010119906987174479956854658475 34207536611305202592914543398941850 18772428628155294105867737231126625 9951648911311240248893740218910500 5094296466504563460743224159680375 2517181783449313710014298996547950 1200051780481649559425421614633325 551747945049034280195596144659000 244524657464912919632139200473875 104403786333333606135070669865250 42921556603703815855529053166825 16979956458608102975813691362700 6459766044035691349494339105375 2361634897819500063255994941750 829084591787696830717530139125 279270599339013669294325941600 90181131036556497376292751975 27891071454605102281327655250 8253480328403550675086755125 2334317668639388069721506500 630265770532634778824806755 162246633998500042073712630 39766331862377461292576625 9265941404825816223513000 2049198579913401664815375 429355892934236539294650 85061073128480823822525 15899266005323518471500 2797093093529137508875 461905281500224542750 71385361686398338425 10289781864706066800 1378095785451705375 170737530940919250 19470069317824125 2031659407077300 192657357567675 16466440817750 1255914977625 84431259000 4925156775 244222650 10009125 325500 7875 126 1 0 1 127 8001 333375 10334625 254231775 5169379425 89356415775 1340346236625 17722355795375 209123798385425 2224316764644975 21501728724901425 190207600258743375 1548833316392624625 11667877650157772175 81675143551104405225 533290643186622881175 3258998375029362051625 18696359098852655980375 100960339133804342294025 514416966062717363117175 2478554472847638204110025 11315139984739217888328375 49032273267203277516089625 202012965860877503366289255 792512404531134820898519385 2964583439172022848546313255 10587797997042938744808261625 36144551783008652956414410375 118072202491161599657620407225 369451730375570166670618693575 1108355191126710500011856080725 3190719489607196893973525080875 8821400941855191412750334047125 23439722502643794325308030468075 59901513062311918831342744529525 147325342937037421990599723032075 348928443798246525767209870339125 796272602513947199827735345132875 1751799725530683839621017759292325 3717233563930963269439720611181275 7611478249953877170757523156228325 15045945377815803709636964378590875 28724077539466534354761477450037125 52979965239460496698782280630068475 94442546731212189767394500253600325 162762686919748667471467117458332475 271271144866247779119111862430554125 437355519274154582661425247592117875 682274610067681148951823386243703885 1030100881866891146456674524328729395 1505532058113148598667447381711219885 2130469893556342356604878370346065875 2919532817095728414606685174177942125 3875016284508875895750691231181632275 4982163794368554723108031582947812925 6205853147371357637555618287531486275 7489822764068879907394711726331104125 8759284249504283281529408629099087875 9927188816104854385733329779645632925 10903633617688938423674313036659957475 11607093851088224773588784845476728925 11975573020964041433067793888190275875 11975573020964041433067793888190275875 11607093851088224773588784845476728925 10903633617688938423674313036659957475 9927188816104854385733329779645632925 8759284249504283281529408629099087875 7489822764068879907394711726331104125 6205853147371357637555618287531486275 4982163794368554723108031582947812925 3875016284508875895750691231181632275 2919532817095728414606685174177942125 2130469893556342356604878370346065875 1505532058113148598667447381711219885 1030100881866891146456674524328729395 682274610067681148951823386243703885 437355519274154582661425247592117875 271271144866247779119111862430554125 162762686919748667471467117458332475 94442546731212189767394500253600325 52979965239460496698782280630068475 28724077539466534354761477450037125 15045945377815803709636964378590875 7611478249953877170757523156228325 3717233563930963269439720611181275 1751799725530683839621017759292325 796272602513947199827735345132875 348928443798246525767209870339125 147325342937037421990599723032075 59901513062311918831342744529525 23439722502643794325308030468075 8821400941855191412750334047125 3190719489607196893973525080875 1108355191126710500011856080725 369451730375570166670618693575 118072202491161599657620407225 36144551783008652956414410375 10587797997042938744808261625 2964583439172022848546313255 792512404531134820898519385 202012965860877503366289255 49032273267203277516089625 11315139984739217888328375 2478554472847638204110025 514416966062717363117175 100960339133804342294025 18696359098852655980375 3258998375029362051625 533290643186622881175 81675143551104405225 11667877650157772175 1548833316392624625 190207600258743375 21501728724901425 2224316764644975 209123798385425 17722355795375 1340346236625 89356415775 5169379425 254231775 10334625 333375 8001 127 1 icon-9.4.3/ipl/data/ones.tur0000664000175000017500000000336707140713044015211 0ustar chrishchrish# From: heim@tub.UUCP (Heiner Marxen) # Newsgroups: sci.math # Subject: busy beaver Turing machine # Date: 24 Aug 89 13:24:10 GMT # Organization: Technical University of Berlin, Germany # # This is about ``busy beavers'' (is there a more appropriate newsgroup?). # Unfortunately I did read this newsgroup only sporadically, and don't know # whether this has been discussed already. My other sources of information # (mainly the German issue of `Scientific American') don't tell me more. # # As far as I know the 5-state busy beaver question is not yet settled. # With the help of a program I have found a 5-state Turing machine which # halts (after 11,798,826 steps) and produces 4098 ones on the tape, namely # A0 -> B1L A1 -> A1L // `A' is the initial state # B0 -> C1R B1 -> B1R // `R' is `move right' # C0 -> A1L C1 -> D1R // `L' is `move left' # D0 -> A1L D1 -> E1R # E0 -> H1R E1 -> C0R // `H' is the halting state # The best machine I knew before produces 1915 ones (published in 1985 # by Scientific American, I believe). My questions are # Q1: Is there ongoing (or completed) research ? Any (theoretic) results ? # Q2: Are there any better 5-state machines known or published ? # Q3: Who else studies the busy beaver problem with general purpose computers? # # Answers to the above, hints and pointers are welcome. # Please answer by e-mail; if appropriate I will summarize to the net. # = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = # Heiner Marxen, from europe: unido!tub!heim # from world: pyramid!tub!heim # bitnet: heim%tub.BITNET@mitvma.MIT.EDU 1. 1l2 1l1 2. 1r3 1r2 3. 1l1 1r4 4. 1l1 1r5 5. 1h0 0r3 icon-9.4.3/ipl/data/spencer.txt0000664000175000017500000000075307140713044015705 0ustar chrishchrishLet us pass to the secondary evolution considered in itself. It involves two great features, -- differentiation and the increase of definiteness through segregation. The differentiation is a cumulative process, due to the fact that a plastic body keeps the traces of what has happened to it, and so constantly prepares a basis for new varieties of effects to be produced upon its various parts. The segregation is due to the sorting types of forces, such as were exemplified in our summary. icon-9.4.3/ipl/data/sample.grh0000664000175000017500000000020707140713044015462 0ustar chrishchrishTucson Phoenix Bisbee Douglas Flagstaff Tucson->Phoenix Tucson->Bisbee Bisbee->Bisbee Bisbee->Douglas Douglas->Phoenix Douglas->Tucson icon-9.4.3/ipl/data/regexp.tok0000664000175000017500000005122007140713044015511 0ustar chrishchrish Unary operators: 1 !e 2 *e 12 -e 19 /e 26 =e 5 @e 13 \e 5 ~e 83 total Binary operators: 5 e1 ! e2 14 e1 & e2 11 e1 + e2 3 e1 ++ e2 2 e1 ++:= e2 1 e1 +:= e2 5 e1 - e2 8 e1 . e2 95 e1 := e2 2 e1 < e2 2 e1 = e2 3 e1 == e2 4 e1 === e2 5 e1 > e2 2 e1 || e2 1 e1 ||:= e2 3 e1 ~== e2 27 e1[e2] 193 total Other operators: 33 (...) 31 [...] 173 e(...) 5 e1[e2:e3] 1 e{...} 243 total Control structures: 2 break 3 case 16 case selector 2 default 14 e1 ; e2 4 e1 ? e2 2 e1 \ e2 71 e1 | e2 3 every e1 do e2 16 fail 10 if e1 then e2 19 if e1 then e2 else e3 3 initial 12 return e 23 suspend e 2 suspend e1 do e2 1 until e1 do e2 4 while e1 do e2 207 total Keywords: 1 &cset 6 &digits 1 &letters 10 &null 10 &pos 4 &subject 32 total Literals: 20 0 56 1 8 2 1 3 17 "" 2 "$" 2 "(" 2 ")" 1 "*" 1 "+" 1 "," 2 "-" 1 "." 1 ".*" 1 "=" 1 "?" 1 "D" 1 "S" 1 "W" 1 "[" 3 "\\" 1 "\\B" 1 "\\D" 1 "\\S" 1 "\\W" 1 "\\b" 1 "\\d" 1 "\\s" 1 "\\w" 1 "]" 2 "^" 1 "_" 1 "d" 3 "list" 1 "s" 1 "w" 1 "{" 3 "|" 1 "}" 1 '()*+.?[\\{|' 1 '(*+.?[\\{|' 1 '-\\' 1 '123456789' 1 'BDSWbdsw' 1 '\t\n\v\f\r ' 153 total Variable references: 1 C 2 L 1 ReCaseDependent 2 RePat 2 Re_Alt 2 Re_AnyString 5 Re_Arb 5 Re_ArbNo 2 Re_ArbString 1 Re_Default 6 Re_Digits 2 Re_Filter 1 Re_LeftmostShortest 2 Re_MatchParenGroup 2 Re_MatchReg 2 Re_NOrMoreTimes 5 Re_NTimes 2 Re_NToMTimes 3 Re_NonDigits 3 Re_NonSpace 2 Re_NonWordBoundary 5 Re_NonWordChars 2 Re_OneOrMore 1 Re_Ordered 11 Re_ParenGroups 6 Re_Space 8 Re_TabAny 24 Re_Tok 2 Re_WordBoundary 8 Re_WordChars 1 Re_ZeroOrOneTimes 3 Re__any 4 Re__find 2 Re__many 3 Re__match 6 Re__tabmatch 3 Re__upto 1 Re_c_tabmatch 1 Re_cset 5 Re_match1 3 Re_pat1 6 Re_prevTok 1 Re_result_merge 8 Re_skip 1 Re_string 5 Re_tok_match 17 any 12 args 4 c 1 c_any 1 c_many 2 c_match 2 c_upto 2 ch 3 chars 2 comma 2 complement 1 copy 4 cset 8 e 3 e1 4 e2 6 find 3 groupNbr 14 i 8 i1 6 i2 5 integer 3 lastPList 3 lastString 6 lastTok 6 level 4 m 3 many 5 match 13 move 14 n 3 newPos 2 nondigits 6 nonwd 2 ord 1 origPos 8 p 2 parenNbr 36 plist 12 pos 7 prc 1 proc 1 pull 1 push 3 put 2 r 7 r1 8 r2 3 result 3 results 29 s 3 special 1 string 25 tab 16 tok 1 tokList 1 tokList1 1 tokList2 3 type 1 untab 5 upto 6 wd 4 x 544 total Field references: 5 args 3 proc 8 total Declarations: 6 global 1 invocable 1 link 14 local 44 procedure 1 record 3 static 70 total Globals: 1 Re_AnyString 1 Re_ArbString 1 Re_Digits 1 Re_Filter 1 Re_NonDigits 1 Re_NonSpace 1 Re_NonWordChars 1 Re_Ordered 1 Re_ParenGroups 1 Re_Space 1 Re_WordChars 1 Re__any 1 Re__find 1 Re__many 1 Re__match 1 Re__tabmatch 1 Re__upto 17 total Locals: 1 args 2 c 1 ch 1 chars 1 comma 1 complement 1 e 1 e1 1 e2 2 i 1 lastTok 1 m 1 n 1 newPos 4 p 2 plist 2 prc 1 r 1 r1 1 r2 1 result 1 results 5 s 1 special 1 tok 1 x 37 total Statics: 1 lastPList 1 lastString 1 nondigits 1 parenNbr 4 total Procedure parameters: 1 C 1 L 1 groupNbr 4 i 2 i1 2 i2 2 level 1 m 4 n 2 nonwd 1 origPos 7 plist 4 s 7 tok 1 tokList 1 tokList1 1 tokList2 2 wd 44 total Record fields: 1 args 1 proc 2 total Included files: 1 noncase 1 total Total tokens: 1638 icon-9.4.3/ipl/data/cc.tur0000664000175000017500000000011307140713044014614 0ustar chrishchrish# castor citcuitus 1. 0r2 0l1 2. 1r3 0h0 3. 0l3 1r4 4. 0l4 1r5 5. 1l1 0l5 icon-9.4.3/ipl/data/cm.tur0000664000175000017500000000011707140713044014632 0ustar chrishchrish# castor ministerialis 1. 1r2 1r1 2. 1r3 0r5 3. 1l4 0r1 4. 1l2 1l4 5. 0h0 0r2 icon-9.4.3/ipl/data/exp.rsg0000664000175000017500000000017507140713044015014 0ustar chrishchrish::=|||+ ::=||* ::=<'xyz'>|<'0123'>|() 30 icon-9.4.3/ipl/data/dylan.txt0000664000175000017500000000763507140713044015363 0ustar chrishchrishstay in line. stay in step. people are afraid of someone who is not in step with them. it makes them look foolish t' themselves for being in step. it might even cross their mind that they themselves are in the wrong step. do not run nor cross the red line. if you go too far out in any direction, they will lose sight of you. they'll feel threatened. thinking that they are not a part of something they saw go past them, they'll feel something's going on up there that they don't know of. revenge will set in. they will start thinking of how t' get rid of you. act mannerly towards them. if you don't, they will take it personal. as you come directly in contact face t' face, do not make it a secret of how much you need them. if they sense that you have no need for them, the first thing they will do is try t' make you need them. if this doesn't work, they will tell you of how much they don't need you. if you do not show any sadness at a remark such as this, they will immediately tell other people of how much they don't need you. your name will begin to come up in circles where people gather to tell about all the people they don't need. you will begin t' get famous this way. this, though, will only get the people who you don't need in the first place all the more madder. you will become a whole topic of conversation. needless t' say, these people who don't need you will start hating themselves for needing t' talk about you. then you yourself will start hating yourself for causing so much hate. as you can see, it will all end in one great gunburst. never trust a cop in a raincoat. when asked t' define yourself exactly, say you are an exact mathematician. do not say or do anything that he who standing in front of you watching cannot understand, he will feel you know something he doesn't. he will take it as a serious blow. he will react with blinding speed and write your name down. talk on his terms. if his terms are old-fashioned an' you've passed that stage all the more easier t' get back there. say what he can understand clearly. say it simple t' keep your tongue out of your cheek. after he hears you, he can label you good or bad. anyone will do. t' some people, there is only good an' bad. in any case, it will make him feel somewhat important. it is better to stay away from these people. be careful of enthusiasm...it is all temporary and don't let it sway you. when asked if you go t' church, always answer yes, never look at your shoes. when asked what you think of gene autry singing of hard rains gonna fall say that nobody can sing it as good as peter, paul and mary. at the mention of the president's name, eat a pint of yogurt an' go t' sleep early... when asked if you're a communist, sing america the beautiful in an italian accent, beat up nearest street cleaner. if by any chance you're caught naked in a parked car, quick turn the radio on full blast an' pretend you're driving. never leave the house without a jar of peanut butter. do not wear matched socks. when asked to do 100 pushups always smoke a pound of deodorant beforehand. when asked if you're a capitalist, rip open your shirt, sing buddy can you spare a dime with your right foot forward an' proceed t' chew up a dollar bill. do not sign any dotted line. do not fall in trap of criticizing people who do nothing else but criticize. do Not create anything, it will be misinterpreted. it will not change. it will follow you the rest of your life. when asked what you do for a living, say you laugh for a living. be suspicious of people who say that if you are not nice t' them, they will commit suicide. when asked if you care about the world's problems, look deeply into the eyes of he that asks you, he will not ask you again. when asked if you've spent time in jail, announce proudly that some of your best friends've asked you that. beware of bathroom walls that've not been written on. when told t' look at yourself...never look. when asked t' give your real name...never give it. icon-9.4.3/ipl/data/header0000664000175000017500000000062307140713044014654 0ustar chrishchrish############################################################################ # # File: # # Subject: # # Author: # # Date: # ############################################################################ # # Requires: # ############################################################################ # # Links: # ############################################################################ icon-9.4.3/ipl/data/hebcalen.dat0000664000175000017500000001453207140713044015740 0ustar chrishchrish3%8255%8%20%-3762%384 4%23479%9%8%-3742%354 4%24950%8%28%-3722%354 5%501%8%17%-3702%385 6%15725%9%6%-3682%355 6%17196%8%26%-3662%355 6%18667%8%15%-3642%383 1%7971%9%3%-3622%353 1%9442%8%23%-3602%383 2%24666%9%10%-3582%354 3%217%8%30%-3562%354 3%1688%8%19%-3542%384 4%16912%9%7%-3522%354 4%18383%8%27%-3502%354 4%19854%8%17%-3482%385 6%9158%9%5%-3462%355 6%10629%8%25%-3442%355 6%12100%8%14%-3422%383 1%1404%9%2%-3402%353 1%2875%8%23%-3382%383 2%18099%9%10%-3362%354 2%19570%8%30%-3342%354 2%21041%8%19%-3322%384 4%10345%9%7%-3302%354 4%11816%8%28%-3282%354 4%13287%8%17%-3262%385 6%2591%9%5%-3242%353 6%4062%8%25%-3222%383 7%19286%9%11%-3202%355 7%20757%9%2%-3182%353 7%22228%8%22%-3162%383 2%11532%9%8%-3142%355 2%13003%8%28%-3122%355 2%14474%8%17%-3102%385 4%3778%9%7%-3082%354 4%5249%8%27%-3062%354 4%6720%8%16%-3042%383 5%21944%9%4%-3022%353 5%23415%8%24%-3002%383 7%12719%9%11%-2982%355 7%14190%8%31%-2962%355 7%15661%8%20%-2942%385 2%4965%9%8%-2922%355 2%6436%8%28%-2902%355 2%7907%8%18%-2882%385 3%23131%9%7%-2862%354 3%24602%8%27%-2842%383 5%13906%9%13%-2822%355 5%15377%9%2%-2802%355 5%16848%8%22%-2782%385 7%6152%9%10%-2762%355 7%7623%8%30%-2742%355 7%9094%8%19%-2722%385 1%24318%9%7%-2702%355 1%25789%8%28%-2682%355 2%1340%8%17%-2662%385 3%16564%9%6%-2642%354 3%18035%8%24%-2622%384 5%7339%9%12%-2602%354 5%8810%9%2%-2582%354 5%10281%8%22%-2562%385 6%25505%9%10%-2542%355 7%1056%8%30%-2522%355 7%2527%8%19%-2502%385 1%17751%9%8%-2482%355 1%19222%8%28%-2462%383 3%8526%9%15%-2442%354 3%9997%9%6%-2422%354 3%11468%8%24%-2402%384 5%772%9%12%-2382%354 5%2243%9%1%-2362%354 5%3714%8%21%-2342%385 6%18938%9%9%-2322%355 6%20409%8%29%-2302%355 6%21880%8%19%-2282%383 1%11184%9%7%-2262%355 1%12655%8%27%-2242%383 3%1959%9%14%-2222%354 3%3430%9%3%-2202%354 3%4901%8%24%-2182%384 4%20125%9%12%-2162%354 4%21596%9%1%-2142%354 4%23067%8%21%-2122%385 6%12371%9%9%-2102%355 6%13842%8%30%-2082%383 1%3146%9%18%-2062%353 1%4617%9%7%-2042%353 1%6088%8%27%-2022%383 2%21312%9%14%-2002%354 2%22783%9%3%-1982%354 2%24254%8%23%-1962%384 4%13558%9%11%-1942%354 4%15029%8%31%-1922%354 4%16500%8%20%-1902%385 6%5804%9%9%-1882%353 6%7275%8%29%-1862%383 7%22499%9%17%-1842%353 7%23970%9%6%-1822%353 7%25441%8%26%-1802%383 2%14745%9%13%-1782%355 2%16216%9%2%-1762%355 2%17687%8%22%-1742%385 4%6991%9%11%-1722%354 4%8462%8%31%-1702%383 5%23686%9%20%-1682%353 5%25157%9%9%-1662%353 6%708%8%29%-1642%383 7%15932%9%15%-1622%355 7%17403%9%4%-1602%355 7%18874%8%24%-1582%385 2%8178%9%12%-1562%355 2%9649%9%1%-1542%355 2%11120%8%21%-1522%385 4%424%9%10%-1502%354 4%1895%8%31%-1482%383 5%17119%9%17%-1462%355 5%18590%9%6%-1442%355 5%20061%8%28%-1422%383 7%9365%9%14%-1402%355 7%10836%9%4%-1382%355 7%12307%8%24%-1362%385 2%1611%9%12%-1342%355 2%3082%9%1%-1322%385 3%18306%9%21%-1302%354 3%19777%9%11%-1282%354 3%21248%8%31%-1262%383 5%10552%9%17%-1242%355 5%12023%9%6%-1222%355 5%13494%8%26%-1202%385 7%2798%9%14%-1182%355 7%4269%9%3%-1162%355 7%5740%8%23%-1142%385 1%20964%9%11%-1122%355 1%22435%8%31%-1102%385 3%11739%9%21%-1082%354 3%13210%9%10%-1062%354 3%14681%8%28%-1042%384 5%3985%9%16%-1022%354 5%5456%9%5%-1002%354 5%6927%8%26%-982%385 6%22151%9%14%-962%355 6%23622%9%3%-942%385 1%12926%9%22%-922%355 1%14397%9%11%-902%355 1%15868%9%1%-882%383 3%5172%9%19%-862%354 3%6643%9%8%-842%354 3%8114%8%28%-822%384 4%23338%9%16%-802%354 4%24809%9%5%-782%354 5%360%8%25%-762%385 6%15584%9%13%-742%355 6%17055%9%2%-722%383 1%6359%9%21%-702%353 1%7830%9%11%-682%353 1%9301%8%31%-662%383 2%24525%9%18%-642%354 3%76%9%7%-622%354 3%1547%8%27%-602%384 4%16771%9%16%-582%354 4%18242%9%5%-562%385 6%7546%9%24%-542%355 6%9017%9%13%-522%353 6%10488%9%2%-502%383 7%25712%9%22%-482%353 1%1263%9%11%-462%353 1%2734%8%31%-442%383 2%17958%9%18%-422%354 2%19429%9%6%-402%355 2%20900%8%27%-382%384 4%10204%9%15%-362%354 4%11675%9%4%-342%383 6%979%9%23%-322%355 6%2450%9%12%-302%353 6%3921%9%2%-282%383 7%19145%9%19%-262%355 7%20616%9%10%-242%353 7%22087%8%30%-222%383 2%11391%9%16%-202%355 2%12862%9%6%-182%385 4%2166%9%26%-162%354 4%3637%9%15%-142%354 4%5108%9%4%-122%383 5%20332%9%23%-102%353 5%21803%9%13%-82%353 5%23274%9%2%-62%383 7%12578%9%19%-42%355 7%14049%9%8%-22%355 7%15520%8%28%-2%385 2%4824%9%16%19%355 2%6295%9%5%39%385 3%21519%9%25%59%354 3%22990%9%14%79%354 3%24461%9%3%99%383 5%13765%9%21%119%355 5%15236%9%10%139%355 5%16707%8%30%159%385 7%6011%9%18%179%355 7%7482%9%7%199%385 1%22706%9%27%219%355 1%24177%9%16%239%355 1%25648%9%5%259%385 3%14952%9%25%279%354 3%16423%9%14%299%354 3%17894%9%2%319%384 5%7198%9%21%339%354 5%8669%9%10%359%354 5%10140%8%30%379%385 6%25364%9%18%399%355 7%915%9%7%419%385 1%16139%9%26%439%355 1%17610%9%15%459%355 1%19081%9%4%479%383 3%8385%9%22%499%354 3%9856%9%12%519%354 3%11327%9%1%539%384 5%631%9%20%559%354 5%2102%9%9%579%385 6%17326%9%28%599%355 6%18797%9%18%619%355 6%20268%9%7%639%383 1%9572%9%26%659%353 1%11043%9%15%679%355 1%12514%9%4%699%383 3%1818%9%23%719%354 3%3289%9%12%739%354 3%4760%9%1%759%384 4%19984%9%20%779%354 4%21455%9%9%799%385 6%10759%9%28%819%355 6%12230%9%17%839%355 6%13701%9%6%859%383 1%3005%9%25%879%353 1%4476%9%14%899%353 1%5947%9%4%919%383 2%21171%9%22%939%354 2%22642%9%11%959%384 4%11946%9%30%979%354 4%13417%9%19%999%354 4%14888%9%9%1019%385 6%4192%9%28%1039%355 6%5663%9%17%1059%353 6%7134%9%6%1079%383 7%22358%9%25%1099%353 7%23829%9%15%1119%353 7%25300%9%4%1139%383 2%14604%9%21%1159%355 2%16075%9%10%1179%385 4%5379%9%30%1199%354 4%6850%9%19%1219%354 4%8321%9%8%1239%383 5%23545%9%27%1259%353 5%25016%9%16%1279%353 6%567%9%5%1299%383 7%15791%9%23%1319%355 7%17262%9%12%1339%385 2%6566%10%1%1359%355 2%8037%9%20%1379%355 2%9508%9%9%1399%385 3%24732%9%30%1419%354 4%283%9%19%1439%354 4%1754%9%8%1459%383 5%16978%9%25%1479%355 5%18449%9%14%1499%355 5%19920%9%6%1519%383 7%9224%9%23%1539%355 7%10695%9%12%1559%385 1%25919%10%1%1579%355 2%1470%9%20%1599%355 2%2941%9%9%1619%385 3%18165%9%29%1639%354 3%19636%9%18%1659%354 3%21107%9%7%1679%383 5%10411%9%24%1699%355 5%11882%9%14%1719%385 7%1186%10%3%1739%355 7%2657%9%22%1759%355 7%4128%9%11%1779%385 1%19352%9%30%1799%355 1%20823%9%20%1819%355 1%22294%9%9%1839%385 3%11598%9%29%1859%354 3%13069%9%18%1879%354 3%14540%9%5%1899%384 5%3844%9%25%1919%354 5%5315%9%14%1939%385 6%20539%10%3%1959%355 6%22010%9%22%1979%355 6%23481%9%11%1999%385 1%12785%9%30%2019%355 1%14256%9%19%2039%355 1%15727%9%8%2059%383 3%5031%9%26%2079%354 3%6502%9%15%2099%384 4%21726%10%5%2119%354 4%23197%9%24%2139%354 4%24668%9%13%2159%385 6%13972%10%2%2179%355 6%15443%9%21%2199%355 6%16914%9%11%2219%383 1%6218%9%30%2239%353 icon-9.4.3/ipl/data/abc.csg0000664000175000017500000000020007140713044014713 0ustar chrishchrish# a(n)b(n)c(n) # Salomaa, p. 11. # Attributed to M. Soittola. # X->abc X->aYbc Yb->bY Yc->Zbcc bZ->Zb aZ->aaY aZ->aa X:10 icon-9.4.3/ipl/data/skelproc.icn0000664000175000017500000000114707142325611016021 0ustar chrishchrish############################################################################ # # File: # # Subject: Procedure # # Author: # # Date: # ############################################################################ # # This file is in the public domain. # ############################################################################ # # # ############################################################################ # # Requires: # ############################################################################ # # Links: # ############################################################################ icon-9.4.3/ipl/data/add.lbl0000664000175000017500000000023507140713044014723 0ustar chrishchrish#k First Address 80973-000 # Second Address Somewhere, USA 09321 # Third Address -- with no zipcode --- # Fourth Address P.O. Box 78321 Nowhere 83211 icon-9.4.3/ipl/data/bb3.tur0000664000175000017500000000007007140713044014677 0ustar chrishchrish# 3-state busy beaver 1. 1r2 1l3 2. 1l1 1r2 3. 1l2 1h0 icon-9.4.3/ipl/data/an2.csg0000664000175000017500000000026707140713044014663 0ustar chrishchrish# a(n(2)) # Salomma, pp. 12-13. Attributed to M. Soittola. # 2:G->a G->aXBZ 2:BZ->aa 2:Xa->aa 2:Ya->aa BZ->CYXZ XA->AYX YA->CYX XC->AY YC->CY aA->aXXYB BY->XD DY->YD DX->YB G:10 icon-9.4.3/ipl/data/colors.rsg0000664000175000017500000000071307140713044015517 0ustar chrishchrish::=square|rectangle|trapezoid|circle|ellipse|triangle|ovoid ::=red|blue|green|yellow|purple|beige|lavender|pink|red-orange ::=small|tiny|large|humongous|mediocre|ridiculous|lonely|squamous ::=the|a|every|each ::=chases|squashes|strokes|drop kicks|embraces|admires|tickles ::=very|slightly|somewhat|hardly|nearly|barely ::= ::= . 10 icon-9.4.3/ipl/data/darwin.txt0000664000175000017500000000227507140713044015533 0ustar chrishchrishOrder, Coleoptera, (Beetles). Many beetles are colored so as to resemble the surfaces which they habitually frequent, and they thus escape detection by their enemies. Other species, for instance, diamond-beetles, are ornamented with splendid colors, which are often arranged in stripes, spots, crosses, and other elegant patterns. Such colors can hardly serve directly as a protection, except in the case of certain flower-feeding species; but they may serve as a warning or means of recognition, on the same principle as the phosphorescence of the glow-worm. As with beetles the colors of the two sexes are generally alike, we have no evidence that they have been gained through sexual selection; but this is at least possible, for they may have been developed in one sex and then transferred to the other; and this view is even in some degree probable in those groups which possess other well-marked secondary sexual characters. Blind beetles, which cannot, of course, behold each other's beauty, never, as I hear from Mr. Waterhouse, Jr., exhibit bright colors, though they often have polished coats; but the explanation of their obscurity may be that they generally inhabit caves and other obscure stations. icon-9.4.3/ipl/data/curves.dat0000664000175000017500000000154107140713044015502 0ustar chrishchrishellipse(50, 75, 100, 100) ellipse_evolute(50, 75, 100, 100) hippopede(50, 75, 100, 100) lemniscate_bernoulli(50, 100, 100) cycloid(50, 75, 100, 100) lissajous(50, 75, 10, 30, 100, 100) piriform(50, 75, 100, 100) limacon_pascal(50, 75, 100, 100) cardioid(50, 75, 100, 100) lemniscate_gerono(50, 75, 100, 100) bullet_nose(50, 75, 100, 100) cross_curve(50, 75, 100, 100) deltoid(50, 75, 100, 100) trisectrix_maclaurin(50, 75, 100, 100) trisectrix_catalan(50, 100, 100) cissoid_diocles(50, 100, 100) folium(50, 75, 100, 100) kappa(50, 75, 100, 100) kampyle_exodus(50, 75, 100, 100) epitrochoid(50, 75, 50, 100, 100) nephroid(50, 75, 100, 100) spiral_logarithmic(50, 100, 100) spiral_archimedes(50, 100, 100) spiral_fermat(50, 100, 100) spiral_hyperbolic(50, 100, 100) lituus(50, 100, 100) cochleoid(50, 100, 100) epi_spiral(50, 10, 100, 100) witch_agnesi(50, 100, 100) icon-9.4.3/ipl/data/iconproj.lbl0000664000175000017500000000710007140713044016014 0ustar chrishchrish# Icon Project Department of Computer Science Gould-Simpson Building The University of Arizona Tucson, AZ 85721 # Icon Project Department of Computer Science Gould-Simpson Building The University of Arizona Tucson, AZ 85721 # Icon Project Department of Computer Science Gould-Simpson Building The University of Arizona Tucson, AZ 85721 # Icon Project Department of Computer Science Gould-Simpson Building The University of Arizona Tucson, AZ 85721 # Icon Project Department of Computer Science Gould-Simpson Building The University of Arizona Tucson, AZ 85721 # Icon Project Department of Computer Science Gould-Simpson Building The University of Arizona Tucson, AZ 85721 # Icon Project Department of Computer Science Gould-Simpson Building The University of Arizona Tucson, AZ 85721 # Icon Project Department of Computer Science Gould-Simpson Building The University of Arizona Tucson, AZ 85721 # Icon Project Department of Computer Science Gould-Simpson Building The University of Arizona Tucson, AZ 85721 # Icon Project Department of Computer Science Gould-Simpson Building The University of Arizona Tucson, AZ 85721 # Icon Project Department of Computer Science Gould-Simpson Building The University of Arizona Tucson, AZ 85721 # Icon Project Department of Computer Science Gould-Simpson Building The University of Arizona Tucson, AZ 85721 # Icon Project Department of Computer Science Gould-Simpson Building The University of Arizona Tucson, AZ 85721 # Icon Project Department of Computer Science Gould-Simpson Building The University of Arizona Tucson, AZ 85721 # Icon Project Department of Computer Science Gould-Simpson Building The University of Arizona Tucson, AZ 85721 # Icon Project Department of Computer Science Gould-Simpson Building The University of Arizona Tucson, AZ 85721 # Icon Project Department of Computer Science Gould-Simpson Building The University of Arizona Tucson, AZ 85721 # Icon Project Department of Computer Science Gould-Simpson Building The University of Arizona Tucson, AZ 85721 # Icon Project Department of Computer Science Gould-Simpson Building The University of Arizona Tucson, AZ 85721 # Icon Project Department of Computer Science Gould-Simpson Building The University of Arizona Tucson, AZ 85721 # Icon Project Department of Computer Science Gould-Simpson Building The University of Arizona Tucson, AZ 85721 # Icon Project Department of Computer Science Gould-Simpson Building The University of Arizona Tucson, AZ 85721 # Icon Project Department of Computer Science Gould-Simpson Building The University of Arizona Tucson, AZ 85721 # Icon Project Department of Computer Science Gould-Simpson Building The University of Arizona Tucson, AZ 85721 # Icon Project Department of Computer Science Gould-Simpson Building The University of Arizona Tucson, AZ 85721 # Icon Project Department of Computer Science Gould-Simpson Building The University of Arizona Tucson, AZ 85721 # Icon Project Department of Computer Science Gould-Simpson Building The University of Arizona Tucson, AZ 85721 # Icon Project Department of Computer Science Gould-Simpson Building The University of Arizona Tucson, AZ 85721 # Icon Project Department of Computer Science Gould-Simpson Building The University of Arizona Tucson, AZ 85721 # Icon Project Department of Computer Science Gould-Simpson Building The University of Arizona Tucson, AZ 85721 # Icon Project Department of Computer Science Gould-Simpson Building The University of Arizona Tucson, AZ 85721 # Icon Project Department of Computer Science Gould-Simpson Building The University of Arizona Tucson, AZ 85721 icon-9.4.3/ipl/data/carroll.txt0000664000175000017500000000021107140713044015671 0ustar chrishchrish'Twas brillig, and the slithy toves Did gyre and gimble in the wabe: All mimsy were the borogoves, And the mome raths outgrabe. icon-9.4.3/ipl/data/termcap2.dos0000664000175000017500000000621607140713044015731 0ustar chrishchrish# From: Norman H. Azadian # /etc/termcap 880901 NHA # For IBM PC and friends. # # Monochrome IBMPC. # This is a termcap for the NANSI.SYS device driver. # It is the same as the ANSI termcap, except NANSI supports additionally # line & char insert & delete (AL,al, DL,dl, DC,dc, IC,ic). # nansi-mono|mono:\ :AL=\E[%dL:al=\E[1L:\ :DC=\E[%dP:dc=\E[1P:DL=\E[%dM:dl=\E[1M:\ :IC=\E[%d@:ic=\E[1@:\ :tc=ansi-mono: # # monochrome ANSI # ansi-mono:\ :am:\ :bc=\E[1D:bl=^G:bs:\ :cd=\E[2J:ce=\E[K:cl=\E[2J\E[H:cm=\E[%i%d;%dH:co#80:\ :DO=\E[%dB:do=\E[B:\ :ho=\E[H:\ :K1=\200G:K2=\200I:K4=\200O:K5=\200Q:\ :k0=\200;:k1=\200<:k2=\200=:k3=\200>:k4=\200?:k5=\200@:\ :k6=\200A:k7=\200B:k8=\200C:k9=\200D:\ :kb=^H:kC=\200w:kD=\200S:kd=\200P:kE=\200u:kH=\200O:kh=\200G:\ :kI=\200R:kl=\200K:kN=\200Q:kP=\200I:kr=\200M:kS=\200v:ku=\200H:\ :LE=\E[%dD:le=\E[1D:li#25:\ :l0=F1:l1=F2:l2=F3:l3=F4:l4=F5:l5=F6:l6=F7:l7=F8:l8=F9:l9=F10:\ :mb=\E[5m:md=\E[1m:me=\E[0m:mk=\E[8m:mr=\E[7m:ms:\ :nd=\E[C:\ :RI=\E[%dC:rc=\E[u:\ :sc=\E[s:se=\E[0m:so=\E[7m:\ :te=\E[0m:ti=\E[0m:\ :UP=\E[%dA:ue=\E[0m:up=\E[A:us=\E[4m:\ :xd=\E[B:xs: # # Color IBMPC. # This is a termcap for the NANSI.SYS device driver. # It is the same as the ANSI termcap, except NANSI supports # character & line insert & delete, while ANSI does not. # nansi-color|color:\ :AL=\E[%dL:al=\E[1L:\ :DC=\E[%dP:dc=\E[1P:DL=\E[%dM:dl=\E[1M:\ :IC=\E[%d@:ic=\E[1@:\ :tc=ansi-color: # # ANSI Color # ansi-color:\ :am:\ :bc=\E[1D:bl=^G:bs:\ :cd=\E[2J:ce=\E[K:cl=\E[2J\E[H:cm=\E[%i%d;%dH:co#80:\ :DO=\E[%dB:do=\E[B:\ :ho=\E[H:\ :K1=\200G:K2=\200I:K4=\200O:K5=\200Q:\ :k0=\200;:k1=\200<:k2=\200=:k3=\200>:k4=\200?:k5=\200@:\ :k6=\200A:k7=\200B:k8=\200C:k9=\200D:\ :kb=^H:kC=\200w:kD=\200S:kd=\200P:kE=\200u:kH=\200O:kh=\200G:\ :kI=\200R:kl=\200K:kN=\200Q:kP=\200I:kr=\200M:kS=\200v:ku=\200H:\ :LE=\E[%dD:le=\E[1D:li#25:\ :l0=F1:l1=F2:l2=F3:l3=F4:l4=F5:l5=F6:l6=F7:l7=F8:l8=F9:l9=F10:\ :mb=\E[5m:md=\E[1m:me=\E[0m:mk=\E[8m:mr=\E[47;30m:ms:\ :nd=\E[C:\ :RI=\E[%dC:rc=\E[u:\ :sc=\E[s:se=\E[40;37m:so=\E[47;30m:\ :te=\E[0m:ti=\E[40;37m:\ :UP=\E[%dA:ue=\E[37m:up=\E[A:us=\E[32m:\ :xd=\E[B:xs: # # Monochrome IBMPC, especially lobotomized for /usr/games/larn. # Each capability (that larn requires) must start on a new line. # Must not use 2nd %i in :cm capability, although it should be there. # larn-mono|hack-mono:\ :al=\E[L:\ :bc=\E[D:\ :bs:\ :ce=\E[K:\ :cl=\E[2J:\ :cm=\E[%i%2;%2H:\ :co#80:\ :dc=\E[P:\ :dl=\E[M:\ :ho=\E[H:\ :ic=\E[@:\ :li#25:\ :mb=\E[5m:\ :md=\E[7m:\ :me=\E[0m:\ :mk=\E[8m:\ :mr=\E[7m:\ :nd=\E[C:\ :se=\E[0m:\ :so=\E[1m:\ :te=\E[0m:\ :ti=\E[0m:\ :ue=\E[0m:\ :up=\E[A:\ :us=\E[4m:\ :xd=\E[B:\ :xs: # # Color IBMPC, especially lobotomized for /usr/games/larn. # Each capability (that larn requires) must start on a new line. # Must not use 2nd %i in :cm capability, although it should be there. # larn-color|hack-color:\ :bc=\E[D:\ :bs:\ :ce=\E[K:\ :cl=\E[2J:\ :cm=\E[%i%2;%2H:\ :co#80:\ :he=\E[44;37m:\ :hi=\E[32m:\ :ho=\E[H:\ :li#25:\ :nd=\E[C:\ :se=\E[44;37m:\ :so=\E[31m:\ :te=\E[0m:\ :ti=\E[44;37m:\ :ue=\E[m:\ :up=\E[A:\ :us=\E[1m:\ :xd=\E[B:\ :xs: icon-9.4.3/ipl/data/skelopt.icn0000664000175000017500000000130207274104036015653 0ustar chrishchrish############################################################################ # # File: # # Subject: Program # # Author: # # Date: # ############################################################################ # # This file is in the public domain. # ############################################################################ # # # ############################################################################ # # Requires: # ############################################################################ # # Links: options # ############################################################################ link options procedure main(args) local opts opts := options(args, "") end icon-9.4.3/ipl/data/verse.dat0000664000175000017500000004570207140713044015326 0ustar chrishchrishFrom icon-group-sender Mon May 25 05:41:47 1992 Received: by cheltenham.cs.arizona.edu; Mon, 25 May 92 05:41:38 MST Date: Mon, 25 May 1992 07:41 CST From: Chris Tenaglia - 257-8765 Subject: Holiday Offering To: icon-group@cs.arizona.edu Message-Id: <01GKF5PLTI6I984PUJ@mis.mcw.edu> X-Organization: Medical College of Wisconsin (Milwaukee, WI) X-Vms-To: IN%"icon-group@cs.arizona.edu" Status: R Errors-To: icon-group-errors@cs.arizona.edu Here is a sample vocabulary file. I choose computer and science related stuff which seems to fit together well. I've tried farming and agriculture, but it got pretty gross. Great stuff for talk.bizaare! Happy holidays! Chris Tenaglia (System Manager) | "The past explained, Medical College of Wisconsin | the future fortold, 8701 W. Watertown Plank Rd. | the present largely appologized for." Milwaukee, WI 53226 | Organon to The Doctor (414)257-8765 | tenaglia@mis.mcw.edu ! ! This is the vocabulary of the AI verse generator. Its filename is passed ! as a parameter. This should run under VMS, Unix, and MS-DOS. Lines until ! the %noun line are ignored and will generate 'Such Language!' messages ! when the program is run. ! %noun ABEND|ABENDS ABUSE|ABUSES ACCEPTANCE|ACCEPTANCES ACCOUNT|ACCOUNTS ACTION|ACTIONS ADDRESS|ADDRESSES ALGORITHM|ALGORITHMS AMAZEMENT|AMAZEMENTS ANOMALY|ANOMALIES ANSWER|ANSWERS APPLICATION|APPLICATIONS ARGUMENT|ARGUMENTS ARITHMETIC|ARITHMETICS ASSEMBLER|ASSEMBLERS ASSEMBLY|ASSEMBLIES BASE|BASES BASIC|BASICS BATCH|BATCHES BAUD RATE|BAUD RATES BENCHMARK|BENCHMARKS BIT|BITS BIT BUCKET|BIT BUCKETS BLANK|BLANKS BLOCK|BLOCKS BOOK|BOOKS BREAKPOINT|BREAKPOINTS BUFFER|BUFFERS BUG|BUGS BYTE|BYTES CALENDER|CALENDERS CAPACITY|CAPACITIES CATALOG|CATALOGS CAUSE|CAUSES CHAMBER|CHAMBERS CHANGE|CHANGES CHARACTER|CHARACTERS CHECK|CHECKS CLASS|CLASSES CHIP|CHIPS CIRCUIT|CIRCUITS CIRCUIT CARD|CIRCUIT CARDS CIRCUIT CHIP|CIRCUIT CHIPS CLUSTER|CLUSTERS CODE|CODES COMMAND|COMMANDS COMPILER|COMPILERS COMPONENT|COMPONENTS COMPUTER|COMPUTERS CONCEPT|CONCEPTS CONDITION|CONDITIONS CONFUSION|CONFUSIONS CONNECTION|CONNECTIONS CONTROL|CONTROLS CONVERSION|CONVERSIONS COPROCESSOR|COPROCESSORS COPY|COPIES CRASH|CRASHES CUBE|CUBES CURSOR|CURSORS CYCLE TIME|CYCLE TIMES DATA|DATA DATA|SET DATA SETS DATABASE|DATABASES DEFECT|DEFECTS DEFINITION|DEFINITIONS DELETION|DELETIONS DERIVATIVE|DERIVATIVES DESCRIPTION|DESCRIPTIONS DESIGN|DESIGNS DEVELOPEMENT|DEVELOPEMENTS DEVICE|DEVICES DIAGRAM|DIAGRAMS DIGIT|DIGITS DIRECTORY|DIRECTORIES DISK|DISKS DISPLAY|DISPLAYS DIVISION|DIVISIONS DOCUMENT|DOCUMENTS DOCUMENTATION|DOCUMENTATIONS DOMAIN|DOMAINS DRAWING|DRAWINGS DRIVER|DRIVERS EFFECT|EFFECTS ELEMENT|ELEMENTS EMPTY SET|EMPTY SETS ENGINE|ENGINES ENGINEER|ENGINEERS ENTROPY|ENTROPIES ENTRY|ENTRIES ENTRYPOINT|ENTRYPOINTS ENVIRONMENT|ENVIRONMENTS EQUATION|EQUATIONS ERROR|ERRORS ESCAPE|ESCAPES EUPHEMISM|EUPHEMISMS EXAMPLE|EXAMPLES EXPONENT|EXPONENTS FACT|FACTS FAILURE|FAILURES FANTASY|FANTASIES FAX|FAXES FEATURE|FEATURES FIELD|FIELDS FILE|FILES FIRMWARE|FIRMWARES FLAG|FLAGS FLOPPY|FLOPPIES FORM|FORMS FORMAT|FORMATS FROTH|FROTHS FUNCTION|FUNCTIONS GAME|GAMES GENERATOR|GENERATORS GLITSCH|GLITSCHES GRAPH|GRAPHS HACKER|HACKERS HARDWARE|HARDWARES HASH|HASHES HEXIDECIMAL|HEXIDECIMALS HOLLERITH CARD|HOLLERITH CARDS HYPERCUBE|HYPERCUBES IDIOT|IDIOTS IMAGE|IMAGES IMPLEMENTATION|IMPLEMENTATIONS INDEX|INDICES INDIVIDUAL|INDIVIDUALS INFORMATION|INFORMATIONS INITIALIZATION|INITIALIZATIONS INHERITANCE|INHERITANCES INPUT|INPUTS INQUIRY|INQUIRIES INSERTION|INSERTIONS INSTALLATION|INSTALLATIONS INSTRUCTION|INSTRUCTIONS INTEGER|INTEGERS INTEGRAL|INTEGRALS INTEGRATED CIRCUIT|INTEGRATED CIRCUITS INTELLECT|INTELLECTS INTERFACE|INTERFACES INTERPRETER|INTERPRETERS INTERRUPT|INTERRUPTS INTERVAL|INTERVALS INTRODUCTION|INTRODUCTIONS INVENTOR|INVENTORS ITEM|ITEMS ITERATION|ITERATIONS JOB|JOBS JOBSTREAM|JOBSTREAMS JOYSTICK|JOYSTICKS KEYPAD|KEYPADS KEYWORD|KEYWORDS KLOOJE|KLOOJES KRUFT|KRUFTS LABEL|LABELS LABORATORY|LABORATORIES LANGUAGE|LANGUAGES LIBRARY|LIBRARIES LINKAGE|LINKAGES LINKER|LINKERS LIQUID|LIQUIDS LIST|LISTS LOAD|LOADS LOGIC|LOGICS LOOP|LOOPS MACHINE|MACHINES MAINFRAME|MAINFRAMES MANUAL|MANUALS MEMBER|MEMBERS MEMORY|MEMORIES MENU|MENUS MERGE|MERGES MESSAGE|MESSAGES METHOD|METHODS MICROPROCESSOR|MICROPROCESSORS MODE|MODES MODEL|MODELS MODEM|MODEMS MODIFICATION|MODIFICATIONS MODULE|MODULES MONITOR|MONITORS MOTHERBOARD|MOTHERBOARDS MOVE|MOVES MUTANT|MUTANTS NAND|GATE NAND GATES NETWORK|NETWORKS NO-OP|NO-OPS NODE|NODES NONSENSE|NONSENSES NULL DEVICE|NULL DEVICES NUMBER|NUMBERS NUMBER CRUNCHER|NUMBER CRUNCHERS OBJECT|OBJECTS OCCURENCE|OCCURENCES OPERAND|OPERANDS OPERATING SYSTEM|OPERATING SYSTEMS OPERATION|OPERATIONS OPTION|OPTIONS ORDER|ORDERS OUTPUT|OUTPUTS PACKAGE|PACKAGES PAGE|PAGES PARADIGM|PARADIGMS PARAMETER|PARAMETERS PARITY BIT|PARITY BITS PART NUMBER|PART NUMBERS PARTITION|PARTITIONS PARTNER|PARTNERS PASSWORD|PASSWORDS PATCH|PATCHES PATH|PATHS PERSON|PERSONS POINT|POINTS POINTER|POINTERS PREFERENCE|PREFERENCES PRICE|PRICES PRINTER|PRINTERS PRINTOUT|PRINTOUTS PROCEDURE|PROCEDURES PROCESS|PROCESSES PRODUCT|PRODUCTS PROFESSOR|PROFESSORS PROGRAM|PROGRAMS PROGRAMMER|PROGRAMMERS PROJECT|PROJECTS PURGE|PURGES QUALITY|QUALITIES QUANTITY|QUANTITIES QUERY|QUERIES QUESTION|QUESTIONS QUOTE|QUOTES RAM|DUMP RAM DUMPS RANDOM NUMBER|RANDOM NUMBERS RATIO|RATIOS REALITY|REALITIES REASON|REASONS RECORD|RECORDS REFERENCE|REFERENCES REFLECTION|REFLECTIONS REFUSAL|REFUSALS REGION|REGIONS REGISTER|REGISTERS REPLENISHMENT|REPLENISHMENTS REQUIREMENT|REQUIREMENTS ROBOT|ROBOTS ROUTINE|ROUTINES SAMPLE|SAMPLES SCHEMA|SCHEMAS SCIENCE|SCIENCES SEARCH|SEARCHES SECTION|SECTIONS SELECTION|SELECTIONS SELF|SELFS SEQUENCE|SEQUENCES SHOW|SHOWS SITUATION|SITUATIONS SIZE|SIZES SOCKET|SOCKETS SOFTWARE|SOFTWARES SOLUTION|SOLUTIONS SORT|SORTS SPACE|SPACES SPARK|SPARKS SPECTRUM|SPECTRUMS SPHERE|SPHERES SPREAD SHEET|SPREAD SHEETS STANDARD|STANDARDS STATUS|STATUSES STEP|STEPS STORAGE|STORAGES STRUCTURE|STRUCTURES SUBJECT|SUBJECTS SUBSCHEMA|SUBSCHEMAS SUBSECTION|SUBSECTIONS SUBSTITUTE|SUBSTITUTES SUPER COMPUTER|SUPER COMPUTERS SURPRISE|SURPRISES SWITCH|SWITCHES SYMBOL|SYMBOLS SYNTAX ERROR|SYNTAX ERRORS SYSTEM|SYSTEMS TABLE|TABLES TECHNICIAN|TECHNICIANS TESSARECT|TESSARECTS TEST|TESTS THOUGHT|THOUGHTS TIME|TIMES TOOL|TOOLS TRACE|TRACES TRANSACTION|TRANSACTIONS TRANSFER|TRANSFERS TREE|TREES TRIANGLE|TRIANGLES TWOS-COMPLEMENT|TWOS-COMPLEMENTS UNIT|UNITS UPDATE|UPDATES USAGE|USAGES USER|USERS UTILITY|UTILITIES VACUUM|VACUUMS VALUE|VALUES VARIABLE|VARIABLES VECTOR|VECTORS VERSION|VERSIONS VIOLATION|VIOLATIONS VOLUME|VOLUMES WARRANTY|WARRANTIES WORD|WORDS WORD PROCESSOR|WORD PROCESSORS WORK|WORKS %adjt ABRASIVE|ABRASIVELY@MORE ABRASIVE#MOST ABRASIVE ABSURD|ABSURDLY@ABSURDER#ABSURDEST ACTIVE|ACTIVELY@MORE ACTIVE#MOST ACTIVE ALARMING|ALARMINGLY@MORE ALARMING#MOST ALARMING ALERT|ALERTLY@MORE ALERT#MOST ALERT AMORPHOUS|AMORPHOUSLY@MORE AMORPHOUS#MOST AMORPHOUS APATHETIC|APATHETICALLY@MORE APATHETIC#MOST APATHETIC ASTONISHING|ASTONISHINGLY@MORE ASTONISHING#MOST ASTONISHING AUTOMATIC|AUTOMATICALLY@MORE AUTOMATIC#MOST AUTOMATIC AVERAGE|AVERAGELY@MORE AVERAGE#MOST AVERAGE BAD|BADLY@BADDER#BADDEST BASIC|BASICALLY@MORE BASIC#MOST BASIC BEAUTIFUL|BEAUTIFULLY@MORE BEAUTIFUL#MOST BEAUTIFUL BERZERK|BERZERKLY@BERZERKER#BERZERKEST BIZAAR|BIZAARLY@BIZAARER#BIZAAREST BLETCHEROUS|BLETCHEROUSLY@MORE BLETCHEROUS#MOST BLETCHEROUS BLIND|BLINDLY@BLINDER#BLINDEST BLINKING|BLINKINGLY@MORE BLINKING#MOST BLINKING BOGUS|BOGUSLY@MORE BOGUS#MOST BOGUS BOLD|BOLDLY@BOLDER#BOLDEST BORING|BORINGLY@MORE BORING#MOST BORING BRAVE|BRAVELY@BRAVER#BRAVEST CAUSTIC|CAUSTICALLY@MORE CAUSTIC#MOST CAUSTIC CHEAP|CHEAPLY@CHEAPER#CHEAPEST COLD|COLDLY@COLDER#COLDEST COBOL|COBOL LIKE|MORE COBOL LIKE|MOSTLY COBOL CONCISE|CONCISELY@CONCISER#CONCISEST CONSIDERATE|CONSIDERATELY@MORE CONSIDERATE#MOST CONSIDERATE CONVOLUTED|CONVOLUTEDLY@MORE CONVOLUTED#MOST CONVOLUTED CORRECT|CORRECTLY@MORE CORRECT#MOST CORRECT COURTEOUS|COURTEOUSLY@MORE COURTEOUS#MOST COURTEOUS CREATIVE|CREATIVELY@MORE CREATIVE#MOST CREATIVE DEAR|DEARLY@DEARER#DEAREST DEEP|DEEPLY@DEEPER#DEEPEST DEFECTIVE|DEFECTIVELY@MORE DEFECTIVE#MOST DEFECTIVE DELIGHTFUL|DELIGHTFULLY@MORE DELIGHTFUL#MOST DELIGHTFUL DEPLETED|DEPLETEDLY@MORE DEPLETED#MOST DEPLETED DESTRUCTIVE|DESTRUCTIVELY@MORE DESTRUCTIVE#MOST DESTRUCTIVE DETACHED|DETACHEDLY|MORE DETACHED|MOST DETACHED DEVOUT|DEVOUTLY@DEVOUTER#DEVOUTEST DIFFERENT|DIFFERENTLY@MORE DIFFERENT#MOST DIFFERENT DIFFUSE|DIFFUSELY@MORE DIFFUSE#MOST DIFFUSE DISPOSABLE|DISPOSABLY@MORE DISPOSABLE#MOST DISPOSABLE DISTANT|DISTANTLY@MORE DISTANT#MOST DISTANT DROWSY|DROWSILY@DROWSIER#DROWSIEST DRY|DRYLY@DRIER#DRIEST DUMB|DUMBLY@DUMBER#DUMBEST DUSTY|DUSTILY@DUSTIER#DUSTIEST EASY|EASILY@EASIER#EASIEST EDUCATED|EDUCATEDLY@MORE EDUCATED#MOST EDUCATED ELECTRIC|ELECTRICALLY@MORE ELECTRIC#MOST ELECTRIC ENERGETIC|ENERGETICALLY@MORE ENERGETIC#MOST ENERGETIC EVEN|EVENLY@MORE EVEN#MOST EVEN EVIL|EVILY@MORE EVIL#MOST EVIL EXCITABLE|EXCITABLY@MORE EXCITABLE#MOST EXCITABLE EXUBERANT|EXUBERANTLY@MORE EXUBERANT#MOST EXUBERANT FAIR|FAIRLY@FAIRER#FAIREST FANTASTIC|FANTASTICALLY@MORE FANTASTIC#MOST FANTASTIC FEARFUL|FEARFULLY@MORE FEARFUL#MOST FEARFUL FLEXIBLE|FLEXIBLY@MORE FLEXIBLE#MOST FLEXIBLE FLUID|FLUIDLY@MORE FLUID#MOST FLUID FOAMING|FOAMINGLY@MORE FOAMING#MOST FOAMING FOOLISH|FOOLISHLY@MORE FOOLISH#MOST FOOLISH FORBIDDING|FORBIDDINGLY@MORE FORBIDDING#MOST FORBIDDING FREEZING|FREEZINGLY@MORE FREEZING#MOST FREEZING FRESH|FRESHLY@FRESHER#FRESHEST FROTHING|FROTHINGLY@MORE FROTHING#MOST FROTHING FUNNY|FUNNY@FUNNIER#FUNNIEST FUZZY|FUZZILY@FUZZIER#FUZZIEST GENERAL|GENERALLY@MORE GENERAL#MOST GENERAL GLORIOUS|GLORIOUSLY@MORE GLORIOUS#MOST GLORIOUS GLOWING|GLOWINGLY@MORE GLOWING#MOST GLOWING GRAND|GRANDLY@GRANDER#GRANDEST GREESY|GREESILY@GREESIER#GREESIEST GRINDING|GRINDINGLY@MORE GRINDING#MOST GRINDING GROSS|GROSSLY@GROSSER#GROSSEST GULLIBLE|GULLIBLY@MORE GULLIBLE#MOST GULLIBLE HAPPY|HAPPILY@HAPPIER#HAPPIEST HARD|HARDLY@HARDER#HARDEST HATEFUL|HATEFULLY@MORE HATEFUL#MOST HATEFUL HEATED|HEATEDLY@MORE HEATED#MOST HEATED HEAVY|HEAVILY@HEAVIER#HEAVIEST HELPFUL|HELPFULLY@MORE HELPFUL#MOST HELPFUL HIGH|HIGHLY@HIGHER#HIGHEST HOPELESS|HOPELESSLY@MORE HOPELESS#MOST HOPELESS HORRIBLE|HORRIBLY@MORE HORRIBLE#MOST HORRIBLE HOT|HOTLY@HOTTER#HOTTEST HUMOROUS|HUMOROUSLY@MORE HUMOROUS#MOST HUMOROUS HUNGRY|HUNGRILY@HUNGRIER#HUNGRIEST IDIOTIC|IDIOTICALLY@MORE IDIOTIC#MOST IDIOTIC IGNORANT|IGNORANTLY@MORE IGNORANT#MOST IGNORANT IMPORTANT|IMPORTANTLY@MORE IMPORTANT#MOST IMPORTANT IMPRESSIVE|IMPRESSIVELY@MORE IMPRESSIVE#MOST IMPRESSIVE INDEFINITE|INDEFINITELY@MORE INDEFINITE#MOST INDEFINITE INDESCRIBABLE|INDESCRIBABLY@MORE INDESCRIBABLE#MOST INDESCRIBABLE INDIRECT|INDIRECTLY@MORE INDIRECT#MOST INDIRECT INSTANT|INSTANTLY@MORE INSTANT#MOST INSTANT INTERACTIVE|INTERACTIVELY|MORE INTERACTIVE|MOST INTERACTIVE INTERMITANT|INTERMITANTLY@MORE INTERMITANT#MOST INTERMITANT JOYOUS|JOYOUSLY@MORE JOYOUS#MOST JOYOUS JUBILANT|JUBILANTLY@MORE JUBILANT#MOST JUBILANT KIND|KINDLY@KINDER#KINDEST KNOWING|KNOWINGLY@MORE KNOWING#MOST KNOWING LAMENTABLE|LAMENTABLY@MORE LAMENTABLE#MOST LAMENTABLE LATE|LATELY@LATER#LATEST LAZY|LAZILY@LAZIER#LAZIEST LOGICAL|LOGICALLY@MORE LOGICAL#MOST LOGICAL LONG|LONGLY@LONGER#LONGEST LOQUACIOUS|LOQUACIOUSLY@MORE LOQUACIOUS#MOST LOQUACIOUS LOUSY|LOUSILY@LOUSIER#LOUSIEST LOW|LOWLY@LOWER#LOWEST LUSCIOUS|LUSCIOUSLY@MORE LUSCIOUS#MOST LUSCIOUS MAGIC|MAGICALLY@MORE MAGIC#MOST MAGIC MAGNIFICENT|MAGNIFICENTLY@MORE MAGNIFICENT#MOST MAGNIFICENT MANIACAL|MANIACALLY@MORE MANIACAL#MOST MANIACAL MASTERFUL|MASTERFULLY@MORE MASTERFUL#MOST MASTERFUL MEANINGFUL|MEANINGFULLY@MORE MEANINGFUL#MOST MEANINGFUL METALLIC|METALLICALLY@MORE METALLIC#MOST METALLIC MISERABLE|MISERABLY@MORE MISERABLE#MOST MISERABLE MONOLITHIC|MONOLITHICALLY@MORE MONOLITHIC#MOST MONOLITHIC MONSTROUS|MONSTROUSLY@MORE MONSTROUS#MOST MONSTROUS MUNDANE|MUNDANELY@MUNDANER#MUNDANEST NATURAL|NATURALLY@MORE NATURAL#MOST NATURAL NEAR|NEARLY@NEARER#NEAREST NEAT|NEATLY@NEATER#NEATEST NOISOME|NOISOMELY@MORE NOISOME#MOST NOISOME NONEXISTANT|NONEXISTANTLY@MORE NONEXISTANT#MOST NONEXISTANT NUCLEAR|NUCLEARLY@MORE NUCLEAR#MOST NUCLEAR OBEDIENT|OBEDIENTLY@MORE OBEDIENT#MOST OBEDIENT OBVIOUS|OBVIOUSLY@MORE OBVIOUS#MOST OBVIOUS ODD|ODDLY@ODDER#ODDEST ODIFEROUS|ODIFEROUSLY@MORE ODIFEROUS#MOST ODIFEROUS OMNIVOROUS|OMNIVOROUSLY@MORE OMNIVOROUS#MOST OMNIVOROUS OPEN|OPENLY@MORE OPEN#MOST OPEN PAINLESS|PAINLESSLY@MORE PAINLESS#MOST PAINLESS PATHETIC|PATHETICALLY@MORE PATHETIC#MOST PATHETIC PECULIAR|PECULIARLY@MORE PECULIAR#MOST PECULIAR PERCEPTIVE|PERCEPTIVELY@MORE PERCEPTIVE#MOST PERCEPTIVE PERSISTANT|PERSISTANTLY@MORE PERSISTANT#MOST PERSISTANT PLASTIC|PLASTICALLY@MORE PLASTIC#MOST PLASTIC PLEASANT|PLEASANTLY@MORE PLEASANT#MOST PLEASANT PONDEROUS|PONDEROUSLY@MORE PONDEROUS#MOST PONDEROUS POWERFUL|POWERFULLY@MORE POWERFUL#MOST POWERFUL PRECIOUS|PRECIOUSLY@MORE PRECIOUS#MOST PRECIOUS PRECISE|PRECISELY@MORE PRECISE#MOST PRECISE PRETTY|PRETTILY@PRETTIER#PRETTIEST PROPER|PROPERLY@MORE PROPER#MOST PROPER PROUD|PROUDLY@PROUDER#PROUDEST QUEER|QUEERLY@QUEERER#QUEEREST QUICK|QUICKLY@QUICKER#QUICKEST READY|READILY@MORE READY#MOST READY RELENTING|RELENTINGLY@MORE RELENTING#MOST RELENTING RELUCTANT|RELUCTANTLY@MORE RELUCTANT#MOST RELUCTANT REVERENT|REVERENTLY@MORE REVERENT#MOST REVERENT ROUDY|ROUDILY@ROUDIER#ROUDIEST ROUGH|ROUGHLY@ROUGHER#ROUGHEST RUDE|RUDELY@RUDER#RUDEST SAD|SADLY@SADDER#SADDEST SALIENT|SALIENTLY@MORE SALIENT#MOST SALIENT SAVAGE|SAVAGELY@MORE SAVAGE#MOST SAVAGE SCRUFFY|SCRUFFILY@SCRUFFIER#SCRUFFIEST SELF MODIFYING|SELF MODIFYINGLY@MORE SELF MODIFYING#MOST SELF MODIFYING SHARP|SHARPLY@SHARPER#SHARPEST SHORT|SHORTLY@SHORTER#SHORTEST SKEWED|SKEWEDLY@MORE SKEWED#MOST SKEWED SLOPPY|SLOPPILY@SLOPPIER#SLOPPIEST SLOW|SLOWLY@SLOWER#SLOWEST SMOOTH|SMOOTHLY@SMOOTHER#SMOOTHEST SOFT|SOFTLY@SOFTER#SOFTEST SOULFUL|SOULFULLY@MORE SOULFUL#MOST SOULFUL SPACIOUS|SPACIOUSLY@MORE SPACIOUS#MOST SPACIOUS SPASTIC|SPASTICALLY@MORE SPASTIC#MOST SPASTIC SPECKLED|SPECKLEDLY@MORE SPECKLED#MOST SPECKLED SPECTACULAR|SPECTACULARLY@MORE SPECTACULAR#MOST SPECTACULAR SPIFFY|SPIFFILY@SPIFFIER#SPIFFIEST SQUEEKING|SQUEEKINGLY@MORE SQUEEKING#MOST SQUEEKING STATIC|STATICALLY@MORE STATIC#MOST STATIC STRANGE|STRANGELY@STRANGER#STRANGEST STRATEGIC|STRATEGICALLY@MORE STRATEGIC#MOST STRATEGIC STUDIOUS|STUDIOUSLY@MORE STUDIOUS#MOST STUDIOUS STUPID|STUPIDLY@MORE STUPID#MOST STUPID SUBNORMAL|SUBNORMALLY@MORE SUBNORMAL#MOST SUBNORMAL SUCCESSFUL|SUCCESSFULLY@MORE SUCCESSFUL#MOST SUCCESSFUL SWIFT|SWIFTLY@SWIFTER#SWIFTEST TANGIBLE|TANGIBLY@MORE TANGIBLE#MOST TANGIBLE TEPID|TEPIDLY@MORE TEPID#MOST TEPID TERSE|TERSELY@TERSER#TERSEST THRASHING|THRASHINGLY@MORE THRASHING#MOST THRASHING TIGHT|TIGHTLY@TIGHTER#TIGHTEST TIRED|TIREDLY@TIREDER#TIREDEST TRAGIC|TRAGICALLY@MORE TRAGIC#MOST TRAGIC TWISTED|TWISTEDLY@MORE TWISTED#MOST TWISTED TYPICAL|TYPICALLY@MORE TYPICAL#MOST TYPICAL UNBELIEVABLE|UNBELIEVABLY@MORE UNBELIEVABLE#MOST UNBELIEVABLE UNIFORM|UNIFORMLY@MORE UNIFORM#MOST UNIFORM URBANE|URBANELY@URBANER#URBANEST VACANT|VACANTLY@MORE VACANT#MOST VACANT VAIN|VAINLY@VAINER#VAINEST VENOMOUS|VENOMOUSLY@MORE VENOMOUS#MOST VENOMOUS VERBOSE|VERBOSELY@VERBOSER#VERBOSEST VIBRANT|VIBRANTLY@MORE VIBRANT#MOST VIBRANT VIRTUOUS|VIRTUOUSLY@MORE VIRTUOUS#MOST VIRTUOUS VITAL|VITALLY@MORE VITAL#MOST VITAL WEAK|WEAKLY@WEAKER#WEAKEST WET|WETLY@WETTER#WETTEST WHOLESOME|WHOLESOMELY@MORE WHOLESOME#MOST WHOLESOME WIDE|WIDELY@WIDER#WIDEST WIERD|WIERDLY@WIERDER#WIERDEST WILD|WILDLY@WILDER#WILDEST WISE|WISELY@WISER#WISEST WONDERFUL|WONDERFULLY@MORE WONDERFUL#MOST WONDERFUL WRETCHED|WRETCHEDLY@MORE WRETCHED#MOST WRETCHED WRITHING|WRITHINGLY@MORE WRITHING#MOST WRITHING %been AIN'T BE SHOULD BE COULD BE WOULD BE CAN'T BE MIGHT BE NOT MAY BE MIGHT BE MAY BE NOT COULD NOT BE SHOULD NOT BE WOULD NOT BE MAY NOT BE MIGHT NOT BE WILL BE WILL NOT BE WON'T BE COULD HAVE BEEN SHOULD HAVE BEEN WOULD HAVE BEEN WILL HAVE BEEN COULD BE NOT SHOULD BE NOT WOULD BE NOT COULDN'T HAVE BEEN SHOULDN'T HAVE BEEN WOULDN'T HAVE BEEN SHOULD BE %ivrb ADD|ADDED ASSEMBLE|ASSEMBLED ATTEMPT|ATTEMPTED CALCULATE|CALCULATED CLIMB|CLIMBED CLOSE|CLOSED CODE|CODED COMBINE|COMBINED COMPARE|COMPARED COMPILE|COMPILED COMPUTE|COMPUTED CONCLUDE|CONCLUDED CONTEND|CONTENDED CONTINUE|CONTINUED CONVERT|CONVERTED CRASH|CRASHED CRUNCH|CRUNCHED DECREASE|DECREASED DECREMENT|DECREMENTED DIGEST|DIGESTED DOUBLE|DOUBLED DUMP|DUMPED ENHANCE|ENHANCED ENTER|ENTERED EXIST|EXISTED EXPLODE|EXPLODED EXTEND|EXTENDED FLASH|FLASHED FLOAT|FLOATED FRY|FRIED HIT|HITTED GENERATE|GENERATED IMPLODE|IMPLODED INCREASE|INCREASED INCREMENT|INCREMENTED JUGGLE|JUGGLED JUMP|JUMPED LINK|LINKED LISTEN|LISTENED MANIPULATE|MANIPULATED MUNCH|MUNCHED OPEN|OPENED OPERATE|OPERATED OVERFLOW|OVERFLOWED PASS|PASSED PERFORM|PERFORMED PLAN|PLANNED PREPARE|PREPARED RAIN|RAINED REJECT|REJECTED REPEAT|REPEATED SHOW|SHOWED SPIT|SPITTED SLIP|SLIPPED SUMMARIZE|SUMMARIZED TERMINATE|TERMINATED TOGGLE|TOGGLED TRIPLE|TRIPLED TURN|TURNED TWITCH|TWITCHED WRIGGLE|WRIGGLED %tvrb ABSORB|ABSORBED ACCESS|ACCESSED ALLOCATE|ALLOCATED ALLOW|ALLOWED ASSEMBLE|ASSEMBLED ASSIGN|ASSIGNED BENEFIT|BENEFITTED CALCULATE|CALCULATED CLIMB|CLIMBED CLOSE|CLOSED CODE|CODED COLLIDE|COLLIDED COMBINE|COMBINED COMMAND|COMMANDED COMPARE|COMPARED COMPILE|COMPILED CONCLUDE|CONCLUDED CONTAIN|CONTAINED CONVERT|CONVERTED COOK|COOKED COPY|COPIED CRASH|CRASHED CRUNCH|CRUNCHED DEBUG|DEBUGGED DECREASE|DECREASED DECREMENT|DECREMENTED DELETE|DELETED DELIVER|DELIVERED DESCRIBE|DESCRIBED DESTROY|DESTROYED DETECT|DETECTED DEVISE|DEVISED DIGEST|DIGESTED DIRECT|DIRECTED DISPLAY|DISPLAYED DIVIDE|DIVIDED DOUBLE|DOUBLED DUMP|DUMPED EDIT|EDITED EMPHASIZE|EMPHASIZED EMULATE|EMULATED ENCRYPT|ENCRYPTED ENHANCE|ENHANCED ERASE|ERASED EVALUATE|EVALUATED EXECUTE|EXECUTED EXPLODE|EXPLODED EXPRESS|EXPRESSED EXTEND|EXTENDED FACILITATE|FACILITATED FLASH|FLASHED FLIP|FLIPPED FORMAT|FORMATTED FRY|FRIED GATHER|GATHERED IDENTIFY|IDENTIFIED IGNORE|IGNORED IMPLEMENT|IMPLEMENTED IMPLODE|IMPLODED INCLUDE|INCLUDED INCREASE|INCREASED INCREMENT|INCREMENTED INSTALL|INSTALLED INDICATE|INDICATED INSTRUCT|INSTRUCTED INVOKE|INVOKED JUGGLE|JUGGLED KICK|KICKED KLOOJE|KLOOJED LIFT|LIFTED LIGHT|LIGHTED LIMIT|LIMITED LINK|LINKED LOAD|LOADED LOCATE|LOCATED MANIPULATE|MANIPULATED MULTIPLY|MULTIPLIED MUNCH|MUNCHED NEGATE|NEGATED NUMBER|NUMBERED OPEN|OPENED ORDER|ORDERED OUTPUT|OUTPUTTED OVERFLOW|OVERFLOWED PAINT|PAINTED PASS|PASSED PERCEIVE|PERCEIVED PERFORM|PERFORMED PICK|PICKED PLAN|PLANNED POKE|POKED PORT|PORTED PREPARE|PREPARED PROCESS|PROCESSED PRODUCE|PRODUCED PROGRAM|PROGRAMMED PROTECT|PROTECTED PROMPT|PROMPTED PUNCH|PUNCHED QUESTION|QUESTIONED RANDOMIZE|RANDOMIZED READ|READ REJECT|REJECTED RENAME|RENAMED REPEAT|REPEATED REPRESENT|REPRESENTED SAVE|SAVED SCRATCH|SCRATCHED SCRAWL|SCRAWLED SELECT|SELECTED SHOW|SHOWED SHREAD|SHREADED SPECIFY|SPECIFIED SPEW|SPEWED SPOOL|SPOOLED STIR|STIRRED SUPPORT|SUPPORTED TAG|TAGGED TAX|TAXED TERMINATE|TERMINATED TIME|TIMED TOAST|TOASTED TOGGLE|TOGGLED TOUCH|TOUCHED TRIPLE|TRIPLED TWEEK|TWEEKED TWIST|TWISTED TYPE|TYPED UNDERMINE|UNDERMINED UNLOAD|UNLOADED USE|USED WRIGGLE|WRIGGLED WRINKLE|WRINKLED ZAP|ZAPPED %prep ABOVE ABOUT AROUND ALONGSIDE ATOP BESIDE BETWEEN THROUGH AFTER WITH ON OVER UNDER NEXT TO OUTSIDE OF INSIDE BY FROM ACROSS FROM BELOW WITHOUT BY INSIDE OUTSIDE FROM ABOVE ABOUT AROUND BESIDE icon-9.4.3/ipl/data/noci.wrd0000664000175000017500000000061607140713044015151 0ustar chrishchrishanociassociation chronocinematography Cyanocitta genocidal genocide gymnocidium monocilated monocilia monociliate monociliated monociliceae monocite Noci nociassociation nocible nociceptive nociceptor nocifensor nociferous nocin nociperception nociperceptive nocite nocive nocivous Parthenocissus phonocinematograph pneumonocirrhosis trypanocidal trypanocide uranocircite zonociliate Nocine nocite icon-9.4.3/ipl/data/poe.txt0000664000175000017500000000042407140713044015024 0ustar chrishchrish On the Future!-how it tells Of the rapture that impells To the swinging and the ringing Of the bells, bells, bells- Of the bells, bells, bells, bells, Bells, bells, bells- To the rhyming and the chiming of the bells! icon-9.4.3/ipl/data/pt1.gmr0000664000175000017500000000006307140713044014712 0ustar chrishchrishS -> A # A -> a B a A -> EPSILON B -> a b A B -> c icon-9.4.3/ipl/data/pt2.gmr0000664000175000017500000000012707140713044014714 0ustar chrishchrishA -> ( B ) A -> B , C A -> a B -> ( C ) B -> C , A B -> b C -> ( A ) C -> A , B C -> c icon-9.4.3/ipl/data/pt3.gmr0000664000175000017500000000002407140713044014711 0ustar chrishchrishS -> ( S ) S -> ( ) icon-9.4.3/ipl/data/pt4.gmr0000664000175000017500000000003107140713044014710 0ustar chrishchrishS -> C C C -> c C C -> d icon-9.4.3/ipl/data/pt5.gmr0000664000175000017500000000011507140713044014714 0ustar chrishchrishs -> stmt s -> ifstmt ifstmt -> if exp then s ifstmt -> if exp then s else s icon-9.4.3/ipl/data/pt6.gmr0000664000175000017500000000127507140713044014725 0ustar chrishchrishprogram -> PROGRAM ID ; declarations compound_stmt . declarations -> declarations VAR id_list : INTEGER ; declarations -> EPSILON id_list -> ID id_list -> id_list , ID compound_stmt -> BEGIN optional_stmts END optional_stmts -> stmt_list optional_stmts -> EPSILON stmt_list -> stmt stmt_list -> stmt_list ; stmt stmt -> ID := simple_expression stmt -> compound_stmt stmt -> IF expression THEN stmt ELSE stmt stmt -> IF expression THEN stmt expression -> simple_expression expression -> simple_expression RELOP simple_expression simple_expression -> term simple_expression -> simple_expression ADDOP term term -> factor term -> term MULOP factor factor -> ID factor -> INTCON factor -> ( expression ) icon-9.4.3/ipl/data/a2n.csg0000664000175000017500000000012507140713044014654 0ustar chrishchrish# a(2(n)) # Salomaa, pp. 13-14 # G->YXY YX->YZ 2:ZX->XXZ 2:ZY->XXY X->a Y-> G:20 icon-9.4.3/ipl/docs/0002775000175000017500000000000010336137153013523 5ustar chrishchrishicon-9.4.3/ipl/docs/polywalk.txt0000664000175000017500000000666707140713036016142 0ustar chrishchrish1.0 Introduction ---------------- This is a short walkthrough of the polydemo program, with examples of the use of all of the available commands. I am assuming that you have already looked at the header of the source code of polydemo, which describes the options available in the polydemo. When a series of commands or entries must be given, they will be listed here separated by commas. Each entry in such a list should be followed by pressing Return or Enter. Single-letter commands must always be followed with Enter as well. The case of any letter is ignored. 2.0 Preparing the polydemo program ---------------------------------- Polydemo requires the library polystuf, also included on this disk. To set up polydemo for running, first translate polystuf into ucode files with ICONT -c polystuf and then translate polydemo with ICONT polydemo after which you can run polydemo in whatever manner your system allows. 3.0 A sample run ---------------- Let's say we had to perform the following: find the result of evaluating 4 3.1 0.7 5 4 (9x + 6x + 5 - 3x ) - (12x - 4.2x + x) at x = 2.2. Start the polydemo program. A menu of options will be displayed, as will the slots that are filled (none yet) and a prompt containing valid characters corresponding to the options. Enter R to read in a polynomial from the keyboard, then give A as the slot of the first polynomial. Enter these numbers: 9, 4, 6, 3.1, 5, 0, -3, 0.7, 0. Now, the first polynomial will be stored in slot "a." Note that the 0 is necessary after the 5 to use a constant term, and that the 0 at the end is for stopping data entry. A similar process can be used for the second polynomial. Inputting R, B, 12, 5, -4.2, 4, 1, 1, 0 will place that polynomial in slot "b." Now, check to make sure you've entered the polynomials correctly. Type W for "write" and A for slot "a," to display the first polynomial on the screen. It should appear as 9x^4 + 6x^3.1 + -3x^0.7 + 5. Do the same for the second polynomial (replacing the A with a B). The output should be 12x^5 + -4.2x^4 + x. To find their difference, enter S for subtract, then A, B to indicate those two polynomials, then C as a slot for the answer. Note that the result isn't immediately displayed; you must use W, C for that. The answer should be -12x^5 + 13.2x^4 + 6x^3.1 + -x + -3x^0.7 + 5. Finally, to evaluate this polynomial at x = 2.2, type E for evaluate, C for the slot in which that polynomial is held, then 2.2 for the x-value. You should receive the message "The result is -242.498468213815," or something similar, depending on the precision of real numbers in your implementation of Icon. The Add and Multiply commands are invoked similarly to the Subtract command. The Clear option allows you to empty a slot, making room for a new polynomial. This is necessary because you cannot overwrite an existing polynomial. Asking for Help displays the list of options and the letters needed to access them. Lastly, using Quit exits the program. It would be good to test operations in which one or both polynomials are zero. A zero polynomial is made when, during entry, a 0 is the first and only coefficient given, or when it is the result of an operation. Also, to make sure no "1x", "-1x" or "x^1" appears in a written polynomial (these should be "x", "-x", and "x," respectively), try working with polynomials that have these terms. icon-9.4.3/ipl/docs/README0000664000175000017500000000057507304761033014411 0ustar chrishchrish address.txt documentation for address procedures hebcalen.hlp documentation for hebcalen.icn hebcalpi.hlp documentation for hebcalpi.icn iconmake.txt make skeleton for Icon ipp.txt supplementary documentation for ipp.icn mr.man manual page for mr.icn post.1 manual page source for post.icn polywalk.txt description of polynomial programs pt.man manual page for pt.icn icon-9.4.3/ipl/docs/iconmake.txt0000664000175000017500000000160607303573447016065 0ustar chrishchrish A generic makefile skeleton for Icon programs by Bob Alexander: ------------------------------------------------------------------------- # # Makefile for Icon Programming Language program: # PROGRAM=|>Program Name<| # # To customize this file, usually only the definitions of macros # PROGRAM and FILES require modification. # # # Specification of separate files that make up the program. # # Note that the .u1 suffix is used here; the corresponding .icn files # are automatically identified by the implicit rule. # FILES=|>List of component files, space separated, using .u1 suffix<| # # Option flag definitions, etc. # ICFLAGS=-s IFLAGS=-s ICONT=icont # # Implicit rule for making ucode files. # .SUFFIXES: .u1 .icn .icn.u1: $(ICONT) -c $(ICFLAGS) $* # # Explicit rules for making an Icon program. # all: $(PROGRAM) $(PROGRAM): $(FILES) $(ICONT) -o $(PROGRAM) $(IFLAGS) $(FILES) icon-9.4.3/ipl/docs/hebcalen.hlp0000664000175000017500000000667407140713036016003 0ustar chrishchrishThis program accepts a year of the Jewish calendar, for example "5750", and produces on the screen a calendar of that year with a visually equivalent civil calendar opposite it for easy conversion of dates. The months of the civil year are abbreviated to JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC and of the Jewish calendar to NIS IYA SIV TAM AV ELU TIS HES KIS TEV SHE ADA AD2. Months are normally displayed three at a time. You call up the next three by hitting spacebar. At the end of the year you can indicate if you wish the program to conclude, by hitting spacebar again. If in response to the question, Do you wish to continue? you enter "y" and hit return, the next year will be displayed. Each Jewish month has its name on the left. The corresponding secular dates will have the name of the month on the right, and when the month changes it will be indicated on the right also. If you wish, you may enter a civil year in the form -70 for BCE dates and +70 for CE dates. The Jewish year beginning prior to Jan 1 of that year will be displayed, and you can continue with the next Jewish year if you wish to complete the desired civil year. You may enter CE or AD instead of + or BC or BCE instead of the minus sign if you wish. It is best to avoid spaces, so enter 1987AD, for example. The year 0 is not meaningful in either calendar. No date prior to 1 in the Jewish calendar should be entered. The program will calculate any future year, but will take longer for years much beyond the year 6000 in the Jewish reckoning. For example, the year 7000 will take three minutes or so to appear if your machine is not very fast. Earlier years should appear in a few seconds. A status line at the bottom of the screen indicates the civil and Jewish year, and the number of days in each. Jewish years may contain 354, 355, 356, 384, 385 or 386 days according to circumstances. When you are familiar with this program you can enter the years you wish to see on the command line. For example, if you call the program iconx calendar 5704 +1987 1BC you will see in turn the Jewish year 5704, the Jewish year commencing in 1986 and the Jewish year commencing in 2 B.C.E. You still have the option of seeing the years subsequent to these years if you wish. Just enter "y" when asked if you want to continue. When you enter "n", you will get the next year of your list. All civil dates are according to the Gregorian Calendar which first came into use in 1582 and was accepted in different places at different times. Prior to that date the Julian calendar was in use. At the present time the Julian calendar is 13 days behind the Gregorian Calendar, so that March 15 1917 in our reckoning is March 2 in the Julian Calendar. The following table shows the number of days that must be subtracted from the Gregorian date given here to find the Julian date. In the early centuries of this table and before, the calendar was intercalated erratically, so a simple subtraction is not possible. Note that the change in the number to subtract applies from March 1 in the century year, since in the Julian Calendar that will be February 29 except in years divisible by 400 which are leap years in the Gregorian calendar also. Century # to subtract Century # to subtract 21 13 11 6 20 13 10 5 19 12 9 4 18 11 8 4 17 10 7 3 16 10 6 2 15 9 5 1 14 8 4 1 13 7 3 0 12 7 2 -1 1 -2 icon-9.4.3/ipl/docs/mr.man0000664000175000017500000000502407140713036014634 0ustar chrishchrish.\" mr.man version 1.0 .\" copyright 1991 Ronald Florence .TH MR LOCAL "7 Feb 1992" .SH NAME mr \- mail (or news) reader .SH SYNOPSIS .B mr [ .I spool ] .SH DESCRIPTION Mr is a simple reader for mail and/or news spools. It won't obsolete elm, mailtool, emacs, mush, or even /usr/ucb/Mail, but it allows a reader to page, reply-to, save, append, print, forward, pipe, originate, conceal or reveal headers, and delete or undelete mail. Mr can also be used to read the news spools produced by the bsnews news system for leaf nodes. .SH COMMANDS An alternate mail or news spool can be named on the command line. The initial display lists waiting messages: .ta .5i 1i 3.5i .sp .nf .if t .ft CR 1 FOP [ 22:ron@mlfarm.com (R] How to use mr .ie t .ft CB .el .ft B 2 DOR [985:goer@sophist.uchi] Improving MR (part I) .ie t .ft CR .el .ft R 3 N [ 61:ralph@cs.arizona.] MS-Dos Pipes .ft R .fi .P The letters after the message number indicate the status of the message; New, Old, Replied-to, Printed, Deleted, Saved, Forwarded. The number inside the square brackets is the number of lines in the message, followed by the author's name and/or email address, and the subject. The current message is highlighted in bold or reverse video, depending on the capabilities of the display. The prompt shows the current message number and the total number of messages. The following commands can be given: .sp .nf .RS A Append current message to a file D Delete current message F Forward current message G Get new mail H Help L List headers M Mail to a new recipient N Next message P Print current message Q Quit, saving changes R Reply-to current message S Save current message to a file U Undelete current message V View all headers X eXit without saving changes | pipe current message to a command ! execute command # make # current message + next message - previous message ? help .RE .fi .P Pressing .RI < return > will page thru the current message, then advance the current message number. Press .I Q or .I N at a .SM MORE prompt to return to the command prompt. .SH ENVIRONMENT The .SM EDITOR and .SM MAILSPOOL environmental variables can be used to override default settings. Mr uses the .SM TERM and .SM TERMCAP variables to lookup screen parameters and control strings. .SH SEE ALSO mail(1), sendmail(1), bsnews(\s-1LOCAL\s0) .SH BUGS The pseudo-pipes used for ms-dos cannot handle a complex command. Some users would undoubtedly prefer getch() style command parsing. The pager used to display messages does not back-up. .SH AUTHOR Ronald Florence (ron\s-2@\s0mlfarm.com). icon-9.4.3/ipl/docs/address.txt0000664000175000017500000001015307303573447015721 0ustar chrishchrish Processing Address Lists in Icon Ralph E. Griswold Department of Computer Science, The University of Arizona Introduction Version 8.1 of the Icon program library contains a collection of programs for processing address lists. These programs check the correctness of address lists, filter them for designated entries, sort them, and format mailing labels. The format of addresses lists processed by these programs is loosely structured. This allows such lists to be created and maintained using any text editor and allows them to be used for a variety of purposes (not just for addresses, although that term is used here for simplicity). The lack of structure, on the other hand, allows ambiguities and the possibility of incorrectly organized data. These programs are no substitute for a database system or an application specifically dedicated to the handling of mailing lists. Address_List_Format An address list, in the sense the term is used here, is a sequence of entries. Each entry begins with a header line, in which the first character is a #. Subsequent lines contain the address information in a natural format with a few constraints that are necessary if some of the programs described in the next section are to be used. For example, an address list might look like this: # Mr. Fred Burfle 1010 Wayside Lane Scottsdale, AZ 85254 # Prof. M. Elwood Mork 5235 Courtland Blvd., Apt. 23 Minneapolis, MN 55432 . . . Since a # at the beginning of a line constitutes a header, a # cannot appear as the first character of a line in an entry. One work-around for this problem is to put a blank in front of a # that otherwise would appear at the beginning of a line in an entry. Within an entry, a line whose first character is a * is con- sidered to be a comment and is not treated as significant text. For example, such comment lines are ignored when formatting IPD171 - 1 - September 4, 1991 mailing labels. Comment lines can be used for information like telephone numbers. The # that starts a header line can be followed by one or more designator characters. Several of the programs can select only those entries with specific designators. The choice of designator characters is up to the user. For example, #a might be used to designate active accounts, while #b might be used to designate bad addresses. Organization_of_Entry_Information Some of the programs that process address lists expect the entries to be in a specific form. For example, the first line of an entry (after the header) is expected to be a name if the entry is an actual address. Similarly, for addresses in the United States, the last line of an entry is expected to be the city, followed by a comma, fol- lowed by the postal-code abbreviation for the state, followed by one or more blanks, followed by the ZIP code. See the examples above. For an address outside the United States, the last line is expected to consist only of the country name, in all uppercase letters. Programs The following programs are available for processing address lists: adlcheck Checks lists for bad data. Options include checking the state and ZIP code (U.S. only), country name, and for fitting in the confines of a standard one- up mailing label. adlcount Counts the number of labels in a list with optional restriction to entries with specified designators. adlfiltr Filters a list, outputting only those entries with specified designators. adllist Lists ``fields'' of address list entries, including addressee name, city, state, ZIP code, and country. adlsort Sorts address list entries by addressee name, ZIP code, or country. labels Produces one-up mailing labels for designated entries. See the programs themselves for detailed documentation. IPD171 - 2 - September 4, 1991 icon-9.4.3/ipl/docs/pt.man0000664000175000017500000000527507140713036014651 0ustar chrishchrishPT NAME pt - canonical LR(1) parse (action and goto) table generator. The input grammar productions with added enumerations, needed as part of the reduction in the action table, is also part of the output. (Various optional outputs are possible:- terminal sets nonterminal sets first sets for nonterminals items in each state) SYNOPSIS pt [ option | option | ... ] DESCRIPTION Pt reads the grammar from the file called grammar, if one exists, else it will read from standard input. The grammar MUST conform to the following:- 1. It must be a context-free grammar, augmented or unaugmented. 2. Each production is of the form:- A -> B ; C a The arrow separates the left side of the production from the right side. The left side of the production consists of only one nonterminal. The right side of the production consists of a sequence of symbols (terminals, nonterminals) with one or more white spaces (blanks and tabs) separating them. A symbol is thus either a terminal or a nonterminal but not both. 3. One production per line; no alternation allowed. Thus, represent the following 2 productions:- A -> B ; C a | b by:- A -> B ; C a A -> b 4. Newline character, tab and blank cannot be a grammar token (terminal or nonterminal). 5. The left hand side symbol of the very first production represents the starting symbol of the grammar. 6. The following are "reserved" words:- START EOI and cannot be used as a terminal or nonterminal. 7. EPSILON is considered another "reserved" word and can be used to represent an empty production, viz. H -> EPSILON No error messages will be issued if the input grammar does not conform to the above specifications. The options, which can appear in any order, are:- -t Print the list of terminals in the grammar. -nt Print the list of nonterminals in the grammar. -f Print the list of first sets of the nonterminals in the grammar. -e Print the list of items (i.e. closure) in each state. FILES grammar grammar file with format specified above. SEE ALSO yacc Aho A.V., Sethi, R. and Ullman, J.D., Compilers: Principles, Techniques, and Tools. Addison-Wesley, 1986. DIAGNOSTICS All shift/reduce conflicts will be reported (to errout). In the table form, only shift will be shown. To avoid reduce/reduce conflict the grammar should be unambiguous with left-factoring performed if necessary. Unrecognized options or arguments in the command line will be ignored. BUGS No known bugs! AUTHOR Deeporn H. Beardsley icon-9.4.3/ipl/docs/post.10000664000175000017500000000313107140713036014565 0ustar chrishchrish.\" post.man version 1.5 .TH POST LOCAL "2 Oct 1991" .SH NAME post \- news poster .SH SYNOPSIS .B post [ .BI \-n\ newsgroups ] [ .BI \-s\ subject ] [ .BI \-d\ distribution ] [ .BI \-f\ followup-to ] [ .BI \-p\ quote-prefix ] [ .B \- | .I news-article ] .SH DESCRIPTION .I Post posts a news article to Usenet via inews, uux, or mail. Given an optional argument of the name of a file containing a news article, or an argument of `\-' and a news article via stdin, .I post creates a follow-up article, with an attribution and quoted text. .I Post can be invoked as a filter from a newsreader: .RB ` "|post \-" ' would create a followup article to the current article in the newsreader. The newsgroups, subject, distribution, follow-up, and quote-prefix (the default is ` > ') can be specified on the command line. .PP .I Post is compatible with C-News, B-news, and bsnews (Bootstrap News). On systems with inews, the newsgroups and distribution are validated in the appropriate news system files. .SH ENVIRONMENT The environment variable .SM EDITOR overrides the default editor. .SM ORGANIZATION overrides the file /usr/lib/news/organization to specify an optional Organization header. On non-Unix\u\s-3TM\s0\d systems, the environment variable .SM HOST may be used to override the Icon keyword .I &host as the sitename. .SH BUGS The code to validate newsgroups assumes the file /usr/lib/news/active is sorted. .SH AUTHOR Ronald Florence (ron\s-2@\s0mlfarm.com). The code to generate a temporary file name is from Richard Goerwitz (goer\s-2@\s0sophist.uchicago.edu). Options.icn is from the Icon Program Library. icon-9.4.3/ipl/docs/hebcalpi.hlp0000664000175000017500000000771507140713036016006 0ustar chrishchrishHere is the alternate help for the calendar in ProIcon. This program accepts a year of the Jewish calendar, for example "5750", and produces on the screen a calendar of that year with a visually equivalent civil calendar opposite it for easy conversion of dates. The months of the civil year are abbreviated to JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC and of the Jewish calendar to NIS IYA SIV TAM AV ELU TIS HES KIS TEV SHE ADA AD2. Months are normally displayed three at a time. You call up the next three by hitting the space bar (or any other character). You may conclude at this point if you wish by clicking on the word "Run" at the top of the screen, dragging down to "Stop" and releasing. At the end of the year you can indicate if you wish to view the next following year by entering the letter "y" in response to the question, Do you wish to continue? If you enter "n" the program will conclude, or go on to the next year you wished to see if you called the program with multiple entries of years. (See below.) Each Jewish month has its name on the left. The corresponding secular dates will have the name of the month on the right, and when the month changes it will be indicated on the right also. If you wish, you may enter a civil year in the form -70 for BCE dates and +70 for CE dates. The Jewish year beginning prior to Jan 1 of that year will be displayed, and you can continue with the next Jewish year if you wish to complete the desired civil year. You may enter CE or AD instead of +, or BC or BCE instead of the minus sign if you wish. Avoid spaces, so enter 1987AD, for example. The year 0 is not meaningful in either calendar. No date prior to 1 in the Jewish calendar should be entered. The program will calculate any future year, but will take longer for years much beyond the year 6020 in the Jewish reckoning. For example, the year 7000 will take three minutes or so to appear. Earlier years should appear in a few seconds. A status line at the bottom of the screen indicates the civil and Jewish year, and the number of days in each. Jewish years may contain 354, 355, 356, 384, 385 or 386 days according to circumstances. When you are familiar with this program you can enter any number of years you wish to see. Before you start the program, click on "Options", drag to "Parameter String" and release. You can then enter, for example 5704 +1987 1BC then click on the box marked "OK". If you want to change these later, go back to "Options" and type in your new list. You will see in turn the Jewish year 5704, the Jewish year commencing in 1986 and the Jewish year commencing in 2 B.C.E. You still have the option of seeing the years subsequent to these years if you wish. Just enter "y" when asked if you want to continue. When you enter "n", you will get the next year of your original list. When you are completely through with the program, click on "File" at the top of the screen, drag to "Quit" and release. If you wish you can drag to "Transfer" and you will see a dialogue box to transfer to another program, or to Hypercard. All civil dates are according to the Gregorian Calendar which first came into use in 1582 and was accepted in different places at different times. Prior to that date the Julian calendar was in use. At the present time the Julian calendar is 13 days behind the Gregorian Calendar, so that January 20 1990 in our reckoning is January 7 in the Julian Calendar. The following table shows the number of days that must be subtracted from the Gregorian date given here to find the Julian date. In the centuries before the current era the calendar was intercalated erratically, so a simple subtraction is not possible. Century # to subtract Century # to subtract 21 13 11 6 20 13 10 5 19 12 9 4 18 11 8 4 17 10 7 3 16 10 6 2 15 9 5 1 14 8 4 1 13 7 3 0 12 7 2 -1 1 -2 icon-9.4.3/ipl/docs/ipp.txt0000664000175000017500000001556307303574561015074 0ustar chrishchrish An Icon Pre-Processor Frank J. Lhota Mei Associates, Inc. 1050 Waltham Street Lexington, MA 02173-8024 Voice: (617) 862-3390 FAX: (617) 862-5053 The Icon Programming Library comes with an Icon preprocessor called IPP. I have made several enhancements to this program, and I would like to submit the enhanced version of the IPP to the IPL. New IPP features For those who are not familiar with the IPP, the header comments in the IPP.ICN file provide complete intructions on its use. The rest of this section assumes a familiarity with the previous version of the IPP. This new version of the IPP processes #line directives, which can be used to change the value of the _LINE_ and _FILE_ symbols. Also, the new IPP wiil generates #line directives when needed, so that the preprocessor output will always indicate the original source of its text. As a result, if we pipe the output of IPP to icont, e.g., iconx ipp.icx foo.icn | icont -ofoo - then (assuming that the source itself does not have any line directives) the &file and &line keywords refer to the lines in the original source file, not to "stdin" and the line numbers of the IPP output. The #line directives will be generated even when other comments are being stripped from the input. The preprocessor command syntax has been relaxed a bit. The basic form of a preprocessor command line is still $command [arguments] but now the user is permitted to include spaces around the '$', so that preproccessor commands can have a pretty-print look, e.g. $ifndef FOO $if BAR = 0 $ define FOO -1 $else $ define FOO BAR $endif $endif # ndef FOO - 1 - On non-UNIX systems, the new IPP has a more liberal search algorithm for $include files. For files enclosed with <>, the directories specified in the IPATH environment variable are searched for the file. The search for file enclosed in "" starts with the current directory, then proceeds to the IPATH directories. As before, the -I command line option can be used to add directories to the beginning of the standard search path. The following preprocessor commands have been added to IPP: $elif: Invoked as 'elif constant-expression'. If the lines preceding this command were processed, this command and the lines following it up to the matching $endif command are ignored. Otherwise, the constant-expression is evaluated, and the lines following this command are processed only if it produces a result. $error: This command issues a error, with the text coming from the argument field of the command. As with all errors, processing is terminated. $warning: This command issues a warning, with the text coming from the argument field of the command. In addition to the operators previously supported, the constant expressions appearing in $if / $elif command can now use the unary versions of the '+' and '-' operators, and the 'not' control structure. Also, backtracking is used in the evaluation of constant expressions, so that when the command $if FOO = (2|3) is processed, the lines following it are processed precisely when either FOO equals 2 or FOO equals 3. Uses of the IPP To understand the following examples, the reader should keep in mind this feature of the IPP: The IPP creates a pre-defined symbol out of each string generated by &features. These symbols are created by taking the non-letter characters of the &features strings and replacing them with underscores. Thus, if &features includes UNIX, the symbol UNIX is defined; if co-expressions are supported, the symbol co_expressions is defined, and so on. The IPP can be an handy tool for distributing Icon programs that require some customization for specific implementations. A prime example of this is the IPP itself. IPP must be able to contruct a - 2 - full pathname for a file, given a directory and file name. On many systems, this is done by performing the catenation directory || "/" || filename This file naming convention is not, however, universal. On DOS and OS/2 systems, "\\" should be used instead of "/" to separate the directory and filename. Under VMS, the separator should be "". To accomodate these system-dependant variations, the IPP source (in the file IPP.ICN, on this disk) is written using the symbol DIR_SEP for the string that separates the directory and filename portions of a complete path. The IPP code starts with the preprocessor directives: $ifndef DIR_SEP $ifdef UNIX $define DIR_SEP "/" $elif def(MS_DOS) | def(MS_DOS_386) | def(OS_2) $define DIR_SEP "\\" $elif def(VMS) $define DIR_SEP "" $else $error Need a definition for DIR_SEP $endif $endif # ndef DIR_SEP After preprocessing this code, DIR_SEP will be "/" on UNIX systems, and "\\" on DOS and OS/2 systems. For other systems, an appropriate value for DIR_SEP could be specified on the preprocessor command line by using the -D options, e.g. ipp -D DIR_SEP=\"\" ipp.ipp ipp.icn Another example of Icon software that could exploit IPP customization is BINCVT, the IPL package of utilities for converting between integers and their internal binary representations. The version of BINCVT currently included in the IPL assumes a "big-endian" system. On "big-endian" systems, the bytes in the binary representation of an integer are arranged from most significant to least significant. However, major platforms such as the IBM PC family or the VAX machines use the "little-endian" method for storing integers, in which the bytes representing an integer go from least significant to most significant. Using IPP, one can write a version of BINCVT that can be preprocessed to produce a working package for either big-endian or little-endian systems. The symbol LITTLE_ENDIAN will be defined (via the command line option -D LITTLE_ENDIAN) to produce output for little endian systems. Most of the functions in BINCVT can be expressed in terms of starting at the most significant byte, and moving to the less significant bytes. Hence, the generalized BINCVT starts with the definitions: - 3 - $ifdef LITTLE_ENDIAN $define GOTO_BIG_END tab (0) $define TO_SMALL_END -1 $else $define GOTO_BIG_END $define TO_SMALL_END 1 $endif Using these definitions, we can write a version of the unsigned function that will work for either integer storage method: procedure unsigned(s) local result result := 0 s ? { GOTO_BIG_END while result := ord(move(TO_SMALL_END)) + result * 16r100 } return result end The file BINCVT.IPP on this disk contains the source code for this example. Conclusions The IPP allows Icon programmers to write more flexable and more portable code. The latest version of the IPP is easier to use and more powerful than the previous version. - 4 - icon-9.4.3/ipl/incl/0002775000175000017500000000000010336137157013524 5ustar chrishchrishicon-9.4.3/ipl/incl/lshade.icn0000664000175000017500000000134207140713036015450 0ustar chrishchrish############################################################################ # # File: lshade.icn # # Subject: Definitions for VRML 1.0 ornament # # Author: Ralph E. Griswold # # Date: July 27, 1997 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # This VRML object is a kind of lampshade. # ############################################################################ Separator([ #. VRML 1.0 lampshade Cone(10.0, 1.0), Cone(9.0, 2.0), Cone(8.0, 3.0), Cone(7.0, 4.0), Cone(6.0, 5.0), Cone(5.0, 6.0), Cone(4.0, 7.0) ]) icon-9.4.3/ipl/incl/invkdefs.icn0000664000175000017500000000316507140713036016026 0ustar chrishchrish############################################################################ # # File: invkdefs.icn # # Subject: Definitions for operator symbols # # Author: Ralph E. Griswold # # Date: February 12, 1995 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # These definitions can be used in string invocation, as in # # Plus(i, j) # # Operators that cannot be used in string invocation in the Icon interpreter # are omitted. # ############################################################################ # Unary operators $define Postive "+" $define Negative "-" $define Complement "~" $define Match "=" $define Activate "@" $define Refresh "^" $define Size "*" $define Random "?" $define Generate "!" $define Null "/" $define Notnull "\\" $define Dereference "." # Binary operators $define Plus "+" $define Minus "-" $define Times "*" $define Divide "/" $define Remainder "%" $define Raise "^" $define Union "++" $define Difference "--" $define Intersection "**" $define Catenation "||" $define ListCatenation "|||" $define Conjunction "&" $define GreaterThan ">" $define GreaterEqual ">=" $define Equal "=" $define LessEqual "<=" $define LessThan "<" $define NotEqual "~=" $define LexGreaterThan ">>" $define LexGreaterEqual ">>=" $define LexEqual "==" $define LexLessEqual "<<=" $define LexLessThan "<<" $define LexNotEqual "~==" $define Equivalent "===" $define NotEquivalent "~===" # Other forms $define ToBy "..." $define Subscript "[]" $define Section "[:]" icon-9.4.3/ipl/incl/opdefs.icn0000664000175000017500000000557307140713036015502 0ustar chrishchrish############################################################################ # # File: opdefs.icn # # Subject: Definitions for Icon virtual-machine instructions # # Author: Ralph E. Griswold # # Date: June 8, 1994 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # This file provides definitions for the codes for the Icon virtual # machine. # ############################################################################ $define Op_Asgn "\x1" $define Op_Bang "\x2" $define Op_Cat "\x3" $define Op_Compl "\x4" $define Op_Diff "\x5" $define Op_Div "\x6" $define Op_Eqv "\x7" $define Op_Inter "\x8" $define Op_Lconcat "\x9" $define Op_Lexeq "\xa" $define Op_Lexge "\xb" $define Op_Lexgt "\xc" $define Op_Lexle "\xd" $define Op_Lexlt "\xe" $define Op_Lexne "\xf" $define Op_Minus "\x10" $define Op_Mod "\x11" $define Op_Mult "\x12" $define Op_Neg "\x13" $define Op_Neqv "\x14" $define Op_Nonnull "\x15" $define Op_Null "\x16" $define Op_Number "\x17" $define Op_Numeq "\x18" $define Op_Numge "\x19" $define Op_Numgt "\x1a" $define Op_Numle "\x1b" $define Op_Numlt "\x1c" $define Op_Numne "\x1d" $define Op_Plus "\x1e" $define Op_Power "\x1f" $define Op_Random "\x20" $define Op_Rasgn "\x21" $define Op_Refresh "\x22" $define Op_Rswap "\x23" $define Op_Sect "\x24" $define Op_Size "\x25" $define Op_Subsc "\x26" $define Op_Swap "\x27" $define Op_Tabmat "\x28" $define Op_Toby "\x29" $define Op_Unions "\x2a" $define Op_Value "\x2b" $define Op_Bscan "\x2c" $define Op_Ccase "\x2d" $define Op_Chfail "\x2e" $define Op_Coact "\x2f" $define Op_Cofail "\x30" $define Op_Coret "\x31" $define Op_Create "\x32" $define Op_Cset "\x33" $define Op_Dup "\x34" $define Op_Efail "\x35" $define Op_Eret "\x36" $define Op_Escan "\x37" $define Op_Esusp "\x38" $define Op_Field "\x39" $define Op_Goto "\x3a" $define Op_Init "\x3b" $define Op_Int "\x3c" $define Op_Invoke "\x3d" $define Op_Keywd "\x3e" $define Op_Limit "\x3f" $define Op_Line "\x40" $define Op_Llist "\x41" $define Op_Lsusp "\x42" $define Op_Mark "\x43" $define Op_Pfail "\x44" $define Op_Pnull "\x45" $define Op_Pop "\x46" $define Op_Pret "\x47" $define Op_Psusp "\x48" $define Op_Push1 "\x49" $define Op_Pushn1 "\x4a" $define Op_Real "\x4b" $define Op_Sdup "\x4c" $define Op_Str "\x4d" $define Op_Unmark "\x4e" $define Op_Var "\x50" $define Op_Arg "\x51" $define Op_Static "\x52" $define Op_Local "\x53" $define Op_Global "\x54" $define Op_Mark0 "\x55" $define Op_Quit "\x56" $define Op_FQuit "\x57" $define Op_Tally "\x58" $define Op_Apply "\x59" $define Op_Acset "\x5a" $define Op_Areal "\x5b" $define Op_Astr "\x5c" $define Op_Aglobal "\x5d" $define Op_Astatic "\x5e" $define Op_Agoto "\x5f" $define Op_Amark "\x60" $define Op_Noop "\x62" $define Op_SymEvents "\x64" $define Op_Colm "\x6c" icon-9.4.3/ipl/CheckAll0000775000175000017500000000652007715737324014205 0ustar chrishchrish#!/bin/ksh -p # # CheckAll -- Test-build all IPL components and run other sanity checks # # Assumes that there are binaries of Icon in ../bin # Combine stderr with stdout so both can be redirected together. exec 2>&1 # Set POSIX locale for expected behavior export LC_ALL=POSIX # Move library directory of out implicit search path # (and arrange to move it back on exit) V9=`cd ..; pwd` mv $V9/lib $V9/libsave trap 'mv $V9/libsave $V9/lib; exit' 0 1 2 15 # Set minimal path needed. (Not all systems have all these directories.) export PATH=$V9/bin:/usr/xpg4/bin:/usr/ccs/bin:/bin:/usr/bin # List timestamp of icont we'll be using ls -l $V9/bin/icont || exit # Use default Icon options unset BLKSIZE STRSIZE MSTKSIZE COEXPSIZE TRACE NOERRBUF FPATH IPATH LPATH # Clean out old versions of compiled procedures rm -f */*.u[12] # Diagnose duplicate filenames among procs and among progs. # (We allow one proc and one prog to have the same filename.) for t in procs progs; do ls *$t/*.icn | sed 's=.*/==' | sort | uniq -c | grep -v ' 1' | while read n f; do echo " DUPLICATE NAME:" *$t/$f done done # Start by building procedures, including cfuncs, needed by programs # Use only include-files guaranteed to be present with each part of library (echo cfuncs:; cd cfuncs; LPATH= make -s cfunc.u2) (echo procs:; cd procs; LPATH="../incl" icont -usc *icn) (echo gprocs:; cd gprocs; LPATH="../incl ../gincl" icont -usc *icn) # (echo mprocs:; cd mprocs; LPATH="../incl ../gincl ../mincl" icont -usc *icn) # Check for undeclared identifiers or insufficient links in the core modules. echo core modules: (cd procs; IPATH= icont -o ../xxx -us -fs core.u2) (cd gprocs; IPATH=../procs icont -o ../xxx -us -fs graphics.u2) # Check linkages for procedure files, ignoring most undeclared identifiers. IPATH=./cfuncs rm -f xxx for d in procs gprocs; do export IPATH="$IPATH ./$d" echo $d linkage: for f in `cd $d; ls *.icn`; do b=${f%.icn} # allow undeclared identifiers in main() for use with code generators (icont -o xxx -us -fs $b.u2 2>&1 || echo " -- failed in $b.u2") | grep -v ': undeclared identifier, procedure main' done done rm -f xxx # Define function for silent compilation, echoing name only on error function compile { icont -us $1 || echo " -- failed in $1"; } # Build programs from "bipl" portion, using only "bipl" library. # (For a better check, should really build using non-graphics version of Icon.) export LPATH="../incl" export IPATH="../procs ../cfuncs" (echo progs:; cd progs; for f in *.icn; do compile $f; done) # Build programs from "gipl" portion of distribution export LPATH="../incl ../gincl" export IPATH="../procs ../cfuncs ../gprocs" (echo gprogs:; cd gprogs; for f in *.icn; do compile $f; done) # Skip mprogs, which requires a specially build MT-Icon version # export LPATH="../incl ../gincl ../mincl" # export IPATH="../procs ../cfuncs ../gprocs ../mprocs" # (echo mprogs:; cd mprogs; for f in *.icn; do compile $f; done) # Test-build all the packages # Allow use of graphics within packs, because one loadfunc example needs it export LPATH="../../incl ../../gincl" export IPATH="../../cfuncs ../../procs ../../gprocs" for d in *packs/[a-z]*; do echo $d: (cd $d; make -s Clean; make -s) done icon-9.4.3/ipl/Makefile0000664000175000017500000000373707607563371014257 0ustar chrishchrish# Makefile for the Icon Program Library All: Ilib Ibin # Make a library distribution (portable ucode and include files). Ilib: cfuncs/libcfunc.so cfuncs/libcfunc.so: ../bin/icont cp incl/*.icn gincl/*.icn cfuncs/icall.h ../lib cd procs; LPATH= ../../bin/icont -usc *.icn; mv *.u? ../../lib cd gprocs; LPATH= ../../bin/icont -usc *.icn; mv *.u? ../../lib if grep '^ *# *define LoadFunc' ../src/h/define.h >/dev/null; \ then $(MAKE) Cfunctions; fi # Make C functions. Only called if LoadFunc is defined. Cfunctions: cd cfuncs; LPATH= $(MAKE) ICONT=../../bin/icont cp cfuncs/*.u? ../lib cp cfuncs/libcfunc.so ../bin # Make selected graphics program binaries (platform-dependent icode) # for ../bin, given that ../lib is ready Ibin: gpacks/vib/vib gpacks/vib/vib: ../bin/icont MAKE=$(MAKE) ./BuildBin # Make a full set of program binaries (not usually done) in ./iexe, # given that ../lib is ready Iexe: rm -f iexe/* MAKE=$(MAKE) ./BuildExe # Check for undefined identifiers in ../lib. # (A few are expected: references to Mp, program, init, goal). Undef: cd ../lib; for f in *.u2; do (echo $$f; icont -us -fs $$f); done # Check for stray files Strays: for d in *procs *progs *incl; do (cd $$d; pwd; gcomp CVS *.icn); done # Verify that all procedures and programs build, including packs, # and perform some other sanity checks Check: ./CheckAll # Make Zip files for separate distribution of the library ZipFiles: Ilib rm -rf ilib *.zip zip -qrX9 bipl.zip docs incl procs progs packs data cfuncs -x '*/CVS/*' zip -qrX9 gipl.zip gdocs gincl gprocs gprogs gpacks gdata -x '*/CVS/*' zip -qrX9 mipl.zip mincl mprocs mprogs -x '*/CVS/*' mkdir ilib cp ../lib/*.* ilib zip -qrX9 ilib.zip ilib rm -rf ilib # Clean up. Clean Pure: -rm -rf ilib iexe *.zip */*.u[12] */*.zip */*.so -rm -f xx `find *procs *progs -type f -perm -100 -print` for d in cfuncs *packs/[abcdefghijklmnopqrstuvwxyz]*; do \ (cd $$d; $(MAKE) Clean); done icon-9.4.3/ipl/gdata/0002775000175000017500000000000010336137154013654 5ustar chrishchrishicon-9.4.3/ipl/gdata/clr.pak0000664000175000017500000217364607140713052015146 0ustar chrishchrish########## c1.clr 0,0,0 10922,10922,10922 21845,21845,21845 32767,32767,32767 43690,43690,43690 54612,54612,54612 65535,65535,65535 65535,32767,40959 49151,32767,65535 65535,49151,32767 32767,16383,0 10922,5461,0 21845,0,0 43690,0,0 65535,0,0 65535,21845,21845 65535,43690,43690 40959,24575,24575 21845,5461,0 43690,10922,0 65535,16383,0 65535,32767,21845 65535,49151,43690 40959,28671,24575 21845,10922,0 43690,21845,0 65535,32767,0 65535,43690,21845 65535,54612,43690 40959,32767,24575 21845,21845,0 43690,43690,0 65535,65535,0 65535,65535,21845 65535,65535,43690 40959,40959,24575 10922,21845,0 21845,43690,0 32767,65535,0 43690,65535,21845 54612,65535,43690 32767,40959,24575 0,21845,0 0,43690,0 0,65535,0 21845,65535,21845 43690,65535,43690 24575,40959,24575 0,21845,10922 0,43690,21845 0,65535,32767 21845,65535,43690 43690,65535,54612 24575,40959,32767 0,21845,21845 0,43690,43690 0,65535,65535 21845,65535,65535 43690,65535,65535 24575,40959,40959 0,10922,21845 0,21845,43690 0,32767,65535 21845,43690,65535 43690,54612,65535 24575,32767,40959 0,0,21845 0,0,43690 0,0,65535 21845,21845,65535 43690,43690,65535 24575,24575,40959 10922,0,21845 21845,0,43690 32767,0,65535 43690,21845,65535 54612,43690,65535 32767,24575,40959 21845,0,21845 43690,0,43690 65535,0,65535 65535,21845,65535 65535,43690,65535 40959,24575,40959 21845,0,10922 43690,0,21845 65535,0,32767 65535,21845,43690 65535,43690,54612 40959,24575,32767 ########## c2.clr 0,0,0 0,0,65535 0,65535,0 0,65535,65535 65535,0,0 65535,0,65535 65535,65535,0 65535,65535,65535 32767,32767,32767 ########## c3.clr 0,0,0 0,0,32767 0,0,65535 0,32767,0 0,32767,32767 0,32767,65535 0,65535,0 0,65535,32767 0,65535,65535 32767,0,0 32767,0,32767 32767,0,65535 32767,32767,0 32767,32767,32767 32767,32767,65535 32767,65535,0 32767,65535,32767 32767,65535,65535 65535,0,0 65535,0,32767 65535,0,65535 65535,32767,0 65535,32767,32767 65535,32767,65535 65535,65535,0 65535,65535,32767 65535,65535,65535 10922,10922,10922 21845,21845,21845 43690,43690,43690 54612,54612,54612 ########## c4.clr 0,0,0 0,0,21845 0,0,43690 0,0,65535 0,21845,0 0,21845,21845 0,21845,43690 0,21845,65535 0,43690,0 0,43690,21845 0,43690,43690 0,43690,65535 0,65535,0 0,65535,21845 0,65535,43690 0,65535,65535 21845,0,0 21845,0,21845 21845,0,43690 21845,0,65535 21845,21845,0 21845,21845,21845 21845,21845,43690 21845,21845,65535 21845,43690,0 21845,43690,21845 21845,43690,43690 21845,43690,65535 21845,65535,0 21845,65535,21845 21845,65535,43690 21845,65535,65535 43690,0,0 43690,0,21845 43690,0,43690 43690,0,65535 43690,21845,0 43690,21845,21845 43690,21845,43690 43690,21845,65535 43690,43690,0 43690,43690,21845 43690,43690,43690 43690,43690,65535 43690,65535,0 43690,65535,21845 43690,65535,43690 43690,65535,65535 65535,0,0 65535,0,21845 65535,0,43690 65535,0,65535 65535,21845,0 65535,21845,21845 65535,21845,43690 65535,21845,65535 65535,43690,0 65535,43690,21845 65535,43690,43690 65535,43690,65535 65535,65535,0 65535,65535,21845 65535,65535,43690 65535,65535,65535 5461,5461,5461 10922,10922,10922 16383,16383,16383 27306,27306,27306 32767,32767,32767 38228,38228,38228 49151,49151,49151 54612,54612,54612 60073,60073,60073 ########## c5.clr 0,0,0 0,0,16383 0,0,32767 0,0,49151 0,0,65535 0,16383,0 0,16383,16383 0,16383,32767 0,16383,49151 0,16383,65535 0,32767,0 0,32767,16383 0,32767,32767 0,32767,49151 0,32767,65535 0,49151,0 0,49151,16383 0,49151,32767 0,49151,49151 0,49151,65535 0,65535,0 0,65535,16383 0,65535,32767 0,65535,49151 0,65535,65535 16383,0,0 16383,0,16383 16383,0,32767 16383,0,49151 16383,0,65535 16383,16383,0 16383,16383,16383 16383,16383,32767 16383,16383,49151 16383,16383,65535 16383,32767,0 16383,32767,16383 16383,32767,32767 16383,32767,49151 16383,32767,65535 16383,49151,0 16383,49151,16383 16383,49151,32767 16383,49151,49151 16383,49151,65535 16383,65535,0 16383,65535,16383 16383,65535,32767 16383,65535,49151 16383,65535,65535 32767,0,0 32767,0,16383 32767,0,32767 32767,0,49151 32767,0,65535 32767,16383,0 32767,16383,16383 32767,16383,32767 32767,16383,49151 32767,16383,65535 32767,32767,0 32767,32767,16383 32767,32767,32767 32767,32767,49151 32767,32767,65535 32767,49151,0 32767,49151,16383 32767,49151,32767 32767,49151,49151 32767,49151,65535 32767,65535,0 32767,65535,16383 32767,65535,32767 32767,65535,49151 32767,65535,65535 49151,0,0 49151,0,16383 49151,0,32767 49151,0,49151 49151,0,65535 49151,16383,0 49151,16383,16383 49151,16383,32767 49151,16383,49151 49151,16383,65535 49151,32767,0 49151,32767,16383 49151,32767,32767 49151,32767,49151 49151,32767,65535 49151,49151,0 49151,49151,16383 49151,49151,32767 49151,49151,49151 49151,49151,65535 49151,65535,0 49151,65535,16383 49151,65535,32767 49151,65535,49151 49151,65535,65535 65535,0,0 65535,0,16383 65535,0,32767 65535,0,49151 65535,0,65535 65535,16383,0 65535,16383,16383 65535,16383,32767 65535,16383,49151 65535,16383,65535 65535,32767,0 65535,32767,16383 65535,32767,32767 65535,32767,49151 65535,32767,65535 65535,49151,0 65535,49151,16383 65535,49151,32767 65535,49151,49151 65535,49151,65535 65535,65535,0 65535,65535,16383 65535,65535,32767 65535,65535,49151 65535,65535,65535 3276,3276,3276 6553,6553,6553 9830,9830,9830 13107,13107,13107 19660,19660,19660 22937,22937,22937 26214,26214,26214 29490,29490,29490 36044,36044,36044 39321,39321,39321 42597,42597,42597 45874,45874,45874 52428,52428,52428 55704,55704,55704 58981,58981,58981 62258,62258,62258 ########## c6.clr 0,0,0 0,0,13107 0,0,26214 0,0,39321 0,0,52428 0,0,65535 0,13107,0 0,13107,13107 0,13107,26214 0,13107,39321 0,13107,52428 0,13107,65535 0,26214,0 0,26214,13107 0,26214,26214 0,26214,39321 0,26214,52428 0,26214,65535 0,39321,0 0,39321,13107 0,39321,26214 0,39321,39321 0,39321,52428 0,39321,65535 0,52428,0 0,52428,13107 0,52428,26214 0,52428,39321 0,52428,52428 0,52428,65535 0,65535,0 0,65535,13107 0,65535,26214 0,65535,39321 0,65535,52428 0,65535,65535 13107,0,0 13107,0,13107 13107,0,26214 13107,0,39321 13107,0,52428 13107,0,65535 13107,13107,0 13107,13107,13107 13107,13107,26214 13107,13107,39321 13107,13107,52428 13107,13107,65535 13107,26214,0 13107,26214,13107 13107,26214,26214 13107,26214,39321 13107,26214,52428 13107,26214,65535 13107,39321,0 13107,39321,13107 13107,39321,26214 13107,39321,39321 13107,39321,52428 13107,39321,65535 13107,52428,0 13107,52428,13107 13107,52428,26214 13107,52428,39321 13107,52428,52428 13107,52428,65535 13107,65535,0 13107,65535,13107 13107,65535,26214 13107,65535,39321 13107,65535,52428 13107,65535,65535 26214,0,0 26214,0,13107 26214,0,26214 26214,0,39321 26214,0,52428 26214,0,65535 26214,13107,0 26214,13107,13107 26214,13107,26214 26214,13107,39321 26214,13107,52428 26214,13107,65535 26214,26214,0 26214,26214,13107 26214,26214,26214 26214,26214,39321 26214,26214,52428 26214,26214,65535 26214,39321,0 26214,39321,13107 26214,39321,26214 26214,39321,39321 26214,39321,52428 26214,39321,65535 26214,52428,0 26214,52428,13107 26214,52428,26214 26214,52428,39321 26214,52428,52428 26214,52428,65535 26214,65535,0 26214,65535,13107 26214,65535,26214 26214,65535,39321 26214,65535,52428 26214,65535,65535 39321,0,0 39321,0,13107 39321,0,26214 39321,0,39321 39321,0,52428 39321,0,65535 39321,13107,0 39321,13107,13107 39321,13107,26214 39321,13107,39321 39321,13107,52428 39321,13107,65535 39321,26214,0 39321,26214,13107 39321,26214,26214 39321,26214,39321 39321,26214,52428 39321,26214,65535 39321,39321,0 39321,39321,13107 39321,39321,26214 39321,39321,39321 39321,39321,52428 39321,39321,65535 39321,52428,0 39321,52428,13107 39321,52428,26214 39321,52428,39321 39321,52428,52428 39321,52428,65535 39321,65535,0 39321,65535,13107 39321,65535,26214 39321,65535,39321 39321,65535,52428 39321,65535,65535 52428,0,0 52428,0,13107 52428,0,26214 52428,0,39321 52428,0,52428 52428,0,65535 52428,13107,0 52428,13107,13107 52428,13107,26214 52428,13107,39321 52428,13107,52428 52428,13107,65535 52428,26214,0 52428,26214,13107 52428,26214,26214 52428,26214,39321 52428,26214,52428 52428,26214,65535 52428,39321,0 52428,39321,13107 52428,39321,26214 52428,39321,39321 52428,39321,52428 52428,39321,65535 52428,52428,0 52428,52428,13107 52428,52428,26214 52428,52428,39321 52428,52428,52428 52428,52428,65535 52428,65535,0 52428,65535,13107 52428,65535,26214 52428,65535,39321 52428,65535,52428 52428,65535,65535 65535,0,0 65535,0,13107 65535,0,26214 65535,0,39321 65535,0,52428 65535,0,65535 65535,13107,0 65535,13107,13107 65535,13107,26214 65535,13107,39321 65535,13107,52428 65535,13107,65535 65535,26214,0 65535,26214,13107 65535,26214,26214 65535,26214,39321 65535,26214,52428 65535,26214,65535 65535,39321,0 65535,39321,13107 65535,39321,26214 65535,39321,39321 65535,39321,52428 65535,39321,65535 65535,52428,0 65535,52428,13107 65535,52428,26214 65535,52428,39321 65535,52428,52428 65535,52428,65535 65535,65535,0 65535,65535,13107 65535,65535,26214 65535,65535,39321 65535,65535,52428 65535,65535,65535 2184,2184,2184 4369,4369,4369 6553,6553,6553 8738,8738,8738 10922,10922,10922 15291,15291,15291 17476,17476,17476 19660,19660,19660 21845,21845,21845 24029,24029,24029 28398,28398,28398 30583,30583,30583 32767,32767,32767 34952,34952,34952 37136,37136,37136 41505,41505,41505 43690,43690,43690 45874,45874,45874 48059,48059,48059 50243,50243,50243 54612,54612,54612 56797,56797,56797 58981,58981,58981 61166,61166,61166 63350,63350,63350 ########## g10.clr 0,0,0 7281,7281,7281 14563,14563,14563 21845,21845,21845 29126,29126,29126 36408,36408,36408 43690,43690,43690 50971,50971,50971 58253,58253,58253 65534,65534,65534 ########## g100.clr 0,0,0 661,661,661 1323,1323,1323 1985,1985,1985 2647,2647,2647 3309,3309,3309 3971,3971,3971 4633,4633,4633 5295,5295,5295 5957,5957,5957 6619,6619,6619 7281,7281,7281 7943,7943,7943 8605,8605,8605 9267,9267,9267 9929,9929,9929 10591,10591,10591 11253,11253,11253 11915,11915,11915 12577,12577,12577 13239,13239,13239 13901,13901,13901 14563,14563,14563 15225,15225,15225 15887,15887,15887 16549,16549,16549 17211,17211,17211 17873,17873,17873 18535,18535,18535 19197,19197,19197 19859,19859,19859 20521,20521,20521 21183,21183,21183 21845,21845,21845 22506,22506,22506 23168,23168,23168 23830,23830,23830 24492,24492,24492 25154,25154,25154 25816,25816,25816 26478,26478,26478 27140,27140,27140 27802,27802,27802 28464,28464,28464 29126,29126,29126 29788,29788,29788 30450,30450,30450 31112,31112,31112 31774,31774,31774 32436,32436,32436 33098,33098,33098 33760,33760,33760 34422,34422,34422 35084,35084,35084 35746,35746,35746 36408,36408,36408 37070,37070,37070 37732,37732,37732 38394,38394,38394 39056,39056,39056 39718,39718,39718 40380,40380,40380 41042,41042,41042 41704,41704,41704 42366,42366,42366 43028,43028,43028 43690,43690,43690 44351,44351,44351 45013,45013,45013 45675,45675,45675 46337,46337,46337 46999,46999,46999 47661,47661,47661 48323,48323,48323 48985,48985,48985 49647,49647,49647 50309,50309,50309 50971,50971,50971 51633,51633,51633 52295,52295,52295 52957,52957,52957 53619,53619,53619 54281,54281,54281 54943,54943,54943 55605,55605,55605 56267,56267,56267 56929,56929,56929 57591,57591,57591 58253,58253,58253 58915,58915,58915 59577,59577,59577 60239,60239,60239 60901,60901,60901 61563,61563,61563 62225,62225,62225 62887,62887,62887 63549,63549,63549 64211,64211,64211 64873,64873,64873 65535,65535,65535 ########## g101.clr 0,0,0 655,655,655 1310,1310,1310 1966,1966,1966 2621,2621,2621 3276,3276,3276 3932,3932,3932 4587,4587,4587 5242,5242,5242 5898,5898,5898 6553,6553,6553 7208,7208,7208 7864,7864,7864 8519,8519,8519 9174,9174,9174 9830,9830,9830 10485,10485,10485 11140,11140,11140 11796,11796,11796 12451,12451,12451 13107,13107,13107 13762,13762,13762 14417,14417,14417 15073,15073,15073 15728,15728,15728 16383,16383,16383 17039,17039,17039 17694,17694,17694 18349,18349,18349 19005,19005,19005 19660,19660,19660 20315,20315,20315 20971,20971,20971 21626,21626,21626 22281,22281,22281 22937,22937,22937 23592,23592,23592 24247,24247,24247 24903,24903,24903 25558,25558,25558 26214,26214,26214 26869,26869,26869 27524,27524,27524 28180,28180,28180 28835,28835,28835 29490,29490,29490 30146,30146,30146 30801,30801,30801 31456,31456,31456 32112,32112,32112 32767,32767,32767 33422,33422,33422 34078,34078,34078 34733,34733,34733 35388,35388,35388 36044,36044,36044 36699,36699,36699 37354,37354,37354 38010,38010,38010 38665,38665,38665 39321,39321,39321 39976,39976,39976 40631,40631,40631 41287,41287,41287 41942,41942,41942 42597,42597,42597 43253,43253,43253 43908,43908,43908 44563,44563,44563 45219,45219,45219 45874,45874,45874 46529,46529,46529 47185,47185,47185 47840,47840,47840 48495,48495,48495 49151,49151,49151 49806,49806,49806 50461,50461,50461 51117,51117,51117 51772,51772,51772 52428,52428,52428 53083,53083,53083 53738,53738,53738 54394,54394,54394 55049,55049,55049 55704,55704,55704 56360,56360,56360 57015,57015,57015 57670,57670,57670 58326,58326,58326 58981,58981,58981 59636,59636,59636 60292,60292,60292 60947,60947,60947 61602,61602,61602 62258,62258,62258 62913,62913,62913 63568,63568,63568 64224,64224,64224 64879,64879,64879 65535,65535,65535 ########## g102.clr 0,0,0 648,648,648 1297,1297,1297 1946,1946,1946 2595,2595,2595 3244,3244,3244 3893,3893,3893 4542,4542,4542 5190,5190,5190 5839,5839,5839 6488,6488,6488 7137,7137,7137 7786,7786,7786 8435,8435,8435 9084,9084,9084 9732,9732,9732 10381,10381,10381 11030,11030,11030 11679,11679,11679 12328,12328,12328 12977,12977,12977 13626,13626,13626 14274,14274,14274 14923,14923,14923 15572,15572,15572 16221,16221,16221 16870,16870,16870 17519,17519,17519 18168,18168,18168 18816,18816,18816 19465,19465,19465 20114,20114,20114 20763,20763,20763 21412,21412,21412 22061,22061,22061 22710,22710,22710 23359,23359,23359 24007,24007,24007 24656,24656,24656 25305,25305,25305 25954,25954,25954 26603,26603,26603 27252,27252,27252 27901,27901,27901 28549,28549,28549 29198,29198,29198 29847,29847,29847 30496,30496,30496 31145,31145,31145 31794,31794,31794 32443,32443,32443 33091,33091,33091 33740,33740,33740 34389,34389,34389 35038,35038,35038 35687,35687,35687 36336,36336,36336 36985,36985,36985 37633,37633,37633 38282,38282,38282 38931,38931,38931 39580,39580,39580 40229,40229,40229 40878,40878,40878 41527,41527,41527 42175,42175,42175 42824,42824,42824 43473,43473,43473 44122,44122,44122 44771,44771,44771 45420,45420,45420 46069,46069,46069 46718,46718,46718 47366,47366,47366 48015,48015,48015 48664,48664,48664 49313,49313,49313 49962,49962,49962 50611,50611,50611 51260,51260,51260 51908,51908,51908 52557,52557,52557 53206,53206,53206 53855,53855,53855 54504,54504,54504 55153,55153,55153 55802,55802,55802 56450,56450,56450 57099,57099,57099 57748,57748,57748 58397,58397,58397 59046,59046,59046 59695,59695,59695 60344,60344,60344 60992,60992,60992 61641,61641,61641 62290,62290,62290 62939,62939,62939 63588,63588,63588 64237,64237,64237 64886,64886,64886 65535,65535,65535 ########## g103.clr 0,0,0 642,642,642 1285,1285,1285 1927,1927,1927 2570,2570,2570 3212,3212,3212 3855,3855,3855 4497,4497,4497 5140,5140,5140 5782,5782,5782 6425,6425,6425 7067,7067,7067 7710,7710,7710 8352,8352,8352 8995,8995,8995 9637,9637,9637 10280,10280,10280 10922,10922,10922 11565,11565,11565 12207,12207,12207 12850,12850,12850 13492,13492,13492 14135,14135,14135 14777,14777,14777 15420,15420,15420 16062,16062,16062 16705,16705,16705 17347,17347,17347 17990,17990,17990 18632,18632,18632 19275,19275,19275 19917,19917,19917 20560,20560,20560 21202,21202,21202 21845,21845,21845 22487,22487,22487 23130,23130,23130 23772,23772,23772 24415,24415,24415 25057,25057,25057 25700,25700,25700 26342,26342,26342 26985,26985,26985 27627,27627,27627 28270,28270,28270 28912,28912,28912 29555,29555,29555 30197,30197,30197 30840,30840,30840 31482,31482,31482 32125,32125,32125 32767,32767,32767 33410,33410,33410 34052,34052,34052 34695,34695,34695 35337,35337,35337 35980,35980,35980 36622,36622,36622 37265,37265,37265 37907,37907,37907 38550,38550,38550 39192,39192,39192 39835,39835,39835 40477,40477,40477 41120,41120,41120 41762,41762,41762 42405,42405,42405 43047,43047,43047 43690,43690,43690 44332,44332,44332 44975,44975,44975 45617,45617,45617 46260,46260,46260 46902,46902,46902 47545,47545,47545 48187,48187,48187 48830,48830,48830 49472,49472,49472 50115,50115,50115 50757,50757,50757 51400,51400,51400 52042,52042,52042 52685,52685,52685 53327,53327,53327 53970,53970,53970 54612,54612,54612 55255,55255,55255 55897,55897,55897 56540,56540,56540 57182,57182,57182 57825,57825,57825 58467,58467,58467 59110,59110,59110 59752,59752,59752 60395,60395,60395 61037,61037,61037 61680,61680,61680 62322,62322,62322 62965,62965,62965 63607,63607,63607 64250,64250,64250 64892,64892,64892 65535,65535,65535 ########## g104.clr 0,0,0 636,636,636 1272,1272,1272 1908,1908,1908 2545,2545,2545 3181,3181,3181 3817,3817,3817 4453,4453,4453 5090,5090,5090 5726,5726,5726 6362,6362,6362 6998,6998,6998 7635,7635,7635 8271,8271,8271 8907,8907,8907 9543,9543,9543 10180,10180,10180 10816,10816,10816 11452,11452,11452 12088,12088,12088 12725,12725,12725 13361,13361,13361 13997,13997,13997 14634,14634,14634 15270,15270,15270 15906,15906,15906 16542,16542,16542 17179,17179,17179 17815,17815,17815 18451,18451,18451 19087,19087,19087 19724,19724,19724 20360,20360,20360 20996,20996,20996 21632,21632,21632 22269,22269,22269 22905,22905,22905 23541,23541,23541 24177,24177,24177 24814,24814,24814 25450,25450,25450 26086,26086,26086 26723,26723,26723 27359,27359,27359 27995,27995,27995 28631,28631,28631 29268,29268,29268 29904,29904,29904 30540,30540,30540 31176,31176,31176 31813,31813,31813 32449,32449,32449 33085,33085,33085 33721,33721,33721 34358,34358,34358 34994,34994,34994 35630,35630,35630 36266,36266,36266 36903,36903,36903 37539,37539,37539 38175,38175,38175 38811,38811,38811 39448,39448,39448 40084,40084,40084 40720,40720,40720 41357,41357,41357 41993,41993,41993 42629,42629,42629 43265,43265,43265 43902,43902,43902 44538,44538,44538 45174,45174,45174 45810,45810,45810 46447,46447,46447 47083,47083,47083 47719,47719,47719 48355,48355,48355 48992,48992,48992 49628,49628,49628 50264,50264,50264 50900,50900,50900 51537,51537,51537 52173,52173,52173 52809,52809,52809 53446,53446,53446 54082,54082,54082 54718,54718,54718 55354,55354,55354 55991,55991,55991 56627,56627,56627 57263,57263,57263 57899,57899,57899 58536,58536,58536 59172,59172,59172 59808,59808,59808 60444,60444,60444 61081,61081,61081 61717,61717,61717 62353,62353,62353 62989,62989,62989 63626,63626,63626 64262,64262,64262 64898,64898,64898 65534,65534,65534 ########## g105.clr 0,0,0 630,630,630 1260,1260,1260 1890,1890,1890 2520,2520,2520 3150,3150,3150 3780,3780,3780 4411,4411,4411 5041,5041,5041 5671,5671,5671 6301,6301,6301 6931,6931,6931 7561,7561,7561 8191,8191,8191 8822,8822,8822 9452,9452,9452 10082,10082,10082 10712,10712,10712 11342,11342,11342 11972,11972,11972 12602,12602,12602 13233,13233,13233 13863,13863,13863 14493,14493,14493 15123,15123,15123 15753,15753,15753 16383,16383,16383 17013,17013,17013 17644,17644,17644 18274,18274,18274 18904,18904,18904 19534,19534,19534 20164,20164,20164 20794,20794,20794 21424,21424,21424 22055,22055,22055 22685,22685,22685 23315,23315,23315 23945,23945,23945 24575,24575,24575 25205,25205,25205 25835,25835,25835 26466,26466,26466 27096,27096,27096 27726,27726,27726 28356,28356,28356 28986,28986,28986 29616,29616,29616 30246,30246,30246 30877,30877,30877 31507,31507,31507 32137,32137,32137 32767,32767,32767 33397,33397,33397 34027,34027,34027 34657,34657,34657 35288,35288,35288 35918,35918,35918 36548,36548,36548 37178,37178,37178 37808,37808,37808 38438,38438,38438 39068,39068,39068 39699,39699,39699 40329,40329,40329 40959,40959,40959 41589,41589,41589 42219,42219,42219 42849,42849,42849 43479,43479,43479 44110,44110,44110 44740,44740,44740 45370,45370,45370 46000,46000,46000 46630,46630,46630 47260,47260,47260 47890,47890,47890 48521,48521,48521 49151,49151,49151 49781,49781,49781 50411,50411,50411 51041,51041,51041 51671,51671,51671 52301,52301,52301 52932,52932,52932 53562,53562,53562 54192,54192,54192 54822,54822,54822 55452,55452,55452 56082,56082,56082 56712,56712,56712 57343,57343,57343 57973,57973,57973 58603,58603,58603 59233,59233,59233 59863,59863,59863 60493,60493,60493 61123,61123,61123 61754,61754,61754 62384,62384,62384 63014,63014,63014 63644,63644,63644 64274,64274,64274 64904,64904,64904 65535,65535,65535 ########## g106.clr 0,0,0 624,624,624 1248,1248,1248 1872,1872,1872 2496,2496,2496 3120,3120,3120 3744,3744,3744 4369,4369,4369 4993,4993,4993 5617,5617,5617 6241,6241,6241 6865,6865,6865 7489,7489,7489 8113,8113,8113 8738,8738,8738 9362,9362,9362 9986,9986,9986 10610,10610,10610 11234,11234,11234 11858,11858,11858 12482,12482,12482 13107,13107,13107 13731,13731,13731 14355,14355,14355 14979,14979,14979 15603,15603,15603 16227,16227,16227 16851,16851,16851 17476,17476,17476 18100,18100,18100 18724,18724,18724 19348,19348,19348 19972,19972,19972 20596,20596,20596 21220,21220,21220 21845,21845,21845 22469,22469,22469 23093,23093,23093 23717,23717,23717 24341,24341,24341 24965,24965,24965 25589,25589,25589 26214,26214,26214 26838,26838,26838 27462,27462,27462 28086,28086,28086 28710,28710,28710 29334,29334,29334 29958,29958,29958 30583,30583,30583 31207,31207,31207 31831,31831,31831 32455,32455,32455 33079,33079,33079 33703,33703,33703 34327,34327,34327 34952,34952,34952 35576,35576,35576 36200,36200,36200 36824,36824,36824 37448,37448,37448 38072,38072,38072 38696,38696,38696 39321,39321,39321 39945,39945,39945 40569,40569,40569 41193,41193,41193 41817,41817,41817 42441,42441,42441 43065,43065,43065 43690,43690,43690 44314,44314,44314 44938,44938,44938 45562,45562,45562 46186,46186,46186 46810,46810,46810 47434,47434,47434 48059,48059,48059 48683,48683,48683 49307,49307,49307 49931,49931,49931 50555,50555,50555 51179,51179,51179 51803,51803,51803 52428,52428,52428 53052,53052,53052 53676,53676,53676 54300,54300,54300 54924,54924,54924 55548,55548,55548 56172,56172,56172 56797,56797,56797 57421,57421,57421 58045,58045,58045 58669,58669,58669 59293,59293,59293 59917,59917,59917 60541,60541,60541 61166,61166,61166 61790,61790,61790 62414,62414,62414 63038,63038,63038 63662,63662,63662 64286,64286,64286 64910,64910,64910 65535,65535,65535 ########## g107.clr 0,0,0 618,618,618 1236,1236,1236 1854,1854,1854 2473,2473,2473 3091,3091,3091 3709,3709,3709 4327,4327,4327 4946,4946,4946 5564,5564,5564 6182,6182,6182 6800,6800,6800 7419,7419,7419 8037,8037,8037 8655,8655,8655 9273,9273,9273 9892,9892,9892 10510,10510,10510 11128,11128,11128 11746,11746,11746 12365,12365,12365 12983,12983,12983 13601,13601,13601 14219,14219,14219 14838,14838,14838 15456,15456,15456 16074,16074,16074 16692,16692,16692 17311,17311,17311 17929,17929,17929 18547,18547,18547 19165,19165,19165 19784,19784,19784 20402,20402,20402 21020,21020,21020 21638,21638,21638 22257,22257,22257 22875,22875,22875 23493,23493,23493 24111,24111,24111 24730,24730,24730 25348,25348,25348 25966,25966,25966 26584,26584,26584 27203,27203,27203 27821,27821,27821 28439,28439,28439 29057,29057,29057 29676,29676,29676 30294,30294,30294 30912,30912,30912 31530,31530,31530 32149,32149,32149 32767,32767,32767 33385,33385,33385 34004,34004,34004 34622,34622,34622 35240,35240,35240 35858,35858,35858 36477,36477,36477 37095,37095,37095 37713,37713,37713 38331,38331,38331 38950,38950,38950 39568,39568,39568 40186,40186,40186 40804,40804,40804 41423,41423,41423 42041,42041,42041 42659,42659,42659 43277,43277,43277 43896,43896,43896 44514,44514,44514 45132,45132,45132 45750,45750,45750 46369,46369,46369 46987,46987,46987 47605,47605,47605 48223,48223,48223 48842,48842,48842 49460,49460,49460 50078,50078,50078 50696,50696,50696 51315,51315,51315 51933,51933,51933 52551,52551,52551 53169,53169,53169 53788,53788,53788 54406,54406,54406 55024,55024,55024 55642,55642,55642 56261,56261,56261 56879,56879,56879 57497,57497,57497 58115,58115,58115 58734,58734,58734 59352,59352,59352 59970,59970,59970 60588,60588,60588 61207,61207,61207 61825,61825,61825 62443,62443,62443 63061,63061,63061 63680,63680,63680 64298,64298,64298 64916,64916,64916 65535,65535,65535 ########## g108.clr 0,0,0 612,612,612 1224,1224,1224 1837,1837,1837 2449,2449,2449 3062,3062,3062 3674,3674,3674 4287,4287,4287 4899,4899,4899 5512,5512,5512 6124,6124,6124 6737,6737,6737 7349,7349,7349 7962,7962,7962 8574,8574,8574 9187,9187,9187 9799,9799,9799 10412,10412,10412 11024,11024,11024 11637,11637,11637 12249,12249,12249 12862,12862,12862 13474,13474,13474 14086,14086,14086 14699,14699,14699 15311,15311,15311 15924,15924,15924 16536,16536,16536 17149,17149,17149 17761,17761,17761 18374,18374,18374 18986,18986,18986 19599,19599,19599 20211,20211,20211 20824,20824,20824 21436,21436,21436 22049,22049,22049 22661,22661,22661 23274,23274,23274 23886,23886,23886 24499,24499,24499 25111,25111,25111 25724,25724,25724 26336,26336,26336 26948,26948,26948 27561,27561,27561 28173,28173,28173 28786,28786,28786 29398,29398,29398 30011,30011,30011 30623,30623,30623 31236,31236,31236 31848,31848,31848 32461,32461,32461 33073,33073,33073 33686,33686,33686 34298,34298,34298 34911,34911,34911 35523,35523,35523 36136,36136,36136 36748,36748,36748 37361,37361,37361 37973,37973,37973 38586,38586,38586 39198,39198,39198 39810,39810,39810 40423,40423,40423 41035,41035,41035 41648,41648,41648 42260,42260,42260 42873,42873,42873 43485,43485,43485 44098,44098,44098 44710,44710,44710 45323,45323,45323 45935,45935,45935 46548,46548,46548 47160,47160,47160 47773,47773,47773 48385,48385,48385 48998,48998,48998 49610,49610,49610 50223,50223,50223 50835,50835,50835 51448,51448,51448 52060,52060,52060 52672,52672,52672 53285,53285,53285 53897,53897,53897 54510,54510,54510 55122,55122,55122 55735,55735,55735 56347,56347,56347 56960,56960,56960 57572,57572,57572 58185,58185,58185 58797,58797,58797 59410,59410,59410 60022,60022,60022 60635,60635,60635 61247,61247,61247 61860,61860,61860 62472,62472,62472 63085,63085,63085 63697,63697,63697 64310,64310,64310 64922,64922,64922 65534,65534,65534 ########## g109.clr 0,0,0 606,606,606 1213,1213,1213 1820,1820,1820 2427,2427,2427 3034,3034,3034 3640,3640,3640 4247,4247,4247 4854,4854,4854 5461,5461,5461 6068,6068,6068 6674,6674,6674 7281,7281,7281 7888,7888,7888 8495,8495,8495 9102,9102,9102 9708,9708,9708 10315,10315,10315 10922,10922,10922 11529,11529,11529 12136,12136,12136 12742,12742,12742 13349,13349,13349 13956,13956,13956 14563,14563,14563 15170,15170,15170 15776,15776,15776 16383,16383,16383 16990,16990,16990 17597,17597,17597 18204,18204,18204 18810,18810,18810 19417,19417,19417 20024,20024,20024 20631,20631,20631 21238,21238,21238 21845,21845,21845 22451,22451,22451 23058,23058,23058 23665,23665,23665 24272,24272,24272 24879,24879,24879 25485,25485,25485 26092,26092,26092 26699,26699,26699 27306,27306,27306 27913,27913,27913 28519,28519,28519 29126,29126,29126 29733,29733,29733 30340,30340,30340 30947,30947,30947 31553,31553,31553 32160,32160,32160 32767,32767,32767 33374,33374,33374 33981,33981,33981 34587,34587,34587 35194,35194,35194 35801,35801,35801 36408,36408,36408 37015,37015,37015 37621,37621,37621 38228,38228,38228 38835,38835,38835 39442,39442,39442 40049,40049,40049 40655,40655,40655 41262,41262,41262 41869,41869,41869 42476,42476,42476 43083,43083,43083 43690,43690,43690 44296,44296,44296 44903,44903,44903 45510,45510,45510 46117,46117,46117 46724,46724,46724 47330,47330,47330 47937,47937,47937 48544,48544,48544 49151,49151,49151 49758,49758,49758 50364,50364,50364 50971,50971,50971 51578,51578,51578 52185,52185,52185 52792,52792,52792 53398,53398,53398 54005,54005,54005 54612,54612,54612 55219,55219,55219 55826,55826,55826 56432,56432,56432 57039,57039,57039 57646,57646,57646 58253,58253,58253 58860,58860,58860 59466,59466,59466 60073,60073,60073 60680,60680,60680 61287,61287,61287 61894,61894,61894 62500,62500,62500 63107,63107,63107 63714,63714,63714 64321,64321,64321 64928,64928,64928 65535,65535,65535 ########## g11.clr 0,0,0 6553,6553,6553 13107,13107,13107 19660,19660,19660 26214,26214,26214 32767,32767,32767 39321,39321,39321 45874,45874,45874 52428,52428,52428 58981,58981,58981 65535,65535,65535 ########## g110.clr 0,0,0 601,601,601 1202,1202,1202 1803,1803,1803 2404,2404,2404 3006,3006,3006 3607,3607,3607 4208,4208,4208 4809,4809,4809 5411,5411,5411 6012,6012,6012 6613,6613,6613 7214,7214,7214 7816,7816,7816 8417,8417,8417 9018,9018,9018 9619,9619,9619 10221,10221,10221 10822,10822,10822 11423,11423,11423 12024,12024,12024 12626,12626,12626 13227,13227,13227 13828,13828,13828 14429,14429,14429 15030,15030,15030 15632,15632,15632 16233,16233,16233 16834,16834,16834 17435,17435,17435 18037,18037,18037 18638,18638,18638 19239,19239,19239 19840,19840,19840 20442,20442,20442 21043,21043,21043 21644,21644,21644 22245,22245,22245 22847,22847,22847 23448,23448,23448 24049,24049,24049 24650,24650,24650 25252,25252,25252 25853,25853,25853 26454,26454,26454 27055,27055,27055 27656,27656,27656 28258,28258,28258 28859,28859,28859 29460,29460,29460 30061,30061,30061 30663,30663,30663 31264,31264,31264 31865,31865,31865 32466,32466,32466 33068,33068,33068 33669,33669,33669 34270,34270,34270 34871,34871,34871 35473,35473,35473 36074,36074,36074 36675,36675,36675 37276,37276,37276 37878,37878,37878 38479,38479,38479 39080,39080,39080 39681,39681,39681 40282,40282,40282 40884,40884,40884 41485,41485,41485 42086,42086,42086 42687,42687,42687 43289,43289,43289 43890,43890,43890 44491,44491,44491 45092,45092,45092 45694,45694,45694 46295,46295,46295 46896,46896,46896 47497,47497,47497 48099,48099,48099 48700,48700,48700 49301,49301,49301 49902,49902,49902 50504,50504,50504 51105,51105,51105 51706,51706,51706 52307,52307,52307 52908,52908,52908 53510,53510,53510 54111,54111,54111 54712,54712,54712 55313,55313,55313 55915,55915,55915 56516,56516,56516 57117,57117,57117 57718,57718,57718 58320,58320,58320 58921,58921,58921 59522,59522,59522 60123,60123,60123 60725,60725,60725 61326,61326,61326 61927,61927,61927 62528,62528,62528 63130,63130,63130 63731,63731,63731 64332,64332,64332 64933,64933,64933 65535,65535,65535 ########## g111.clr 0,0,0 595,595,595 1191,1191,1191 1787,1787,1787 2383,2383,2383 2978,2978,2978 3574,3574,3574 4170,4170,4170 4766,4766,4766 5361,5361,5361 5957,5957,5957 6553,6553,6553 7149,7149,7149 7745,7745,7745 8340,8340,8340 8936,8936,8936 9532,9532,9532 10128,10128,10128 10723,10723,10723 11319,11319,11319 11915,11915,11915 12511,12511,12511 13107,13107,13107 13702,13702,13702 14298,14298,14298 14894,14894,14894 15490,15490,15490 16085,16085,16085 16681,16681,16681 17277,17277,17277 17873,17873,17873 18468,18468,18468 19064,19064,19064 19660,19660,19660 20256,20256,20256 20852,20852,20852 21447,21447,21447 22043,22043,22043 22639,22639,22639 23235,23235,23235 23830,23830,23830 24426,24426,24426 25022,25022,25022 25618,25618,25618 26214,26214,26214 26809,26809,26809 27405,27405,27405 28001,28001,28001 28597,28597,28597 29192,29192,29192 29788,29788,29788 30384,30384,30384 30980,30980,30980 31575,31575,31575 32171,32171,32171 32767,32767,32767 33363,33363,33363 33959,33959,33959 34554,34554,34554 35150,35150,35150 35746,35746,35746 36342,36342,36342 36937,36937,36937 37533,37533,37533 38129,38129,38129 38725,38725,38725 39321,39321,39321 39916,39916,39916 40512,40512,40512 41108,41108,41108 41704,41704,41704 42299,42299,42299 42895,42895,42895 43491,43491,43491 44087,44087,44087 44682,44682,44682 45278,45278,45278 45874,45874,45874 46470,46470,46470 47066,47066,47066 47661,47661,47661 48257,48257,48257 48853,48853,48853 49449,49449,49449 50044,50044,50044 50640,50640,50640 51236,51236,51236 51832,51832,51832 52428,52428,52428 53023,53023,53023 53619,53619,53619 54215,54215,54215 54811,54811,54811 55406,55406,55406 56002,56002,56002 56598,56598,56598 57194,57194,57194 57789,57789,57789 58385,58385,58385 58981,58981,58981 59577,59577,59577 60173,60173,60173 60768,60768,60768 61364,61364,61364 61960,61960,61960 62556,62556,62556 63151,63151,63151 63747,63747,63747 64343,64343,64343 64939,64939,64939 65535,65535,65535 ########## g112.clr 0,0,0 590,590,590 1180,1180,1180 1771,1771,1771 2361,2361,2361 2952,2952,2952 3542,3542,3542 4132,4132,4132 4723,4723,4723 5313,5313,5313 5904,5904,5904 6494,6494,6494 7084,7084,7084 7675,7675,7675 8265,8265,8265 8856,8856,8856 9446,9446,9446 10036,10036,10036 10627,10627,10627 11217,11217,11217 11808,11808,11808 12398,12398,12398 12988,12988,12988 13579,13579,13579 14169,14169,14169 14760,14760,14760 15350,15350,15350 15940,15940,15940 16531,16531,16531 17121,17121,17121 17712,17712,17712 18302,18302,18302 18892,18892,18892 19483,19483,19483 20073,20073,20073 20664,20664,20664 21254,21254,21254 21845,21845,21845 22435,22435,22435 23025,23025,23025 23616,23616,23616 24206,24206,24206 24797,24797,24797 25387,25387,25387 25977,25977,25977 26568,26568,26568 27158,27158,27158 27749,27749,27749 28339,28339,28339 28929,28929,28929 29520,29520,29520 30110,30110,30110 30701,30701,30701 31291,31291,31291 31881,31881,31881 32472,32472,32472 33062,33062,33062 33653,33653,33653 34243,34243,34243 34833,34833,34833 35424,35424,35424 36014,36014,36014 36605,36605,36605 37195,37195,37195 37785,37785,37785 38376,38376,38376 38966,38966,38966 39557,39557,39557 40147,40147,40147 40737,40737,40737 41328,41328,41328 41918,41918,41918 42509,42509,42509 43099,43099,43099 43690,43690,43690 44280,44280,44280 44870,44870,44870 45461,45461,45461 46051,46051,46051 46642,46642,46642 47232,47232,47232 47822,47822,47822 48413,48413,48413 49003,49003,49003 49594,49594,49594 50184,50184,50184 50774,50774,50774 51365,51365,51365 51955,51955,51955 52546,52546,52546 53136,53136,53136 53726,53726,53726 54317,54317,54317 54907,54907,54907 55498,55498,55498 56088,56088,56088 56678,56678,56678 57269,57269,57269 57859,57859,57859 58450,58450,58450 59040,59040,59040 59630,59630,59630 60221,60221,60221 60811,60811,60811 61402,61402,61402 61992,61992,61992 62582,62582,62582 63173,63173,63173 63763,63763,63763 64354,64354,64354 64944,64944,64944 65535,65535,65535 ########## g113.clr 0,0,0 585,585,585 1170,1170,1170 1755,1755,1755 2340,2340,2340 2925,2925,2925 3510,3510,3510 4095,4095,4095 4681,4681,4681 5266,5266,5266 5851,5851,5851 6436,6436,6436 7021,7021,7021 7606,7606,7606 8191,8191,8191 8777,8777,8777 9362,9362,9362 9947,9947,9947 10532,10532,10532 11117,11117,11117 11702,11702,11702 12287,12287,12287 12872,12872,12872 13458,13458,13458 14043,14043,14043 14628,14628,14628 15213,15213,15213 15798,15798,15798 16383,16383,16383 16968,16968,16968 17554,17554,17554 18139,18139,18139 18724,18724,18724 19309,19309,19309 19894,19894,19894 20479,20479,20479 21064,21064,21064 21649,21649,21649 22235,22235,22235 22820,22820,22820 23405,23405,23405 23990,23990,23990 24575,24575,24575 25160,25160,25160 25745,25745,25745 26331,26331,26331 26916,26916,26916 27501,27501,27501 28086,28086,28086 28671,28671,28671 29256,29256,29256 29841,29841,29841 30426,30426,30426 31012,31012,31012 31597,31597,31597 32182,32182,32182 32767,32767,32767 33352,33352,33352 33937,33937,33937 34522,34522,34522 35108,35108,35108 35693,35693,35693 36278,36278,36278 36863,36863,36863 37448,37448,37448 38033,38033,38033 38618,38618,38618 39203,39203,39203 39789,39789,39789 40374,40374,40374 40959,40959,40959 41544,41544,41544 42129,42129,42129 42714,42714,42714 43299,43299,43299 43885,43885,43885 44470,44470,44470 45055,45055,45055 45640,45640,45640 46225,46225,46225 46810,46810,46810 47395,47395,47395 47980,47980,47980 48566,48566,48566 49151,49151,49151 49736,49736,49736 50321,50321,50321 50906,50906,50906 51491,51491,51491 52076,52076,52076 52662,52662,52662 53247,53247,53247 53832,53832,53832 54417,54417,54417 55002,55002,55002 55587,55587,55587 56172,56172,56172 56757,56757,56757 57343,57343,57343 57928,57928,57928 58513,58513,58513 59098,59098,59098 59683,59683,59683 60268,60268,60268 60853,60853,60853 61439,61439,61439 62024,62024,62024 62609,62609,62609 63194,63194,63194 63779,63779,63779 64364,64364,64364 64949,64949,64949 65535,65535,65535 ########## g114.clr 0,0,0 579,579,579 1159,1159,1159 1739,1739,1739 2319,2319,2319 2899,2899,2899 3479,3479,3479 4059,4059,4059 4639,4639,4639 5219,5219,5219 5799,5799,5799 6379,6379,6379 6959,6959,6959 7539,7539,7539 8119,8119,8119 8699,8699,8699 9279,9279,9279 9859,9859,9859 10439,10439,10439 11019,11019,11019 11599,11599,11599 12179,12179,12179 12759,12759,12759 13338,13338,13338 13918,13918,13918 14498,14498,14498 15078,15078,15078 15658,15658,15658 16238,16238,16238 16818,16818,16818 17398,17398,17398 17978,17978,17978 18558,18558,18558 19138,19138,19138 19718,19718,19718 20298,20298,20298 20878,20878,20878 21458,21458,21458 22038,22038,22038 22618,22618,22618 23198,23198,23198 23778,23778,23778 24358,24358,24358 24938,24938,24938 25518,25518,25518 26098,26098,26098 26677,26677,26677 27257,27257,27257 27837,27837,27837 28417,28417,28417 28997,28997,28997 29577,29577,29577 30157,30157,30157 30737,30737,30737 31317,31317,31317 31897,31897,31897 32477,32477,32477 33057,33057,33057 33637,33637,33637 34217,34217,34217 34797,34797,34797 35377,35377,35377 35957,35957,35957 36537,36537,36537 37117,37117,37117 37697,37697,37697 38277,38277,38277 38857,38857,38857 39436,39436,39436 40016,40016,40016 40596,40596,40596 41176,41176,41176 41756,41756,41756 42336,42336,42336 42916,42916,42916 43496,43496,43496 44076,44076,44076 44656,44656,44656 45236,45236,45236 45816,45816,45816 46396,46396,46396 46976,46976,46976 47556,47556,47556 48136,48136,48136 48716,48716,48716 49296,49296,49296 49876,49876,49876 50456,50456,50456 51036,51036,51036 51616,51616,51616 52196,52196,52196 52775,52775,52775 53355,53355,53355 53935,53935,53935 54515,54515,54515 55095,55095,55095 55675,55675,55675 56255,56255,56255 56835,56835,56835 57415,57415,57415 57995,57995,57995 58575,58575,58575 59155,59155,59155 59735,59735,59735 60315,60315,60315 60895,60895,60895 61475,61475,61475 62055,62055,62055 62635,62635,62635 63215,63215,63215 63795,63795,63795 64375,64375,64375 64955,64955,64955 65535,65535,65535 ########## g115.clr 0,0,0 574,574,574 1149,1149,1149 1724,1724,1724 2299,2299,2299 2874,2874,2874 3449,3449,3449 4024,4024,4024 4598,4598,4598 5173,5173,5173 5748,5748,5748 6323,6323,6323 6898,6898,6898 7473,7473,7473 8048,8048,8048 8623,8623,8623 9197,9197,9197 9772,9772,9772 10347,10347,10347 10922,10922,10922 11497,11497,11497 12072,12072,12072 12647,12647,12647 13221,13221,13221 13796,13796,13796 14371,14371,14371 14946,14946,14946 15521,15521,15521 16096,16096,16096 16671,16671,16671 17246,17246,17246 17820,17820,17820 18395,18395,18395 18970,18970,18970 19545,19545,19545 20120,20120,20120 20695,20695,20695 21270,21270,21270 21845,21845,21845 22419,22419,22419 22994,22994,22994 23569,23569,23569 24144,24144,24144 24719,24719,24719 25294,25294,25294 25869,25869,25869 26443,26443,26443 27018,27018,27018 27593,27593,27593 28168,28168,28168 28743,28743,28743 29318,29318,29318 29893,29893,29893 30468,30468,30468 31042,31042,31042 31617,31617,31617 32192,32192,32192 32767,32767,32767 33342,33342,33342 33917,33917,33917 34492,34492,34492 35066,35066,35066 35641,35641,35641 36216,36216,36216 36791,36791,36791 37366,37366,37366 37941,37941,37941 38516,38516,38516 39091,39091,39091 39665,39665,39665 40240,40240,40240 40815,40815,40815 41390,41390,41390 41965,41965,41965 42540,42540,42540 43115,43115,43115 43690,43690,43690 44264,44264,44264 44839,44839,44839 45414,45414,45414 45989,45989,45989 46564,46564,46564 47139,47139,47139 47714,47714,47714 48288,48288,48288 48863,48863,48863 49438,49438,49438 50013,50013,50013 50588,50588,50588 51163,51163,51163 51738,51738,51738 52313,52313,52313 52887,52887,52887 53462,53462,53462 54037,54037,54037 54612,54612,54612 55187,55187,55187 55762,55762,55762 56337,56337,56337 56911,56911,56911 57486,57486,57486 58061,58061,58061 58636,58636,58636 59211,59211,59211 59786,59786,59786 60361,60361,60361 60936,60936,60936 61510,61510,61510 62085,62085,62085 62660,62660,62660 63235,63235,63235 63810,63810,63810 64385,64385,64385 64960,64960,64960 65535,65535,65535 ########## g116.clr 0,0,0 569,569,569 1139,1139,1139 1709,1709,1709 2279,2279,2279 2849,2849,2849 3419,3419,3419 3989,3989,3989 4558,4558,4558 5128,5128,5128 5698,5698,5698 6268,6268,6268 6838,6838,6838 7408,7408,7408 7978,7978,7978 8548,8548,8548 9117,9117,9117 9687,9687,9687 10257,10257,10257 10827,10827,10827 11397,11397,11397 11967,11967,11967 12537,12537,12537 13106,13106,13106 13676,13676,13676 14246,14246,14246 14816,14816,14816 15386,15386,15386 15956,15956,15956 16526,16526,16526 17096,17096,17096 17665,17665,17665 18235,18235,18235 18805,18805,18805 19375,19375,19375 19945,19945,19945 20515,20515,20515 21085,21085,21085 21655,21655,21655 22224,22224,22224 22794,22794,22794 23364,23364,23364 23934,23934,23934 24504,24504,24504 25074,25074,25074 25644,25644,25644 26213,26213,26213 26783,26783,26783 27353,27353,27353 27923,27923,27923 28493,28493,28493 29063,29063,29063 29633,29633,29633 30203,30203,30203 30772,30772,30772 31342,31342,31342 31912,31912,31912 32482,32482,32482 33052,33052,33052 33622,33622,33622 34192,34192,34192 34762,34762,34762 35331,35331,35331 35901,35901,35901 36471,36471,36471 37041,37041,37041 37611,37611,37611 38181,38181,38181 38751,38751,38751 39321,39321,39321 39890,39890,39890 40460,40460,40460 41030,41030,41030 41600,41600,41600 42170,42170,42170 42740,42740,42740 43310,43310,43310 43879,43879,43879 44449,44449,44449 45019,45019,45019 45589,45589,45589 46159,46159,46159 46729,46729,46729 47299,47299,47299 47869,47869,47869 48438,48438,48438 49008,49008,49008 49578,49578,49578 50148,50148,50148 50718,50718,50718 51288,51288,51288 51858,51858,51858 52427,52427,52427 52997,52997,52997 53567,53567,53567 54137,54137,54137 54707,54707,54707 55277,55277,55277 55847,55847,55847 56417,56417,56417 56986,56986,56986 57556,57556,57556 58126,58126,58126 58696,58696,58696 59266,59266,59266 59836,59836,59836 60406,60406,60406 60976,60976,60976 61545,61545,61545 62115,62115,62115 62685,62685,62685 63255,63255,63255 63825,63825,63825 64395,64395,64395 64965,64965,64965 65534,65534,65534 ########## g117.clr 0,0,0 564,564,564 1129,1129,1129 1694,1694,1694 2259,2259,2259 2824,2824,2824 3389,3389,3389 3954,3954,3954 4519,4519,4519 5084,5084,5084 5649,5649,5649 6214,6214,6214 6779,6779,6779 7344,7344,7344 7909,7909,7909 8474,8474,8474 9039,9039,9039 9604,9604,9604 10169,10169,10169 10734,10734,10734 11299,11299,11299 11864,11864,11864 12429,12429,12429 12994,12994,12994 13558,13558,13558 14123,14123,14123 14688,14688,14688 15253,15253,15253 15818,15818,15818 16383,16383,16383 16948,16948,16948 17513,17513,17513 18078,18078,18078 18643,18643,18643 19208,19208,19208 19773,19773,19773 20338,20338,20338 20903,20903,20903 21468,21468,21468 22033,22033,22033 22598,22598,22598 23163,23163,23163 23728,23728,23728 24293,24293,24293 24858,24858,24858 25423,25423,25423 25988,25988,25988 26552,26552,26552 27117,27117,27117 27682,27682,27682 28247,28247,28247 28812,28812,28812 29377,29377,29377 29942,29942,29942 30507,30507,30507 31072,31072,31072 31637,31637,31637 32202,32202,32202 32767,32767,32767 33332,33332,33332 33897,33897,33897 34462,34462,34462 35027,35027,35027 35592,35592,35592 36157,36157,36157 36722,36722,36722 37287,37287,37287 37852,37852,37852 38417,38417,38417 38982,38982,38982 39546,39546,39546 40111,40111,40111 40676,40676,40676 41241,41241,41241 41806,41806,41806 42371,42371,42371 42936,42936,42936 43501,43501,43501 44066,44066,44066 44631,44631,44631 45196,45196,45196 45761,45761,45761 46326,46326,46326 46891,46891,46891 47456,47456,47456 48021,48021,48021 48586,48586,48586 49151,49151,49151 49716,49716,49716 50281,50281,50281 50846,50846,50846 51411,51411,51411 51976,51976,51976 52540,52540,52540 53105,53105,53105 53670,53670,53670 54235,54235,54235 54800,54800,54800 55365,55365,55365 55930,55930,55930 56495,56495,56495 57060,57060,57060 57625,57625,57625 58190,58190,58190 58755,58755,58755 59320,59320,59320 59885,59885,59885 60450,60450,60450 61015,61015,61015 61580,61580,61580 62145,62145,62145 62710,62710,62710 63275,63275,63275 63840,63840,63840 64405,64405,64405 64970,64970,64970 65535,65535,65535 ########## g118.clr 0,0,0 560,560,560 1120,1120,1120 1680,1680,1680 2240,2240,2240 2800,2800,2800 3360,3360,3360 3920,3920,3920 4481,4481,4481 5041,5041,5041 5601,5601,5601 6161,6161,6161 6721,6721,6721 7281,7281,7281 7841,7841,7841 8401,8401,8401 8962,8962,8962 9522,9522,9522 10082,10082,10082 10642,10642,10642 11202,11202,11202 11762,11762,11762 12322,12322,12322 12882,12882,12882 13443,13443,13443 14003,14003,14003 14563,14563,14563 15123,15123,15123 15683,15683,15683 16243,16243,16243 16803,16803,16803 17363,17363,17363 17924,17924,17924 18484,18484,18484 19044,19044,19044 19604,19604,19604 20164,20164,20164 20724,20724,20724 21284,21284,21284 21845,21845,21845 22405,22405,22405 22965,22965,22965 23525,23525,23525 24085,24085,24085 24645,24645,24645 25205,25205,25205 25765,25765,25765 26326,26326,26326 26886,26886,26886 27446,27446,27446 28006,28006,28006 28566,28566,28566 29126,29126,29126 29686,29686,29686 30246,30246,30246 30807,30807,30807 31367,31367,31367 31927,31927,31927 32487,32487,32487 33047,33047,33047 33607,33607,33607 34167,34167,34167 34727,34727,34727 35288,35288,35288 35848,35848,35848 36408,36408,36408 36968,36968,36968 37528,37528,37528 38088,38088,38088 38648,38648,38648 39208,39208,39208 39769,39769,39769 40329,40329,40329 40889,40889,40889 41449,41449,41449 42009,42009,42009 42569,42569,42569 43129,43129,43129 43690,43690,43690 44250,44250,44250 44810,44810,44810 45370,45370,45370 45930,45930,45930 46490,46490,46490 47050,47050,47050 47610,47610,47610 48171,48171,48171 48731,48731,48731 49291,49291,49291 49851,49851,49851 50411,50411,50411 50971,50971,50971 51531,51531,51531 52091,52091,52091 52652,52652,52652 53212,53212,53212 53772,53772,53772 54332,54332,54332 54892,54892,54892 55452,55452,55452 56012,56012,56012 56572,56572,56572 57133,57133,57133 57693,57693,57693 58253,58253,58253 58813,58813,58813 59373,59373,59373 59933,59933,59933 60493,60493,60493 61053,61053,61053 61614,61614,61614 62174,62174,62174 62734,62734,62734 63294,63294,63294 63854,63854,63854 64414,64414,64414 64974,64974,64974 65535,65535,65535 ########## g119.clr 0,0,0 555,555,555 1110,1110,1110 1666,1666,1666 2221,2221,2221 2776,2776,2776 3332,3332,3332 3887,3887,3887 4443,4443,4443 4998,4998,4998 5553,5553,5553 6109,6109,6109 6664,6664,6664 7219,7219,7219 7775,7775,7775 8330,8330,8330 8886,8886,8886 9441,9441,9441 9996,9996,9996 10552,10552,10552 11107,11107,11107 11663,11663,11663 12218,12218,12218 12773,12773,12773 13329,13329,13329 13884,13884,13884 14439,14439,14439 14995,14995,14995 15550,15550,15550 16106,16106,16106 16661,16661,16661 17216,17216,17216 17772,17772,17772 18327,18327,18327 18882,18882,18882 19438,19438,19438 19993,19993,19993 20549,20549,20549 21104,21104,21104 21659,21659,21659 22215,22215,22215 22770,22770,22770 23326,23326,23326 23881,23881,23881 24436,24436,24436 24992,24992,24992 25547,25547,25547 26102,26102,26102 26658,26658,26658 27213,27213,27213 27769,27769,27769 28324,28324,28324 28879,28879,28879 29435,29435,29435 29990,29990,29990 30545,30545,30545 31101,31101,31101 31656,31656,31656 32212,32212,32212 32767,32767,32767 33322,33322,33322 33878,33878,33878 34433,34433,34433 34989,34989,34989 35544,35544,35544 36099,36099,36099 36655,36655,36655 37210,37210,37210 37765,37765,37765 38321,38321,38321 38876,38876,38876 39432,39432,39432 39987,39987,39987 40542,40542,40542 41098,41098,41098 41653,41653,41653 42208,42208,42208 42764,42764,42764 43319,43319,43319 43875,43875,43875 44430,44430,44430 44985,44985,44985 45541,45541,45541 46096,46096,46096 46652,46652,46652 47207,47207,47207 47762,47762,47762 48318,48318,48318 48873,48873,48873 49428,49428,49428 49984,49984,49984 50539,50539,50539 51095,51095,51095 51650,51650,51650 52205,52205,52205 52761,52761,52761 53316,53316,53316 53871,53871,53871 54427,54427,54427 54982,54982,54982 55538,55538,55538 56093,56093,56093 56648,56648,56648 57204,57204,57204 57759,57759,57759 58315,58315,58315 58870,58870,58870 59425,59425,59425 59981,59981,59981 60536,60536,60536 61091,61091,61091 61647,61647,61647 62202,62202,62202 62758,62758,62758 63313,63313,63313 63868,63868,63868 64424,64424,64424 64979,64979,64979 65535,65535,65535 ########## g12.clr 0,0,0 5957,5957,5957 11915,11915,11915 17873,17873,17873 23830,23830,23830 29788,29788,29788 35746,35746,35746 41704,41704,41704 47661,47661,47661 53619,53619,53619 59577,59577,59577 65535,65535,65535 ########## g120.clr 0,0,0 550,550,550 1101,1101,1101 1652,1652,1652 2202,2202,2202 2753,2753,2753 3304,3304,3304 3854,3854,3854 4405,4405,4405 4956,4956,4956 5507,5507,5507 6057,6057,6057 6608,6608,6608 7159,7159,7159 7709,7709,7709 8260,8260,8260 8811,8811,8811 9362,9362,9362 9912,9912,9912 10463,10463,10463 11014,11014,11014 11564,11564,11564 12115,12115,12115 12666,12666,12666 13217,13217,13217 13767,13767,13767 14318,14318,14318 14869,14869,14869 15419,15419,15419 15970,15970,15970 16521,16521,16521 17072,17072,17072 17622,17622,17622 18173,18173,18173 18724,18724,18724 19275,19275,19275 19825,19825,19825 20376,20376,20376 20927,20927,20927 21477,21477,21477 22028,22028,22028 22579,22579,22579 23129,23129,23129 23680,23680,23680 24231,24231,24231 24782,24782,24782 25332,25332,25332 25883,25883,25883 26434,26434,26434 26984,26984,26984 27535,27535,27535 28086,28086,28086 28637,28637,28637 29187,29187,29187 29738,29738,29738 30289,30289,30289 30839,30839,30839 31390,31390,31390 31941,31941,31941 32492,32492,32492 33042,33042,33042 33593,33593,33593 34144,34144,34144 34695,34695,34695 35245,35245,35245 35796,35796,35796 36347,36347,36347 36897,36897,36897 37448,37448,37448 37999,37999,37999 38550,38550,38550 39100,39100,39100 39651,39651,39651 40202,40202,40202 40752,40752,40752 41303,41303,41303 41854,41854,41854 42404,42404,42404 42955,42955,42955 43506,43506,43506 44057,44057,44057 44607,44607,44607 45158,45158,45158 45709,45709,45709 46259,46259,46259 46810,46810,46810 47361,47361,47361 47912,47912,47912 48462,48462,48462 49013,49013,49013 49564,49564,49564 50114,50114,50114 50665,50665,50665 51216,51216,51216 51767,51767,51767 52317,52317,52317 52868,52868,52868 53419,53419,53419 53969,53969,53969 54520,54520,54520 55071,55071,55071 55622,55622,55622 56172,56172,56172 56723,56723,56723 57274,57274,57274 57824,57824,57824 58375,58375,58375 58926,58926,58926 59477,59477,59477 60027,60027,60027 60578,60578,60578 61129,61129,61129 61679,61679,61679 62230,62230,62230 62781,62781,62781 63332,63332,63332 63882,63882,63882 64433,64433,64433 64984,64984,64984 65534,65534,65534 ########## g121.clr 0,0,0 546,546,546 1092,1092,1092 1638,1638,1638 2184,2184,2184 2730,2730,2730 3276,3276,3276 3822,3822,3822 4369,4369,4369 4915,4915,4915 5461,5461,5461 6007,6007,6007 6553,6553,6553 7099,7099,7099 7645,7645,7645 8191,8191,8191 8738,8738,8738 9284,9284,9284 9830,9830,9830 10376,10376,10376 10922,10922,10922 11468,11468,11468 12014,12014,12014 12560,12560,12560 13107,13107,13107 13653,13653,13653 14199,14199,14199 14745,14745,14745 15291,15291,15291 15837,15837,15837 16383,16383,16383 16929,16929,16929 17476,17476,17476 18022,18022,18022 18568,18568,18568 19114,19114,19114 19660,19660,19660 20206,20206,20206 20752,20752,20752 21298,21298,21298 21845,21845,21845 22391,22391,22391 22937,22937,22937 23483,23483,23483 24029,24029,24029 24575,24575,24575 25121,25121,25121 25667,25667,25667 26214,26214,26214 26760,26760,26760 27306,27306,27306 27852,27852,27852 28398,28398,28398 28944,28944,28944 29490,29490,29490 30036,30036,30036 30583,30583,30583 31129,31129,31129 31675,31675,31675 32221,32221,32221 32767,32767,32767 33313,33313,33313 33859,33859,33859 34405,34405,34405 34952,34952,34952 35498,35498,35498 36044,36044,36044 36590,36590,36590 37136,37136,37136 37682,37682,37682 38228,38228,38228 38774,38774,38774 39321,39321,39321 39867,39867,39867 40413,40413,40413 40959,40959,40959 41505,41505,41505 42051,42051,42051 42597,42597,42597 43143,43143,43143 43690,43690,43690 44236,44236,44236 44782,44782,44782 45328,45328,45328 45874,45874,45874 46420,46420,46420 46966,46966,46966 47512,47512,47512 48059,48059,48059 48605,48605,48605 49151,49151,49151 49697,49697,49697 50243,50243,50243 50789,50789,50789 51335,51335,51335 51881,51881,51881 52428,52428,52428 52974,52974,52974 53520,53520,53520 54066,54066,54066 54612,54612,54612 55158,55158,55158 55704,55704,55704 56250,56250,56250 56797,56797,56797 57343,57343,57343 57889,57889,57889 58435,58435,58435 58981,58981,58981 59527,59527,59527 60073,60073,60073 60619,60619,60619 61166,61166,61166 61712,61712,61712 62258,62258,62258 62804,62804,62804 63350,63350,63350 63896,63896,63896 64442,64442,64442 64988,64988,64988 65535,65535,65535 ########## g122.clr 0,0,0 541,541,541 1083,1083,1083 1624,1624,1624 2166,2166,2166 2708,2708,2708 3249,3249,3249 3791,3791,3791 4332,4332,4332 4874,4874,4874 5416,5416,5416 5957,5957,5957 6499,6499,6499 7040,7040,7040 7582,7582,7582 8124,8124,8124 8665,8665,8665 9207,9207,9207 9749,9749,9749 10290,10290,10290 10832,10832,10832 11373,11373,11373 11915,11915,11915 12457,12457,12457 12998,12998,12998 13540,13540,13540 14081,14081,14081 14623,14623,14623 15165,15165,15165 15706,15706,15706 16248,16248,16248 16789,16789,16789 17331,17331,17331 17873,17873,17873 18414,18414,18414 18956,18956,18956 19498,19498,19498 20039,20039,20039 20581,20581,20581 21122,21122,21122 21664,21664,21664 22206,22206,22206 22747,22747,22747 23289,23289,23289 23830,23830,23830 24372,24372,24372 24914,24914,24914 25455,25455,25455 25997,25997,25997 26538,26538,26538 27080,27080,27080 27622,27622,27622 28163,28163,28163 28705,28705,28705 29247,29247,29247 29788,29788,29788 30330,30330,30330 30871,30871,30871 31413,31413,31413 31955,31955,31955 32496,32496,32496 33038,33038,33038 33579,33579,33579 34121,34121,34121 34663,34663,34663 35204,35204,35204 35746,35746,35746 36287,36287,36287 36829,36829,36829 37371,37371,37371 37912,37912,37912 38454,38454,38454 38996,38996,38996 39537,39537,39537 40079,40079,40079 40620,40620,40620 41162,41162,41162 41704,41704,41704 42245,42245,42245 42787,42787,42787 43328,43328,43328 43870,43870,43870 44412,44412,44412 44953,44953,44953 45495,45495,45495 46036,46036,46036 46578,46578,46578 47120,47120,47120 47661,47661,47661 48203,48203,48203 48745,48745,48745 49286,49286,49286 49828,49828,49828 50369,50369,50369 50911,50911,50911 51453,51453,51453 51994,51994,51994 52536,52536,52536 53077,53077,53077 53619,53619,53619 54161,54161,54161 54702,54702,54702 55244,55244,55244 55785,55785,55785 56327,56327,56327 56869,56869,56869 57410,57410,57410 57952,57952,57952 58494,58494,58494 59035,59035,59035 59577,59577,59577 60118,60118,60118 60660,60660,60660 61202,61202,61202 61743,61743,61743 62285,62285,62285 62826,62826,62826 63368,63368,63368 63910,63910,63910 64451,64451,64451 64993,64993,64993 65535,65535,65535 ########## g123.clr 0,0,0 537,537,537 1074,1074,1074 1611,1611,1611 2148,2148,2148 2685,2685,2685 3223,3223,3223 3760,3760,3760 4297,4297,4297 4834,4834,4834 5371,5371,5371 5908,5908,5908 6446,6446,6446 6983,6983,6983 7520,7520,7520 8057,8057,8057 8594,8594,8594 9131,9131,9131 9669,9669,9669 10206,10206,10206 10743,10743,10743 11280,11280,11280 11817,11817,11817 12354,12354,12354 12892,12892,12892 13429,13429,13429 13966,13966,13966 14503,14503,14503 15040,15040,15040 15577,15577,15577 16115,16115,16115 16652,16652,16652 17189,17189,17189 17726,17726,17726 18263,18263,18263 18801,18801,18801 19338,19338,19338 19875,19875,19875 20412,20412,20412 20949,20949,20949 21486,21486,21486 22024,22024,22024 22561,22561,22561 23098,23098,23098 23635,23635,23635 24172,24172,24172 24709,24709,24709 25247,25247,25247 25784,25784,25784 26321,26321,26321 26858,26858,26858 27395,27395,27395 27932,27932,27932 28470,28470,28470 29007,29007,29007 29544,29544,29544 30081,30081,30081 30618,30618,30618 31155,31155,31155 31693,31693,31693 32230,32230,32230 32767,32767,32767 33304,33304,33304 33841,33841,33841 34379,34379,34379 34916,34916,34916 35453,35453,35453 35990,35990,35990 36527,36527,36527 37064,37064,37064 37602,37602,37602 38139,38139,38139 38676,38676,38676 39213,39213,39213 39750,39750,39750 40287,40287,40287 40825,40825,40825 41362,41362,41362 41899,41899,41899 42436,42436,42436 42973,42973,42973 43510,43510,43510 44048,44048,44048 44585,44585,44585 45122,45122,45122 45659,45659,45659 46196,46196,46196 46733,46733,46733 47271,47271,47271 47808,47808,47808 48345,48345,48345 48882,48882,48882 49419,49419,49419 49957,49957,49957 50494,50494,50494 51031,51031,51031 51568,51568,51568 52105,52105,52105 52642,52642,52642 53180,53180,53180 53717,53717,53717 54254,54254,54254 54791,54791,54791 55328,55328,55328 55865,55865,55865 56403,56403,56403 56940,56940,56940 57477,57477,57477 58014,58014,58014 58551,58551,58551 59088,59088,59088 59626,59626,59626 60163,60163,60163 60700,60700,60700 61237,61237,61237 61774,61774,61774 62311,62311,62311 62849,62849,62849 63386,63386,63386 63923,63923,63923 64460,64460,64460 64997,64997,64997 65535,65535,65535 ########## g124.clr 0,0,0 532,532,532 1065,1065,1065 1598,1598,1598 2131,2131,2131 2664,2664,2664 3196,3196,3196 3729,3729,3729 4262,4262,4262 4795,4795,4795 5328,5328,5328 5860,5860,5860 6393,6393,6393 6926,6926,6926 7459,7459,7459 7992,7992,7992 8524,8524,8524 9057,9057,9057 9590,9590,9590 10123,10123,10123 10656,10656,10656 11188,11188,11188 11721,11721,11721 12254,12254,12254 12787,12787,12787 13320,13320,13320 13852,13852,13852 14385,14385,14385 14918,14918,14918 15451,15451,15451 15984,15984,15984 16516,16516,16516 17049,17049,17049 17582,17582,17582 18115,18115,18115 18648,18648,18648 19180,19180,19180 19713,19713,19713 20246,20246,20246 20779,20779,20779 21312,21312,21312 21845,21845,21845 22377,22377,22377 22910,22910,22910 23443,23443,23443 23976,23976,23976 24509,24509,24509 25041,25041,25041 25574,25574,25574 26107,26107,26107 26640,26640,26640 27173,27173,27173 27705,27705,27705 28238,28238,28238 28771,28771,28771 29304,29304,29304 29837,29837,29837 30369,30369,30369 30902,30902,30902 31435,31435,31435 31968,31968,31968 32501,32501,32501 33033,33033,33033 33566,33566,33566 34099,34099,34099 34632,34632,34632 35165,35165,35165 35697,35697,35697 36230,36230,36230 36763,36763,36763 37296,37296,37296 37829,37829,37829 38361,38361,38361 38894,38894,38894 39427,39427,39427 39960,39960,39960 40493,40493,40493 41025,41025,41025 41558,41558,41558 42091,42091,42091 42624,42624,42624 43157,43157,43157 43690,43690,43690 44222,44222,44222 44755,44755,44755 45288,45288,45288 45821,45821,45821 46354,46354,46354 46886,46886,46886 47419,47419,47419 47952,47952,47952 48485,48485,48485 49018,49018,49018 49550,49550,49550 50083,50083,50083 50616,50616,50616 51149,51149,51149 51682,51682,51682 52214,52214,52214 52747,52747,52747 53280,53280,53280 53813,53813,53813 54346,54346,54346 54878,54878,54878 55411,55411,55411 55944,55944,55944 56477,56477,56477 57010,57010,57010 57542,57542,57542 58075,58075,58075 58608,58608,58608 59141,59141,59141 59674,59674,59674 60206,60206,60206 60739,60739,60739 61272,61272,61272 61805,61805,61805 62338,62338,62338 62870,62870,62870 63403,63403,63403 63936,63936,63936 64469,64469,64469 65002,65002,65002 65535,65535,65535 ########## g125.clr 0,0,0 528,528,528 1057,1057,1057 1585,1585,1585 2114,2114,2114 2642,2642,2642 3171,3171,3171 3699,3699,3699 4228,4228,4228 4756,4756,4756 5285,5285,5285 5813,5813,5813 6342,6342,6342 6870,6870,6870 7399,7399,7399 7927,7927,7927 8456,8456,8456 8984,8984,8984 9513,9513,9513 10041,10041,10041 10570,10570,10570 11098,11098,11098 11627,11627,11627 12155,12155,12155 12684,12684,12684 13212,13212,13212 13741,13741,13741 14269,14269,14269 14798,14798,14798 15326,15326,15326 15855,15855,15855 16383,16383,16383 16912,16912,16912 17440,17440,17440 17969,17969,17969 18497,18497,18497 19026,19026,19026 19554,19554,19554 20083,20083,20083 20611,20611,20611 21140,21140,21140 21668,21668,21668 22197,22197,22197 22725,22725,22725 23254,23254,23254 23782,23782,23782 24311,24311,24311 24839,24839,24839 25368,25368,25368 25896,25896,25896 26425,26425,26425 26953,26953,26953 27482,27482,27482 28010,28010,28010 28539,28539,28539 29067,29067,29067 29596,29596,29596 30124,30124,30124 30653,30653,30653 31181,31181,31181 31710,31710,31710 32238,32238,32238 32767,32767,32767 33296,33296,33296 33824,33824,33824 34353,34353,34353 34881,34881,34881 35410,35410,35410 35938,35938,35938 36467,36467,36467 36995,36995,36995 37524,37524,37524 38052,38052,38052 38581,38581,38581 39109,39109,39109 39638,39638,39638 40166,40166,40166 40695,40695,40695 41223,41223,41223 41752,41752,41752 42280,42280,42280 42809,42809,42809 43337,43337,43337 43866,43866,43866 44394,44394,44394 44923,44923,44923 45451,45451,45451 45980,45980,45980 46508,46508,46508 47037,47037,47037 47565,47565,47565 48094,48094,48094 48622,48622,48622 49151,49151,49151 49679,49679,49679 50208,50208,50208 50736,50736,50736 51265,51265,51265 51793,51793,51793 52322,52322,52322 52850,52850,52850 53379,53379,53379 53907,53907,53907 54436,54436,54436 54964,54964,54964 55493,55493,55493 56021,56021,56021 56550,56550,56550 57078,57078,57078 57607,57607,57607 58135,58135,58135 58664,58664,58664 59192,59192,59192 59721,59721,59721 60249,60249,60249 60778,60778,60778 61306,61306,61306 61835,61835,61835 62363,62363,62363 62892,62892,62892 63420,63420,63420 63949,63949,63949 64477,64477,64477 65006,65006,65006 65535,65535,65535 ########## g126.clr 0,0,0 524,524,524 1048,1048,1048 1572,1572,1572 2097,2097,2097 2621,2621,2621 3145,3145,3145 3669,3669,3669 4194,4194,4194 4718,4718,4718 5242,5242,5242 5767,5767,5767 6291,6291,6291 6815,6815,6815 7339,7339,7339 7864,7864,7864 8388,8388,8388 8912,8912,8912 9437,9437,9437 9961,9961,9961 10485,10485,10485 11009,11009,11009 11534,11534,11534 12058,12058,12058 12582,12582,12582 13107,13107,13107 13631,13631,13631 14155,14155,14155 14679,14679,14679 15204,15204,15204 15728,15728,15728 16252,16252,16252 16776,16776,16776 17301,17301,17301 17825,17825,17825 18349,18349,18349 18874,18874,18874 19398,19398,19398 19922,19922,19922 20446,20446,20446 20971,20971,20971 21495,21495,21495 22019,22019,22019 22544,22544,22544 23068,23068,23068 23592,23592,23592 24116,24116,24116 24641,24641,24641 25165,25165,25165 25689,25689,25689 26214,26214,26214 26738,26738,26738 27262,27262,27262 27786,27786,27786 28311,28311,28311 28835,28835,28835 29359,29359,29359 29883,29883,29883 30408,30408,30408 30932,30932,30932 31456,31456,31456 31981,31981,31981 32505,32505,32505 33029,33029,33029 33553,33553,33553 34078,34078,34078 34602,34602,34602 35126,35126,35126 35651,35651,35651 36175,36175,36175 36699,36699,36699 37223,37223,37223 37748,37748,37748 38272,38272,38272 38796,38796,38796 39321,39321,39321 39845,39845,39845 40369,40369,40369 40893,40893,40893 41418,41418,41418 41942,41942,41942 42466,42466,42466 42990,42990,42990 43515,43515,43515 44039,44039,44039 44563,44563,44563 45088,45088,45088 45612,45612,45612 46136,46136,46136 46660,46660,46660 47185,47185,47185 47709,47709,47709 48233,48233,48233 48758,48758,48758 49282,49282,49282 49806,49806,49806 50330,50330,50330 50855,50855,50855 51379,51379,51379 51903,51903,51903 52428,52428,52428 52952,52952,52952 53476,53476,53476 54000,54000,54000 54525,54525,54525 55049,55049,55049 55573,55573,55573 56097,56097,56097 56622,56622,56622 57146,57146,57146 57670,57670,57670 58195,58195,58195 58719,58719,58719 59243,59243,59243 59767,59767,59767 60292,60292,60292 60816,60816,60816 61340,61340,61340 61865,61865,61865 62389,62389,62389 62913,62913,62913 63437,63437,63437 63962,63962,63962 64486,64486,64486 65010,65010,65010 65535,65535,65535 ########## g127.clr 0,0,0 520,520,520 1040,1040,1040 1560,1560,1560 2080,2080,2080 2600,2600,2600 3120,3120,3120 3640,3640,3640 4160,4160,4160 4681,4681,4681 5201,5201,5201 5721,5721,5721 6241,6241,6241 6761,6761,6761 7281,7281,7281 7801,7801,7801 8321,8321,8321 8842,8842,8842 9362,9362,9362 9882,9882,9882 10402,10402,10402 10922,10922,10922 11442,11442,11442 11962,11962,11962 12482,12482,12482 13002,13002,13002 13523,13523,13523 14043,14043,14043 14563,14563,14563 15083,15083,15083 15603,15603,15603 16123,16123,16123 16643,16643,16643 17163,17163,17163 17684,17684,17684 18204,18204,18204 18724,18724,18724 19244,19244,19244 19764,19764,19764 20284,20284,20284 20804,20804,20804 21324,21324,21324 21845,21845,21845 22365,22365,22365 22885,22885,22885 23405,23405,23405 23925,23925,23925 24445,24445,24445 24965,24965,24965 25485,25485,25485 26005,26005,26005 26526,26526,26526 27046,27046,27046 27566,27566,27566 28086,28086,28086 28606,28606,28606 29126,29126,29126 29646,29646,29646 30166,30166,30166 30687,30687,30687 31207,31207,31207 31727,31727,31727 32247,32247,32247 32767,32767,32767 33287,33287,33287 33807,33807,33807 34327,34327,34327 34847,34847,34847 35368,35368,35368 35888,35888,35888 36408,36408,36408 36928,36928,36928 37448,37448,37448 37968,37968,37968 38488,38488,38488 39008,39008,39008 39529,39529,39529 40049,40049,40049 40569,40569,40569 41089,41089,41089 41609,41609,41609 42129,42129,42129 42649,42649,42649 43169,43169,43169 43690,43690,43690 44210,44210,44210 44730,44730,44730 45250,45250,45250 45770,45770,45770 46290,46290,46290 46810,46810,46810 47330,47330,47330 47850,47850,47850 48371,48371,48371 48891,48891,48891 49411,49411,49411 49931,49931,49931 50451,50451,50451 50971,50971,50971 51491,51491,51491 52011,52011,52011 52532,52532,52532 53052,53052,53052 53572,53572,53572 54092,54092,54092 54612,54612,54612 55132,55132,55132 55652,55652,55652 56172,56172,56172 56692,56692,56692 57213,57213,57213 57733,57733,57733 58253,58253,58253 58773,58773,58773 59293,59293,59293 59813,59813,59813 60333,60333,60333 60853,60853,60853 61374,61374,61374 61894,61894,61894 62414,62414,62414 62934,62934,62934 63454,63454,63454 63974,63974,63974 64494,64494,64494 65014,65014,65014 65535,65535,65535 ########## g128.clr 0,0,0 516,516,516 1032,1032,1032 1548,1548,1548 2064,2064,2064 2580,2580,2580 3096,3096,3096 3612,3612,3612 4128,4128,4128 4644,4644,4644 5160,5160,5160 5676,5676,5676 6192,6192,6192 6708,6708,6708 7224,7224,7224 7740,7740,7740 8256,8256,8256 8772,8772,8772 9288,9288,9288 9804,9804,9804 10320,10320,10320 10836,10836,10836 11352,11352,11352 11868,11868,11868 12384,12384,12384 12900,12900,12900 13416,13416,13416 13932,13932,13932 14448,14448,14448 14964,14964,14964 15480,15480,15480 15996,15996,15996 16512,16512,16512 17028,17028,17028 17544,17544,17544 18060,18060,18060 18576,18576,18576 19092,19092,19092 19608,19608,19608 20124,20124,20124 20640,20640,20640 21156,21156,21156 21672,21672,21672 22189,22189,22189 22705,22705,22705 23221,23221,23221 23737,23737,23737 24253,24253,24253 24769,24769,24769 25285,25285,25285 25801,25801,25801 26317,26317,26317 26833,26833,26833 27349,27349,27349 27865,27865,27865 28381,28381,28381 28897,28897,28897 29413,29413,29413 29929,29929,29929 30445,30445,30445 30961,30961,30961 31477,31477,31477 31993,31993,31993 32509,32509,32509 33025,33025,33025 33541,33541,33541 34057,34057,34057 34573,34573,34573 35089,35089,35089 35605,35605,35605 36121,36121,36121 36637,36637,36637 37153,37153,37153 37669,37669,37669 38185,38185,38185 38701,38701,38701 39217,39217,39217 39733,39733,39733 40249,40249,40249 40765,40765,40765 41281,41281,41281 41797,41797,41797 42313,42313,42313 42829,42829,42829 43345,43345,43345 43862,43862,43862 44378,44378,44378 44894,44894,44894 45410,45410,45410 45926,45926,45926 46442,46442,46442 46958,46958,46958 47474,47474,47474 47990,47990,47990 48506,48506,48506 49022,49022,49022 49538,49538,49538 50054,50054,50054 50570,50570,50570 51086,51086,51086 51602,51602,51602 52118,52118,52118 52634,52634,52634 53150,53150,53150 53666,53666,53666 54182,54182,54182 54698,54698,54698 55214,55214,55214 55730,55730,55730 56246,56246,56246 56762,56762,56762 57278,57278,57278 57794,57794,57794 58310,58310,58310 58826,58826,58826 59342,59342,59342 59858,59858,59858 60374,60374,60374 60890,60890,60890 61406,61406,61406 61922,61922,61922 62438,62438,62438 62954,62954,62954 63470,63470,63470 63986,63986,63986 64502,64502,64502 65018,65018,65018 65535,65535,65535 ########## g129.clr 0,0,0 511,511,511 1023,1023,1023 1535,1535,1535 2047,2047,2047 2559,2559,2559 3071,3071,3071 3583,3583,3583 4095,4095,4095 4607,4607,4607 5119,5119,5119 5631,5631,5631 6143,6143,6143 6655,6655,6655 7167,7167,7167 7679,7679,7679 8191,8191,8191 8703,8703,8703 9215,9215,9215 9727,9727,9727 10239,10239,10239 10751,10751,10751 11263,11263,11263 11775,11775,11775 12287,12287,12287 12799,12799,12799 13311,13311,13311 13823,13823,13823 14335,14335,14335 14847,14847,14847 15359,15359,15359 15871,15871,15871 16383,16383,16383 16895,16895,16895 17407,17407,17407 17919,17919,17919 18431,18431,18431 18943,18943,18943 19455,19455,19455 19967,19967,19967 20479,20479,20479 20991,20991,20991 21503,21503,21503 22015,22015,22015 22527,22527,22527 23039,23039,23039 23551,23551,23551 24063,24063,24063 24575,24575,24575 25087,25087,25087 25599,25599,25599 26111,26111,26111 26623,26623,26623 27135,27135,27135 27647,27647,27647 28159,28159,28159 28671,28671,28671 29183,29183,29183 29695,29695,29695 30207,30207,30207 30719,30719,30719 31231,31231,31231 31743,31743,31743 32255,32255,32255 32767,32767,32767 33279,33279,33279 33791,33791,33791 34303,34303,34303 34815,34815,34815 35327,35327,35327 35839,35839,35839 36351,36351,36351 36863,36863,36863 37375,37375,37375 37887,37887,37887 38399,38399,38399 38911,38911,38911 39423,39423,39423 39935,39935,39935 40447,40447,40447 40959,40959,40959 41471,41471,41471 41983,41983,41983 42495,42495,42495 43007,43007,43007 43519,43519,43519 44031,44031,44031 44543,44543,44543 45055,45055,45055 45567,45567,45567 46079,46079,46079 46591,46591,46591 47103,47103,47103 47615,47615,47615 48127,48127,48127 48639,48639,48639 49151,49151,49151 49663,49663,49663 50175,50175,50175 50687,50687,50687 51199,51199,51199 51711,51711,51711 52223,52223,52223 52735,52735,52735 53247,53247,53247 53759,53759,53759 54271,54271,54271 54783,54783,54783 55295,55295,55295 55807,55807,55807 56319,56319,56319 56831,56831,56831 57343,57343,57343 57855,57855,57855 58367,58367,58367 58879,58879,58879 59391,59391,59391 59903,59903,59903 60415,60415,60415 60927,60927,60927 61439,61439,61439 61951,61951,61951 62463,62463,62463 62975,62975,62975 63487,63487,63487 63999,63999,63999 64511,64511,64511 65023,65023,65023 65535,65535,65535 ########## g13.clr 0,0,0 5461,5461,5461 10922,10922,10922 16383,16383,16383 21845,21845,21845 27306,27306,27306 32767,32767,32767 38228,38228,38228 43690,43690,43690 49151,49151,49151 54612,54612,54612 60073,60073,60073 65535,65535,65535 ########## g130.clr 0,0,0 508,508,508 1016,1016,1016 1524,1524,1524 2032,2032,2032 2540,2540,2540 3048,3048,3048 3556,3556,3556 4064,4064,4064 4572,4572,4572 5080,5080,5080 5588,5588,5588 6096,6096,6096 6604,6604,6604 7112,7112,7112 7620,7620,7620 8128,8128,8128 8636,8636,8636 9144,9144,9144 9652,9652,9652 10160,10160,10160 10668,10668,10668 11176,11176,11176 11684,11684,11684 12192,12192,12192 12700,12700,12700 13208,13208,13208 13716,13716,13716 14224,14224,14224 14732,14732,14732 15240,15240,15240 15748,15748,15748 16256,16256,16256 16764,16764,16764 17272,17272,17272 17780,17780,17780 18288,18288,18288 18796,18796,18796 19304,19304,19304 19812,19812,19812 20320,20320,20320 20828,20828,20828 21336,21336,21336 21845,21845,21845 22353,22353,22353 22861,22861,22861 23369,23369,23369 23877,23877,23877 24385,24385,24385 24893,24893,24893 25401,25401,25401 25909,25909,25909 26417,26417,26417 26925,26925,26925 27433,27433,27433 27941,27941,27941 28449,28449,28449 28957,28957,28957 29465,29465,29465 29973,29973,29973 30481,30481,30481 30989,30989,30989 31497,31497,31497 32005,32005,32005 32513,32513,32513 33021,33021,33021 33529,33529,33529 34037,34037,34037 34545,34545,34545 35053,35053,35053 35561,35561,35561 36069,36069,36069 36577,36577,36577 37085,37085,37085 37593,37593,37593 38101,38101,38101 38609,38609,38609 39117,39117,39117 39625,39625,39625 40133,40133,40133 40641,40641,40641 41149,41149,41149 41657,41657,41657 42165,42165,42165 42673,42673,42673 43181,43181,43181 43690,43690,43690 44198,44198,44198 44706,44706,44706 45214,45214,45214 45722,45722,45722 46230,46230,46230 46738,46738,46738 47246,47246,47246 47754,47754,47754 48262,48262,48262 48770,48770,48770 49278,49278,49278 49786,49786,49786 50294,50294,50294 50802,50802,50802 51310,51310,51310 51818,51818,51818 52326,52326,52326 52834,52834,52834 53342,53342,53342 53850,53850,53850 54358,54358,54358 54866,54866,54866 55374,55374,55374 55882,55882,55882 56390,56390,56390 56898,56898,56898 57406,57406,57406 57914,57914,57914 58422,58422,58422 58930,58930,58930 59438,59438,59438 59946,59946,59946 60454,60454,60454 60962,60962,60962 61470,61470,61470 61978,61978,61978 62486,62486,62486 62994,62994,62994 63502,63502,63502 64010,64010,64010 64518,64518,64518 65026,65026,65026 65535,65535,65535 ########## g131.clr 0,0,0 504,504,504 1008,1008,1008 1512,1512,1512 2016,2016,2016 2520,2520,2520 3024,3024,3024 3528,3528,3528 4032,4032,4032 4537,4537,4537 5041,5041,5041 5545,5545,5545 6049,6049,6049 6553,6553,6553 7057,7057,7057 7561,7561,7561 8065,8065,8065 8569,8569,8569 9074,9074,9074 9578,9578,9578 10082,10082,10082 10586,10586,10586 11090,11090,11090 11594,11594,11594 12098,12098,12098 12602,12602,12602 13107,13107,13107 13611,13611,13611 14115,14115,14115 14619,14619,14619 15123,15123,15123 15627,15627,15627 16131,16131,16131 16635,16635,16635 17139,17139,17139 17644,17644,17644 18148,18148,18148 18652,18652,18652 19156,19156,19156 19660,19660,19660 20164,20164,20164 20668,20668,20668 21172,21172,21172 21676,21676,21676 22181,22181,22181 22685,22685,22685 23189,23189,23189 23693,23693,23693 24197,24197,24197 24701,24701,24701 25205,25205,25205 25709,25709,25709 26214,26214,26214 26718,26718,26718 27222,27222,27222 27726,27726,27726 28230,28230,28230 28734,28734,28734 29238,29238,29238 29742,29742,29742 30246,30246,30246 30751,30751,30751 31255,31255,31255 31759,31759,31759 32263,32263,32263 32767,32767,32767 33271,33271,33271 33775,33775,33775 34279,34279,34279 34783,34783,34783 35288,35288,35288 35792,35792,35792 36296,36296,36296 36800,36800,36800 37304,37304,37304 37808,37808,37808 38312,38312,38312 38816,38816,38816 39321,39321,39321 39825,39825,39825 40329,40329,40329 40833,40833,40833 41337,41337,41337 41841,41841,41841 42345,42345,42345 42849,42849,42849 43353,43353,43353 43858,43858,43858 44362,44362,44362 44866,44866,44866 45370,45370,45370 45874,45874,45874 46378,46378,46378 46882,46882,46882 47386,47386,47386 47890,47890,47890 48395,48395,48395 48899,48899,48899 49403,49403,49403 49907,49907,49907 50411,50411,50411 50915,50915,50915 51419,51419,51419 51923,51923,51923 52428,52428,52428 52932,52932,52932 53436,53436,53436 53940,53940,53940 54444,54444,54444 54948,54948,54948 55452,55452,55452 55956,55956,55956 56460,56460,56460 56965,56965,56965 57469,57469,57469 57973,57973,57973 58477,58477,58477 58981,58981,58981 59485,59485,59485 59989,59989,59989 60493,60493,60493 60997,60997,60997 61502,61502,61502 62006,62006,62006 62510,62510,62510 63014,63014,63014 63518,63518,63518 64022,64022,64022 64526,64526,64526 65030,65030,65030 65535,65535,65535 ########## g132.clr 0,0,0 500,500,500 1000,1000,1000 1500,1500,1500 2001,2001,2001 2501,2501,2501 3001,3001,3001 3501,3501,3501 4002,4002,4002 4502,4502,4502 5002,5002,5002 5502,5502,5502 6003,6003,6003 6503,6503,6503 7003,7003,7003 7504,7504,7504 8004,8004,8004 8504,8504,8504 9004,9004,9004 9505,9505,9505 10005,10005,10005 10505,10505,10505 11005,11005,11005 11506,11506,11506 12006,12006,12006 12506,12506,12506 13006,13006,13006 13507,13507,13507 14007,14007,14007 14507,14507,14507 15008,15008,15008 15508,15508,15508 16008,16008,16008 16508,16508,16508 17009,17009,17009 17509,17509,17509 18009,18009,18009 18509,18509,18509 19010,19010,19010 19510,19510,19510 20010,20010,20010 20510,20510,20510 21011,21011,21011 21511,21511,21511 22011,22011,22011 22512,22512,22512 23012,23012,23012 23512,23512,23512 24012,24012,24012 24513,24513,24513 25013,25013,25013 25513,25513,25513 26013,26013,26013 26514,26514,26514 27014,27014,27014 27514,27514,27514 28014,28014,28014 28515,28515,28515 29015,29015,29015 29515,29515,29515 30016,30016,30016 30516,30516,30516 31016,31016,31016 31516,31516,31516 32017,32017,32017 32517,32517,32517 33017,33017,33017 33517,33517,33517 34018,34018,34018 34518,34518,34518 35018,35018,35018 35518,35518,35518 36019,36019,36019 36519,36519,36519 37019,37019,37019 37520,37520,37520 38020,38020,38020 38520,38520,38520 39020,39020,39020 39521,39521,39521 40021,40021,40021 40521,40521,40521 41021,41021,41021 41522,41522,41522 42022,42022,42022 42522,42522,42522 43022,43022,43022 43523,43523,43523 44023,44023,44023 44523,44523,44523 45024,45024,45024 45524,45524,45524 46024,46024,46024 46524,46524,46524 47025,47025,47025 47525,47525,47525 48025,48025,48025 48525,48525,48525 49026,49026,49026 49526,49526,49526 50026,50026,50026 50526,50526,50526 51027,51027,51027 51527,51527,51527 52027,52027,52027 52528,52528,52528 53028,53028,53028 53528,53528,53528 54028,54028,54028 54529,54529,54529 55029,55029,55029 55529,55529,55529 56029,56029,56029 56530,56530,56530 57030,57030,57030 57530,57530,57530 58030,58030,58030 58531,58531,58531 59031,59031,59031 59531,59531,59531 60032,60032,60032 60532,60532,60532 61032,61032,61032 61532,61532,61532 62033,62033,62033 62533,62533,62533 63033,63033,63033 63533,63533,63533 64034,64034,64034 64534,64534,64534 65034,65034,65034 65535,65535,65535 ########## g133.clr 0,0,0 496,496,496 992,992,992 1489,1489,1489 1985,1985,1985 2482,2482,2482 2978,2978,2978 3475,3475,3475 3971,3971,3971 4468,4468,4468 4964,4964,4964 5461,5461,5461 5957,5957,5957 6454,6454,6454 6950,6950,6950 7447,7447,7447 7943,7943,7943 8440,8440,8440 8936,8936,8936 9433,9433,9433 9929,9929,9929 10426,10426,10426 10922,10922,10922 11418,11418,11418 11915,11915,11915 12411,12411,12411 12908,12908,12908 13404,13404,13404 13901,13901,13901 14397,14397,14397 14894,14894,14894 15390,15390,15390 15887,15887,15887 16383,16383,16383 16880,16880,16880 17376,17376,17376 17873,17873,17873 18369,18369,18369 18866,18866,18866 19362,19362,19362 19859,19859,19859 20355,20355,20355 20852,20852,20852 21348,21348,21348 21845,21845,21845 22341,22341,22341 22837,22837,22837 23334,23334,23334 23830,23830,23830 24327,24327,24327 24823,24823,24823 25320,25320,25320 25816,25816,25816 26313,26313,26313 26809,26809,26809 27306,27306,27306 27802,27802,27802 28299,28299,28299 28795,28795,28795 29292,29292,29292 29788,29788,29788 30285,30285,30285 30781,30781,30781 31278,31278,31278 31774,31774,31774 32271,32271,32271 32767,32767,32767 33263,33263,33263 33760,33760,33760 34256,34256,34256 34753,34753,34753 35249,35249,35249 35746,35746,35746 36242,36242,36242 36739,36739,36739 37235,37235,37235 37732,37732,37732 38228,38228,38228 38725,38725,38725 39221,39221,39221 39718,39718,39718 40214,40214,40214 40711,40711,40711 41207,41207,41207 41704,41704,41704 42200,42200,42200 42697,42697,42697 43193,43193,43193 43690,43690,43690 44186,44186,44186 44682,44682,44682 45179,45179,45179 45675,45675,45675 46172,46172,46172 46668,46668,46668 47165,47165,47165 47661,47661,47661 48158,48158,48158 48654,48654,48654 49151,49151,49151 49647,49647,49647 50144,50144,50144 50640,50640,50640 51137,51137,51137 51633,51633,51633 52130,52130,52130 52626,52626,52626 53123,53123,53123 53619,53619,53619 54116,54116,54116 54612,54612,54612 55108,55108,55108 55605,55605,55605 56101,56101,56101 56598,56598,56598 57094,57094,57094 57591,57591,57591 58087,58087,58087 58584,58584,58584 59080,59080,59080 59577,59577,59577 60073,60073,60073 60570,60570,60570 61066,61066,61066 61563,61563,61563 62059,62059,62059 62556,62556,62556 63052,63052,63052 63549,63549,63549 64045,64045,64045 64542,64542,64542 65038,65038,65038 65535,65535,65535 ########## g134.clr 0,0,0 492,492,492 985,985,985 1478,1478,1478 1970,1970,1970 2463,2463,2463 2956,2956,2956 3449,3449,3449 3941,3941,3941 4434,4434,4434 4927,4927,4927 5420,5420,5420 5912,5912,5912 6405,6405,6405 6898,6898,6898 7391,7391,7391 7883,7883,7883 8376,8376,8376 8869,8869,8869 9362,9362,9362 9854,9854,9854 10347,10347,10347 10840,10840,10840 11333,11333,11333 11825,11825,11825 12318,12318,12318 12811,12811,12811 13304,13304,13304 13796,13796,13796 14289,14289,14289 14782,14782,14782 15275,15275,15275 15767,15767,15767 16260,16260,16260 16753,16753,16753 17246,17246,17246 17738,17738,17738 18231,18231,18231 18724,18724,18724 19217,19217,19217 19709,19709,19709 20202,20202,20202 20695,20695,20695 21188,21188,21188 21680,21680,21680 22173,22173,22173 22666,22666,22666 23158,23158,23158 23651,23651,23651 24144,24144,24144 24637,24637,24637 25129,25129,25129 25622,25622,25622 26115,26115,26115 26608,26608,26608 27100,27100,27100 27593,27593,27593 28086,28086,28086 28579,28579,28579 29071,29071,29071 29564,29564,29564 30057,30057,30057 30550,30550,30550 31042,31042,31042 31535,31535,31535 32028,32028,32028 32521,32521,32521 33013,33013,33013 33506,33506,33506 33999,33999,33999 34492,34492,34492 34984,34984,34984 35477,35477,35477 35970,35970,35970 36463,36463,36463 36955,36955,36955 37448,37448,37448 37941,37941,37941 38434,38434,38434 38926,38926,38926 39419,39419,39419 39912,39912,39912 40405,40405,40405 40897,40897,40897 41390,41390,41390 41883,41883,41883 42376,42376,42376 42868,42868,42868 43361,43361,43361 43854,43854,43854 44346,44346,44346 44839,44839,44839 45332,45332,45332 45825,45825,45825 46317,46317,46317 46810,46810,46810 47303,47303,47303 47796,47796,47796 48288,48288,48288 48781,48781,48781 49274,49274,49274 49767,49767,49767 50259,50259,50259 50752,50752,50752 51245,51245,51245 51738,51738,51738 52230,52230,52230 52723,52723,52723 53216,53216,53216 53709,53709,53709 54201,54201,54201 54694,54694,54694 55187,55187,55187 55680,55680,55680 56172,56172,56172 56665,56665,56665 57158,57158,57158 57651,57651,57651 58143,58143,58143 58636,58636,58636 59129,59129,59129 59622,59622,59622 60114,60114,60114 60607,60607,60607 61100,61100,61100 61593,61593,61593 62085,62085,62085 62578,62578,62578 63071,63071,63071 63564,63564,63564 64056,64056,64056 64549,64549,64549 65042,65042,65042 65534,65534,65534 ########## g135.clr 0,0,0 489,489,489 978,978,978 1467,1467,1467 1956,1956,1956 2445,2445,2445 2934,2934,2934 3423,3423,3423 3912,3912,3912 4401,4401,4401 4890,4890,4890 5379,5379,5379 5868,5868,5868 6357,6357,6357 6846,6846,6846 7336,7336,7336 7825,7825,7825 8314,8314,8314 8803,8803,8803 9292,9292,9292 9781,9781,9781 10270,10270,10270 10759,10759,10759 11248,11248,11248 11737,11737,11737 12226,12226,12226 12715,12715,12715 13204,13204,13204 13693,13693,13693 14182,14182,14182 14672,14672,14672 15161,15161,15161 15650,15650,15650 16139,16139,16139 16628,16628,16628 17117,17117,17117 17606,17606,17606 18095,18095,18095 18584,18584,18584 19073,19073,19073 19562,19562,19562 20051,20051,20051 20540,20540,20540 21029,21029,21029 21518,21518,21518 22008,22008,22008 22497,22497,22497 22986,22986,22986 23475,23475,23475 23964,23964,23964 24453,24453,24453 24942,24942,24942 25431,25431,25431 25920,25920,25920 26409,26409,26409 26898,26898,26898 27387,27387,27387 27876,27876,27876 28365,28365,28365 28854,28854,28854 29344,29344,29344 29833,29833,29833 30322,30322,30322 30811,30811,30811 31300,31300,31300 31789,31789,31789 32278,32278,32278 32767,32767,32767 33256,33256,33256 33745,33745,33745 34234,34234,34234 34723,34723,34723 35212,35212,35212 35701,35701,35701 36190,36190,36190 36680,36680,36680 37169,37169,37169 37658,37658,37658 38147,38147,38147 38636,38636,38636 39125,39125,39125 39614,39614,39614 40103,40103,40103 40592,40592,40592 41081,41081,41081 41570,41570,41570 42059,42059,42059 42548,42548,42548 43037,43037,43037 43526,43526,43526 44016,44016,44016 44505,44505,44505 44994,44994,44994 45483,45483,45483 45972,45972,45972 46461,46461,46461 46950,46950,46950 47439,47439,47439 47928,47928,47928 48417,48417,48417 48906,48906,48906 49395,49395,49395 49884,49884,49884 50373,50373,50373 50862,50862,50862 51352,51352,51352 51841,51841,51841 52330,52330,52330 52819,52819,52819 53308,53308,53308 53797,53797,53797 54286,54286,54286 54775,54775,54775 55264,55264,55264 55753,55753,55753 56242,56242,56242 56731,56731,56731 57220,57220,57220 57709,57709,57709 58198,58198,58198 58688,58688,58688 59177,59177,59177 59666,59666,59666 60155,60155,60155 60644,60644,60644 61133,61133,61133 61622,61622,61622 62111,62111,62111 62600,62600,62600 63089,63089,63089 63578,63578,63578 64067,64067,64067 64556,64556,64556 65045,65045,65045 65535,65535,65535 ########## g136.clr 0,0,0 485,485,485 970,970,970 1456,1456,1456 1941,1941,1941 2427,2427,2427 2912,2912,2912 3398,3398,3398 3883,3883,3883 4369,4369,4369 4854,4854,4854 5339,5339,5339 5825,5825,5825 6310,6310,6310 6796,6796,6796 7281,7281,7281 7767,7767,7767 8252,8252,8252 8738,8738,8738 9223,9223,9223 9708,9708,9708 10194,10194,10194 10679,10679,10679 11165,11165,11165 11650,11650,11650 12136,12136,12136 12621,12621,12621 13107,13107,13107 13592,13592,13592 14077,14077,14077 14563,14563,14563 15048,15048,15048 15534,15534,15534 16019,16019,16019 16505,16505,16505 16990,16990,16990 17476,17476,17476 17961,17961,17961 18446,18446,18446 18932,18932,18932 19417,19417,19417 19903,19903,19903 20388,20388,20388 20874,20874,20874 21359,21359,21359 21845,21845,21845 22330,22330,22330 22815,22815,22815 23301,23301,23301 23786,23786,23786 24272,24272,24272 24757,24757,24757 25243,25243,25243 25728,25728,25728 26214,26214,26214 26699,26699,26699 27184,27184,27184 27670,27670,27670 28155,28155,28155 28641,28641,28641 29126,29126,29126 29612,29612,29612 30097,30097,30097 30583,30583,30583 31068,31068,31068 31553,31553,31553 32039,32039,32039 32524,32524,32524 33010,33010,33010 33495,33495,33495 33981,33981,33981 34466,34466,34466 34952,34952,34952 35437,35437,35437 35922,35922,35922 36408,36408,36408 36893,36893,36893 37379,37379,37379 37864,37864,37864 38350,38350,38350 38835,38835,38835 39321,39321,39321 39806,39806,39806 40291,40291,40291 40777,40777,40777 41262,41262,41262 41748,41748,41748 42233,42233,42233 42719,42719,42719 43204,43204,43204 43690,43690,43690 44175,44175,44175 44660,44660,44660 45146,45146,45146 45631,45631,45631 46117,46117,46117 46602,46602,46602 47088,47088,47088 47573,47573,47573 48059,48059,48059 48544,48544,48544 49029,49029,49029 49515,49515,49515 50000,50000,50000 50486,50486,50486 50971,50971,50971 51457,51457,51457 51942,51942,51942 52428,52428,52428 52913,52913,52913 53398,53398,53398 53884,53884,53884 54369,54369,54369 54855,54855,54855 55340,55340,55340 55826,55826,55826 56311,56311,56311 56797,56797,56797 57282,57282,57282 57767,57767,57767 58253,58253,58253 58738,58738,58738 59224,59224,59224 59709,59709,59709 60195,60195,60195 60680,60680,60680 61166,61166,61166 61651,61651,61651 62136,62136,62136 62622,62622,62622 63107,63107,63107 63593,63593,63593 64078,64078,64078 64564,64564,64564 65049,65049,65049 65535,65535,65535 ########## g137.clr 0,0,0 481,481,481 963,963,963 1445,1445,1445 1927,1927,1927 2409,2409,2409 2891,2891,2891 3373,3373,3373 3855,3855,3855 4336,4336,4336 4818,4818,4818 5300,5300,5300 5782,5782,5782 6264,6264,6264 6746,6746,6746 7228,7228,7228 7710,7710,7710 8191,8191,8191 8673,8673,8673 9155,9155,9155 9637,9637,9637 10119,10119,10119 10601,10601,10601 11083,11083,11083 11565,11565,11565 12046,12046,12046 12528,12528,12528 13010,13010,13010 13492,13492,13492 13974,13974,13974 14456,14456,14456 14938,14938,14938 15420,15420,15420 15901,15901,15901 16383,16383,16383 16865,16865,16865 17347,17347,17347 17829,17829,17829 18311,18311,18311 18793,18793,18793 19275,19275,19275 19756,19756,19756 20238,20238,20238 20720,20720,20720 21202,21202,21202 21684,21684,21684 22166,22166,22166 22648,22648,22648 23130,23130,23130 23611,23611,23611 24093,24093,24093 24575,24575,24575 25057,25057,25057 25539,25539,25539 26021,26021,26021 26503,26503,26503 26985,26985,26985 27466,27466,27466 27948,27948,27948 28430,28430,28430 28912,28912,28912 29394,29394,29394 29876,29876,29876 30358,30358,30358 30840,30840,30840 31321,31321,31321 31803,31803,31803 32285,32285,32285 32767,32767,32767 33249,33249,33249 33731,33731,33731 34213,34213,34213 34695,34695,34695 35176,35176,35176 35658,35658,35658 36140,36140,36140 36622,36622,36622 37104,37104,37104 37586,37586,37586 38068,38068,38068 38550,38550,38550 39031,39031,39031 39513,39513,39513 39995,39995,39995 40477,40477,40477 40959,40959,40959 41441,41441,41441 41923,41923,41923 42405,42405,42405 42886,42886,42886 43368,43368,43368 43850,43850,43850 44332,44332,44332 44814,44814,44814 45296,45296,45296 45778,45778,45778 46260,46260,46260 46741,46741,46741 47223,47223,47223 47705,47705,47705 48187,48187,48187 48669,48669,48669 49151,49151,49151 49633,49633,49633 50115,50115,50115 50596,50596,50596 51078,51078,51078 51560,51560,51560 52042,52042,52042 52524,52524,52524 53006,53006,53006 53488,53488,53488 53970,53970,53970 54451,54451,54451 54933,54933,54933 55415,55415,55415 55897,55897,55897 56379,56379,56379 56861,56861,56861 57343,57343,57343 57825,57825,57825 58306,58306,58306 58788,58788,58788 59270,59270,59270 59752,59752,59752 60234,60234,60234 60716,60716,60716 61198,61198,61198 61680,61680,61680 62161,62161,62161 62643,62643,62643 63125,63125,63125 63607,63607,63607 64089,64089,64089 64571,64571,64571 65053,65053,65053 65535,65535,65535 ########## g138.clr 0,0,0 478,478,478 956,956,956 1435,1435,1435 1913,1913,1913 2391,2391,2391 2870,2870,2870 3348,3348,3348 3826,3826,3826 4305,4305,4305 4783,4783,4783 5261,5261,5261 5740,5740,5740 6218,6218,6218 6697,6697,6697 7175,7175,7175 7653,7653,7653 8132,8132,8132 8610,8610,8610 9088,9088,9088 9567,9567,9567 10045,10045,10045 10523,10523,10523 11002,11002,11002 11480,11480,11480 11958,11958,11958 12437,12437,12437 12915,12915,12915 13394,13394,13394 13872,13872,13872 14350,14350,14350 14829,14829,14829 15307,15307,15307 15785,15785,15785 16264,16264,16264 16742,16742,16742 17220,17220,17220 17699,17699,17699 18177,18177,18177 18655,18655,18655 19134,19134,19134 19612,19612,19612 20091,20091,20091 20569,20569,20569 21047,21047,21047 21526,21526,21526 22004,22004,22004 22482,22482,22482 22961,22961,22961 23439,23439,23439 23917,23917,23917 24396,24396,24396 24874,24874,24874 25352,25352,25352 25831,25831,25831 26309,26309,26309 26788,26788,26788 27266,27266,27266 27744,27744,27744 28223,28223,28223 28701,28701,28701 29179,29179,29179 29658,29658,29658 30136,30136,30136 30614,30614,30614 31093,31093,31093 31571,31571,31571 32049,32049,32049 32528,32528,32528 33006,33006,33006 33485,33485,33485 33963,33963,33963 34441,34441,34441 34920,34920,34920 35398,35398,35398 35876,35876,35876 36355,36355,36355 36833,36833,36833 37311,37311,37311 37790,37790,37790 38268,38268,38268 38746,38746,38746 39225,39225,39225 39703,39703,39703 40182,40182,40182 40660,40660,40660 41138,41138,41138 41617,41617,41617 42095,42095,42095 42573,42573,42573 43052,43052,43052 43530,43530,43530 44008,44008,44008 44487,44487,44487 44965,44965,44965 45443,45443,45443 45922,45922,45922 46400,46400,46400 46879,46879,46879 47357,47357,47357 47835,47835,47835 48314,48314,48314 48792,48792,48792 49270,49270,49270 49749,49749,49749 50227,50227,50227 50705,50705,50705 51184,51184,51184 51662,51662,51662 52140,52140,52140 52619,52619,52619 53097,53097,53097 53576,53576,53576 54054,54054,54054 54532,54532,54532 55011,55011,55011 55489,55489,55489 55967,55967,55967 56446,56446,56446 56924,56924,56924 57402,57402,57402 57881,57881,57881 58359,58359,58359 58837,58837,58837 59316,59316,59316 59794,59794,59794 60273,60273,60273 60751,60751,60751 61229,61229,61229 61708,61708,61708 62186,62186,62186 62664,62664,62664 63143,63143,63143 63621,63621,63621 64099,64099,64099 64578,64578,64578 65056,65056,65056 65534,65534,65534 ########## g139.clr 0,0,0 474,474,474 949,949,949 1424,1424,1424 1899,1899,1899 2374,2374,2374 2849,2849,2849 3324,3324,3324 3799,3799,3799 4274,4274,4274 4748,4748,4748 5223,5223,5223 5698,5698,5698 6173,6173,6173 6648,6648,6648 7123,7123,7123 7598,7598,7598 8073,8073,8073 8548,8548,8548 9022,9022,9022 9497,9497,9497 9972,9972,9972 10447,10447,10447 10922,10922,10922 11397,11397,11397 11872,11872,11872 12347,12347,12347 12822,12822,12822 13296,13296,13296 13771,13771,13771 14246,14246,14246 14721,14721,14721 15196,15196,15196 15671,15671,15671 16146,16146,16146 16621,16621,16621 17096,17096,17096 17570,17570,17570 18045,18045,18045 18520,18520,18520 18995,18995,18995 19470,19470,19470 19945,19945,19945 20420,20420,20420 20895,20895,20895 21370,21370,21370 21845,21845,21845 22319,22319,22319 22794,22794,22794 23269,23269,23269 23744,23744,23744 24219,24219,24219 24694,24694,24694 25169,25169,25169 25644,25644,25644 26119,26119,26119 26593,26593,26593 27068,27068,27068 27543,27543,27543 28018,28018,28018 28493,28493,28493 28968,28968,28968 29443,29443,29443 29918,29918,29918 30393,30393,30393 30867,30867,30867 31342,31342,31342 31817,31817,31817 32292,32292,32292 32767,32767,32767 33242,33242,33242 33717,33717,33717 34192,34192,34192 34667,34667,34667 35141,35141,35141 35616,35616,35616 36091,36091,36091 36566,36566,36566 37041,37041,37041 37516,37516,37516 37991,37991,37991 38466,38466,38466 38941,38941,38941 39415,39415,39415 39890,39890,39890 40365,40365,40365 40840,40840,40840 41315,41315,41315 41790,41790,41790 42265,42265,42265 42740,42740,42740 43215,43215,43215 43690,43690,43690 44164,44164,44164 44639,44639,44639 45114,45114,45114 45589,45589,45589 46064,46064,46064 46539,46539,46539 47014,47014,47014 47489,47489,47489 47964,47964,47964 48438,48438,48438 48913,48913,48913 49388,49388,49388 49863,49863,49863 50338,50338,50338 50813,50813,50813 51288,51288,51288 51763,51763,51763 52238,52238,52238 52712,52712,52712 53187,53187,53187 53662,53662,53662 54137,54137,54137 54612,54612,54612 55087,55087,55087 55562,55562,55562 56037,56037,56037 56512,56512,56512 56986,56986,56986 57461,57461,57461 57936,57936,57936 58411,58411,58411 58886,58886,58886 59361,59361,59361 59836,59836,59836 60311,60311,60311 60786,60786,60786 61260,61260,61260 61735,61735,61735 62210,62210,62210 62685,62685,62685 63160,63160,63160 63635,63635,63635 64110,64110,64110 64585,64585,64585 65060,65060,65060 65535,65535,65535 ########## g14.clr 0,0,0 5041,5041,5041 10082,10082,10082 15123,15123,15123 20164,20164,20164 25205,25205,25205 30246,30246,30246 35288,35288,35288 40329,40329,40329 45370,45370,45370 50411,50411,50411 55452,55452,55452 60493,60493,60493 65535,65535,65535 ########## g140.clr 0,0,0 471,471,471 942,942,942 1414,1414,1414 1885,1885,1885 2357,2357,2357 2828,2828,2828 3300,3300,3300 3771,3771,3771 4243,4243,4243 4714,4714,4714 5186,5186,5186 5657,5657,5657 6129,6129,6129 6600,6600,6600 7072,7072,7072 7543,7543,7543 8015,8015,8015 8486,8486,8486 8958,8958,8958 9429,9429,9429 9900,9900,9900 10372,10372,10372 10843,10843,10843 11315,11315,11315 11786,11786,11786 12258,12258,12258 12729,12729,12729 13201,13201,13201 13672,13672,13672 14144,14144,14144 14615,14615,14615 15087,15087,15087 15558,15558,15558 16030,16030,16030 16501,16501,16501 16973,16973,16973 17444,17444,17444 17916,17916,17916 18387,18387,18387 18858,18858,18858 19330,19330,19330 19801,19801,19801 20273,20273,20273 20744,20744,20744 21216,21216,21216 21687,21687,21687 22159,22159,22159 22630,22630,22630 23102,23102,23102 23573,23573,23573 24045,24045,24045 24516,24516,24516 24988,24988,24988 25459,25459,25459 25931,25931,25931 26402,26402,26402 26874,26874,26874 27345,27345,27345 27817,27817,27817 28288,28288,28288 28759,28759,28759 29231,29231,29231 29702,29702,29702 30174,30174,30174 30645,30645,30645 31117,31117,31117 31588,31588,31588 32060,32060,32060 32531,32531,32531 33003,33003,33003 33474,33474,33474 33946,33946,33946 34417,34417,34417 34889,34889,34889 35360,35360,35360 35832,35832,35832 36303,36303,36303 36775,36775,36775 37246,37246,37246 37717,37717,37717 38189,38189,38189 38660,38660,38660 39132,39132,39132 39603,39603,39603 40075,40075,40075 40546,40546,40546 41018,41018,41018 41489,41489,41489 41961,41961,41961 42432,42432,42432 42904,42904,42904 43375,43375,43375 43847,43847,43847 44318,44318,44318 44790,44790,44790 45261,45261,45261 45733,45733,45733 46204,46204,46204 46676,46676,46676 47147,47147,47147 47618,47618,47618 48090,48090,48090 48561,48561,48561 49033,49033,49033 49504,49504,49504 49976,49976,49976 50447,50447,50447 50919,50919,50919 51390,51390,51390 51862,51862,51862 52333,52333,52333 52805,52805,52805 53276,53276,53276 53748,53748,53748 54219,54219,54219 54691,54691,54691 55162,55162,55162 55634,55634,55634 56105,56105,56105 56576,56576,56576 57048,57048,57048 57519,57519,57519 57991,57991,57991 58462,58462,58462 58934,58934,58934 59405,59405,59405 59877,59877,59877 60348,60348,60348 60820,60820,60820 61291,61291,61291 61763,61763,61763 62234,62234,62234 62706,62706,62706 63177,63177,63177 63649,63649,63649 64120,64120,64120 64592,64592,64592 65063,65063,65063 65535,65535,65535 ########## g141.clr 0,0,0 468,468,468 936,936,936 1404,1404,1404 1872,1872,1872 2340,2340,2340 2808,2808,2808 3276,3276,3276 3744,3744,3744 4212,4212,4212 4681,4681,4681 5149,5149,5149 5617,5617,5617 6085,6085,6085 6553,6553,6553 7021,7021,7021 7489,7489,7489 7957,7957,7957 8425,8425,8425 8894,8894,8894 9362,9362,9362 9830,9830,9830 10298,10298,10298 10766,10766,10766 11234,11234,11234 11702,11702,11702 12170,12170,12170 12638,12638,12638 13107,13107,13107 13575,13575,13575 14043,14043,14043 14511,14511,14511 14979,14979,14979 15447,15447,15447 15915,15915,15915 16383,16383,16383 16851,16851,16851 17319,17319,17319 17788,17788,17788 18256,18256,18256 18724,18724,18724 19192,19192,19192 19660,19660,19660 20128,20128,20128 20596,20596,20596 21064,21064,21064 21532,21532,21532 22001,22001,22001 22469,22469,22469 22937,22937,22937 23405,23405,23405 23873,23873,23873 24341,24341,24341 24809,24809,24809 25277,25277,25277 25745,25745,25745 26214,26214,26214 26682,26682,26682 27150,27150,27150 27618,27618,27618 28086,28086,28086 28554,28554,28554 29022,29022,29022 29490,29490,29490 29958,29958,29958 30426,30426,30426 30895,30895,30895 31363,31363,31363 31831,31831,31831 32299,32299,32299 32767,32767,32767 33235,33235,33235 33703,33703,33703 34171,34171,34171 34639,34639,34639 35108,35108,35108 35576,35576,35576 36044,36044,36044 36512,36512,36512 36980,36980,36980 37448,37448,37448 37916,37916,37916 38384,38384,38384 38852,38852,38852 39321,39321,39321 39789,39789,39789 40257,40257,40257 40725,40725,40725 41193,41193,41193 41661,41661,41661 42129,42129,42129 42597,42597,42597 43065,43065,43065 43533,43533,43533 44002,44002,44002 44470,44470,44470 44938,44938,44938 45406,45406,45406 45874,45874,45874 46342,46342,46342 46810,46810,46810 47278,47278,47278 47746,47746,47746 48215,48215,48215 48683,48683,48683 49151,49151,49151 49619,49619,49619 50087,50087,50087 50555,50555,50555 51023,51023,51023 51491,51491,51491 51959,51959,51959 52428,52428,52428 52896,52896,52896 53364,53364,53364 53832,53832,53832 54300,54300,54300 54768,54768,54768 55236,55236,55236 55704,55704,55704 56172,56172,56172 56640,56640,56640 57109,57109,57109 57577,57577,57577 58045,58045,58045 58513,58513,58513 58981,58981,58981 59449,59449,59449 59917,59917,59917 60385,60385,60385 60853,60853,60853 61322,61322,61322 61790,61790,61790 62258,62258,62258 62726,62726,62726 63194,63194,63194 63662,63662,63662 64130,64130,64130 64598,64598,64598 65066,65066,65066 65535,65535,65535 ########## g142.clr 0,0,0 464,464,464 929,929,929 1394,1394,1394 1859,1859,1859 2323,2323,2323 2788,2788,2788 3253,3253,3253 3718,3718,3718 4183,4183,4183 4647,4647,4647 5112,5112,5112 5577,5577,5577 6042,6042,6042 6507,6507,6507 6971,6971,6971 7436,7436,7436 7901,7901,7901 8366,8366,8366 8830,8830,8830 9295,9295,9295 9760,9760,9760 10225,10225,10225 10690,10690,10690 11154,11154,11154 11619,11619,11619 12084,12084,12084 12549,12549,12549 13014,13014,13014 13478,13478,13478 13943,13943,13943 14408,14408,14408 14873,14873,14873 15337,15337,15337 15802,15802,15802 16267,16267,16267 16732,16732,16732 17197,17197,17197 17661,17661,17661 18126,18126,18126 18591,18591,18591 19056,19056,19056 19521,19521,19521 19985,19985,19985 20450,20450,20450 20915,20915,20915 21380,21380,21380 21845,21845,21845 22309,22309,22309 22774,22774,22774 23239,23239,23239 23704,23704,23704 24168,24168,24168 24633,24633,24633 25098,25098,25098 25563,25563,25563 26028,26028,26028 26492,26492,26492 26957,26957,26957 27422,27422,27422 27887,27887,27887 28352,28352,28352 28816,28816,28816 29281,29281,29281 29746,29746,29746 30211,30211,30211 30675,30675,30675 31140,31140,31140 31605,31605,31605 32070,32070,32070 32535,32535,32535 32999,32999,32999 33464,33464,33464 33929,33929,33929 34394,34394,34394 34859,34859,34859 35323,35323,35323 35788,35788,35788 36253,36253,36253 36718,36718,36718 37182,37182,37182 37647,37647,37647 38112,38112,38112 38577,38577,38577 39042,39042,39042 39506,39506,39506 39971,39971,39971 40436,40436,40436 40901,40901,40901 41366,41366,41366 41830,41830,41830 42295,42295,42295 42760,42760,42760 43225,43225,43225 43690,43690,43690 44154,44154,44154 44619,44619,44619 45084,45084,45084 45549,45549,45549 46013,46013,46013 46478,46478,46478 46943,46943,46943 47408,47408,47408 47873,47873,47873 48337,48337,48337 48802,48802,48802 49267,49267,49267 49732,49732,49732 50197,50197,50197 50661,50661,50661 51126,51126,51126 51591,51591,51591 52056,52056,52056 52520,52520,52520 52985,52985,52985 53450,53450,53450 53915,53915,53915 54380,54380,54380 54844,54844,54844 55309,55309,55309 55774,55774,55774 56239,56239,56239 56704,56704,56704 57168,57168,57168 57633,57633,57633 58098,58098,58098 58563,58563,58563 59027,59027,59027 59492,59492,59492 59957,59957,59957 60422,60422,60422 60887,60887,60887 61351,61351,61351 61816,61816,61816 62281,62281,62281 62746,62746,62746 63211,63211,63211 63675,63675,63675 64140,64140,64140 64605,64605,64605 65070,65070,65070 65535,65535,65535 ########## g143.clr 0,0,0 461,461,461 923,923,923 1384,1384,1384 1846,1846,1846 2307,2307,2307 2769,2769,2769 3230,3230,3230 3692,3692,3692 4153,4153,4153 4615,4615,4615 5076,5076,5076 5538,5538,5538 5999,5999,5999 6461,6461,6461 6922,6922,6922 7384,7384,7384 7845,7845,7845 8307,8307,8307 8768,8768,8768 9230,9230,9230 9691,9691,9691 10153,10153,10153 10614,10614,10614 11076,11076,11076 11537,11537,11537 11999,11999,11999 12460,12460,12460 12922,12922,12922 13383,13383,13383 13845,13845,13845 14306,14306,14306 14768,14768,14768 15229,15229,15229 15691,15691,15691 16152,16152,16152 16614,16614,16614 17076,17076,17076 17537,17537,17537 17999,17999,17999 18460,18460,18460 18922,18922,18922 19383,19383,19383 19845,19845,19845 20306,20306,20306 20768,20768,20768 21229,21229,21229 21691,21691,21691 22152,22152,22152 22614,22614,22614 23075,23075,23075 23537,23537,23537 23998,23998,23998 24460,24460,24460 24921,24921,24921 25383,25383,25383 25844,25844,25844 26306,26306,26306 26767,26767,26767 27229,27229,27229 27690,27690,27690 28152,28152,28152 28613,28613,28613 29075,29075,29075 29536,29536,29536 29998,29998,29998 30459,30459,30459 30921,30921,30921 31382,31382,31382 31844,31844,31844 32305,32305,32305 32767,32767,32767 33229,33229,33229 33690,33690,33690 34152,34152,34152 34613,34613,34613 35075,35075,35075 35536,35536,35536 35998,35998,35998 36459,36459,36459 36921,36921,36921 37382,37382,37382 37844,37844,37844 38305,38305,38305 38767,38767,38767 39228,39228,39228 39690,39690,39690 40151,40151,40151 40613,40613,40613 41074,41074,41074 41536,41536,41536 41997,41997,41997 42459,42459,42459 42920,42920,42920 43382,43382,43382 43843,43843,43843 44305,44305,44305 44766,44766,44766 45228,45228,45228 45689,45689,45689 46151,46151,46151 46612,46612,46612 47074,47074,47074 47535,47535,47535 47997,47997,47997 48458,48458,48458 48920,48920,48920 49382,49382,49382 49843,49843,49843 50305,50305,50305 50766,50766,50766 51228,51228,51228 51689,51689,51689 52151,52151,52151 52612,52612,52612 53074,53074,53074 53535,53535,53535 53997,53997,53997 54458,54458,54458 54920,54920,54920 55381,55381,55381 55843,55843,55843 56304,56304,56304 56766,56766,56766 57227,57227,57227 57689,57689,57689 58150,58150,58150 58612,58612,58612 59073,59073,59073 59535,59535,59535 59996,59996,59996 60458,60458,60458 60919,60919,60919 61381,61381,61381 61842,61842,61842 62304,62304,62304 62765,62765,62765 63227,63227,63227 63688,63688,63688 64150,64150,64150 64611,64611,64611 65073,65073,65073 65535,65535,65535 ########## g144.clr 0,0,0 458,458,458 916,916,916 1374,1374,1374 1833,1833,1833 2291,2291,2291 2749,2749,2749 3208,3208,3208 3666,3666,3666 4124,4124,4124 4582,4582,4582 5041,5041,5041 5499,5499,5499 5957,5957,5957 6416,6416,6416 6874,6874,6874 7332,7332,7332 7790,7790,7790 8249,8249,8249 8707,8707,8707 9165,9165,9165 9624,9624,9624 10082,10082,10082 10540,10540,10540 10998,10998,10998 11457,11457,11457 11915,11915,11915 12373,12373,12373 12832,12832,12832 13290,13290,13290 13748,13748,13748 14206,14206,14206 14665,14665,14665 15123,15123,15123 15581,15581,15581 16040,16040,16040 16498,16498,16498 16956,16956,16956 17414,17414,17414 17873,17873,17873 18331,18331,18331 18789,18789,18789 19248,19248,19248 19706,19706,19706 20164,20164,20164 20622,20622,20622 21081,21081,21081 21539,21539,21539 21997,21997,21997 22456,22456,22456 22914,22914,22914 23372,23372,23372 23830,23830,23830 24289,24289,24289 24747,24747,24747 25205,25205,25205 25664,25664,25664 26122,26122,26122 26580,26580,26580 27038,27038,27038 27497,27497,27497 27955,27955,27955 28413,28413,28413 28872,28872,28872 29330,29330,29330 29788,29788,29788 30246,30246,30246 30705,30705,30705 31163,31163,31163 31621,31621,31621 32080,32080,32080 32538,32538,32538 32996,32996,32996 33454,33454,33454 33913,33913,33913 34371,34371,34371 34829,34829,34829 35288,35288,35288 35746,35746,35746 36204,36204,36204 36662,36662,36662 37121,37121,37121 37579,37579,37579 38037,38037,38037 38496,38496,38496 38954,38954,38954 39412,39412,39412 39870,39870,39870 40329,40329,40329 40787,40787,40787 41245,41245,41245 41704,41704,41704 42162,42162,42162 42620,42620,42620 43078,43078,43078 43537,43537,43537 43995,43995,43995 44453,44453,44453 44912,44912,44912 45370,45370,45370 45828,45828,45828 46286,46286,46286 46745,46745,46745 47203,47203,47203 47661,47661,47661 48120,48120,48120 48578,48578,48578 49036,49036,49036 49494,49494,49494 49953,49953,49953 50411,50411,50411 50869,50869,50869 51328,51328,51328 51786,51786,51786 52244,52244,52244 52702,52702,52702 53161,53161,53161 53619,53619,53619 54077,54077,54077 54536,54536,54536 54994,54994,54994 55452,55452,55452 55910,55910,55910 56369,56369,56369 56827,56827,56827 57285,57285,57285 57744,57744,57744 58202,58202,58202 58660,58660,58660 59118,59118,59118 59577,59577,59577 60035,60035,60035 60493,60493,60493 60952,60952,60952 61410,61410,61410 61868,61868,61868 62326,62326,62326 62785,62785,62785 63243,63243,63243 63701,63701,63701 64160,64160,64160 64618,64618,64618 65076,65076,65076 65535,65535,65535 ########## g145.clr 0,0,0 455,455,455 910,910,910 1365,1365,1365 1820,1820,1820 2275,2275,2275 2730,2730,2730 3185,3185,3185 3640,3640,3640 4095,4095,4095 4551,4551,4551 5006,5006,5006 5461,5461,5461 5916,5916,5916 6371,6371,6371 6826,6826,6826 7281,7281,7281 7736,7736,7736 8191,8191,8191 8646,8646,8646 9102,9102,9102 9557,9557,9557 10012,10012,10012 10467,10467,10467 10922,10922,10922 11377,11377,11377 11832,11832,11832 12287,12287,12287 12742,12742,12742 13198,13198,13198 13653,13653,13653 14108,14108,14108 14563,14563,14563 15018,15018,15018 15473,15473,15473 15928,15928,15928 16383,16383,16383 16838,16838,16838 17293,17293,17293 17749,17749,17749 18204,18204,18204 18659,18659,18659 19114,19114,19114 19569,19569,19569 20024,20024,20024 20479,20479,20479 20934,20934,20934 21389,21389,21389 21845,21845,21845 22300,22300,22300 22755,22755,22755 23210,23210,23210 23665,23665,23665 24120,24120,24120 24575,24575,24575 25030,25030,25030 25485,25485,25485 25940,25940,25940 26396,26396,26396 26851,26851,26851 27306,27306,27306 27761,27761,27761 28216,28216,28216 28671,28671,28671 29126,29126,29126 29581,29581,29581 30036,30036,30036 30491,30491,30491 30947,30947,30947 31402,31402,31402 31857,31857,31857 32312,32312,32312 32767,32767,32767 33222,33222,33222 33677,33677,33677 34132,34132,34132 34587,34587,34587 35043,35043,35043 35498,35498,35498 35953,35953,35953 36408,36408,36408 36863,36863,36863 37318,37318,37318 37773,37773,37773 38228,38228,38228 38683,38683,38683 39138,39138,39138 39594,39594,39594 40049,40049,40049 40504,40504,40504 40959,40959,40959 41414,41414,41414 41869,41869,41869 42324,42324,42324 42779,42779,42779 43234,43234,43234 43690,43690,43690 44145,44145,44145 44600,44600,44600 45055,45055,45055 45510,45510,45510 45965,45965,45965 46420,46420,46420 46875,46875,46875 47330,47330,47330 47785,47785,47785 48241,48241,48241 48696,48696,48696 49151,49151,49151 49606,49606,49606 50061,50061,50061 50516,50516,50516 50971,50971,50971 51426,51426,51426 51881,51881,51881 52336,52336,52336 52792,52792,52792 53247,53247,53247 53702,53702,53702 54157,54157,54157 54612,54612,54612 55067,55067,55067 55522,55522,55522 55977,55977,55977 56432,56432,56432 56888,56888,56888 57343,57343,57343 57798,57798,57798 58253,58253,58253 58708,58708,58708 59163,59163,59163 59618,59618,59618 60073,60073,60073 60528,60528,60528 60983,60983,60983 61439,61439,61439 61894,61894,61894 62349,62349,62349 62804,62804,62804 63259,63259,63259 63714,63714,63714 64169,64169,64169 64624,64624,64624 65079,65079,65079 65534,65534,65534 ########## g146.clr 0,0,0 451,451,451 903,903,903 1355,1355,1355 1807,1807,1807 2259,2259,2259 2711,2711,2711 3163,3163,3163 3615,3615,3615 4067,4067,4067 4519,4519,4519 4971,4971,4971 5423,5423,5423 5875,5875,5875 6327,6327,6327 6779,6779,6779 7231,7231,7231 7683,7683,7683 8135,8135,8135 8587,8587,8587 9039,9039,9039 9491,9491,9491 9943,9943,9943 10395,10395,10395 10847,10847,10847 11299,11299,11299 11751,11751,11751 12203,12203,12203 12655,12655,12655 13107,13107,13107 13558,13558,13558 14010,14010,14010 14462,14462,14462 14914,14914,14914 15366,15366,15366 15818,15818,15818 16270,16270,16270 16722,16722,16722 17174,17174,17174 17626,17626,17626 18078,18078,18078 18530,18530,18530 18982,18982,18982 19434,19434,19434 19886,19886,19886 20338,20338,20338 20790,20790,20790 21242,21242,21242 21694,21694,21694 22146,22146,22146 22598,22598,22598 23050,23050,23050 23502,23502,23502 23954,23954,23954 24406,24406,24406 24858,24858,24858 25310,25310,25310 25762,25762,25762 26214,26214,26214 26665,26665,26665 27117,27117,27117 27569,27569,27569 28021,28021,28021 28473,28473,28473 28925,28925,28925 29377,29377,29377 29829,29829,29829 30281,30281,30281 30733,30733,30733 31185,31185,31185 31637,31637,31637 32089,32089,32089 32541,32541,32541 32993,32993,32993 33445,33445,33445 33897,33897,33897 34349,34349,34349 34801,34801,34801 35253,35253,35253 35705,35705,35705 36157,36157,36157 36609,36609,36609 37061,37061,37061 37513,37513,37513 37965,37965,37965 38417,38417,38417 38869,38869,38869 39321,39321,39321 39772,39772,39772 40224,40224,40224 40676,40676,40676 41128,41128,41128 41580,41580,41580 42032,42032,42032 42484,42484,42484 42936,42936,42936 43388,43388,43388 43840,43840,43840 44292,44292,44292 44744,44744,44744 45196,45196,45196 45648,45648,45648 46100,46100,46100 46552,46552,46552 47004,47004,47004 47456,47456,47456 47908,47908,47908 48360,48360,48360 48812,48812,48812 49264,49264,49264 49716,49716,49716 50168,50168,50168 50620,50620,50620 51072,51072,51072 51524,51524,51524 51976,51976,51976 52428,52428,52428 52879,52879,52879 53331,53331,53331 53783,53783,53783 54235,54235,54235 54687,54687,54687 55139,55139,55139 55591,55591,55591 56043,56043,56043 56495,56495,56495 56947,56947,56947 57399,57399,57399 57851,57851,57851 58303,58303,58303 58755,58755,58755 59207,59207,59207 59659,59659,59659 60111,60111,60111 60563,60563,60563 61015,61015,61015 61467,61467,61467 61919,61919,61919 62371,62371,62371 62823,62823,62823 63275,63275,63275 63727,63727,63727 64179,64179,64179 64631,64631,64631 65083,65083,65083 65535,65535,65535 ########## g147.clr 0,0,0 448,448,448 897,897,897 1346,1346,1346 1795,1795,1795 2244,2244,2244 2693,2693,2693 3142,3142,3142 3590,3590,3590 4039,4039,4039 4488,4488,4488 4937,4937,4937 5386,5386,5386 5835,5835,5835 6284,6284,6284 6733,6733,6733 7181,7181,7181 7630,7630,7630 8079,8079,8079 8528,8528,8528 8977,8977,8977 9426,9426,9426 9875,9875,9875 10324,10324,10324 10772,10772,10772 11221,11221,11221 11670,11670,11670 12119,12119,12119 12568,12568,12568 13017,13017,13017 13466,13466,13466 13914,13914,13914 14363,14363,14363 14812,14812,14812 15261,15261,15261 15710,15710,15710 16159,16159,16159 16608,16608,16608 17057,17057,17057 17505,17505,17505 17954,17954,17954 18403,18403,18403 18852,18852,18852 19301,19301,19301 19750,19750,19750 20199,20199,20199 20648,20648,20648 21096,21096,21096 21545,21545,21545 21994,21994,21994 22443,22443,22443 22892,22892,22892 23341,23341,23341 23790,23790,23790 24238,24238,24238 24687,24687,24687 25136,25136,25136 25585,25585,25585 26034,26034,26034 26483,26483,26483 26932,26932,26932 27381,27381,27381 27829,27829,27829 28278,28278,28278 28727,28727,28727 29176,29176,29176 29625,29625,29625 30074,30074,30074 30523,30523,30523 30972,30972,30972 31420,31420,31420 31869,31869,31869 32318,32318,32318 32767,32767,32767 33216,33216,33216 33665,33665,33665 34114,34114,34114 34562,34562,34562 35011,35011,35011 35460,35460,35460 35909,35909,35909 36358,36358,36358 36807,36807,36807 37256,37256,37256 37705,37705,37705 38153,38153,38153 38602,38602,38602 39051,39051,39051 39500,39500,39500 39949,39949,39949 40398,40398,40398 40847,40847,40847 41296,41296,41296 41744,41744,41744 42193,42193,42193 42642,42642,42642 43091,43091,43091 43540,43540,43540 43989,43989,43989 44438,44438,44438 44886,44886,44886 45335,45335,45335 45784,45784,45784 46233,46233,46233 46682,46682,46682 47131,47131,47131 47580,47580,47580 48029,48029,48029 48477,48477,48477 48926,48926,48926 49375,49375,49375 49824,49824,49824 50273,50273,50273 50722,50722,50722 51171,51171,51171 51620,51620,51620 52068,52068,52068 52517,52517,52517 52966,52966,52966 53415,53415,53415 53864,53864,53864 54313,54313,54313 54762,54762,54762 55210,55210,55210 55659,55659,55659 56108,56108,56108 56557,56557,56557 57006,57006,57006 57455,57455,57455 57904,57904,57904 58353,58353,58353 58801,58801,58801 59250,59250,59250 59699,59699,59699 60148,60148,60148 60597,60597,60597 61046,61046,61046 61495,61495,61495 61944,61944,61944 62392,62392,62392 62841,62841,62841 63290,63290,63290 63739,63739,63739 64188,64188,64188 64637,64637,64637 65086,65086,65086 65534,65534,65534 ########## g148.clr 0,0,0 445,445,445 891,891,891 1337,1337,1337 1783,1783,1783 2229,2229,2229 2674,2674,2674 3120,3120,3120 3566,3566,3566 4012,4012,4012 4458,4458,4458 4903,4903,4903 5349,5349,5349 5795,5795,5795 6241,6241,6241 6687,6687,6687 7133,7133,7133 7578,7578,7578 8024,8024,8024 8470,8470,8470 8916,8916,8916 9362,9362,9362 9807,9807,9807 10253,10253,10253 10699,10699,10699 11145,11145,11145 11591,11591,11591 12037,12037,12037 12482,12482,12482 12928,12928,12928 13374,13374,13374 13820,13820,13820 14266,14266,14266 14711,14711,14711 15157,15157,15157 15603,15603,15603 16049,16049,16049 16495,16495,16495 16941,16941,16941 17386,17386,17386 17832,17832,17832 18278,18278,18278 18724,18724,18724 19170,19170,19170 19615,19615,19615 20061,20061,20061 20507,20507,20507 20953,20953,20953 21399,21399,21399 21845,21845,21845 22290,22290,22290 22736,22736,22736 23182,23182,23182 23628,23628,23628 24074,24074,24074 24519,24519,24519 24965,24965,24965 25411,25411,25411 25857,25857,25857 26303,26303,26303 26748,26748,26748 27194,27194,27194 27640,27640,27640 28086,28086,28086 28532,28532,28532 28978,28978,28978 29423,29423,29423 29869,29869,29869 30315,30315,30315 30761,30761,30761 31207,31207,31207 31652,31652,31652 32098,32098,32098 32544,32544,32544 32990,32990,32990 33436,33436,33436 33882,33882,33882 34327,34327,34327 34773,34773,34773 35219,35219,35219 35665,35665,35665 36111,36111,36111 36556,36556,36556 37002,37002,37002 37448,37448,37448 37894,37894,37894 38340,38340,38340 38786,38786,38786 39231,39231,39231 39677,39677,39677 40123,40123,40123 40569,40569,40569 41015,41015,41015 41460,41460,41460 41906,41906,41906 42352,42352,42352 42798,42798,42798 43244,43244,43244 43690,43690,43690 44135,44135,44135 44581,44581,44581 45027,45027,45027 45473,45473,45473 45919,45919,45919 46364,46364,46364 46810,46810,46810 47256,47256,47256 47702,47702,47702 48148,48148,48148 48593,48593,48593 49039,49039,49039 49485,49485,49485 49931,49931,49931 50377,50377,50377 50823,50823,50823 51268,51268,51268 51714,51714,51714 52160,52160,52160 52606,52606,52606 53052,53052,53052 53497,53497,53497 53943,53943,53943 54389,54389,54389 54835,54835,54835 55281,55281,55281 55727,55727,55727 56172,56172,56172 56618,56618,56618 57064,57064,57064 57510,57510,57510 57956,57956,57956 58401,58401,58401 58847,58847,58847 59293,59293,59293 59739,59739,59739 60185,60185,60185 60631,60631,60631 61076,61076,61076 61522,61522,61522 61968,61968,61968 62414,62414,62414 62860,62860,62860 63305,63305,63305 63751,63751,63751 64197,64197,64197 64643,64643,64643 65089,65089,65089 65535,65535,65535 ########## g149.clr 0,0,0 442,442,442 885,885,885 1328,1328,1328 1771,1771,1771 2214,2214,2214 2656,2656,2656 3099,3099,3099 3542,3542,3542 3985,3985,3985 4428,4428,4428 4870,4870,4870 5313,5313,5313 5756,5756,5756 6199,6199,6199 6642,6642,6642 7084,7084,7084 7527,7527,7527 7970,7970,7970 8413,8413,8413 8856,8856,8856 9298,9298,9298 9741,9741,9741 10184,10184,10184 10627,10627,10627 11070,11070,11070 11512,11512,11512 11955,11955,11955 12398,12398,12398 12841,12841,12841 13284,13284,13284 13726,13726,13726 14169,14169,14169 14612,14612,14612 15055,15055,15055 15498,15498,15498 15940,15940,15940 16383,16383,16383 16826,16826,16826 17269,17269,17269 17712,17712,17712 18154,18154,18154 18597,18597,18597 19040,19040,19040 19483,19483,19483 19926,19926,19926 20368,20368,20368 20811,20811,20811 21254,21254,21254 21697,21697,21697 22140,22140,22140 22583,22583,22583 23025,23025,23025 23468,23468,23468 23911,23911,23911 24354,24354,24354 24797,24797,24797 25239,25239,25239 25682,25682,25682 26125,26125,26125 26568,26568,26568 27011,27011,27011 27453,27453,27453 27896,27896,27896 28339,28339,28339 28782,28782,28782 29225,29225,29225 29667,29667,29667 30110,30110,30110 30553,30553,30553 30996,30996,30996 31439,31439,31439 31881,31881,31881 32324,32324,32324 32767,32767,32767 33210,33210,33210 33653,33653,33653 34095,34095,34095 34538,34538,34538 34981,34981,34981 35424,35424,35424 35867,35867,35867 36309,36309,36309 36752,36752,36752 37195,37195,37195 37638,37638,37638 38081,38081,38081 38523,38523,38523 38966,38966,38966 39409,39409,39409 39852,39852,39852 40295,40295,40295 40737,40737,40737 41180,41180,41180 41623,41623,41623 42066,42066,42066 42509,42509,42509 42951,42951,42951 43394,43394,43394 43837,43837,43837 44280,44280,44280 44723,44723,44723 45166,45166,45166 45608,45608,45608 46051,46051,46051 46494,46494,46494 46937,46937,46937 47380,47380,47380 47822,47822,47822 48265,48265,48265 48708,48708,48708 49151,49151,49151 49594,49594,49594 50036,50036,50036 50479,50479,50479 50922,50922,50922 51365,51365,51365 51808,51808,51808 52250,52250,52250 52693,52693,52693 53136,53136,53136 53579,53579,53579 54022,54022,54022 54464,54464,54464 54907,54907,54907 55350,55350,55350 55793,55793,55793 56236,56236,56236 56678,56678,56678 57121,57121,57121 57564,57564,57564 58007,58007,58007 58450,58450,58450 58892,58892,58892 59335,59335,59335 59778,59778,59778 60221,60221,60221 60664,60664,60664 61106,61106,61106 61549,61549,61549 61992,61992,61992 62435,62435,62435 62878,62878,62878 63320,63320,63320 63763,63763,63763 64206,64206,64206 64649,64649,64649 65092,65092,65092 65535,65535,65535 ########## g15.clr 0,0,0 4681,4681,4681 9362,9362,9362 14043,14043,14043 18724,18724,18724 23405,23405,23405 28086,28086,28086 32767,32767,32767 37448,37448,37448 42129,42129,42129 46810,46810,46810 51491,51491,51491 56172,56172,56172 60853,60853,60853 65535,65535,65535 ########## g150.clr 0,0,0 439,439,439 879,879,879 1319,1319,1319 1759,1759,1759 2199,2199,2199 2638,2638,2638 3078,3078,3078 3518,3518,3518 3958,3958,3958 4398,4398,4398 4838,4838,4838 5277,5277,5277 5717,5717,5717 6157,6157,6157 6597,6597,6597 7037,7037,7037 7477,7477,7477 7916,7916,7916 8356,8356,8356 8796,8796,8796 9236,9236,9236 9676,9676,9676 10116,10116,10116 10555,10555,10555 10995,10995,10995 11435,11435,11435 11875,11875,11875 12315,12315,12315 12755,12755,12755 13194,13194,13194 13634,13634,13634 14074,14074,14074 14514,14514,14514 14954,14954,14954 15394,15394,15394 15833,15833,15833 16273,16273,16273 16713,16713,16713 17153,17153,17153 17593,17593,17593 18033,18033,18033 18472,18472,18472 18912,18912,18912 19352,19352,19352 19792,19792,19792 20232,20232,20232 20672,20672,20672 21111,21111,21111 21551,21551,21551 21991,21991,21991 22431,22431,22431 22871,22871,22871 23311,23311,23311 23750,23750,23750 24190,24190,24190 24630,24630,24630 25070,25070,25070 25510,25510,25510 25950,25950,25950 26389,26389,26389 26829,26829,26829 27269,27269,27269 27709,27709,27709 28149,28149,28149 28589,28589,28589 29028,29028,29028 29468,29468,29468 29908,29908,29908 30348,30348,30348 30788,30788,30788 31228,31228,31228 31667,31667,31667 32107,32107,32107 32547,32547,32547 32987,32987,32987 33427,33427,33427 33867,33867,33867 34306,34306,34306 34746,34746,34746 35186,35186,35186 35626,35626,35626 36066,36066,36066 36506,36506,36506 36945,36945,36945 37385,37385,37385 37825,37825,37825 38265,38265,38265 38705,38705,38705 39145,39145,39145 39584,39584,39584 40024,40024,40024 40464,40464,40464 40904,40904,40904 41344,41344,41344 41784,41784,41784 42223,42223,42223 42663,42663,42663 43103,43103,43103 43543,43543,43543 43983,43983,43983 44423,44423,44423 44862,44862,44862 45302,45302,45302 45742,45742,45742 46182,46182,46182 46622,46622,46622 47062,47062,47062 47501,47501,47501 47941,47941,47941 48381,48381,48381 48821,48821,48821 49261,49261,49261 49701,49701,49701 50140,50140,50140 50580,50580,50580 51020,51020,51020 51460,51460,51460 51900,51900,51900 52340,52340,52340 52779,52779,52779 53219,53219,53219 53659,53659,53659 54099,54099,54099 54539,54539,54539 54979,54979,54979 55418,55418,55418 55858,55858,55858 56298,56298,56298 56738,56738,56738 57178,57178,57178 57618,57618,57618 58057,58057,58057 58497,58497,58497 58937,58937,58937 59377,59377,59377 59817,59817,59817 60257,60257,60257 60696,60696,60696 61136,61136,61136 61576,61576,61576 62016,62016,62016 62456,62456,62456 62896,62896,62896 63335,63335,63335 63775,63775,63775 64215,64215,64215 64655,64655,64655 65095,65095,65095 65535,65535,65535 ########## g151.clr 0,0,0 436,436,436 873,873,873 1310,1310,1310 1747,1747,1747 2184,2184,2184 2621,2621,2621 3058,3058,3058 3495,3495,3495 3932,3932,3932 4369,4369,4369 4805,4805,4805 5242,5242,5242 5679,5679,5679 6116,6116,6116 6553,6553,6553 6990,6990,6990 7427,7427,7427 7864,7864,7864 8301,8301,8301 8738,8738,8738 9174,9174,9174 9611,9611,9611 10048,10048,10048 10485,10485,10485 10922,10922,10922 11359,11359,11359 11796,11796,11796 12233,12233,12233 12670,12670,12670 13107,13107,13107 13543,13543,13543 13980,13980,13980 14417,14417,14417 14854,14854,14854 15291,15291,15291 15728,15728,15728 16165,16165,16165 16602,16602,16602 17039,17039,17039 17476,17476,17476 17912,17912,17912 18349,18349,18349 18786,18786,18786 19223,19223,19223 19660,19660,19660 20097,20097,20097 20534,20534,20534 20971,20971,20971 21408,21408,21408 21845,21845,21845 22281,22281,22281 22718,22718,22718 23155,23155,23155 23592,23592,23592 24029,24029,24029 24466,24466,24466 24903,24903,24903 25340,25340,25340 25777,25777,25777 26214,26214,26214 26650,26650,26650 27087,27087,27087 27524,27524,27524 27961,27961,27961 28398,28398,28398 28835,28835,28835 29272,29272,29272 29709,29709,29709 30146,30146,30146 30583,30583,30583 31019,31019,31019 31456,31456,31456 31893,31893,31893 32330,32330,32330 32767,32767,32767 33204,33204,33204 33641,33641,33641 34078,34078,34078 34515,34515,34515 34952,34952,34952 35388,35388,35388 35825,35825,35825 36262,36262,36262 36699,36699,36699 37136,37136,37136 37573,37573,37573 38010,38010,38010 38447,38447,38447 38884,38884,38884 39321,39321,39321 39757,39757,39757 40194,40194,40194 40631,40631,40631 41068,41068,41068 41505,41505,41505 41942,41942,41942 42379,42379,42379 42816,42816,42816 43253,43253,43253 43690,43690,43690 44126,44126,44126 44563,44563,44563 45000,45000,45000 45437,45437,45437 45874,45874,45874 46311,46311,46311 46748,46748,46748 47185,47185,47185 47622,47622,47622 48059,48059,48059 48495,48495,48495 48932,48932,48932 49369,49369,49369 49806,49806,49806 50243,50243,50243 50680,50680,50680 51117,51117,51117 51554,51554,51554 51991,51991,51991 52428,52428,52428 52864,52864,52864 53301,53301,53301 53738,53738,53738 54175,54175,54175 54612,54612,54612 55049,55049,55049 55486,55486,55486 55923,55923,55923 56360,56360,56360 56797,56797,56797 57233,57233,57233 57670,57670,57670 58107,58107,58107 58544,58544,58544 58981,58981,58981 59418,59418,59418 59855,59855,59855 60292,60292,60292 60729,60729,60729 61166,61166,61166 61602,61602,61602 62039,62039,62039 62476,62476,62476 62913,62913,62913 63350,63350,63350 63787,63787,63787 64224,64224,64224 64661,64661,64661 65098,65098,65098 65535,65535,65535 ########## g152.clr 0,0,0 434,434,434 868,868,868 1302,1302,1302 1736,1736,1736 2170,2170,2170 2604,2604,2604 3038,3038,3038 3472,3472,3472 3906,3906,3906 4340,4340,4340 4774,4774,4774 5208,5208,5208 5642,5642,5642 6076,6076,6076 6510,6510,6510 6944,6944,6944 7378,7378,7378 7812,7812,7812 8246,8246,8246 8680,8680,8680 9114,9114,9114 9548,9548,9548 9982,9982,9982 10416,10416,10416 10850,10850,10850 11284,11284,11284 11718,11718,11718 12152,12152,12152 12586,12586,12586 13020,13020,13020 13454,13454,13454 13888,13888,13888 14322,14322,14322 14756,14756,14756 15190,15190,15190 15624,15624,15624 16058,16058,16058 16492,16492,16492 16926,16926,16926 17360,17360,17360 17794,17794,17794 18228,18228,18228 18662,18662,18662 19096,19096,19096 19530,19530,19530 19964,19964,19964 20398,20398,20398 20832,20832,20832 21266,21266,21266 21700,21700,21700 22134,22134,22134 22568,22568,22568 23002,23002,23002 23436,23436,23436 23870,23870,23870 24304,24304,24304 24738,24738,24738 25172,25172,25172 25606,25606,25606 26040,26040,26040 26474,26474,26474 26908,26908,26908 27342,27342,27342 27776,27776,27776 28210,28210,28210 28644,28644,28644 29078,29078,29078 29512,29512,29512 29946,29946,29946 30380,30380,30380 30814,30814,30814 31248,31248,31248 31682,31682,31682 32116,32116,32116 32550,32550,32550 32984,32984,32984 33418,33418,33418 33852,33852,33852 34286,34286,34286 34720,34720,34720 35154,35154,35154 35588,35588,35588 36022,36022,36022 36456,36456,36456 36890,36890,36890 37324,37324,37324 37758,37758,37758 38192,38192,38192 38626,38626,38626 39060,39060,39060 39494,39494,39494 39928,39928,39928 40362,40362,40362 40796,40796,40796 41230,41230,41230 41664,41664,41664 42098,42098,42098 42532,42532,42532 42966,42966,42966 43400,43400,43400 43834,43834,43834 44268,44268,44268 44702,44702,44702 45136,45136,45136 45570,45570,45570 46004,46004,46004 46438,46438,46438 46872,46872,46872 47306,47306,47306 47740,47740,47740 48174,48174,48174 48608,48608,48608 49042,49042,49042 49476,49476,49476 49910,49910,49910 50344,50344,50344 50778,50778,50778 51212,51212,51212 51646,51646,51646 52080,52080,52080 52514,52514,52514 52948,52948,52948 53382,53382,53382 53816,53816,53816 54250,54250,54250 54684,54684,54684 55118,55118,55118 55552,55552,55552 55986,55986,55986 56420,56420,56420 56854,56854,56854 57288,57288,57288 57722,57722,57722 58156,58156,58156 58590,58590,58590 59024,59024,59024 59458,59458,59458 59892,59892,59892 60326,60326,60326 60760,60760,60760 61194,61194,61194 61628,61628,61628 62062,62062,62062 62496,62496,62496 62930,62930,62930 63364,63364,63364 63798,63798,63798 64232,64232,64232 64666,64666,64666 65100,65100,65100 65534,65534,65534 ########## g153.clr 0,0,0 431,431,431 862,862,862 1293,1293,1293 1724,1724,1724 2155,2155,2155 2586,2586,2586 3018,3018,3018 3449,3449,3449 3880,3880,3880 4311,4311,4311 4742,4742,4742 5173,5173,5173 5604,5604,5604 6036,6036,6036 6467,6467,6467 6898,6898,6898 7329,7329,7329 7760,7760,7760 8191,8191,8191 8623,8623,8623 9054,9054,9054 9485,9485,9485 9916,9916,9916 10347,10347,10347 10778,10778,10778 11209,11209,11209 11641,11641,11641 12072,12072,12072 12503,12503,12503 12934,12934,12934 13365,13365,13365 13796,13796,13796 14227,14227,14227 14659,14659,14659 15090,15090,15090 15521,15521,15521 15952,15952,15952 16383,16383,16383 16814,16814,16814 17246,17246,17246 17677,17677,17677 18108,18108,18108 18539,18539,18539 18970,18970,18970 19401,19401,19401 19832,19832,19832 20264,20264,20264 20695,20695,20695 21126,21126,21126 21557,21557,21557 21988,21988,21988 22419,22419,22419 22851,22851,22851 23282,23282,23282 23713,23713,23713 24144,24144,24144 24575,24575,24575 25006,25006,25006 25437,25437,25437 25869,25869,25869 26300,26300,26300 26731,26731,26731 27162,27162,27162 27593,27593,27593 28024,28024,28024 28455,28455,28455 28887,28887,28887 29318,29318,29318 29749,29749,29749 30180,30180,30180 30611,30611,30611 31042,31042,31042 31474,31474,31474 31905,31905,31905 32336,32336,32336 32767,32767,32767 33198,33198,33198 33629,33629,33629 34060,34060,34060 34492,34492,34492 34923,34923,34923 35354,35354,35354 35785,35785,35785 36216,36216,36216 36647,36647,36647 37079,37079,37079 37510,37510,37510 37941,37941,37941 38372,38372,38372 38803,38803,38803 39234,39234,39234 39665,39665,39665 40097,40097,40097 40528,40528,40528 40959,40959,40959 41390,41390,41390 41821,41821,41821 42252,42252,42252 42683,42683,42683 43115,43115,43115 43546,43546,43546 43977,43977,43977 44408,44408,44408 44839,44839,44839 45270,45270,45270 45702,45702,45702 46133,46133,46133 46564,46564,46564 46995,46995,46995 47426,47426,47426 47857,47857,47857 48288,48288,48288 48720,48720,48720 49151,49151,49151 49582,49582,49582 50013,50013,50013 50444,50444,50444 50875,50875,50875 51307,51307,51307 51738,51738,51738 52169,52169,52169 52600,52600,52600 53031,53031,53031 53462,53462,53462 53893,53893,53893 54325,54325,54325 54756,54756,54756 55187,55187,55187 55618,55618,55618 56049,56049,56049 56480,56480,56480 56911,56911,56911 57343,57343,57343 57774,57774,57774 58205,58205,58205 58636,58636,58636 59067,59067,59067 59498,59498,59498 59930,59930,59930 60361,60361,60361 60792,60792,60792 61223,61223,61223 61654,61654,61654 62085,62085,62085 62516,62516,62516 62948,62948,62948 63379,63379,63379 63810,63810,63810 64241,64241,64241 64672,64672,64672 65103,65103,65103 65534,65534,65534 ########## g154.clr 0,0,0 428,428,428 856,856,856 1285,1285,1285 1713,1713,1713 2141,2141,2141 2570,2570,2570 2998,2998,2998 3426,3426,3426 3855,3855,3855 4283,4283,4283 4711,4711,4711 5140,5140,5140 5568,5568,5568 5996,5996,5996 6425,6425,6425 6853,6853,6853 7281,7281,7281 7710,7710,7710 8138,8138,8138 8566,8566,8566 8995,8995,8995 9423,9423,9423 9851,9851,9851 10280,10280,10280 10708,10708,10708 11136,11136,11136 11565,11565,11565 11993,11993,11993 12421,12421,12421 12850,12850,12850 13278,13278,13278 13706,13706,13706 14135,14135,14135 14563,14563,14563 14991,14991,14991 15420,15420,15420 15848,15848,15848 16276,16276,16276 16705,16705,16705 17133,17133,17133 17561,17561,17561 17990,17990,17990 18418,18418,18418 18846,18846,18846 19275,19275,19275 19703,19703,19703 20131,20131,20131 20560,20560,20560 20988,20988,20988 21416,21416,21416 21845,21845,21845 22273,22273,22273 22701,22701,22701 23130,23130,23130 23558,23558,23558 23986,23986,23986 24415,24415,24415 24843,24843,24843 25271,25271,25271 25700,25700,25700 26128,26128,26128 26556,26556,26556 26985,26985,26985 27413,27413,27413 27841,27841,27841 28270,28270,28270 28698,28698,28698 29126,29126,29126 29555,29555,29555 29983,29983,29983 30411,30411,30411 30840,30840,30840 31268,31268,31268 31696,31696,31696 32125,32125,32125 32553,32553,32553 32981,32981,32981 33410,33410,33410 33838,33838,33838 34266,34266,34266 34695,34695,34695 35123,35123,35123 35551,35551,35551 35980,35980,35980 36408,36408,36408 36836,36836,36836 37265,37265,37265 37693,37693,37693 38121,38121,38121 38550,38550,38550 38978,38978,38978 39406,39406,39406 39835,39835,39835 40263,40263,40263 40691,40691,40691 41120,41120,41120 41548,41548,41548 41976,41976,41976 42405,42405,42405 42833,42833,42833 43261,43261,43261 43690,43690,43690 44118,44118,44118 44546,44546,44546 44975,44975,44975 45403,45403,45403 45831,45831,45831 46260,46260,46260 46688,46688,46688 47116,47116,47116 47545,47545,47545 47973,47973,47973 48401,48401,48401 48830,48830,48830 49258,49258,49258 49686,49686,49686 50115,50115,50115 50543,50543,50543 50971,50971,50971 51400,51400,51400 51828,51828,51828 52256,52256,52256 52685,52685,52685 53113,53113,53113 53541,53541,53541 53970,53970,53970 54398,54398,54398 54826,54826,54826 55255,55255,55255 55683,55683,55683 56111,56111,56111 56540,56540,56540 56968,56968,56968 57396,57396,57396 57825,57825,57825 58253,58253,58253 58681,58681,58681 59110,59110,59110 59538,59538,59538 59966,59966,59966 60395,60395,60395 60823,60823,60823 61251,61251,61251 61680,61680,61680 62108,62108,62108 62536,62536,62536 62965,62965,62965 63393,63393,63393 63821,63821,63821 64250,64250,64250 64678,64678,64678 65106,65106,65106 65535,65535,65535 ########## g155.clr 0,0,0 425,425,425 851,851,851 1276,1276,1276 1702,1702,1702 2127,2127,2127 2553,2553,2553 2978,2978,2978 3404,3404,3404 3829,3829,3829 4255,4255,4255 4681,4681,4681 5106,5106,5106 5532,5532,5532 5957,5957,5957 6383,6383,6383 6808,6808,6808 7234,7234,7234 7659,7659,7659 8085,8085,8085 8511,8511,8511 8936,8936,8936 9362,9362,9362 9787,9787,9787 10213,10213,10213 10638,10638,10638 11064,11064,11064 11489,11489,11489 11915,11915,11915 12341,12341,12341 12766,12766,12766 13192,13192,13192 13617,13617,13617 14043,14043,14043 14468,14468,14468 14894,14894,14894 15319,15319,15319 15745,15745,15745 16170,16170,16170 16596,16596,16596 17022,17022,17022 17447,17447,17447 17873,17873,17873 18298,18298,18298 18724,18724,18724 19149,19149,19149 19575,19575,19575 20000,20000,20000 20426,20426,20426 20852,20852,20852 21277,21277,21277 21703,21703,21703 22128,22128,22128 22554,22554,22554 22979,22979,22979 23405,23405,23405 23830,23830,23830 24256,24256,24256 24682,24682,24682 25107,25107,25107 25533,25533,25533 25958,25958,25958 26384,26384,26384 26809,26809,26809 27235,27235,27235 27660,27660,27660 28086,28086,28086 28511,28511,28511 28937,28937,28937 29363,29363,29363 29788,29788,29788 30214,30214,30214 30639,30639,30639 31065,31065,31065 31490,31490,31490 31916,31916,31916 32341,32341,32341 32767,32767,32767 33193,33193,33193 33618,33618,33618 34044,34044,34044 34469,34469,34469 34895,34895,34895 35320,35320,35320 35746,35746,35746 36171,36171,36171 36597,36597,36597 37023,37023,37023 37448,37448,37448 37874,37874,37874 38299,38299,38299 38725,38725,38725 39150,39150,39150 39576,39576,39576 40001,40001,40001 40427,40427,40427 40852,40852,40852 41278,41278,41278 41704,41704,41704 42129,42129,42129 42555,42555,42555 42980,42980,42980 43406,43406,43406 43831,43831,43831 44257,44257,44257 44682,44682,44682 45108,45108,45108 45534,45534,45534 45959,45959,45959 46385,46385,46385 46810,46810,46810 47236,47236,47236 47661,47661,47661 48087,48087,48087 48512,48512,48512 48938,48938,48938 49364,49364,49364 49789,49789,49789 50215,50215,50215 50640,50640,50640 51066,51066,51066 51491,51491,51491 51917,51917,51917 52342,52342,52342 52768,52768,52768 53193,53193,53193 53619,53619,53619 54045,54045,54045 54470,54470,54470 54896,54896,54896 55321,55321,55321 55747,55747,55747 56172,56172,56172 56598,56598,56598 57023,57023,57023 57449,57449,57449 57875,57875,57875 58300,58300,58300 58726,58726,58726 59151,59151,59151 59577,59577,59577 60002,60002,60002 60428,60428,60428 60853,60853,60853 61279,61279,61279 61705,61705,61705 62130,62130,62130 62556,62556,62556 62981,62981,62981 63407,63407,63407 63832,63832,63832 64258,64258,64258 64683,64683,64683 65109,65109,65109 65535,65535,65535 ########## g156.clr 0,0,0 422,422,422 845,845,845 1268,1268,1268 1691,1691,1691 2114,2114,2114 2536,2536,2536 2959,2959,2959 3382,3382,3382 3805,3805,3805 4228,4228,4228 4650,4650,4650 5073,5073,5073 5496,5496,5496 5919,5919,5919 6342,6342,6342 6764,6764,6764 7187,7187,7187 7610,7610,7610 8033,8033,8033 8456,8456,8456 8878,8878,8878 9301,9301,9301 9724,9724,9724 10147,10147,10147 10570,10570,10570 10992,10992,10992 11415,11415,11415 11838,11838,11838 12261,12261,12261 12684,12684,12684 13107,13107,13107 13529,13529,13529 13952,13952,13952 14375,14375,14375 14798,14798,14798 15221,15221,15221 15643,15643,15643 16066,16066,16066 16489,16489,16489 16912,16912,16912 17335,17335,17335 17757,17757,17757 18180,18180,18180 18603,18603,18603 19026,19026,19026 19449,19449,19449 19871,19871,19871 20294,20294,20294 20717,20717,20717 21140,21140,21140 21563,21563,21563 21985,21985,21985 22408,22408,22408 22831,22831,22831 23254,23254,23254 23677,23677,23677 24099,24099,24099 24522,24522,24522 24945,24945,24945 25368,25368,25368 25791,25791,25791 26214,26214,26214 26636,26636,26636 27059,27059,27059 27482,27482,27482 27905,27905,27905 28328,28328,28328 28750,28750,28750 29173,29173,29173 29596,29596,29596 30019,30019,30019 30442,30442,30442 30864,30864,30864 31287,31287,31287 31710,31710,31710 32133,32133,32133 32556,32556,32556 32978,32978,32978 33401,33401,33401 33824,33824,33824 34247,34247,34247 34670,34670,34670 35092,35092,35092 35515,35515,35515 35938,35938,35938 36361,36361,36361 36784,36784,36784 37206,37206,37206 37629,37629,37629 38052,38052,38052 38475,38475,38475 38898,38898,38898 39321,39321,39321 39743,39743,39743 40166,40166,40166 40589,40589,40589 41012,41012,41012 41435,41435,41435 41857,41857,41857 42280,42280,42280 42703,42703,42703 43126,43126,43126 43549,43549,43549 43971,43971,43971 44394,44394,44394 44817,44817,44817 45240,45240,45240 45663,45663,45663 46085,46085,46085 46508,46508,46508 46931,46931,46931 47354,47354,47354 47777,47777,47777 48199,48199,48199 48622,48622,48622 49045,49045,49045 49468,49468,49468 49891,49891,49891 50313,50313,50313 50736,50736,50736 51159,51159,51159 51582,51582,51582 52005,52005,52005 52428,52428,52428 52850,52850,52850 53273,53273,53273 53696,53696,53696 54119,54119,54119 54542,54542,54542 54964,54964,54964 55387,55387,55387 55810,55810,55810 56233,56233,56233 56656,56656,56656 57078,57078,57078 57501,57501,57501 57924,57924,57924 58347,58347,58347 58770,58770,58770 59192,59192,59192 59615,59615,59615 60038,60038,60038 60461,60461,60461 60884,60884,60884 61306,61306,61306 61729,61729,61729 62152,62152,62152 62575,62575,62575 62998,62998,62998 63420,63420,63420 63843,63843,63843 64266,64266,64266 64689,64689,64689 65112,65112,65112 65535,65535,65535 ########## g157.clr 0,0,0 420,420,420 840,840,840 1260,1260,1260 1680,1680,1680 2100,2100,2100 2520,2520,2520 2940,2940,2940 3360,3360,3360 3780,3780,3780 4200,4200,4200 4621,4621,4621 5041,5041,5041 5461,5461,5461 5881,5881,5881 6301,6301,6301 6721,6721,6721 7141,7141,7141 7561,7561,7561 7981,7981,7981 8401,8401,8401 8822,8822,8822 9242,9242,9242 9662,9662,9662 10082,10082,10082 10502,10502,10502 10922,10922,10922 11342,11342,11342 11762,11762,11762 12182,12182,12182 12602,12602,12602 13022,13022,13022 13443,13443,13443 13863,13863,13863 14283,14283,14283 14703,14703,14703 15123,15123,15123 15543,15543,15543 15963,15963,15963 16383,16383,16383 16803,16803,16803 17223,17223,17223 17644,17644,17644 18064,18064,18064 18484,18484,18484 18904,18904,18904 19324,19324,19324 19744,19744,19744 20164,20164,20164 20584,20584,20584 21004,21004,21004 21424,21424,21424 21845,21845,21845 22265,22265,22265 22685,22685,22685 23105,23105,23105 23525,23525,23525 23945,23945,23945 24365,24365,24365 24785,24785,24785 25205,25205,25205 25625,25625,25625 26045,26045,26045 26466,26466,26466 26886,26886,26886 27306,27306,27306 27726,27726,27726 28146,28146,28146 28566,28566,28566 28986,28986,28986 29406,29406,29406 29826,29826,29826 30246,30246,30246 30667,30667,30667 31087,31087,31087 31507,31507,31507 31927,31927,31927 32347,32347,32347 32767,32767,32767 33187,33187,33187 33607,33607,33607 34027,34027,34027 34447,34447,34447 34867,34867,34867 35288,35288,35288 35708,35708,35708 36128,36128,36128 36548,36548,36548 36968,36968,36968 37388,37388,37388 37808,37808,37808 38228,38228,38228 38648,38648,38648 39068,39068,39068 39489,39489,39489 39909,39909,39909 40329,40329,40329 40749,40749,40749 41169,41169,41169 41589,41589,41589 42009,42009,42009 42429,42429,42429 42849,42849,42849 43269,43269,43269 43690,43690,43690 44110,44110,44110 44530,44530,44530 44950,44950,44950 45370,45370,45370 45790,45790,45790 46210,46210,46210 46630,46630,46630 47050,47050,47050 47470,47470,47470 47890,47890,47890 48311,48311,48311 48731,48731,48731 49151,49151,49151 49571,49571,49571 49991,49991,49991 50411,50411,50411 50831,50831,50831 51251,51251,51251 51671,51671,51671 52091,52091,52091 52512,52512,52512 52932,52932,52932 53352,53352,53352 53772,53772,53772 54192,54192,54192 54612,54612,54612 55032,55032,55032 55452,55452,55452 55872,55872,55872 56292,56292,56292 56712,56712,56712 57133,57133,57133 57553,57553,57553 57973,57973,57973 58393,58393,58393 58813,58813,58813 59233,59233,59233 59653,59653,59653 60073,60073,60073 60493,60493,60493 60913,60913,60913 61334,61334,61334 61754,61754,61754 62174,62174,62174 62594,62594,62594 63014,63014,63014 63434,63434,63434 63854,63854,63854 64274,64274,64274 64694,64694,64694 65114,65114,65114 65534,65534,65534 ########## g158.clr 0,0,0 417,417,417 834,834,834 1252,1252,1252 1669,1669,1669 2087,2087,2087 2504,2504,2504 2921,2921,2921 3339,3339,3339 3756,3756,3756 4174,4174,4174 4591,4591,4591 5009,5009,5009 5426,5426,5426 5843,5843,5843 6261,6261,6261 6678,6678,6678 7096,7096,7096 7513,7513,7513 7930,7930,7930 8348,8348,8348 8765,8765,8765 9183,9183,9183 9600,9600,9600 10018,10018,10018 10435,10435,10435 10852,10852,10852 11270,11270,11270 11687,11687,11687 12105,12105,12105 12522,12522,12522 12940,12940,12940 13357,13357,13357 13774,13774,13774 14192,14192,14192 14609,14609,14609 15027,15027,15027 15444,15444,15444 15861,15861,15861 16279,16279,16279 16696,16696,16696 17114,17114,17114 17531,17531,17531 17949,17949,17949 18366,18366,18366 18783,18783,18783 19201,19201,19201 19618,19618,19618 20036,20036,20036 20453,20453,20453 20871,20871,20871 21288,21288,21288 21705,21705,21705 22123,22123,22123 22540,22540,22540 22958,22958,22958 23375,23375,23375 23792,23792,23792 24210,24210,24210 24627,24627,24627 25045,25045,25045 25462,25462,25462 25880,25880,25880 26297,26297,26297 26714,26714,26714 27132,27132,27132 27549,27549,27549 27967,27967,27967 28384,28384,28384 28802,28802,28802 29219,29219,29219 29636,29636,29636 30054,30054,30054 30471,30471,30471 30889,30889,30889 31306,31306,31306 31723,31723,31723 32141,32141,32141 32558,32558,32558 32976,32976,32976 33393,33393,33393 33811,33811,33811 34228,34228,34228 34645,34645,34645 35063,35063,35063 35480,35480,35480 35898,35898,35898 36315,36315,36315 36732,36732,36732 37150,37150,37150 37567,37567,37567 37985,37985,37985 38402,38402,38402 38820,38820,38820 39237,39237,39237 39654,39654,39654 40072,40072,40072 40489,40489,40489 40907,40907,40907 41324,41324,41324 41742,41742,41742 42159,42159,42159 42576,42576,42576 42994,42994,42994 43411,43411,43411 43829,43829,43829 44246,44246,44246 44663,44663,44663 45081,45081,45081 45498,45498,45498 45916,45916,45916 46333,46333,46333 46751,46751,46751 47168,47168,47168 47585,47585,47585 48003,48003,48003 48420,48420,48420 48838,48838,48838 49255,49255,49255 49673,49673,49673 50090,50090,50090 50507,50507,50507 50925,50925,50925 51342,51342,51342 51760,51760,51760 52177,52177,52177 52594,52594,52594 53012,53012,53012 53429,53429,53429 53847,53847,53847 54264,54264,54264 54682,54682,54682 55099,55099,55099 55516,55516,55516 55934,55934,55934 56351,56351,56351 56769,56769,56769 57186,57186,57186 57604,57604,57604 58021,58021,58021 58438,58438,58438 58856,58856,58856 59273,59273,59273 59691,59691,59691 60108,60108,60108 60525,60525,60525 60943,60943,60943 61360,61360,61360 61778,61778,61778 62195,62195,62195 62613,62613,62613 63030,63030,63030 63447,63447,63447 63865,63865,63865 64282,64282,64282 64700,64700,64700 65117,65117,65117 65535,65535,65535 ########## g159.clr 0,0,0 414,414,414 829,829,829 1244,1244,1244 1659,1659,1659 2073,2073,2073 2488,2488,2488 2903,2903,2903 3318,3318,3318 3733,3733,3733 4147,4147,4147 4562,4562,4562 4977,4977,4977 5392,5392,5392 5806,5806,5806 6221,6221,6221 6636,6636,6636 7051,7051,7051 7466,7466,7466 7880,7880,7880 8295,8295,8295 8710,8710,8710 9125,9125,9125 9539,9539,9539 9954,9954,9954 10369,10369,10369 10784,10784,10784 11199,11199,11199 11613,11613,11613 12028,12028,12028 12443,12443,12443 12858,12858,12858 13272,13272,13272 13687,13687,13687 14102,14102,14102 14517,14517,14517 14932,14932,14932 15346,15346,15346 15761,15761,15761 16176,16176,16176 16591,16591,16591 17005,17005,17005 17420,17420,17420 17835,17835,17835 18250,18250,18250 18665,18665,18665 19079,19079,19079 19494,19494,19494 19909,19909,19909 20324,20324,20324 20738,20738,20738 21153,21153,21153 21568,21568,21568 21983,21983,21983 22398,22398,22398 22812,22812,22812 23227,23227,23227 23642,23642,23642 24057,24057,24057 24471,24471,24471 24886,24886,24886 25301,25301,25301 25716,25716,25716 26131,26131,26131 26545,26545,26545 26960,26960,26960 27375,27375,27375 27790,27790,27790 28204,28204,28204 28619,28619,28619 29034,29034,29034 29449,29449,29449 29864,29864,29864 30278,30278,30278 30693,30693,30693 31108,31108,31108 31523,31523,31523 31937,31937,31937 32352,32352,32352 32767,32767,32767 33182,33182,33182 33597,33597,33597 34011,34011,34011 34426,34426,34426 34841,34841,34841 35256,35256,35256 35670,35670,35670 36085,36085,36085 36500,36500,36500 36915,36915,36915 37330,37330,37330 37744,37744,37744 38159,38159,38159 38574,38574,38574 38989,38989,38989 39403,39403,39403 39818,39818,39818 40233,40233,40233 40648,40648,40648 41063,41063,41063 41477,41477,41477 41892,41892,41892 42307,42307,42307 42722,42722,42722 43136,43136,43136 43551,43551,43551 43966,43966,43966 44381,44381,44381 44796,44796,44796 45210,45210,45210 45625,45625,45625 46040,46040,46040 46455,46455,46455 46869,46869,46869 47284,47284,47284 47699,47699,47699 48114,48114,48114 48529,48529,48529 48943,48943,48943 49358,49358,49358 49773,49773,49773 50188,50188,50188 50602,50602,50602 51017,51017,51017 51432,51432,51432 51847,51847,51847 52262,52262,52262 52676,52676,52676 53091,53091,53091 53506,53506,53506 53921,53921,53921 54335,54335,54335 54750,54750,54750 55165,55165,55165 55580,55580,55580 55995,55995,55995 56409,56409,56409 56824,56824,56824 57239,57239,57239 57654,57654,57654 58068,58068,58068 58483,58483,58483 58898,58898,58898 59313,59313,59313 59728,59728,59728 60142,60142,60142 60557,60557,60557 60972,60972,60972 61387,61387,61387 61801,61801,61801 62216,62216,62216 62631,62631,62631 63046,63046,63046 63461,63461,63461 63875,63875,63875 64290,64290,64290 64705,64705,64705 65120,65120,65120 65535,65535,65535 ########## g16.clr 0,0,0 4369,4369,4369 8738,8738,8738 13107,13107,13107 17476,17476,17476 21845,21845,21845 26214,26214,26214 30583,30583,30583 34952,34952,34952 39321,39321,39321 43690,43690,43690 48059,48059,48059 52428,52428,52428 56797,56797,56797 61166,61166,61166 65535,65535,65535 ########## g160.clr 0,0,0 412,412,412 824,824,824 1236,1236,1236 1648,1648,1648 2060,2060,2060 2473,2473,2473 2885,2885,2885 3297,3297,3297 3709,3709,3709 4121,4121,4121 4533,4533,4533 4946,4946,4946 5358,5358,5358 5770,5770,5770 6182,6182,6182 6594,6594,6594 7006,7006,7006 7419,7419,7419 7831,7831,7831 8243,8243,8243 8655,8655,8655 9067,9067,9067 9479,9479,9479 9892,9892,9892 10304,10304,10304 10716,10716,10716 11128,11128,11128 11540,11540,11540 11952,11952,11952 12365,12365,12365 12777,12777,12777 13189,13189,13189 13601,13601,13601 14013,14013,14013 14425,14425,14425 14838,14838,14838 15250,15250,15250 15662,15662,15662 16074,16074,16074 16486,16486,16486 16898,16898,16898 17311,17311,17311 17723,17723,17723 18135,18135,18135 18547,18547,18547 18959,18959,18959 19371,19371,19371 19784,19784,19784 20196,20196,20196 20608,20608,20608 21020,21020,21020 21432,21432,21432 21845,21845,21845 22257,22257,22257 22669,22669,22669 23081,23081,23081 23493,23493,23493 23905,23905,23905 24318,24318,24318 24730,24730,24730 25142,25142,25142 25554,25554,25554 25966,25966,25966 26378,26378,26378 26791,26791,26791 27203,27203,27203 27615,27615,27615 28027,28027,28027 28439,28439,28439 28851,28851,28851 29264,29264,29264 29676,29676,29676 30088,30088,30088 30500,30500,30500 30912,30912,30912 31324,31324,31324 31737,31737,31737 32149,32149,32149 32561,32561,32561 32973,32973,32973 33385,33385,33385 33797,33797,33797 34210,34210,34210 34622,34622,34622 35034,35034,35034 35446,35446,35446 35858,35858,35858 36270,36270,36270 36683,36683,36683 37095,37095,37095 37507,37507,37507 37919,37919,37919 38331,38331,38331 38743,38743,38743 39156,39156,39156 39568,39568,39568 39980,39980,39980 40392,40392,40392 40804,40804,40804 41216,41216,41216 41629,41629,41629 42041,42041,42041 42453,42453,42453 42865,42865,42865 43277,43277,43277 43690,43690,43690 44102,44102,44102 44514,44514,44514 44926,44926,44926 45338,45338,45338 45750,45750,45750 46163,46163,46163 46575,46575,46575 46987,46987,46987 47399,47399,47399 47811,47811,47811 48223,48223,48223 48636,48636,48636 49048,49048,49048 49460,49460,49460 49872,49872,49872 50284,50284,50284 50696,50696,50696 51109,51109,51109 51521,51521,51521 51933,51933,51933 52345,52345,52345 52757,52757,52757 53169,53169,53169 53582,53582,53582 53994,53994,53994 54406,54406,54406 54818,54818,54818 55230,55230,55230 55642,55642,55642 56055,56055,56055 56467,56467,56467 56879,56879,56879 57291,57291,57291 57703,57703,57703 58115,58115,58115 58528,58528,58528 58940,58940,58940 59352,59352,59352 59764,59764,59764 60176,60176,60176 60588,60588,60588 61001,61001,61001 61413,61413,61413 61825,61825,61825 62237,62237,62237 62649,62649,62649 63061,63061,63061 63474,63474,63474 63886,63886,63886 64298,64298,64298 64710,64710,64710 65122,65122,65122 65535,65535,65535 ########## g161.clr 0,0,0 409,409,409 819,819,819 1228,1228,1228 1638,1638,1638 2047,2047,2047 2457,2457,2457 2867,2867,2867 3276,3276,3276 3686,3686,3686 4095,4095,4095 4505,4505,4505 4915,4915,4915 5324,5324,5324 5734,5734,5734 6143,6143,6143 6553,6553,6553 6963,6963,6963 7372,7372,7372 7782,7782,7782 8191,8191,8191 8601,8601,8601 9011,9011,9011 9420,9420,9420 9830,9830,9830 10239,10239,10239 10649,10649,10649 11059,11059,11059 11468,11468,11468 11878,11878,11878 12287,12287,12287 12697,12697,12697 13107,13107,13107 13516,13516,13516 13926,13926,13926 14335,14335,14335 14745,14745,14745 15154,15154,15154 15564,15564,15564 15974,15974,15974 16383,16383,16383 16793,16793,16793 17202,17202,17202 17612,17612,17612 18022,18022,18022 18431,18431,18431 18841,18841,18841 19250,19250,19250 19660,19660,19660 20070,20070,20070 20479,20479,20479 20889,20889,20889 21298,21298,21298 21708,21708,21708 22118,22118,22118 22527,22527,22527 22937,22937,22937 23346,23346,23346 23756,23756,23756 24166,24166,24166 24575,24575,24575 24985,24985,24985 25394,25394,25394 25804,25804,25804 26214,26214,26214 26623,26623,26623 27033,27033,27033 27442,27442,27442 27852,27852,27852 28261,28261,28261 28671,28671,28671 29081,29081,29081 29490,29490,29490 29900,29900,29900 30309,30309,30309 30719,30719,30719 31129,31129,31129 31538,31538,31538 31948,31948,31948 32357,32357,32357 32767,32767,32767 33177,33177,33177 33586,33586,33586 33996,33996,33996 34405,34405,34405 34815,34815,34815 35225,35225,35225 35634,35634,35634 36044,36044,36044 36453,36453,36453 36863,36863,36863 37273,37273,37273 37682,37682,37682 38092,38092,38092 38501,38501,38501 38911,38911,38911 39321,39321,39321 39730,39730,39730 40140,40140,40140 40549,40549,40549 40959,40959,40959 41368,41368,41368 41778,41778,41778 42188,42188,42188 42597,42597,42597 43007,43007,43007 43416,43416,43416 43826,43826,43826 44236,44236,44236 44645,44645,44645 45055,45055,45055 45464,45464,45464 45874,45874,45874 46284,46284,46284 46693,46693,46693 47103,47103,47103 47512,47512,47512 47922,47922,47922 48332,48332,48332 48741,48741,48741 49151,49151,49151 49560,49560,49560 49970,49970,49970 50380,50380,50380 50789,50789,50789 51199,51199,51199 51608,51608,51608 52018,52018,52018 52428,52428,52428 52837,52837,52837 53247,53247,53247 53656,53656,53656 54066,54066,54066 54475,54475,54475 54885,54885,54885 55295,55295,55295 55704,55704,55704 56114,56114,56114 56523,56523,56523 56933,56933,56933 57343,57343,57343 57752,57752,57752 58162,58162,58162 58571,58571,58571 58981,58981,58981 59391,59391,59391 59800,59800,59800 60210,60210,60210 60619,60619,60619 61029,61029,61029 61439,61439,61439 61848,61848,61848 62258,62258,62258 62667,62667,62667 63077,63077,63077 63487,63487,63487 63896,63896,63896 64306,64306,64306 64715,64715,64715 65125,65125,65125 65535,65535,65535 ########## g162.clr 0,0,0 407,407,407 814,814,814 1221,1221,1221 1628,1628,1628 2035,2035,2035 2442,2442,2442 2849,2849,2849 3256,3256,3256 3663,3663,3663 4070,4070,4070 4477,4477,4477 4884,4884,4884 5291,5291,5291 5698,5698,5698 6105,6105,6105 6512,6512,6512 6919,6919,6919 7326,7326,7326 7733,7733,7733 8140,8140,8140 8548,8548,8548 8955,8955,8955 9362,9362,9362 9769,9769,9769 10176,10176,10176 10583,10583,10583 10990,10990,10990 11397,11397,11397 11804,11804,11804 12211,12211,12211 12618,12618,12618 13025,13025,13025 13432,13432,13432 13839,13839,13839 14246,14246,14246 14653,14653,14653 15060,15060,15060 15467,15467,15467 15874,15874,15874 16281,16281,16281 16689,16689,16689 17096,17096,17096 17503,17503,17503 17910,17910,17910 18317,18317,18317 18724,18724,18724 19131,19131,19131 19538,19538,19538 19945,19945,19945 20352,20352,20352 20759,20759,20759 21166,21166,21166 21573,21573,21573 21980,21980,21980 22387,22387,22387 22794,22794,22794 23201,23201,23201 23608,23608,23608 24015,24015,24015 24422,24422,24422 24830,24830,24830 25237,25237,25237 25644,25644,25644 26051,26051,26051 26458,26458,26458 26865,26865,26865 27272,27272,27272 27679,27679,27679 28086,28086,28086 28493,28493,28493 28900,28900,28900 29307,29307,29307 29714,29714,29714 30121,30121,30121 30528,30528,30528 30935,30935,30935 31342,31342,31342 31749,31749,31749 32156,32156,32156 32563,32563,32563 32971,32971,32971 33378,33378,33378 33785,33785,33785 34192,34192,34192 34599,34599,34599 35006,35006,35006 35413,35413,35413 35820,35820,35820 36227,36227,36227 36634,36634,36634 37041,37041,37041 37448,37448,37448 37855,37855,37855 38262,38262,38262 38669,38669,38669 39076,39076,39076 39483,39483,39483 39890,39890,39890 40297,40297,40297 40704,40704,40704 41112,41112,41112 41519,41519,41519 41926,41926,41926 42333,42333,42333 42740,42740,42740 43147,43147,43147 43554,43554,43554 43961,43961,43961 44368,44368,44368 44775,44775,44775 45182,45182,45182 45589,45589,45589 45996,45996,45996 46403,46403,46403 46810,46810,46810 47217,47217,47217 47624,47624,47624 48031,48031,48031 48438,48438,48438 48845,48845,48845 49253,49253,49253 49660,49660,49660 50067,50067,50067 50474,50474,50474 50881,50881,50881 51288,51288,51288 51695,51695,51695 52102,52102,52102 52509,52509,52509 52916,52916,52916 53323,53323,53323 53730,53730,53730 54137,54137,54137 54544,54544,54544 54951,54951,54951 55358,55358,55358 55765,55765,55765 56172,56172,56172 56579,56579,56579 56986,56986,56986 57394,57394,57394 57801,57801,57801 58208,58208,58208 58615,58615,58615 59022,59022,59022 59429,59429,59429 59836,59836,59836 60243,60243,60243 60650,60650,60650 61057,61057,61057 61464,61464,61464 61871,61871,61871 62278,62278,62278 62685,62685,62685 63092,63092,63092 63499,63499,63499 63906,63906,63906 64313,64313,64313 64720,64720,64720 65127,65127,65127 65534,65534,65534 ########## g163.clr 0,0,0 404,404,404 809,809,809 1213,1213,1213 1618,1618,1618 2022,2022,2022 2427,2427,2427 2831,2831,2831 3236,3236,3236 3640,3640,3640 4045,4045,4045 4449,4449,4449 4854,4854,4854 5258,5258,5258 5663,5663,5663 6068,6068,6068 6472,6472,6472 6877,6877,6877 7281,7281,7281 7686,7686,7686 8090,8090,8090 8495,8495,8495 8899,8899,8899 9304,9304,9304 9708,9708,9708 10113,10113,10113 10517,10517,10517 10922,10922,10922 11327,11327,11327 11731,11731,11731 12136,12136,12136 12540,12540,12540 12945,12945,12945 13349,13349,13349 13754,13754,13754 14158,14158,14158 14563,14563,14563 14967,14967,14967 15372,15372,15372 15776,15776,15776 16181,16181,16181 16586,16586,16586 16990,16990,16990 17395,17395,17395 17799,17799,17799 18204,18204,18204 18608,18608,18608 19013,19013,19013 19417,19417,19417 19822,19822,19822 20226,20226,20226 20631,20631,20631 21035,21035,21035 21440,21440,21440 21845,21845,21845 22249,22249,22249 22654,22654,22654 23058,23058,23058 23463,23463,23463 23867,23867,23867 24272,24272,24272 24676,24676,24676 25081,25081,25081 25485,25485,25485 25890,25890,25890 26294,26294,26294 26699,26699,26699 27103,27103,27103 27508,27508,27508 27913,27913,27913 28317,28317,28317 28722,28722,28722 29126,29126,29126 29531,29531,29531 29935,29935,29935 30340,30340,30340 30744,30744,30744 31149,31149,31149 31553,31553,31553 31958,31958,31958 32362,32362,32362 32767,32767,32767 33172,33172,33172 33576,33576,33576 33981,33981,33981 34385,34385,34385 34790,34790,34790 35194,35194,35194 35599,35599,35599 36003,36003,36003 36408,36408,36408 36812,36812,36812 37217,37217,37217 37621,37621,37621 38026,38026,38026 38431,38431,38431 38835,38835,38835 39240,39240,39240 39644,39644,39644 40049,40049,40049 40453,40453,40453 40858,40858,40858 41262,41262,41262 41667,41667,41667 42071,42071,42071 42476,42476,42476 42880,42880,42880 43285,43285,43285 43690,43690,43690 44094,44094,44094 44499,44499,44499 44903,44903,44903 45308,45308,45308 45712,45712,45712 46117,46117,46117 46521,46521,46521 46926,46926,46926 47330,47330,47330 47735,47735,47735 48139,48139,48139 48544,48544,48544 48948,48948,48948 49353,49353,49353 49758,49758,49758 50162,50162,50162 50567,50567,50567 50971,50971,50971 51376,51376,51376 51780,51780,51780 52185,52185,52185 52589,52589,52589 52994,52994,52994 53398,53398,53398 53803,53803,53803 54207,54207,54207 54612,54612,54612 55017,55017,55017 55421,55421,55421 55826,55826,55826 56230,56230,56230 56635,56635,56635 57039,57039,57039 57444,57444,57444 57848,57848,57848 58253,58253,58253 58657,58657,58657 59062,59062,59062 59466,59466,59466 59871,59871,59871 60276,60276,60276 60680,60680,60680 61085,61085,61085 61489,61489,61489 61894,61894,61894 62298,62298,62298 62703,62703,62703 63107,63107,63107 63512,63512,63512 63916,63916,63916 64321,64321,64321 64725,64725,64725 65130,65130,65130 65534,65534,65534 ########## g164.clr 0,0,0 402,402,402 804,804,804 1206,1206,1206 1608,1608,1608 2010,2010,2010 2412,2412,2412 2814,2814,2814 3216,3216,3216 3618,3618,3618 4020,4020,4020 4422,4422,4422 4824,4824,4824 5226,5226,5226 5628,5628,5628 6030,6030,6030 6432,6432,6432 6834,6834,6834 7236,7236,7236 7639,7639,7639 8041,8041,8041 8443,8443,8443 8845,8845,8845 9247,9247,9247 9649,9649,9649 10051,10051,10051 10453,10453,10453 10855,10855,10855 11257,11257,11257 11659,11659,11659 12061,12061,12061 12463,12463,12463 12865,12865,12865 13267,13267,13267 13669,13669,13669 14071,14071,14071 14473,14473,14473 14876,14876,14876 15278,15278,15278 15680,15680,15680 16082,16082,16082 16484,16484,16484 16886,16886,16886 17288,17288,17288 17690,17690,17690 18092,18092,18092 18494,18494,18494 18896,18896,18896 19298,19298,19298 19700,19700,19700 20102,20102,20102 20504,20504,20504 20906,20906,20906 21308,21308,21308 21710,21710,21710 22113,22113,22113 22515,22515,22515 22917,22917,22917 23319,23319,23319 23721,23721,23721 24123,24123,24123 24525,24525,24525 24927,24927,24927 25329,25329,25329 25731,25731,25731 26133,26133,26133 26535,26535,26535 26937,26937,26937 27339,27339,27339 27741,27741,27741 28143,28143,28143 28545,28545,28545 28947,28947,28947 29350,29350,29350 29752,29752,29752 30154,30154,30154 30556,30556,30556 30958,30958,30958 31360,31360,31360 31762,31762,31762 32164,32164,32164 32566,32566,32566 32968,32968,32968 33370,33370,33370 33772,33772,33772 34174,34174,34174 34576,34576,34576 34978,34978,34978 35380,35380,35380 35782,35782,35782 36184,36184,36184 36587,36587,36587 36989,36989,36989 37391,37391,37391 37793,37793,37793 38195,38195,38195 38597,38597,38597 38999,38999,38999 39401,39401,39401 39803,39803,39803 40205,40205,40205 40607,40607,40607 41009,41009,41009 41411,41411,41411 41813,41813,41813 42215,42215,42215 42617,42617,42617 43019,43019,43019 43421,43421,43421 43824,43824,43824 44226,44226,44226 44628,44628,44628 45030,45030,45030 45432,45432,45432 45834,45834,45834 46236,46236,46236 46638,46638,46638 47040,47040,47040 47442,47442,47442 47844,47844,47844 48246,48246,48246 48648,48648,48648 49050,49050,49050 49452,49452,49452 49854,49854,49854 50256,50256,50256 50658,50658,50658 51061,51061,51061 51463,51463,51463 51865,51865,51865 52267,52267,52267 52669,52669,52669 53071,53071,53071 53473,53473,53473 53875,53875,53875 54277,54277,54277 54679,54679,54679 55081,55081,55081 55483,55483,55483 55885,55885,55885 56287,56287,56287 56689,56689,56689 57091,57091,57091 57493,57493,57493 57895,57895,57895 58298,58298,58298 58700,58700,58700 59102,59102,59102 59504,59504,59504 59906,59906,59906 60308,60308,60308 60710,60710,60710 61112,61112,61112 61514,61514,61514 61916,61916,61916 62318,62318,62318 62720,62720,62720 63122,63122,63122 63524,63524,63524 63926,63926,63926 64328,64328,64328 64730,64730,64730 65132,65132,65132 65535,65535,65535 ########## g165.clr 0,0,0 399,399,399 799,799,799 1198,1198,1198 1598,1598,1598 1998,1998,1998 2397,2397,2397 2797,2797,2797 3196,3196,3196 3596,3596,3596 3996,3996,3996 4395,4395,4395 4795,4795,4795 5194,5194,5194 5594,5594,5594 5994,5994,5994 6393,6393,6393 6793,6793,6793 7192,7192,7192 7592,7592,7592 7992,7992,7992 8391,8391,8391 8791,8791,8791 9190,9190,9190 9590,9590,9590 9990,9990,9990 10389,10389,10389 10789,10789,10789 11188,11188,11188 11588,11588,11588 11988,11988,11988 12387,12387,12387 12787,12787,12787 13186,13186,13186 13586,13586,13586 13986,13986,13986 14385,14385,14385 14785,14785,14785 15184,15184,15184 15584,15584,15584 15984,15984,15984 16383,16383,16383 16783,16783,16783 17182,17182,17182 17582,17582,17582 17982,17982,17982 18381,18381,18381 18781,18781,18781 19180,19180,19180 19580,19580,19580 19980,19980,19980 20379,20379,20379 20779,20779,20779 21178,21178,21178 21578,21578,21578 21978,21978,21978 22377,22377,22377 22777,22777,22777 23177,23177,23177 23576,23576,23576 23976,23976,23976 24375,24375,24375 24775,24775,24775 25175,25175,25175 25574,25574,25574 25974,25974,25974 26373,26373,26373 26773,26773,26773 27173,27173,27173 27572,27572,27572 27972,27972,27972 28371,28371,28371 28771,28771,28771 29171,29171,29171 29570,29570,29570 29970,29970,29970 30369,30369,30369 30769,30769,30769 31169,31169,31169 31568,31568,31568 31968,31968,31968 32367,32367,32367 32767,32767,32767 33167,33167,33167 33566,33566,33566 33966,33966,33966 34365,34365,34365 34765,34765,34765 35165,35165,35165 35564,35564,35564 35964,35964,35964 36363,36363,36363 36763,36763,36763 37163,37163,37163 37562,37562,37562 37962,37962,37962 38361,38361,38361 38761,38761,38761 39161,39161,39161 39560,39560,39560 39960,39960,39960 40359,40359,40359 40759,40759,40759 41159,41159,41159 41558,41558,41558 41958,41958,41958 42357,42357,42357 42757,42757,42757 43157,43157,43157 43556,43556,43556 43956,43956,43956 44356,44356,44356 44755,44755,44755 45155,45155,45155 45554,45554,45554 45954,45954,45954 46354,46354,46354 46753,46753,46753 47153,47153,47153 47552,47552,47552 47952,47952,47952 48352,48352,48352 48751,48751,48751 49151,49151,49151 49550,49550,49550 49950,49950,49950 50350,50350,50350 50749,50749,50749 51149,51149,51149 51548,51548,51548 51948,51948,51948 52348,52348,52348 52747,52747,52747 53147,53147,53147 53546,53546,53546 53946,53946,53946 54346,54346,54346 54745,54745,54745 55145,55145,55145 55544,55544,55544 55944,55944,55944 56344,56344,56344 56743,56743,56743 57143,57143,57143 57542,57542,57542 57942,57942,57942 58342,58342,58342 58741,58741,58741 59141,59141,59141 59540,59540,59540 59940,59940,59940 60340,60340,60340 60739,60739,60739 61139,61139,61139 61538,61538,61538 61938,61938,61938 62338,62338,62338 62737,62737,62737 63137,63137,63137 63536,63536,63536 63936,63936,63936 64336,64336,64336 64735,64735,64735 65135,65135,65135 65535,65535,65535 ########## g166.clr 0,0,0 397,397,397 794,794,794 1191,1191,1191 1588,1588,1588 1985,1985,1985 2383,2383,2383 2780,2780,2780 3177,3177,3177 3574,3574,3574 3971,3971,3971 4369,4369,4369 4766,4766,4766 5163,5163,5163 5560,5560,5560 5957,5957,5957 6354,6354,6354 6752,6752,6752 7149,7149,7149 7546,7546,7546 7943,7943,7943 8340,8340,8340 8738,8738,8738 9135,9135,9135 9532,9532,9532 9929,9929,9929 10326,10326,10326 10723,10723,10723 11121,11121,11121 11518,11518,11518 11915,11915,11915 12312,12312,12312 12709,12709,12709 13107,13107,13107 13504,13504,13504 13901,13901,13901 14298,14298,14298 14695,14695,14695 15092,15092,15092 15490,15490,15490 15887,15887,15887 16284,16284,16284 16681,16681,16681 17078,17078,17078 17476,17476,17476 17873,17873,17873 18270,18270,18270 18667,18667,18667 19064,19064,19064 19461,19461,19461 19859,19859,19859 20256,20256,20256 20653,20653,20653 21050,21050,21050 21447,21447,21447 21845,21845,21845 22242,22242,22242 22639,22639,22639 23036,23036,23036 23433,23433,23433 23830,23830,23830 24228,24228,24228 24625,24625,24625 25022,25022,25022 25419,25419,25419 25816,25816,25816 26214,26214,26214 26611,26611,26611 27008,27008,27008 27405,27405,27405 27802,27802,27802 28199,28199,28199 28597,28597,28597 28994,28994,28994 29391,29391,29391 29788,29788,29788 30185,30185,30185 30583,30583,30583 30980,30980,30980 31377,31377,31377 31774,31774,31774 32171,32171,32171 32568,32568,32568 32966,32966,32966 33363,33363,33363 33760,33760,33760 34157,34157,34157 34554,34554,34554 34952,34952,34952 35349,35349,35349 35746,35746,35746 36143,36143,36143 36540,36540,36540 36937,36937,36937 37335,37335,37335 37732,37732,37732 38129,38129,38129 38526,38526,38526 38923,38923,38923 39321,39321,39321 39718,39718,39718 40115,40115,40115 40512,40512,40512 40909,40909,40909 41306,41306,41306 41704,41704,41704 42101,42101,42101 42498,42498,42498 42895,42895,42895 43292,43292,43292 43690,43690,43690 44087,44087,44087 44484,44484,44484 44881,44881,44881 45278,45278,45278 45675,45675,45675 46073,46073,46073 46470,46470,46470 46867,46867,46867 47264,47264,47264 47661,47661,47661 48059,48059,48059 48456,48456,48456 48853,48853,48853 49250,49250,49250 49647,49647,49647 50044,50044,50044 50442,50442,50442 50839,50839,50839 51236,51236,51236 51633,51633,51633 52030,52030,52030 52428,52428,52428 52825,52825,52825 53222,53222,53222 53619,53619,53619 54016,54016,54016 54413,54413,54413 54811,54811,54811 55208,55208,55208 55605,55605,55605 56002,56002,56002 56399,56399,56399 56797,56797,56797 57194,57194,57194 57591,57591,57591 57988,57988,57988 58385,58385,58385 58782,58782,58782 59180,59180,59180 59577,59577,59577 59974,59974,59974 60371,60371,60371 60768,60768,60768 61166,61166,61166 61563,61563,61563 61960,61960,61960 62357,62357,62357 62754,62754,62754 63151,63151,63151 63549,63549,63549 63946,63946,63946 64343,64343,64343 64740,64740,64740 65137,65137,65137 65535,65535,65535 ########## g167.clr 0,0,0 394,394,394 789,789,789 1184,1184,1184 1579,1579,1579 1973,1973,1973 2368,2368,2368 2763,2763,2763 3158,3158,3158 3553,3553,3553 3947,3947,3947 4342,4342,4342 4737,4737,4737 5132,5132,5132 5527,5527,5527 5921,5921,5921 6316,6316,6316 6711,6711,6711 7106,7106,7106 7500,7500,7500 7895,7895,7895 8290,8290,8290 8685,8685,8685 9080,9080,9080 9474,9474,9474 9869,9869,9869 10264,10264,10264 10659,10659,10659 11054,11054,11054 11448,11448,11448 11843,11843,11843 12238,12238,12238 12633,12633,12633 13028,13028,13028 13422,13422,13422 13817,13817,13817 14212,14212,14212 14607,14607,14607 15001,15001,15001 15396,15396,15396 15791,15791,15791 16186,16186,16186 16581,16581,16581 16975,16975,16975 17370,17370,17370 17765,17765,17765 18160,18160,18160 18555,18555,18555 18949,18949,18949 19344,19344,19344 19739,19739,19739 20134,20134,20134 20529,20529,20529 20923,20923,20923 21318,21318,21318 21713,21713,21713 22108,22108,22108 22502,22502,22502 22897,22897,22897 23292,23292,23292 23687,23687,23687 24082,24082,24082 24476,24476,24476 24871,24871,24871 25266,25266,25266 25661,25661,25661 26056,26056,26056 26450,26450,26450 26845,26845,26845 27240,27240,27240 27635,27635,27635 28030,28030,28030 28424,28424,28424 28819,28819,28819 29214,29214,29214 29609,29609,29609 30003,30003,30003 30398,30398,30398 30793,30793,30793 31188,31188,31188 31583,31583,31583 31977,31977,31977 32372,32372,32372 32767,32767,32767 33162,33162,33162 33557,33557,33557 33951,33951,33951 34346,34346,34346 34741,34741,34741 35136,35136,35136 35531,35531,35531 35925,35925,35925 36320,36320,36320 36715,36715,36715 37110,37110,37110 37504,37504,37504 37899,37899,37899 38294,38294,38294 38689,38689,38689 39084,39084,39084 39478,39478,39478 39873,39873,39873 40268,40268,40268 40663,40663,40663 41058,41058,41058 41452,41452,41452 41847,41847,41847 42242,42242,42242 42637,42637,42637 43032,43032,43032 43426,43426,43426 43821,43821,43821 44216,44216,44216 44611,44611,44611 45005,45005,45005 45400,45400,45400 45795,45795,45795 46190,46190,46190 46585,46585,46585 46979,46979,46979 47374,47374,47374 47769,47769,47769 48164,48164,48164 48559,48559,48559 48953,48953,48953 49348,49348,49348 49743,49743,49743 50138,50138,50138 50533,50533,50533 50927,50927,50927 51322,51322,51322 51717,51717,51717 52112,52112,52112 52506,52506,52506 52901,52901,52901 53296,53296,53296 53691,53691,53691 54086,54086,54086 54480,54480,54480 54875,54875,54875 55270,55270,55270 55665,55665,55665 56060,56060,56060 56454,56454,56454 56849,56849,56849 57244,57244,57244 57639,57639,57639 58034,58034,58034 58428,58428,58428 58823,58823,58823 59218,59218,59218 59613,59613,59613 60007,60007,60007 60402,60402,60402 60797,60797,60797 61192,61192,61192 61587,61587,61587 61981,61981,61981 62376,62376,62376 62771,62771,62771 63166,63166,63166 63561,63561,63561 63955,63955,63955 64350,64350,64350 64745,64745,64745 65140,65140,65140 65535,65535,65535 ########## g168.clr 0,0,0 392,392,392 784,784,784 1177,1177,1177 1569,1569,1569 1962,1962,1962 2354,2354,2354 2746,2746,2746 3139,3139,3139 3531,3531,3531 3924,3924,3924 4316,4316,4316 4709,4709,4709 5101,5101,5101 5493,5493,5493 5886,5886,5886 6278,6278,6278 6671,6671,6671 7063,7063,7063 7456,7456,7456 7848,7848,7848 8240,8240,8240 8633,8633,8633 9025,9025,9025 9418,9418,9418 9810,9810,9810 10203,10203,10203 10595,10595,10595 10987,10987,10987 11380,11380,11380 11772,11772,11772 12165,12165,12165 12557,12557,12557 12950,12950,12950 13342,13342,13342 13734,13734,13734 14127,14127,14127 14519,14519,14519 14912,14912,14912 15304,15304,15304 15697,15697,15697 16089,16089,16089 16481,16481,16481 16874,16874,16874 17266,17266,17266 17659,17659,17659 18051,18051,18051 18443,18443,18443 18836,18836,18836 19228,19228,19228 19621,19621,19621 20013,20013,20013 20406,20406,20406 20798,20798,20798 21190,21190,21190 21583,21583,21583 21975,21975,21975 22368,22368,22368 22760,22760,22760 23153,23153,23153 23545,23545,23545 23937,23937,23937 24330,24330,24330 24722,24722,24722 25115,25115,25115 25507,25507,25507 25900,25900,25900 26292,26292,26292 26684,26684,26684 27077,27077,27077 27469,27469,27469 27862,27862,27862 28254,28254,28254 28647,28647,28647 29039,29039,29039 29431,29431,29431 29824,29824,29824 30216,30216,30216 30609,30609,30609 31001,31001,31001 31394,31394,31394 31786,31786,31786 32178,32178,32178 32571,32571,32571 32963,32963,32963 33356,33356,33356 33748,33748,33748 34140,34140,34140 34533,34533,34533 34925,34925,34925 35318,35318,35318 35710,35710,35710 36103,36103,36103 36495,36495,36495 36887,36887,36887 37280,37280,37280 37672,37672,37672 38065,38065,38065 38457,38457,38457 38850,38850,38850 39242,39242,39242 39634,39634,39634 40027,40027,40027 40419,40419,40419 40812,40812,40812 41204,41204,41204 41597,41597,41597 41989,41989,41989 42381,42381,42381 42774,42774,42774 43166,43166,43166 43559,43559,43559 43951,43951,43951 44344,44344,44344 44736,44736,44736 45128,45128,45128 45521,45521,45521 45913,45913,45913 46306,46306,46306 46698,46698,46698 47091,47091,47091 47483,47483,47483 47875,47875,47875 48268,48268,48268 48660,48660,48660 49053,49053,49053 49445,49445,49445 49837,49837,49837 50230,50230,50230 50622,50622,50622 51015,51015,51015 51407,51407,51407 51800,51800,51800 52192,52192,52192 52584,52584,52584 52977,52977,52977 53369,53369,53369 53762,53762,53762 54154,54154,54154 54547,54547,54547 54939,54939,54939 55331,55331,55331 55724,55724,55724 56116,56116,56116 56509,56509,56509 56901,56901,56901 57294,57294,57294 57686,57686,57686 58078,58078,58078 58471,58471,58471 58863,58863,58863 59256,59256,59256 59648,59648,59648 60041,60041,60041 60433,60433,60433 60825,60825,60825 61218,61218,61218 61610,61610,61610 62003,62003,62003 62395,62395,62395 62788,62788,62788 63180,63180,63180 63572,63572,63572 63965,63965,63965 64357,64357,64357 64750,64750,64750 65142,65142,65142 65535,65535,65535 ########## g169.clr 0,0,0 390,390,390 780,780,780 1170,1170,1170 1560,1560,1560 1950,1950,1950 2340,2340,2340 2730,2730,2730 3120,3120,3120 3510,3510,3510 3900,3900,3900 4290,4290,4290 4681,4681,4681 5071,5071,5071 5461,5461,5461 5851,5851,5851 6241,6241,6241 6631,6631,6631 7021,7021,7021 7411,7411,7411 7801,7801,7801 8191,8191,8191 8581,8581,8581 8972,8972,8972 9362,9362,9362 9752,9752,9752 10142,10142,10142 10532,10532,10532 10922,10922,10922 11312,11312,11312 11702,11702,11702 12092,12092,12092 12482,12482,12482 12872,12872,12872 13263,13263,13263 13653,13653,13653 14043,14043,14043 14433,14433,14433 14823,14823,14823 15213,15213,15213 15603,15603,15603 15993,15993,15993 16383,16383,16383 16773,16773,16773 17163,17163,17163 17554,17554,17554 17944,17944,17944 18334,18334,18334 18724,18724,18724 19114,19114,19114 19504,19504,19504 19894,19894,19894 20284,20284,20284 20674,20674,20674 21064,21064,21064 21454,21454,21454 21844,21844,21844 22235,22235,22235 22625,22625,22625 23015,23015,23015 23405,23405,23405 23795,23795,23795 24185,24185,24185 24575,24575,24575 24965,24965,24965 25355,25355,25355 25745,25745,25745 26135,26135,26135 26526,26526,26526 26916,26916,26916 27306,27306,27306 27696,27696,27696 28086,28086,28086 28476,28476,28476 28866,28866,28866 29256,29256,29256 29646,29646,29646 30036,30036,30036 30426,30426,30426 30817,30817,30817 31207,31207,31207 31597,31597,31597 31987,31987,31987 32377,32377,32377 32767,32767,32767 33157,33157,33157 33547,33547,33547 33937,33937,33937 34327,34327,34327 34717,34717,34717 35108,35108,35108 35498,35498,35498 35888,35888,35888 36278,36278,36278 36668,36668,36668 37058,37058,37058 37448,37448,37448 37838,37838,37838 38228,38228,38228 38618,38618,38618 39008,39008,39008 39399,39399,39399 39789,39789,39789 40179,40179,40179 40569,40569,40569 40959,40959,40959 41349,41349,41349 41739,41739,41739 42129,42129,42129 42519,42519,42519 42909,42909,42909 43299,43299,43299 43689,43689,43689 44080,44080,44080 44470,44470,44470 44860,44860,44860 45250,45250,45250 45640,45640,45640 46030,46030,46030 46420,46420,46420 46810,46810,46810 47200,47200,47200 47590,47590,47590 47980,47980,47980 48371,48371,48371 48761,48761,48761 49151,49151,49151 49541,49541,49541 49931,49931,49931 50321,50321,50321 50711,50711,50711 51101,51101,51101 51491,51491,51491 51881,51881,51881 52271,52271,52271 52662,52662,52662 53052,53052,53052 53442,53442,53442 53832,53832,53832 54222,54222,54222 54612,54612,54612 55002,55002,55002 55392,55392,55392 55782,55782,55782 56172,56172,56172 56562,56562,56562 56953,56953,56953 57343,57343,57343 57733,57733,57733 58123,58123,58123 58513,58513,58513 58903,58903,58903 59293,59293,59293 59683,59683,59683 60073,60073,60073 60463,60463,60463 60853,60853,60853 61244,61244,61244 61634,61634,61634 62024,62024,62024 62414,62414,62414 62804,62804,62804 63194,63194,63194 63584,63584,63584 63974,63974,63974 64364,64364,64364 64754,64754,64754 65144,65144,65144 65534,65534,65534 ########## g17.clr 0,0,0 4095,4095,4095 8191,8191,8191 12287,12287,12287 16383,16383,16383 20479,20479,20479 24575,24575,24575 28671,28671,28671 32767,32767,32767 36863,36863,36863 40959,40959,40959 45055,45055,45055 49151,49151,49151 53247,53247,53247 57343,57343,57343 61439,61439,61439 65535,65535,65535 ########## g170.clr 0,0,0 387,387,387 775,775,775 1163,1163,1163 1551,1551,1551 1938,1938,1938 2326,2326,2326 2714,2714,2714 3102,3102,3102 3490,3490,3490 3877,3877,3877 4265,4265,4265 4653,4653,4653 5041,5041,5041 5428,5428,5428 5816,5816,5816 6204,6204,6204 6592,6592,6592 6980,6980,6980 7367,7367,7367 7755,7755,7755 8143,8143,8143 8531,8531,8531 8918,8918,8918 9306,9306,9306 9694,9694,9694 10082,10082,10082 10470,10470,10470 10857,10857,10857 11245,11245,11245 11633,11633,11633 12021,12021,12021 12408,12408,12408 12796,12796,12796 13184,13184,13184 13572,13572,13572 13960,13960,13960 14347,14347,14347 14735,14735,14735 15123,15123,15123 15511,15511,15511 15899,15899,15899 16286,16286,16286 16674,16674,16674 17062,17062,17062 17450,17450,17450 17837,17837,17837 18225,18225,18225 18613,18613,18613 19001,19001,19001 19389,19389,19389 19776,19776,19776 20164,20164,20164 20552,20552,20552 20940,20940,20940 21327,21327,21327 21715,21715,21715 22103,22103,22103 22491,22491,22491 22879,22879,22879 23266,23266,23266 23654,23654,23654 24042,24042,24042 24430,24430,24430 24817,24817,24817 25205,25205,25205 25593,25593,25593 25981,25981,25981 26369,26369,26369 26756,26756,26756 27144,27144,27144 27532,27532,27532 27920,27920,27920 28308,28308,28308 28695,28695,28695 29083,29083,29083 29471,29471,29471 29859,29859,29859 30246,30246,30246 30634,30634,30634 31022,31022,31022 31410,31410,31410 31798,31798,31798 32185,32185,32185 32573,32573,32573 32961,32961,32961 33349,33349,33349 33736,33736,33736 34124,34124,34124 34512,34512,34512 34900,34900,34900 35288,35288,35288 35675,35675,35675 36063,36063,36063 36451,36451,36451 36839,36839,36839 37226,37226,37226 37614,37614,37614 38002,38002,38002 38390,38390,38390 38778,38778,38778 39165,39165,39165 39553,39553,39553 39941,39941,39941 40329,40329,40329 40717,40717,40717 41104,41104,41104 41492,41492,41492 41880,41880,41880 42268,42268,42268 42655,42655,42655 43043,43043,43043 43431,43431,43431 43819,43819,43819 44207,44207,44207 44594,44594,44594 44982,44982,44982 45370,45370,45370 45758,45758,45758 46145,46145,46145 46533,46533,46533 46921,46921,46921 47309,47309,47309 47697,47697,47697 48084,48084,48084 48472,48472,48472 48860,48860,48860 49248,49248,49248 49635,49635,49635 50023,50023,50023 50411,50411,50411 50799,50799,50799 51187,51187,51187 51574,51574,51574 51962,51962,51962 52350,52350,52350 52738,52738,52738 53126,53126,53126 53513,53513,53513 53901,53901,53901 54289,54289,54289 54677,54677,54677 55064,55064,55064 55452,55452,55452 55840,55840,55840 56228,56228,56228 56616,56616,56616 57003,57003,57003 57391,57391,57391 57779,57779,57779 58167,58167,58167 58554,58554,58554 58942,58942,58942 59330,59330,59330 59718,59718,59718 60106,60106,60106 60493,60493,60493 60881,60881,60881 61269,61269,61269 61657,61657,61657 62044,62044,62044 62432,62432,62432 62820,62820,62820 63208,63208,63208 63596,63596,63596 63983,63983,63983 64371,64371,64371 64759,64759,64759 65147,65147,65147 65534,65534,65534 ########## g171.clr 0,0,0 385,385,385 771,771,771 1156,1156,1156 1542,1542,1542 1927,1927,1927 2313,2313,2313 2698,2698,2698 3084,3084,3084 3469,3469,3469 3855,3855,3855 4240,4240,4240 4626,4626,4626 5011,5011,5011 5397,5397,5397 5782,5782,5782 6168,6168,6168 6553,6553,6553 6939,6939,6939 7324,7324,7324 7710,7710,7710 8095,8095,8095 8481,8481,8481 8866,8866,8866 9252,9252,9252 9637,9637,9637 10023,10023,10023 10408,10408,10408 10794,10794,10794 11179,11179,11179 11565,11565,11565 11950,11950,11950 12336,12336,12336 12721,12721,12721 13107,13107,13107 13492,13492,13492 13878,13878,13878 14263,14263,14263 14649,14649,14649 15034,15034,15034 15420,15420,15420 15805,15805,15805 16191,16191,16191 16576,16576,16576 16962,16962,16962 17347,17347,17347 17733,17733,17733 18118,18118,18118 18504,18504,18504 18889,18889,18889 19275,19275,19275 19660,19660,19660 20046,20046,20046 20431,20431,20431 20817,20817,20817 21202,21202,21202 21588,21588,21588 21973,21973,21973 22359,22359,22359 22744,22744,22744 23130,23130,23130 23515,23515,23515 23901,23901,23901 24286,24286,24286 24672,24672,24672 25057,25057,25057 25443,25443,25443 25828,25828,25828 26214,26214,26214 26599,26599,26599 26985,26985,26985 27370,27370,27370 27756,27756,27756 28141,28141,28141 28527,28527,28527 28912,28912,28912 29298,29298,29298 29683,29683,29683 30069,30069,30069 30454,30454,30454 30840,30840,30840 31225,31225,31225 31611,31611,31611 31996,31996,31996 32382,32382,32382 32767,32767,32767 33153,33153,33153 33538,33538,33538 33924,33924,33924 34309,34309,34309 34695,34695,34695 35080,35080,35080 35466,35466,35466 35851,35851,35851 36237,36237,36237 36622,36622,36622 37008,37008,37008 37393,37393,37393 37779,37779,37779 38164,38164,38164 38550,38550,38550 38935,38935,38935 39321,39321,39321 39706,39706,39706 40092,40092,40092 40477,40477,40477 40863,40863,40863 41248,41248,41248 41634,41634,41634 42019,42019,42019 42405,42405,42405 42790,42790,42790 43176,43176,43176 43561,43561,43561 43947,43947,43947 44332,44332,44332 44718,44718,44718 45103,45103,45103 45489,45489,45489 45874,45874,45874 46260,46260,46260 46645,46645,46645 47031,47031,47031 47416,47416,47416 47802,47802,47802 48187,48187,48187 48573,48573,48573 48958,48958,48958 49344,49344,49344 49729,49729,49729 50115,50115,50115 50500,50500,50500 50886,50886,50886 51271,51271,51271 51657,51657,51657 52042,52042,52042 52428,52428,52428 52813,52813,52813 53199,53199,53199 53584,53584,53584 53970,53970,53970 54355,54355,54355 54741,54741,54741 55126,55126,55126 55512,55512,55512 55897,55897,55897 56283,56283,56283 56668,56668,56668 57054,57054,57054 57439,57439,57439 57825,57825,57825 58210,58210,58210 58596,58596,58596 58981,58981,58981 59367,59367,59367 59752,59752,59752 60138,60138,60138 60523,60523,60523 60909,60909,60909 61294,61294,61294 61680,61680,61680 62065,62065,62065 62451,62451,62451 62836,62836,62836 63222,63222,63222 63607,63607,63607 63993,63993,63993 64378,64378,64378 64764,64764,64764 65149,65149,65149 65535,65535,65535 ########## g172.clr 0,0,0 383,383,383 766,766,766 1149,1149,1149 1532,1532,1532 1916,1916,1916 2299,2299,2299 2682,2682,2682 3065,3065,3065 3449,3449,3449 3832,3832,3832 4215,4215,4215 4598,4598,4598 4982,4982,4982 5365,5365,5365 5748,5748,5748 6131,6131,6131 6515,6515,6515 6898,6898,6898 7281,7281,7281 7664,7664,7664 8048,8048,8048 8431,8431,8431 8814,8814,8814 9197,9197,9197 9581,9581,9581 9964,9964,9964 10347,10347,10347 10730,10730,10730 11114,11114,11114 11497,11497,11497 11880,11880,11880 12263,12263,12263 12647,12647,12647 13030,13030,13030 13413,13413,13413 13796,13796,13796 14180,14180,14180 14563,14563,14563 14946,14946,14946 15329,15329,15329 15713,15713,15713 16096,16096,16096 16479,16479,16479 16862,16862,16862 17246,17246,17246 17629,17629,17629 18012,18012,18012 18395,18395,18395 18779,18779,18779 19162,19162,19162 19545,19545,19545 19928,19928,19928 20312,20312,20312 20695,20695,20695 21078,21078,21078 21461,21461,21461 21845,21845,21845 22228,22228,22228 22611,22611,22611 22994,22994,22994 23377,23377,23377 23761,23761,23761 24144,24144,24144 24527,24527,24527 24910,24910,24910 25294,25294,25294 25677,25677,25677 26060,26060,26060 26443,26443,26443 26827,26827,26827 27210,27210,27210 27593,27593,27593 27976,27976,27976 28360,28360,28360 28743,28743,28743 29126,29126,29126 29509,29509,29509 29893,29893,29893 30276,30276,30276 30659,30659,30659 31042,31042,31042 31426,31426,31426 31809,31809,31809 32192,32192,32192 32575,32575,32575 32959,32959,32959 33342,33342,33342 33725,33725,33725 34108,34108,34108 34492,34492,34492 34875,34875,34875 35258,35258,35258 35641,35641,35641 36025,36025,36025 36408,36408,36408 36791,36791,36791 37174,37174,37174 37558,37558,37558 37941,37941,37941 38324,38324,38324 38707,38707,38707 39091,39091,39091 39474,39474,39474 39857,39857,39857 40240,40240,40240 40624,40624,40624 41007,41007,41007 41390,41390,41390 41773,41773,41773 42157,42157,42157 42540,42540,42540 42923,42923,42923 43306,43306,43306 43690,43690,43690 44073,44073,44073 44456,44456,44456 44839,44839,44839 45222,45222,45222 45606,45606,45606 45989,45989,45989 46372,46372,46372 46755,46755,46755 47139,47139,47139 47522,47522,47522 47905,47905,47905 48288,48288,48288 48672,48672,48672 49055,49055,49055 49438,49438,49438 49821,49821,49821 50205,50205,50205 50588,50588,50588 50971,50971,50971 51354,51354,51354 51738,51738,51738 52121,52121,52121 52504,52504,52504 52887,52887,52887 53271,53271,53271 53654,53654,53654 54037,54037,54037 54420,54420,54420 54804,54804,54804 55187,55187,55187 55570,55570,55570 55953,55953,55953 56337,56337,56337 56720,56720,56720 57103,57103,57103 57486,57486,57486 57870,57870,57870 58253,58253,58253 58636,58636,58636 59019,59019,59019 59403,59403,59403 59786,59786,59786 60169,60169,60169 60552,60552,60552 60936,60936,60936 61319,61319,61319 61702,61702,61702 62085,62085,62085 62469,62469,62469 62852,62852,62852 63235,63235,63235 63618,63618,63618 64002,64002,64002 64385,64385,64385 64768,64768,64768 65151,65151,65151 65535,65535,65535 ########## g173.clr 0,0,0 381,381,381 762,762,762 1143,1143,1143 1524,1524,1524 1905,1905,1905 2286,2286,2286 2667,2667,2667 3048,3048,3048 3429,3429,3429 3810,3810,3810 4191,4191,4191 4572,4572,4572 4953,4953,4953 5334,5334,5334 5715,5715,5715 6096,6096,6096 6477,6477,6477 6858,6858,6858 7239,7239,7239 7620,7620,7620 8001,8001,8001 8382,8382,8382 8763,8763,8763 9144,9144,9144 9525,9525,9525 9906,9906,9906 10287,10287,10287 10668,10668,10668 11049,11049,11049 11430,11430,11430 11811,11811,11811 12192,12192,12192 12573,12573,12573 12954,12954,12954 13335,13335,13335 13716,13716,13716 14097,14097,14097 14478,14478,14478 14859,14859,14859 15240,15240,15240 15621,15621,15621 16002,16002,16002 16383,16383,16383 16764,16764,16764 17145,17145,17145 17526,17526,17526 17907,17907,17907 18288,18288,18288 18669,18669,18669 19050,19050,19050 19431,19431,19431 19812,19812,19812 20193,20193,20193 20574,20574,20574 20955,20955,20955 21336,21336,21336 21717,21717,21717 22099,22099,22099 22480,22480,22480 22861,22861,22861 23242,23242,23242 23623,23623,23623 24004,24004,24004 24385,24385,24385 24766,24766,24766 25147,25147,25147 25528,25528,25528 25909,25909,25909 26290,26290,26290 26671,26671,26671 27052,27052,27052 27433,27433,27433 27814,27814,27814 28195,28195,28195 28576,28576,28576 28957,28957,28957 29338,29338,29338 29719,29719,29719 30100,30100,30100 30481,30481,30481 30862,30862,30862 31243,31243,31243 31624,31624,31624 32005,32005,32005 32386,32386,32386 32767,32767,32767 33148,33148,33148 33529,33529,33529 33910,33910,33910 34291,34291,34291 34672,34672,34672 35053,35053,35053 35434,35434,35434 35815,35815,35815 36196,36196,36196 36577,36577,36577 36958,36958,36958 37339,37339,37339 37720,37720,37720 38101,38101,38101 38482,38482,38482 38863,38863,38863 39244,39244,39244 39625,39625,39625 40006,40006,40006 40387,40387,40387 40768,40768,40768 41149,41149,41149 41530,41530,41530 41911,41911,41911 42292,42292,42292 42673,42673,42673 43054,43054,43054 43435,43435,43435 43817,43817,43817 44198,44198,44198 44579,44579,44579 44960,44960,44960 45341,45341,45341 45722,45722,45722 46103,46103,46103 46484,46484,46484 46865,46865,46865 47246,47246,47246 47627,47627,47627 48008,48008,48008 48389,48389,48389 48770,48770,48770 49151,49151,49151 49532,49532,49532 49913,49913,49913 50294,50294,50294 50675,50675,50675 51056,51056,51056 51437,51437,51437 51818,51818,51818 52199,52199,52199 52580,52580,52580 52961,52961,52961 53342,53342,53342 53723,53723,53723 54104,54104,54104 54485,54485,54485 54866,54866,54866 55247,55247,55247 55628,55628,55628 56009,56009,56009 56390,56390,56390 56771,56771,56771 57152,57152,57152 57533,57533,57533 57914,57914,57914 58295,58295,58295 58676,58676,58676 59057,59057,59057 59438,59438,59438 59819,59819,59819 60200,60200,60200 60581,60581,60581 60962,60962,60962 61343,61343,61343 61724,61724,61724 62105,62105,62105 62486,62486,62486 62867,62867,62867 63248,63248,63248 63629,63629,63629 64010,64010,64010 64391,64391,64391 64772,64772,64772 65153,65153,65153 65535,65535,65535 ########## g174.clr 0,0,0 378,378,378 757,757,757 1136,1136,1136 1515,1515,1515 1894,1894,1894 2272,2272,2272 2651,2651,2651 3030,3030,3030 3409,3409,3409 3788,3788,3788 4166,4166,4166 4545,4545,4545 4924,4924,4924 5303,5303,5303 5682,5682,5682 6061,6061,6061 6439,6439,6439 6818,6818,6818 7197,7197,7197 7576,7576,7576 7955,7955,7955 8333,8333,8333 8712,8712,8712 9091,9091,9091 9470,9470,9470 9849,9849,9849 10228,10228,10228 10606,10606,10606 10985,10985,10985 11364,11364,11364 11743,11743,11743 12122,12122,12122 12500,12500,12500 12879,12879,12879 13258,13258,13258 13637,13637,13637 14016,14016,14016 14394,14394,14394 14773,14773,14773 15152,15152,15152 15531,15531,15531 15910,15910,15910 16289,16289,16289 16667,16667,16667 17046,17046,17046 17425,17425,17425 17804,17804,17804 18183,18183,18183 18561,18561,18561 18940,18940,18940 19319,19319,19319 19698,19698,19698 20077,20077,20077 20456,20456,20456 20834,20834,20834 21213,21213,21213 21592,21592,21592 21971,21971,21971 22350,22350,22350 22728,22728,22728 23107,23107,23107 23486,23486,23486 23865,23865,23865 24244,24244,24244 24622,24622,24622 25001,25001,25001 25380,25380,25380 25759,25759,25759 26138,26138,26138 26517,26517,26517 26895,26895,26895 27274,27274,27274 27653,27653,27653 28032,28032,28032 28411,28411,28411 28789,28789,28789 29168,29168,29168 29547,29547,29547 29926,29926,29926 30305,30305,30305 30684,30684,30684 31062,31062,31062 31441,31441,31441 31820,31820,31820 32199,32199,32199 32578,32578,32578 32956,32956,32956 33335,33335,33335 33714,33714,33714 34093,34093,34093 34472,34472,34472 34850,34850,34850 35229,35229,35229 35608,35608,35608 35987,35987,35987 36366,36366,36366 36745,36745,36745 37123,37123,37123 37502,37502,37502 37881,37881,37881 38260,38260,38260 38639,38639,38639 39017,39017,39017 39396,39396,39396 39775,39775,39775 40154,40154,40154 40533,40533,40533 40912,40912,40912 41290,41290,41290 41669,41669,41669 42048,42048,42048 42427,42427,42427 42806,42806,42806 43184,43184,43184 43563,43563,43563 43942,43942,43942 44321,44321,44321 44700,44700,44700 45078,45078,45078 45457,45457,45457 45836,45836,45836 46215,46215,46215 46594,46594,46594 46973,46973,46973 47351,47351,47351 47730,47730,47730 48109,48109,48109 48488,48488,48488 48867,48867,48867 49245,49245,49245 49624,49624,49624 50003,50003,50003 50382,50382,50382 50761,50761,50761 51140,51140,51140 51518,51518,51518 51897,51897,51897 52276,52276,52276 52655,52655,52655 53034,53034,53034 53412,53412,53412 53791,53791,53791 54170,54170,54170 54549,54549,54549 54928,54928,54928 55306,55306,55306 55685,55685,55685 56064,56064,56064 56443,56443,56443 56822,56822,56822 57201,57201,57201 57579,57579,57579 57958,57958,57958 58337,58337,58337 58716,58716,58716 59095,59095,59095 59473,59473,59473 59852,59852,59852 60231,60231,60231 60610,60610,60610 60989,60989,60989 61368,61368,61368 61746,61746,61746 62125,62125,62125 62504,62504,62504 62883,62883,62883 63262,63262,63262 63640,63640,63640 64019,64019,64019 64398,64398,64398 64777,64777,64777 65156,65156,65156 65534,65534,65534 ########## g175.clr 0,0,0 376,376,376 753,753,753 1129,1129,1129 1506,1506,1506 1883,1883,1883 2259,2259,2259 2636,2636,2636 3013,3013,3013 3389,3389,3389 3766,3766,3766 4143,4143,4143 4519,4519,4519 4896,4896,4896 5272,5272,5272 5649,5649,5649 6026,6026,6026 6402,6402,6402 6779,6779,6779 7156,7156,7156 7532,7532,7532 7909,7909,7909 8286,8286,8286 8662,8662,8662 9039,9039,9039 9415,9415,9415 9792,9792,9792 10169,10169,10169 10545,10545,10545 10922,10922,10922 11299,11299,11299 11675,11675,11675 12052,12052,12052 12429,12429,12429 12805,12805,12805 13182,13182,13182 13558,13558,13558 13935,13935,13935 14312,14312,14312 14688,14688,14688 15065,15065,15065 15442,15442,15442 15818,15818,15818 16195,16195,16195 16572,16572,16572 16948,16948,16948 17325,17325,17325 17701,17701,17701 18078,18078,18078 18455,18455,18455 18831,18831,18831 19208,19208,19208 19585,19585,19585 19961,19961,19961 20338,20338,20338 20715,20715,20715 21091,21091,21091 21468,21468,21468 21845,21845,21845 22221,22221,22221 22598,22598,22598 22974,22974,22974 23351,23351,23351 23728,23728,23728 24104,24104,24104 24481,24481,24481 24858,24858,24858 25234,25234,25234 25611,25611,25611 25988,25988,25988 26364,26364,26364 26741,26741,26741 27117,27117,27117 27494,27494,27494 27871,27871,27871 28247,28247,28247 28624,28624,28624 29001,29001,29001 29377,29377,29377 29754,29754,29754 30131,30131,30131 30507,30507,30507 30884,30884,30884 31260,31260,31260 31637,31637,31637 32014,32014,32014 32390,32390,32390 32767,32767,32767 33144,33144,33144 33520,33520,33520 33897,33897,33897 34274,34274,34274 34650,34650,34650 35027,35027,35027 35403,35403,35403 35780,35780,35780 36157,36157,36157 36533,36533,36533 36910,36910,36910 37287,37287,37287 37663,37663,37663 38040,38040,38040 38417,38417,38417 38793,38793,38793 39170,39170,39170 39546,39546,39546 39923,39923,39923 40300,40300,40300 40676,40676,40676 41053,41053,41053 41430,41430,41430 41806,41806,41806 42183,42183,42183 42560,42560,42560 42936,42936,42936 43313,43313,43313 43690,43690,43690 44066,44066,44066 44443,44443,44443 44819,44819,44819 45196,45196,45196 45573,45573,45573 45949,45949,45949 46326,46326,46326 46703,46703,46703 47079,47079,47079 47456,47456,47456 47833,47833,47833 48209,48209,48209 48586,48586,48586 48962,48962,48962 49339,49339,49339 49716,49716,49716 50092,50092,50092 50469,50469,50469 50846,50846,50846 51222,51222,51222 51599,51599,51599 51976,51976,51976 52352,52352,52352 52729,52729,52729 53105,53105,53105 53482,53482,53482 53859,53859,53859 54235,54235,54235 54612,54612,54612 54989,54989,54989 55365,55365,55365 55742,55742,55742 56119,56119,56119 56495,56495,56495 56872,56872,56872 57248,57248,57248 57625,57625,57625 58002,58002,58002 58378,58378,58378 58755,58755,58755 59132,59132,59132 59508,59508,59508 59885,59885,59885 60262,60262,60262 60638,60638,60638 61015,61015,61015 61391,61391,61391 61768,61768,61768 62145,62145,62145 62521,62521,62521 62898,62898,62898 63275,63275,63275 63651,63651,63651 64028,64028,64028 64405,64405,64405 64781,64781,64781 65158,65158,65158 65534,65534,65534 ########## g176.clr 0,0,0 374,374,374 748,748,748 1123,1123,1123 1497,1497,1497 1872,1872,1872 2246,2246,2246 2621,2621,2621 2995,2995,2995 3370,3370,3370 3744,3744,3744 4119,4119,4119 4493,4493,4493 4868,4868,4868 5242,5242,5242 5617,5617,5617 5991,5991,5991 6366,6366,6366 6740,6740,6740 7115,7115,7115 7489,7489,7489 7864,7864,7864 8238,8238,8238 8613,8613,8613 8987,8987,8987 9362,9362,9362 9736,9736,9736 10111,10111,10111 10485,10485,10485 10860,10860,10860 11234,11234,11234 11609,11609,11609 11983,11983,11983 12358,12358,12358 12732,12732,12732 13107,13107,13107 13481,13481,13481 13855,13855,13855 14230,14230,14230 14604,14604,14604 14979,14979,14979 15353,15353,15353 15728,15728,15728 16102,16102,16102 16477,16477,16477 16851,16851,16851 17226,17226,17226 17600,17600,17600 17975,17975,17975 18349,18349,18349 18724,18724,18724 19098,19098,19098 19473,19473,19473 19847,19847,19847 20222,20222,20222 20596,20596,20596 20971,20971,20971 21345,21345,21345 21720,21720,21720 22094,22094,22094 22469,22469,22469 22843,22843,22843 23218,23218,23218 23592,23592,23592 23967,23967,23967 24341,24341,24341 24716,24716,24716 25090,25090,25090 25465,25465,25465 25839,25839,25839 26214,26214,26214 26588,26588,26588 26962,26962,26962 27337,27337,27337 27711,27711,27711 28086,28086,28086 28460,28460,28460 28835,28835,28835 29209,29209,29209 29584,29584,29584 29958,29958,29958 30333,30333,30333 30707,30707,30707 31082,31082,31082 31456,31456,31456 31831,31831,31831 32205,32205,32205 32580,32580,32580 32954,32954,32954 33329,33329,33329 33703,33703,33703 34078,34078,34078 34452,34452,34452 34827,34827,34827 35201,35201,35201 35576,35576,35576 35950,35950,35950 36325,36325,36325 36699,36699,36699 37074,37074,37074 37448,37448,37448 37823,37823,37823 38197,38197,38197 38572,38572,38572 38946,38946,38946 39321,39321,39321 39695,39695,39695 40069,40069,40069 40444,40444,40444 40818,40818,40818 41193,41193,41193 41567,41567,41567 41942,41942,41942 42316,42316,42316 42691,42691,42691 43065,43065,43065 43440,43440,43440 43814,43814,43814 44189,44189,44189 44563,44563,44563 44938,44938,44938 45312,45312,45312 45687,45687,45687 46061,46061,46061 46436,46436,46436 46810,46810,46810 47185,47185,47185 47559,47559,47559 47934,47934,47934 48308,48308,48308 48683,48683,48683 49057,49057,49057 49432,49432,49432 49806,49806,49806 50181,50181,50181 50555,50555,50555 50930,50930,50930 51304,51304,51304 51679,51679,51679 52053,52053,52053 52428,52428,52428 52802,52802,52802 53176,53176,53176 53551,53551,53551 53925,53925,53925 54300,54300,54300 54674,54674,54674 55049,55049,55049 55423,55423,55423 55798,55798,55798 56172,56172,56172 56547,56547,56547 56921,56921,56921 57296,57296,57296 57670,57670,57670 58045,58045,58045 58419,58419,58419 58794,58794,58794 59168,59168,59168 59543,59543,59543 59917,59917,59917 60292,60292,60292 60666,60666,60666 61041,61041,61041 61415,61415,61415 61790,61790,61790 62164,62164,62164 62539,62539,62539 62913,62913,62913 63288,63288,63288 63662,63662,63662 64037,64037,64037 64411,64411,64411 64786,64786,64786 65160,65160,65160 65535,65535,65535 ########## g177.clr 0,0,0 372,372,372 744,744,744 1117,1117,1117 1489,1489,1489 1861,1861,1861 2234,2234,2234 2606,2606,2606 2978,2978,2978 3351,3351,3351 3723,3723,3723 4095,4095,4095 4468,4468,4468 4840,4840,4840 5213,5213,5213 5585,5585,5585 5957,5957,5957 6330,6330,6330 6702,6702,6702 7074,7074,7074 7447,7447,7447 7819,7819,7819 8191,8191,8191 8564,8564,8564 8936,8936,8936 9308,9308,9308 9681,9681,9681 10053,10053,10053 10426,10426,10426 10798,10798,10798 11170,11170,11170 11543,11543,11543 11915,11915,11915 12287,12287,12287 12660,12660,12660 13032,13032,13032 13404,13404,13404 13777,13777,13777 14149,14149,14149 14521,14521,14521 14894,14894,14894 15266,15266,15266 15639,15639,15639 16011,16011,16011 16383,16383,16383 16756,16756,16756 17128,17128,17128 17500,17500,17500 17873,17873,17873 18245,18245,18245 18617,18617,18617 18990,18990,18990 19362,19362,19362 19734,19734,19734 20107,20107,20107 20479,20479,20479 20852,20852,20852 21224,21224,21224 21596,21596,21596 21969,21969,21969 22341,22341,22341 22713,22713,22713 23086,23086,23086 23458,23458,23458 23830,23830,23830 24203,24203,24203 24575,24575,24575 24947,24947,24947 25320,25320,25320 25692,25692,25692 26065,26065,26065 26437,26437,26437 26809,26809,26809 27182,27182,27182 27554,27554,27554 27926,27926,27926 28299,28299,28299 28671,28671,28671 29043,29043,29043 29416,29416,29416 29788,29788,29788 30160,30160,30160 30533,30533,30533 30905,30905,30905 31278,31278,31278 31650,31650,31650 32022,32022,32022 32395,32395,32395 32767,32767,32767 33139,33139,33139 33512,33512,33512 33884,33884,33884 34256,34256,34256 34629,34629,34629 35001,35001,35001 35374,35374,35374 35746,35746,35746 36118,36118,36118 36491,36491,36491 36863,36863,36863 37235,37235,37235 37608,37608,37608 37980,37980,37980 38352,38352,38352 38725,38725,38725 39097,39097,39097 39469,39469,39469 39842,39842,39842 40214,40214,40214 40587,40587,40587 40959,40959,40959 41331,41331,41331 41704,41704,41704 42076,42076,42076 42448,42448,42448 42821,42821,42821 43193,43193,43193 43565,43565,43565 43938,43938,43938 44310,44310,44310 44682,44682,44682 45055,45055,45055 45427,45427,45427 45800,45800,45800 46172,46172,46172 46544,46544,46544 46917,46917,46917 47289,47289,47289 47661,47661,47661 48034,48034,48034 48406,48406,48406 48778,48778,48778 49151,49151,49151 49523,49523,49523 49895,49895,49895 50268,50268,50268 50640,50640,50640 51013,51013,51013 51385,51385,51385 51757,51757,51757 52130,52130,52130 52502,52502,52502 52874,52874,52874 53247,53247,53247 53619,53619,53619 53991,53991,53991 54364,54364,54364 54736,54736,54736 55108,55108,55108 55481,55481,55481 55853,55853,55853 56226,56226,56226 56598,56598,56598 56970,56970,56970 57343,57343,57343 57715,57715,57715 58087,58087,58087 58460,58460,58460 58832,58832,58832 59204,59204,59204 59577,59577,59577 59949,59949,59949 60321,60321,60321 60694,60694,60694 61066,61066,61066 61439,61439,61439 61811,61811,61811 62183,62183,62183 62556,62556,62556 62928,62928,62928 63300,63300,63300 63673,63673,63673 64045,64045,64045 64417,64417,64417 64790,64790,64790 65162,65162,65162 65535,65535,65535 ########## g178.clr 0,0,0 370,370,370 740,740,740 1110,1110,1110 1481,1481,1481 1851,1851,1851 2221,2221,2221 2591,2591,2591 2962,2962,2962 3332,3332,3332 3702,3702,3702 4072,4072,4072 4443,4443,4443 4813,4813,4813 5183,5183,5183 5553,5553,5553 5924,5924,5924 6294,6294,6294 6664,6664,6664 7034,7034,7034 7405,7405,7405 7775,7775,7775 8145,8145,8145 8515,8515,8515 8886,8886,8886 9256,9256,9256 9626,9626,9626 9996,9996,9996 10367,10367,10367 10737,10737,10737 11107,11107,11107 11477,11477,11477 11848,11848,11848 12218,12218,12218 12588,12588,12588 12958,12958,12958 13329,13329,13329 13699,13699,13699 14069,14069,14069 14439,14439,14439 14810,14810,14810 15180,15180,15180 15550,15550,15550 15920,15920,15920 16291,16291,16291 16661,16661,16661 17031,17031,17031 17401,17401,17401 17772,17772,17772 18142,18142,18142 18512,18512,18512 18882,18882,18882 19253,19253,19253 19623,19623,19623 19993,19993,19993 20363,20363,20363 20734,20734,20734 21104,21104,21104 21474,21474,21474 21845,21845,21845 22215,22215,22215 22585,22585,22585 22955,22955,22955 23326,23326,23326 23696,23696,23696 24066,24066,24066 24436,24436,24436 24807,24807,24807 25177,25177,25177 25547,25547,25547 25917,25917,25917 26288,26288,26288 26658,26658,26658 27028,27028,27028 27398,27398,27398 27769,27769,27769 28139,28139,28139 28509,28509,28509 28879,28879,28879 29250,29250,29250 29620,29620,29620 29990,29990,29990 30360,30360,30360 30731,30731,30731 31101,31101,31101 31471,31471,31471 31841,31841,31841 32212,32212,32212 32582,32582,32582 32952,32952,32952 33322,33322,33322 33693,33693,33693 34063,34063,34063 34433,34433,34433 34803,34803,34803 35174,35174,35174 35544,35544,35544 35914,35914,35914 36284,36284,36284 36655,36655,36655 37025,37025,37025 37395,37395,37395 37765,37765,37765 38136,38136,38136 38506,38506,38506 38876,38876,38876 39246,39246,39246 39617,39617,39617 39987,39987,39987 40357,40357,40357 40727,40727,40727 41098,41098,41098 41468,41468,41468 41838,41838,41838 42208,42208,42208 42579,42579,42579 42949,42949,42949 43319,43319,43319 43690,43690,43690 44060,44060,44060 44430,44430,44430 44800,44800,44800 45171,45171,45171 45541,45541,45541 45911,45911,45911 46281,46281,46281 46652,46652,46652 47022,47022,47022 47392,47392,47392 47762,47762,47762 48133,48133,48133 48503,48503,48503 48873,48873,48873 49243,49243,49243 49614,49614,49614 49984,49984,49984 50354,50354,50354 50724,50724,50724 51095,51095,51095 51465,51465,51465 51835,51835,51835 52205,52205,52205 52576,52576,52576 52946,52946,52946 53316,53316,53316 53686,53686,53686 54057,54057,54057 54427,54427,54427 54797,54797,54797 55167,55167,55167 55538,55538,55538 55908,55908,55908 56278,56278,56278 56648,56648,56648 57019,57019,57019 57389,57389,57389 57759,57759,57759 58129,58129,58129 58500,58500,58500 58870,58870,58870 59240,59240,59240 59610,59610,59610 59981,59981,59981 60351,60351,60351 60721,60721,60721 61091,61091,61091 61462,61462,61462 61832,61832,61832 62202,62202,62202 62572,62572,62572 62943,62943,62943 63313,63313,63313 63683,63683,63683 64053,64053,64053 64424,64424,64424 64794,64794,64794 65164,65164,65164 65535,65535,65535 ########## g179.clr 0,0,0 368,368,368 736,736,736 1104,1104,1104 1472,1472,1472 1840,1840,1840 2209,2209,2209 2577,2577,2577 2945,2945,2945 3313,3313,3313 3681,3681,3681 4049,4049,4049 4418,4418,4418 4786,4786,4786 5154,5154,5154 5522,5522,5522 5890,5890,5890 6258,6258,6258 6627,6627,6627 6995,6995,6995 7363,7363,7363 7731,7731,7731 8099,8099,8099 8468,8468,8468 8836,8836,8836 9204,9204,9204 9572,9572,9572 9940,9940,9940 10308,10308,10308 10677,10677,10677 11045,11045,11045 11413,11413,11413 11781,11781,11781 12149,12149,12149 12517,12517,12517 12886,12886,12886 13254,13254,13254 13622,13622,13622 13990,13990,13990 14358,14358,14358 14726,14726,14726 15095,15095,15095 15463,15463,15463 15831,15831,15831 16199,16199,16199 16567,16567,16567 16936,16936,16936 17304,17304,17304 17672,17672,17672 18040,18040,18040 18408,18408,18408 18776,18776,18776 19145,19145,19145 19513,19513,19513 19881,19881,19881 20249,20249,20249 20617,20617,20617 20985,20985,20985 21354,21354,21354 21722,21722,21722 22090,22090,22090 22458,22458,22458 22826,22826,22826 23194,23194,23194 23563,23563,23563 23931,23931,23931 24299,24299,24299 24667,24667,24667 25035,25035,25035 25404,25404,25404 25772,25772,25772 26140,26140,26140 26508,26508,26508 26876,26876,26876 27244,27244,27244 27613,27613,27613 27981,27981,27981 28349,28349,28349 28717,28717,28717 29085,29085,29085 29453,29453,29453 29822,29822,29822 30190,30190,30190 30558,30558,30558 30926,30926,30926 31294,31294,31294 31662,31662,31662 32031,32031,32031 32399,32399,32399 32767,32767,32767 33135,33135,33135 33503,33503,33503 33872,33872,33872 34240,34240,34240 34608,34608,34608 34976,34976,34976 35344,35344,35344 35712,35712,35712 36081,36081,36081 36449,36449,36449 36817,36817,36817 37185,37185,37185 37553,37553,37553 37921,37921,37921 38290,38290,38290 38658,38658,38658 39026,39026,39026 39394,39394,39394 39762,39762,39762 40130,40130,40130 40499,40499,40499 40867,40867,40867 41235,41235,41235 41603,41603,41603 41971,41971,41971 42340,42340,42340 42708,42708,42708 43076,43076,43076 43444,43444,43444 43812,43812,43812 44180,44180,44180 44549,44549,44549 44917,44917,44917 45285,45285,45285 45653,45653,45653 46021,46021,46021 46389,46389,46389 46758,46758,46758 47126,47126,47126 47494,47494,47494 47862,47862,47862 48230,48230,48230 48598,48598,48598 48967,48967,48967 49335,49335,49335 49703,49703,49703 50071,50071,50071 50439,50439,50439 50808,50808,50808 51176,51176,51176 51544,51544,51544 51912,51912,51912 52280,52280,52280 52648,52648,52648 53017,53017,53017 53385,53385,53385 53753,53753,53753 54121,54121,54121 54489,54489,54489 54857,54857,54857 55226,55226,55226 55594,55594,55594 55962,55962,55962 56330,56330,56330 56698,56698,56698 57066,57066,57066 57435,57435,57435 57803,57803,57803 58171,58171,58171 58539,58539,58539 58907,58907,58907 59276,59276,59276 59644,59644,59644 60012,60012,60012 60380,60380,60380 60748,60748,60748 61116,61116,61116 61485,61485,61485 61853,61853,61853 62221,62221,62221 62589,62589,62589 62957,62957,62957 63325,63325,63325 63694,63694,63694 64062,64062,64062 64430,64430,64430 64798,64798,64798 65166,65166,65166 65534,65534,65534 ########## g18.clr 0,0,0 3855,3855,3855 7710,7710,7710 11565,11565,11565 15420,15420,15420 19275,19275,19275 23130,23130,23130 26985,26985,26985 30840,30840,30840 34695,34695,34695 38550,38550,38550 42405,42405,42405 46260,46260,46260 50115,50115,50115 53970,53970,53970 57825,57825,57825 61680,61680,61680 65535,65535,65535 ########## g180.clr 0,0,0 366,366,366 732,732,732 1098,1098,1098 1464,1464,1464 1830,1830,1830 2196,2196,2196 2562,2562,2562 2928,2928,2928 3295,3295,3295 3661,3661,3661 4027,4027,4027 4393,4393,4393 4759,4759,4759 5125,5125,5125 5491,5491,5491 5857,5857,5857 6223,6223,6223 6590,6590,6590 6956,6956,6956 7322,7322,7322 7688,7688,7688 8054,8054,8054 8420,8420,8420 8786,8786,8786 9152,9152,9152 9519,9519,9519 9885,9885,9885 10251,10251,10251 10617,10617,10617 10983,10983,10983 11349,11349,11349 11715,11715,11715 12081,12081,12081 12447,12447,12447 12814,12814,12814 13180,13180,13180 13546,13546,13546 13912,13912,13912 14278,14278,14278 14644,14644,14644 15010,15010,15010 15376,15376,15376 15743,15743,15743 16109,16109,16109 16475,16475,16475 16841,16841,16841 17207,17207,17207 17573,17573,17573 17939,17939,17939 18305,18305,18305 18671,18671,18671 19038,19038,19038 19404,19404,19404 19770,19770,19770 20136,20136,20136 20502,20502,20502 20868,20868,20868 21234,21234,21234 21600,21600,21600 21967,21967,21967 22333,22333,22333 22699,22699,22699 23065,23065,23065 23431,23431,23431 23797,23797,23797 24163,24163,24163 24529,24529,24529 24895,24895,24895 25262,25262,25262 25628,25628,25628 25994,25994,25994 26360,26360,26360 26726,26726,26726 27092,27092,27092 27458,27458,27458 27824,27824,27824 28191,28191,28191 28557,28557,28557 28923,28923,28923 29289,29289,29289 29655,29655,29655 30021,30021,30021 30387,30387,30387 30753,30753,30753 31119,31119,31119 31486,31486,31486 31852,31852,31852 32218,32218,32218 32584,32584,32584 32950,32950,32950 33316,33316,33316 33682,33682,33682 34048,34048,34048 34415,34415,34415 34781,34781,34781 35147,35147,35147 35513,35513,35513 35879,35879,35879 36245,36245,36245 36611,36611,36611 36977,36977,36977 37343,37343,37343 37710,37710,37710 38076,38076,38076 38442,38442,38442 38808,38808,38808 39174,39174,39174 39540,39540,39540 39906,39906,39906 40272,40272,40272 40639,40639,40639 41005,41005,41005 41371,41371,41371 41737,41737,41737 42103,42103,42103 42469,42469,42469 42835,42835,42835 43201,43201,43201 43567,43567,43567 43934,43934,43934 44300,44300,44300 44666,44666,44666 45032,45032,45032 45398,45398,45398 45764,45764,45764 46130,46130,46130 46496,46496,46496 46863,46863,46863 47229,47229,47229 47595,47595,47595 47961,47961,47961 48327,48327,48327 48693,48693,48693 49059,49059,49059 49425,49425,49425 49791,49791,49791 50158,50158,50158 50524,50524,50524 50890,50890,50890 51256,51256,51256 51622,51622,51622 51988,51988,51988 52354,52354,52354 52720,52720,52720 53087,53087,53087 53453,53453,53453 53819,53819,53819 54185,54185,54185 54551,54551,54551 54917,54917,54917 55283,55283,55283 55649,55649,55649 56015,56015,56015 56382,56382,56382 56748,56748,56748 57114,57114,57114 57480,57480,57480 57846,57846,57846 58212,58212,58212 58578,58578,58578 58944,58944,58944 59311,59311,59311 59677,59677,59677 60043,60043,60043 60409,60409,60409 60775,60775,60775 61141,61141,61141 61507,61507,61507 61873,61873,61873 62239,62239,62239 62606,62606,62606 62972,62972,62972 63338,63338,63338 63704,63704,63704 64070,64070,64070 64436,64436,64436 64802,64802,64802 65168,65168,65168 65535,65535,65535 ########## g181.clr 0,0,0 364,364,364 728,728,728 1092,1092,1092 1456,1456,1456 1820,1820,1820 2184,2184,2184 2548,2548,2548 2912,2912,2912 3276,3276,3276 3640,3640,3640 4004,4004,4004 4369,4369,4369 4733,4733,4733 5097,5097,5097 5461,5461,5461 5825,5825,5825 6189,6189,6189 6553,6553,6553 6917,6917,6917 7281,7281,7281 7645,7645,7645 8009,8009,8009 8373,8373,8373 8738,8738,8738 9102,9102,9102 9466,9466,9466 9830,9830,9830 10194,10194,10194 10558,10558,10558 10922,10922,10922 11286,11286,11286 11650,11650,11650 12014,12014,12014 12378,12378,12378 12742,12742,12742 13107,13107,13107 13471,13471,13471 13835,13835,13835 14199,14199,14199 14563,14563,14563 14927,14927,14927 15291,15291,15291 15655,15655,15655 16019,16019,16019 16383,16383,16383 16747,16747,16747 17111,17111,17111 17476,17476,17476 17840,17840,17840 18204,18204,18204 18568,18568,18568 18932,18932,18932 19296,19296,19296 19660,19660,19660 20024,20024,20024 20388,20388,20388 20752,20752,20752 21116,21116,21116 21480,21480,21480 21845,21845,21845 22209,22209,22209 22573,22573,22573 22937,22937,22937 23301,23301,23301 23665,23665,23665 24029,24029,24029 24393,24393,24393 24757,24757,24757 25121,25121,25121 25485,25485,25485 25849,25849,25849 26214,26214,26214 26578,26578,26578 26942,26942,26942 27306,27306,27306 27670,27670,27670 28034,28034,28034 28398,28398,28398 28762,28762,28762 29126,29126,29126 29490,29490,29490 29854,29854,29854 30218,30218,30218 30583,30583,30583 30947,30947,30947 31311,31311,31311 31675,31675,31675 32039,32039,32039 32403,32403,32403 32767,32767,32767 33131,33131,33131 33495,33495,33495 33859,33859,33859 34223,34223,34223 34587,34587,34587 34952,34952,34952 35316,35316,35316 35680,35680,35680 36044,36044,36044 36408,36408,36408 36772,36772,36772 37136,37136,37136 37500,37500,37500 37864,37864,37864 38228,38228,38228 38592,38592,38592 38956,38956,38956 39321,39321,39321 39685,39685,39685 40049,40049,40049 40413,40413,40413 40777,40777,40777 41141,41141,41141 41505,41505,41505 41869,41869,41869 42233,42233,42233 42597,42597,42597 42961,42961,42961 43325,43325,43325 43690,43690,43690 44054,44054,44054 44418,44418,44418 44782,44782,44782 45146,45146,45146 45510,45510,45510 45874,45874,45874 46238,46238,46238 46602,46602,46602 46966,46966,46966 47330,47330,47330 47694,47694,47694 48059,48059,48059 48423,48423,48423 48787,48787,48787 49151,49151,49151 49515,49515,49515 49879,49879,49879 50243,50243,50243 50607,50607,50607 50971,50971,50971 51335,51335,51335 51699,51699,51699 52063,52063,52063 52428,52428,52428 52792,52792,52792 53156,53156,53156 53520,53520,53520 53884,53884,53884 54248,54248,54248 54612,54612,54612 54976,54976,54976 55340,55340,55340 55704,55704,55704 56068,56068,56068 56432,56432,56432 56797,56797,56797 57161,57161,57161 57525,57525,57525 57889,57889,57889 58253,58253,58253 58617,58617,58617 58981,58981,58981 59345,59345,59345 59709,59709,59709 60073,60073,60073 60437,60437,60437 60801,60801,60801 61166,61166,61166 61530,61530,61530 61894,61894,61894 62258,62258,62258 62622,62622,62622 62986,62986,62986 63350,63350,63350 63714,63714,63714 64078,64078,64078 64442,64442,64442 64806,64806,64806 65170,65170,65170 65535,65535,65535 ########## g182.clr 0,0,0 362,362,362 724,724,724 1086,1086,1086 1448,1448,1448 1810,1810,1810 2172,2172,2172 2534,2534,2534 2896,2896,2896 3258,3258,3258 3620,3620,3620 3982,3982,3982 4344,4344,4344 4706,4706,4706 5069,5069,5069 5431,5431,5431 5793,5793,5793 6155,6155,6155 6517,6517,6517 6879,6879,6879 7241,7241,7241 7603,7603,7603 7965,7965,7965 8327,8327,8327 8689,8689,8689 9051,9051,9051 9413,9413,9413 9775,9775,9775 10138,10138,10138 10500,10500,10500 10862,10862,10862 11224,11224,11224 11586,11586,11586 11948,11948,11948 12310,12310,12310 12672,12672,12672 13034,13034,13034 13396,13396,13396 13758,13758,13758 14120,14120,14120 14482,14482,14482 14844,14844,14844 15207,15207,15207 15569,15569,15569 15931,15931,15931 16293,16293,16293 16655,16655,16655 17017,17017,17017 17379,17379,17379 17741,17741,17741 18103,18103,18103 18465,18465,18465 18827,18827,18827 19189,19189,19189 19551,19551,19551 19913,19913,19913 20276,20276,20276 20638,20638,20638 21000,21000,21000 21362,21362,21362 21724,21724,21724 22086,22086,22086 22448,22448,22448 22810,22810,22810 23172,23172,23172 23534,23534,23534 23896,23896,23896 24258,24258,24258 24620,24620,24620 24982,24982,24982 25345,25345,25345 25707,25707,25707 26069,26069,26069 26431,26431,26431 26793,26793,26793 27155,27155,27155 27517,27517,27517 27879,27879,27879 28241,28241,28241 28603,28603,28603 28965,28965,28965 29327,29327,29327 29689,29689,29689 30051,30051,30051 30414,30414,30414 30776,30776,30776 31138,31138,31138 31500,31500,31500 31862,31862,31862 32224,32224,32224 32586,32586,32586 32948,32948,32948 33310,33310,33310 33672,33672,33672 34034,34034,34034 34396,34396,34396 34758,34758,34758 35120,35120,35120 35483,35483,35483 35845,35845,35845 36207,36207,36207 36569,36569,36569 36931,36931,36931 37293,37293,37293 37655,37655,37655 38017,38017,38017 38379,38379,38379 38741,38741,38741 39103,39103,39103 39465,39465,39465 39827,39827,39827 40189,40189,40189 40552,40552,40552 40914,40914,40914 41276,41276,41276 41638,41638,41638 42000,42000,42000 42362,42362,42362 42724,42724,42724 43086,43086,43086 43448,43448,43448 43810,43810,43810 44172,44172,44172 44534,44534,44534 44896,44896,44896 45258,45258,45258 45621,45621,45621 45983,45983,45983 46345,46345,46345 46707,46707,46707 47069,47069,47069 47431,47431,47431 47793,47793,47793 48155,48155,48155 48517,48517,48517 48879,48879,48879 49241,49241,49241 49603,49603,49603 49965,49965,49965 50327,50327,50327 50690,50690,50690 51052,51052,51052 51414,51414,51414 51776,51776,51776 52138,52138,52138 52500,52500,52500 52862,52862,52862 53224,53224,53224 53586,53586,53586 53948,53948,53948 54310,54310,54310 54672,54672,54672 55034,55034,55034 55396,55396,55396 55759,55759,55759 56121,56121,56121 56483,56483,56483 56845,56845,56845 57207,57207,57207 57569,57569,57569 57931,57931,57931 58293,58293,58293 58655,58655,58655 59017,59017,59017 59379,59379,59379 59741,59741,59741 60103,60103,60103 60465,60465,60465 60828,60828,60828 61190,61190,61190 61552,61552,61552 61914,61914,61914 62276,62276,62276 62638,62638,62638 63000,63000,63000 63362,63362,63362 63724,63724,63724 64086,64086,64086 64448,64448,64448 64810,64810,64810 65172,65172,65172 65535,65535,65535 ########## g183.clr 0,0,0 360,360,360 720,720,720 1080,1080,1080 1440,1440,1440 1800,1800,1800 2160,2160,2160 2520,2520,2520 2880,2880,2880 3240,3240,3240 3600,3600,3600 3960,3960,3960 4320,4320,4320 4681,4681,4681 5041,5041,5041 5401,5401,5401 5761,5761,5761 6121,6121,6121 6481,6481,6481 6841,6841,6841 7201,7201,7201 7561,7561,7561 7921,7921,7921 8281,8281,8281 8641,8641,8641 9002,9002,9002 9362,9362,9362 9722,9722,9722 10082,10082,10082 10442,10442,10442 10802,10802,10802 11162,11162,11162 11522,11522,11522 11882,11882,11882 12242,12242,12242 12602,12602,12602 12962,12962,12962 13323,13323,13323 13683,13683,13683 14043,14043,14043 14403,14403,14403 14763,14763,14763 15123,15123,15123 15483,15483,15483 15843,15843,15843 16203,16203,16203 16563,16563,16563 16923,16923,16923 17283,17283,17283 17644,17644,17644 18004,18004,18004 18364,18364,18364 18724,18724,18724 19084,19084,19084 19444,19444,19444 19804,19804,19804 20164,20164,20164 20524,20524,20524 20884,20884,20884 21244,21244,21244 21604,21604,21604 21965,21965,21965 22325,22325,22325 22685,22685,22685 23045,23045,23045 23405,23405,23405 23765,23765,23765 24125,24125,24125 24485,24485,24485 24845,24845,24845 25205,25205,25205 25565,25565,25565 25925,25925,25925 26286,26286,26286 26646,26646,26646 27006,27006,27006 27366,27366,27366 27726,27726,27726 28086,28086,28086 28446,28446,28446 28806,28806,28806 29166,29166,29166 29526,29526,29526 29886,29886,29886 30246,30246,30246 30607,30607,30607 30967,30967,30967 31327,31327,31327 31687,31687,31687 32047,32047,32047 32407,32407,32407 32767,32767,32767 33127,33127,33127 33487,33487,33487 33847,33847,33847 34207,34207,34207 34567,34567,34567 34927,34927,34927 35288,35288,35288 35648,35648,35648 36008,36008,36008 36368,36368,36368 36728,36728,36728 37088,37088,37088 37448,37448,37448 37808,37808,37808 38168,38168,38168 38528,38528,38528 38888,38888,38888 39248,39248,39248 39609,39609,39609 39969,39969,39969 40329,40329,40329 40689,40689,40689 41049,41049,41049 41409,41409,41409 41769,41769,41769 42129,42129,42129 42489,42489,42489 42849,42849,42849 43209,43209,43209 43569,43569,43569 43930,43930,43930 44290,44290,44290 44650,44650,44650 45010,45010,45010 45370,45370,45370 45730,45730,45730 46090,46090,46090 46450,46450,46450 46810,46810,46810 47170,47170,47170 47530,47530,47530 47890,47890,47890 48251,48251,48251 48611,48611,48611 48971,48971,48971 49331,49331,49331 49691,49691,49691 50051,50051,50051 50411,50411,50411 50771,50771,50771 51131,51131,51131 51491,51491,51491 51851,51851,51851 52211,52211,52211 52572,52572,52572 52932,52932,52932 53292,53292,53292 53652,53652,53652 54012,54012,54012 54372,54372,54372 54732,54732,54732 55092,55092,55092 55452,55452,55452 55812,55812,55812 56172,56172,56172 56532,56532,56532 56893,56893,56893 57253,57253,57253 57613,57613,57613 57973,57973,57973 58333,58333,58333 58693,58693,58693 59053,59053,59053 59413,59413,59413 59773,59773,59773 60133,60133,60133 60493,60493,60493 60853,60853,60853 61214,61214,61214 61574,61574,61574 61934,61934,61934 62294,62294,62294 62654,62654,62654 63014,63014,63014 63374,63374,63374 63734,63734,63734 64094,64094,64094 64454,64454,64454 64814,64814,64814 65174,65174,65174 65535,65535,65535 ########## g184.clr 0,0,0 358,358,358 716,716,716 1074,1074,1074 1432,1432,1432 1790,1790,1790 2148,2148,2148 2506,2506,2506 2864,2864,2864 3223,3223,3223 3581,3581,3581 3939,3939,3939 4297,4297,4297 4655,4655,4655 5013,5013,5013 5371,5371,5371 5729,5729,5729 6087,6087,6087 6446,6446,6446 6804,6804,6804 7162,7162,7162 7520,7520,7520 7878,7878,7878 8236,8236,8236 8594,8594,8594 8952,8952,8952 9310,9310,9310 9669,9669,9669 10027,10027,10027 10385,10385,10385 10743,10743,10743 11101,11101,11101 11459,11459,11459 11817,11817,11817 12175,12175,12175 12534,12534,12534 12892,12892,12892 13250,13250,13250 13608,13608,13608 13966,13966,13966 14324,14324,14324 14682,14682,14682 15040,15040,15040 15398,15398,15398 15757,15757,15757 16115,16115,16115 16473,16473,16473 16831,16831,16831 17189,17189,17189 17547,17547,17547 17905,17905,17905 18263,18263,18263 18621,18621,18621 18980,18980,18980 19338,19338,19338 19696,19696,19696 20054,20054,20054 20412,20412,20412 20770,20770,20770 21128,21128,21128 21486,21486,21486 21845,21845,21845 22203,22203,22203 22561,22561,22561 22919,22919,22919 23277,23277,23277 23635,23635,23635 23993,23993,23993 24351,24351,24351 24709,24709,24709 25068,25068,25068 25426,25426,25426 25784,25784,25784 26142,26142,26142 26500,26500,26500 26858,26858,26858 27216,27216,27216 27574,27574,27574 27932,27932,27932 28291,28291,28291 28649,28649,28649 29007,29007,29007 29365,29365,29365 29723,29723,29723 30081,30081,30081 30439,30439,30439 30797,30797,30797 31155,31155,31155 31514,31514,31514 31872,31872,31872 32230,32230,32230 32588,32588,32588 32946,32946,32946 33304,33304,33304 33662,33662,33662 34020,34020,34020 34379,34379,34379 34737,34737,34737 35095,35095,35095 35453,35453,35453 35811,35811,35811 36169,36169,36169 36527,36527,36527 36885,36885,36885 37243,37243,37243 37602,37602,37602 37960,37960,37960 38318,38318,38318 38676,38676,38676 39034,39034,39034 39392,39392,39392 39750,39750,39750 40108,40108,40108 40466,40466,40466 40825,40825,40825 41183,41183,41183 41541,41541,41541 41899,41899,41899 42257,42257,42257 42615,42615,42615 42973,42973,42973 43331,43331,43331 43690,43690,43690 44048,44048,44048 44406,44406,44406 44764,44764,44764 45122,45122,45122 45480,45480,45480 45838,45838,45838 46196,46196,46196 46554,46554,46554 46913,46913,46913 47271,47271,47271 47629,47629,47629 47987,47987,47987 48345,48345,48345 48703,48703,48703 49061,49061,49061 49419,49419,49419 49777,49777,49777 50136,50136,50136 50494,50494,50494 50852,50852,50852 51210,51210,51210 51568,51568,51568 51926,51926,51926 52284,52284,52284 52642,52642,52642 53000,53000,53000 53359,53359,53359 53717,53717,53717 54075,54075,54075 54433,54433,54433 54791,54791,54791 55149,55149,55149 55507,55507,55507 55865,55865,55865 56224,56224,56224 56582,56582,56582 56940,56940,56940 57298,57298,57298 57656,57656,57656 58014,58014,58014 58372,58372,58372 58730,58730,58730 59088,59088,59088 59447,59447,59447 59805,59805,59805 60163,60163,60163 60521,60521,60521 60879,60879,60879 61237,61237,61237 61595,61595,61595 61953,61953,61953 62311,62311,62311 62670,62670,62670 63028,63028,63028 63386,63386,63386 63744,63744,63744 64102,64102,64102 64460,64460,64460 64818,64818,64818 65176,65176,65176 65535,65535,65535 ########## g185.clr 0,0,0 356,356,356 712,712,712 1068,1068,1068 1424,1424,1424 1780,1780,1780 2137,2137,2137 2493,2493,2493 2849,2849,2849 3205,3205,3205 3561,3561,3561 3917,3917,3917 4274,4274,4274 4630,4630,4630 4986,4986,4986 5342,5342,5342 5698,5698,5698 6054,6054,6054 6411,6411,6411 6767,6767,6767 7123,7123,7123 7479,7479,7479 7835,7835,7835 8191,8191,8191 8548,8548,8548 8904,8904,8904 9260,9260,9260 9616,9616,9616 9972,9972,9972 10328,10328,10328 10685,10685,10685 11041,11041,11041 11397,11397,11397 11753,11753,11753 12109,12109,12109 12465,12465,12465 12822,12822,12822 13178,13178,13178 13534,13534,13534 13890,13890,13890 14246,14246,14246 14602,14602,14602 14959,14959,14959 15315,15315,15315 15671,15671,15671 16027,16027,16027 16383,16383,16383 16739,16739,16739 17096,17096,17096 17452,17452,17452 17808,17808,17808 18164,18164,18164 18520,18520,18520 18876,18876,18876 19233,19233,19233 19589,19589,19589 19945,19945,19945 20301,20301,20301 20657,20657,20657 21013,21013,21013 21370,21370,21370 21726,21726,21726 22082,22082,22082 22438,22438,22438 22794,22794,22794 23150,23150,23150 23507,23507,23507 23863,23863,23863 24219,24219,24219 24575,24575,24575 24931,24931,24931 25287,25287,25287 25644,25644,25644 26000,26000,26000 26356,26356,26356 26712,26712,26712 27068,27068,27068 27424,27424,27424 27781,27781,27781 28137,28137,28137 28493,28493,28493 28849,28849,28849 29205,29205,29205 29561,29561,29561 29918,29918,29918 30274,30274,30274 30630,30630,30630 30986,30986,30986 31342,31342,31342 31698,31698,31698 32055,32055,32055 32411,32411,32411 32767,32767,32767 33123,33123,33123 33479,33479,33479 33836,33836,33836 34192,34192,34192 34548,34548,34548 34904,34904,34904 35260,35260,35260 35616,35616,35616 35973,35973,35973 36329,36329,36329 36685,36685,36685 37041,37041,37041 37397,37397,37397 37753,37753,37753 38110,38110,38110 38466,38466,38466 38822,38822,38822 39178,39178,39178 39534,39534,39534 39890,39890,39890 40247,40247,40247 40603,40603,40603 40959,40959,40959 41315,41315,41315 41671,41671,41671 42027,42027,42027 42384,42384,42384 42740,42740,42740 43096,43096,43096 43452,43452,43452 43808,43808,43808 44164,44164,44164 44521,44521,44521 44877,44877,44877 45233,45233,45233 45589,45589,45589 45945,45945,45945 46301,46301,46301 46658,46658,46658 47014,47014,47014 47370,47370,47370 47726,47726,47726 48082,48082,48082 48438,48438,48438 48795,48795,48795 49151,49151,49151 49507,49507,49507 49863,49863,49863 50219,50219,50219 50575,50575,50575 50932,50932,50932 51288,51288,51288 51644,51644,51644 52000,52000,52000 52356,52356,52356 52712,52712,52712 53069,53069,53069 53425,53425,53425 53781,53781,53781 54137,54137,54137 54493,54493,54493 54849,54849,54849 55206,55206,55206 55562,55562,55562 55918,55918,55918 56274,56274,56274 56630,56630,56630 56986,56986,56986 57343,57343,57343 57699,57699,57699 58055,58055,58055 58411,58411,58411 58767,58767,58767 59123,59123,59123 59480,59480,59480 59836,59836,59836 60192,60192,60192 60548,60548,60548 60904,60904,60904 61260,61260,61260 61617,61617,61617 61973,61973,61973 62329,62329,62329 62685,62685,62685 63041,63041,63041 63397,63397,63397 63754,63754,63754 64110,64110,64110 64466,64466,64466 64822,64822,64822 65178,65178,65178 65535,65535,65535 ########## g186.clr 0,0,0 354,354,354 708,708,708 1062,1062,1062 1416,1416,1416 1771,1771,1771 2125,2125,2125 2479,2479,2479 2833,2833,2833 3188,3188,3188 3542,3542,3542 3896,3896,3896 4250,4250,4250 4605,4605,4605 4959,4959,4959 5313,5313,5313 5667,5667,5667 6022,6022,6022 6376,6376,6376 6730,6730,6730 7084,7084,7084 7439,7439,7439 7793,7793,7793 8147,8147,8147 8501,8501,8501 8856,8856,8856 9210,9210,9210 9564,9564,9564 9918,9918,9918 10273,10273,10273 10627,10627,10627 10981,10981,10981 11335,11335,11335 11690,11690,11690 12044,12044,12044 12398,12398,12398 12752,12752,12752 13107,13107,13107 13461,13461,13461 13815,13815,13815 14169,14169,14169 14523,14523,14523 14878,14878,14878 15232,15232,15232 15586,15586,15586 15940,15940,15940 16295,16295,16295 16649,16649,16649 17003,17003,17003 17357,17357,17357 17712,17712,17712 18066,18066,18066 18420,18420,18420 18774,18774,18774 19129,19129,19129 19483,19483,19483 19837,19837,19837 20191,20191,20191 20546,20546,20546 20900,20900,20900 21254,21254,21254 21608,21608,21608 21963,21963,21963 22317,22317,22317 22671,22671,22671 23025,23025,23025 23380,23380,23380 23734,23734,23734 24088,24088,24088 24442,24442,24442 24797,24797,24797 25151,25151,25151 25505,25505,25505 25859,25859,25859 26214,26214,26214 26568,26568,26568 26922,26922,26922 27276,27276,27276 27630,27630,27630 27985,27985,27985 28339,28339,28339 28693,28693,28693 29047,29047,29047 29402,29402,29402 29756,29756,29756 30110,30110,30110 30464,30464,30464 30819,30819,30819 31173,31173,31173 31527,31527,31527 31881,31881,31881 32236,32236,32236 32590,32590,32590 32944,32944,32944 33298,33298,33298 33653,33653,33653 34007,34007,34007 34361,34361,34361 34715,34715,34715 35070,35070,35070 35424,35424,35424 35778,35778,35778 36132,36132,36132 36487,36487,36487 36841,36841,36841 37195,37195,37195 37549,37549,37549 37904,37904,37904 38258,38258,38258 38612,38612,38612 38966,38966,38966 39321,39321,39321 39675,39675,39675 40029,40029,40029 40383,40383,40383 40737,40737,40737 41092,41092,41092 41446,41446,41446 41800,41800,41800 42154,42154,42154 42509,42509,42509 42863,42863,42863 43217,43217,43217 43571,43571,43571 43926,43926,43926 44280,44280,44280 44634,44634,44634 44988,44988,44988 45343,45343,45343 45697,45697,45697 46051,46051,46051 46405,46405,46405 46760,46760,46760 47114,47114,47114 47468,47468,47468 47822,47822,47822 48177,48177,48177 48531,48531,48531 48885,48885,48885 49239,49239,49239 49594,49594,49594 49948,49948,49948 50302,50302,50302 50656,50656,50656 51011,51011,51011 51365,51365,51365 51719,51719,51719 52073,52073,52073 52428,52428,52428 52782,52782,52782 53136,53136,53136 53490,53490,53490 53844,53844,53844 54199,54199,54199 54553,54553,54553 54907,54907,54907 55261,55261,55261 55616,55616,55616 55970,55970,55970 56324,56324,56324 56678,56678,56678 57033,57033,57033 57387,57387,57387 57741,57741,57741 58095,58095,58095 58450,58450,58450 58804,58804,58804 59158,59158,59158 59512,59512,59512 59867,59867,59867 60221,60221,60221 60575,60575,60575 60929,60929,60929 61284,61284,61284 61638,61638,61638 61992,61992,61992 62346,62346,62346 62701,62701,62701 63055,63055,63055 63409,63409,63409 63763,63763,63763 64118,64118,64118 64472,64472,64472 64826,64826,64826 65180,65180,65180 65535,65535,65535 ########## g187.clr 0,0,0 352,352,352 704,704,704 1057,1057,1057 1409,1409,1409 1761,1761,1761 2114,2114,2114 2466,2466,2466 2818,2818,2818 3171,3171,3171 3523,3523,3523 3875,3875,3875 4228,4228,4228 4580,4580,4580 4932,4932,4932 5285,5285,5285 5637,5637,5637 5989,5989,5989 6342,6342,6342 6694,6694,6694 7046,7046,7046 7399,7399,7399 7751,7751,7751 8103,8103,8103 8456,8456,8456 8808,8808,8808 9160,9160,9160 9513,9513,9513 9865,9865,9865 10217,10217,10217 10570,10570,10570 10922,10922,10922 11274,11274,11274 11627,11627,11627 11979,11979,11979 12331,12331,12331 12684,12684,12684 13036,13036,13036 13388,13388,13388 13741,13741,13741 14093,14093,14093 14445,14445,14445 14798,14798,14798 15150,15150,15150 15502,15502,15502 15855,15855,15855 16207,16207,16207 16559,16559,16559 16912,16912,16912 17264,17264,17264 17616,17616,17616 17969,17969,17969 18321,18321,18321 18673,18673,18673 19026,19026,19026 19378,19378,19378 19730,19730,19730 20083,20083,20083 20435,20435,20435 20787,20787,20787 21140,21140,21140 21492,21492,21492 21845,21845,21845 22197,22197,22197 22549,22549,22549 22902,22902,22902 23254,23254,23254 23606,23606,23606 23959,23959,23959 24311,24311,24311 24663,24663,24663 25016,25016,25016 25368,25368,25368 25720,25720,25720 26073,26073,26073 26425,26425,26425 26777,26777,26777 27130,27130,27130 27482,27482,27482 27834,27834,27834 28187,28187,28187 28539,28539,28539 28891,28891,28891 29244,29244,29244 29596,29596,29596 29948,29948,29948 30301,30301,30301 30653,30653,30653 31005,31005,31005 31358,31358,31358 31710,31710,31710 32062,32062,32062 32415,32415,32415 32767,32767,32767 33119,33119,33119 33472,33472,33472 33824,33824,33824 34176,34176,34176 34529,34529,34529 34881,34881,34881 35233,35233,35233 35586,35586,35586 35938,35938,35938 36290,36290,36290 36643,36643,36643 36995,36995,36995 37347,37347,37347 37700,37700,37700 38052,38052,38052 38404,38404,38404 38757,38757,38757 39109,39109,39109 39461,39461,39461 39814,39814,39814 40166,40166,40166 40518,40518,40518 40871,40871,40871 41223,41223,41223 41575,41575,41575 41928,41928,41928 42280,42280,42280 42632,42632,42632 42985,42985,42985 43337,43337,43337 43690,43690,43690 44042,44042,44042 44394,44394,44394 44747,44747,44747 45099,45099,45099 45451,45451,45451 45804,45804,45804 46156,46156,46156 46508,46508,46508 46861,46861,46861 47213,47213,47213 47565,47565,47565 47918,47918,47918 48270,48270,48270 48622,48622,48622 48975,48975,48975 49327,49327,49327 49679,49679,49679 50032,50032,50032 50384,50384,50384 50736,50736,50736 51089,51089,51089 51441,51441,51441 51793,51793,51793 52146,52146,52146 52498,52498,52498 52850,52850,52850 53203,53203,53203 53555,53555,53555 53907,53907,53907 54260,54260,54260 54612,54612,54612 54964,54964,54964 55317,55317,55317 55669,55669,55669 56021,56021,56021 56374,56374,56374 56726,56726,56726 57078,57078,57078 57431,57431,57431 57783,57783,57783 58135,58135,58135 58488,58488,58488 58840,58840,58840 59192,59192,59192 59545,59545,59545 59897,59897,59897 60249,60249,60249 60602,60602,60602 60954,60954,60954 61306,61306,61306 61659,61659,61659 62011,62011,62011 62363,62363,62363 62716,62716,62716 63068,63068,63068 63420,63420,63420 63773,63773,63773 64125,64125,64125 64477,64477,64477 64830,64830,64830 65182,65182,65182 65535,65535,65535 ########## g188.clr 0,0,0 350,350,350 700,700,700 1051,1051,1051 1401,1401,1401 1752,1752,1752 2102,2102,2102 2453,2453,2453 2803,2803,2803 3154,3154,3154 3504,3504,3504 3855,3855,3855 4205,4205,4205 4555,4555,4555 4906,4906,4906 5256,5256,5256 5607,5607,5607 5957,5957,5957 6308,6308,6308 6658,6658,6658 7009,7009,7009 7359,7359,7359 7710,7710,7710 8060,8060,8060 8410,8410,8410 8761,8761,8761 9111,9111,9111 9462,9462,9462 9812,9812,9812 10163,10163,10163 10513,10513,10513 10864,10864,10864 11214,11214,11214 11565,11565,11565 11915,11915,11915 12265,12265,12265 12616,12616,12616 12966,12966,12966 13317,13317,13317 13667,13667,13667 14018,14018,14018 14368,14368,14368 14719,14719,14719 15069,15069,15069 15420,15420,15420 15770,15770,15770 16120,16120,16120 16471,16471,16471 16821,16821,16821 17172,17172,17172 17522,17522,17522 17873,17873,17873 18223,18223,18223 18574,18574,18574 18924,18924,18924 19275,19275,19275 19625,19625,19625 19975,19975,19975 20326,20326,20326 20676,20676,20676 21027,21027,21027 21377,21377,21377 21728,21728,21728 22078,22078,22078 22429,22429,22429 22779,22779,22779 23130,23130,23130 23480,23480,23480 23830,23830,23830 24181,24181,24181 24531,24531,24531 24882,24882,24882 25232,25232,25232 25583,25583,25583 25933,25933,25933 26284,26284,26284 26634,26634,26634 26985,26985,26985 27335,27335,27335 27685,27685,27685 28036,28036,28036 28386,28386,28386 28737,28737,28737 29087,29087,29087 29438,29438,29438 29788,29788,29788 30139,30139,30139 30489,30489,30489 30840,30840,30840 31190,31190,31190 31540,31540,31540 31891,31891,31891 32241,32241,32241 32592,32592,32592 32942,32942,32942 33293,33293,33293 33643,33643,33643 33994,33994,33994 34344,34344,34344 34695,34695,34695 35045,35045,35045 35395,35395,35395 35746,35746,35746 36096,36096,36096 36447,36447,36447 36797,36797,36797 37148,37148,37148 37498,37498,37498 37849,37849,37849 38199,38199,38199 38550,38550,38550 38900,38900,38900 39250,39250,39250 39601,39601,39601 39951,39951,39951 40302,40302,40302 40652,40652,40652 41003,41003,41003 41353,41353,41353 41704,41704,41704 42054,42054,42054 42405,42405,42405 42755,42755,42755 43105,43105,43105 43456,43456,43456 43806,43806,43806 44157,44157,44157 44507,44507,44507 44858,44858,44858 45208,45208,45208 45559,45559,45559 45909,45909,45909 46260,46260,46260 46610,46610,46610 46960,46960,46960 47311,47311,47311 47661,47661,47661 48012,48012,48012 48362,48362,48362 48713,48713,48713 49063,49063,49063 49414,49414,49414 49764,49764,49764 50115,50115,50115 50465,50465,50465 50815,50815,50815 51166,51166,51166 51516,51516,51516 51867,51867,51867 52217,52217,52217 52568,52568,52568 52918,52918,52918 53269,53269,53269 53619,53619,53619 53970,53970,53970 54320,54320,54320 54670,54670,54670 55021,55021,55021 55371,55371,55371 55722,55722,55722 56072,56072,56072 56423,56423,56423 56773,56773,56773 57124,57124,57124 57474,57474,57474 57825,57825,57825 58175,58175,58175 58525,58525,58525 58876,58876,58876 59226,59226,59226 59577,59577,59577 59927,59927,59927 60278,60278,60278 60628,60628,60628 60979,60979,60979 61329,61329,61329 61680,61680,61680 62030,62030,62030 62380,62380,62380 62731,62731,62731 63081,63081,63081 63432,63432,63432 63782,63782,63782 64133,64133,64133 64483,64483,64483 64834,64834,64834 65184,65184,65184 65535,65535,65535 ########## g189.clr 0,0,0 348,348,348 697,697,697 1045,1045,1045 1394,1394,1394 1742,1742,1742 2091,2091,2091 2440,2440,2440 2788,2788,2788 3137,3137,3137 3485,3485,3485 3834,3834,3834 4183,4183,4183 4531,4531,4531 4880,4880,4880 5228,5228,5228 5577,5577,5577 5926,5926,5926 6274,6274,6274 6623,6623,6623 6971,6971,6971 7320,7320,7320 7668,7668,7668 8017,8017,8017 8366,8366,8366 8714,8714,8714 9063,9063,9063 9411,9411,9411 9760,9760,9760 10109,10109,10109 10457,10457,10457 10806,10806,10806 11154,11154,11154 11503,11503,11503 11852,11852,11852 12200,12200,12200 12549,12549,12549 12897,12897,12897 13246,13246,13246 13595,13595,13595 13943,13943,13943 14292,14292,14292 14640,14640,14640 14989,14989,14989 15337,15337,15337 15686,15686,15686 16035,16035,16035 16383,16383,16383 16732,16732,16732 17080,17080,17080 17429,17429,17429 17778,17778,17778 18126,18126,18126 18475,18475,18475 18823,18823,18823 19172,19172,19172 19521,19521,19521 19869,19869,19869 20218,20218,20218 20566,20566,20566 20915,20915,20915 21264,21264,21264 21612,21612,21612 21961,21961,21961 22309,22309,22309 22658,22658,22658 23006,23006,23006 23355,23355,23355 23704,23704,23704 24052,24052,24052 24401,24401,24401 24749,24749,24749 25098,25098,25098 25447,25447,25447 25795,25795,25795 26144,26144,26144 26492,26492,26492 26841,26841,26841 27190,27190,27190 27538,27538,27538 27887,27887,27887 28235,28235,28235 28584,28584,28584 28933,28933,28933 29281,29281,29281 29630,29630,29630 29978,29978,29978 30327,30327,30327 30675,30675,30675 31024,31024,31024 31373,31373,31373 31721,31721,31721 32070,32070,32070 32418,32418,32418 32767,32767,32767 33116,33116,33116 33464,33464,33464 33813,33813,33813 34161,34161,34161 34510,34510,34510 34859,34859,34859 35207,35207,35207 35556,35556,35556 35904,35904,35904 36253,36253,36253 36601,36601,36601 36950,36950,36950 37299,37299,37299 37647,37647,37647 37996,37996,37996 38344,38344,38344 38693,38693,38693 39042,39042,39042 39390,39390,39390 39739,39739,39739 40087,40087,40087 40436,40436,40436 40785,40785,40785 41133,41133,41133 41482,41482,41482 41830,41830,41830 42179,42179,42179 42528,42528,42528 42876,42876,42876 43225,43225,43225 43573,43573,43573 43922,43922,43922 44270,44270,44270 44619,44619,44619 44968,44968,44968 45316,45316,45316 45665,45665,45665 46013,46013,46013 46362,46362,46362 46711,46711,46711 47059,47059,47059 47408,47408,47408 47756,47756,47756 48105,48105,48105 48454,48454,48454 48802,48802,48802 49151,49151,49151 49499,49499,49499 49848,49848,49848 50197,50197,50197 50545,50545,50545 50894,50894,50894 51242,51242,51242 51591,51591,51591 51939,51939,51939 52288,52288,52288 52637,52637,52637 52985,52985,52985 53334,53334,53334 53682,53682,53682 54031,54031,54031 54380,54380,54380 54728,54728,54728 55077,55077,55077 55425,55425,55425 55774,55774,55774 56123,56123,56123 56471,56471,56471 56820,56820,56820 57168,57168,57168 57517,57517,57517 57866,57866,57866 58214,58214,58214 58563,58563,58563 58911,58911,58911 59260,59260,59260 59608,59608,59608 59957,59957,59957 60306,60306,60306 60654,60654,60654 61003,61003,61003 61351,61351,61351 61700,61700,61700 62049,62049,62049 62397,62397,62397 62746,62746,62746 63094,63094,63094 63443,63443,63443 63792,63792,63792 64140,64140,64140 64489,64489,64489 64837,64837,64837 65186,65186,65186 65535,65535,65535 ########## g19.clr 0,0,0 3640,3640,3640 7281,7281,7281 10922,10922,10922 14563,14563,14563 18204,18204,18204 21845,21845,21845 25485,25485,25485 29126,29126,29126 32767,32767,32767 36408,36408,36408 40049,40049,40049 43690,43690,43690 47330,47330,47330 50971,50971,50971 54612,54612,54612 58253,58253,58253 61894,61894,61894 65534,65534,65534 ########## g190.clr 0,0,0 346,346,346 693,693,693 1040,1040,1040 1386,1386,1386 1733,1733,1733 2080,2080,2080 2427,2427,2427 2773,2773,2773 3120,3120,3120 3467,3467,3467 3814,3814,3814 4160,4160,4160 4507,4507,4507 4854,4854,4854 5201,5201,5201 5547,5547,5547 5894,5894,5894 6241,6241,6241 6588,6588,6588 6934,6934,6934 7281,7281,7281 7628,7628,7628 7975,7975,7975 8321,8321,8321 8668,8668,8668 9015,9015,9015 9362,9362,9362 9708,9708,9708 10055,10055,10055 10402,10402,10402 10749,10749,10749 11095,11095,11095 11442,11442,11442 11789,11789,11789 12136,12136,12136 12482,12482,12482 12829,12829,12829 13176,13176,13176 13523,13523,13523 13869,13869,13869 14216,14216,14216 14563,14563,14563 14910,14910,14910 15256,15256,15256 15603,15603,15603 15950,15950,15950 16297,16297,16297 16643,16643,16643 16990,16990,16990 17337,17337,17337 17684,17684,17684 18030,18030,18030 18377,18377,18377 18724,18724,18724 19071,19071,19071 19417,19417,19417 19764,19764,19764 20111,20111,20111 20458,20458,20458 20804,20804,20804 21151,21151,21151 21498,21498,21498 21845,21845,21845 22191,22191,22191 22538,22538,22538 22885,22885,22885 23231,23231,23231 23578,23578,23578 23925,23925,23925 24272,24272,24272 24618,24618,24618 24965,24965,24965 25312,25312,25312 25659,25659,25659 26005,26005,26005 26352,26352,26352 26699,26699,26699 27046,27046,27046 27392,27392,27392 27739,27739,27739 28086,28086,28086 28433,28433,28433 28779,28779,28779 29126,29126,29126 29473,29473,29473 29820,29820,29820 30166,30166,30166 30513,30513,30513 30860,30860,30860 31207,31207,31207 31553,31553,31553 31900,31900,31900 32247,32247,32247 32594,32594,32594 32940,32940,32940 33287,33287,33287 33634,33634,33634 33981,33981,33981 34327,34327,34327 34674,34674,34674 35021,35021,35021 35368,35368,35368 35714,35714,35714 36061,36061,36061 36408,36408,36408 36755,36755,36755 37101,37101,37101 37448,37448,37448 37795,37795,37795 38142,38142,38142 38488,38488,38488 38835,38835,38835 39182,39182,39182 39529,39529,39529 39875,39875,39875 40222,40222,40222 40569,40569,40569 40916,40916,40916 41262,41262,41262 41609,41609,41609 41956,41956,41956 42303,42303,42303 42649,42649,42649 42996,42996,42996 43343,43343,43343 43690,43690,43690 44036,44036,44036 44383,44383,44383 44730,44730,44730 45076,45076,45076 45423,45423,45423 45770,45770,45770 46117,46117,46117 46463,46463,46463 46810,46810,46810 47157,47157,47157 47504,47504,47504 47850,47850,47850 48197,48197,48197 48544,48544,48544 48891,48891,48891 49237,49237,49237 49584,49584,49584 49931,49931,49931 50278,50278,50278 50624,50624,50624 50971,50971,50971 51318,51318,51318 51665,51665,51665 52011,52011,52011 52358,52358,52358 52705,52705,52705 53052,53052,53052 53398,53398,53398 53745,53745,53745 54092,54092,54092 54439,54439,54439 54785,54785,54785 55132,55132,55132 55479,55479,55479 55826,55826,55826 56172,56172,56172 56519,56519,56519 56866,56866,56866 57213,57213,57213 57559,57559,57559 57906,57906,57906 58253,58253,58253 58600,58600,58600 58946,58946,58946 59293,59293,59293 59640,59640,59640 59987,59987,59987 60333,60333,60333 60680,60680,60680 61027,61027,61027 61374,61374,61374 61720,61720,61720 62067,62067,62067 62414,62414,62414 62761,62761,62761 63107,63107,63107 63454,63454,63454 63801,63801,63801 64148,64148,64148 64494,64494,64494 64841,64841,64841 65188,65188,65188 65535,65535,65535 ########## g191.clr 0,0,0 344,344,344 689,689,689 1034,1034,1034 1379,1379,1379 1724,1724,1724 2069,2069,2069 2414,2414,2414 2759,2759,2759 3104,3104,3104 3449,3449,3449 3794,3794,3794 4139,4139,4139 4483,4483,4483 4828,4828,4828 5173,5173,5173 5518,5518,5518 5863,5863,5863 6208,6208,6208 6553,6553,6553 6898,6898,6898 7243,7243,7243 7588,7588,7588 7933,7933,7933 8278,8278,8278 8623,8623,8623 8967,8967,8967 9312,9312,9312 9657,9657,9657 10002,10002,10002 10347,10347,10347 10692,10692,10692 11037,11037,11037 11382,11382,11382 11727,11727,11727 12072,12072,12072 12417,12417,12417 12762,12762,12762 13107,13107,13107 13451,13451,13451 13796,13796,13796 14141,14141,14141 14486,14486,14486 14831,14831,14831 15176,15176,15176 15521,15521,15521 15866,15866,15866 16211,16211,16211 16556,16556,16556 16901,16901,16901 17246,17246,17246 17590,17590,17590 17935,17935,17935 18280,18280,18280 18625,18625,18625 18970,18970,18970 19315,19315,19315 19660,19660,19660 20005,20005,20005 20350,20350,20350 20695,20695,20695 21040,21040,21040 21385,21385,21385 21730,21730,21730 22074,22074,22074 22419,22419,22419 22764,22764,22764 23109,23109,23109 23454,23454,23454 23799,23799,23799 24144,24144,24144 24489,24489,24489 24834,24834,24834 25179,25179,25179 25524,25524,25524 25869,25869,25869 26214,26214,26214 26558,26558,26558 26903,26903,26903 27248,27248,27248 27593,27593,27593 27938,27938,27938 28283,28283,28283 28628,28628,28628 28973,28973,28973 29318,29318,29318 29663,29663,29663 30008,30008,30008 30353,30353,30353 30697,30697,30697 31042,31042,31042 31387,31387,31387 31732,31732,31732 32077,32077,32077 32422,32422,32422 32767,32767,32767 33112,33112,33112 33457,33457,33457 33802,33802,33802 34147,34147,34147 34492,34492,34492 34837,34837,34837 35181,35181,35181 35526,35526,35526 35871,35871,35871 36216,36216,36216 36561,36561,36561 36906,36906,36906 37251,37251,37251 37596,37596,37596 37941,37941,37941 38286,38286,38286 38631,38631,38631 38976,38976,38976 39321,39321,39321 39665,39665,39665 40010,40010,40010 40355,40355,40355 40700,40700,40700 41045,41045,41045 41390,41390,41390 41735,41735,41735 42080,42080,42080 42425,42425,42425 42770,42770,42770 43115,43115,43115 43460,43460,43460 43804,43804,43804 44149,44149,44149 44494,44494,44494 44839,44839,44839 45184,45184,45184 45529,45529,45529 45874,45874,45874 46219,46219,46219 46564,46564,46564 46909,46909,46909 47254,47254,47254 47599,47599,47599 47944,47944,47944 48288,48288,48288 48633,48633,48633 48978,48978,48978 49323,49323,49323 49668,49668,49668 50013,50013,50013 50358,50358,50358 50703,50703,50703 51048,51048,51048 51393,51393,51393 51738,51738,51738 52083,52083,52083 52428,52428,52428 52772,52772,52772 53117,53117,53117 53462,53462,53462 53807,53807,53807 54152,54152,54152 54497,54497,54497 54842,54842,54842 55187,55187,55187 55532,55532,55532 55877,55877,55877 56222,56222,56222 56567,56567,56567 56911,56911,56911 57256,57256,57256 57601,57601,57601 57946,57946,57946 58291,58291,58291 58636,58636,58636 58981,58981,58981 59326,59326,59326 59671,59671,59671 60016,60016,60016 60361,60361,60361 60706,60706,60706 61051,61051,61051 61395,61395,61395 61740,61740,61740 62085,62085,62085 62430,62430,62430 62775,62775,62775 63120,63120,63120 63465,63465,63465 63810,63810,63810 64155,64155,64155 64500,64500,64500 64845,64845,64845 65190,65190,65190 65535,65535,65535 ########## g192.clr 0,0,0 343,343,343 686,686,686 1029,1029,1029 1372,1372,1372 1715,1715,1715 2058,2058,2058 2401,2401,2401 2744,2744,2744 3088,3088,3088 3431,3431,3431 3774,3774,3774 4117,4117,4117 4460,4460,4460 4803,4803,4803 5146,5146,5146 5489,5489,5489 5832,5832,5832 6176,6176,6176 6519,6519,6519 6862,6862,6862 7205,7205,7205 7548,7548,7548 7891,7891,7891 8234,8234,8234 8577,8577,8577 8920,8920,8920 9264,9264,9264 9607,9607,9607 9950,9950,9950 10293,10293,10293 10636,10636,10636 10979,10979,10979 11322,11322,11322 11665,11665,11665 12009,12009,12009 12352,12352,12352 12695,12695,12695 13038,13038,13038 13381,13381,13381 13724,13724,13724 14067,14067,14067 14410,14410,14410 14753,14753,14753 15097,15097,15097 15440,15440,15440 15783,15783,15783 16126,16126,16126 16469,16469,16469 16812,16812,16812 17155,17155,17155 17498,17498,17498 17841,17841,17841 18185,18185,18185 18528,18528,18528 18871,18871,18871 19214,19214,19214 19557,19557,19557 19900,19900,19900 20243,20243,20243 20586,20586,20586 20930,20930,20930 21273,21273,21273 21616,21616,21616 21959,21959,21959 22302,22302,22302 22645,22645,22645 22988,22988,22988 23331,23331,23331 23674,23674,23674 24018,24018,24018 24361,24361,24361 24704,24704,24704 25047,25047,25047 25390,25390,25390 25733,25733,25733 26076,26076,26076 26419,26419,26419 26762,26762,26762 27106,27106,27106 27449,27449,27449 27792,27792,27792 28135,28135,28135 28478,28478,28478 28821,28821,28821 29164,29164,29164 29507,29507,29507 29851,29851,29851 30194,30194,30194 30537,30537,30537 30880,30880,30880 31223,31223,31223 31566,31566,31566 31909,31909,31909 32252,32252,32252 32595,32595,32595 32939,32939,32939 33282,33282,33282 33625,33625,33625 33968,33968,33968 34311,34311,34311 34654,34654,34654 34997,34997,34997 35340,35340,35340 35683,35683,35683 36027,36027,36027 36370,36370,36370 36713,36713,36713 37056,37056,37056 37399,37399,37399 37742,37742,37742 38085,38085,38085 38428,38428,38428 38772,38772,38772 39115,39115,39115 39458,39458,39458 39801,39801,39801 40144,40144,40144 40487,40487,40487 40830,40830,40830 41173,41173,41173 41516,41516,41516 41860,41860,41860 42203,42203,42203 42546,42546,42546 42889,42889,42889 43232,43232,43232 43575,43575,43575 43918,43918,43918 44261,44261,44261 44604,44604,44604 44948,44948,44948 45291,45291,45291 45634,45634,45634 45977,45977,45977 46320,46320,46320 46663,46663,46663 47006,47006,47006 47349,47349,47349 47693,47693,47693 48036,48036,48036 48379,48379,48379 48722,48722,48722 49065,49065,49065 49408,49408,49408 49751,49751,49751 50094,50094,50094 50437,50437,50437 50781,50781,50781 51124,51124,51124 51467,51467,51467 51810,51810,51810 52153,52153,52153 52496,52496,52496 52839,52839,52839 53182,53182,53182 53525,53525,53525 53869,53869,53869 54212,54212,54212 54555,54555,54555 54898,54898,54898 55241,55241,55241 55584,55584,55584 55927,55927,55927 56270,56270,56270 56614,56614,56614 56957,56957,56957 57300,57300,57300 57643,57643,57643 57986,57986,57986 58329,58329,58329 58672,58672,58672 59015,59015,59015 59358,59358,59358 59702,59702,59702 60045,60045,60045 60388,60388,60388 60731,60731,60731 61074,61074,61074 61417,61417,61417 61760,61760,61760 62103,62103,62103 62446,62446,62446 62790,62790,62790 63133,63133,63133 63476,63476,63476 63819,63819,63819 64162,64162,64162 64505,64505,64505 64848,64848,64848 65191,65191,65191 65535,65535,65535 ########## g193.clr 0,0,0 341,341,341 682,682,682 1023,1023,1023 1365,1365,1365 1706,1706,1706 2047,2047,2047 2389,2389,2389 2730,2730,2730 3071,3071,3071 3413,3413,3413 3754,3754,3754 4095,4095,4095 4437,4437,4437 4778,4778,4778 5119,5119,5119 5461,5461,5461 5802,5802,5802 6143,6143,6143 6485,6485,6485 6826,6826,6826 7167,7167,7167 7509,7509,7509 7850,7850,7850 8191,8191,8191 8533,8533,8533 8874,8874,8874 9215,9215,9215 9557,9557,9557 9898,9898,9898 10239,10239,10239 10581,10581,10581 10922,10922,10922 11263,11263,11263 11605,11605,11605 11946,11946,11946 12287,12287,12287 12629,12629,12629 12970,12970,12970 13311,13311,13311 13653,13653,13653 13994,13994,13994 14335,14335,14335 14677,14677,14677 15018,15018,15018 15359,15359,15359 15701,15701,15701 16042,16042,16042 16383,16383,16383 16725,16725,16725 17066,17066,17066 17407,17407,17407 17749,17749,17749 18090,18090,18090 18431,18431,18431 18773,18773,18773 19114,19114,19114 19455,19455,19455 19797,19797,19797 20138,20138,20138 20479,20479,20479 20821,20821,20821 21162,21162,21162 21503,21503,21503 21845,21845,21845 22186,22186,22186 22527,22527,22527 22868,22868,22868 23210,23210,23210 23551,23551,23551 23892,23892,23892 24234,24234,24234 24575,24575,24575 24916,24916,24916 25258,25258,25258 25599,25599,25599 25940,25940,25940 26282,26282,26282 26623,26623,26623 26964,26964,26964 27306,27306,27306 27647,27647,27647 27988,27988,27988 28330,28330,28330 28671,28671,28671 29012,29012,29012 29354,29354,29354 29695,29695,29695 30036,30036,30036 30378,30378,30378 30719,30719,30719 31060,31060,31060 31402,31402,31402 31743,31743,31743 32084,32084,32084 32426,32426,32426 32767,32767,32767 33108,33108,33108 33450,33450,33450 33791,33791,33791 34132,34132,34132 34474,34474,34474 34815,34815,34815 35156,35156,35156 35498,35498,35498 35839,35839,35839 36180,36180,36180 36522,36522,36522 36863,36863,36863 37204,37204,37204 37546,37546,37546 37887,37887,37887 38228,38228,38228 38570,38570,38570 38911,38911,38911 39252,39252,39252 39594,39594,39594 39935,39935,39935 40276,40276,40276 40618,40618,40618 40959,40959,40959 41300,41300,41300 41642,41642,41642 41983,41983,41983 42324,42324,42324 42666,42666,42666 43007,43007,43007 43348,43348,43348 43690,43690,43690 44031,44031,44031 44372,44372,44372 44713,44713,44713 45055,45055,45055 45396,45396,45396 45737,45737,45737 46079,46079,46079 46420,46420,46420 46761,46761,46761 47103,47103,47103 47444,47444,47444 47785,47785,47785 48127,48127,48127 48468,48468,48468 48809,48809,48809 49151,49151,49151 49492,49492,49492 49833,49833,49833 50175,50175,50175 50516,50516,50516 50857,50857,50857 51199,51199,51199 51540,51540,51540 51881,51881,51881 52223,52223,52223 52564,52564,52564 52905,52905,52905 53247,53247,53247 53588,53588,53588 53929,53929,53929 54271,54271,54271 54612,54612,54612 54953,54953,54953 55295,55295,55295 55636,55636,55636 55977,55977,55977 56319,56319,56319 56660,56660,56660 57001,57001,57001 57343,57343,57343 57684,57684,57684 58025,58025,58025 58367,58367,58367 58708,58708,58708 59049,59049,59049 59391,59391,59391 59732,59732,59732 60073,60073,60073 60415,60415,60415 60756,60756,60756 61097,61097,61097 61439,61439,61439 61780,61780,61780 62121,62121,62121 62463,62463,62463 62804,62804,62804 63145,63145,63145 63487,63487,63487 63828,63828,63828 64169,64169,64169 64511,64511,64511 64852,64852,64852 65193,65193,65193 65535,65535,65535 ########## g194.clr 0,0,0 339,339,339 679,679,679 1018,1018,1018 1358,1358,1358 1697,1697,1697 2037,2037,2037 2376,2376,2376 2716,2716,2716 3056,3056,3056 3395,3395,3395 3735,3735,3735 4074,4074,4074 4414,4414,4414 4753,4753,4753 5093,5093,5093 5432,5432,5432 5772,5772,5772 6112,6112,6112 6451,6451,6451 6791,6791,6791 7130,7130,7130 7470,7470,7470 7809,7809,7809 8149,8149,8149 8488,8488,8488 8828,8828,8828 9168,9168,9168 9507,9507,9507 9847,9847,9847 10186,10186,10186 10526,10526,10526 10865,10865,10865 11205,11205,11205 11545,11545,11545 11884,11884,11884 12224,12224,12224 12563,12563,12563 12903,12903,12903 13242,13242,13242 13582,13582,13582 13921,13921,13921 14261,14261,14261 14601,14601,14601 14940,14940,14940 15280,15280,15280 15619,15619,15619 15959,15959,15959 16298,16298,16298 16638,16638,16638 16977,16977,16977 17317,17317,17317 17657,17657,17657 17996,17996,17996 18336,18336,18336 18675,18675,18675 19015,19015,19015 19354,19354,19354 19694,19694,19694 20034,20034,20034 20373,20373,20373 20713,20713,20713 21052,21052,21052 21392,21392,21392 21731,21731,21731 22071,22071,22071 22410,22410,22410 22750,22750,22750 23090,23090,23090 23429,23429,23429 23769,23769,23769 24108,24108,24108 24448,24448,24448 24787,24787,24787 25127,25127,25127 25466,25466,25466 25806,25806,25806 26146,26146,26146 26485,26485,26485 26825,26825,26825 27164,27164,27164 27504,27504,27504 27843,27843,27843 28183,28183,28183 28523,28523,28523 28862,28862,28862 29202,29202,29202 29541,29541,29541 29881,29881,29881 30220,30220,30220 30560,30560,30560 30899,30899,30899 31239,31239,31239 31579,31579,31579 31918,31918,31918 32258,32258,32258 32597,32597,32597 32937,32937,32937 33276,33276,33276 33616,33616,33616 33955,33955,33955 34295,34295,34295 34635,34635,34635 34974,34974,34974 35314,35314,35314 35653,35653,35653 35993,35993,35993 36332,36332,36332 36672,36672,36672 37011,37011,37011 37351,37351,37351 37691,37691,37691 38030,38030,38030 38370,38370,38370 38709,38709,38709 39049,39049,39049 39388,39388,39388 39728,39728,39728 40068,40068,40068 40407,40407,40407 40747,40747,40747 41086,41086,41086 41426,41426,41426 41765,41765,41765 42105,42105,42105 42444,42444,42444 42784,42784,42784 43124,43124,43124 43463,43463,43463 43803,43803,43803 44142,44142,44142 44482,44482,44482 44821,44821,44821 45161,45161,45161 45500,45500,45500 45840,45840,45840 46180,46180,46180 46519,46519,46519 46859,46859,46859 47198,47198,47198 47538,47538,47538 47877,47877,47877 48217,48217,48217 48557,48557,48557 48896,48896,48896 49236,49236,49236 49575,49575,49575 49915,49915,49915 50254,50254,50254 50594,50594,50594 50933,50933,50933 51273,51273,51273 51613,51613,51613 51952,51952,51952 52292,52292,52292 52631,52631,52631 52971,52971,52971 53310,53310,53310 53650,53650,53650 53989,53989,53989 54329,54329,54329 54669,54669,54669 55008,55008,55008 55348,55348,55348 55687,55687,55687 56027,56027,56027 56366,56366,56366 56706,56706,56706 57046,57046,57046 57385,57385,57385 57725,57725,57725 58064,58064,58064 58404,58404,58404 58743,58743,58743 59083,59083,59083 59422,59422,59422 59762,59762,59762 60102,60102,60102 60441,60441,60441 60781,60781,60781 61120,61120,61120 61460,61460,61460 61799,61799,61799 62139,62139,62139 62478,62478,62478 62818,62818,62818 63158,63158,63158 63497,63497,63497 63837,63837,63837 64176,64176,64176 64516,64516,64516 64855,64855,64855 65195,65195,65195 65535,65535,65535 ########## g195.clr 0,0,0 337,337,337 675,675,675 1013,1013,1013 1351,1351,1351 1689,1689,1689 2026,2026,2026 2364,2364,2364 2702,2702,2702 3040,3040,3040 3378,3378,3378 3715,3715,3715 4053,4053,4053 4391,4391,4391 4729,4729,4729 5067,5067,5067 5404,5404,5404 5742,5742,5742 6080,6080,6080 6418,6418,6418 6756,6756,6756 7093,7093,7093 7431,7431,7431 7769,7769,7769 8107,8107,8107 8445,8445,8445 8783,8783,8783 9120,9120,9120 9458,9458,9458 9796,9796,9796 10134,10134,10134 10472,10472,10472 10809,10809,10809 11147,11147,11147 11485,11485,11485 11823,11823,11823 12161,12161,12161 12498,12498,12498 12836,12836,12836 13174,13174,13174 13512,13512,13512 13850,13850,13850 14187,14187,14187 14525,14525,14525 14863,14863,14863 15201,15201,15201 15539,15539,15539 15877,15877,15877 16214,16214,16214 16552,16552,16552 16890,16890,16890 17228,17228,17228 17566,17566,17566 17903,17903,17903 18241,18241,18241 18579,18579,18579 18917,18917,18917 19255,19255,19255 19592,19592,19592 19930,19930,19930 20268,20268,20268 20606,20606,20606 20944,20944,20944 21281,21281,21281 21619,21619,21619 21957,21957,21957 22295,22295,22295 22633,22633,22633 22971,22971,22971 23308,23308,23308 23646,23646,23646 23984,23984,23984 24322,24322,24322 24660,24660,24660 24997,24997,24997 25335,25335,25335 25673,25673,25673 26011,26011,26011 26349,26349,26349 26686,26686,26686 27024,27024,27024 27362,27362,27362 27700,27700,27700 28038,28038,28038 28375,28375,28375 28713,28713,28713 29051,29051,29051 29389,29389,29389 29727,29727,29727 30065,30065,30065 30402,30402,30402 30740,30740,30740 31078,31078,31078 31416,31416,31416 31754,31754,31754 32091,32091,32091 32429,32429,32429 32767,32767,32767 33105,33105,33105 33443,33443,33443 33780,33780,33780 34118,34118,34118 34456,34456,34456 34794,34794,34794 35132,35132,35132 35469,35469,35469 35807,35807,35807 36145,36145,36145 36483,36483,36483 36821,36821,36821 37159,37159,37159 37496,37496,37496 37834,37834,37834 38172,38172,38172 38510,38510,38510 38848,38848,38848 39185,39185,39185 39523,39523,39523 39861,39861,39861 40199,40199,40199 40537,40537,40537 40874,40874,40874 41212,41212,41212 41550,41550,41550 41888,41888,41888 42226,42226,42226 42563,42563,42563 42901,42901,42901 43239,43239,43239 43577,43577,43577 43915,43915,43915 44253,44253,44253 44590,44590,44590 44928,44928,44928 45266,45266,45266 45604,45604,45604 45942,45942,45942 46279,46279,46279 46617,46617,46617 46955,46955,46955 47293,47293,47293 47631,47631,47631 47968,47968,47968 48306,48306,48306 48644,48644,48644 48982,48982,48982 49320,49320,49320 49657,49657,49657 49995,49995,49995 50333,50333,50333 50671,50671,50671 51009,51009,51009 51347,51347,51347 51684,51684,51684 52022,52022,52022 52360,52360,52360 52698,52698,52698 53036,53036,53036 53373,53373,53373 53711,53711,53711 54049,54049,54049 54387,54387,54387 54725,54725,54725 55062,55062,55062 55400,55400,55400 55738,55738,55738 56076,56076,56076 56414,56414,56414 56751,56751,56751 57089,57089,57089 57427,57427,57427 57765,57765,57765 58103,58103,58103 58441,58441,58441 58778,58778,58778 59116,59116,59116 59454,59454,59454 59792,59792,59792 60130,60130,60130 60467,60467,60467 60805,60805,60805 61143,61143,61143 61481,61481,61481 61819,61819,61819 62156,62156,62156 62494,62494,62494 62832,62832,62832 63170,63170,63170 63508,63508,63508 63845,63845,63845 64183,64183,64183 64521,64521,64521 64859,64859,64859 65197,65197,65197 65535,65535,65535 ########## g196.clr 0,0,0 336,336,336 672,672,672 1008,1008,1008 1344,1344,1344 1680,1680,1680 2016,2016,2016 2352,2352,2352 2688,2688,2688 3024,3024,3024 3360,3360,3360 3696,3696,3696 4032,4032,4032 4369,4369,4369 4705,4705,4705 5041,5041,5041 5377,5377,5377 5713,5713,5713 6049,6049,6049 6385,6385,6385 6721,6721,6721 7057,7057,7057 7393,7393,7393 7729,7729,7729 8065,8065,8065 8401,8401,8401 8738,8738,8738 9074,9074,9074 9410,9410,9410 9746,9746,9746 10082,10082,10082 10418,10418,10418 10754,10754,10754 11090,11090,11090 11426,11426,11426 11762,11762,11762 12098,12098,12098 12434,12434,12434 12770,12770,12770 13107,13107,13107 13443,13443,13443 13779,13779,13779 14115,14115,14115 14451,14451,14451 14787,14787,14787 15123,15123,15123 15459,15459,15459 15795,15795,15795 16131,16131,16131 16467,16467,16467 16803,16803,16803 17139,17139,17139 17476,17476,17476 17812,17812,17812 18148,18148,18148 18484,18484,18484 18820,18820,18820 19156,19156,19156 19492,19492,19492 19828,19828,19828 20164,20164,20164 20500,20500,20500 20836,20836,20836 21172,21172,21172 21508,21508,21508 21845,21845,21845 22181,22181,22181 22517,22517,22517 22853,22853,22853 23189,23189,23189 23525,23525,23525 23861,23861,23861 24197,24197,24197 24533,24533,24533 24869,24869,24869 25205,25205,25205 25541,25541,25541 25877,25877,25877 26214,26214,26214 26550,26550,26550 26886,26886,26886 27222,27222,27222 27558,27558,27558 27894,27894,27894 28230,28230,28230 28566,28566,28566 28902,28902,28902 29238,29238,29238 29574,29574,29574 29910,29910,29910 30246,30246,30246 30583,30583,30583 30919,30919,30919 31255,31255,31255 31591,31591,31591 31927,31927,31927 32263,32263,32263 32599,32599,32599 32935,32935,32935 33271,33271,33271 33607,33607,33607 33943,33943,33943 34279,34279,34279 34615,34615,34615 34952,34952,34952 35288,35288,35288 35624,35624,35624 35960,35960,35960 36296,36296,36296 36632,36632,36632 36968,36968,36968 37304,37304,37304 37640,37640,37640 37976,37976,37976 38312,38312,38312 38648,38648,38648 38984,38984,38984 39321,39321,39321 39657,39657,39657 39993,39993,39993 40329,40329,40329 40665,40665,40665 41001,41001,41001 41337,41337,41337 41673,41673,41673 42009,42009,42009 42345,42345,42345 42681,42681,42681 43017,43017,43017 43353,43353,43353 43690,43690,43690 44026,44026,44026 44362,44362,44362 44698,44698,44698 45034,45034,45034 45370,45370,45370 45706,45706,45706 46042,46042,46042 46378,46378,46378 46714,46714,46714 47050,47050,47050 47386,47386,47386 47722,47722,47722 48059,48059,48059 48395,48395,48395 48731,48731,48731 49067,49067,49067 49403,49403,49403 49739,49739,49739 50075,50075,50075 50411,50411,50411 50747,50747,50747 51083,51083,51083 51419,51419,51419 51755,51755,51755 52091,52091,52091 52428,52428,52428 52764,52764,52764 53100,53100,53100 53436,53436,53436 53772,53772,53772 54108,54108,54108 54444,54444,54444 54780,54780,54780 55116,55116,55116 55452,55452,55452 55788,55788,55788 56124,56124,56124 56460,56460,56460 56797,56797,56797 57133,57133,57133 57469,57469,57469 57805,57805,57805 58141,58141,58141 58477,58477,58477 58813,58813,58813 59149,59149,59149 59485,59485,59485 59821,59821,59821 60157,60157,60157 60493,60493,60493 60829,60829,60829 61166,61166,61166 61502,61502,61502 61838,61838,61838 62174,62174,62174 62510,62510,62510 62846,62846,62846 63182,63182,63182 63518,63518,63518 63854,63854,63854 64190,64190,64190 64526,64526,64526 64862,64862,64862 65198,65198,65198 65535,65535,65535 ########## g197.clr 0,0,0 334,334,334 668,668,668 1003,1003,1003 1337,1337,1337 1671,1671,1671 2006,2006,2006 2340,2340,2340 2674,2674,2674 3009,3009,3009 3343,3343,3343 3677,3677,3677 4012,4012,4012 4346,4346,4346 4681,4681,4681 5015,5015,5015 5349,5349,5349 5684,5684,5684 6018,6018,6018 6352,6352,6352 6687,6687,6687 7021,7021,7021 7355,7355,7355 7690,7690,7690 8024,8024,8024 8359,8359,8359 8693,8693,8693 9027,9027,9027 9362,9362,9362 9696,9696,9696 10030,10030,10030 10365,10365,10365 10699,10699,10699 11033,11033,11033 11368,11368,11368 11702,11702,11702 12037,12037,12037 12371,12371,12371 12705,12705,12705 13040,13040,13040 13374,13374,13374 13708,13708,13708 14043,14043,14043 14377,14377,14377 14711,14711,14711 15046,15046,15046 15380,15380,15380 15715,15715,15715 16049,16049,16049 16383,16383,16383 16718,16718,16718 17052,17052,17052 17386,17386,17386 17721,17721,17721 18055,18055,18055 18389,18389,18389 18724,18724,18724 19058,19058,19058 19393,19393,19393 19727,19727,19727 20061,20061,20061 20396,20396,20396 20730,20730,20730 21064,21064,21064 21399,21399,21399 21733,21733,21733 22067,22067,22067 22402,22402,22402 22736,22736,22736 23070,23070,23070 23405,23405,23405 23739,23739,23739 24074,24074,24074 24408,24408,24408 24742,24742,24742 25077,25077,25077 25411,25411,25411 25745,25745,25745 26080,26080,26080 26414,26414,26414 26748,26748,26748 27083,27083,27083 27417,27417,27417 27752,27752,27752 28086,28086,28086 28420,28420,28420 28755,28755,28755 29089,29089,29089 29423,29423,29423 29758,29758,29758 30092,30092,30092 30426,30426,30426 30761,30761,30761 31095,31095,31095 31430,31430,31430 31764,31764,31764 32098,32098,32098 32433,32433,32433 32767,32767,32767 33101,33101,33101 33436,33436,33436 33770,33770,33770 34104,34104,34104 34439,34439,34439 34773,34773,34773 35108,35108,35108 35442,35442,35442 35776,35776,35776 36111,36111,36111 36445,36445,36445 36779,36779,36779 37114,37114,37114 37448,37448,37448 37782,37782,37782 38117,38117,38117 38451,38451,38451 38786,38786,38786 39120,39120,39120 39454,39454,39454 39789,39789,39789 40123,40123,40123 40457,40457,40457 40792,40792,40792 41126,41126,41126 41460,41460,41460 41795,41795,41795 42129,42129,42129 42464,42464,42464 42798,42798,42798 43132,43132,43132 43467,43467,43467 43801,43801,43801 44135,44135,44135 44470,44470,44470 44804,44804,44804 45138,45138,45138 45473,45473,45473 45807,45807,45807 46141,46141,46141 46476,46476,46476 46810,46810,46810 47145,47145,47145 47479,47479,47479 47813,47813,47813 48148,48148,48148 48482,48482,48482 48816,48816,48816 49151,49151,49151 49485,49485,49485 49819,49819,49819 50154,50154,50154 50488,50488,50488 50823,50823,50823 51157,51157,51157 51491,51491,51491 51826,51826,51826 52160,52160,52160 52494,52494,52494 52829,52829,52829 53163,53163,53163 53497,53497,53497 53832,53832,53832 54166,54166,54166 54501,54501,54501 54835,54835,54835 55169,55169,55169 55504,55504,55504 55838,55838,55838 56172,56172,56172 56507,56507,56507 56841,56841,56841 57175,57175,57175 57510,57510,57510 57844,57844,57844 58179,58179,58179 58513,58513,58513 58847,58847,58847 59182,59182,59182 59516,59516,59516 59850,59850,59850 60185,60185,60185 60519,60519,60519 60853,60853,60853 61188,61188,61188 61522,61522,61522 61857,61857,61857 62191,62191,62191 62525,62525,62525 62860,62860,62860 63194,63194,63194 63528,63528,63528 63863,63863,63863 64197,64197,64197 64531,64531,64531 64866,64866,64866 65200,65200,65200 65534,65534,65534 ########## g198.clr 0,0,0 332,332,332 665,665,665 997,997,997 1330,1330,1330 1663,1663,1663 1995,1995,1995 2328,2328,2328 2661,2661,2661 2993,2993,2993 3326,3326,3326 3659,3659,3659 3991,3991,3991 4324,4324,4324 4657,4657,4657 4989,4989,4989 5322,5322,5322 5655,5655,5655 5987,5987,5987 6320,6320,6320 6653,6653,6653 6985,6985,6985 7318,7318,7318 7651,7651,7651 7983,7983,7983 8316,8316,8316 8649,8649,8649 8981,8981,8981 9314,9314,9314 9647,9647,9647 9979,9979,9979 10312,10312,10312 10645,10645,10645 10977,10977,10977 11310,11310,11310 11643,11643,11643 11975,11975,11975 12308,12308,12308 12641,12641,12641 12973,12973,12973 13306,13306,13306 13639,13639,13639 13971,13971,13971 14304,14304,14304 14637,14637,14637 14969,14969,14969 15302,15302,15302 15635,15635,15635 15967,15967,15967 16300,16300,16300 16633,16633,16633 16965,16965,16965 17298,17298,17298 17631,17631,17631 17963,17963,17963 18296,18296,18296 18629,18629,18629 18961,18961,18961 19294,19294,19294 19627,19627,19627 19959,19959,19959 20292,20292,20292 20625,20625,20625 20957,20957,20957 21290,21290,21290 21623,21623,21623 21955,21955,21955 22288,22288,22288 22621,22621,22621 22953,22953,22953 23286,23286,23286 23619,23619,23619 23951,23951,23951 24284,24284,24284 24617,24617,24617 24949,24949,24949 25282,25282,25282 25615,25615,25615 25947,25947,25947 26280,26280,26280 26613,26613,26613 26945,26945,26945 27278,27278,27278 27611,27611,27611 27943,27943,27943 28276,28276,28276 28609,28609,28609 28941,28941,28941 29274,29274,29274 29607,29607,29607 29939,29939,29939 30272,30272,30272 30605,30605,30605 30937,30937,30937 31270,31270,31270 31603,31603,31603 31935,31935,31935 32268,32268,32268 32601,32601,32601 32933,32933,32933 33266,33266,33266 33599,33599,33599 33931,33931,33931 34264,34264,34264 34597,34597,34597 34929,34929,34929 35262,35262,35262 35595,35595,35595 35927,35927,35927 36260,36260,36260 36593,36593,36593 36925,36925,36925 37258,37258,37258 37591,37591,37591 37923,37923,37923 38256,38256,38256 38589,38589,38589 38921,38921,38921 39254,39254,39254 39587,39587,39587 39919,39919,39919 40252,40252,40252 40585,40585,40585 40917,40917,40917 41250,41250,41250 41583,41583,41583 41915,41915,41915 42248,42248,42248 42581,42581,42581 42913,42913,42913 43246,43246,43246 43579,43579,43579 43911,43911,43911 44244,44244,44244 44577,44577,44577 44909,44909,44909 45242,45242,45242 45575,45575,45575 45907,45907,45907 46240,46240,46240 46573,46573,46573 46905,46905,46905 47238,47238,47238 47571,47571,47571 47903,47903,47903 48236,48236,48236 48569,48569,48569 48901,48901,48901 49234,49234,49234 49567,49567,49567 49899,49899,49899 50232,50232,50232 50565,50565,50565 50897,50897,50897 51230,51230,51230 51563,51563,51563 51895,51895,51895 52228,52228,52228 52561,52561,52561 52893,52893,52893 53226,53226,53226 53559,53559,53559 53891,53891,53891 54224,54224,54224 54557,54557,54557 54889,54889,54889 55222,55222,55222 55555,55555,55555 55887,55887,55887 56220,56220,56220 56553,56553,56553 56885,56885,56885 57218,57218,57218 57551,57551,57551 57883,57883,57883 58216,58216,58216 58549,58549,58549 58881,58881,58881 59214,59214,59214 59547,59547,59547 59879,59879,59879 60212,60212,60212 60545,60545,60545 60877,60877,60877 61210,61210,61210 61543,61543,61543 61875,61875,61875 62208,62208,62208 62541,62541,62541 62873,62873,62873 63206,63206,63206 63539,63539,63539 63871,63871,63871 64204,64204,64204 64537,64537,64537 64869,64869,64869 65202,65202,65202 65534,65534,65534 ########## g199.clr 0,0,0 330,330,330 661,661,661 992,992,992 1323,1323,1323 1654,1654,1654 1985,1985,1985 2316,2316,2316 2647,2647,2647 2978,2978,2978 3309,3309,3309 3640,3640,3640 3971,3971,3971 4302,4302,4302 4633,4633,4633 4964,4964,4964 5295,5295,5295 5626,5626,5626 5957,5957,5957 6288,6288,6288 6619,6619,6619 6950,6950,6950 7281,7281,7281 7612,7612,7612 7943,7943,7943 8274,8274,8274 8605,8605,8605 8936,8936,8936 9267,9267,9267 9598,9598,9598 9929,9929,9929 10260,10260,10260 10591,10591,10591 10922,10922,10922 11253,11253,11253 11584,11584,11584 11915,11915,11915 12246,12246,12246 12577,12577,12577 12908,12908,12908 13239,13239,13239 13570,13570,13570 13901,13901,13901 14232,14232,14232 14563,14563,14563 14894,14894,14894 15225,15225,15225 15556,15556,15556 15887,15887,15887 16218,16218,16218 16549,16549,16549 16880,16880,16880 17211,17211,17211 17542,17542,17542 17873,17873,17873 18204,18204,18204 18535,18535,18535 18866,18866,18866 19197,19197,19197 19528,19528,19528 19859,19859,19859 20190,20190,20190 20521,20521,20521 20852,20852,20852 21183,21183,21183 21514,21514,21514 21845,21845,21845 22175,22175,22175 22506,22506,22506 22837,22837,22837 23168,23168,23168 23499,23499,23499 23830,23830,23830 24161,24161,24161 24492,24492,24492 24823,24823,24823 25154,25154,25154 25485,25485,25485 25816,25816,25816 26147,26147,26147 26478,26478,26478 26809,26809,26809 27140,27140,27140 27471,27471,27471 27802,27802,27802 28133,28133,28133 28464,28464,28464 28795,28795,28795 29126,29126,29126 29457,29457,29457 29788,29788,29788 30119,30119,30119 30450,30450,30450 30781,30781,30781 31112,31112,31112 31443,31443,31443 31774,31774,31774 32105,32105,32105 32436,32436,32436 32767,32767,32767 33098,33098,33098 33429,33429,33429 33760,33760,33760 34091,34091,34091 34422,34422,34422 34753,34753,34753 35084,35084,35084 35415,35415,35415 35746,35746,35746 36077,36077,36077 36408,36408,36408 36739,36739,36739 37070,37070,37070 37401,37401,37401 37732,37732,37732 38063,38063,38063 38394,38394,38394 38725,38725,38725 39056,39056,39056 39387,39387,39387 39718,39718,39718 40049,40049,40049 40380,40380,40380 40711,40711,40711 41042,41042,41042 41373,41373,41373 41704,41704,41704 42035,42035,42035 42366,42366,42366 42697,42697,42697 43028,43028,43028 43359,43359,43359 43690,43690,43690 44020,44020,44020 44351,44351,44351 44682,44682,44682 45013,45013,45013 45344,45344,45344 45675,45675,45675 46006,46006,46006 46337,46337,46337 46668,46668,46668 46999,46999,46999 47330,47330,47330 47661,47661,47661 47992,47992,47992 48323,48323,48323 48654,48654,48654 48985,48985,48985 49316,49316,49316 49647,49647,49647 49978,49978,49978 50309,50309,50309 50640,50640,50640 50971,50971,50971 51302,51302,51302 51633,51633,51633 51964,51964,51964 52295,52295,52295 52626,52626,52626 52957,52957,52957 53288,53288,53288 53619,53619,53619 53950,53950,53950 54281,54281,54281 54612,54612,54612 54943,54943,54943 55274,55274,55274 55605,55605,55605 55936,55936,55936 56267,56267,56267 56598,56598,56598 56929,56929,56929 57260,57260,57260 57591,57591,57591 57922,57922,57922 58253,58253,58253 58584,58584,58584 58915,58915,58915 59246,59246,59246 59577,59577,59577 59908,59908,59908 60239,60239,60239 60570,60570,60570 60901,60901,60901 61232,61232,61232 61563,61563,61563 61894,61894,61894 62225,62225,62225 62556,62556,62556 62887,62887,62887 63218,63218,63218 63549,63549,63549 63880,63880,63880 64211,64211,64211 64542,64542,64542 64873,64873,64873 65204,65204,65204 65535,65535,65535 ########## g2.clr 0,0,0 65535,65535,65535 ########## g20.clr 0,0,0 3449,3449,3449 6898,6898,6898 10347,10347,10347 13796,13796,13796 17246,17246,17246 20695,20695,20695 24144,24144,24144 27593,27593,27593 31042,31042,31042 34492,34492,34492 37941,37941,37941 41390,41390,41390 44839,44839,44839 48288,48288,48288 51738,51738,51738 55187,55187,55187 58636,58636,58636 62085,62085,62085 65534,65534,65534 ########## g200.clr 0,0,0 329,329,329 658,658,658 987,987,987 1317,1317,1317 1646,1646,1646 1975,1975,1975 2305,2305,2305 2634,2634,2634 2963,2963,2963 3293,3293,3293 3622,3622,3622 3951,3951,3951 4281,4281,4281 4610,4610,4610 4939,4939,4939 5269,5269,5269 5598,5598,5598 5927,5927,5927 6257,6257,6257 6586,6586,6586 6915,6915,6915 7245,7245,7245 7574,7574,7574 7903,7903,7903 8233,8233,8233 8562,8562,8562 8891,8891,8891 9221,9221,9221 9550,9550,9550 9879,9879,9879 10208,10208,10208 10538,10538,10538 10867,10867,10867 11196,11196,11196 11526,11526,11526 11855,11855,11855 12184,12184,12184 12514,12514,12514 12843,12843,12843 13172,13172,13172 13502,13502,13502 13831,13831,13831 14160,14160,14160 14490,14490,14490 14819,14819,14819 15148,15148,15148 15478,15478,15478 15807,15807,15807 16136,16136,16136 16466,16466,16466 16795,16795,16795 17124,17124,17124 17454,17454,17454 17783,17783,17783 18112,18112,18112 18442,18442,18442 18771,18771,18771 19100,19100,19100 19429,19429,19429 19759,19759,19759 20088,20088,20088 20417,20417,20417 20747,20747,20747 21076,21076,21076 21405,21405,21405 21735,21735,21735 22064,22064,22064 22393,22393,22393 22723,22723,22723 23052,23052,23052 23381,23381,23381 23711,23711,23711 24040,24040,24040 24369,24369,24369 24699,24699,24699 25028,25028,25028 25357,25357,25357 25687,25687,25687 26016,26016,26016 26345,26345,26345 26675,26675,26675 27004,27004,27004 27333,27333,27333 27663,27663,27663 27992,27992,27992 28321,28321,28321 28650,28650,28650 28980,28980,28980 29309,29309,29309 29638,29638,29638 29968,29968,29968 30297,30297,30297 30626,30626,30626 30956,30956,30956 31285,31285,31285 31614,31614,31614 31944,31944,31944 32273,32273,32273 32602,32602,32602 32932,32932,32932 33261,33261,33261 33590,33590,33590 33920,33920,33920 34249,34249,34249 34578,34578,34578 34908,34908,34908 35237,35237,35237 35566,35566,35566 35896,35896,35896 36225,36225,36225 36554,36554,36554 36884,36884,36884 37213,37213,37213 37542,37542,37542 37871,37871,37871 38201,38201,38201 38530,38530,38530 38859,38859,38859 39189,39189,39189 39518,39518,39518 39847,39847,39847 40177,40177,40177 40506,40506,40506 40835,40835,40835 41165,41165,41165 41494,41494,41494 41823,41823,41823 42153,42153,42153 42482,42482,42482 42811,42811,42811 43141,43141,43141 43470,43470,43470 43799,43799,43799 44129,44129,44129 44458,44458,44458 44787,44787,44787 45117,45117,45117 45446,45446,45446 45775,45775,45775 46105,46105,46105 46434,46434,46434 46763,46763,46763 47092,47092,47092 47422,47422,47422 47751,47751,47751 48080,48080,48080 48410,48410,48410 48739,48739,48739 49068,49068,49068 49398,49398,49398 49727,49727,49727 50056,50056,50056 50386,50386,50386 50715,50715,50715 51044,51044,51044 51374,51374,51374 51703,51703,51703 52032,52032,52032 52362,52362,52362 52691,52691,52691 53020,53020,53020 53350,53350,53350 53679,53679,53679 54008,54008,54008 54338,54338,54338 54667,54667,54667 54996,54996,54996 55326,55326,55326 55655,55655,55655 55984,55984,55984 56313,56313,56313 56643,56643,56643 56972,56972,56972 57301,57301,57301 57631,57631,57631 57960,57960,57960 58289,58289,58289 58619,58619,58619 58948,58948,58948 59277,59277,59277 59607,59607,59607 59936,59936,59936 60265,60265,60265 60595,60595,60595 60924,60924,60924 61253,61253,61253 61583,61583,61583 61912,61912,61912 62241,62241,62241 62571,62571,62571 62900,62900,62900 63229,63229,63229 63559,63559,63559 63888,63888,63888 64217,64217,64217 64547,64547,64547 64876,64876,64876 65205,65205,65205 65535,65535,65535 ########## g201.clr 0,0,0 327,327,327 655,655,655 983,983,983 1310,1310,1310 1638,1638,1638 1966,1966,1966 2293,2293,2293 2621,2621,2621 2949,2949,2949 3276,3276,3276 3604,3604,3604 3932,3932,3932 4259,4259,4259 4587,4587,4587 4915,4915,4915 5242,5242,5242 5570,5570,5570 5898,5898,5898 6225,6225,6225 6553,6553,6553 6881,6881,6881 7208,7208,7208 7536,7536,7536 7864,7864,7864 8191,8191,8191 8519,8519,8519 8847,8847,8847 9174,9174,9174 9502,9502,9502 9830,9830,9830 10157,10157,10157 10485,10485,10485 10813,10813,10813 11140,11140,11140 11468,11468,11468 11796,11796,11796 12123,12123,12123 12451,12451,12451 12779,12779,12779 13107,13107,13107 13434,13434,13434 13762,13762,13762 14090,14090,14090 14417,14417,14417 14745,14745,14745 15073,15073,15073 15400,15400,15400 15728,15728,15728 16056,16056,16056 16383,16383,16383 16711,16711,16711 17039,17039,17039 17366,17366,17366 17694,17694,17694 18022,18022,18022 18349,18349,18349 18677,18677,18677 19005,19005,19005 19332,19332,19332 19660,19660,19660 19988,19988,19988 20315,20315,20315 20643,20643,20643 20971,20971,20971 21298,21298,21298 21626,21626,21626 21954,21954,21954 22281,22281,22281 22609,22609,22609 22937,22937,22937 23264,23264,23264 23592,23592,23592 23920,23920,23920 24247,24247,24247 24575,24575,24575 24903,24903,24903 25230,25230,25230 25558,25558,25558 25886,25886,25886 26214,26214,26214 26541,26541,26541 26869,26869,26869 27197,27197,27197 27524,27524,27524 27852,27852,27852 28180,28180,28180 28507,28507,28507 28835,28835,28835 29163,29163,29163 29490,29490,29490 29818,29818,29818 30146,30146,30146 30473,30473,30473 30801,30801,30801 31129,31129,31129 31456,31456,31456 31784,31784,31784 32112,32112,32112 32439,32439,32439 32767,32767,32767 33095,33095,33095 33422,33422,33422 33750,33750,33750 34078,34078,34078 34405,34405,34405 34733,34733,34733 35061,35061,35061 35388,35388,35388 35716,35716,35716 36044,36044,36044 36371,36371,36371 36699,36699,36699 37027,37027,37027 37354,37354,37354 37682,37682,37682 38010,38010,38010 38337,38337,38337 38665,38665,38665 38993,38993,38993 39321,39321,39321 39648,39648,39648 39976,39976,39976 40304,40304,40304 40631,40631,40631 40959,40959,40959 41287,41287,41287 41614,41614,41614 41942,41942,41942 42270,42270,42270 42597,42597,42597 42925,42925,42925 43253,43253,43253 43580,43580,43580 43908,43908,43908 44236,44236,44236 44563,44563,44563 44891,44891,44891 45219,45219,45219 45546,45546,45546 45874,45874,45874 46202,46202,46202 46529,46529,46529 46857,46857,46857 47185,47185,47185 47512,47512,47512 47840,47840,47840 48168,48168,48168 48495,48495,48495 48823,48823,48823 49151,49151,49151 49478,49478,49478 49806,49806,49806 50134,50134,50134 50461,50461,50461 50789,50789,50789 51117,51117,51117 51444,51444,51444 51772,51772,51772 52100,52100,52100 52428,52428,52428 52755,52755,52755 53083,53083,53083 53411,53411,53411 53738,53738,53738 54066,54066,54066 54394,54394,54394 54721,54721,54721 55049,55049,55049 55377,55377,55377 55704,55704,55704 56032,56032,56032 56360,56360,56360 56687,56687,56687 57015,57015,57015 57343,57343,57343 57670,57670,57670 57998,57998,57998 58326,58326,58326 58653,58653,58653 58981,58981,58981 59309,59309,59309 59636,59636,59636 59964,59964,59964 60292,60292,60292 60619,60619,60619 60947,60947,60947 61275,61275,61275 61602,61602,61602 61930,61930,61930 62258,62258,62258 62585,62585,62585 62913,62913,62913 63241,63241,63241 63568,63568,63568 63896,63896,63896 64224,64224,64224 64551,64551,64551 64879,64879,64879 65207,65207,65207 65535,65535,65535 ########## g202.clr 0,0,0 326,326,326 652,652,652 978,978,978 1304,1304,1304 1630,1630,1630 1956,1956,1956 2282,2282,2282 2608,2608,2608 2934,2934,2934 3260,3260,3260 3586,3586,3586 3912,3912,3912 4238,4238,4238 4564,4564,4564 4890,4890,4890 5216,5216,5216 5542,5542,5542 5868,5868,5868 6194,6194,6194 6520,6520,6520 6846,6846,6846 7172,7172,7172 7499,7499,7499 7825,7825,7825 8151,8151,8151 8477,8477,8477 8803,8803,8803 9129,9129,9129 9455,9455,9455 9781,9781,9781 10107,10107,10107 10433,10433,10433 10759,10759,10759 11085,11085,11085 11411,11411,11411 11737,11737,11737 12063,12063,12063 12389,12389,12389 12715,12715,12715 13041,13041,13041 13367,13367,13367 13693,13693,13693 14019,14019,14019 14345,14345,14345 14672,14672,14672 14998,14998,14998 15324,15324,15324 15650,15650,15650 15976,15976,15976 16302,16302,16302 16628,16628,16628 16954,16954,16954 17280,17280,17280 17606,17606,17606 17932,17932,17932 18258,18258,18258 18584,18584,18584 18910,18910,18910 19236,19236,19236 19562,19562,19562 19888,19888,19888 20214,20214,20214 20540,20540,20540 20866,20866,20866 21192,21192,21192 21518,21518,21518 21845,21845,21845 22171,22171,22171 22497,22497,22497 22823,22823,22823 23149,23149,23149 23475,23475,23475 23801,23801,23801 24127,24127,24127 24453,24453,24453 24779,24779,24779 25105,25105,25105 25431,25431,25431 25757,25757,25757 26083,26083,26083 26409,26409,26409 26735,26735,26735 27061,27061,27061 27387,27387,27387 27713,27713,27713 28039,28039,28039 28365,28365,28365 28691,28691,28691 29017,29017,29017 29344,29344,29344 29670,29670,29670 29996,29996,29996 30322,30322,30322 30648,30648,30648 30974,30974,30974 31300,31300,31300 31626,31626,31626 31952,31952,31952 32278,32278,32278 32604,32604,32604 32930,32930,32930 33256,33256,33256 33582,33582,33582 33908,33908,33908 34234,34234,34234 34560,34560,34560 34886,34886,34886 35212,35212,35212 35538,35538,35538 35864,35864,35864 36190,36190,36190 36517,36517,36517 36843,36843,36843 37169,37169,37169 37495,37495,37495 37821,37821,37821 38147,38147,38147 38473,38473,38473 38799,38799,38799 39125,39125,39125 39451,39451,39451 39777,39777,39777 40103,40103,40103 40429,40429,40429 40755,40755,40755 41081,41081,41081 41407,41407,41407 41733,41733,41733 42059,42059,42059 42385,42385,42385 42711,42711,42711 43037,43037,43037 43363,43363,43363 43690,43690,43690 44016,44016,44016 44342,44342,44342 44668,44668,44668 44994,44994,44994 45320,45320,45320 45646,45646,45646 45972,45972,45972 46298,46298,46298 46624,46624,46624 46950,46950,46950 47276,47276,47276 47602,47602,47602 47928,47928,47928 48254,48254,48254 48580,48580,48580 48906,48906,48906 49232,49232,49232 49558,49558,49558 49884,49884,49884 50210,50210,50210 50536,50536,50536 50862,50862,50862 51189,51189,51189 51515,51515,51515 51841,51841,51841 52167,52167,52167 52493,52493,52493 52819,52819,52819 53145,53145,53145 53471,53471,53471 53797,53797,53797 54123,54123,54123 54449,54449,54449 54775,54775,54775 55101,55101,55101 55427,55427,55427 55753,55753,55753 56079,56079,56079 56405,56405,56405 56731,56731,56731 57057,57057,57057 57383,57383,57383 57709,57709,57709 58035,58035,58035 58362,58362,58362 58688,58688,58688 59014,59014,59014 59340,59340,59340 59666,59666,59666 59992,59992,59992 60318,60318,60318 60644,60644,60644 60970,60970,60970 61296,61296,61296 61622,61622,61622 61948,61948,61948 62274,62274,62274 62600,62600,62600 62926,62926,62926 63252,63252,63252 63578,63578,63578 63904,63904,63904 64230,64230,64230 64556,64556,64556 64882,64882,64882 65208,65208,65208 65535,65535,65535 ########## g203.clr 0,0,0 324,324,324 648,648,648 973,973,973 1297,1297,1297 1622,1622,1622 1946,1946,1946 2271,2271,2271 2595,2595,2595 2919,2919,2919 3244,3244,3244 3568,3568,3568 3893,3893,3893 4217,4217,4217 4542,4542,4542 4866,4866,4866 5190,5190,5190 5515,5515,5515 5839,5839,5839 6164,6164,6164 6488,6488,6488 6813,6813,6813 7137,7137,7137 7461,7461,7461 7786,7786,7786 8110,8110,8110 8435,8435,8435 8759,8759,8759 9084,9084,9084 9408,9408,9408 9732,9732,9732 10057,10057,10057 10381,10381,10381 10706,10706,10706 11030,11030,11030 11355,11355,11355 11679,11679,11679 12003,12003,12003 12328,12328,12328 12652,12652,12652 12977,12977,12977 13301,13301,13301 13626,13626,13626 13950,13950,13950 14274,14274,14274 14599,14599,14599 14923,14923,14923 15248,15248,15248 15572,15572,15572 15897,15897,15897 16221,16221,16221 16545,16545,16545 16870,16870,16870 17194,17194,17194 17519,17519,17519 17843,17843,17843 18168,18168,18168 18492,18492,18492 18816,18816,18816 19141,19141,19141 19465,19465,19465 19790,19790,19790 20114,20114,20114 20439,20439,20439 20763,20763,20763 21087,21087,21087 21412,21412,21412 21736,21736,21736 22061,22061,22061 22385,22385,22385 22710,22710,22710 23034,23034,23034 23359,23359,23359 23683,23683,23683 24007,24007,24007 24332,24332,24332 24656,24656,24656 24981,24981,24981 25305,25305,25305 25630,25630,25630 25954,25954,25954 26278,26278,26278 26603,26603,26603 26927,26927,26927 27252,27252,27252 27576,27576,27576 27901,27901,27901 28225,28225,28225 28549,28549,28549 28874,28874,28874 29198,29198,29198 29523,29523,29523 29847,29847,29847 30172,30172,30172 30496,30496,30496 30820,30820,30820 31145,31145,31145 31469,31469,31469 31794,31794,31794 32118,32118,32118 32443,32443,32443 32767,32767,32767 33091,33091,33091 33416,33416,33416 33740,33740,33740 34065,34065,34065 34389,34389,34389 34714,34714,34714 35038,35038,35038 35362,35362,35362 35687,35687,35687 36011,36011,36011 36336,36336,36336 36660,36660,36660 36985,36985,36985 37309,37309,37309 37633,37633,37633 37958,37958,37958 38282,38282,38282 38607,38607,38607 38931,38931,38931 39256,39256,39256 39580,39580,39580 39904,39904,39904 40229,40229,40229 40553,40553,40553 40878,40878,40878 41202,41202,41202 41527,41527,41527 41851,41851,41851 42175,42175,42175 42500,42500,42500 42824,42824,42824 43149,43149,43149 43473,43473,43473 43798,43798,43798 44122,44122,44122 44447,44447,44447 44771,44771,44771 45095,45095,45095 45420,45420,45420 45744,45744,45744 46069,46069,46069 46393,46393,46393 46718,46718,46718 47042,47042,47042 47366,47366,47366 47691,47691,47691 48015,48015,48015 48340,48340,48340 48664,48664,48664 48989,48989,48989 49313,49313,49313 49637,49637,49637 49962,49962,49962 50286,50286,50286 50611,50611,50611 50935,50935,50935 51260,51260,51260 51584,51584,51584 51908,51908,51908 52233,52233,52233 52557,52557,52557 52882,52882,52882 53206,53206,53206 53531,53531,53531 53855,53855,53855 54179,54179,54179 54504,54504,54504 54828,54828,54828 55153,55153,55153 55477,55477,55477 55802,55802,55802 56126,56126,56126 56450,56450,56450 56775,56775,56775 57099,57099,57099 57424,57424,57424 57748,57748,57748 58073,58073,58073 58397,58397,58397 58721,58721,58721 59046,59046,59046 59370,59370,59370 59695,59695,59695 60019,60019,60019 60344,60344,60344 60668,60668,60668 60992,60992,60992 61317,61317,61317 61641,61641,61641 61966,61966,61966 62290,62290,62290 62615,62615,62615 62939,62939,62939 63263,63263,63263 63588,63588,63588 63912,63912,63912 64237,64237,64237 64561,64561,64561 64886,64886,64886 65210,65210,65210 65535,65535,65535 ########## g204.clr 0,0,0 322,322,322 645,645,645 968,968,968 1291,1291,1291 1614,1614,1614 1936,1936,1936 2259,2259,2259 2582,2582,2582 2905,2905,2905 3228,3228,3228 3551,3551,3551 3873,3873,3873 4196,4196,4196 4519,4519,4519 4842,4842,4842 5165,5165,5165 5488,5488,5488 5810,5810,5810 6133,6133,6133 6456,6456,6456 6779,6779,6779 7102,7102,7102 7425,7425,7425 7747,7747,7747 8070,8070,8070 8393,8393,8393 8716,8716,8716 9039,9039,9039 9362,9362,9362 9684,9684,9684 10007,10007,10007 10330,10330,10330 10653,10653,10653 10976,10976,10976 11299,11299,11299 11621,11621,11621 11944,11944,11944 12267,12267,12267 12590,12590,12590 12913,12913,12913 13236,13236,13236 13558,13558,13558 13881,13881,13881 14204,14204,14204 14527,14527,14527 14850,14850,14850 15173,15173,15173 15495,15495,15495 15818,15818,15818 16141,16141,16141 16464,16464,16464 16787,16787,16787 17110,17110,17110 17432,17432,17432 17755,17755,17755 18078,18078,18078 18401,18401,18401 18724,18724,18724 19047,19047,19047 19369,19369,19369 19692,19692,19692 20015,20015,20015 20338,20338,20338 20661,20661,20661 20984,20984,20984 21306,21306,21306 21629,21629,21629 21952,21952,21952 22275,22275,22275 22598,22598,22598 22921,22921,22921 23243,23243,23243 23566,23566,23566 23889,23889,23889 24212,24212,24212 24535,24535,24535 24858,24858,24858 25180,25180,25180 25503,25503,25503 25826,25826,25826 26149,26149,26149 26472,26472,26472 26795,26795,26795 27117,27117,27117 27440,27440,27440 27763,27763,27763 28086,28086,28086 28409,28409,28409 28732,28732,28732 29054,29054,29054 29377,29377,29377 29700,29700,29700 30023,30023,30023 30346,30346,30346 30669,30669,30669 30991,30991,30991 31314,31314,31314 31637,31637,31637 31960,31960,31960 32283,32283,32283 32606,32606,32606 32928,32928,32928 33251,33251,33251 33574,33574,33574 33897,33897,33897 34220,34220,34220 34543,34543,34543 34865,34865,34865 35188,35188,35188 35511,35511,35511 35834,35834,35834 36157,36157,36157 36480,36480,36480 36802,36802,36802 37125,37125,37125 37448,37448,37448 37771,37771,37771 38094,38094,38094 38417,38417,38417 38739,38739,38739 39062,39062,39062 39385,39385,39385 39708,39708,39708 40031,40031,40031 40354,40354,40354 40676,40676,40676 40999,40999,40999 41322,41322,41322 41645,41645,41645 41968,41968,41968 42291,42291,42291 42613,42613,42613 42936,42936,42936 43259,43259,43259 43582,43582,43582 43905,43905,43905 44228,44228,44228 44550,44550,44550 44873,44873,44873 45196,45196,45196 45519,45519,45519 45842,45842,45842 46165,46165,46165 46487,46487,46487 46810,46810,46810 47133,47133,47133 47456,47456,47456 47779,47779,47779 48102,48102,48102 48424,48424,48424 48747,48747,48747 49070,49070,49070 49393,49393,49393 49716,49716,49716 50039,50039,50039 50361,50361,50361 50684,50684,50684 51007,51007,51007 51330,51330,51330 51653,51653,51653 51976,51976,51976 52298,52298,52298 52621,52621,52621 52944,52944,52944 53267,53267,53267 53590,53590,53590 53913,53913,53913 54235,54235,54235 54558,54558,54558 54881,54881,54881 55204,55204,55204 55527,55527,55527 55850,55850,55850 56172,56172,56172 56495,56495,56495 56818,56818,56818 57141,57141,57141 57464,57464,57464 57787,57787,57787 58109,58109,58109 58432,58432,58432 58755,58755,58755 59078,59078,59078 59401,59401,59401 59724,59724,59724 60046,60046,60046 60369,60369,60369 60692,60692,60692 61015,61015,61015 61338,61338,61338 61661,61661,61661 61983,61983,61983 62306,62306,62306 62629,62629,62629 62952,62952,62952 63275,63275,63275 63598,63598,63598 63920,63920,63920 64243,64243,64243 64566,64566,64566 64889,64889,64889 65212,65212,65212 65535,65535,65535 ########## g205.clr 0,0,0 321,321,321 642,642,642 963,963,963 1285,1285,1285 1606,1606,1606 1927,1927,1927 2248,2248,2248 2570,2570,2570 2891,2891,2891 3212,3212,3212 3533,3533,3533 3855,3855,3855 4176,4176,4176 4497,4497,4497 4818,4818,4818 5140,5140,5140 5461,5461,5461 5782,5782,5782 6103,6103,6103 6425,6425,6425 6746,6746,6746 7067,7067,7067 7388,7388,7388 7710,7710,7710 8031,8031,8031 8352,8352,8352 8673,8673,8673 8995,8995,8995 9316,9316,9316 9637,9637,9637 9958,9958,9958 10280,10280,10280 10601,10601,10601 10922,10922,10922 11243,11243,11243 11565,11565,11565 11886,11886,11886 12207,12207,12207 12528,12528,12528 12850,12850,12850 13171,13171,13171 13492,13492,13492 13813,13813,13813 14135,14135,14135 14456,14456,14456 14777,14777,14777 15098,15098,15098 15420,15420,15420 15741,15741,15741 16062,16062,16062 16383,16383,16383 16705,16705,16705 17026,17026,17026 17347,17347,17347 17668,17668,17668 17990,17990,17990 18311,18311,18311 18632,18632,18632 18953,18953,18953 19275,19275,19275 19596,19596,19596 19917,19917,19917 20238,20238,20238 20560,20560,20560 20881,20881,20881 21202,21202,21202 21523,21523,21523 21845,21845,21845 22166,22166,22166 22487,22487,22487 22808,22808,22808 23130,23130,23130 23451,23451,23451 23772,23772,23772 24093,24093,24093 24415,24415,24415 24736,24736,24736 25057,25057,25057 25378,25378,25378 25700,25700,25700 26021,26021,26021 26342,26342,26342 26663,26663,26663 26985,26985,26985 27306,27306,27306 27627,27627,27627 27948,27948,27948 28270,28270,28270 28591,28591,28591 28912,28912,28912 29233,29233,29233 29555,29555,29555 29876,29876,29876 30197,30197,30197 30518,30518,30518 30840,30840,30840 31161,31161,31161 31482,31482,31482 31803,31803,31803 32125,32125,32125 32446,32446,32446 32767,32767,32767 33088,33088,33088 33410,33410,33410 33731,33731,33731 34052,34052,34052 34373,34373,34373 34695,34695,34695 35016,35016,35016 35337,35337,35337 35658,35658,35658 35980,35980,35980 36301,36301,36301 36622,36622,36622 36943,36943,36943 37265,37265,37265 37586,37586,37586 37907,37907,37907 38228,38228,38228 38550,38550,38550 38871,38871,38871 39192,39192,39192 39513,39513,39513 39835,39835,39835 40156,40156,40156 40477,40477,40477 40798,40798,40798 41120,41120,41120 41441,41441,41441 41762,41762,41762 42083,42083,42083 42405,42405,42405 42726,42726,42726 43047,43047,43047 43368,43368,43368 43690,43690,43690 44011,44011,44011 44332,44332,44332 44653,44653,44653 44975,44975,44975 45296,45296,45296 45617,45617,45617 45938,45938,45938 46260,46260,46260 46581,46581,46581 46902,46902,46902 47223,47223,47223 47545,47545,47545 47866,47866,47866 48187,48187,48187 48508,48508,48508 48830,48830,48830 49151,49151,49151 49472,49472,49472 49793,49793,49793 50115,50115,50115 50436,50436,50436 50757,50757,50757 51078,51078,51078 51400,51400,51400 51721,51721,51721 52042,52042,52042 52363,52363,52363 52685,52685,52685 53006,53006,53006 53327,53327,53327 53648,53648,53648 53970,53970,53970 54291,54291,54291 54612,54612,54612 54933,54933,54933 55255,55255,55255 55576,55576,55576 55897,55897,55897 56218,56218,56218 56540,56540,56540 56861,56861,56861 57182,57182,57182 57503,57503,57503 57825,57825,57825 58146,58146,58146 58467,58467,58467 58788,58788,58788 59110,59110,59110 59431,59431,59431 59752,59752,59752 60073,60073,60073 60395,60395,60395 60716,60716,60716 61037,61037,61037 61358,61358,61358 61680,61680,61680 62001,62001,62001 62322,62322,62322 62643,62643,62643 62965,62965,62965 63286,63286,63286 63607,63607,63607 63928,63928,63928 64250,64250,64250 64571,64571,64571 64892,64892,64892 65213,65213,65213 65535,65535,65535 ########## g206.clr 0,0,0 319,319,319 639,639,639 959,959,959 1278,1278,1278 1598,1598,1598 1918,1918,1918 2237,2237,2237 2557,2557,2557 2877,2877,2877 3196,3196,3196 3516,3516,3516 3836,3836,3836 4155,4155,4155 4475,4475,4475 4795,4795,4795 5114,5114,5114 5434,5434,5434 5754,5754,5754 6073,6073,6073 6393,6393,6393 6713,6713,6713 7033,7033,7033 7352,7352,7352 7672,7672,7672 7992,7992,7992 8311,8311,8311 8631,8631,8631 8951,8951,8951 9270,9270,9270 9590,9590,9590 9910,9910,9910 10229,10229,10229 10549,10549,10549 10869,10869,10869 11188,11188,11188 11508,11508,11508 11828,11828,11828 12147,12147,12147 12467,12467,12467 12787,12787,12787 13107,13107,13107 13426,13426,13426 13746,13746,13746 14066,14066,14066 14385,14385,14385 14705,14705,14705 15025,15025,15025 15344,15344,15344 15664,15664,15664 15984,15984,15984 16303,16303,16303 16623,16623,16623 16943,16943,16943 17262,17262,17262 17582,17582,17582 17902,17902,17902 18221,18221,18221 18541,18541,18541 18861,18861,18861 19180,19180,19180 19500,19500,19500 19820,19820,19820 20140,20140,20140 20459,20459,20459 20779,20779,20779 21099,21099,21099 21418,21418,21418 21738,21738,21738 22058,22058,22058 22377,22377,22377 22697,22697,22697 23017,23017,23017 23336,23336,23336 23656,23656,23656 23976,23976,23976 24295,24295,24295 24615,24615,24615 24935,24935,24935 25254,25254,25254 25574,25574,25574 25894,25894,25894 26214,26214,26214 26533,26533,26533 26853,26853,26853 27173,27173,27173 27492,27492,27492 27812,27812,27812 28132,28132,28132 28451,28451,28451 28771,28771,28771 29091,29091,29091 29410,29410,29410 29730,29730,29730 30050,30050,30050 30369,30369,30369 30689,30689,30689 31009,31009,31009 31328,31328,31328 31648,31648,31648 31968,31968,31968 32287,32287,32287 32607,32607,32607 32927,32927,32927 33247,33247,33247 33566,33566,33566 33886,33886,33886 34206,34206,34206 34525,34525,34525 34845,34845,34845 35165,35165,35165 35484,35484,35484 35804,35804,35804 36124,36124,36124 36443,36443,36443 36763,36763,36763 37083,37083,37083 37402,37402,37402 37722,37722,37722 38042,38042,38042 38361,38361,38361 38681,38681,38681 39001,39001,39001 39321,39321,39321 39640,39640,39640 39960,39960,39960 40280,40280,40280 40599,40599,40599 40919,40919,40919 41239,41239,41239 41558,41558,41558 41878,41878,41878 42198,42198,42198 42517,42517,42517 42837,42837,42837 43157,43157,43157 43476,43476,43476 43796,43796,43796 44116,44116,44116 44435,44435,44435 44755,44755,44755 45075,45075,45075 45394,45394,45394 45714,45714,45714 46034,46034,46034 46354,46354,46354 46673,46673,46673 46993,46993,46993 47313,47313,47313 47632,47632,47632 47952,47952,47952 48272,48272,48272 48591,48591,48591 48911,48911,48911 49231,49231,49231 49550,49550,49550 49870,49870,49870 50190,50190,50190 50509,50509,50509 50829,50829,50829 51149,51149,51149 51468,51468,51468 51788,51788,51788 52108,52108,52108 52428,52428,52428 52747,52747,52747 53067,53067,53067 53387,53387,53387 53706,53706,53706 54026,54026,54026 54346,54346,54346 54665,54665,54665 54985,54985,54985 55305,55305,55305 55624,55624,55624 55944,55944,55944 56264,56264,56264 56583,56583,56583 56903,56903,56903 57223,57223,57223 57542,57542,57542 57862,57862,57862 58182,58182,58182 58501,58501,58501 58821,58821,58821 59141,59141,59141 59461,59461,59461 59780,59780,59780 60100,60100,60100 60420,60420,60420 60739,60739,60739 61059,61059,61059 61379,61379,61379 61698,61698,61698 62018,62018,62018 62338,62338,62338 62657,62657,62657 62977,62977,62977 63297,63297,63297 63616,63616,63616 63936,63936,63936 64256,64256,64256 64575,64575,64575 64895,64895,64895 65215,65215,65215 65535,65535,65535 ########## g207.clr 0,0,0 318,318,318 636,636,636 954,954,954 1272,1272,1272 1590,1590,1590 1908,1908,1908 2226,2226,2226 2545,2545,2545 2863,2863,2863 3181,3181,3181 3499,3499,3499 3817,3817,3817 4135,4135,4135 4453,4453,4453 4771,4771,4771 5090,5090,5090 5408,5408,5408 5726,5726,5726 6044,6044,6044 6362,6362,6362 6680,6680,6680 6998,6998,6998 7317,7317,7317 7635,7635,7635 7953,7953,7953 8271,8271,8271 8589,8589,8589 8907,8907,8907 9225,9225,9225 9543,9543,9543 9862,9862,9862 10180,10180,10180 10498,10498,10498 10816,10816,10816 11134,11134,11134 11452,11452,11452 11770,11770,11770 12088,12088,12088 12407,12407,12407 12725,12725,12725 13043,13043,13043 13361,13361,13361 13679,13679,13679 13997,13997,13997 14315,14315,14315 14634,14634,14634 14952,14952,14952 15270,15270,15270 15588,15588,15588 15906,15906,15906 16224,16224,16224 16542,16542,16542 16860,16860,16860 17179,17179,17179 17497,17497,17497 17815,17815,17815 18133,18133,18133 18451,18451,18451 18769,18769,18769 19087,19087,19087 19405,19405,19405 19724,19724,19724 20042,20042,20042 20360,20360,20360 20678,20678,20678 20996,20996,20996 21314,21314,21314 21632,21632,21632 21951,21951,21951 22269,22269,22269 22587,22587,22587 22905,22905,22905 23223,23223,23223 23541,23541,23541 23859,23859,23859 24177,24177,24177 24496,24496,24496 24814,24814,24814 25132,25132,25132 25450,25450,25450 25768,25768,25768 26086,26086,26086 26404,26404,26404 26723,26723,26723 27041,27041,27041 27359,27359,27359 27677,27677,27677 27995,27995,27995 28313,28313,28313 28631,28631,28631 28949,28949,28949 29268,29268,29268 29586,29586,29586 29904,29904,29904 30222,30222,30222 30540,30540,30540 30858,30858,30858 31176,31176,31176 31494,31494,31494 31813,31813,31813 32131,32131,32131 32449,32449,32449 32767,32767,32767 33085,33085,33085 33403,33403,33403 33721,33721,33721 34040,34040,34040 34358,34358,34358 34676,34676,34676 34994,34994,34994 35312,35312,35312 35630,35630,35630 35948,35948,35948 36266,36266,36266 36585,36585,36585 36903,36903,36903 37221,37221,37221 37539,37539,37539 37857,37857,37857 38175,38175,38175 38493,38493,38493 38811,38811,38811 39130,39130,39130 39448,39448,39448 39766,39766,39766 40084,40084,40084 40402,40402,40402 40720,40720,40720 41038,41038,41038 41357,41357,41357 41675,41675,41675 41993,41993,41993 42311,42311,42311 42629,42629,42629 42947,42947,42947 43265,43265,43265 43583,43583,43583 43902,43902,43902 44220,44220,44220 44538,44538,44538 44856,44856,44856 45174,45174,45174 45492,45492,45492 45810,45810,45810 46129,46129,46129 46447,46447,46447 46765,46765,46765 47083,47083,47083 47401,47401,47401 47719,47719,47719 48037,48037,48037 48355,48355,48355 48674,48674,48674 48992,48992,48992 49310,49310,49310 49628,49628,49628 49946,49946,49946 50264,50264,50264 50582,50582,50582 50900,50900,50900 51219,51219,51219 51537,51537,51537 51855,51855,51855 52173,52173,52173 52491,52491,52491 52809,52809,52809 53127,53127,53127 53446,53446,53446 53764,53764,53764 54082,54082,54082 54400,54400,54400 54718,54718,54718 55036,55036,55036 55354,55354,55354 55672,55672,55672 55991,55991,55991 56309,56309,56309 56627,56627,56627 56945,56945,56945 57263,57263,57263 57581,57581,57581 57899,57899,57899 58217,58217,58217 58536,58536,58536 58854,58854,58854 59172,59172,59172 59490,59490,59490 59808,59808,59808 60126,60126,60126 60444,60444,60444 60763,60763,60763 61081,61081,61081 61399,61399,61399 61717,61717,61717 62035,62035,62035 62353,62353,62353 62671,62671,62671 62989,62989,62989 63308,63308,63308 63626,63626,63626 63944,63944,63944 64262,64262,64262 64580,64580,64580 64898,64898,64898 65216,65216,65216 65534,65534,65534 ########## g208.clr 0,0,0 316,316,316 633,633,633 949,949,949 1266,1266,1266 1582,1582,1582 1899,1899,1899 2216,2216,2216 2532,2532,2532 2849,2849,2849 3165,3165,3165 3482,3482,3482 3799,3799,3799 4115,4115,4115 4432,4432,4432 4748,4748,4748 5065,5065,5065 5382,5382,5382 5698,5698,5698 6015,6015,6015 6331,6331,6331 6648,6648,6648 6965,6965,6965 7281,7281,7281 7598,7598,7598 7914,7914,7914 8231,8231,8231 8548,8548,8548 8864,8864,8864 9181,9181,9181 9497,9497,9497 9814,9814,9814 10131,10131,10131 10447,10447,10447 10764,10764,10764 11080,11080,11080 11397,11397,11397 11713,11713,11713 12030,12030,12030 12347,12347,12347 12663,12663,12663 12980,12980,12980 13296,13296,13296 13613,13613,13613 13930,13930,13930 14246,14246,14246 14563,14563,14563 14879,14879,14879 15196,15196,15196 15513,15513,15513 15829,15829,15829 16146,16146,16146 16462,16462,16462 16779,16779,16779 17096,17096,17096 17412,17412,17412 17729,17729,17729 18045,18045,18045 18362,18362,18362 18679,18679,18679 18995,18995,18995 19312,19312,19312 19628,19628,19628 19945,19945,19945 20262,20262,20262 20578,20578,20578 20895,20895,20895 21211,21211,21211 21528,21528,21528 21844,21844,21844 22161,22161,22161 22478,22478,22478 22794,22794,22794 23111,23111,23111 23427,23427,23427 23744,23744,23744 24061,24061,24061 24377,24377,24377 24694,24694,24694 25010,25010,25010 25327,25327,25327 25644,25644,25644 25960,25960,25960 26277,26277,26277 26593,26593,26593 26910,26910,26910 27227,27227,27227 27543,27543,27543 27860,27860,27860 28176,28176,28176 28493,28493,28493 28810,28810,28810 29126,29126,29126 29443,29443,29443 29759,29759,29759 30076,30076,30076 30393,30393,30393 30709,30709,30709 31026,31026,31026 31342,31342,31342 31659,31659,31659 31976,31976,31976 32292,32292,32292 32609,32609,32609 32925,32925,32925 33242,33242,33242 33558,33558,33558 33875,33875,33875 34192,34192,34192 34508,34508,34508 34825,34825,34825 35141,35141,35141 35458,35458,35458 35775,35775,35775 36091,36091,36091 36408,36408,36408 36724,36724,36724 37041,37041,37041 37358,37358,37358 37674,37674,37674 37991,37991,37991 38307,38307,38307 38624,38624,38624 38941,38941,38941 39257,39257,39257 39574,39574,39574 39890,39890,39890 40207,40207,40207 40524,40524,40524 40840,40840,40840 41157,41157,41157 41473,41473,41473 41790,41790,41790 42107,42107,42107 42423,42423,42423 42740,42740,42740 43056,43056,43056 43373,43373,43373 43689,43689,43689 44006,44006,44006 44323,44323,44323 44639,44639,44639 44956,44956,44956 45272,45272,45272 45589,45589,45589 45906,45906,45906 46222,46222,46222 46539,46539,46539 46855,46855,46855 47172,47172,47172 47489,47489,47489 47805,47805,47805 48122,48122,48122 48438,48438,48438 48755,48755,48755 49072,49072,49072 49388,49388,49388 49705,49705,49705 50021,50021,50021 50338,50338,50338 50655,50655,50655 50971,50971,50971 51288,51288,51288 51604,51604,51604 51921,51921,51921 52238,52238,52238 52554,52554,52554 52871,52871,52871 53187,53187,53187 53504,53504,53504 53821,53821,53821 54137,54137,54137 54454,54454,54454 54770,54770,54770 55087,55087,55087 55403,55403,55403 55720,55720,55720 56037,56037,56037 56353,56353,56353 56670,56670,56670 56986,56986,56986 57303,57303,57303 57620,57620,57620 57936,57936,57936 58253,58253,58253 58569,58569,58569 58886,58886,58886 59203,59203,59203 59519,59519,59519 59836,59836,59836 60152,60152,60152 60469,60469,60469 60786,60786,60786 61102,61102,61102 61419,61419,61419 61735,61735,61735 62052,62052,62052 62369,62369,62369 62685,62685,62685 63002,63002,63002 63318,63318,63318 63635,63635,63635 63952,63952,63952 64268,64268,64268 64585,64585,64585 64901,64901,64901 65218,65218,65218 65534,65534,65534 ########## g209.clr 0,0,0 315,315,315 630,630,630 945,945,945 1260,1260,1260 1575,1575,1575 1890,1890,1890 2205,2205,2205 2520,2520,2520 2835,2835,2835 3150,3150,3150 3465,3465,3465 3780,3780,3780 4095,4095,4095 4411,4411,4411 4726,4726,4726 5041,5041,5041 5356,5356,5356 5671,5671,5671 5986,5986,5986 6301,6301,6301 6616,6616,6616 6931,6931,6931 7246,7246,7246 7561,7561,7561 7876,7876,7876 8191,8191,8191 8506,8506,8506 8822,8822,8822 9137,9137,9137 9452,9452,9452 9767,9767,9767 10082,10082,10082 10397,10397,10397 10712,10712,10712 11027,11027,11027 11342,11342,11342 11657,11657,11657 11972,11972,11972 12287,12287,12287 12602,12602,12602 12917,12917,12917 13233,13233,13233 13548,13548,13548 13863,13863,13863 14178,14178,14178 14493,14493,14493 14808,14808,14808 15123,15123,15123 15438,15438,15438 15753,15753,15753 16068,16068,16068 16383,16383,16383 16698,16698,16698 17013,17013,17013 17328,17328,17328 17644,17644,17644 17959,17959,17959 18274,18274,18274 18589,18589,18589 18904,18904,18904 19219,19219,19219 19534,19534,19534 19849,19849,19849 20164,20164,20164 20479,20479,20479 20794,20794,20794 21109,21109,21109 21424,21424,21424 21739,21739,21739 22055,22055,22055 22370,22370,22370 22685,22685,22685 23000,23000,23000 23315,23315,23315 23630,23630,23630 23945,23945,23945 24260,24260,24260 24575,24575,24575 24890,24890,24890 25205,25205,25205 25520,25520,25520 25835,25835,25835 26150,26150,26150 26466,26466,26466 26781,26781,26781 27096,27096,27096 27411,27411,27411 27726,27726,27726 28041,28041,28041 28356,28356,28356 28671,28671,28671 28986,28986,28986 29301,29301,29301 29616,29616,29616 29931,29931,29931 30246,30246,30246 30561,30561,30561 30877,30877,30877 31192,31192,31192 31507,31507,31507 31822,31822,31822 32137,32137,32137 32452,32452,32452 32767,32767,32767 33082,33082,33082 33397,33397,33397 33712,33712,33712 34027,34027,34027 34342,34342,34342 34657,34657,34657 34973,34973,34973 35288,35288,35288 35603,35603,35603 35918,35918,35918 36233,36233,36233 36548,36548,36548 36863,36863,36863 37178,37178,37178 37493,37493,37493 37808,37808,37808 38123,38123,38123 38438,38438,38438 38753,38753,38753 39068,39068,39068 39384,39384,39384 39699,39699,39699 40014,40014,40014 40329,40329,40329 40644,40644,40644 40959,40959,40959 41274,41274,41274 41589,41589,41589 41904,41904,41904 42219,42219,42219 42534,42534,42534 42849,42849,42849 43164,43164,43164 43479,43479,43479 43795,43795,43795 44110,44110,44110 44425,44425,44425 44740,44740,44740 45055,45055,45055 45370,45370,45370 45685,45685,45685 46000,46000,46000 46315,46315,46315 46630,46630,46630 46945,46945,46945 47260,47260,47260 47575,47575,47575 47890,47890,47890 48206,48206,48206 48521,48521,48521 48836,48836,48836 49151,49151,49151 49466,49466,49466 49781,49781,49781 50096,50096,50096 50411,50411,50411 50726,50726,50726 51041,51041,51041 51356,51356,51356 51671,51671,51671 51986,51986,51986 52301,52301,52301 52617,52617,52617 52932,52932,52932 53247,53247,53247 53562,53562,53562 53877,53877,53877 54192,54192,54192 54507,54507,54507 54822,54822,54822 55137,55137,55137 55452,55452,55452 55767,55767,55767 56082,56082,56082 56397,56397,56397 56712,56712,56712 57028,57028,57028 57343,57343,57343 57658,57658,57658 57973,57973,57973 58288,58288,58288 58603,58603,58603 58918,58918,58918 59233,59233,59233 59548,59548,59548 59863,59863,59863 60178,60178,60178 60493,60493,60493 60808,60808,60808 61123,61123,61123 61439,61439,61439 61754,61754,61754 62069,62069,62069 62384,62384,62384 62699,62699,62699 63014,63014,63014 63329,63329,63329 63644,63644,63644 63959,63959,63959 64274,64274,64274 64589,64589,64589 64904,64904,64904 65219,65219,65219 65535,65535,65535 ########## g21.clr 0,0,0 3276,3276,3276 6553,6553,6553 9830,9830,9830 13107,13107,13107 16383,16383,16383 19660,19660,19660 22937,22937,22937 26214,26214,26214 29490,29490,29490 32767,32767,32767 36044,36044,36044 39321,39321,39321 42597,42597,42597 45874,45874,45874 49151,49151,49151 52428,52428,52428 55704,55704,55704 58981,58981,58981 62258,62258,62258 65535,65535,65535 ########## g210.clr 0,0,0 313,313,313 627,627,627 940,940,940 1254,1254,1254 1567,1567,1567 1881,1881,1881 2194,2194,2194 2508,2508,2508 2822,2822,2822 3135,3135,3135 3449,3449,3449 3762,3762,3762 4076,4076,4076 4389,4389,4389 4703,4703,4703 5017,5017,5017 5330,5330,5330 5644,5644,5644 5957,5957,5957 6271,6271,6271 6584,6584,6584 6898,6898,6898 7211,7211,7211 7525,7525,7525 7839,7839,7839 8152,8152,8152 8466,8466,8466 8779,8779,8779 9093,9093,9093 9406,9406,9406 9720,9720,9720 10034,10034,10034 10347,10347,10347 10661,10661,10661 10974,10974,10974 11288,11288,11288 11601,11601,11601 11915,11915,11915 12229,12229,12229 12542,12542,12542 12856,12856,12856 13169,13169,13169 13483,13483,13483 13796,13796,13796 14110,14110,14110 14423,14423,14423 14737,14737,14737 15051,15051,15051 15364,15364,15364 15678,15678,15678 15991,15991,15991 16305,16305,16305 16618,16618,16618 16932,16932,16932 17246,17246,17246 17559,17559,17559 17873,17873,17873 18186,18186,18186 18500,18500,18500 18813,18813,18813 19127,19127,19127 19441,19441,19441 19754,19754,19754 20068,20068,20068 20381,20381,20381 20695,20695,20695 21008,21008,21008 21322,21322,21322 21635,21635,21635 21949,21949,21949 22263,22263,22263 22576,22576,22576 22890,22890,22890 23203,23203,23203 23517,23517,23517 23830,23830,23830 24144,24144,24144 24458,24458,24458 24771,24771,24771 25085,25085,25085 25398,25398,25398 25712,25712,25712 26025,26025,26025 26339,26339,26339 26652,26652,26652 26966,26966,26966 27280,27280,27280 27593,27593,27593 27907,27907,27907 28220,28220,28220 28534,28534,28534 28847,28847,28847 29161,29161,29161 29475,29475,29475 29788,29788,29788 30102,30102,30102 30415,30415,30415 30729,30729,30729 31042,31042,31042 31356,31356,31356 31670,31670,31670 31983,31983,31983 32297,32297,32297 32610,32610,32610 32924,32924,32924 33237,33237,33237 33551,33551,33551 33864,33864,33864 34178,34178,34178 34492,34492,34492 34805,34805,34805 35119,35119,35119 35432,35432,35432 35746,35746,35746 36059,36059,36059 36373,36373,36373 36687,36687,36687 37000,37000,37000 37314,37314,37314 37627,37627,37627 37941,37941,37941 38254,38254,38254 38568,38568,38568 38882,38882,38882 39195,39195,39195 39509,39509,39509 39822,39822,39822 40136,40136,40136 40449,40449,40449 40763,40763,40763 41076,41076,41076 41390,41390,41390 41704,41704,41704 42017,42017,42017 42331,42331,42331 42644,42644,42644 42958,42958,42958 43271,43271,43271 43585,43585,43585 43899,43899,43899 44212,44212,44212 44526,44526,44526 44839,44839,44839 45153,45153,45153 45466,45466,45466 45780,45780,45780 46093,46093,46093 46407,46407,46407 46721,46721,46721 47034,47034,47034 47348,47348,47348 47661,47661,47661 47975,47975,47975 48288,48288,48288 48602,48602,48602 48916,48916,48916 49229,49229,49229 49543,49543,49543 49856,49856,49856 50170,50170,50170 50483,50483,50483 50797,50797,50797 51111,51111,51111 51424,51424,51424 51738,51738,51738 52051,52051,52051 52365,52365,52365 52678,52678,52678 52992,52992,52992 53305,53305,53305 53619,53619,53619 53933,53933,53933 54246,54246,54246 54560,54560,54560 54873,54873,54873 55187,55187,55187 55500,55500,55500 55814,55814,55814 56128,56128,56128 56441,56441,56441 56755,56755,56755 57068,57068,57068 57382,57382,57382 57695,57695,57695 58009,58009,58009 58323,58323,58323 58636,58636,58636 58950,58950,58950 59263,59263,59263 59577,59577,59577 59890,59890,59890 60204,60204,60204 60517,60517,60517 60831,60831,60831 61145,61145,61145 61458,61458,61458 61772,61772,61772 62085,62085,62085 62399,62399,62399 62712,62712,62712 63026,63026,63026 63340,63340,63340 63653,63653,63653 63967,63967,63967 64280,64280,64280 64594,64594,64594 64907,64907,64907 65221,65221,65221 65535,65535,65535 ########## g211.clr 0,0,0 312,312,312 624,624,624 936,936,936 1248,1248,1248 1560,1560,1560 1872,1872,1872 2184,2184,2184 2496,2496,2496 2808,2808,2808 3120,3120,3120 3432,3432,3432 3744,3744,3744 4056,4056,4056 4369,4369,4369 4681,4681,4681 4993,4993,4993 5305,5305,5305 5617,5617,5617 5929,5929,5929 6241,6241,6241 6553,6553,6553 6865,6865,6865 7177,7177,7177 7489,7489,7489 7801,7801,7801 8113,8113,8113 8425,8425,8425 8738,8738,8738 9050,9050,9050 9362,9362,9362 9674,9674,9674 9986,9986,9986 10298,10298,10298 10610,10610,10610 10922,10922,10922 11234,11234,11234 11546,11546,11546 11858,11858,11858 12170,12170,12170 12482,12482,12482 12794,12794,12794 13107,13107,13107 13419,13419,13419 13731,13731,13731 14043,14043,14043 14355,14355,14355 14667,14667,14667 14979,14979,14979 15291,15291,15291 15603,15603,15603 15915,15915,15915 16227,16227,16227 16539,16539,16539 16851,16851,16851 17163,17163,17163 17476,17476,17476 17788,17788,17788 18100,18100,18100 18412,18412,18412 18724,18724,18724 19036,19036,19036 19348,19348,19348 19660,19660,19660 19972,19972,19972 20284,20284,20284 20596,20596,20596 20908,20908,20908 21220,21220,21220 21532,21532,21532 21845,21845,21845 22157,22157,22157 22469,22469,22469 22781,22781,22781 23093,23093,23093 23405,23405,23405 23717,23717,23717 24029,24029,24029 24341,24341,24341 24653,24653,24653 24965,24965,24965 25277,25277,25277 25589,25589,25589 25901,25901,25901 26214,26214,26214 26526,26526,26526 26838,26838,26838 27150,27150,27150 27462,27462,27462 27774,27774,27774 28086,28086,28086 28398,28398,28398 28710,28710,28710 29022,29022,29022 29334,29334,29334 29646,29646,29646 29958,29958,29958 30270,30270,30270 30583,30583,30583 30895,30895,30895 31207,31207,31207 31519,31519,31519 31831,31831,31831 32143,32143,32143 32455,32455,32455 32767,32767,32767 33079,33079,33079 33391,33391,33391 33703,33703,33703 34015,34015,34015 34327,34327,34327 34639,34639,34639 34952,34952,34952 35264,35264,35264 35576,35576,35576 35888,35888,35888 36200,36200,36200 36512,36512,36512 36824,36824,36824 37136,37136,37136 37448,37448,37448 37760,37760,37760 38072,38072,38072 38384,38384,38384 38696,38696,38696 39008,39008,39008 39321,39321,39321 39633,39633,39633 39945,39945,39945 40257,40257,40257 40569,40569,40569 40881,40881,40881 41193,41193,41193 41505,41505,41505 41817,41817,41817 42129,42129,42129 42441,42441,42441 42753,42753,42753 43065,43065,43065 43377,43377,43377 43690,43690,43690 44002,44002,44002 44314,44314,44314 44626,44626,44626 44938,44938,44938 45250,45250,45250 45562,45562,45562 45874,45874,45874 46186,46186,46186 46498,46498,46498 46810,46810,46810 47122,47122,47122 47434,47434,47434 47746,47746,47746 48059,48059,48059 48371,48371,48371 48683,48683,48683 48995,48995,48995 49307,49307,49307 49619,49619,49619 49931,49931,49931 50243,50243,50243 50555,50555,50555 50867,50867,50867 51179,51179,51179 51491,51491,51491 51803,51803,51803 52115,52115,52115 52428,52428,52428 52740,52740,52740 53052,53052,53052 53364,53364,53364 53676,53676,53676 53988,53988,53988 54300,54300,54300 54612,54612,54612 54924,54924,54924 55236,55236,55236 55548,55548,55548 55860,55860,55860 56172,56172,56172 56484,56484,56484 56797,56797,56797 57109,57109,57109 57421,57421,57421 57733,57733,57733 58045,58045,58045 58357,58357,58357 58669,58669,58669 58981,58981,58981 59293,59293,59293 59605,59605,59605 59917,59917,59917 60229,60229,60229 60541,60541,60541 60853,60853,60853 61166,61166,61166 61478,61478,61478 61790,61790,61790 62102,62102,62102 62414,62414,62414 62726,62726,62726 63038,63038,63038 63350,63350,63350 63662,63662,63662 63974,63974,63974 64286,64286,64286 64598,64598,64598 64910,64910,64910 65222,65222,65222 65535,65535,65535 ########## g212.clr 0,0,0 310,310,310 621,621,621 931,931,931 1242,1242,1242 1552,1552,1552 1863,1863,1863 2174,2174,2174 2484,2484,2484 2795,2795,2795 3105,3105,3105 3416,3416,3416 3727,3727,3727 4037,4037,4037 4348,4348,4348 4658,4658,4658 4969,4969,4969 5280,5280,5280 5590,5590,5590 5901,5901,5901 6211,6211,6211 6522,6522,6522 6833,6833,6833 7143,7143,7143 7454,7454,7454 7764,7764,7764 8075,8075,8075 8385,8385,8385 8696,8696,8696 9007,9007,9007 9317,9317,9317 9628,9628,9628 9938,9938,9938 10249,10249,10249 10560,10560,10560 10870,10870,10870 11181,11181,11181 11491,11491,11491 11802,11802,11802 12113,12113,12113 12423,12423,12423 12734,12734,12734 13044,13044,13044 13355,13355,13355 13666,13666,13666 13976,13976,13976 14287,14287,14287 14597,14597,14597 14908,14908,14908 15219,15219,15219 15529,15529,15529 15840,15840,15840 16150,16150,16150 16461,16461,16461 16771,16771,16771 17082,17082,17082 17393,17393,17393 17703,17703,17703 18014,18014,18014 18324,18324,18324 18635,18635,18635 18946,18946,18946 19256,19256,19256 19567,19567,19567 19877,19877,19877 20188,20188,20188 20499,20499,20499 20809,20809,20809 21120,21120,21120 21430,21430,21430 21741,21741,21741 22052,22052,22052 22362,22362,22362 22673,22673,22673 22983,22983,22983 23294,23294,23294 23605,23605,23605 23915,23915,23915 24226,24226,24226 24536,24536,24536 24847,24847,24847 25157,25157,25157 25468,25468,25468 25779,25779,25779 26089,26089,26089 26400,26400,26400 26710,26710,26710 27021,27021,27021 27332,27332,27332 27642,27642,27642 27953,27953,27953 28263,28263,28263 28574,28574,28574 28885,28885,28885 29195,29195,29195 29506,29506,29506 29816,29816,29816 30127,30127,30127 30438,30438,30438 30748,30748,30748 31059,31059,31059 31369,31369,31369 31680,31680,31680 31991,31991,31991 32301,32301,32301 32612,32612,32612 32922,32922,32922 33233,33233,33233 33543,33543,33543 33854,33854,33854 34165,34165,34165 34475,34475,34475 34786,34786,34786 35096,35096,35096 35407,35407,35407 35718,35718,35718 36028,36028,36028 36339,36339,36339 36649,36649,36649 36960,36960,36960 37271,37271,37271 37581,37581,37581 37892,37892,37892 38202,38202,38202 38513,38513,38513 38824,38824,38824 39134,39134,39134 39445,39445,39445 39755,39755,39755 40066,40066,40066 40377,40377,40377 40687,40687,40687 40998,40998,40998 41308,41308,41308 41619,41619,41619 41929,41929,41929 42240,42240,42240 42551,42551,42551 42861,42861,42861 43172,43172,43172 43482,43482,43482 43793,43793,43793 44104,44104,44104 44414,44414,44414 44725,44725,44725 45035,45035,45035 45346,45346,45346 45657,45657,45657 45967,45967,45967 46278,46278,46278 46588,46588,46588 46899,46899,46899 47210,47210,47210 47520,47520,47520 47831,47831,47831 48141,48141,48141 48452,48452,48452 48763,48763,48763 49073,49073,49073 49384,49384,49384 49694,49694,49694 50005,50005,50005 50315,50315,50315 50626,50626,50626 50937,50937,50937 51247,51247,51247 51558,51558,51558 51868,51868,51868 52179,52179,52179 52490,52490,52490 52800,52800,52800 53111,53111,53111 53421,53421,53421 53732,53732,53732 54043,54043,54043 54353,54353,54353 54664,54664,54664 54974,54974,54974 55285,55285,55285 55596,55596,55596 55906,55906,55906 56217,56217,56217 56527,56527,56527 56838,56838,56838 57149,57149,57149 57459,57459,57459 57770,57770,57770 58080,58080,58080 58391,58391,58391 58701,58701,58701 59012,59012,59012 59323,59323,59323 59633,59633,59633 59944,59944,59944 60254,60254,60254 60565,60565,60565 60876,60876,60876 61186,61186,61186 61497,61497,61497 61807,61807,61807 62118,62118,62118 62429,62429,62429 62739,62739,62739 63050,63050,63050 63360,63360,63360 63671,63671,63671 63982,63982,63982 64292,64292,64292 64603,64603,64603 64913,64913,64913 65224,65224,65224 65535,65535,65535 ########## g213.clr 0,0,0 309,309,309 618,618,618 927,927,927 1236,1236,1236 1545,1545,1545 1854,1854,1854 2163,2163,2163 2473,2473,2473 2782,2782,2782 3091,3091,3091 3400,3400,3400 3709,3709,3709 4018,4018,4018 4327,4327,4327 4636,4636,4636 4946,4946,4946 5255,5255,5255 5564,5564,5564 5873,5873,5873 6182,6182,6182 6491,6491,6491 6800,6800,6800 7109,7109,7109 7419,7419,7419 7728,7728,7728 8037,8037,8037 8346,8346,8346 8655,8655,8655 8964,8964,8964 9273,9273,9273 9582,9582,9582 9892,9892,9892 10201,10201,10201 10510,10510,10510 10819,10819,10819 11128,11128,11128 11437,11437,11437 11746,11746,11746 12055,12055,12055 12365,12365,12365 12674,12674,12674 12983,12983,12983 13292,13292,13292 13601,13601,13601 13910,13910,13910 14219,14219,14219 14528,14528,14528 14838,14838,14838 15147,15147,15147 15456,15456,15456 15765,15765,15765 16074,16074,16074 16383,16383,16383 16692,16692,16692 17002,17002,17002 17311,17311,17311 17620,17620,17620 17929,17929,17929 18238,18238,18238 18547,18547,18547 18856,18856,18856 19165,19165,19165 19475,19475,19475 19784,19784,19784 20093,20093,20093 20402,20402,20402 20711,20711,20711 21020,21020,21020 21329,21329,21329 21638,21638,21638 21948,21948,21948 22257,22257,22257 22566,22566,22566 22875,22875,22875 23184,23184,23184 23493,23493,23493 23802,23802,23802 24111,24111,24111 24421,24421,24421 24730,24730,24730 25039,25039,25039 25348,25348,25348 25657,25657,25657 25966,25966,25966 26275,26275,26275 26584,26584,26584 26894,26894,26894 27203,27203,27203 27512,27512,27512 27821,27821,27821 28130,28130,28130 28439,28439,28439 28748,28748,28748 29057,29057,29057 29367,29367,29367 29676,29676,29676 29985,29985,29985 30294,30294,30294 30603,30603,30603 30912,30912,30912 31221,31221,31221 31530,31530,31530 31840,31840,31840 32149,32149,32149 32458,32458,32458 32767,32767,32767 33076,33076,33076 33385,33385,33385 33694,33694,33694 34004,34004,34004 34313,34313,34313 34622,34622,34622 34931,34931,34931 35240,35240,35240 35549,35549,35549 35858,35858,35858 36167,36167,36167 36477,36477,36477 36786,36786,36786 37095,37095,37095 37404,37404,37404 37713,37713,37713 38022,38022,38022 38331,38331,38331 38640,38640,38640 38950,38950,38950 39259,39259,39259 39568,39568,39568 39877,39877,39877 40186,40186,40186 40495,40495,40495 40804,40804,40804 41113,41113,41113 41423,41423,41423 41732,41732,41732 42041,42041,42041 42350,42350,42350 42659,42659,42659 42968,42968,42968 43277,43277,43277 43586,43586,43586 43896,43896,43896 44205,44205,44205 44514,44514,44514 44823,44823,44823 45132,45132,45132 45441,45441,45441 45750,45750,45750 46059,46059,46059 46369,46369,46369 46678,46678,46678 46987,46987,46987 47296,47296,47296 47605,47605,47605 47914,47914,47914 48223,48223,48223 48532,48532,48532 48842,48842,48842 49151,49151,49151 49460,49460,49460 49769,49769,49769 50078,50078,50078 50387,50387,50387 50696,50696,50696 51006,51006,51006 51315,51315,51315 51624,51624,51624 51933,51933,51933 52242,52242,52242 52551,52551,52551 52860,52860,52860 53169,53169,53169 53479,53479,53479 53788,53788,53788 54097,54097,54097 54406,54406,54406 54715,54715,54715 55024,55024,55024 55333,55333,55333 55642,55642,55642 55952,55952,55952 56261,56261,56261 56570,56570,56570 56879,56879,56879 57188,57188,57188 57497,57497,57497 57806,57806,57806 58115,58115,58115 58425,58425,58425 58734,58734,58734 59043,59043,59043 59352,59352,59352 59661,59661,59661 59970,59970,59970 60279,60279,60279 60588,60588,60588 60898,60898,60898 61207,61207,61207 61516,61516,61516 61825,61825,61825 62134,62134,62134 62443,62443,62443 62752,62752,62752 63061,63061,63061 63371,63371,63371 63680,63680,63680 63989,63989,63989 64298,64298,64298 64607,64607,64607 64916,64916,64916 65225,65225,65225 65535,65535,65535 ########## g214.clr 0,0,0 307,307,307 615,615,615 923,923,923 1230,1230,1230 1538,1538,1538 1846,1846,1846 2153,2153,2153 2461,2461,2461 2769,2769,2769 3076,3076,3076 3384,3384,3384 3692,3692,3692 3999,3999,3999 4307,4307,4307 4615,4615,4615 4922,4922,4922 5230,5230,5230 5538,5538,5538 5845,5845,5845 6153,6153,6153 6461,6461,6461 6768,6768,6768 7076,7076,7076 7384,7384,7384 7691,7691,7691 7999,7999,7999 8307,8307,8307 8614,8614,8614 8922,8922,8922 9230,9230,9230 9537,9537,9537 9845,9845,9845 10153,10153,10153 10460,10460,10460 10768,10768,10768 11076,11076,11076 11384,11384,11384 11691,11691,11691 11999,11999,11999 12307,12307,12307 12614,12614,12614 12922,12922,12922 13230,13230,13230 13537,13537,13537 13845,13845,13845 14153,14153,14153 14460,14460,14460 14768,14768,14768 15076,15076,15076 15383,15383,15383 15691,15691,15691 15999,15999,15999 16306,16306,16306 16614,16614,16614 16922,16922,16922 17229,17229,17229 17537,17537,17537 17845,17845,17845 18152,18152,18152 18460,18460,18460 18768,18768,18768 19075,19075,19075 19383,19383,19383 19691,19691,19691 19998,19998,19998 20306,20306,20306 20614,20614,20614 20921,20921,20921 21229,21229,21229 21537,21537,21537 21845,21845,21845 22152,22152,22152 22460,22460,22460 22768,22768,22768 23075,23075,23075 23383,23383,23383 23691,23691,23691 23998,23998,23998 24306,24306,24306 24614,24614,24614 24921,24921,24921 25229,25229,25229 25537,25537,25537 25844,25844,25844 26152,26152,26152 26460,26460,26460 26767,26767,26767 27075,27075,27075 27383,27383,27383 27690,27690,27690 27998,27998,27998 28306,28306,28306 28613,28613,28613 28921,28921,28921 29229,29229,29229 29536,29536,29536 29844,29844,29844 30152,30152,30152 30459,30459,30459 30767,30767,30767 31075,31075,31075 31382,31382,31382 31690,31690,31690 31998,31998,31998 32305,32305,32305 32613,32613,32613 32921,32921,32921 33229,33229,33229 33536,33536,33536 33844,33844,33844 34152,34152,34152 34459,34459,34459 34767,34767,34767 35075,35075,35075 35382,35382,35382 35690,35690,35690 35998,35998,35998 36305,36305,36305 36613,36613,36613 36921,36921,36921 37228,37228,37228 37536,37536,37536 37844,37844,37844 38151,38151,38151 38459,38459,38459 38767,38767,38767 39074,39074,39074 39382,39382,39382 39690,39690,39690 39997,39997,39997 40305,40305,40305 40613,40613,40613 40920,40920,40920 41228,41228,41228 41536,41536,41536 41843,41843,41843 42151,42151,42151 42459,42459,42459 42766,42766,42766 43074,43074,43074 43382,43382,43382 43690,43690,43690 43997,43997,43997 44305,44305,44305 44613,44613,44613 44920,44920,44920 45228,45228,45228 45536,45536,45536 45843,45843,45843 46151,46151,46151 46459,46459,46459 46766,46766,46766 47074,47074,47074 47382,47382,47382 47689,47689,47689 47997,47997,47997 48305,48305,48305 48612,48612,48612 48920,48920,48920 49228,49228,49228 49535,49535,49535 49843,49843,49843 50151,50151,50151 50458,50458,50458 50766,50766,50766 51074,51074,51074 51381,51381,51381 51689,51689,51689 51997,51997,51997 52304,52304,52304 52612,52612,52612 52920,52920,52920 53227,53227,53227 53535,53535,53535 53843,53843,53843 54150,54150,54150 54458,54458,54458 54766,54766,54766 55074,55074,55074 55381,55381,55381 55689,55689,55689 55997,55997,55997 56304,56304,56304 56612,56612,56612 56920,56920,56920 57227,57227,57227 57535,57535,57535 57843,57843,57843 58150,58150,58150 58458,58458,58458 58766,58766,58766 59073,59073,59073 59381,59381,59381 59689,59689,59689 59996,59996,59996 60304,60304,60304 60612,60612,60612 60919,60919,60919 61227,61227,61227 61535,61535,61535 61842,61842,61842 62150,62150,62150 62458,62458,62458 62765,62765,62765 63073,63073,63073 63381,63381,63381 63688,63688,63688 63996,63996,63996 64304,64304,64304 64611,64611,64611 64919,64919,64919 65227,65227,65227 65535,65535,65535 ########## g215.clr 0,0,0 306,306,306 612,612,612 918,918,918 1224,1224,1224 1531,1531,1531 1837,1837,1837 2143,2143,2143 2449,2449,2449 2756,2756,2756 3062,3062,3062 3368,3368,3368 3674,3674,3674 3981,3981,3981 4287,4287,4287 4593,4593,4593 4899,4899,4899 5206,5206,5206 5512,5512,5512 5818,5818,5818 6124,6124,6124 6431,6431,6431 6737,6737,6737 7043,7043,7043 7349,7349,7349 7655,7655,7655 7962,7962,7962 8268,8268,8268 8574,8574,8574 8880,8880,8880 9187,9187,9187 9493,9493,9493 9799,9799,9799 10105,10105,10105 10412,10412,10412 10718,10718,10718 11024,11024,11024 11330,11330,11330 11637,11637,11637 11943,11943,11943 12249,12249,12249 12555,12555,12555 12862,12862,12862 13168,13168,13168 13474,13474,13474 13780,13780,13780 14086,14086,14086 14393,14393,14393 14699,14699,14699 15005,15005,15005 15311,15311,15311 15618,15618,15618 15924,15924,15924 16230,16230,16230 16536,16536,16536 16843,16843,16843 17149,17149,17149 17455,17455,17455 17761,17761,17761 18068,18068,18068 18374,18374,18374 18680,18680,18680 18986,18986,18986 19293,19293,19293 19599,19599,19599 19905,19905,19905 20211,20211,20211 20517,20517,20517 20824,20824,20824 21130,21130,21130 21436,21436,21436 21742,21742,21742 22049,22049,22049 22355,22355,22355 22661,22661,22661 22967,22967,22967 23274,23274,23274 23580,23580,23580 23886,23886,23886 24192,24192,24192 24499,24499,24499 24805,24805,24805 25111,25111,25111 25417,25417,25417 25724,25724,25724 26030,26030,26030 26336,26336,26336 26642,26642,26642 26948,26948,26948 27255,27255,27255 27561,27561,27561 27867,27867,27867 28173,28173,28173 28480,28480,28480 28786,28786,28786 29092,29092,29092 29398,29398,29398 29705,29705,29705 30011,30011,30011 30317,30317,30317 30623,30623,30623 30930,30930,30930 31236,31236,31236 31542,31542,31542 31848,31848,31848 32155,32155,32155 32461,32461,32461 32767,32767,32767 33073,33073,33073 33379,33379,33379 33686,33686,33686 33992,33992,33992 34298,34298,34298 34604,34604,34604 34911,34911,34911 35217,35217,35217 35523,35523,35523 35829,35829,35829 36136,36136,36136 36442,36442,36442 36748,36748,36748 37054,37054,37054 37361,37361,37361 37667,37667,37667 37973,37973,37973 38279,38279,38279 38586,38586,38586 38892,38892,38892 39198,39198,39198 39504,39504,39504 39810,39810,39810 40117,40117,40117 40423,40423,40423 40729,40729,40729 41035,41035,41035 41342,41342,41342 41648,41648,41648 41954,41954,41954 42260,42260,42260 42567,42567,42567 42873,42873,42873 43179,43179,43179 43485,43485,43485 43792,43792,43792 44098,44098,44098 44404,44404,44404 44710,44710,44710 45017,45017,45017 45323,45323,45323 45629,45629,45629 45935,45935,45935 46241,46241,46241 46548,46548,46548 46854,46854,46854 47160,47160,47160 47466,47466,47466 47773,47773,47773 48079,48079,48079 48385,48385,48385 48691,48691,48691 48998,48998,48998 49304,49304,49304 49610,49610,49610 49916,49916,49916 50223,50223,50223 50529,50529,50529 50835,50835,50835 51141,51141,51141 51448,51448,51448 51754,51754,51754 52060,52060,52060 52366,52366,52366 52672,52672,52672 52979,52979,52979 53285,53285,53285 53591,53591,53591 53897,53897,53897 54204,54204,54204 54510,54510,54510 54816,54816,54816 55122,55122,55122 55429,55429,55429 55735,55735,55735 56041,56041,56041 56347,56347,56347 56654,56654,56654 56960,56960,56960 57266,57266,57266 57572,57572,57572 57879,57879,57879 58185,58185,58185 58491,58491,58491 58797,58797,58797 59103,59103,59103 59410,59410,59410 59716,59716,59716 60022,60022,60022 60328,60328,60328 60635,60635,60635 60941,60941,60941 61247,61247,61247 61553,61553,61553 61860,61860,61860 62166,62166,62166 62472,62472,62472 62778,62778,62778 63085,63085,63085 63391,63391,63391 63697,63697,63697 64003,64003,64003 64310,64310,64310 64616,64616,64616 64922,64922,64922 65228,65228,65228 65534,65534,65534 ########## g216.clr 0,0,0 304,304,304 609,609,609 914,914,914 1219,1219,1219 1524,1524,1524 1828,1828,1828 2133,2133,2133 2438,2438,2438 2743,2743,2743 3048,3048,3048 3352,3352,3352 3657,3657,3657 3962,3962,3962 4267,4267,4267 4572,4572,4572 4877,4877,4877 5181,5181,5181 5486,5486,5486 5791,5791,5791 6096,6096,6096 6401,6401,6401 6705,6705,6705 7010,7010,7010 7315,7315,7315 7620,7620,7620 7925,7925,7925 8229,8229,8229 8534,8534,8534 8839,8839,8839 9144,9144,9144 9449,9449,9449 9754,9754,9754 10058,10058,10058 10363,10363,10363 10668,10668,10668 10973,10973,10973 11278,11278,11278 11582,11582,11582 11887,11887,11887 12192,12192,12192 12497,12497,12497 12802,12802,12802 13107,13107,13107 13411,13411,13411 13716,13716,13716 14021,14021,14021 14326,14326,14326 14631,14631,14631 14935,14935,14935 15240,15240,15240 15545,15545,15545 15850,15850,15850 16155,16155,16155 16459,16459,16459 16764,16764,16764 17069,17069,17069 17374,17374,17374 17679,17679,17679 17984,17984,17984 18288,18288,18288 18593,18593,18593 18898,18898,18898 19203,19203,19203 19508,19508,19508 19812,19812,19812 20117,20117,20117 20422,20422,20422 20727,20727,20727 21032,21032,21032 21336,21336,21336 21641,21641,21641 21946,21946,21946 22251,22251,22251 22556,22556,22556 22861,22861,22861 23165,23165,23165 23470,23470,23470 23775,23775,23775 24080,24080,24080 24385,24385,24385 24689,24689,24689 24994,24994,24994 25299,25299,25299 25604,25604,25604 25909,25909,25909 26214,26214,26214 26518,26518,26518 26823,26823,26823 27128,27128,27128 27433,27433,27433 27738,27738,27738 28042,28042,28042 28347,28347,28347 28652,28652,28652 28957,28957,28957 29262,29262,29262 29566,29566,29566 29871,29871,29871 30176,30176,30176 30481,30481,30481 30786,30786,30786 31091,31091,31091 31395,31395,31395 31700,31700,31700 32005,32005,32005 32310,32310,32310 32615,32615,32615 32919,32919,32919 33224,33224,33224 33529,33529,33529 33834,33834,33834 34139,34139,34139 34443,34443,34443 34748,34748,34748 35053,35053,35053 35358,35358,35358 35663,35663,35663 35968,35968,35968 36272,36272,36272 36577,36577,36577 36882,36882,36882 37187,37187,37187 37492,37492,37492 37796,37796,37796 38101,38101,38101 38406,38406,38406 38711,38711,38711 39016,39016,39016 39321,39321,39321 39625,39625,39625 39930,39930,39930 40235,40235,40235 40540,40540,40540 40845,40845,40845 41149,41149,41149 41454,41454,41454 41759,41759,41759 42064,42064,42064 42369,42369,42369 42673,42673,42673 42978,42978,42978 43283,43283,43283 43588,43588,43588 43893,43893,43893 44198,44198,44198 44502,44502,44502 44807,44807,44807 45112,45112,45112 45417,45417,45417 45722,45722,45722 46026,46026,46026 46331,46331,46331 46636,46636,46636 46941,46941,46941 47246,47246,47246 47550,47550,47550 47855,47855,47855 48160,48160,48160 48465,48465,48465 48770,48770,48770 49075,49075,49075 49379,49379,49379 49684,49684,49684 49989,49989,49989 50294,50294,50294 50599,50599,50599 50903,50903,50903 51208,51208,51208 51513,51513,51513 51818,51818,51818 52123,52123,52123 52428,52428,52428 52732,52732,52732 53037,53037,53037 53342,53342,53342 53647,53647,53647 53952,53952,53952 54256,54256,54256 54561,54561,54561 54866,54866,54866 55171,55171,55171 55476,55476,55476 55780,55780,55780 56085,56085,56085 56390,56390,56390 56695,56695,56695 57000,57000,57000 57305,57305,57305 57609,57609,57609 57914,57914,57914 58219,58219,58219 58524,58524,58524 58829,58829,58829 59133,59133,59133 59438,59438,59438 59743,59743,59743 60048,60048,60048 60353,60353,60353 60657,60657,60657 60962,60962,60962 61267,61267,61267 61572,61572,61572 61877,61877,61877 62182,62182,62182 62486,62486,62486 62791,62791,62791 63096,63096,63096 63401,63401,63401 63706,63706,63706 64010,64010,64010 64315,64315,64315 64620,64620,64620 64925,64925,64925 65230,65230,65230 65535,65535,65535 ########## g217.clr 0,0,0 303,303,303 606,606,606 910,910,910 1213,1213,1213 1517,1517,1517 1820,1820,1820 2123,2123,2123 2427,2427,2427 2730,2730,2730 3034,3034,3034 3337,3337,3337 3640,3640,3640 3944,3944,3944 4247,4247,4247 4551,4551,4551 4854,4854,4854 5157,5157,5157 5461,5461,5461 5764,5764,5764 6068,6068,6068 6371,6371,6371 6674,6674,6674 6978,6978,6978 7281,7281,7281 7585,7585,7585 7888,7888,7888 8191,8191,8191 8495,8495,8495 8798,8798,8798 9102,9102,9102 9405,9405,9405 9708,9708,9708 10012,10012,10012 10315,10315,10315 10619,10619,10619 10922,10922,10922 11225,11225,11225 11529,11529,11529 11832,11832,11832 12136,12136,12136 12439,12439,12439 12742,12742,12742 13046,13046,13046 13349,13349,13349 13653,13653,13653 13956,13956,13956 14259,14259,14259 14563,14563,14563 14866,14866,14866 15170,15170,15170 15473,15473,15473 15776,15776,15776 16080,16080,16080 16383,16383,16383 16687,16687,16687 16990,16990,16990 17293,17293,17293 17597,17597,17597 17900,17900,17900 18204,18204,18204 18507,18507,18507 18810,18810,18810 19114,19114,19114 19417,19417,19417 19721,19721,19721 20024,20024,20024 20327,20327,20327 20631,20631,20631 20934,20934,20934 21238,21238,21238 21541,21541,21541 21845,21845,21845 22148,22148,22148 22451,22451,22451 22755,22755,22755 23058,23058,23058 23362,23362,23362 23665,23665,23665 23968,23968,23968 24272,24272,24272 24575,24575,24575 24879,24879,24879 25182,25182,25182 25485,25485,25485 25789,25789,25789 26092,26092,26092 26396,26396,26396 26699,26699,26699 27002,27002,27002 27306,27306,27306 27609,27609,27609 27913,27913,27913 28216,28216,28216 28519,28519,28519 28823,28823,28823 29126,29126,29126 29430,29430,29430 29733,29733,29733 30036,30036,30036 30340,30340,30340 30643,30643,30643 30947,30947,30947 31250,31250,31250 31553,31553,31553 31857,31857,31857 32160,32160,32160 32464,32464,32464 32767,32767,32767 33070,33070,33070 33374,33374,33374 33677,33677,33677 33981,33981,33981 34284,34284,34284 34587,34587,34587 34891,34891,34891 35194,35194,35194 35498,35498,35498 35801,35801,35801 36104,36104,36104 36408,36408,36408 36711,36711,36711 37015,37015,37015 37318,37318,37318 37621,37621,37621 37925,37925,37925 38228,38228,38228 38532,38532,38532 38835,38835,38835 39138,39138,39138 39442,39442,39442 39745,39745,39745 40049,40049,40049 40352,40352,40352 40655,40655,40655 40959,40959,40959 41262,41262,41262 41566,41566,41566 41869,41869,41869 42172,42172,42172 42476,42476,42476 42779,42779,42779 43083,43083,43083 43386,43386,43386 43690,43690,43690 43993,43993,43993 44296,44296,44296 44600,44600,44600 44903,44903,44903 45207,45207,45207 45510,45510,45510 45813,45813,45813 46117,46117,46117 46420,46420,46420 46724,46724,46724 47027,47027,47027 47330,47330,47330 47634,47634,47634 47937,47937,47937 48241,48241,48241 48544,48544,48544 48847,48847,48847 49151,49151,49151 49454,49454,49454 49758,49758,49758 50061,50061,50061 50364,50364,50364 50668,50668,50668 50971,50971,50971 51275,51275,51275 51578,51578,51578 51881,51881,51881 52185,52185,52185 52488,52488,52488 52792,52792,52792 53095,53095,53095 53398,53398,53398 53702,53702,53702 54005,54005,54005 54309,54309,54309 54612,54612,54612 54915,54915,54915 55219,55219,55219 55522,55522,55522 55826,55826,55826 56129,56129,56129 56432,56432,56432 56736,56736,56736 57039,57039,57039 57343,57343,57343 57646,57646,57646 57949,57949,57949 58253,58253,58253 58556,58556,58556 58860,58860,58860 59163,59163,59163 59466,59466,59466 59770,59770,59770 60073,60073,60073 60377,60377,60377 60680,60680,60680 60983,60983,60983 61287,61287,61287 61590,61590,61590 61894,61894,61894 62197,62197,62197 62500,62500,62500 62804,62804,62804 63107,63107,63107 63411,63411,63411 63714,63714,63714 64017,64017,64017 64321,64321,64321 64624,64624,64624 64928,64928,64928 65231,65231,65231 65535,65535,65535 ########## g218.clr 0,0,0 302,302,302 604,604,604 906,906,906 1208,1208,1208 1510,1510,1510 1812,1812,1812 2114,2114,2114 2416,2416,2416 2718,2718,2718 3020,3020,3020 3322,3322,3322 3624,3624,3624 3926,3926,3926 4228,4228,4228 4530,4530,4530 4832,4832,4832 5134,5134,5134 5436,5436,5436 5738,5738,5738 6040,6040,6040 6342,6342,6342 6644,6644,6644 6946,6946,6946 7248,7248,7248 7550,7550,7550 7852,7852,7852 8154,8154,8154 8456,8456,8456 8758,8758,8758 9060,9060,9060 9362,9362,9362 9664,9664,9664 9966,9966,9966 10268,10268,10268 10570,10570,10570 10872,10872,10872 11174,11174,11174 11476,11476,11476 11778,11778,11778 12080,12080,12080 12382,12382,12382 12684,12684,12684 12986,12986,12986 13288,13288,13288 13590,13590,13590 13892,13892,13892 14194,14194,14194 14496,14496,14496 14798,14798,14798 15100,15100,15100 15402,15402,15402 15704,15704,15704 16006,16006,16006 16308,16308,16308 16610,16610,16610 16912,16912,16912 17214,17214,17214 17516,17516,17516 17818,17818,17818 18120,18120,18120 18422,18422,18422 18724,18724,18724 19026,19026,19026 19328,19328,19328 19630,19630,19630 19932,19932,19932 20234,20234,20234 20536,20536,20536 20838,20838,20838 21140,21140,21140 21442,21442,21442 21744,21744,21744 22046,22046,22046 22348,22348,22348 22650,22650,22650 22952,22952,22952 23254,23254,23254 23556,23556,23556 23858,23858,23858 24160,24160,24160 24462,24462,24462 24764,24764,24764 25066,25066,25066 25368,25368,25368 25670,25670,25670 25972,25972,25972 26274,26274,26274 26576,26576,26576 26878,26878,26878 27180,27180,27180 27482,27482,27482 27784,27784,27784 28086,28086,28086 28388,28388,28388 28690,28690,28690 28992,28992,28992 29294,29294,29294 29596,29596,29596 29898,29898,29898 30200,30200,30200 30502,30502,30502 30804,30804,30804 31106,31106,31106 31408,31408,31408 31710,31710,31710 32012,32012,32012 32314,32314,32314 32616,32616,32616 32918,32918,32918 33220,33220,33220 33522,33522,33522 33824,33824,33824 34126,34126,34126 34428,34428,34428 34730,34730,34730 35032,35032,35032 35334,35334,35334 35636,35636,35636 35938,35938,35938 36240,36240,36240 36542,36542,36542 36844,36844,36844 37146,37146,37146 37448,37448,37448 37750,37750,37750 38052,38052,38052 38354,38354,38354 38656,38656,38656 38958,38958,38958 39260,39260,39260 39562,39562,39562 39864,39864,39864 40166,40166,40166 40468,40468,40468 40770,40770,40770 41072,41072,41072 41374,41374,41374 41676,41676,41676 41978,41978,41978 42280,42280,42280 42582,42582,42582 42884,42884,42884 43186,43186,43186 43488,43488,43488 43790,43790,43790 44092,44092,44092 44394,44394,44394 44696,44696,44696 44998,44998,44998 45300,45300,45300 45602,45602,45602 45904,45904,45904 46206,46206,46206 46508,46508,46508 46810,46810,46810 47112,47112,47112 47414,47414,47414 47716,47716,47716 48018,48018,48018 48320,48320,48320 48622,48622,48622 48924,48924,48924 49226,49226,49226 49528,49528,49528 49830,49830,49830 50132,50132,50132 50434,50434,50434 50736,50736,50736 51038,51038,51038 51340,51340,51340 51642,51642,51642 51944,51944,51944 52246,52246,52246 52548,52548,52548 52850,52850,52850 53152,53152,53152 53454,53454,53454 53756,53756,53756 54058,54058,54058 54360,54360,54360 54662,54662,54662 54964,54964,54964 55266,55266,55266 55568,55568,55568 55870,55870,55870 56172,56172,56172 56474,56474,56474 56776,56776,56776 57078,57078,57078 57380,57380,57380 57682,57682,57682 57984,57984,57984 58286,58286,58286 58588,58588,58588 58890,58890,58890 59192,59192,59192 59494,59494,59494 59796,59796,59796 60098,60098,60098 60400,60400,60400 60702,60702,60702 61004,61004,61004 61306,61306,61306 61608,61608,61608 61910,61910,61910 62212,62212,62212 62514,62514,62514 62816,62816,62816 63118,63118,63118 63420,63420,63420 63722,63722,63722 64024,64024,64024 64326,64326,64326 64628,64628,64628 64930,64930,64930 65232,65232,65232 65534,65534,65534 ########## g219.clr 0,0,0 300,300,300 601,601,601 901,901,901 1202,1202,1202 1503,1503,1503 1803,1803,1803 2104,2104,2104 2404,2404,2404 2705,2705,2705 3006,3006,3006 3306,3306,3306 3607,3607,3607 3908,3908,3908 4208,4208,4208 4509,4509,4509 4809,4809,4809 5110,5110,5110 5411,5411,5411 5711,5711,5711 6012,6012,6012 6313,6313,6313 6613,6613,6613 6914,6914,6914 7214,7214,7214 7515,7515,7515 7816,7816,7816 8116,8116,8116 8417,8417,8417 8717,8717,8717 9018,9018,9018 9319,9319,9319 9619,9619,9619 9920,9920,9920 10221,10221,10221 10521,10521,10521 10822,10822,10822 11122,11122,11122 11423,11423,11423 11724,11724,11724 12024,12024,12024 12325,12325,12325 12626,12626,12626 12926,12926,12926 13227,13227,13227 13527,13527,13527 13828,13828,13828 14129,14129,14129 14429,14429,14429 14730,14730,14730 15030,15030,15030 15331,15331,15331 15632,15632,15632 15932,15932,15932 16233,16233,16233 16534,16534,16534 16834,16834,16834 17135,17135,17135 17435,17435,17435 17736,17736,17736 18037,18037,18037 18337,18337,18337 18638,18638,18638 18939,18939,18939 19239,19239,19239 19540,19540,19540 19840,19840,19840 20141,20141,20141 20442,20442,20442 20742,20742,20742 21043,21043,21043 21343,21343,21343 21644,21644,21644 21945,21945,21945 22245,22245,22245 22546,22546,22546 22847,22847,22847 23147,23147,23147 23448,23448,23448 23748,23748,23748 24049,24049,24049 24350,24350,24350 24650,24650,24650 24951,24951,24951 25252,25252,25252 25552,25552,25552 25853,25853,25853 26153,26153,26153 26454,26454,26454 26755,26755,26755 27055,27055,27055 27356,27356,27356 27656,27656,27656 27957,27957,27957 28258,28258,28258 28558,28558,28558 28859,28859,28859 29160,29160,29160 29460,29460,29460 29761,29761,29761 30061,30061,30061 30362,30362,30362 30663,30663,30663 30963,30963,30963 31264,31264,31264 31565,31565,31565 31865,31865,31865 32166,32166,32166 32466,32466,32466 32767,32767,32767 33068,33068,33068 33368,33368,33368 33669,33669,33669 33969,33969,33969 34270,34270,34270 34571,34571,34571 34871,34871,34871 35172,35172,35172 35473,35473,35473 35773,35773,35773 36074,36074,36074 36374,36374,36374 36675,36675,36675 36976,36976,36976 37276,37276,37276 37577,37577,37577 37878,37878,37878 38178,38178,38178 38479,38479,38479 38779,38779,38779 39080,39080,39080 39381,39381,39381 39681,39681,39681 39982,39982,39982 40282,40282,40282 40583,40583,40583 40884,40884,40884 41184,41184,41184 41485,41485,41485 41786,41786,41786 42086,42086,42086 42387,42387,42387 42687,42687,42687 42988,42988,42988 43289,43289,43289 43589,43589,43589 43890,43890,43890 44191,44191,44191 44491,44491,44491 44792,44792,44792 45092,45092,45092 45393,45393,45393 45694,45694,45694 45994,45994,45994 46295,46295,46295 46595,46595,46595 46896,46896,46896 47197,47197,47197 47497,47497,47497 47798,47798,47798 48099,48099,48099 48399,48399,48399 48700,48700,48700 49000,49000,49000 49301,49301,49301 49602,49602,49602 49902,49902,49902 50203,50203,50203 50504,50504,50504 50804,50804,50804 51105,51105,51105 51405,51405,51405 51706,51706,51706 52007,52007,52007 52307,52307,52307 52608,52608,52608 52908,52908,52908 53209,53209,53209 53510,53510,53510 53810,53810,53810 54111,54111,54111 54412,54412,54412 54712,54712,54712 55013,55013,55013 55313,55313,55313 55614,55614,55614 55915,55915,55915 56215,56215,56215 56516,56516,56516 56817,56817,56817 57117,57117,57117 57418,57418,57418 57718,57718,57718 58019,58019,58019 58320,58320,58320 58620,58620,58620 58921,58921,58921 59221,59221,59221 59522,59522,59522 59823,59823,59823 60123,60123,60123 60424,60424,60424 60725,60725,60725 61025,61025,61025 61326,61326,61326 61626,61626,61626 61927,61927,61927 62228,62228,62228 62528,62528,62528 62829,62829,62829 63130,63130,63130 63430,63430,63430 63731,63731,63731 64031,64031,64031 64332,64332,64332 64633,64633,64633 64933,64933,64933 65234,65234,65234 65535,65535,65535 ########## g22.clr 0,0,0 3120,3120,3120 6241,6241,6241 9362,9362,9362 12482,12482,12482 15603,15603,15603 18724,18724,18724 21844,21844,21844 24965,24965,24965 28086,28086,28086 31207,31207,31207 34327,34327,34327 37448,37448,37448 40569,40569,40569 43689,43689,43689 46810,46810,46810 49931,49931,49931 53052,53052,53052 56172,56172,56172 59293,59293,59293 62414,62414,62414 65534,65534,65534 ########## g220.clr 0,0,0 299,299,299 598,598,598 897,897,897 1196,1196,1196 1496,1496,1496 1795,1795,1795 2094,2094,2094 2393,2393,2393 2693,2693,2693 2992,2992,2992 3291,3291,3291 3590,3590,3590 3890,3890,3890 4189,4189,4189 4488,4488,4488 4787,4787,4787 5087,5087,5087 5386,5386,5386 5685,5685,5685 5984,5984,5984 6284,6284,6284 6583,6583,6583 6882,6882,6882 7181,7181,7181 7481,7481,7481 7780,7780,7780 8079,8079,8079 8378,8378,8378 8678,8678,8678 8977,8977,8977 9276,9276,9276 9575,9575,9575 9875,9875,9875 10174,10174,10174 10473,10473,10473 10772,10772,10772 11072,11072,11072 11371,11371,11371 11670,11670,11670 11969,11969,11969 12269,12269,12269 12568,12568,12568 12867,12867,12867 13166,13166,13166 13466,13466,13466 13765,13765,13765 14064,14064,14064 14363,14363,14363 14663,14663,14663 14962,14962,14962 15261,15261,15261 15560,15560,15560 15860,15860,15860 16159,16159,16159 16458,16458,16458 16757,16757,16757 17057,17057,17057 17356,17356,17356 17655,17655,17655 17954,17954,17954 18254,18254,18254 18553,18553,18553 18852,18852,18852 19151,19151,19151 19451,19451,19451 19750,19750,19750 20049,20049,20049 20348,20348,20348 20648,20648,20648 20947,20947,20947 21246,21246,21246 21545,21545,21545 21845,21845,21845 22144,22144,22144 22443,22443,22443 22742,22742,22742 23041,23041,23041 23341,23341,23341 23640,23640,23640 23939,23939,23939 24238,24238,24238 24538,24538,24538 24837,24837,24837 25136,25136,25136 25435,25435,25435 25735,25735,25735 26034,26034,26034 26333,26333,26333 26632,26632,26632 26932,26932,26932 27231,27231,27231 27530,27530,27530 27829,27829,27829 28129,28129,28129 28428,28428,28428 28727,28727,28727 29026,29026,29026 29326,29326,29326 29625,29625,29625 29924,29924,29924 30223,30223,30223 30523,30523,30523 30822,30822,30822 31121,31121,31121 31420,31420,31420 31720,31720,31720 32019,32019,32019 32318,32318,32318 32617,32617,32617 32917,32917,32917 33216,33216,33216 33515,33515,33515 33814,33814,33814 34114,34114,34114 34413,34413,34413 34712,34712,34712 35011,35011,35011 35311,35311,35311 35610,35610,35610 35909,35909,35909 36208,36208,36208 36508,36508,36508 36807,36807,36807 37106,37106,37106 37405,37405,37405 37705,37705,37705 38004,38004,38004 38303,38303,38303 38602,38602,38602 38902,38902,38902 39201,39201,39201 39500,39500,39500 39799,39799,39799 40099,40099,40099 40398,40398,40398 40697,40697,40697 40996,40996,40996 41296,41296,41296 41595,41595,41595 41894,41894,41894 42193,42193,42193 42493,42493,42493 42792,42792,42792 43091,43091,43091 43390,43390,43390 43690,43690,43690 43989,43989,43989 44288,44288,44288 44587,44587,44587 44886,44886,44886 45186,45186,45186 45485,45485,45485 45784,45784,45784 46083,46083,46083 46383,46383,46383 46682,46682,46682 46981,46981,46981 47280,47280,47280 47580,47580,47580 47879,47879,47879 48178,48178,48178 48477,48477,48477 48777,48777,48777 49076,49076,49076 49375,49375,49375 49674,49674,49674 49974,49974,49974 50273,50273,50273 50572,50572,50572 50871,50871,50871 51171,51171,51171 51470,51470,51470 51769,51769,51769 52068,52068,52068 52368,52368,52368 52667,52667,52667 52966,52966,52966 53265,53265,53265 53565,53565,53565 53864,53864,53864 54163,54163,54163 54462,54462,54462 54762,54762,54762 55061,55061,55061 55360,55360,55360 55659,55659,55659 55959,55959,55959 56258,56258,56258 56557,56557,56557 56856,56856,56856 57156,57156,57156 57455,57455,57455 57754,57754,57754 58053,58053,58053 58353,58353,58353 58652,58652,58652 58951,58951,58951 59250,59250,59250 59550,59550,59550 59849,59849,59849 60148,60148,60148 60447,60447,60447 60747,60747,60747 61046,61046,61046 61345,61345,61345 61644,61644,61644 61944,61944,61944 62243,62243,62243 62542,62542,62542 62841,62841,62841 63141,63141,63141 63440,63440,63440 63739,63739,63739 64038,64038,64038 64338,64338,64338 64637,64637,64637 64936,64936,64936 65235,65235,65235 65535,65535,65535 ########## g221.clr 0,0,0 297,297,297 595,595,595 893,893,893 1191,1191,1191 1489,1489,1489 1787,1787,1787 2085,2085,2085 2383,2383,2383 2680,2680,2680 2978,2978,2978 3276,3276,3276 3574,3574,3574 3872,3872,3872 4170,4170,4170 4468,4468,4468 4766,4766,4766 5064,5064,5064 5361,5361,5361 5659,5659,5659 5957,5957,5957 6255,6255,6255 6553,6553,6553 6851,6851,6851 7149,7149,7149 7447,7447,7447 7745,7745,7745 8042,8042,8042 8340,8340,8340 8638,8638,8638 8936,8936,8936 9234,9234,9234 9532,9532,9532 9830,9830,9830 10128,10128,10128 10426,10426,10426 10723,10723,10723 11021,11021,11021 11319,11319,11319 11617,11617,11617 11915,11915,11915 12213,12213,12213 12511,12511,12511 12809,12809,12809 13107,13107,13107 13404,13404,13404 13702,13702,13702 14000,14000,14000 14298,14298,14298 14596,14596,14596 14894,14894,14894 15192,15192,15192 15490,15490,15490 15787,15787,15787 16085,16085,16085 16383,16383,16383 16681,16681,16681 16979,16979,16979 17277,17277,17277 17575,17575,17575 17873,17873,17873 18171,18171,18171 18468,18468,18468 18766,18766,18766 19064,19064,19064 19362,19362,19362 19660,19660,19660 19958,19958,19958 20256,20256,20256 20554,20554,20554 20852,20852,20852 21149,21149,21149 21447,21447,21447 21745,21745,21745 22043,22043,22043 22341,22341,22341 22639,22639,22639 22937,22937,22937 23235,23235,23235 23533,23533,23533 23830,23830,23830 24128,24128,24128 24426,24426,24426 24724,24724,24724 25022,25022,25022 25320,25320,25320 25618,25618,25618 25916,25916,25916 26214,26214,26214 26511,26511,26511 26809,26809,26809 27107,27107,27107 27405,27405,27405 27703,27703,27703 28001,28001,28001 28299,28299,28299 28597,28597,28597 28894,28894,28894 29192,29192,29192 29490,29490,29490 29788,29788,29788 30086,30086,30086 30384,30384,30384 30682,30682,30682 30980,30980,30980 31278,31278,31278 31575,31575,31575 31873,31873,31873 32171,32171,32171 32469,32469,32469 32767,32767,32767 33065,33065,33065 33363,33363,33363 33661,33661,33661 33959,33959,33959 34256,34256,34256 34554,34554,34554 34852,34852,34852 35150,35150,35150 35448,35448,35448 35746,35746,35746 36044,36044,36044 36342,36342,36342 36640,36640,36640 36937,36937,36937 37235,37235,37235 37533,37533,37533 37831,37831,37831 38129,38129,38129 38427,38427,38427 38725,38725,38725 39023,39023,39023 39321,39321,39321 39618,39618,39618 39916,39916,39916 40214,40214,40214 40512,40512,40512 40810,40810,40810 41108,41108,41108 41406,41406,41406 41704,41704,41704 42001,42001,42001 42299,42299,42299 42597,42597,42597 42895,42895,42895 43193,43193,43193 43491,43491,43491 43789,43789,43789 44087,44087,44087 44385,44385,44385 44682,44682,44682 44980,44980,44980 45278,45278,45278 45576,45576,45576 45874,45874,45874 46172,46172,46172 46470,46470,46470 46768,46768,46768 47066,47066,47066 47363,47363,47363 47661,47661,47661 47959,47959,47959 48257,48257,48257 48555,48555,48555 48853,48853,48853 49151,49151,49151 49449,49449,49449 49747,49747,49747 50044,50044,50044 50342,50342,50342 50640,50640,50640 50938,50938,50938 51236,51236,51236 51534,51534,51534 51832,51832,51832 52130,52130,52130 52428,52428,52428 52725,52725,52725 53023,53023,53023 53321,53321,53321 53619,53619,53619 53917,53917,53917 54215,54215,54215 54513,54513,54513 54811,54811,54811 55108,55108,55108 55406,55406,55406 55704,55704,55704 56002,56002,56002 56300,56300,56300 56598,56598,56598 56896,56896,56896 57194,57194,57194 57492,57492,57492 57789,57789,57789 58087,58087,58087 58385,58385,58385 58683,58683,58683 58981,58981,58981 59279,59279,59279 59577,59577,59577 59875,59875,59875 60173,60173,60173 60470,60470,60470 60768,60768,60768 61066,61066,61066 61364,61364,61364 61662,61662,61662 61960,61960,61960 62258,62258,62258 62556,62556,62556 62854,62854,62854 63151,63151,63151 63449,63449,63449 63747,63747,63747 64045,64045,64045 64343,64343,64343 64641,64641,64641 64939,64939,64939 65237,65237,65237 65535,65535,65535 ########## g222.clr 0,0,0 296,296,296 593,593,593 889,889,889 1186,1186,1186 1482,1482,1482 1779,1779,1779 2075,2075,2075 2372,2372,2372 2668,2668,2668 2965,2965,2965 3261,3261,3261 3558,3558,3558 3855,3855,3855 4151,4151,4151 4448,4448,4448 4744,4744,4744 5041,5041,5041 5337,5337,5337 5634,5634,5634 5930,5930,5930 6227,6227,6227 6523,6523,6523 6820,6820,6820 7116,7116,7116 7413,7413,7413 7710,7710,7710 8006,8006,8006 8303,8303,8303 8599,8599,8599 8896,8896,8896 9192,9192,9192 9489,9489,9489 9785,9785,9785 10082,10082,10082 10378,10378,10378 10675,10675,10675 10971,10971,10971 11268,11268,11268 11565,11565,11565 11861,11861,11861 12158,12158,12158 12454,12454,12454 12751,12751,12751 13047,13047,13047 13344,13344,13344 13640,13640,13640 13937,13937,13937 14233,14233,14233 14530,14530,14530 14826,14826,14826 15123,15123,15123 15420,15420,15420 15716,15716,15716 16013,16013,16013 16309,16309,16309 16606,16606,16606 16902,16902,16902 17199,17199,17199 17495,17495,17495 17792,17792,17792 18088,18088,18088 18385,18385,18385 18681,18681,18681 18978,18978,18978 19275,19275,19275 19571,19571,19571 19868,19868,19868 20164,20164,20164 20461,20461,20461 20757,20757,20757 21054,21054,21054 21350,21350,21350 21647,21647,21647 21943,21943,21943 22240,22240,22240 22536,22536,22536 22833,22833,22833 23130,23130,23130 23426,23426,23426 23723,23723,23723 24019,24019,24019 24316,24316,24316 24612,24612,24612 24909,24909,24909 25205,25205,25205 25502,25502,25502 25798,25798,25798 26095,26095,26095 26391,26391,26391 26688,26688,26688 26985,26985,26985 27281,27281,27281 27578,27578,27578 27874,27874,27874 28171,28171,28171 28467,28467,28467 28764,28764,28764 29060,29060,29060 29357,29357,29357 29653,29653,29653 29950,29950,29950 30246,30246,30246 30543,30543,30543 30840,30840,30840 31136,31136,31136 31433,31433,31433 31729,31729,31729 32026,32026,32026 32322,32322,32322 32619,32619,32619 32915,32915,32915 33212,33212,33212 33508,33508,33508 33805,33805,33805 34101,34101,34101 34398,34398,34398 34695,34695,34695 34991,34991,34991 35288,35288,35288 35584,35584,35584 35881,35881,35881 36177,36177,36177 36474,36474,36474 36770,36770,36770 37067,37067,37067 37363,37363,37363 37660,37660,37660 37956,37956,37956 38253,38253,38253 38550,38550,38550 38846,38846,38846 39143,39143,39143 39439,39439,39439 39736,39736,39736 40032,40032,40032 40329,40329,40329 40625,40625,40625 40922,40922,40922 41218,41218,41218 41515,41515,41515 41811,41811,41811 42108,42108,42108 42405,42405,42405 42701,42701,42701 42998,42998,42998 43294,43294,43294 43591,43591,43591 43887,43887,43887 44184,44184,44184 44480,44480,44480 44777,44777,44777 45073,45073,45073 45370,45370,45370 45666,45666,45666 45963,45963,45963 46260,46260,46260 46556,46556,46556 46853,46853,46853 47149,47149,47149 47446,47446,47446 47742,47742,47742 48039,48039,48039 48335,48335,48335 48632,48632,48632 48928,48928,48928 49225,49225,49225 49521,49521,49521 49818,49818,49818 50115,50115,50115 50411,50411,50411 50708,50708,50708 51004,51004,51004 51301,51301,51301 51597,51597,51597 51894,51894,51894 52190,52190,52190 52487,52487,52487 52783,52783,52783 53080,53080,53080 53376,53376,53376 53673,53673,53673 53970,53970,53970 54266,54266,54266 54563,54563,54563 54859,54859,54859 55156,55156,55156 55452,55452,55452 55749,55749,55749 56045,56045,56045 56342,56342,56342 56638,56638,56638 56935,56935,56935 57231,57231,57231 57528,57528,57528 57825,57825,57825 58121,58121,58121 58418,58418,58418 58714,58714,58714 59011,59011,59011 59307,59307,59307 59604,59604,59604 59900,59900,59900 60197,60197,60197 60493,60493,60493 60790,60790,60790 61086,61086,61086 61383,61383,61383 61680,61680,61680 61976,61976,61976 62273,62273,62273 62569,62569,62569 62866,62866,62866 63162,63162,63162 63459,63459,63459 63755,63755,63755 64052,64052,64052 64348,64348,64348 64645,64645,64645 64941,64941,64941 65238,65238,65238 65535,65535,65535 ########## g223.clr 0,0,0 295,295,295 590,590,590 885,885,885 1180,1180,1180 1476,1476,1476 1771,1771,1771 2066,2066,2066 2361,2361,2361 2656,2656,2656 2952,2952,2952 3247,3247,3247 3542,3542,3542 3837,3837,3837 4132,4132,4132 4428,4428,4428 4723,4723,4723 5018,5018,5018 5313,5313,5313 5608,5608,5608 5904,5904,5904 6199,6199,6199 6494,6494,6494 6789,6789,6789 7084,7084,7084 7380,7380,7380 7675,7675,7675 7970,7970,7970 8265,8265,8265 8560,8560,8560 8856,8856,8856 9151,9151,9151 9446,9446,9446 9741,9741,9741 10036,10036,10036 10332,10332,10332 10627,10627,10627 10922,10922,10922 11217,11217,11217 11512,11512,11512 11808,11808,11808 12103,12103,12103 12398,12398,12398 12693,12693,12693 12988,12988,12988 13284,13284,13284 13579,13579,13579 13874,13874,13874 14169,14169,14169 14464,14464,14464 14760,14760,14760 15055,15055,15055 15350,15350,15350 15645,15645,15645 15940,15940,15940 16236,16236,16236 16531,16531,16531 16826,16826,16826 17121,17121,17121 17416,17416,17416 17712,17712,17712 18007,18007,18007 18302,18302,18302 18597,18597,18597 18892,18892,18892 19188,19188,19188 19483,19483,19483 19778,19778,19778 20073,20073,20073 20368,20368,20368 20664,20664,20664 20959,20959,20959 21254,21254,21254 21549,21549,21549 21845,21845,21845 22140,22140,22140 22435,22435,22435 22730,22730,22730 23025,23025,23025 23321,23321,23321 23616,23616,23616 23911,23911,23911 24206,24206,24206 24501,24501,24501 24797,24797,24797 25092,25092,25092 25387,25387,25387 25682,25682,25682 25977,25977,25977 26273,26273,26273 26568,26568,26568 26863,26863,26863 27158,27158,27158 27453,27453,27453 27749,27749,27749 28044,28044,28044 28339,28339,28339 28634,28634,28634 28929,28929,28929 29225,29225,29225 29520,29520,29520 29815,29815,29815 30110,30110,30110 30405,30405,30405 30701,30701,30701 30996,30996,30996 31291,31291,31291 31586,31586,31586 31881,31881,31881 32177,32177,32177 32472,32472,32472 32767,32767,32767 33062,33062,33062 33357,33357,33357 33653,33653,33653 33948,33948,33948 34243,34243,34243 34538,34538,34538 34833,34833,34833 35129,35129,35129 35424,35424,35424 35719,35719,35719 36014,36014,36014 36309,36309,36309 36605,36605,36605 36900,36900,36900 37195,37195,37195 37490,37490,37490 37785,37785,37785 38081,38081,38081 38376,38376,38376 38671,38671,38671 38966,38966,38966 39261,39261,39261 39557,39557,39557 39852,39852,39852 40147,40147,40147 40442,40442,40442 40737,40737,40737 41033,41033,41033 41328,41328,41328 41623,41623,41623 41918,41918,41918 42213,42213,42213 42509,42509,42509 42804,42804,42804 43099,43099,43099 43394,43394,43394 43690,43690,43690 43985,43985,43985 44280,44280,44280 44575,44575,44575 44870,44870,44870 45166,45166,45166 45461,45461,45461 45756,45756,45756 46051,46051,46051 46346,46346,46346 46642,46642,46642 46937,46937,46937 47232,47232,47232 47527,47527,47527 47822,47822,47822 48118,48118,48118 48413,48413,48413 48708,48708,48708 49003,49003,49003 49298,49298,49298 49594,49594,49594 49889,49889,49889 50184,50184,50184 50479,50479,50479 50774,50774,50774 51070,51070,51070 51365,51365,51365 51660,51660,51660 51955,51955,51955 52250,52250,52250 52546,52546,52546 52841,52841,52841 53136,53136,53136 53431,53431,53431 53726,53726,53726 54022,54022,54022 54317,54317,54317 54612,54612,54612 54907,54907,54907 55202,55202,55202 55498,55498,55498 55793,55793,55793 56088,56088,56088 56383,56383,56383 56678,56678,56678 56974,56974,56974 57269,57269,57269 57564,57564,57564 57859,57859,57859 58154,58154,58154 58450,58450,58450 58745,58745,58745 59040,59040,59040 59335,59335,59335 59630,59630,59630 59926,59926,59926 60221,60221,60221 60516,60516,60516 60811,60811,60811 61106,61106,61106 61402,61402,61402 61697,61697,61697 61992,61992,61992 62287,62287,62287 62582,62582,62582 62878,62878,62878 63173,63173,63173 63468,63468,63468 63763,63763,63763 64058,64058,64058 64354,64354,64354 64649,64649,64649 64944,64944,64944 65239,65239,65239 65535,65535,65535 ########## g224.clr 0,0,0 293,293,293 587,587,587 881,881,881 1175,1175,1175 1469,1469,1469 1763,1763,1763 2057,2057,2057 2351,2351,2351 2644,2644,2644 2938,2938,2938 3232,3232,3232 3526,3526,3526 3820,3820,3820 4114,4114,4114 4408,4408,4408 4702,4702,4702 4995,4995,4995 5289,5289,5289 5583,5583,5583 5877,5877,5877 6171,6171,6171 6465,6465,6465 6759,6759,6759 7053,7053,7053 7346,7346,7346 7640,7640,7640 7934,7934,7934 8228,8228,8228 8522,8522,8522 8816,8816,8816 9110,9110,9110 9404,9404,9404 9698,9698,9698 9991,9991,9991 10285,10285,10285 10579,10579,10579 10873,10873,10873 11167,11167,11167 11461,11461,11461 11755,11755,11755 12049,12049,12049 12342,12342,12342 12636,12636,12636 12930,12930,12930 13224,13224,13224 13518,13518,13518 13812,13812,13812 14106,14106,14106 14400,14400,14400 14693,14693,14693 14987,14987,14987 15281,15281,15281 15575,15575,15575 15869,15869,15869 16163,16163,16163 16457,16457,16457 16751,16751,16751 17044,17044,17044 17338,17338,17338 17632,17632,17632 17926,17926,17926 18220,18220,18220 18514,18514,18514 18808,18808,18808 19102,19102,19102 19396,19396,19396 19689,19689,19689 19983,19983,19983 20277,20277,20277 20571,20571,20571 20865,20865,20865 21159,21159,21159 21453,21453,21453 21747,21747,21747 22040,22040,22040 22334,22334,22334 22628,22628,22628 22922,22922,22922 23216,23216,23216 23510,23510,23510 23804,23804,23804 24098,24098,24098 24391,24391,24391 24685,24685,24685 24979,24979,24979 25273,25273,25273 25567,25567,25567 25861,25861,25861 26155,26155,26155 26449,26449,26449 26742,26742,26742 27036,27036,27036 27330,27330,27330 27624,27624,27624 27918,27918,27918 28212,28212,28212 28506,28506,28506 28800,28800,28800 29094,29094,29094 29387,29387,29387 29681,29681,29681 29975,29975,29975 30269,30269,30269 30563,30563,30563 30857,30857,30857 31151,31151,31151 31445,31445,31445 31738,31738,31738 32032,32032,32032 32326,32326,32326 32620,32620,32620 32914,32914,32914 33208,33208,33208 33502,33502,33502 33796,33796,33796 34089,34089,34089 34383,34383,34383 34677,34677,34677 34971,34971,34971 35265,35265,35265 35559,35559,35559 35853,35853,35853 36147,36147,36147 36440,36440,36440 36734,36734,36734 37028,37028,37028 37322,37322,37322 37616,37616,37616 37910,37910,37910 38204,38204,38204 38498,38498,38498 38792,38792,38792 39085,39085,39085 39379,39379,39379 39673,39673,39673 39967,39967,39967 40261,40261,40261 40555,40555,40555 40849,40849,40849 41143,41143,41143 41436,41436,41436 41730,41730,41730 42024,42024,42024 42318,42318,42318 42612,42612,42612 42906,42906,42906 43200,43200,43200 43494,43494,43494 43787,43787,43787 44081,44081,44081 44375,44375,44375 44669,44669,44669 44963,44963,44963 45257,45257,45257 45551,45551,45551 45845,45845,45845 46138,46138,46138 46432,46432,46432 46726,46726,46726 47020,47020,47020 47314,47314,47314 47608,47608,47608 47902,47902,47902 48196,48196,48196 48490,48490,48490 48783,48783,48783 49077,49077,49077 49371,49371,49371 49665,49665,49665 49959,49959,49959 50253,50253,50253 50547,50547,50547 50841,50841,50841 51134,51134,51134 51428,51428,51428 51722,51722,51722 52016,52016,52016 52310,52310,52310 52604,52604,52604 52898,52898,52898 53192,53192,53192 53485,53485,53485 53779,53779,53779 54073,54073,54073 54367,54367,54367 54661,54661,54661 54955,54955,54955 55249,55249,55249 55543,55543,55543 55836,55836,55836 56130,56130,56130 56424,56424,56424 56718,56718,56718 57012,57012,57012 57306,57306,57306 57600,57600,57600 57894,57894,57894 58188,58188,58188 58481,58481,58481 58775,58775,58775 59069,59069,59069 59363,59363,59363 59657,59657,59657 59951,59951,59951 60245,60245,60245 60539,60539,60539 60832,60832,60832 61126,61126,61126 61420,61420,61420 61714,61714,61714 62008,62008,62008 62302,62302,62302 62596,62596,62596 62890,62890,62890 63183,63183,63183 63477,63477,63477 63771,63771,63771 64065,64065,64065 64359,64359,64359 64653,64653,64653 64947,64947,64947 65241,65241,65241 65534,65534,65534 ########## g225.clr 0,0,0 292,292,292 585,585,585 877,877,877 1170,1170,1170 1462,1462,1462 1755,1755,1755 2047,2047,2047 2340,2340,2340 2633,2633,2633 2925,2925,2925 3218,3218,3218 3510,3510,3510 3803,3803,3803 4095,4095,4095 4388,4388,4388 4681,4681,4681 4973,4973,4973 5266,5266,5266 5558,5558,5558 5851,5851,5851 6143,6143,6143 6436,6436,6436 6729,6729,6729 7021,7021,7021 7314,7314,7314 7606,7606,7606 7899,7899,7899 8191,8191,8191 8484,8484,8484 8777,8777,8777 9069,9069,9069 9362,9362,9362 9654,9654,9654 9947,9947,9947 10239,10239,10239 10532,10532,10532 10824,10824,10824 11117,11117,11117 11410,11410,11410 11702,11702,11702 11995,11995,11995 12287,12287,12287 12580,12580,12580 12872,12872,12872 13165,13165,13165 13458,13458,13458 13750,13750,13750 14043,14043,14043 14335,14335,14335 14628,14628,14628 14920,14920,14920 15213,15213,15213 15506,15506,15506 15798,15798,15798 16091,16091,16091 16383,16383,16383 16676,16676,16676 16968,16968,16968 17261,17261,17261 17554,17554,17554 17846,17846,17846 18139,18139,18139 18431,18431,18431 18724,18724,18724 19016,19016,19016 19309,19309,19309 19601,19601,19601 19894,19894,19894 20187,20187,20187 20479,20479,20479 20772,20772,20772 21064,21064,21064 21357,21357,21357 21649,21649,21649 21942,21942,21942 22235,22235,22235 22527,22527,22527 22820,22820,22820 23112,23112,23112 23405,23405,23405 23697,23697,23697 23990,23990,23990 24283,24283,24283 24575,24575,24575 24868,24868,24868 25160,25160,25160 25453,25453,25453 25745,25745,25745 26038,26038,26038 26331,26331,26331 26623,26623,26623 26916,26916,26916 27208,27208,27208 27501,27501,27501 27793,27793,27793 28086,28086,28086 28378,28378,28378 28671,28671,28671 28964,28964,28964 29256,29256,29256 29549,29549,29549 29841,29841,29841 30134,30134,30134 30426,30426,30426 30719,30719,30719 31012,31012,31012 31304,31304,31304 31597,31597,31597 31889,31889,31889 32182,32182,32182 32474,32474,32474 32767,32767,32767 33060,33060,33060 33352,33352,33352 33645,33645,33645 33937,33937,33937 34230,34230,34230 34522,34522,34522 34815,34815,34815 35108,35108,35108 35400,35400,35400 35693,35693,35693 35985,35985,35985 36278,36278,36278 36570,36570,36570 36863,36863,36863 37156,37156,37156 37448,37448,37448 37741,37741,37741 38033,38033,38033 38326,38326,38326 38618,38618,38618 38911,38911,38911 39203,39203,39203 39496,39496,39496 39789,39789,39789 40081,40081,40081 40374,40374,40374 40666,40666,40666 40959,40959,40959 41251,41251,41251 41544,41544,41544 41837,41837,41837 42129,42129,42129 42422,42422,42422 42714,42714,42714 43007,43007,43007 43299,43299,43299 43592,43592,43592 43885,43885,43885 44177,44177,44177 44470,44470,44470 44762,44762,44762 45055,45055,45055 45347,45347,45347 45640,45640,45640 45933,45933,45933 46225,46225,46225 46518,46518,46518 46810,46810,46810 47103,47103,47103 47395,47395,47395 47688,47688,47688 47980,47980,47980 48273,48273,48273 48566,48566,48566 48858,48858,48858 49151,49151,49151 49443,49443,49443 49736,49736,49736 50028,50028,50028 50321,50321,50321 50614,50614,50614 50906,50906,50906 51199,51199,51199 51491,51491,51491 51784,51784,51784 52076,52076,52076 52369,52369,52369 52662,52662,52662 52954,52954,52954 53247,53247,53247 53539,53539,53539 53832,53832,53832 54124,54124,54124 54417,54417,54417 54710,54710,54710 55002,55002,55002 55295,55295,55295 55587,55587,55587 55880,55880,55880 56172,56172,56172 56465,56465,56465 56757,56757,56757 57050,57050,57050 57343,57343,57343 57635,57635,57635 57928,57928,57928 58220,58220,58220 58513,58513,58513 58805,58805,58805 59098,59098,59098 59391,59391,59391 59683,59683,59683 59976,59976,59976 60268,60268,60268 60561,60561,60561 60853,60853,60853 61146,61146,61146 61439,61439,61439 61731,61731,61731 62024,62024,62024 62316,62316,62316 62609,62609,62609 62901,62901,62901 63194,63194,63194 63487,63487,63487 63779,63779,63779 64072,64072,64072 64364,64364,64364 64657,64657,64657 64949,64949,64949 65242,65242,65242 65535,65535,65535 ########## g226.clr 0,0,0 291,291,291 582,582,582 873,873,873 1165,1165,1165 1456,1456,1456 1747,1747,1747 2038,2038,2038 2330,2330,2330 2621,2621,2621 2912,2912,2912 3203,3203,3203 3495,3495,3495 3786,3786,3786 4077,4077,4077 4369,4369,4369 4660,4660,4660 4951,4951,4951 5242,5242,5242 5534,5534,5534 5825,5825,5825 6116,6116,6116 6407,6407,6407 6699,6699,6699 6990,6990,6990 7281,7281,7281 7572,7572,7572 7864,7864,7864 8155,8155,8155 8446,8446,8446 8738,8738,8738 9029,9029,9029 9320,9320,9320 9611,9611,9611 9903,9903,9903 10194,10194,10194 10485,10485,10485 10776,10776,10776 11068,11068,11068 11359,11359,11359 11650,11650,11650 11941,11941,11941 12233,12233,12233 12524,12524,12524 12815,12815,12815 13107,13107,13107 13398,13398,13398 13689,13689,13689 13980,13980,13980 14272,14272,14272 14563,14563,14563 14854,14854,14854 15145,15145,15145 15437,15437,15437 15728,15728,15728 16019,16019,16019 16310,16310,16310 16602,16602,16602 16893,16893,16893 17184,17184,17184 17476,17476,17476 17767,17767,17767 18058,18058,18058 18349,18349,18349 18641,18641,18641 18932,18932,18932 19223,19223,19223 19514,19514,19514 19806,19806,19806 20097,20097,20097 20388,20388,20388 20679,20679,20679 20971,20971,20971 21262,21262,21262 21553,21553,21553 21845,21845,21845 22136,22136,22136 22427,22427,22427 22718,22718,22718 23010,23010,23010 23301,23301,23301 23592,23592,23592 23883,23883,23883 24175,24175,24175 24466,24466,24466 24757,24757,24757 25048,25048,25048 25340,25340,25340 25631,25631,25631 25922,25922,25922 26214,26214,26214 26505,26505,26505 26796,26796,26796 27087,27087,27087 27379,27379,27379 27670,27670,27670 27961,27961,27961 28252,28252,28252 28544,28544,28544 28835,28835,28835 29126,29126,29126 29417,29417,29417 29709,29709,29709 30000,30000,30000 30291,30291,30291 30583,30583,30583 30874,30874,30874 31165,31165,31165 31456,31456,31456 31748,31748,31748 32039,32039,32039 32330,32330,32330 32621,32621,32621 32913,32913,32913 33204,33204,33204 33495,33495,33495 33786,33786,33786 34078,34078,34078 34369,34369,34369 34660,34660,34660 34952,34952,34952 35243,35243,35243 35534,35534,35534 35825,35825,35825 36117,36117,36117 36408,36408,36408 36699,36699,36699 36990,36990,36990 37282,37282,37282 37573,37573,37573 37864,37864,37864 38155,38155,38155 38447,38447,38447 38738,38738,38738 39029,39029,39029 39321,39321,39321 39612,39612,39612 39903,39903,39903 40194,40194,40194 40486,40486,40486 40777,40777,40777 41068,41068,41068 41359,41359,41359 41651,41651,41651 41942,41942,41942 42233,42233,42233 42524,42524,42524 42816,42816,42816 43107,43107,43107 43398,43398,43398 43690,43690,43690 43981,43981,43981 44272,44272,44272 44563,44563,44563 44855,44855,44855 45146,45146,45146 45437,45437,45437 45728,45728,45728 46020,46020,46020 46311,46311,46311 46602,46602,46602 46893,46893,46893 47185,47185,47185 47476,47476,47476 47767,47767,47767 48059,48059,48059 48350,48350,48350 48641,48641,48641 48932,48932,48932 49224,49224,49224 49515,49515,49515 49806,49806,49806 50097,50097,50097 50389,50389,50389 50680,50680,50680 50971,50971,50971 51262,51262,51262 51554,51554,51554 51845,51845,51845 52136,52136,52136 52428,52428,52428 52719,52719,52719 53010,53010,53010 53301,53301,53301 53593,53593,53593 53884,53884,53884 54175,54175,54175 54466,54466,54466 54758,54758,54758 55049,55049,55049 55340,55340,55340 55631,55631,55631 55923,55923,55923 56214,56214,56214 56505,56505,56505 56797,56797,56797 57088,57088,57088 57379,57379,57379 57670,57670,57670 57962,57962,57962 58253,58253,58253 58544,58544,58544 58835,58835,58835 59127,59127,59127 59418,59418,59418 59709,59709,59709 60000,60000,60000 60292,60292,60292 60583,60583,60583 60874,60874,60874 61166,61166,61166 61457,61457,61457 61748,61748,61748 62039,62039,62039 62331,62331,62331 62622,62622,62622 62913,62913,62913 63204,63204,63204 63496,63496,63496 63787,63787,63787 64078,64078,64078 64369,64369,64369 64661,64661,64661 64952,64952,64952 65243,65243,65243 65535,65535,65535 ########## g227.clr 0,0,0 289,289,289 579,579,579 869,869,869 1159,1159,1159 1449,1449,1449 1739,1739,1739 2029,2029,2029 2319,2319,2319 2609,2609,2609 2899,2899,2899 3189,3189,3189 3479,3479,3479 3769,3769,3769 4059,4059,4059 4349,4349,4349 4639,4639,4639 4929,4929,4929 5219,5219,5219 5509,5509,5509 5799,5799,5799 6089,6089,6089 6379,6379,6379 6669,6669,6669 6959,6959,6959 7249,7249,7249 7539,7539,7539 7829,7829,7829 8119,8119,8119 8409,8409,8409 8699,8699,8699 8989,8989,8989 9279,9279,9279 9569,9569,9569 9859,9859,9859 10149,10149,10149 10439,10439,10439 10729,10729,10729 11019,11019,11019 11309,11309,11309 11599,11599,11599 11889,11889,11889 12179,12179,12179 12469,12469,12469 12759,12759,12759 13049,13049,13049 13338,13338,13338 13628,13628,13628 13918,13918,13918 14208,14208,14208 14498,14498,14498 14788,14788,14788 15078,15078,15078 15368,15368,15368 15658,15658,15658 15948,15948,15948 16238,16238,16238 16528,16528,16528 16818,16818,16818 17108,17108,17108 17398,17398,17398 17688,17688,17688 17978,17978,17978 18268,18268,18268 18558,18558,18558 18848,18848,18848 19138,19138,19138 19428,19428,19428 19718,19718,19718 20008,20008,20008 20298,20298,20298 20588,20588,20588 20878,20878,20878 21168,21168,21168 21458,21458,21458 21748,21748,21748 22038,22038,22038 22328,22328,22328 22618,22618,22618 22908,22908,22908 23198,23198,23198 23488,23488,23488 23778,23778,23778 24068,24068,24068 24358,24358,24358 24648,24648,24648 24938,24938,24938 25228,25228,25228 25518,25518,25518 25808,25808,25808 26098,26098,26098 26387,26387,26387 26677,26677,26677 26967,26967,26967 27257,27257,27257 27547,27547,27547 27837,27837,27837 28127,28127,28127 28417,28417,28417 28707,28707,28707 28997,28997,28997 29287,29287,29287 29577,29577,29577 29867,29867,29867 30157,30157,30157 30447,30447,30447 30737,30737,30737 31027,31027,31027 31317,31317,31317 31607,31607,31607 31897,31897,31897 32187,32187,32187 32477,32477,32477 32767,32767,32767 33057,33057,33057 33347,33347,33347 33637,33637,33637 33927,33927,33927 34217,34217,34217 34507,34507,34507 34797,34797,34797 35087,35087,35087 35377,35377,35377 35667,35667,35667 35957,35957,35957 36247,36247,36247 36537,36537,36537 36827,36827,36827 37117,37117,37117 37407,37407,37407 37697,37697,37697 37987,37987,37987 38277,38277,38277 38567,38567,38567 38857,38857,38857 39147,39147,39147 39436,39436,39436 39726,39726,39726 40016,40016,40016 40306,40306,40306 40596,40596,40596 40886,40886,40886 41176,41176,41176 41466,41466,41466 41756,41756,41756 42046,42046,42046 42336,42336,42336 42626,42626,42626 42916,42916,42916 43206,43206,43206 43496,43496,43496 43786,43786,43786 44076,44076,44076 44366,44366,44366 44656,44656,44656 44946,44946,44946 45236,45236,45236 45526,45526,45526 45816,45816,45816 46106,46106,46106 46396,46396,46396 46686,46686,46686 46976,46976,46976 47266,47266,47266 47556,47556,47556 47846,47846,47846 48136,48136,48136 48426,48426,48426 48716,48716,48716 49006,49006,49006 49296,49296,49296 49586,49586,49586 49876,49876,49876 50166,50166,50166 50456,50456,50456 50746,50746,50746 51036,51036,51036 51326,51326,51326 51616,51616,51616 51906,51906,51906 52196,52196,52196 52485,52485,52485 52775,52775,52775 53065,53065,53065 53355,53355,53355 53645,53645,53645 53935,53935,53935 54225,54225,54225 54515,54515,54515 54805,54805,54805 55095,55095,55095 55385,55385,55385 55675,55675,55675 55965,55965,55965 56255,56255,56255 56545,56545,56545 56835,56835,56835 57125,57125,57125 57415,57415,57415 57705,57705,57705 57995,57995,57995 58285,58285,58285 58575,58575,58575 58865,58865,58865 59155,59155,59155 59445,59445,59445 59735,59735,59735 60025,60025,60025 60315,60315,60315 60605,60605,60605 60895,60895,60895 61185,61185,61185 61475,61475,61475 61765,61765,61765 62055,62055,62055 62345,62345,62345 62635,62635,62635 62925,62925,62925 63215,63215,63215 63505,63505,63505 63795,63795,63795 64085,64085,64085 64375,64375,64375 64665,64665,64665 64955,64955,64955 65245,65245,65245 65535,65535,65535 ########## g228.clr 0,0,0 288,288,288 577,577,577 866,866,866 1154,1154,1154 1443,1443,1443 1732,1732,1732 2020,2020,2020 2309,2309,2309 2598,2598,2598 2887,2887,2887 3175,3175,3175 3464,3464,3464 3753,3753,3753 4041,4041,4041 4330,4330,4330 4619,4619,4619 4907,4907,4907 5196,5196,5196 5485,5485,5485 5774,5774,5774 6062,6062,6062 6351,6351,6351 6640,6640,6640 6928,6928,6928 7217,7217,7217 7506,7506,7506 7794,7794,7794 8083,8083,8083 8372,8372,8372 8661,8661,8661 8949,8949,8949 9238,9238,9238 9527,9527,9527 9815,9815,9815 10104,10104,10104 10393,10393,10393 10681,10681,10681 10970,10970,10970 11259,11259,11259 11548,11548,11548 11836,11836,11836 12125,12125,12125 12414,12414,12414 12702,12702,12702 12991,12991,12991 13280,13280,13280 13568,13568,13568 13857,13857,13857 14146,14146,14146 14435,14435,14435 14723,14723,14723 15012,15012,15012 15301,15301,15301 15589,15589,15589 15878,15878,15878 16167,16167,16167 16455,16455,16455 16744,16744,16744 17033,17033,17033 17322,17322,17322 17610,17610,17610 17899,17899,17899 18188,18188,18188 18476,18476,18476 18765,18765,18765 19054,19054,19054 19342,19342,19342 19631,19631,19631 19920,19920,19920 20209,20209,20209 20497,20497,20497 20786,20786,20786 21075,21075,21075 21363,21363,21363 21652,21652,21652 21941,21941,21941 22229,22229,22229 22518,22518,22518 22807,22807,22807 23096,23096,23096 23384,23384,23384 23673,23673,23673 23962,23962,23962 24250,24250,24250 24539,24539,24539 24828,24828,24828 25116,25116,25116 25405,25405,25405 25694,25694,25694 25983,25983,25983 26271,26271,26271 26560,26560,26560 26849,26849,26849 27137,27137,27137 27426,27426,27426 27715,27715,27715 28003,28003,28003 28292,28292,28292 28581,28581,28581 28870,28870,28870 29158,29158,29158 29447,29447,29447 29736,29736,29736 30024,30024,30024 30313,30313,30313 30602,30602,30602 30890,30890,30890 31179,31179,31179 31468,31468,31468 31757,31757,31757 32045,32045,32045 32334,32334,32334 32623,32623,32623 32911,32911,32911 33200,33200,33200 33489,33489,33489 33777,33777,33777 34066,34066,34066 34355,34355,34355 34644,34644,34644 34932,34932,34932 35221,35221,35221 35510,35510,35510 35798,35798,35798 36087,36087,36087 36376,36376,36376 36664,36664,36664 36953,36953,36953 37242,37242,37242 37531,37531,37531 37819,37819,37819 38108,38108,38108 38397,38397,38397 38685,38685,38685 38974,38974,38974 39263,39263,39263 39551,39551,39551 39840,39840,39840 40129,40129,40129 40418,40418,40418 40706,40706,40706 40995,40995,40995 41284,41284,41284 41572,41572,41572 41861,41861,41861 42150,42150,42150 42438,42438,42438 42727,42727,42727 43016,43016,43016 43305,43305,43305 43593,43593,43593 43882,43882,43882 44171,44171,44171 44459,44459,44459 44748,44748,44748 45037,45037,45037 45325,45325,45325 45614,45614,45614 45903,45903,45903 46192,46192,46192 46480,46480,46480 46769,46769,46769 47058,47058,47058 47346,47346,47346 47635,47635,47635 47924,47924,47924 48212,48212,48212 48501,48501,48501 48790,48790,48790 49079,49079,49079 49367,49367,49367 49656,49656,49656 49945,49945,49945 50233,50233,50233 50522,50522,50522 50811,50811,50811 51099,51099,51099 51388,51388,51388 51677,51677,51677 51966,51966,51966 52254,52254,52254 52543,52543,52543 52832,52832,52832 53120,53120,53120 53409,53409,53409 53698,53698,53698 53986,53986,53986 54275,54275,54275 54564,54564,54564 54853,54853,54853 55141,55141,55141 55430,55430,55430 55719,55719,55719 56007,56007,56007 56296,56296,56296 56585,56585,56585 56873,56873,56873 57162,57162,57162 57451,57451,57451 57740,57740,57740 58028,58028,58028 58317,58317,58317 58606,58606,58606 58894,58894,58894 59183,59183,59183 59472,59472,59472 59760,59760,59760 60049,60049,60049 60338,60338,60338 60627,60627,60627 60915,60915,60915 61204,61204,61204 61493,61493,61493 61781,61781,61781 62070,62070,62070 62359,62359,62359 62647,62647,62647 62936,62936,62936 63225,63225,63225 63514,63514,63514 63802,63802,63802 64091,64091,64091 64380,64380,64380 64668,64668,64668 64957,64957,64957 65246,65246,65246 65535,65535,65535 ########## g229.clr 0,0,0 287,287,287 574,574,574 862,862,862 1149,1149,1149 1437,1437,1437 1724,1724,1724 2012,2012,2012 2299,2299,2299 2586,2586,2586 2874,2874,2874 3161,3161,3161 3449,3449,3449 3736,3736,3736 4024,4024,4024 4311,4311,4311 4598,4598,4598 4886,4886,4886 5173,5173,5173 5461,5461,5461 5748,5748,5748 6036,6036,6036 6323,6323,6323 6610,6610,6610 6898,6898,6898 7185,7185,7185 7473,7473,7473 7760,7760,7760 8048,8048,8048 8335,8335,8335 8623,8623,8623 8910,8910,8910 9197,9197,9197 9485,9485,9485 9772,9772,9772 10060,10060,10060 10347,10347,10347 10635,10635,10635 10922,10922,10922 11209,11209,11209 11497,11497,11497 11784,11784,11784 12072,12072,12072 12359,12359,12359 12647,12647,12647 12934,12934,12934 13221,13221,13221 13509,13509,13509 13796,13796,13796 14084,14084,14084 14371,14371,14371 14659,14659,14659 14946,14946,14946 15234,15234,15234 15521,15521,15521 15808,15808,15808 16096,16096,16096 16383,16383,16383 16671,16671,16671 16958,16958,16958 17246,17246,17246 17533,17533,17533 17820,17820,17820 18108,18108,18108 18395,18395,18395 18683,18683,18683 18970,18970,18970 19258,19258,19258 19545,19545,19545 19832,19832,19832 20120,20120,20120 20407,20407,20407 20695,20695,20695 20982,20982,20982 21270,21270,21270 21557,21557,21557 21845,21845,21845 22132,22132,22132 22419,22419,22419 22707,22707,22707 22994,22994,22994 23282,23282,23282 23569,23569,23569 23857,23857,23857 24144,24144,24144 24431,24431,24431 24719,24719,24719 25006,25006,25006 25294,25294,25294 25581,25581,25581 25869,25869,25869 26156,26156,26156 26443,26443,26443 26731,26731,26731 27018,27018,27018 27306,27306,27306 27593,27593,27593 27881,27881,27881 28168,28168,28168 28455,28455,28455 28743,28743,28743 29030,29030,29030 29318,29318,29318 29605,29605,29605 29893,29893,29893 30180,30180,30180 30468,30468,30468 30755,30755,30755 31042,31042,31042 31330,31330,31330 31617,31617,31617 31905,31905,31905 32192,32192,32192 32480,32480,32480 32767,32767,32767 33054,33054,33054 33342,33342,33342 33629,33629,33629 33917,33917,33917 34204,34204,34204 34492,34492,34492 34779,34779,34779 35066,35066,35066 35354,35354,35354 35641,35641,35641 35929,35929,35929 36216,36216,36216 36504,36504,36504 36791,36791,36791 37079,37079,37079 37366,37366,37366 37653,37653,37653 37941,37941,37941 38228,38228,38228 38516,38516,38516 38803,38803,38803 39091,39091,39091 39378,39378,39378 39665,39665,39665 39953,39953,39953 40240,40240,40240 40528,40528,40528 40815,40815,40815 41103,41103,41103 41390,41390,41390 41677,41677,41677 41965,41965,41965 42252,42252,42252 42540,42540,42540 42827,42827,42827 43115,43115,43115 43402,43402,43402 43690,43690,43690 43977,43977,43977 44264,44264,44264 44552,44552,44552 44839,44839,44839 45127,45127,45127 45414,45414,45414 45702,45702,45702 45989,45989,45989 46276,46276,46276 46564,46564,46564 46851,46851,46851 47139,47139,47139 47426,47426,47426 47714,47714,47714 48001,48001,48001 48288,48288,48288 48576,48576,48576 48863,48863,48863 49151,49151,49151 49438,49438,49438 49726,49726,49726 50013,50013,50013 50300,50300,50300 50588,50588,50588 50875,50875,50875 51163,51163,51163 51450,51450,51450 51738,51738,51738 52025,52025,52025 52313,52313,52313 52600,52600,52600 52887,52887,52887 53175,53175,53175 53462,53462,53462 53750,53750,53750 54037,54037,54037 54325,54325,54325 54612,54612,54612 54899,54899,54899 55187,55187,55187 55474,55474,55474 55762,55762,55762 56049,56049,56049 56337,56337,56337 56624,56624,56624 56911,56911,56911 57199,57199,57199 57486,57486,57486 57774,57774,57774 58061,58061,58061 58349,58349,58349 58636,58636,58636 58924,58924,58924 59211,59211,59211 59498,59498,59498 59786,59786,59786 60073,60073,60073 60361,60361,60361 60648,60648,60648 60936,60936,60936 61223,61223,61223 61510,61510,61510 61798,61798,61798 62085,62085,62085 62373,62373,62373 62660,62660,62660 62948,62948,62948 63235,63235,63235 63522,63522,63522 63810,63810,63810 64097,64097,64097 64385,64385,64385 64672,64672,64672 64960,64960,64960 65247,65247,65247 65535,65535,65535 ########## g23.clr 0,0,0 2978,2978,2978 5957,5957,5957 8936,8936,8936 11915,11915,11915 14894,14894,14894 17873,17873,17873 20852,20852,20852 23830,23830,23830 26809,26809,26809 29788,29788,29788 32767,32767,32767 35746,35746,35746 38725,38725,38725 41704,41704,41704 44682,44682,44682 47661,47661,47661 50640,50640,50640 53619,53619,53619 56598,56598,56598 59577,59577,59577 62556,62556,62556 65535,65535,65535 ########## g230.clr 0,0,0 286,286,286 572,572,572 858,858,858 1144,1144,1144 1430,1430,1430 1717,1717,1717 2003,2003,2003 2289,2289,2289 2575,2575,2575 2861,2861,2861 3147,3147,3147 3434,3434,3434 3720,3720,3720 4006,4006,4006 4292,4292,4292 4578,4578,4578 4865,4865,4865 5151,5151,5151 5437,5437,5437 5723,5723,5723 6009,6009,6009 6295,6295,6295 6582,6582,6582 6868,6868,6868 7154,7154,7154 7440,7440,7440 7726,7726,7726 8013,8013,8013 8299,8299,8299 8585,8585,8585 8871,8871,8871 9157,9157,9157 9443,9443,9443 9730,9730,9730 10016,10016,10016 10302,10302,10302 10588,10588,10588 10874,10874,10874 11160,11160,11160 11447,11447,11447 11733,11733,11733 12019,12019,12019 12305,12305,12305 12591,12591,12591 12878,12878,12878 13164,13164,13164 13450,13450,13450 13736,13736,13736 14022,14022,14022 14308,14308,14308 14595,14595,14595 14881,14881,14881 15167,15167,15167 15453,15453,15453 15739,15739,15739 16026,16026,16026 16312,16312,16312 16598,16598,16598 16884,16884,16884 17170,17170,17170 17456,17456,17456 17743,17743,17743 18029,18029,18029 18315,18315,18315 18601,18601,18601 18887,18887,18887 19173,19173,19173 19460,19460,19460 19746,19746,19746 20032,20032,20032 20318,20318,20318 20604,20604,20604 20891,20891,20891 21177,21177,21177 21463,21463,21463 21749,21749,21749 22035,22035,22035 22321,22321,22321 22608,22608,22608 22894,22894,22894 23180,23180,23180 23466,23466,23466 23752,23752,23752 24039,24039,24039 24325,24325,24325 24611,24611,24611 24897,24897,24897 25183,25183,25183 25469,25469,25469 25756,25756,25756 26042,26042,26042 26328,26328,26328 26614,26614,26614 26900,26900,26900 27187,27187,27187 27473,27473,27473 27759,27759,27759 28045,28045,28045 28331,28331,28331 28617,28617,28617 28904,28904,28904 29190,29190,29190 29476,29476,29476 29762,29762,29762 30048,30048,30048 30334,30334,30334 30621,30621,30621 30907,30907,30907 31193,31193,31193 31479,31479,31479 31765,31765,31765 32052,32052,32052 32338,32338,32338 32624,32624,32624 32910,32910,32910 33196,33196,33196 33482,33482,33482 33769,33769,33769 34055,34055,34055 34341,34341,34341 34627,34627,34627 34913,34913,34913 35200,35200,35200 35486,35486,35486 35772,35772,35772 36058,36058,36058 36344,36344,36344 36630,36630,36630 36917,36917,36917 37203,37203,37203 37489,37489,37489 37775,37775,37775 38061,38061,38061 38347,38347,38347 38634,38634,38634 38920,38920,38920 39206,39206,39206 39492,39492,39492 39778,39778,39778 40065,40065,40065 40351,40351,40351 40637,40637,40637 40923,40923,40923 41209,41209,41209 41495,41495,41495 41782,41782,41782 42068,42068,42068 42354,42354,42354 42640,42640,42640 42926,42926,42926 43213,43213,43213 43499,43499,43499 43785,43785,43785 44071,44071,44071 44357,44357,44357 44643,44643,44643 44930,44930,44930 45216,45216,45216 45502,45502,45502 45788,45788,45788 46074,46074,46074 46361,46361,46361 46647,46647,46647 46933,46933,46933 47219,47219,47219 47505,47505,47505 47791,47791,47791 48078,48078,48078 48364,48364,48364 48650,48650,48650 48936,48936,48936 49222,49222,49222 49508,49508,49508 49795,49795,49795 50081,50081,50081 50367,50367,50367 50653,50653,50653 50939,50939,50939 51226,51226,51226 51512,51512,51512 51798,51798,51798 52084,52084,52084 52370,52370,52370 52656,52656,52656 52943,52943,52943 53229,53229,53229 53515,53515,53515 53801,53801,53801 54087,54087,54087 54374,54374,54374 54660,54660,54660 54946,54946,54946 55232,55232,55232 55518,55518,55518 55804,55804,55804 56091,56091,56091 56377,56377,56377 56663,56663,56663 56949,56949,56949 57235,57235,57235 57521,57521,57521 57808,57808,57808 58094,58094,58094 58380,58380,58380 58666,58666,58666 58952,58952,58952 59239,59239,59239 59525,59525,59525 59811,59811,59811 60097,60097,60097 60383,60383,60383 60669,60669,60669 60956,60956,60956 61242,61242,61242 61528,61528,61528 61814,61814,61814 62100,62100,62100 62387,62387,62387 62673,62673,62673 62959,62959,62959 63245,63245,63245 63531,63531,63531 63817,63817,63817 64104,64104,64104 64390,64390,64390 64676,64676,64676 64962,64962,64962 65248,65248,65248 65534,65534,65534 ########## g231.clr 0,0,0 284,284,284 569,569,569 854,854,854 1139,1139,1139 1424,1424,1424 1709,1709,1709 1994,1994,1994 2279,2279,2279 2564,2564,2564 2849,2849,2849 3134,3134,3134 3419,3419,3419 3704,3704,3704 3989,3989,3989 4274,4274,4274 4558,4558,4558 4843,4843,4843 5128,5128,5128 5413,5413,5413 5698,5698,5698 5983,5983,5983 6268,6268,6268 6553,6553,6553 6838,6838,6838 7123,7123,7123 7408,7408,7408 7693,7693,7693 7978,7978,7978 8263,8263,8263 8548,8548,8548 8832,8832,8832 9117,9117,9117 9402,9402,9402 9687,9687,9687 9972,9972,9972 10257,10257,10257 10542,10542,10542 10827,10827,10827 11112,11112,11112 11397,11397,11397 11682,11682,11682 11967,11967,11967 12252,12252,12252 12537,12537,12537 12822,12822,12822 13106,13106,13106 13391,13391,13391 13676,13676,13676 13961,13961,13961 14246,14246,14246 14531,14531,14531 14816,14816,14816 15101,15101,15101 15386,15386,15386 15671,15671,15671 15956,15956,15956 16241,16241,16241 16526,16526,16526 16811,16811,16811 17096,17096,17096 17381,17381,17381 17665,17665,17665 17950,17950,17950 18235,18235,18235 18520,18520,18520 18805,18805,18805 19090,19090,19090 19375,19375,19375 19660,19660,19660 19945,19945,19945 20230,20230,20230 20515,20515,20515 20800,20800,20800 21085,21085,21085 21370,21370,21370 21655,21655,21655 21939,21939,21939 22224,22224,22224 22509,22509,22509 22794,22794,22794 23079,23079,23079 23364,23364,23364 23649,23649,23649 23934,23934,23934 24219,24219,24219 24504,24504,24504 24789,24789,24789 25074,25074,25074 25359,25359,25359 25644,25644,25644 25929,25929,25929 26213,26213,26213 26498,26498,26498 26783,26783,26783 27068,27068,27068 27353,27353,27353 27638,27638,27638 27923,27923,27923 28208,28208,28208 28493,28493,28493 28778,28778,28778 29063,29063,29063 29348,29348,29348 29633,29633,29633 29918,29918,29918 30203,30203,30203 30488,30488,30488 30772,30772,30772 31057,31057,31057 31342,31342,31342 31627,31627,31627 31912,31912,31912 32197,32197,32197 32482,32482,32482 32767,32767,32767 33052,33052,33052 33337,33337,33337 33622,33622,33622 33907,33907,33907 34192,34192,34192 34477,34477,34477 34762,34762,34762 35046,35046,35046 35331,35331,35331 35616,35616,35616 35901,35901,35901 36186,36186,36186 36471,36471,36471 36756,36756,36756 37041,37041,37041 37326,37326,37326 37611,37611,37611 37896,37896,37896 38181,38181,38181 38466,38466,38466 38751,38751,38751 39036,39036,39036 39321,39321,39321 39605,39605,39605 39890,39890,39890 40175,40175,40175 40460,40460,40460 40745,40745,40745 41030,41030,41030 41315,41315,41315 41600,41600,41600 41885,41885,41885 42170,42170,42170 42455,42455,42455 42740,42740,42740 43025,43025,43025 43310,43310,43310 43595,43595,43595 43879,43879,43879 44164,44164,44164 44449,44449,44449 44734,44734,44734 45019,45019,45019 45304,45304,45304 45589,45589,45589 45874,45874,45874 46159,46159,46159 46444,46444,46444 46729,46729,46729 47014,47014,47014 47299,47299,47299 47584,47584,47584 47869,47869,47869 48153,48153,48153 48438,48438,48438 48723,48723,48723 49008,49008,49008 49293,49293,49293 49578,49578,49578 49863,49863,49863 50148,50148,50148 50433,50433,50433 50718,50718,50718 51003,51003,51003 51288,51288,51288 51573,51573,51573 51858,51858,51858 52143,52143,52143 52427,52427,52427 52712,52712,52712 52997,52997,52997 53282,53282,53282 53567,53567,53567 53852,53852,53852 54137,54137,54137 54422,54422,54422 54707,54707,54707 54992,54992,54992 55277,55277,55277 55562,55562,55562 55847,55847,55847 56132,56132,56132 56417,56417,56417 56702,56702,56702 56986,56986,56986 57271,57271,57271 57556,57556,57556 57841,57841,57841 58126,58126,58126 58411,58411,58411 58696,58696,58696 58981,58981,58981 59266,59266,59266 59551,59551,59551 59836,59836,59836 60121,60121,60121 60406,60406,60406 60691,60691,60691 60976,60976,60976 61260,61260,61260 61545,61545,61545 61830,61830,61830 62115,62115,62115 62400,62400,62400 62685,62685,62685 62970,62970,62970 63255,63255,63255 63540,63540,63540 63825,63825,63825 64110,64110,64110 64395,64395,64395 64680,64680,64680 64965,64965,64965 65250,65250,65250 65534,65534,65534 ########## g232.clr 0,0,0 283,283,283 567,567,567 851,851,851 1134,1134,1134 1418,1418,1418 1702,1702,1702 1985,1985,1985 2269,2269,2269 2553,2553,2553 2837,2837,2837 3120,3120,3120 3404,3404,3404 3688,3688,3688 3971,3971,3971 4255,4255,4255 4539,4539,4539 4822,4822,4822 5106,5106,5106 5390,5390,5390 5674,5674,5674 5957,5957,5957 6241,6241,6241 6525,6525,6525 6808,6808,6808 7092,7092,7092 7376,7376,7376 7659,7659,7659 7943,7943,7943 8227,8227,8227 8511,8511,8511 8794,8794,8794 9078,9078,9078 9362,9362,9362 9645,9645,9645 9929,9929,9929 10213,10213,10213 10496,10496,10496 10780,10780,10780 11064,11064,11064 11348,11348,11348 11631,11631,11631 11915,11915,11915 12199,12199,12199 12482,12482,12482 12766,12766,12766 13050,13050,13050 13333,13333,13333 13617,13617,13617 13901,13901,13901 14185,14185,14185 14468,14468,14468 14752,14752,14752 15036,15036,15036 15319,15319,15319 15603,15603,15603 15887,15887,15887 16170,16170,16170 16454,16454,16454 16738,16738,16738 17022,17022,17022 17305,17305,17305 17589,17589,17589 17873,17873,17873 18156,18156,18156 18440,18440,18440 18724,18724,18724 19007,19007,19007 19291,19291,19291 19575,19575,19575 19859,19859,19859 20142,20142,20142 20426,20426,20426 20710,20710,20710 20993,20993,20993 21277,21277,21277 21561,21561,21561 21845,21845,21845 22128,22128,22128 22412,22412,22412 22696,22696,22696 22979,22979,22979 23263,23263,23263 23547,23547,23547 23830,23830,23830 24114,24114,24114 24398,24398,24398 24682,24682,24682 24965,24965,24965 25249,25249,25249 25533,25533,25533 25816,25816,25816 26100,26100,26100 26384,26384,26384 26667,26667,26667 26951,26951,26951 27235,27235,27235 27519,27519,27519 27802,27802,27802 28086,28086,28086 28370,28370,28370 28653,28653,28653 28937,28937,28937 29221,29221,29221 29504,29504,29504 29788,29788,29788 30072,30072,30072 30356,30356,30356 30639,30639,30639 30923,30923,30923 31207,31207,31207 31490,31490,31490 31774,31774,31774 32058,32058,32058 32341,32341,32341 32625,32625,32625 32909,32909,32909 33193,33193,33193 33476,33476,33476 33760,33760,33760 34044,34044,34044 34327,34327,34327 34611,34611,34611 34895,34895,34895 35178,35178,35178 35462,35462,35462 35746,35746,35746 36030,36030,36030 36313,36313,36313 36597,36597,36597 36881,36881,36881 37164,37164,37164 37448,37448,37448 37732,37732,37732 38015,38015,38015 38299,38299,38299 38583,38583,38583 38867,38867,38867 39150,39150,39150 39434,39434,39434 39718,39718,39718 40001,40001,40001 40285,40285,40285 40569,40569,40569 40852,40852,40852 41136,41136,41136 41420,41420,41420 41704,41704,41704 41987,41987,41987 42271,42271,42271 42555,42555,42555 42838,42838,42838 43122,43122,43122 43406,43406,43406 43690,43690,43690 43973,43973,43973 44257,44257,44257 44541,44541,44541 44824,44824,44824 45108,45108,45108 45392,45392,45392 45675,45675,45675 45959,45959,45959 46243,46243,46243 46527,46527,46527 46810,46810,46810 47094,47094,47094 47378,47378,47378 47661,47661,47661 47945,47945,47945 48229,48229,48229 48512,48512,48512 48796,48796,48796 49080,49080,49080 49364,49364,49364 49647,49647,49647 49931,49931,49931 50215,50215,50215 50498,50498,50498 50782,50782,50782 51066,51066,51066 51349,51349,51349 51633,51633,51633 51917,51917,51917 52201,52201,52201 52484,52484,52484 52768,52768,52768 53052,53052,53052 53335,53335,53335 53619,53619,53619 53903,53903,53903 54186,54186,54186 54470,54470,54470 54754,54754,54754 55038,55038,55038 55321,55321,55321 55605,55605,55605 55889,55889,55889 56172,56172,56172 56456,56456,56456 56740,56740,56740 57023,57023,57023 57307,57307,57307 57591,57591,57591 57875,57875,57875 58158,58158,58158 58442,58442,58442 58726,58726,58726 59009,59009,59009 59293,59293,59293 59577,59577,59577 59860,59860,59860 60144,60144,60144 60428,60428,60428 60712,60712,60712 60995,60995,60995 61279,61279,61279 61563,61563,61563 61846,61846,61846 62130,62130,62130 62414,62414,62414 62697,62697,62697 62981,62981,62981 63265,63265,63265 63549,63549,63549 63832,63832,63832 64116,64116,64116 64400,64400,64400 64683,64683,64683 64967,64967,64967 65251,65251,65251 65535,65535,65535 ########## g233.clr 0,0,0 282,282,282 564,564,564 847,847,847 1129,1129,1129 1412,1412,1412 1694,1694,1694 1977,1977,1977 2259,2259,2259 2542,2542,2542 2824,2824,2824 3107,3107,3107 3389,3389,3389 3672,3672,3672 3954,3954,3954 4237,4237,4237 4519,4519,4519 4802,4802,4802 5084,5084,5084 5367,5367,5367 5649,5649,5649 5932,5932,5932 6214,6214,6214 6497,6497,6497 6779,6779,6779 7061,7061,7061 7344,7344,7344 7626,7626,7626 7909,7909,7909 8191,8191,8191 8474,8474,8474 8756,8756,8756 9039,9039,9039 9321,9321,9321 9604,9604,9604 9886,9886,9886 10169,10169,10169 10451,10451,10451 10734,10734,10734 11016,11016,11016 11299,11299,11299 11581,11581,11581 11864,11864,11864 12146,12146,12146 12429,12429,12429 12711,12711,12711 12994,12994,12994 13276,13276,13276 13558,13558,13558 13841,13841,13841 14123,14123,14123 14406,14406,14406 14688,14688,14688 14971,14971,14971 15253,15253,15253 15536,15536,15536 15818,15818,15818 16101,16101,16101 16383,16383,16383 16666,16666,16666 16948,16948,16948 17231,17231,17231 17513,17513,17513 17796,17796,17796 18078,18078,18078 18361,18361,18361 18643,18643,18643 18926,18926,18926 19208,19208,19208 19491,19491,19491 19773,19773,19773 20055,20055,20055 20338,20338,20338 20620,20620,20620 20903,20903,20903 21185,21185,21185 21468,21468,21468 21750,21750,21750 22033,22033,22033 22315,22315,22315 22598,22598,22598 22880,22880,22880 23163,23163,23163 23445,23445,23445 23728,23728,23728 24010,24010,24010 24293,24293,24293 24575,24575,24575 24858,24858,24858 25140,25140,25140 25423,25423,25423 25705,25705,25705 25988,25988,25988 26270,26270,26270 26552,26552,26552 26835,26835,26835 27117,27117,27117 27400,27400,27400 27682,27682,27682 27965,27965,27965 28247,28247,28247 28530,28530,28530 28812,28812,28812 29095,29095,29095 29377,29377,29377 29660,29660,29660 29942,29942,29942 30225,30225,30225 30507,30507,30507 30790,30790,30790 31072,31072,31072 31355,31355,31355 31637,31637,31637 31920,31920,31920 32202,32202,32202 32485,32485,32485 32767,32767,32767 33049,33049,33049 33332,33332,33332 33614,33614,33614 33897,33897,33897 34179,34179,34179 34462,34462,34462 34744,34744,34744 35027,35027,35027 35309,35309,35309 35592,35592,35592 35874,35874,35874 36157,36157,36157 36439,36439,36439 36722,36722,36722 37004,37004,37004 37287,37287,37287 37569,37569,37569 37852,37852,37852 38134,38134,38134 38417,38417,38417 38699,38699,38699 38982,38982,38982 39264,39264,39264 39546,39546,39546 39829,39829,39829 40111,40111,40111 40394,40394,40394 40676,40676,40676 40959,40959,40959 41241,41241,41241 41524,41524,41524 41806,41806,41806 42089,42089,42089 42371,42371,42371 42654,42654,42654 42936,42936,42936 43219,43219,43219 43501,43501,43501 43784,43784,43784 44066,44066,44066 44349,44349,44349 44631,44631,44631 44914,44914,44914 45196,45196,45196 45479,45479,45479 45761,45761,45761 46043,46043,46043 46326,46326,46326 46608,46608,46608 46891,46891,46891 47173,47173,47173 47456,47456,47456 47738,47738,47738 48021,48021,48021 48303,48303,48303 48586,48586,48586 48868,48868,48868 49151,49151,49151 49433,49433,49433 49716,49716,49716 49998,49998,49998 50281,50281,50281 50563,50563,50563 50846,50846,50846 51128,51128,51128 51411,51411,51411 51693,51693,51693 51976,51976,51976 52258,52258,52258 52540,52540,52540 52823,52823,52823 53105,53105,53105 53388,53388,53388 53670,53670,53670 53953,53953,53953 54235,54235,54235 54518,54518,54518 54800,54800,54800 55083,55083,55083 55365,55365,55365 55648,55648,55648 55930,55930,55930 56213,56213,56213 56495,56495,56495 56778,56778,56778 57060,57060,57060 57343,57343,57343 57625,57625,57625 57908,57908,57908 58190,58190,58190 58473,58473,58473 58755,58755,58755 59037,59037,59037 59320,59320,59320 59602,59602,59602 59885,59885,59885 60167,60167,60167 60450,60450,60450 60732,60732,60732 61015,61015,61015 61297,61297,61297 61580,61580,61580 61862,61862,61862 62145,62145,62145 62427,62427,62427 62710,62710,62710 62992,62992,62992 63275,63275,63275 63557,63557,63557 63840,63840,63840 64122,64122,64122 64405,64405,64405 64687,64687,64687 64970,64970,64970 65252,65252,65252 65535,65535,65535 ########## g234.clr 0,0,0 281,281,281 562,562,562 843,843,843 1125,1125,1125 1406,1406,1406 1687,1687,1687 1968,1968,1968 2250,2250,2250 2531,2531,2531 2812,2812,2812 3093,3093,3093 3375,3375,3375 3656,3656,3656 3937,3937,3937 4218,4218,4218 4500,4500,4500 4781,4781,4781 5062,5062,5062 5344,5344,5344 5625,5625,5625 5906,5906,5906 6187,6187,6187 6469,6469,6469 6750,6750,6750 7031,7031,7031 7312,7312,7312 7594,7594,7594 7875,7875,7875 8156,8156,8156 8437,8437,8437 8719,8719,8719 9000,9000,9000 9281,9281,9281 9563,9563,9563 9844,9844,9844 10125,10125,10125 10406,10406,10406 10688,10688,10688 10969,10969,10969 11250,11250,11250 11531,11531,11531 11813,11813,11813 12094,12094,12094 12375,12375,12375 12656,12656,12656 12938,12938,12938 13219,13219,13219 13500,13500,13500 13782,13782,13782 14063,14063,14063 14344,14344,14344 14625,14625,14625 14907,14907,14907 15188,15188,15188 15469,15469,15469 15750,15750,15750 16032,16032,16032 16313,16313,16313 16594,16594,16594 16875,16875,16875 17157,17157,17157 17438,17438,17438 17719,17719,17719 18001,18001,18001 18282,18282,18282 18563,18563,18563 18844,18844,18844 19126,19126,19126 19407,19407,19407 19688,19688,19688 19969,19969,19969 20251,20251,20251 20532,20532,20532 20813,20813,20813 21094,21094,21094 21376,21376,21376 21657,21657,21657 21938,21938,21938 22220,22220,22220 22501,22501,22501 22782,22782,22782 23063,23063,23063 23345,23345,23345 23626,23626,23626 23907,23907,23907 24188,24188,24188 24470,24470,24470 24751,24751,24751 25032,25032,25032 25313,25313,25313 25595,25595,25595 25876,25876,25876 26157,26157,26157 26439,26439,26439 26720,26720,26720 27001,27001,27001 27282,27282,27282 27564,27564,27564 27845,27845,27845 28126,28126,28126 28407,28407,28407 28689,28689,28689 28970,28970,28970 29251,29251,29251 29532,29532,29532 29814,29814,29814 30095,30095,30095 30376,30376,30376 30658,30658,30658 30939,30939,30939 31220,31220,31220 31501,31501,31501 31783,31783,31783 32064,32064,32064 32345,32345,32345 32626,32626,32626 32908,32908,32908 33189,33189,33189 33470,33470,33470 33751,33751,33751 34033,34033,34033 34314,34314,34314 34595,34595,34595 34876,34876,34876 35158,35158,35158 35439,35439,35439 35720,35720,35720 36002,36002,36002 36283,36283,36283 36564,36564,36564 36845,36845,36845 37127,37127,37127 37408,37408,37408 37689,37689,37689 37970,37970,37970 38252,38252,38252 38533,38533,38533 38814,38814,38814 39095,39095,39095 39377,39377,39377 39658,39658,39658 39939,39939,39939 40221,40221,40221 40502,40502,40502 40783,40783,40783 41064,41064,41064 41346,41346,41346 41627,41627,41627 41908,41908,41908 42189,42189,42189 42471,42471,42471 42752,42752,42752 43033,43033,43033 43314,43314,43314 43596,43596,43596 43877,43877,43877 44158,44158,44158 44440,44440,44440 44721,44721,44721 45002,45002,45002 45283,45283,45283 45565,45565,45565 45846,45846,45846 46127,46127,46127 46408,46408,46408 46690,46690,46690 46971,46971,46971 47252,47252,47252 47533,47533,47533 47815,47815,47815 48096,48096,48096 48377,48377,48377 48659,48659,48659 48940,48940,48940 49221,49221,49221 49502,49502,49502 49784,49784,49784 50065,50065,50065 50346,50346,50346 50627,50627,50627 50909,50909,50909 51190,51190,51190 51471,51471,51471 51752,51752,51752 52034,52034,52034 52315,52315,52315 52596,52596,52596 52878,52878,52878 53159,53159,53159 53440,53440,53440 53721,53721,53721 54003,54003,54003 54284,54284,54284 54565,54565,54565 54846,54846,54846 55128,55128,55128 55409,55409,55409 55690,55690,55690 55971,55971,55971 56253,56253,56253 56534,56534,56534 56815,56815,56815 57097,57097,57097 57378,57378,57378 57659,57659,57659 57940,57940,57940 58222,58222,58222 58503,58503,58503 58784,58784,58784 59065,59065,59065 59347,59347,59347 59628,59628,59628 59909,59909,59909 60190,60190,60190 60472,60472,60472 60753,60753,60753 61034,61034,61034 61316,61316,61316 61597,61597,61597 61878,61878,61878 62159,62159,62159 62441,62441,62441 62722,62722,62722 63003,63003,63003 63284,63284,63284 63566,63566,63566 63847,63847,63847 64128,64128,64128 64409,64409,64409 64691,64691,64691 64972,64972,64972 65253,65253,65253 65534,65534,65534 ########## g235.clr 0,0,0 280,280,280 560,560,560 840,840,840 1120,1120,1120 1400,1400,1400 1680,1680,1680 1960,1960,1960 2240,2240,2240 2520,2520,2520 2800,2800,2800 3080,3080,3080 3360,3360,3360 3640,3640,3640 3920,3920,3920 4200,4200,4200 4481,4481,4481 4761,4761,4761 5041,5041,5041 5321,5321,5321 5601,5601,5601 5881,5881,5881 6161,6161,6161 6441,6441,6441 6721,6721,6721 7001,7001,7001 7281,7281,7281 7561,7561,7561 7841,7841,7841 8121,8121,8121 8401,8401,8401 8681,8681,8681 8962,8962,8962 9242,9242,9242 9522,9522,9522 9802,9802,9802 10082,10082,10082 10362,10362,10362 10642,10642,10642 10922,10922,10922 11202,11202,11202 11482,11482,11482 11762,11762,11762 12042,12042,12042 12322,12322,12322 12602,12602,12602 12882,12882,12882 13163,13163,13163 13443,13443,13443 13723,13723,13723 14003,14003,14003 14283,14283,14283 14563,14563,14563 14843,14843,14843 15123,15123,15123 15403,15403,15403 15683,15683,15683 15963,15963,15963 16243,16243,16243 16523,16523,16523 16803,16803,16803 17083,17083,17083 17363,17363,17363 17644,17644,17644 17924,17924,17924 18204,18204,18204 18484,18484,18484 18764,18764,18764 19044,19044,19044 19324,19324,19324 19604,19604,19604 19884,19884,19884 20164,20164,20164 20444,20444,20444 20724,20724,20724 21004,21004,21004 21284,21284,21284 21564,21564,21564 21845,21845,21845 22125,22125,22125 22405,22405,22405 22685,22685,22685 22965,22965,22965 23245,23245,23245 23525,23525,23525 23805,23805,23805 24085,24085,24085 24365,24365,24365 24645,24645,24645 24925,24925,24925 25205,25205,25205 25485,25485,25485 25765,25765,25765 26045,26045,26045 26326,26326,26326 26606,26606,26606 26886,26886,26886 27166,27166,27166 27446,27446,27446 27726,27726,27726 28006,28006,28006 28286,28286,28286 28566,28566,28566 28846,28846,28846 29126,29126,29126 29406,29406,29406 29686,29686,29686 29966,29966,29966 30246,30246,30246 30526,30526,30526 30807,30807,30807 31087,31087,31087 31367,31367,31367 31647,31647,31647 31927,31927,31927 32207,32207,32207 32487,32487,32487 32767,32767,32767 33047,33047,33047 33327,33327,33327 33607,33607,33607 33887,33887,33887 34167,34167,34167 34447,34447,34447 34727,34727,34727 35008,35008,35008 35288,35288,35288 35568,35568,35568 35848,35848,35848 36128,36128,36128 36408,36408,36408 36688,36688,36688 36968,36968,36968 37248,37248,37248 37528,37528,37528 37808,37808,37808 38088,38088,38088 38368,38368,38368 38648,38648,38648 38928,38928,38928 39208,39208,39208 39489,39489,39489 39769,39769,39769 40049,40049,40049 40329,40329,40329 40609,40609,40609 40889,40889,40889 41169,41169,41169 41449,41449,41449 41729,41729,41729 42009,42009,42009 42289,42289,42289 42569,42569,42569 42849,42849,42849 43129,43129,43129 43409,43409,43409 43690,43690,43690 43970,43970,43970 44250,44250,44250 44530,44530,44530 44810,44810,44810 45090,45090,45090 45370,45370,45370 45650,45650,45650 45930,45930,45930 46210,46210,46210 46490,46490,46490 46770,46770,46770 47050,47050,47050 47330,47330,47330 47610,47610,47610 47890,47890,47890 48171,48171,48171 48451,48451,48451 48731,48731,48731 49011,49011,49011 49291,49291,49291 49571,49571,49571 49851,49851,49851 50131,50131,50131 50411,50411,50411 50691,50691,50691 50971,50971,50971 51251,51251,51251 51531,51531,51531 51811,51811,51811 52091,52091,52091 52371,52371,52371 52652,52652,52652 52932,52932,52932 53212,53212,53212 53492,53492,53492 53772,53772,53772 54052,54052,54052 54332,54332,54332 54612,54612,54612 54892,54892,54892 55172,55172,55172 55452,55452,55452 55732,55732,55732 56012,56012,56012 56292,56292,56292 56572,56572,56572 56853,56853,56853 57133,57133,57133 57413,57413,57413 57693,57693,57693 57973,57973,57973 58253,58253,58253 58533,58533,58533 58813,58813,58813 59093,59093,59093 59373,59373,59373 59653,59653,59653 59933,59933,59933 60213,60213,60213 60493,60493,60493 60773,60773,60773 61053,61053,61053 61334,61334,61334 61614,61614,61614 61894,61894,61894 62174,62174,62174 62454,62454,62454 62734,62734,62734 63014,63014,63014 63294,63294,63294 63574,63574,63574 63854,63854,63854 64134,64134,64134 64414,64414,64414 64694,64694,64694 64974,64974,64974 65254,65254,65254 65535,65535,65535 ########## g236.clr 0,0,0 278,278,278 557,557,557 836,836,836 1115,1115,1115 1394,1394,1394 1673,1673,1673 1952,1952,1952 2230,2230,2230 2509,2509,2509 2788,2788,2788 3067,3067,3067 3346,3346,3346 3625,3625,3625 3904,3904,3904 4183,4183,4183 4461,4461,4461 4740,4740,4740 5019,5019,5019 5298,5298,5298 5577,5577,5577 5856,5856,5856 6135,6135,6135 6414,6414,6414 6692,6692,6692 6971,6971,6971 7250,7250,7250 7529,7529,7529 7808,7808,7808 8087,8087,8087 8366,8366,8366 8645,8645,8645 8923,8923,8923 9202,9202,9202 9481,9481,9481 9760,9760,9760 10039,10039,10039 10318,10318,10318 10597,10597,10597 10876,10876,10876 11154,11154,11154 11433,11433,11433 11712,11712,11712 11991,11991,11991 12270,12270,12270 12549,12549,12549 12828,12828,12828 13107,13107,13107 13385,13385,13385 13664,13664,13664 13943,13943,13943 14222,14222,14222 14501,14501,14501 14780,14780,14780 15059,15059,15059 15337,15337,15337 15616,15616,15616 15895,15895,15895 16174,16174,16174 16453,16453,16453 16732,16732,16732 17011,17011,17011 17290,17290,17290 17568,17568,17568 17847,17847,17847 18126,18126,18126 18405,18405,18405 18684,18684,18684 18963,18963,18963 19242,19242,19242 19521,19521,19521 19799,19799,19799 20078,20078,20078 20357,20357,20357 20636,20636,20636 20915,20915,20915 21194,21194,21194 21473,21473,21473 21752,21752,21752 22030,22030,22030 22309,22309,22309 22588,22588,22588 22867,22867,22867 23146,23146,23146 23425,23425,23425 23704,23704,23704 23983,23983,23983 24261,24261,24261 24540,24540,24540 24819,24819,24819 25098,25098,25098 25377,25377,25377 25656,25656,25656 25935,25935,25935 26214,26214,26214 26492,26492,26492 26771,26771,26771 27050,27050,27050 27329,27329,27329 27608,27608,27608 27887,27887,27887 28166,28166,28166 28444,28444,28444 28723,28723,28723 29002,29002,29002 29281,29281,29281 29560,29560,29560 29839,29839,29839 30118,30118,30118 30397,30397,30397 30675,30675,30675 30954,30954,30954 31233,31233,31233 31512,31512,31512 31791,31791,31791 32070,32070,32070 32349,32349,32349 32628,32628,32628 32906,32906,32906 33185,33185,33185 33464,33464,33464 33743,33743,33743 34022,34022,34022 34301,34301,34301 34580,34580,34580 34859,34859,34859 35137,35137,35137 35416,35416,35416 35695,35695,35695 35974,35974,35974 36253,36253,36253 36532,36532,36532 36811,36811,36811 37090,37090,37090 37368,37368,37368 37647,37647,37647 37926,37926,37926 38205,38205,38205 38484,38484,38484 38763,38763,38763 39042,39042,39042 39321,39321,39321 39599,39599,39599 39878,39878,39878 40157,40157,40157 40436,40436,40436 40715,40715,40715 40994,40994,40994 41273,41273,41273 41551,41551,41551 41830,41830,41830 42109,42109,42109 42388,42388,42388 42667,42667,42667 42946,42946,42946 43225,43225,43225 43504,43504,43504 43782,43782,43782 44061,44061,44061 44340,44340,44340 44619,44619,44619 44898,44898,44898 45177,45177,45177 45456,45456,45456 45735,45735,45735 46013,46013,46013 46292,46292,46292 46571,46571,46571 46850,46850,46850 47129,47129,47129 47408,47408,47408 47687,47687,47687 47966,47966,47966 48244,48244,48244 48523,48523,48523 48802,48802,48802 49081,49081,49081 49360,49360,49360 49639,49639,49639 49918,49918,49918 50197,50197,50197 50475,50475,50475 50754,50754,50754 51033,51033,51033 51312,51312,51312 51591,51591,51591 51870,51870,51870 52149,52149,52149 52428,52428,52428 52706,52706,52706 52985,52985,52985 53264,53264,53264 53543,53543,53543 53822,53822,53822 54101,54101,54101 54380,54380,54380 54658,54658,54658 54937,54937,54937 55216,55216,55216 55495,55495,55495 55774,55774,55774 56053,56053,56053 56332,56332,56332 56611,56611,56611 56889,56889,56889 57168,57168,57168 57447,57447,57447 57726,57726,57726 58005,58005,58005 58284,58284,58284 58563,58563,58563 58842,58842,58842 59120,59120,59120 59399,59399,59399 59678,59678,59678 59957,59957,59957 60236,60236,60236 60515,60515,60515 60794,60794,60794 61073,61073,61073 61351,61351,61351 61630,61630,61630 61909,61909,61909 62188,62188,62188 62467,62467,62467 62746,62746,62746 63025,63025,63025 63304,63304,63304 63582,63582,63582 63861,63861,63861 64140,64140,64140 64419,64419,64419 64698,64698,64698 64977,64977,64977 65256,65256,65256 65535,65535,65535 ########## g237.clr 0,0,0 277,277,277 555,555,555 833,833,833 1110,1110,1110 1388,1388,1388 1666,1666,1666 1943,1943,1943 2221,2221,2221 2499,2499,2499 2776,2776,2776 3054,3054,3054 3332,3332,3332 3609,3609,3609 3887,3887,3887 4165,4165,4165 4443,4443,4443 4720,4720,4720 4998,4998,4998 5276,5276,5276 5553,5553,5553 5831,5831,5831 6109,6109,6109 6386,6386,6386 6664,6664,6664 6942,6942,6942 7219,7219,7219 7497,7497,7497 7775,7775,7775 8053,8053,8053 8330,8330,8330 8608,8608,8608 8886,8886,8886 9163,9163,9163 9441,9441,9441 9719,9719,9719 9996,9996,9996 10274,10274,10274 10552,10552,10552 10829,10829,10829 11107,11107,11107 11385,11385,11385 11663,11663,11663 11940,11940,11940 12218,12218,12218 12496,12496,12496 12773,12773,12773 13051,13051,13051 13329,13329,13329 13606,13606,13606 13884,13884,13884 14162,14162,14162 14439,14439,14439 14717,14717,14717 14995,14995,14995 15272,15272,15272 15550,15550,15550 15828,15828,15828 16106,16106,16106 16383,16383,16383 16661,16661,16661 16939,16939,16939 17216,17216,17216 17494,17494,17494 17772,17772,17772 18049,18049,18049 18327,18327,18327 18605,18605,18605 18882,18882,18882 19160,19160,19160 19438,19438,19438 19716,19716,19716 19993,19993,19993 20271,20271,20271 20549,20549,20549 20826,20826,20826 21104,21104,21104 21382,21382,21382 21659,21659,21659 21937,21937,21937 22215,22215,22215 22492,22492,22492 22770,22770,22770 23048,23048,23048 23326,23326,23326 23603,23603,23603 23881,23881,23881 24159,24159,24159 24436,24436,24436 24714,24714,24714 24992,24992,24992 25269,25269,25269 25547,25547,25547 25825,25825,25825 26102,26102,26102 26380,26380,26380 26658,26658,26658 26935,26935,26935 27213,27213,27213 27491,27491,27491 27769,27769,27769 28046,28046,28046 28324,28324,28324 28602,28602,28602 28879,28879,28879 29157,29157,29157 29435,29435,29435 29712,29712,29712 29990,29990,29990 30268,30268,30268 30545,30545,30545 30823,30823,30823 31101,31101,31101 31379,31379,31379 31656,31656,31656 31934,31934,31934 32212,32212,32212 32489,32489,32489 32767,32767,32767 33045,33045,33045 33322,33322,33322 33600,33600,33600 33878,33878,33878 34155,34155,34155 34433,34433,34433 34711,34711,34711 34989,34989,34989 35266,35266,35266 35544,35544,35544 35822,35822,35822 36099,36099,36099 36377,36377,36377 36655,36655,36655 36932,36932,36932 37210,37210,37210 37488,37488,37488 37765,37765,37765 38043,38043,38043 38321,38321,38321 38599,38599,38599 38876,38876,38876 39154,39154,39154 39432,39432,39432 39709,39709,39709 39987,39987,39987 40265,40265,40265 40542,40542,40542 40820,40820,40820 41098,41098,41098 41375,41375,41375 41653,41653,41653 41931,41931,41931 42208,42208,42208 42486,42486,42486 42764,42764,42764 43042,43042,43042 43319,43319,43319 43597,43597,43597 43875,43875,43875 44152,44152,44152 44430,44430,44430 44708,44708,44708 44985,44985,44985 45263,45263,45263 45541,45541,45541 45818,45818,45818 46096,46096,46096 46374,46374,46374 46652,46652,46652 46929,46929,46929 47207,47207,47207 47485,47485,47485 47762,47762,47762 48040,48040,48040 48318,48318,48318 48595,48595,48595 48873,48873,48873 49151,49151,49151 49428,49428,49428 49706,49706,49706 49984,49984,49984 50262,50262,50262 50539,50539,50539 50817,50817,50817 51095,51095,51095 51372,51372,51372 51650,51650,51650 51928,51928,51928 52205,52205,52205 52483,52483,52483 52761,52761,52761 53038,53038,53038 53316,53316,53316 53594,53594,53594 53871,53871,53871 54149,54149,54149 54427,54427,54427 54705,54705,54705 54982,54982,54982 55260,55260,55260 55538,55538,55538 55815,55815,55815 56093,56093,56093 56371,56371,56371 56648,56648,56648 56926,56926,56926 57204,57204,57204 57481,57481,57481 57759,57759,57759 58037,58037,58037 58315,58315,58315 58592,58592,58592 58870,58870,58870 59148,59148,59148 59425,59425,59425 59703,59703,59703 59981,59981,59981 60258,60258,60258 60536,60536,60536 60814,60814,60814 61091,61091,61091 61369,61369,61369 61647,61647,61647 61925,61925,61925 62202,62202,62202 62480,62480,62480 62758,62758,62758 63035,63035,63035 63313,63313,63313 63591,63591,63591 63868,63868,63868 64146,64146,64146 64424,64424,64424 64701,64701,64701 64979,64979,64979 65257,65257,65257 65535,65535,65535 ########## g238.clr 0,0,0 276,276,276 553,553,553 829,829,829 1106,1106,1106 1382,1382,1382 1659,1659,1659 1935,1935,1935 2212,2212,2212 2488,2488,2488 2765,2765,2765 3041,3041,3041 3318,3318,3318 3594,3594,3594 3871,3871,3871 4147,4147,4147 4424,4424,4424 4700,4700,4700 4977,4977,4977 5253,5253,5253 5530,5530,5530 5806,5806,5806 6083,6083,6083 6359,6359,6359 6636,6636,6636 6912,6912,6912 7189,7189,7189 7466,7466,7466 7742,7742,7742 8019,8019,8019 8295,8295,8295 8572,8572,8572 8848,8848,8848 9125,9125,9125 9401,9401,9401 9678,9678,9678 9954,9954,9954 10231,10231,10231 10507,10507,10507 10784,10784,10784 11060,11060,11060 11337,11337,11337 11613,11613,11613 11890,11890,11890 12166,12166,12166 12443,12443,12443 12719,12719,12719 12996,12996,12996 13272,13272,13272 13549,13549,13549 13825,13825,13825 14102,14102,14102 14378,14378,14378 14655,14655,14655 14932,14932,14932 15208,15208,15208 15485,15485,15485 15761,15761,15761 16038,16038,16038 16314,16314,16314 16591,16591,16591 16867,16867,16867 17144,17144,17144 17420,17420,17420 17697,17697,17697 17973,17973,17973 18250,18250,18250 18526,18526,18526 18803,18803,18803 19079,19079,19079 19356,19356,19356 19632,19632,19632 19909,19909,19909 20185,20185,20185 20462,20462,20462 20738,20738,20738 21015,21015,21015 21291,21291,21291 21568,21568,21568 21844,21844,21844 22121,22121,22121 22398,22398,22398 22674,22674,22674 22951,22951,22951 23227,23227,23227 23504,23504,23504 23780,23780,23780 24057,24057,24057 24333,24333,24333 24610,24610,24610 24886,24886,24886 25163,25163,25163 25439,25439,25439 25716,25716,25716 25992,25992,25992 26269,26269,26269 26545,26545,26545 26822,26822,26822 27098,27098,27098 27375,27375,27375 27651,27651,27651 27928,27928,27928 28204,28204,28204 28481,28481,28481 28757,28757,28757 29034,29034,29034 29311,29311,29311 29587,29587,29587 29864,29864,29864 30140,30140,30140 30417,30417,30417 30693,30693,30693 30970,30970,30970 31246,31246,31246 31523,31523,31523 31799,31799,31799 32076,32076,32076 32352,32352,32352 32629,32629,32629 32905,32905,32905 33182,33182,33182 33458,33458,33458 33735,33735,33735 34011,34011,34011 34288,34288,34288 34564,34564,34564 34841,34841,34841 35117,35117,35117 35394,35394,35394 35670,35670,35670 35947,35947,35947 36223,36223,36223 36500,36500,36500 36777,36777,36777 37053,37053,37053 37330,37330,37330 37606,37606,37606 37883,37883,37883 38159,38159,38159 38436,38436,38436 38712,38712,38712 38989,38989,38989 39265,39265,39265 39542,39542,39542 39818,39818,39818 40095,40095,40095 40371,40371,40371 40648,40648,40648 40924,40924,40924 41201,41201,41201 41477,41477,41477 41754,41754,41754 42030,42030,42030 42307,42307,42307 42583,42583,42583 42860,42860,42860 43136,43136,43136 43413,43413,43413 43689,43689,43689 43966,43966,43966 44243,44243,44243 44519,44519,44519 44796,44796,44796 45072,45072,45072 45349,45349,45349 45625,45625,45625 45902,45902,45902 46178,46178,46178 46455,46455,46455 46731,46731,46731 47008,47008,47008 47284,47284,47284 47561,47561,47561 47837,47837,47837 48114,48114,48114 48390,48390,48390 48667,48667,48667 48943,48943,48943 49220,49220,49220 49496,49496,49496 49773,49773,49773 50049,50049,50049 50326,50326,50326 50602,50602,50602 50879,50879,50879 51156,51156,51156 51432,51432,51432 51709,51709,51709 51985,51985,51985 52262,52262,52262 52538,52538,52538 52815,52815,52815 53091,53091,53091 53368,53368,53368 53644,53644,53644 53921,53921,53921 54197,54197,54197 54474,54474,54474 54750,54750,54750 55027,55027,55027 55303,55303,55303 55580,55580,55580 55856,55856,55856 56133,56133,56133 56409,56409,56409 56686,56686,56686 56962,56962,56962 57239,57239,57239 57515,57515,57515 57792,57792,57792 58068,58068,58068 58345,58345,58345 58622,58622,58622 58898,58898,58898 59175,59175,59175 59451,59451,59451 59728,59728,59728 60004,60004,60004 60281,60281,60281 60557,60557,60557 60834,60834,60834 61110,61110,61110 61387,61387,61387 61663,61663,61663 61940,61940,61940 62216,62216,62216 62493,62493,62493 62769,62769,62769 63046,63046,63046 63322,63322,63322 63599,63599,63599 63875,63875,63875 64152,64152,64152 64428,64428,64428 64705,64705,64705 64981,64981,64981 65258,65258,65258 65534,65534,65534 ########## g239.clr 0,0,0 275,275,275 550,550,550 826,826,826 1101,1101,1101 1376,1376,1376 1652,1652,1652 1927,1927,1927 2202,2202,2202 2478,2478,2478 2753,2753,2753 3028,3028,3028 3304,3304,3304 3579,3579,3579 3854,3854,3854 4130,4130,4130 4405,4405,4405 4681,4681,4681 4956,4956,4956 5231,5231,5231 5507,5507,5507 5782,5782,5782 6057,6057,6057 6333,6333,6333 6608,6608,6608 6883,6883,6883 7159,7159,7159 7434,7434,7434 7709,7709,7709 7985,7985,7985 8260,8260,8260 8536,8536,8536 8811,8811,8811 9086,9086,9086 9362,9362,9362 9637,9637,9637 9912,9912,9912 10188,10188,10188 10463,10463,10463 10738,10738,10738 11014,11014,11014 11289,11289,11289 11564,11564,11564 11840,11840,11840 12115,12115,12115 12391,12391,12391 12666,12666,12666 12941,12941,12941 13217,13217,13217 13492,13492,13492 13767,13767,13767 14043,14043,14043 14318,14318,14318 14593,14593,14593 14869,14869,14869 15144,15144,15144 15419,15419,15419 15695,15695,15695 15970,15970,15970 16246,16246,16246 16521,16521,16521 16796,16796,16796 17072,17072,17072 17347,17347,17347 17622,17622,17622 17898,17898,17898 18173,18173,18173 18448,18448,18448 18724,18724,18724 18999,18999,18999 19275,19275,19275 19550,19550,19550 19825,19825,19825 20101,20101,20101 20376,20376,20376 20651,20651,20651 20927,20927,20927 21202,21202,21202 21477,21477,21477 21753,21753,21753 22028,22028,22028 22303,22303,22303 22579,22579,22579 22854,22854,22854 23129,23129,23129 23405,23405,23405 23680,23680,23680 23956,23956,23956 24231,24231,24231 24506,24506,24506 24782,24782,24782 25057,25057,25057 25332,25332,25332 25608,25608,25608 25883,25883,25883 26158,26158,26158 26434,26434,26434 26709,26709,26709 26984,26984,26984 27260,27260,27260 27535,27535,27535 27811,27811,27811 28086,28086,28086 28361,28361,28361 28637,28637,28637 28912,28912,28912 29187,29187,29187 29463,29463,29463 29738,29738,29738 30013,30013,30013 30289,30289,30289 30564,30564,30564 30839,30839,30839 31115,31115,31115 31390,31390,31390 31666,31666,31666 31941,31941,31941 32216,32216,32216 32492,32492,32492 32767,32767,32767 33042,33042,33042 33318,33318,33318 33593,33593,33593 33868,33868,33868 34144,34144,34144 34419,34419,34419 34695,34695,34695 34970,34970,34970 35245,35245,35245 35521,35521,35521 35796,35796,35796 36071,36071,36071 36347,36347,36347 36622,36622,36622 36897,36897,36897 37173,37173,37173 37448,37448,37448 37723,37723,37723 37999,37999,37999 38274,38274,38274 38550,38550,38550 38825,38825,38825 39100,39100,39100 39376,39376,39376 39651,39651,39651 39926,39926,39926 40202,40202,40202 40477,40477,40477 40752,40752,40752 41028,41028,41028 41303,41303,41303 41578,41578,41578 41854,41854,41854 42129,42129,42129 42404,42404,42404 42680,42680,42680 42955,42955,42955 43231,43231,43231 43506,43506,43506 43781,43781,43781 44057,44057,44057 44332,44332,44332 44607,44607,44607 44883,44883,44883 45158,45158,45158 45433,45433,45433 45709,45709,45709 45984,45984,45984 46259,46259,46259 46535,46535,46535 46810,46810,46810 47086,47086,47086 47361,47361,47361 47636,47636,47636 47912,47912,47912 48187,48187,48187 48462,48462,48462 48738,48738,48738 49013,49013,49013 49288,49288,49288 49564,49564,49564 49839,49839,49839 50114,50114,50114 50390,50390,50390 50665,50665,50665 50941,50941,50941 51216,51216,51216 51491,51491,51491 51767,51767,51767 52042,52042,52042 52317,52317,52317 52593,52593,52593 52868,52868,52868 53143,53143,53143 53419,53419,53419 53694,53694,53694 53969,53969,53969 54245,54245,54245 54520,54520,54520 54796,54796,54796 55071,55071,55071 55346,55346,55346 55622,55622,55622 55897,55897,55897 56172,56172,56172 56448,56448,56448 56723,56723,56723 56998,56998,56998 57274,57274,57274 57549,57549,57549 57824,57824,57824 58100,58100,58100 58375,58375,58375 58651,58651,58651 58926,58926,58926 59201,59201,59201 59477,59477,59477 59752,59752,59752 60027,60027,60027 60303,60303,60303 60578,60578,60578 60853,60853,60853 61129,61129,61129 61404,61404,61404 61679,61679,61679 61955,61955,61955 62230,62230,62230 62506,62506,62506 62781,62781,62781 63056,63056,63056 63332,63332,63332 63607,63607,63607 63882,63882,63882 64158,64158,64158 64433,64433,64433 64708,64708,64708 64984,64984,64984 65259,65259,65259 65534,65534,65534 ########## g24.clr 0,0,0 2849,2849,2849 5698,5698,5698 8548,8548,8548 11397,11397,11397 14246,14246,14246 17096,17096,17096 19945,19945,19945 22794,22794,22794 25644,25644,25644 28493,28493,28493 31342,31342,31342 34192,34192,34192 37041,37041,37041 39890,39890,39890 42740,42740,42740 45589,45589,45589 48438,48438,48438 51288,51288,51288 54137,54137,54137 56986,56986,56986 59836,59836,59836 62685,62685,62685 65535,65535,65535 ########## g240.clr 0,0,0 274,274,274 548,548,548 822,822,822 1096,1096,1096 1371,1371,1371 1645,1645,1645 1919,1919,1919 2193,2193,2193 2467,2467,2467 2742,2742,2742 3016,3016,3016 3290,3290,3290 3564,3564,3564 3838,3838,3838 4113,4113,4113 4387,4387,4387 4661,4661,4661 4935,4935,4935 5209,5209,5209 5484,5484,5484 5758,5758,5758 6032,6032,6032 6306,6306,6306 6580,6580,6580 6855,6855,6855 7129,7129,7129 7403,7403,7403 7677,7677,7677 7951,7951,7951 8226,8226,8226 8500,8500,8500 8774,8774,8774 9048,9048,9048 9322,9322,9322 9597,9597,9597 9871,9871,9871 10145,10145,10145 10419,10419,10419 10693,10693,10693 10968,10968,10968 11242,11242,11242 11516,11516,11516 11790,11790,11790 12065,12065,12065 12339,12339,12339 12613,12613,12613 12887,12887,12887 13161,13161,13161 13436,13436,13436 13710,13710,13710 13984,13984,13984 14258,14258,14258 14532,14532,14532 14807,14807,14807 15081,15081,15081 15355,15355,15355 15629,15629,15629 15903,15903,15903 16178,16178,16178 16452,16452,16452 16726,16726,16726 17000,17000,17000 17274,17274,17274 17549,17549,17549 17823,17823,17823 18097,18097,18097 18371,18371,18371 18645,18645,18645 18920,18920,18920 19194,19194,19194 19468,19468,19468 19742,19742,19742 20016,20016,20016 20291,20291,20291 20565,20565,20565 20839,20839,20839 21113,21113,21113 21387,21387,21387 21662,21662,21662 21936,21936,21936 22210,22210,22210 22484,22484,22484 22759,22759,22759 23033,23033,23033 23307,23307,23307 23581,23581,23581 23855,23855,23855 24130,24130,24130 24404,24404,24404 24678,24678,24678 24952,24952,24952 25226,25226,25226 25501,25501,25501 25775,25775,25775 26049,26049,26049 26323,26323,26323 26597,26597,26597 26872,26872,26872 27146,27146,27146 27420,27420,27420 27694,27694,27694 27968,27968,27968 28243,28243,28243 28517,28517,28517 28791,28791,28791 29065,29065,29065 29339,29339,29339 29614,29614,29614 29888,29888,29888 30162,30162,30162 30436,30436,30436 30710,30710,30710 30985,30985,30985 31259,31259,31259 31533,31533,31533 31807,31807,31807 32081,32081,32081 32356,32356,32356 32630,32630,32630 32904,32904,32904 33178,33178,33178 33453,33453,33453 33727,33727,33727 34001,34001,34001 34275,34275,34275 34549,34549,34549 34824,34824,34824 35098,35098,35098 35372,35372,35372 35646,35646,35646 35920,35920,35920 36195,36195,36195 36469,36469,36469 36743,36743,36743 37017,37017,37017 37291,37291,37291 37566,37566,37566 37840,37840,37840 38114,38114,38114 38388,38388,38388 38662,38662,38662 38937,38937,38937 39211,39211,39211 39485,39485,39485 39759,39759,39759 40033,40033,40033 40308,40308,40308 40582,40582,40582 40856,40856,40856 41130,41130,41130 41404,41404,41404 41679,41679,41679 41953,41953,41953 42227,42227,42227 42501,42501,42501 42775,42775,42775 43050,43050,43050 43324,43324,43324 43598,43598,43598 43872,43872,43872 44147,44147,44147 44421,44421,44421 44695,44695,44695 44969,44969,44969 45243,45243,45243 45518,45518,45518 45792,45792,45792 46066,46066,46066 46340,46340,46340 46614,46614,46614 46889,46889,46889 47163,47163,47163 47437,47437,47437 47711,47711,47711 47985,47985,47985 48260,48260,48260 48534,48534,48534 48808,48808,48808 49082,49082,49082 49356,49356,49356 49631,49631,49631 49905,49905,49905 50179,50179,50179 50453,50453,50453 50727,50727,50727 51002,51002,51002 51276,51276,51276 51550,51550,51550 51824,51824,51824 52098,52098,52098 52373,52373,52373 52647,52647,52647 52921,52921,52921 53195,53195,53195 53469,53469,53469 53744,53744,53744 54018,54018,54018 54292,54292,54292 54566,54566,54566 54841,54841,54841 55115,55115,55115 55389,55389,55389 55663,55663,55663 55937,55937,55937 56212,56212,56212 56486,56486,56486 56760,56760,56760 57034,57034,57034 57308,57308,57308 57583,57583,57583 57857,57857,57857 58131,58131,58131 58405,58405,58405 58679,58679,58679 58954,58954,58954 59228,59228,59228 59502,59502,59502 59776,59776,59776 60050,60050,60050 60325,60325,60325 60599,60599,60599 60873,60873,60873 61147,61147,61147 61421,61421,61421 61696,61696,61696 61970,61970,61970 62244,62244,62244 62518,62518,62518 62792,62792,62792 63067,63067,63067 63341,63341,63341 63615,63615,63615 63889,63889,63889 64163,64163,64163 64438,64438,64438 64712,64712,64712 64986,64986,64986 65260,65260,65260 65535,65535,65535 ########## g241.clr 0,0,0 273,273,273 546,546,546 819,819,819 1092,1092,1092 1365,1365,1365 1638,1638,1638 1911,1911,1911 2184,2184,2184 2457,2457,2457 2730,2730,2730 3003,3003,3003 3276,3276,3276 3549,3549,3549 3822,3822,3822 4095,4095,4095 4369,4369,4369 4642,4642,4642 4915,4915,4915 5188,5188,5188 5461,5461,5461 5734,5734,5734 6007,6007,6007 6280,6280,6280 6553,6553,6553 6826,6826,6826 7099,7099,7099 7372,7372,7372 7645,7645,7645 7918,7918,7918 8191,8191,8191 8464,8464,8464 8738,8738,8738 9011,9011,9011 9284,9284,9284 9557,9557,9557 9830,9830,9830 10103,10103,10103 10376,10376,10376 10649,10649,10649 10922,10922,10922 11195,11195,11195 11468,11468,11468 11741,11741,11741 12014,12014,12014 12287,12287,12287 12560,12560,12560 12833,12833,12833 13107,13107,13107 13380,13380,13380 13653,13653,13653 13926,13926,13926 14199,14199,14199 14472,14472,14472 14745,14745,14745 15018,15018,15018 15291,15291,15291 15564,15564,15564 15837,15837,15837 16110,16110,16110 16383,16383,16383 16656,16656,16656 16929,16929,16929 17202,17202,17202 17476,17476,17476 17749,17749,17749 18022,18022,18022 18295,18295,18295 18568,18568,18568 18841,18841,18841 19114,19114,19114 19387,19387,19387 19660,19660,19660 19933,19933,19933 20206,20206,20206 20479,20479,20479 20752,20752,20752 21025,21025,21025 21298,21298,21298 21571,21571,21571 21845,21845,21845 22118,22118,22118 22391,22391,22391 22664,22664,22664 22937,22937,22937 23210,23210,23210 23483,23483,23483 23756,23756,23756 24029,24029,24029 24302,24302,24302 24575,24575,24575 24848,24848,24848 25121,25121,25121 25394,25394,25394 25667,25667,25667 25940,25940,25940 26214,26214,26214 26487,26487,26487 26760,26760,26760 27033,27033,27033 27306,27306,27306 27579,27579,27579 27852,27852,27852 28125,28125,28125 28398,28398,28398 28671,28671,28671 28944,28944,28944 29217,29217,29217 29490,29490,29490 29763,29763,29763 30036,30036,30036 30309,30309,30309 30583,30583,30583 30856,30856,30856 31129,31129,31129 31402,31402,31402 31675,31675,31675 31948,31948,31948 32221,32221,32221 32494,32494,32494 32767,32767,32767 33040,33040,33040 33313,33313,33313 33586,33586,33586 33859,33859,33859 34132,34132,34132 34405,34405,34405 34678,34678,34678 34952,34952,34952 35225,35225,35225 35498,35498,35498 35771,35771,35771 36044,36044,36044 36317,36317,36317 36590,36590,36590 36863,36863,36863 37136,37136,37136 37409,37409,37409 37682,37682,37682 37955,37955,37955 38228,38228,38228 38501,38501,38501 38774,38774,38774 39047,39047,39047 39321,39321,39321 39594,39594,39594 39867,39867,39867 40140,40140,40140 40413,40413,40413 40686,40686,40686 40959,40959,40959 41232,41232,41232 41505,41505,41505 41778,41778,41778 42051,42051,42051 42324,42324,42324 42597,42597,42597 42870,42870,42870 43143,43143,43143 43416,43416,43416 43690,43690,43690 43963,43963,43963 44236,44236,44236 44509,44509,44509 44782,44782,44782 45055,45055,45055 45328,45328,45328 45601,45601,45601 45874,45874,45874 46147,46147,46147 46420,46420,46420 46693,46693,46693 46966,46966,46966 47239,47239,47239 47512,47512,47512 47785,47785,47785 48059,48059,48059 48332,48332,48332 48605,48605,48605 48878,48878,48878 49151,49151,49151 49424,49424,49424 49697,49697,49697 49970,49970,49970 50243,50243,50243 50516,50516,50516 50789,50789,50789 51062,51062,51062 51335,51335,51335 51608,51608,51608 51881,51881,51881 52154,52154,52154 52428,52428,52428 52701,52701,52701 52974,52974,52974 53247,53247,53247 53520,53520,53520 53793,53793,53793 54066,54066,54066 54339,54339,54339 54612,54612,54612 54885,54885,54885 55158,55158,55158 55431,55431,55431 55704,55704,55704 55977,55977,55977 56250,56250,56250 56523,56523,56523 56797,56797,56797 57070,57070,57070 57343,57343,57343 57616,57616,57616 57889,57889,57889 58162,58162,58162 58435,58435,58435 58708,58708,58708 58981,58981,58981 59254,59254,59254 59527,59527,59527 59800,59800,59800 60073,60073,60073 60346,60346,60346 60619,60619,60619 60892,60892,60892 61166,61166,61166 61439,61439,61439 61712,61712,61712 61985,61985,61985 62258,62258,62258 62531,62531,62531 62804,62804,62804 63077,63077,63077 63350,63350,63350 63623,63623,63623 63896,63896,63896 64169,64169,64169 64442,64442,64442 64715,64715,64715 64988,64988,64988 65261,65261,65261 65535,65535,65535 ########## g242.clr 0,0,0 271,271,271 543,543,543 815,815,815 1087,1087,1087 1359,1359,1359 1631,1631,1631 1903,1903,1903 2175,2175,2175 2447,2447,2447 2719,2719,2719 2991,2991,2991 3263,3263,3263 3535,3535,3535 3807,3807,3807 4078,4078,4078 4350,4350,4350 4622,4622,4622 4894,4894,4894 5166,5166,5166 5438,5438,5438 5710,5710,5710 5982,5982,5982 6254,6254,6254 6526,6526,6526 6798,6798,6798 7070,7070,7070 7342,7342,7342 7614,7614,7614 7885,7885,7885 8157,8157,8157 8429,8429,8429 8701,8701,8701 8973,8973,8973 9245,9245,9245 9517,9517,9517 9789,9789,9789 10061,10061,10061 10333,10333,10333 10605,10605,10605 10877,10877,10877 11149,11149,11149 11421,11421,11421 11692,11692,11692 11964,11964,11964 12236,12236,12236 12508,12508,12508 12780,12780,12780 13052,13052,13052 13324,13324,13324 13596,13596,13596 13868,13868,13868 14140,14140,14140 14412,14412,14412 14684,14684,14684 14956,14956,14956 15228,15228,15228 15499,15499,15499 15771,15771,15771 16043,16043,16043 16315,16315,16315 16587,16587,16587 16859,16859,16859 17131,17131,17131 17403,17403,17403 17675,17675,17675 17947,17947,17947 18219,18219,18219 18491,18491,18491 18763,18763,18763 19035,19035,19035 19306,19306,19306 19578,19578,19578 19850,19850,19850 20122,20122,20122 20394,20394,20394 20666,20666,20666 20938,20938,20938 21210,21210,21210 21482,21482,21482 21754,21754,21754 22026,22026,22026 22298,22298,22298 22570,22570,22570 22842,22842,22842 23114,23114,23114 23385,23385,23385 23657,23657,23657 23929,23929,23929 24201,24201,24201 24473,24473,24473 24745,24745,24745 25017,25017,25017 25289,25289,25289 25561,25561,25561 25833,25833,25833 26105,26105,26105 26377,26377,26377 26649,26649,26649 26921,26921,26921 27192,27192,27192 27464,27464,27464 27736,27736,27736 28008,28008,28008 28280,28280,28280 28552,28552,28552 28824,28824,28824 29096,29096,29096 29368,29368,29368 29640,29640,29640 29912,29912,29912 30184,30184,30184 30456,30456,30456 30728,30728,30728 30999,30999,30999 31271,31271,31271 31543,31543,31543 31815,31815,31815 32087,32087,32087 32359,32359,32359 32631,32631,32631 32903,32903,32903 33175,33175,33175 33447,33447,33447 33719,33719,33719 33991,33991,33991 34263,34263,34263 34535,34535,34535 34806,34806,34806 35078,35078,35078 35350,35350,35350 35622,35622,35622 35894,35894,35894 36166,36166,36166 36438,36438,36438 36710,36710,36710 36982,36982,36982 37254,37254,37254 37526,37526,37526 37798,37798,37798 38070,38070,38070 38342,38342,38342 38613,38613,38613 38885,38885,38885 39157,39157,39157 39429,39429,39429 39701,39701,39701 39973,39973,39973 40245,40245,40245 40517,40517,40517 40789,40789,40789 41061,41061,41061 41333,41333,41333 41605,41605,41605 41877,41877,41877 42149,42149,42149 42420,42420,42420 42692,42692,42692 42964,42964,42964 43236,43236,43236 43508,43508,43508 43780,43780,43780 44052,44052,44052 44324,44324,44324 44596,44596,44596 44868,44868,44868 45140,45140,45140 45412,45412,45412 45684,45684,45684 45956,45956,45956 46228,46228,46228 46499,46499,46499 46771,46771,46771 47043,47043,47043 47315,47315,47315 47587,47587,47587 47859,47859,47859 48131,48131,48131 48403,48403,48403 48675,48675,48675 48947,48947,48947 49219,49219,49219 49491,49491,49491 49763,49763,49763 50035,50035,50035 50306,50306,50306 50578,50578,50578 50850,50850,50850 51122,51122,51122 51394,51394,51394 51666,51666,51666 51938,51938,51938 52210,52210,52210 52482,52482,52482 52754,52754,52754 53026,53026,53026 53298,53298,53298 53570,53570,53570 53842,53842,53842 54113,54113,54113 54385,54385,54385 54657,54657,54657 54929,54929,54929 55201,55201,55201 55473,55473,55473 55745,55745,55745 56017,56017,56017 56289,56289,56289 56561,56561,56561 56833,56833,56833 57105,57105,57105 57377,57377,57377 57649,57649,57649 57920,57920,57920 58192,58192,58192 58464,58464,58464 58736,58736,58736 59008,59008,59008 59280,59280,59280 59552,59552,59552 59824,59824,59824 60096,60096,60096 60368,60368,60368 60640,60640,60640 60912,60912,60912 61184,61184,61184 61456,61456,61456 61727,61727,61727 61999,61999,61999 62271,62271,62271 62543,62543,62543 62815,62815,62815 63087,63087,63087 63359,63359,63359 63631,63631,63631 63903,63903,63903 64175,64175,64175 64447,64447,64447 64719,64719,64719 64991,64991,64991 65263,65263,65263 65535,65535,65535 ########## g243.clr 0,0,0 270,270,270 541,541,541 812,812,812 1083,1083,1083 1354,1354,1354 1624,1624,1624 1895,1895,1895 2166,2166,2166 2437,2437,2437 2708,2708,2708 2978,2978,2978 3249,3249,3249 3520,3520,3520 3791,3791,3791 4062,4062,4062 4332,4332,4332 4603,4603,4603 4874,4874,4874 5145,5145,5145 5416,5416,5416 5686,5686,5686 5957,5957,5957 6228,6228,6228 6499,6499,6499 6770,6770,6770 7040,7040,7040 7311,7311,7311 7582,7582,7582 7853,7853,7853 8124,8124,8124 8394,8394,8394 8665,8665,8665 8936,8936,8936 9207,9207,9207 9478,9478,9478 9749,9749,9749 10019,10019,10019 10290,10290,10290 10561,10561,10561 10832,10832,10832 11103,11103,11103 11373,11373,11373 11644,11644,11644 11915,11915,11915 12186,12186,12186 12457,12457,12457 12727,12727,12727 12998,12998,12998 13269,13269,13269 13540,13540,13540 13811,13811,13811 14081,14081,14081 14352,14352,14352 14623,14623,14623 14894,14894,14894 15165,15165,15165 15435,15435,15435 15706,15706,15706 15977,15977,15977 16248,16248,16248 16519,16519,16519 16789,16789,16789 17060,17060,17060 17331,17331,17331 17602,17602,17602 17873,17873,17873 18143,18143,18143 18414,18414,18414 18685,18685,18685 18956,18956,18956 19227,19227,19227 19498,19498,19498 19768,19768,19768 20039,20039,20039 20310,20310,20310 20581,20581,20581 20852,20852,20852 21122,21122,21122 21393,21393,21393 21664,21664,21664 21935,21935,21935 22206,22206,22206 22476,22476,22476 22747,22747,22747 23018,23018,23018 23289,23289,23289 23560,23560,23560 23830,23830,23830 24101,24101,24101 24372,24372,24372 24643,24643,24643 24914,24914,24914 25184,25184,25184 25455,25455,25455 25726,25726,25726 25997,25997,25997 26268,26268,26268 26538,26538,26538 26809,26809,26809 27080,27080,27080 27351,27351,27351 27622,27622,27622 27892,27892,27892 28163,28163,28163 28434,28434,28434 28705,28705,28705 28976,28976,28976 29247,29247,29247 29517,29517,29517 29788,29788,29788 30059,30059,30059 30330,30330,30330 30601,30601,30601 30871,30871,30871 31142,31142,31142 31413,31413,31413 31684,31684,31684 31955,31955,31955 32225,32225,32225 32496,32496,32496 32767,32767,32767 33038,33038,33038 33309,33309,33309 33579,33579,33579 33850,33850,33850 34121,34121,34121 34392,34392,34392 34663,34663,34663 34933,34933,34933 35204,35204,35204 35475,35475,35475 35746,35746,35746 36017,36017,36017 36287,36287,36287 36558,36558,36558 36829,36829,36829 37100,37100,37100 37371,37371,37371 37642,37642,37642 37912,37912,37912 38183,38183,38183 38454,38454,38454 38725,38725,38725 38996,38996,38996 39266,39266,39266 39537,39537,39537 39808,39808,39808 40079,40079,40079 40350,40350,40350 40620,40620,40620 40891,40891,40891 41162,41162,41162 41433,41433,41433 41704,41704,41704 41974,41974,41974 42245,42245,42245 42516,42516,42516 42787,42787,42787 43058,43058,43058 43328,43328,43328 43599,43599,43599 43870,43870,43870 44141,44141,44141 44412,44412,44412 44682,44682,44682 44953,44953,44953 45224,45224,45224 45495,45495,45495 45766,45766,45766 46036,46036,46036 46307,46307,46307 46578,46578,46578 46849,46849,46849 47120,47120,47120 47391,47391,47391 47661,47661,47661 47932,47932,47932 48203,48203,48203 48474,48474,48474 48745,48745,48745 49015,49015,49015 49286,49286,49286 49557,49557,49557 49828,49828,49828 50099,50099,50099 50369,50369,50369 50640,50640,50640 50911,50911,50911 51182,51182,51182 51453,51453,51453 51723,51723,51723 51994,51994,51994 52265,52265,52265 52536,52536,52536 52807,52807,52807 53077,53077,53077 53348,53348,53348 53619,53619,53619 53890,53890,53890 54161,54161,54161 54431,54431,54431 54702,54702,54702 54973,54973,54973 55244,55244,55244 55515,55515,55515 55785,55785,55785 56056,56056,56056 56327,56327,56327 56598,56598,56598 56869,56869,56869 57140,57140,57140 57410,57410,57410 57681,57681,57681 57952,57952,57952 58223,58223,58223 58494,58494,58494 58764,58764,58764 59035,59035,59035 59306,59306,59306 59577,59577,59577 59848,59848,59848 60118,60118,60118 60389,60389,60389 60660,60660,60660 60931,60931,60931 61202,61202,61202 61472,61472,61472 61743,61743,61743 62014,62014,62014 62285,62285,62285 62556,62556,62556 62826,62826,62826 63097,63097,63097 63368,63368,63368 63639,63639,63639 63910,63910,63910 64180,64180,64180 64451,64451,64451 64722,64722,64722 64993,64993,64993 65264,65264,65264 65535,65535,65535 ########## g244.clr 0,0,0 269,269,269 539,539,539 809,809,809 1078,1078,1078 1348,1348,1348 1618,1618,1618 1887,1887,1887 2157,2157,2157 2427,2427,2427 2696,2696,2696 2966,2966,2966 3236,3236,3236 3505,3505,3505 3775,3775,3775 4045,4045,4045 4315,4315,4315 4584,4584,4584 4854,4854,4854 5124,5124,5124 5393,5393,5393 5663,5663,5663 5933,5933,5933 6202,6202,6202 6472,6472,6472 6742,6742,6742 7011,7011,7011 7281,7281,7281 7551,7551,7551 7821,7821,7821 8090,8090,8090 8360,8360,8360 8630,8630,8630 8899,8899,8899 9169,9169,9169 9439,9439,9439 9708,9708,9708 9978,9978,9978 10248,10248,10248 10517,10517,10517 10787,10787,10787 11057,11057,11057 11327,11327,11327 11596,11596,11596 11866,11866,11866 12136,12136,12136 12405,12405,12405 12675,12675,12675 12945,12945,12945 13214,13214,13214 13484,13484,13484 13754,13754,13754 14023,14023,14023 14293,14293,14293 14563,14563,14563 14833,14833,14833 15102,15102,15102 15372,15372,15372 15642,15642,15642 15911,15911,15911 16181,16181,16181 16451,16451,16451 16720,16720,16720 16990,16990,16990 17260,17260,17260 17529,17529,17529 17799,17799,17799 18069,18069,18069 18339,18339,18339 18608,18608,18608 18878,18878,18878 19148,19148,19148 19417,19417,19417 19687,19687,19687 19957,19957,19957 20226,20226,20226 20496,20496,20496 20766,20766,20766 21035,21035,21035 21305,21305,21305 21575,21575,21575 21845,21845,21845 22114,22114,22114 22384,22384,22384 22654,22654,22654 22923,22923,22923 23193,23193,23193 23463,23463,23463 23732,23732,23732 24002,24002,24002 24272,24272,24272 24541,24541,24541 24811,24811,24811 25081,25081,25081 25350,25350,25350 25620,25620,25620 25890,25890,25890 26160,26160,26160 26429,26429,26429 26699,26699,26699 26969,26969,26969 27238,27238,27238 27508,27508,27508 27778,27778,27778 28047,28047,28047 28317,28317,28317 28587,28587,28587 28856,28856,28856 29126,29126,29126 29396,29396,29396 29666,29666,29666 29935,29935,29935 30205,30205,30205 30475,30475,30475 30744,30744,30744 31014,31014,31014 31284,31284,31284 31553,31553,31553 31823,31823,31823 32093,32093,32093 32362,32362,32362 32632,32632,32632 32902,32902,32902 33172,33172,33172 33441,33441,33441 33711,33711,33711 33981,33981,33981 34250,34250,34250 34520,34520,34520 34790,34790,34790 35059,35059,35059 35329,35329,35329 35599,35599,35599 35868,35868,35868 36138,36138,36138 36408,36408,36408 36678,36678,36678 36947,36947,36947 37217,37217,37217 37487,37487,37487 37756,37756,37756 38026,38026,38026 38296,38296,38296 38565,38565,38565 38835,38835,38835 39105,39105,39105 39374,39374,39374 39644,39644,39644 39914,39914,39914 40184,40184,40184 40453,40453,40453 40723,40723,40723 40993,40993,40993 41262,41262,41262 41532,41532,41532 41802,41802,41802 42071,42071,42071 42341,42341,42341 42611,42611,42611 42880,42880,42880 43150,43150,43150 43420,43420,43420 43690,43690,43690 43959,43959,43959 44229,44229,44229 44499,44499,44499 44768,44768,44768 45038,45038,45038 45308,45308,45308 45577,45577,45577 45847,45847,45847 46117,46117,46117 46386,46386,46386 46656,46656,46656 46926,46926,46926 47195,47195,47195 47465,47465,47465 47735,47735,47735 48005,48005,48005 48274,48274,48274 48544,48544,48544 48814,48814,48814 49083,49083,49083 49353,49353,49353 49623,49623,49623 49892,49892,49892 50162,50162,50162 50432,50432,50432 50701,50701,50701 50971,50971,50971 51241,51241,51241 51511,51511,51511 51780,51780,51780 52050,52050,52050 52320,52320,52320 52589,52589,52589 52859,52859,52859 53129,53129,53129 53398,53398,53398 53668,53668,53668 53938,53938,53938 54207,54207,54207 54477,54477,54477 54747,54747,54747 55017,55017,55017 55286,55286,55286 55556,55556,55556 55826,55826,55826 56095,56095,56095 56365,56365,56365 56635,56635,56635 56904,56904,56904 57174,57174,57174 57444,57444,57444 57713,57713,57713 57983,57983,57983 58253,58253,58253 58523,58523,58523 58792,58792,58792 59062,59062,59062 59332,59332,59332 59601,59601,59601 59871,59871,59871 60141,60141,60141 60410,60410,60410 60680,60680,60680 60950,60950,60950 61219,61219,61219 61489,61489,61489 61759,61759,61759 62029,62029,62029 62298,62298,62298 62568,62568,62568 62838,62838,62838 63107,63107,63107 63377,63377,63377 63647,63647,63647 63916,63916,63916 64186,64186,64186 64456,64456,64456 64725,64725,64725 64995,64995,64995 65265,65265,65265 65535,65535,65535 ########## g245.clr 0,0,0 268,268,268 537,537,537 805,805,805 1074,1074,1074 1342,1342,1342 1611,1611,1611 1880,1880,1880 2148,2148,2148 2417,2417,2417 2685,2685,2685 2954,2954,2954 3223,3223,3223 3491,3491,3491 3760,3760,3760 4028,4028,4028 4297,4297,4297 4565,4565,4565 4834,4834,4834 5103,5103,5103 5371,5371,5371 5640,5640,5640 5908,5908,5908 6177,6177,6177 6446,6446,6446 6714,6714,6714 6983,6983,6983 7251,7251,7251 7520,7520,7520 7788,7788,7788 8057,8057,8057 8326,8326,8326 8594,8594,8594 8863,8863,8863 9131,9131,9131 9400,9400,9400 9669,9669,9669 9937,9937,9937 10206,10206,10206 10474,10474,10474 10743,10743,10743 11012,11012,11012 11280,11280,11280 11549,11549,11549 11817,11817,11817 12086,12086,12086 12354,12354,12354 12623,12623,12623 12892,12892,12892 13160,13160,13160 13429,13429,13429 13697,13697,13697 13966,13966,13966 14235,14235,14235 14503,14503,14503 14772,14772,14772 15040,15040,15040 15309,15309,15309 15577,15577,15577 15846,15846,15846 16115,16115,16115 16383,16383,16383 16652,16652,16652 16920,16920,16920 17189,17189,17189 17458,17458,17458 17726,17726,17726 17995,17995,17995 18263,18263,18263 18532,18532,18532 18801,18801,18801 19069,19069,19069 19338,19338,19338 19606,19606,19606 19875,19875,19875 20143,20143,20143 20412,20412,20412 20681,20681,20681 20949,20949,20949 21218,21218,21218 21486,21486,21486 21755,21755,21755 22024,22024,22024 22292,22292,22292 22561,22561,22561 22829,22829,22829 23098,23098,23098 23366,23366,23366 23635,23635,23635 23904,23904,23904 24172,24172,24172 24441,24441,24441 24709,24709,24709 24978,24978,24978 25247,25247,25247 25515,25515,25515 25784,25784,25784 26052,26052,26052 26321,26321,26321 26590,26590,26590 26858,26858,26858 27127,27127,27127 27395,27395,27395 27664,27664,27664 27932,27932,27932 28201,28201,28201 28470,28470,28470 28738,28738,28738 29007,29007,29007 29275,29275,29275 29544,29544,29544 29813,29813,29813 30081,30081,30081 30350,30350,30350 30618,30618,30618 30887,30887,30887 31155,31155,31155 31424,31424,31424 31693,31693,31693 31961,31961,31961 32230,32230,32230 32498,32498,32498 32767,32767,32767 33036,33036,33036 33304,33304,33304 33573,33573,33573 33841,33841,33841 34110,34110,34110 34379,34379,34379 34647,34647,34647 34916,34916,34916 35184,35184,35184 35453,35453,35453 35721,35721,35721 35990,35990,35990 36259,36259,36259 36527,36527,36527 36796,36796,36796 37064,37064,37064 37333,37333,37333 37602,37602,37602 37870,37870,37870 38139,38139,38139 38407,38407,38407 38676,38676,38676 38944,38944,38944 39213,39213,39213 39482,39482,39482 39750,39750,39750 40019,40019,40019 40287,40287,40287 40556,40556,40556 40825,40825,40825 41093,41093,41093 41362,41362,41362 41630,41630,41630 41899,41899,41899 42168,42168,42168 42436,42436,42436 42705,42705,42705 42973,42973,42973 43242,43242,43242 43510,43510,43510 43779,43779,43779 44048,44048,44048 44316,44316,44316 44585,44585,44585 44853,44853,44853 45122,45122,45122 45391,45391,45391 45659,45659,45659 45928,45928,45928 46196,46196,46196 46465,46465,46465 46733,46733,46733 47002,47002,47002 47271,47271,47271 47539,47539,47539 47808,47808,47808 48076,48076,48076 48345,48345,48345 48614,48614,48614 48882,48882,48882 49151,49151,49151 49419,49419,49419 49688,49688,49688 49957,49957,49957 50225,50225,50225 50494,50494,50494 50762,50762,50762 51031,51031,51031 51299,51299,51299 51568,51568,51568 51837,51837,51837 52105,52105,52105 52374,52374,52374 52642,52642,52642 52911,52911,52911 53180,53180,53180 53448,53448,53448 53717,53717,53717 53985,53985,53985 54254,54254,54254 54522,54522,54522 54791,54791,54791 55060,55060,55060 55328,55328,55328 55597,55597,55597 55865,55865,55865 56134,56134,56134 56403,56403,56403 56671,56671,56671 56940,56940,56940 57208,57208,57208 57477,57477,57477 57746,57746,57746 58014,58014,58014 58283,58283,58283 58551,58551,58551 58820,58820,58820 59088,59088,59088 59357,59357,59357 59626,59626,59626 59894,59894,59894 60163,60163,60163 60431,60431,60431 60700,60700,60700 60969,60969,60969 61237,61237,61237 61506,61506,61506 61774,61774,61774 62043,62043,62043 62311,62311,62311 62580,62580,62580 62849,62849,62849 63117,63117,63117 63386,63386,63386 63654,63654,63654 63923,63923,63923 64192,64192,64192 64460,64460,64460 64729,64729,64729 64997,64997,64997 65266,65266,65266 65535,65535,65535 ########## g246.clr 0,0,0 267,267,267 534,534,534 802,802,802 1069,1069,1069 1337,1337,1337 1604,1604,1604 1872,1872,1872 2139,2139,2139 2407,2407,2407 2674,2674,2674 2942,2942,2942 3209,3209,3209 3477,3477,3477 3744,3744,3744 4012,4012,4012 4279,4279,4279 4547,4547,4547 4814,4814,4814 5082,5082,5082 5349,5349,5349 5617,5617,5617 5884,5884,5884 6152,6152,6152 6419,6419,6419 6687,6687,6687 6954,6954,6954 7222,7222,7222 7489,7489,7489 7757,7757,7757 8024,8024,8024 8292,8292,8292 8559,8559,8559 8827,8827,8827 9094,9094,9094 9362,9362,9362 9629,9629,9629 9897,9897,9897 10164,10164,10164 10432,10432,10432 10699,10699,10699 10967,10967,10967 11234,11234,11234 11502,11502,11502 11769,11769,11769 12037,12037,12037 12304,12304,12304 12572,12572,12572 12839,12839,12839 13107,13107,13107 13374,13374,13374 13641,13641,13641 13909,13909,13909 14176,14176,14176 14444,14444,14444 14711,14711,14711 14979,14979,14979 15246,15246,15246 15514,15514,15514 15781,15781,15781 16049,16049,16049 16316,16316,16316 16584,16584,16584 16851,16851,16851 17119,17119,17119 17386,17386,17386 17654,17654,17654 17921,17921,17921 18189,18189,18189 18456,18456,18456 18724,18724,18724 18991,18991,18991 19259,19259,19259 19526,19526,19526 19794,19794,19794 20061,20061,20061 20329,20329,20329 20596,20596,20596 20864,20864,20864 21131,21131,21131 21399,21399,21399 21666,21666,21666 21934,21934,21934 22201,22201,22201 22469,22469,22469 22736,22736,22736 23004,23004,23004 23271,23271,23271 23539,23539,23539 23806,23806,23806 24074,24074,24074 24341,24341,24341 24609,24609,24609 24876,24876,24876 25144,25144,25144 25411,25411,25411 25679,25679,25679 25946,25946,25946 26214,26214,26214 26481,26481,26481 26748,26748,26748 27016,27016,27016 27283,27283,27283 27551,27551,27551 27818,27818,27818 28086,28086,28086 28353,28353,28353 28621,28621,28621 28888,28888,28888 29156,29156,29156 29423,29423,29423 29691,29691,29691 29958,29958,29958 30226,30226,30226 30493,30493,30493 30761,30761,30761 31028,31028,31028 31296,31296,31296 31563,31563,31563 31831,31831,31831 32098,32098,32098 32366,32366,32366 32633,32633,32633 32901,32901,32901 33168,33168,33168 33436,33436,33436 33703,33703,33703 33971,33971,33971 34238,34238,34238 34506,34506,34506 34773,34773,34773 35041,35041,35041 35308,35308,35308 35576,35576,35576 35843,35843,35843 36111,36111,36111 36378,36378,36378 36646,36646,36646 36913,36913,36913 37181,37181,37181 37448,37448,37448 37716,37716,37716 37983,37983,37983 38251,38251,38251 38518,38518,38518 38786,38786,38786 39053,39053,39053 39321,39321,39321 39588,39588,39588 39855,39855,39855 40123,40123,40123 40390,40390,40390 40658,40658,40658 40925,40925,40925 41193,41193,41193 41460,41460,41460 41728,41728,41728 41995,41995,41995 42263,42263,42263 42530,42530,42530 42798,42798,42798 43065,43065,43065 43333,43333,43333 43600,43600,43600 43868,43868,43868 44135,44135,44135 44403,44403,44403 44670,44670,44670 44938,44938,44938 45205,45205,45205 45473,45473,45473 45740,45740,45740 46008,46008,46008 46275,46275,46275 46543,46543,46543 46810,46810,46810 47078,47078,47078 47345,47345,47345 47613,47613,47613 47880,47880,47880 48148,48148,48148 48415,48415,48415 48683,48683,48683 48950,48950,48950 49218,49218,49218 49485,49485,49485 49753,49753,49753 50020,50020,50020 50288,50288,50288 50555,50555,50555 50823,50823,50823 51090,51090,51090 51358,51358,51358 51625,51625,51625 51893,51893,51893 52160,52160,52160 52428,52428,52428 52695,52695,52695 52962,52962,52962 53230,53230,53230 53497,53497,53497 53765,53765,53765 54032,54032,54032 54300,54300,54300 54567,54567,54567 54835,54835,54835 55102,55102,55102 55370,55370,55370 55637,55637,55637 55905,55905,55905 56172,56172,56172 56440,56440,56440 56707,56707,56707 56975,56975,56975 57242,57242,57242 57510,57510,57510 57777,57777,57777 58045,58045,58045 58312,58312,58312 58580,58580,58580 58847,58847,58847 59115,59115,59115 59382,59382,59382 59650,59650,59650 59917,59917,59917 60185,60185,60185 60452,60452,60452 60720,60720,60720 60987,60987,60987 61255,61255,61255 61522,61522,61522 61790,61790,61790 62057,62057,62057 62325,62325,62325 62592,62592,62592 62860,62860,62860 63127,63127,63127 63395,63395,63395 63662,63662,63662 63930,63930,63930 64197,64197,64197 64465,64465,64465 64732,64732,64732 65000,65000,65000 65267,65267,65267 65535,65535,65535 ########## g247.clr 0,0,0 266,266,266 532,532,532 799,799,799 1065,1065,1065 1332,1332,1332 1598,1598,1598 1864,1864,1864 2131,2131,2131 2397,2397,2397 2664,2664,2664 2930,2930,2930 3196,3196,3196 3463,3463,3463 3729,3729,3729 3996,3996,3996 4262,4262,4262 4528,4528,4528 4795,4795,4795 5061,5061,5061 5328,5328,5328 5594,5594,5594 5860,5860,5860 6127,6127,6127 6393,6393,6393 6660,6660,6660 6926,6926,6926 7192,7192,7192 7459,7459,7459 7725,7725,7725 7992,7992,7992 8258,8258,8258 8524,8524,8524 8791,8791,8791 9057,9057,9057 9324,9324,9324 9590,9590,9590 9856,9856,9856 10123,10123,10123 10389,10389,10389 10656,10656,10656 10922,10922,10922 11188,11188,11188 11455,11455,11455 11721,11721,11721 11988,11988,11988 12254,12254,12254 12520,12520,12520 12787,12787,12787 13053,13053,13053 13320,13320,13320 13586,13586,13586 13852,13852,13852 14119,14119,14119 14385,14385,14385 14652,14652,14652 14918,14918,14918 15184,15184,15184 15451,15451,15451 15717,15717,15717 15984,15984,15984 16250,16250,16250 16516,16516,16516 16783,16783,16783 17049,17049,17049 17316,17316,17316 17582,17582,17582 17848,17848,17848 18115,18115,18115 18381,18381,18381 18648,18648,18648 18914,18914,18914 19180,19180,19180 19447,19447,19447 19713,19713,19713 19980,19980,19980 20246,20246,20246 20512,20512,20512 20779,20779,20779 21045,21045,21045 21312,21312,21312 21578,21578,21578 21845,21845,21845 22111,22111,22111 22377,22377,22377 22644,22644,22644 22910,22910,22910 23177,23177,23177 23443,23443,23443 23709,23709,23709 23976,23976,23976 24242,24242,24242 24509,24509,24509 24775,24775,24775 25041,25041,25041 25308,25308,25308 25574,25574,25574 25841,25841,25841 26107,26107,26107 26373,26373,26373 26640,26640,26640 26906,26906,26906 27173,27173,27173 27439,27439,27439 27705,27705,27705 27972,27972,27972 28238,28238,28238 28505,28505,28505 28771,28771,28771 29037,29037,29037 29304,29304,29304 29570,29570,29570 29837,29837,29837 30103,30103,30103 30369,30369,30369 30636,30636,30636 30902,30902,30902 31169,31169,31169 31435,31435,31435 31701,31701,31701 31968,31968,31968 32234,32234,32234 32501,32501,32501 32767,32767,32767 33033,33033,33033 33300,33300,33300 33566,33566,33566 33833,33833,33833 34099,34099,34099 34365,34365,34365 34632,34632,34632 34898,34898,34898 35165,35165,35165 35431,35431,35431 35697,35697,35697 35964,35964,35964 36230,36230,36230 36497,36497,36497 36763,36763,36763 37029,37029,37029 37296,37296,37296 37562,37562,37562 37829,37829,37829 38095,38095,38095 38361,38361,38361 38628,38628,38628 38894,38894,38894 39161,39161,39161 39427,39427,39427 39693,39693,39693 39960,39960,39960 40226,40226,40226 40493,40493,40493 40759,40759,40759 41025,41025,41025 41292,41292,41292 41558,41558,41558 41825,41825,41825 42091,42091,42091 42357,42357,42357 42624,42624,42624 42890,42890,42890 43157,43157,43157 43423,43423,43423 43690,43690,43690 43956,43956,43956 44222,44222,44222 44489,44489,44489 44755,44755,44755 45022,45022,45022 45288,45288,45288 45554,45554,45554 45821,45821,45821 46087,46087,46087 46354,46354,46354 46620,46620,46620 46886,46886,46886 47153,47153,47153 47419,47419,47419 47686,47686,47686 47952,47952,47952 48218,48218,48218 48485,48485,48485 48751,48751,48751 49018,49018,49018 49284,49284,49284 49550,49550,49550 49817,49817,49817 50083,50083,50083 50350,50350,50350 50616,50616,50616 50882,50882,50882 51149,51149,51149 51415,51415,51415 51682,51682,51682 51948,51948,51948 52214,52214,52214 52481,52481,52481 52747,52747,52747 53014,53014,53014 53280,53280,53280 53546,53546,53546 53813,53813,53813 54079,54079,54079 54346,54346,54346 54612,54612,54612 54878,54878,54878 55145,55145,55145 55411,55411,55411 55678,55678,55678 55944,55944,55944 56210,56210,56210 56477,56477,56477 56743,56743,56743 57010,57010,57010 57276,57276,57276 57542,57542,57542 57809,57809,57809 58075,58075,58075 58342,58342,58342 58608,58608,58608 58874,58874,58874 59141,59141,59141 59407,59407,59407 59674,59674,59674 59940,59940,59940 60206,60206,60206 60473,60473,60473 60739,60739,60739 61006,61006,61006 61272,61272,61272 61538,61538,61538 61805,61805,61805 62071,62071,62071 62338,62338,62338 62604,62604,62604 62870,62870,62870 63137,63137,63137 63403,63403,63403 63670,63670,63670 63936,63936,63936 64202,64202,64202 64469,64469,64469 64735,64735,64735 65002,65002,65002 65268,65268,65268 65535,65535,65535 ########## g248.clr 0,0,0 265,265,265 530,530,530 795,795,795 1061,1061,1061 1326,1326,1326 1591,1591,1591 1857,1857,1857 2122,2122,2122 2387,2387,2387 2653,2653,2653 2918,2918,2918 3183,3183,3183 3449,3449,3449 3714,3714,3714 3979,3979,3979 4245,4245,4245 4510,4510,4510 4775,4775,4775 5041,5041,5041 5306,5306,5306 5571,5571,5571 5837,5837,5837 6102,6102,6102 6367,6367,6367 6633,6633,6633 6898,6898,6898 7163,7163,7163 7429,7429,7429 7694,7694,7694 7959,7959,7959 8225,8225,8225 8490,8490,8490 8755,8755,8755 9021,9021,9021 9286,9286,9286 9551,9551,9551 9816,9816,9816 10082,10082,10082 10347,10347,10347 10612,10612,10612 10878,10878,10878 11143,11143,11143 11408,11408,11408 11674,11674,11674 11939,11939,11939 12204,12204,12204 12470,12470,12470 12735,12735,12735 13000,13000,13000 13266,13266,13266 13531,13531,13531 13796,13796,13796 14062,14062,14062 14327,14327,14327 14592,14592,14592 14858,14858,14858 15123,15123,15123 15388,15388,15388 15654,15654,15654 15919,15919,15919 16184,16184,16184 16450,16450,16450 16715,16715,16715 16980,16980,16980 17246,17246,17246 17511,17511,17511 17776,17776,17776 18042,18042,18042 18307,18307,18307 18572,18572,18572 18837,18837,18837 19103,19103,19103 19368,19368,19368 19633,19633,19633 19899,19899,19899 20164,20164,20164 20429,20429,20429 20695,20695,20695 20960,20960,20960 21225,21225,21225 21491,21491,21491 21756,21756,21756 22021,22021,22021 22287,22287,22287 22552,22552,22552 22817,22817,22817 23083,23083,23083 23348,23348,23348 23613,23613,23613 23879,23879,23879 24144,24144,24144 24409,24409,24409 24675,24675,24675 24940,24940,24940 25205,25205,25205 25471,25471,25471 25736,25736,25736 26001,26001,26001 26267,26267,26267 26532,26532,26532 26797,26797,26797 27063,27063,27063 27328,27328,27328 27593,27593,27593 27859,27859,27859 28124,28124,28124 28389,28389,28389 28654,28654,28654 28920,28920,28920 29185,29185,29185 29450,29450,29450 29716,29716,29716 29981,29981,29981 30246,30246,30246 30512,30512,30512 30777,30777,30777 31042,31042,31042 31308,31308,31308 31573,31573,31573 31838,31838,31838 32104,32104,32104 32369,32369,32369 32634,32634,32634 32900,32900,32900 33165,33165,33165 33430,33430,33430 33696,33696,33696 33961,33961,33961 34226,34226,34226 34492,34492,34492 34757,34757,34757 35022,35022,35022 35288,35288,35288 35553,35553,35553 35818,35818,35818 36084,36084,36084 36349,36349,36349 36614,36614,36614 36880,36880,36880 37145,37145,37145 37410,37410,37410 37675,37675,37675 37941,37941,37941 38206,38206,38206 38471,38471,38471 38737,38737,38737 39002,39002,39002 39267,39267,39267 39533,39533,39533 39798,39798,39798 40063,40063,40063 40329,40329,40329 40594,40594,40594 40859,40859,40859 41125,41125,41125 41390,41390,41390 41655,41655,41655 41921,41921,41921 42186,42186,42186 42451,42451,42451 42717,42717,42717 42982,42982,42982 43247,43247,43247 43513,43513,43513 43778,43778,43778 44043,44043,44043 44309,44309,44309 44574,44574,44574 44839,44839,44839 45105,45105,45105 45370,45370,45370 45635,45635,45635 45901,45901,45901 46166,46166,46166 46431,46431,46431 46697,46697,46697 46962,46962,46962 47227,47227,47227 47492,47492,47492 47758,47758,47758 48023,48023,48023 48288,48288,48288 48554,48554,48554 48819,48819,48819 49084,49084,49084 49350,49350,49350 49615,49615,49615 49880,49880,49880 50146,50146,50146 50411,50411,50411 50676,50676,50676 50942,50942,50942 51207,51207,51207 51472,51472,51472 51738,51738,51738 52003,52003,52003 52268,52268,52268 52534,52534,52534 52799,52799,52799 53064,53064,53064 53330,53330,53330 53595,53595,53595 53860,53860,53860 54126,54126,54126 54391,54391,54391 54656,54656,54656 54922,54922,54922 55187,55187,55187 55452,55452,55452 55718,55718,55718 55983,55983,55983 56248,56248,56248 56513,56513,56513 56779,56779,56779 57044,57044,57044 57309,57309,57309 57575,57575,57575 57840,57840,57840 58105,58105,58105 58371,58371,58371 58636,58636,58636 58901,58901,58901 59167,59167,59167 59432,59432,59432 59697,59697,59697 59963,59963,59963 60228,60228,60228 60493,60493,60493 60759,60759,60759 61024,61024,61024 61289,61289,61289 61555,61555,61555 61820,61820,61820 62085,62085,62085 62351,62351,62351 62616,62616,62616 62881,62881,62881 63147,63147,63147 63412,63412,63412 63677,63677,63677 63943,63943,63943 64208,64208,64208 64473,64473,64473 64739,64739,64739 65004,65004,65004 65269,65269,65269 65535,65535,65535 ########## g249.clr 0,0,0 264,264,264 528,528,528 792,792,792 1057,1057,1057 1321,1321,1321 1585,1585,1585 1849,1849,1849 2114,2114,2114 2378,2378,2378 2642,2642,2642 2906,2906,2906 3171,3171,3171 3435,3435,3435 3699,3699,3699 3963,3963,3963 4228,4228,4228 4492,4492,4492 4756,4756,4756 5020,5020,5020 5285,5285,5285 5549,5549,5549 5813,5813,5813 6077,6077,6077 6342,6342,6342 6606,6606,6606 6870,6870,6870 7134,7134,7134 7399,7399,7399 7663,7663,7663 7927,7927,7927 8191,8191,8191 8456,8456,8456 8720,8720,8720 8984,8984,8984 9248,9248,9248 9513,9513,9513 9777,9777,9777 10041,10041,10041 10305,10305,10305 10570,10570,10570 10834,10834,10834 11098,11098,11098 11362,11362,11362 11627,11627,11627 11891,11891,11891 12155,12155,12155 12419,12419,12419 12684,12684,12684 12948,12948,12948 13212,13212,13212 13476,13476,13476 13741,13741,13741 14005,14005,14005 14269,14269,14269 14533,14533,14533 14798,14798,14798 15062,15062,15062 15326,15326,15326 15590,15590,15590 15855,15855,15855 16119,16119,16119 16383,16383,16383 16648,16648,16648 16912,16912,16912 17176,17176,17176 17440,17440,17440 17705,17705,17705 17969,17969,17969 18233,18233,18233 18497,18497,18497 18762,18762,18762 19026,19026,19026 19290,19290,19290 19554,19554,19554 19819,19819,19819 20083,20083,20083 20347,20347,20347 20611,20611,20611 20876,20876,20876 21140,21140,21140 21404,21404,21404 21668,21668,21668 21933,21933,21933 22197,22197,22197 22461,22461,22461 22725,22725,22725 22990,22990,22990 23254,23254,23254 23518,23518,23518 23782,23782,23782 24047,24047,24047 24311,24311,24311 24575,24575,24575 24839,24839,24839 25104,25104,25104 25368,25368,25368 25632,25632,25632 25896,25896,25896 26161,26161,26161 26425,26425,26425 26689,26689,26689 26953,26953,26953 27218,27218,27218 27482,27482,27482 27746,27746,27746 28010,28010,28010 28275,28275,28275 28539,28539,28539 28803,28803,28803 29067,29067,29067 29332,29332,29332 29596,29596,29596 29860,29860,29860 30124,30124,30124 30389,30389,30389 30653,30653,30653 30917,30917,30917 31181,31181,31181 31446,31446,31446 31710,31710,31710 31974,31974,31974 32238,32238,32238 32503,32503,32503 32767,32767,32767 33031,33031,33031 33296,33296,33296 33560,33560,33560 33824,33824,33824 34088,34088,34088 34353,34353,34353 34617,34617,34617 34881,34881,34881 35145,35145,35145 35410,35410,35410 35674,35674,35674 35938,35938,35938 36202,36202,36202 36467,36467,36467 36731,36731,36731 36995,36995,36995 37259,37259,37259 37524,37524,37524 37788,37788,37788 38052,38052,38052 38316,38316,38316 38581,38581,38581 38845,38845,38845 39109,39109,39109 39373,39373,39373 39638,39638,39638 39902,39902,39902 40166,40166,40166 40430,40430,40430 40695,40695,40695 40959,40959,40959 41223,41223,41223 41487,41487,41487 41752,41752,41752 42016,42016,42016 42280,42280,42280 42544,42544,42544 42809,42809,42809 43073,43073,43073 43337,43337,43337 43601,43601,43601 43866,43866,43866 44130,44130,44130 44394,44394,44394 44658,44658,44658 44923,44923,44923 45187,45187,45187 45451,45451,45451 45715,45715,45715 45980,45980,45980 46244,46244,46244 46508,46508,46508 46772,46772,46772 47037,47037,47037 47301,47301,47301 47565,47565,47565 47829,47829,47829 48094,48094,48094 48358,48358,48358 48622,48622,48622 48886,48886,48886 49151,49151,49151 49415,49415,49415 49679,49679,49679 49944,49944,49944 50208,50208,50208 50472,50472,50472 50736,50736,50736 51001,51001,51001 51265,51265,51265 51529,51529,51529 51793,51793,51793 52058,52058,52058 52322,52322,52322 52586,52586,52586 52850,52850,52850 53115,53115,53115 53379,53379,53379 53643,53643,53643 53907,53907,53907 54172,54172,54172 54436,54436,54436 54700,54700,54700 54964,54964,54964 55229,55229,55229 55493,55493,55493 55757,55757,55757 56021,56021,56021 56286,56286,56286 56550,56550,56550 56814,56814,56814 57078,57078,57078 57343,57343,57343 57607,57607,57607 57871,57871,57871 58135,58135,58135 58400,58400,58400 58664,58664,58664 58928,58928,58928 59192,59192,59192 59457,59457,59457 59721,59721,59721 59985,59985,59985 60249,60249,60249 60514,60514,60514 60778,60778,60778 61042,61042,61042 61306,61306,61306 61571,61571,61571 61835,61835,61835 62099,62099,62099 62363,62363,62363 62628,62628,62628 62892,62892,62892 63156,63156,63156 63420,63420,63420 63685,63685,63685 63949,63949,63949 64213,64213,64213 64477,64477,64477 64742,64742,64742 65006,65006,65006 65270,65270,65270 65535,65535,65535 ########## g25.clr 0,0,0 2730,2730,2730 5461,5461,5461 8191,8191,8191 10922,10922,10922 13653,13653,13653 16383,16383,16383 19114,19114,19114 21845,21845,21845 24575,24575,24575 27306,27306,27306 30036,30036,30036 32767,32767,32767 35498,35498,35498 38228,38228,38228 40959,40959,40959 43690,43690,43690 46420,46420,46420 49151,49151,49151 51881,51881,51881 54612,54612,54612 57343,57343,57343 60073,60073,60073 62804,62804,62804 65535,65535,65535 ########## g250.clr 0,0,0 263,263,263 526,526,526 789,789,789 1052,1052,1052 1315,1315,1315 1579,1579,1579 1842,1842,1842 2105,2105,2105 2368,2368,2368 2631,2631,2631 2895,2895,2895 3158,3158,3158 3421,3421,3421 3684,3684,3684 3947,3947,3947 4211,4211,4211 4474,4474,4474 4737,4737,4737 5000,5000,5000 5263,5263,5263 5527,5527,5527 5790,5790,5790 6053,6053,6053 6316,6316,6316 6579,6579,6579 6843,6843,6843 7106,7106,7106 7369,7369,7369 7632,7632,7632 7895,7895,7895 8158,8158,8158 8422,8422,8422 8685,8685,8685 8948,8948,8948 9211,9211,9211 9474,9474,9474 9738,9738,9738 10001,10001,10001 10264,10264,10264 10527,10527,10527 10790,10790,10790 11054,11054,11054 11317,11317,11317 11580,11580,11580 11843,11843,11843 12106,12106,12106 12370,12370,12370 12633,12633,12633 12896,12896,12896 13159,13159,13159 13422,13422,13422 13686,13686,13686 13949,13949,13949 14212,14212,14212 14475,14475,14475 14738,14738,14738 15001,15001,15001 15265,15265,15265 15528,15528,15528 15791,15791,15791 16054,16054,16054 16317,16317,16317 16581,16581,16581 16844,16844,16844 17107,17107,17107 17370,17370,17370 17633,17633,17633 17897,17897,17897 18160,18160,18160 18423,18423,18423 18686,18686,18686 18949,18949,18949 19213,19213,19213 19476,19476,19476 19739,19739,19739 20002,20002,20002 20265,20265,20265 20529,20529,20529 20792,20792,20792 21055,21055,21055 21318,21318,21318 21581,21581,21581 21844,21844,21844 22108,22108,22108 22371,22371,22371 22634,22634,22634 22897,22897,22897 23160,23160,23160 23424,23424,23424 23687,23687,23687 23950,23950,23950 24213,24213,24213 24476,24476,24476 24740,24740,24740 25003,25003,25003 25266,25266,25266 25529,25529,25529 25792,25792,25792 26056,26056,26056 26319,26319,26319 26582,26582,26582 26845,26845,26845 27108,27108,27108 27372,27372,27372 27635,27635,27635 27898,27898,27898 28161,28161,28161 28424,28424,28424 28688,28688,28688 28951,28951,28951 29214,29214,29214 29477,29477,29477 29740,29740,29740 30003,30003,30003 30267,30267,30267 30530,30530,30530 30793,30793,30793 31056,31056,31056 31319,31319,31319 31583,31583,31583 31846,31846,31846 32109,32109,32109 32372,32372,32372 32635,32635,32635 32899,32899,32899 33162,33162,33162 33425,33425,33425 33688,33688,33688 33951,33951,33951 34215,34215,34215 34478,34478,34478 34741,34741,34741 35004,35004,35004 35267,35267,35267 35531,35531,35531 35794,35794,35794 36057,36057,36057 36320,36320,36320 36583,36583,36583 36846,36846,36846 37110,37110,37110 37373,37373,37373 37636,37636,37636 37899,37899,37899 38162,38162,38162 38426,38426,38426 38689,38689,38689 38952,38952,38952 39215,39215,39215 39478,39478,39478 39742,39742,39742 40005,40005,40005 40268,40268,40268 40531,40531,40531 40794,40794,40794 41058,41058,41058 41321,41321,41321 41584,41584,41584 41847,41847,41847 42110,42110,42110 42374,42374,42374 42637,42637,42637 42900,42900,42900 43163,43163,43163 43426,43426,43426 43689,43689,43689 43953,43953,43953 44216,44216,44216 44479,44479,44479 44742,44742,44742 45005,45005,45005 45269,45269,45269 45532,45532,45532 45795,45795,45795 46058,46058,46058 46321,46321,46321 46585,46585,46585 46848,46848,46848 47111,47111,47111 47374,47374,47374 47637,47637,47637 47901,47901,47901 48164,48164,48164 48427,48427,48427 48690,48690,48690 48953,48953,48953 49217,49217,49217 49480,49480,49480 49743,49743,49743 50006,50006,50006 50269,50269,50269 50533,50533,50533 50796,50796,50796 51059,51059,51059 51322,51322,51322 51585,51585,51585 51848,51848,51848 52112,52112,52112 52375,52375,52375 52638,52638,52638 52901,52901,52901 53164,53164,53164 53428,53428,53428 53691,53691,53691 53954,53954,53954 54217,54217,54217 54480,54480,54480 54744,54744,54744 55007,55007,55007 55270,55270,55270 55533,55533,55533 55796,55796,55796 56060,56060,56060 56323,56323,56323 56586,56586,56586 56849,56849,56849 57112,57112,57112 57376,57376,57376 57639,57639,57639 57902,57902,57902 58165,58165,58165 58428,58428,58428 58691,58691,58691 58955,58955,58955 59218,59218,59218 59481,59481,59481 59744,59744,59744 60007,60007,60007 60271,60271,60271 60534,60534,60534 60797,60797,60797 61060,61060,61060 61323,61323,61323 61587,61587,61587 61850,61850,61850 62113,62113,62113 62376,62376,62376 62639,62639,62639 62903,62903,62903 63166,63166,63166 63429,63429,63429 63692,63692,63692 63955,63955,63955 64219,64219,64219 64482,64482,64482 64745,64745,64745 65008,65008,65008 65271,65271,65271 65534,65534,65534 ########## g251.clr 0,0,0 262,262,262 524,524,524 786,786,786 1048,1048,1048 1310,1310,1310 1572,1572,1572 1834,1834,1834 2097,2097,2097 2359,2359,2359 2621,2621,2621 2883,2883,2883 3145,3145,3145 3407,3407,3407 3669,3669,3669 3932,3932,3932 4194,4194,4194 4456,4456,4456 4718,4718,4718 4980,4980,4980 5242,5242,5242 5504,5504,5504 5767,5767,5767 6029,6029,6029 6291,6291,6291 6553,6553,6553 6815,6815,6815 7077,7077,7077 7339,7339,7339 7602,7602,7602 7864,7864,7864 8126,8126,8126 8388,8388,8388 8650,8650,8650 8912,8912,8912 9174,9174,9174 9437,9437,9437 9699,9699,9699 9961,9961,9961 10223,10223,10223 10485,10485,10485 10747,10747,10747 11009,11009,11009 11272,11272,11272 11534,11534,11534 11796,11796,11796 12058,12058,12058 12320,12320,12320 12582,12582,12582 12844,12844,12844 13107,13107,13107 13369,13369,13369 13631,13631,13631 13893,13893,13893 14155,14155,14155 14417,14417,14417 14679,14679,14679 14941,14941,14941 15204,15204,15204 15466,15466,15466 15728,15728,15728 15990,15990,15990 16252,16252,16252 16514,16514,16514 16776,16776,16776 17039,17039,17039 17301,17301,17301 17563,17563,17563 17825,17825,17825 18087,18087,18087 18349,18349,18349 18611,18611,18611 18874,18874,18874 19136,19136,19136 19398,19398,19398 19660,19660,19660 19922,19922,19922 20184,20184,20184 20446,20446,20446 20709,20709,20709 20971,20971,20971 21233,21233,21233 21495,21495,21495 21757,21757,21757 22019,22019,22019 22281,22281,22281 22544,22544,22544 22806,22806,22806 23068,23068,23068 23330,23330,23330 23592,23592,23592 23854,23854,23854 24116,24116,24116 24379,24379,24379 24641,24641,24641 24903,24903,24903 25165,25165,25165 25427,25427,25427 25689,25689,25689 25951,25951,25951 26214,26214,26214 26476,26476,26476 26738,26738,26738 27000,27000,27000 27262,27262,27262 27524,27524,27524 27786,27786,27786 28048,28048,28048 28311,28311,28311 28573,28573,28573 28835,28835,28835 29097,29097,29097 29359,29359,29359 29621,29621,29621 29883,29883,29883 30146,30146,30146 30408,30408,30408 30670,30670,30670 30932,30932,30932 31194,31194,31194 31456,31456,31456 31718,31718,31718 31981,31981,31981 32243,32243,32243 32505,32505,32505 32767,32767,32767 33029,33029,33029 33291,33291,33291 33553,33553,33553 33816,33816,33816 34078,34078,34078 34340,34340,34340 34602,34602,34602 34864,34864,34864 35126,35126,35126 35388,35388,35388 35651,35651,35651 35913,35913,35913 36175,36175,36175 36437,36437,36437 36699,36699,36699 36961,36961,36961 37223,37223,37223 37486,37486,37486 37748,37748,37748 38010,38010,38010 38272,38272,38272 38534,38534,38534 38796,38796,38796 39058,39058,39058 39321,39321,39321 39583,39583,39583 39845,39845,39845 40107,40107,40107 40369,40369,40369 40631,40631,40631 40893,40893,40893 41155,41155,41155 41418,41418,41418 41680,41680,41680 41942,41942,41942 42204,42204,42204 42466,42466,42466 42728,42728,42728 42990,42990,42990 43253,43253,43253 43515,43515,43515 43777,43777,43777 44039,44039,44039 44301,44301,44301 44563,44563,44563 44825,44825,44825 45088,45088,45088 45350,45350,45350 45612,45612,45612 45874,45874,45874 46136,46136,46136 46398,46398,46398 46660,46660,46660 46923,46923,46923 47185,47185,47185 47447,47447,47447 47709,47709,47709 47971,47971,47971 48233,48233,48233 48495,48495,48495 48758,48758,48758 49020,49020,49020 49282,49282,49282 49544,49544,49544 49806,49806,49806 50068,50068,50068 50330,50330,50330 50593,50593,50593 50855,50855,50855 51117,51117,51117 51379,51379,51379 51641,51641,51641 51903,51903,51903 52165,52165,52165 52428,52428,52428 52690,52690,52690 52952,52952,52952 53214,53214,53214 53476,53476,53476 53738,53738,53738 54000,54000,54000 54262,54262,54262 54525,54525,54525 54787,54787,54787 55049,55049,55049 55311,55311,55311 55573,55573,55573 55835,55835,55835 56097,56097,56097 56360,56360,56360 56622,56622,56622 56884,56884,56884 57146,57146,57146 57408,57408,57408 57670,57670,57670 57932,57932,57932 58195,58195,58195 58457,58457,58457 58719,58719,58719 58981,58981,58981 59243,59243,59243 59505,59505,59505 59767,59767,59767 60030,60030,60030 60292,60292,60292 60554,60554,60554 60816,60816,60816 61078,61078,61078 61340,61340,61340 61602,61602,61602 61865,61865,61865 62127,62127,62127 62389,62389,62389 62651,62651,62651 62913,62913,62913 63175,63175,63175 63437,63437,63437 63700,63700,63700 63962,63962,63962 64224,64224,64224 64486,64486,64486 64748,64748,64748 65010,65010,65010 65272,65272,65272 65535,65535,65535 ########## g252.clr 0,0,0 261,261,261 522,522,522 783,783,783 1044,1044,1044 1305,1305,1305 1566,1566,1566 1827,1827,1827 2088,2088,2088 2349,2349,2349 2610,2610,2610 2872,2872,2872 3133,3133,3133 3394,3394,3394 3655,3655,3655 3916,3916,3916 4177,4177,4177 4438,4438,4438 4699,4699,4699 4960,4960,4960 5221,5221,5221 5483,5483,5483 5744,5744,5744 6005,6005,6005 6266,6266,6266 6527,6527,6527 6788,6788,6788 7049,7049,7049 7310,7310,7310 7571,7571,7571 7832,7832,7832 8093,8093,8093 8355,8355,8355 8616,8616,8616 8877,8877,8877 9138,9138,9138 9399,9399,9399 9660,9660,9660 9921,9921,9921 10182,10182,10182 10443,10443,10443 10704,10704,10704 10966,10966,10966 11227,11227,11227 11488,11488,11488 11749,11749,11749 12010,12010,12010 12271,12271,12271 12532,12532,12532 12793,12793,12793 13054,13054,13054 13315,13315,13315 13576,13576,13576 13838,13838,13838 14099,14099,14099 14360,14360,14360 14621,14621,14621 14882,14882,14882 15143,15143,15143 15404,15404,15404 15665,15665,15665 15926,15926,15926 16187,16187,16187 16449,16449,16449 16710,16710,16710 16971,16971,16971 17232,17232,17232 17493,17493,17493 17754,17754,17754 18015,18015,18015 18276,18276,18276 18537,18537,18537 18798,18798,18798 19059,19059,19059 19321,19321,19321 19582,19582,19582 19843,19843,19843 20104,20104,20104 20365,20365,20365 20626,20626,20626 20887,20887,20887 21148,21148,21148 21409,21409,21409 21670,21670,21670 21932,21932,21932 22193,22193,22193 22454,22454,22454 22715,22715,22715 22976,22976,22976 23237,23237,23237 23498,23498,23498 23759,23759,23759 24020,24020,24020 24281,24281,24281 24542,24542,24542 24804,24804,24804 25065,25065,25065 25326,25326,25326 25587,25587,25587 25848,25848,25848 26109,26109,26109 26370,26370,26370 26631,26631,26631 26892,26892,26892 27153,27153,27153 27415,27415,27415 27676,27676,27676 27937,27937,27937 28198,28198,28198 28459,28459,28459 28720,28720,28720 28981,28981,28981 29242,29242,29242 29503,29503,29503 29764,29764,29764 30025,30025,30025 30287,30287,30287 30548,30548,30548 30809,30809,30809 31070,31070,31070 31331,31331,31331 31592,31592,31592 31853,31853,31853 32114,32114,32114 32375,32375,32375 32636,32636,32636 32898,32898,32898 33159,33159,33159 33420,33420,33420 33681,33681,33681 33942,33942,33942 34203,34203,34203 34464,34464,34464 34725,34725,34725 34986,34986,34986 35247,35247,35247 35509,35509,35509 35770,35770,35770 36031,36031,36031 36292,36292,36292 36553,36553,36553 36814,36814,36814 37075,37075,37075 37336,37336,37336 37597,37597,37597 37858,37858,37858 38119,38119,38119 38381,38381,38381 38642,38642,38642 38903,38903,38903 39164,39164,39164 39425,39425,39425 39686,39686,39686 39947,39947,39947 40208,40208,40208 40469,40469,40469 40730,40730,40730 40992,40992,40992 41253,41253,41253 41514,41514,41514 41775,41775,41775 42036,42036,42036 42297,42297,42297 42558,42558,42558 42819,42819,42819 43080,43080,43080 43341,43341,43341 43602,43602,43602 43864,43864,43864 44125,44125,44125 44386,44386,44386 44647,44647,44647 44908,44908,44908 45169,45169,45169 45430,45430,45430 45691,45691,45691 45952,45952,45952 46213,46213,46213 46475,46475,46475 46736,46736,46736 46997,46997,46997 47258,47258,47258 47519,47519,47519 47780,47780,47780 48041,48041,48041 48302,48302,48302 48563,48563,48563 48824,48824,48824 49085,49085,49085 49347,49347,49347 49608,49608,49608 49869,49869,49869 50130,50130,50130 50391,50391,50391 50652,50652,50652 50913,50913,50913 51174,51174,51174 51435,51435,51435 51696,51696,51696 51958,51958,51958 52219,52219,52219 52480,52480,52480 52741,52741,52741 53002,53002,53002 53263,53263,53263 53524,53524,53524 53785,53785,53785 54046,54046,54046 54307,54307,54307 54568,54568,54568 54830,54830,54830 55091,55091,55091 55352,55352,55352 55613,55613,55613 55874,55874,55874 56135,56135,56135 56396,56396,56396 56657,56657,56657 56918,56918,56918 57179,57179,57179 57441,57441,57441 57702,57702,57702 57963,57963,57963 58224,58224,58224 58485,58485,58485 58746,58746,58746 59007,59007,59007 59268,59268,59268 59529,59529,59529 59790,59790,59790 60051,60051,60051 60313,60313,60313 60574,60574,60574 60835,60835,60835 61096,61096,61096 61357,61357,61357 61618,61618,61618 61879,61879,61879 62140,62140,62140 62401,62401,62401 62662,62662,62662 62924,62924,62924 63185,63185,63185 63446,63446,63446 63707,63707,63707 63968,63968,63968 64229,64229,64229 64490,64490,64490 64751,64751,64751 65012,65012,65012 65273,65273,65273 65535,65535,65535 ########## g253.clr 0,0,0 260,260,260 520,520,520 780,780,780 1040,1040,1040 1300,1300,1300 1560,1560,1560 1820,1820,1820 2080,2080,2080 2340,2340,2340 2600,2600,2600 2860,2860,2860 3120,3120,3120 3380,3380,3380 3640,3640,3640 3900,3900,3900 4160,4160,4160 4421,4421,4421 4681,4681,4681 4941,4941,4941 5201,5201,5201 5461,5461,5461 5721,5721,5721 5981,5981,5981 6241,6241,6241 6501,6501,6501 6761,6761,6761 7021,7021,7021 7281,7281,7281 7541,7541,7541 7801,7801,7801 8061,8061,8061 8321,8321,8321 8581,8581,8581 8842,8842,8842 9102,9102,9102 9362,9362,9362 9622,9622,9622 9882,9882,9882 10142,10142,10142 10402,10402,10402 10662,10662,10662 10922,10922,10922 11182,11182,11182 11442,11442,11442 11702,11702,11702 11962,11962,11962 12222,12222,12222 12482,12482,12482 12742,12742,12742 13002,13002,13002 13263,13263,13263 13523,13523,13523 13783,13783,13783 14043,14043,14043 14303,14303,14303 14563,14563,14563 14823,14823,14823 15083,15083,15083 15343,15343,15343 15603,15603,15603 15863,15863,15863 16123,16123,16123 16383,16383,16383 16643,16643,16643 16903,16903,16903 17163,17163,17163 17423,17423,17423 17684,17684,17684 17944,17944,17944 18204,18204,18204 18464,18464,18464 18724,18724,18724 18984,18984,18984 19244,19244,19244 19504,19504,19504 19764,19764,19764 20024,20024,20024 20284,20284,20284 20544,20544,20544 20804,20804,20804 21064,21064,21064 21324,21324,21324 21584,21584,21584 21845,21845,21845 22105,22105,22105 22365,22365,22365 22625,22625,22625 22885,22885,22885 23145,23145,23145 23405,23405,23405 23665,23665,23665 23925,23925,23925 24185,24185,24185 24445,24445,24445 24705,24705,24705 24965,24965,24965 25225,25225,25225 25485,25485,25485 25745,25745,25745 26005,26005,26005 26266,26266,26266 26526,26526,26526 26786,26786,26786 27046,27046,27046 27306,27306,27306 27566,27566,27566 27826,27826,27826 28086,28086,28086 28346,28346,28346 28606,28606,28606 28866,28866,28866 29126,29126,29126 29386,29386,29386 29646,29646,29646 29906,29906,29906 30166,30166,30166 30426,30426,30426 30687,30687,30687 30947,30947,30947 31207,31207,31207 31467,31467,31467 31727,31727,31727 31987,31987,31987 32247,32247,32247 32507,32507,32507 32767,32767,32767 33027,33027,33027 33287,33287,33287 33547,33547,33547 33807,33807,33807 34067,34067,34067 34327,34327,34327 34587,34587,34587 34847,34847,34847 35108,35108,35108 35368,35368,35368 35628,35628,35628 35888,35888,35888 36148,36148,36148 36408,36408,36408 36668,36668,36668 36928,36928,36928 37188,37188,37188 37448,37448,37448 37708,37708,37708 37968,37968,37968 38228,38228,38228 38488,38488,38488 38748,38748,38748 39008,39008,39008 39268,39268,39268 39529,39529,39529 39789,39789,39789 40049,40049,40049 40309,40309,40309 40569,40569,40569 40829,40829,40829 41089,41089,41089 41349,41349,41349 41609,41609,41609 41869,41869,41869 42129,42129,42129 42389,42389,42389 42649,42649,42649 42909,42909,42909 43169,43169,43169 43429,43429,43429 43690,43690,43690 43950,43950,43950 44210,44210,44210 44470,44470,44470 44730,44730,44730 44990,44990,44990 45250,45250,45250 45510,45510,45510 45770,45770,45770 46030,46030,46030 46290,46290,46290 46550,46550,46550 46810,46810,46810 47070,47070,47070 47330,47330,47330 47590,47590,47590 47850,47850,47850 48111,48111,48111 48371,48371,48371 48631,48631,48631 48891,48891,48891 49151,49151,49151 49411,49411,49411 49671,49671,49671 49931,49931,49931 50191,50191,50191 50451,50451,50451 50711,50711,50711 50971,50971,50971 51231,51231,51231 51491,51491,51491 51751,51751,51751 52011,52011,52011 52271,52271,52271 52532,52532,52532 52792,52792,52792 53052,53052,53052 53312,53312,53312 53572,53572,53572 53832,53832,53832 54092,54092,54092 54352,54352,54352 54612,54612,54612 54872,54872,54872 55132,55132,55132 55392,55392,55392 55652,55652,55652 55912,55912,55912 56172,56172,56172 56432,56432,56432 56692,56692,56692 56953,56953,56953 57213,57213,57213 57473,57473,57473 57733,57733,57733 57993,57993,57993 58253,58253,58253 58513,58513,58513 58773,58773,58773 59033,59033,59033 59293,59293,59293 59553,59553,59553 59813,59813,59813 60073,60073,60073 60333,60333,60333 60593,60593,60593 60853,60853,60853 61113,61113,61113 61374,61374,61374 61634,61634,61634 61894,61894,61894 62154,62154,62154 62414,62414,62414 62674,62674,62674 62934,62934,62934 63194,63194,63194 63454,63454,63454 63714,63714,63714 63974,63974,63974 64234,64234,64234 64494,64494,64494 64754,64754,64754 65014,65014,65014 65274,65274,65274 65535,65535,65535 ########## g254.clr 0,0,0 259,259,259 518,518,518 777,777,777 1036,1036,1036 1295,1295,1295 1554,1554,1554 1813,1813,1813 2072,2072,2072 2331,2331,2331 2590,2590,2590 2849,2849,2849 3108,3108,3108 3367,3367,3367 3626,3626,3626 3885,3885,3885 4144,4144,4144 4403,4403,4403 4662,4662,4662 4921,4921,4921 5180,5180,5180 5439,5439,5439 5698,5698,5698 5957,5957,5957 6216,6216,6216 6475,6475,6475 6734,6734,6734 6993,6993,6993 7252,7252,7252 7511,7511,7511 7770,7770,7770 8029,8029,8029 8289,8289,8289 8548,8548,8548 8807,8807,8807 9066,9066,9066 9325,9325,9325 9584,9584,9584 9843,9843,9843 10102,10102,10102 10361,10361,10361 10620,10620,10620 10879,10879,10879 11138,11138,11138 11397,11397,11397 11656,11656,11656 11915,11915,11915 12174,12174,12174 12433,12433,12433 12692,12692,12692 12951,12951,12951 13210,13210,13210 13469,13469,13469 13728,13728,13728 13987,13987,13987 14246,14246,14246 14505,14505,14505 14764,14764,14764 15023,15023,15023 15282,15282,15282 15541,15541,15541 15800,15800,15800 16059,16059,16059 16318,16318,16318 16578,16578,16578 16837,16837,16837 17096,17096,17096 17355,17355,17355 17614,17614,17614 17873,17873,17873 18132,18132,18132 18391,18391,18391 18650,18650,18650 18909,18909,18909 19168,19168,19168 19427,19427,19427 19686,19686,19686 19945,19945,19945 20204,20204,20204 20463,20463,20463 20722,20722,20722 20981,20981,20981 21240,21240,21240 21499,21499,21499 21758,21758,21758 22017,22017,22017 22276,22276,22276 22535,22535,22535 22794,22794,22794 23053,23053,23053 23312,23312,23312 23571,23571,23571 23830,23830,23830 24089,24089,24089 24348,24348,24348 24608,24608,24608 24867,24867,24867 25126,25126,25126 25385,25385,25385 25644,25644,25644 25903,25903,25903 26162,26162,26162 26421,26421,26421 26680,26680,26680 26939,26939,26939 27198,27198,27198 27457,27457,27457 27716,27716,27716 27975,27975,27975 28234,28234,28234 28493,28493,28493 28752,28752,28752 29011,29011,29011 29270,29270,29270 29529,29529,29529 29788,29788,29788 30047,30047,30047 30306,30306,30306 30565,30565,30565 30824,30824,30824 31083,31083,31083 31342,31342,31342 31601,31601,31601 31860,31860,31860 32119,32119,32119 32378,32378,32378 32637,32637,32637 32897,32897,32897 33156,33156,33156 33415,33415,33415 33674,33674,33674 33933,33933,33933 34192,34192,34192 34451,34451,34451 34710,34710,34710 34969,34969,34969 35228,35228,35228 35487,35487,35487 35746,35746,35746 36005,36005,36005 36264,36264,36264 36523,36523,36523 36782,36782,36782 37041,37041,37041 37300,37300,37300 37559,37559,37559 37818,37818,37818 38077,38077,38077 38336,38336,38336 38595,38595,38595 38854,38854,38854 39113,39113,39113 39372,39372,39372 39631,39631,39631 39890,39890,39890 40149,40149,40149 40408,40408,40408 40667,40667,40667 40926,40926,40926 41186,41186,41186 41445,41445,41445 41704,41704,41704 41963,41963,41963 42222,42222,42222 42481,42481,42481 42740,42740,42740 42999,42999,42999 43258,43258,43258 43517,43517,43517 43776,43776,43776 44035,44035,44035 44294,44294,44294 44553,44553,44553 44812,44812,44812 45071,45071,45071 45330,45330,45330 45589,45589,45589 45848,45848,45848 46107,46107,46107 46366,46366,46366 46625,46625,46625 46884,46884,46884 47143,47143,47143 47402,47402,47402 47661,47661,47661 47920,47920,47920 48179,48179,48179 48438,48438,48438 48697,48697,48697 48956,48956,48956 49216,49216,49216 49475,49475,49475 49734,49734,49734 49993,49993,49993 50252,50252,50252 50511,50511,50511 50770,50770,50770 51029,51029,51029 51288,51288,51288 51547,51547,51547 51806,51806,51806 52065,52065,52065 52324,52324,52324 52583,52583,52583 52842,52842,52842 53101,53101,53101 53360,53360,53360 53619,53619,53619 53878,53878,53878 54137,54137,54137 54396,54396,54396 54655,54655,54655 54914,54914,54914 55173,55173,55173 55432,55432,55432 55691,55691,55691 55950,55950,55950 56209,56209,56209 56468,56468,56468 56727,56727,56727 56986,56986,56986 57245,57245,57245 57505,57505,57505 57764,57764,57764 58023,58023,58023 58282,58282,58282 58541,58541,58541 58800,58800,58800 59059,59059,59059 59318,59318,59318 59577,59577,59577 59836,59836,59836 60095,60095,60095 60354,60354,60354 60613,60613,60613 60872,60872,60872 61131,61131,61131 61390,61390,61390 61649,61649,61649 61908,61908,61908 62167,62167,62167 62426,62426,62426 62685,62685,62685 62944,62944,62944 63203,63203,63203 63462,63462,63462 63721,63721,63721 63980,63980,63980 64239,64239,64239 64498,64498,64498 64757,64757,64757 65016,65016,65016 65275,65275,65275 65535,65535,65535 ########## g255.clr 0,0,0 258,258,258 516,516,516 774,774,774 1032,1032,1032 1290,1290,1290 1548,1548,1548 1806,1806,1806 2064,2064,2064 2322,2322,2322 2580,2580,2580 2838,2838,2838 3096,3096,3096 3354,3354,3354 3612,3612,3612 3870,3870,3870 4128,4128,4128 4386,4386,4386 4644,4644,4644 4902,4902,4902 5160,5160,5160 5418,5418,5418 5676,5676,5676 5934,5934,5934 6192,6192,6192 6450,6450,6450 6708,6708,6708 6966,6966,6966 7224,7224,7224 7482,7482,7482 7740,7740,7740 7998,7998,7998 8256,8256,8256 8514,8514,8514 8772,8772,8772 9030,9030,9030 9288,9288,9288 9546,9546,9546 9804,9804,9804 10062,10062,10062 10320,10320,10320 10578,10578,10578 10836,10836,10836 11094,11094,11094 11352,11352,11352 11610,11610,11610 11868,11868,11868 12126,12126,12126 12384,12384,12384 12642,12642,12642 12900,12900,12900 13158,13158,13158 13416,13416,13416 13674,13674,13674 13932,13932,13932 14190,14190,14190 14448,14448,14448 14706,14706,14706 14964,14964,14964 15222,15222,15222 15480,15480,15480 15738,15738,15738 15996,15996,15996 16254,16254,16254 16512,16512,16512 16770,16770,16770 17028,17028,17028 17286,17286,17286 17544,17544,17544 17802,17802,17802 18060,18060,18060 18318,18318,18318 18576,18576,18576 18834,18834,18834 19092,19092,19092 19350,19350,19350 19608,19608,19608 19866,19866,19866 20124,20124,20124 20382,20382,20382 20640,20640,20640 20898,20898,20898 21156,21156,21156 21414,21414,21414 21672,21672,21672 21931,21931,21931 22189,22189,22189 22447,22447,22447 22705,22705,22705 22963,22963,22963 23221,23221,23221 23479,23479,23479 23737,23737,23737 23995,23995,23995 24253,24253,24253 24511,24511,24511 24769,24769,24769 25027,25027,25027 25285,25285,25285 25543,25543,25543 25801,25801,25801 26059,26059,26059 26317,26317,26317 26575,26575,26575 26833,26833,26833 27091,27091,27091 27349,27349,27349 27607,27607,27607 27865,27865,27865 28123,28123,28123 28381,28381,28381 28639,28639,28639 28897,28897,28897 29155,29155,29155 29413,29413,29413 29671,29671,29671 29929,29929,29929 30187,30187,30187 30445,30445,30445 30703,30703,30703 30961,30961,30961 31219,31219,31219 31477,31477,31477 31735,31735,31735 31993,31993,31993 32251,32251,32251 32509,32509,32509 32767,32767,32767 33025,33025,33025 33283,33283,33283 33541,33541,33541 33799,33799,33799 34057,34057,34057 34315,34315,34315 34573,34573,34573 34831,34831,34831 35089,35089,35089 35347,35347,35347 35605,35605,35605 35863,35863,35863 36121,36121,36121 36379,36379,36379 36637,36637,36637 36895,36895,36895 37153,37153,37153 37411,37411,37411 37669,37669,37669 37927,37927,37927 38185,38185,38185 38443,38443,38443 38701,38701,38701 38959,38959,38959 39217,39217,39217 39475,39475,39475 39733,39733,39733 39991,39991,39991 40249,40249,40249 40507,40507,40507 40765,40765,40765 41023,41023,41023 41281,41281,41281 41539,41539,41539 41797,41797,41797 42055,42055,42055 42313,42313,42313 42571,42571,42571 42829,42829,42829 43087,43087,43087 43345,43345,43345 43603,43603,43603 43862,43862,43862 44120,44120,44120 44378,44378,44378 44636,44636,44636 44894,44894,44894 45152,45152,45152 45410,45410,45410 45668,45668,45668 45926,45926,45926 46184,46184,46184 46442,46442,46442 46700,46700,46700 46958,46958,46958 47216,47216,47216 47474,47474,47474 47732,47732,47732 47990,47990,47990 48248,48248,48248 48506,48506,48506 48764,48764,48764 49022,49022,49022 49280,49280,49280 49538,49538,49538 49796,49796,49796 50054,50054,50054 50312,50312,50312 50570,50570,50570 50828,50828,50828 51086,51086,51086 51344,51344,51344 51602,51602,51602 51860,51860,51860 52118,52118,52118 52376,52376,52376 52634,52634,52634 52892,52892,52892 53150,53150,53150 53408,53408,53408 53666,53666,53666 53924,53924,53924 54182,54182,54182 54440,54440,54440 54698,54698,54698 54956,54956,54956 55214,55214,55214 55472,55472,55472 55730,55730,55730 55988,55988,55988 56246,56246,56246 56504,56504,56504 56762,56762,56762 57020,57020,57020 57278,57278,57278 57536,57536,57536 57794,57794,57794 58052,58052,58052 58310,58310,58310 58568,58568,58568 58826,58826,58826 59084,59084,59084 59342,59342,59342 59600,59600,59600 59858,59858,59858 60116,60116,60116 60374,60374,60374 60632,60632,60632 60890,60890,60890 61148,61148,61148 61406,61406,61406 61664,61664,61664 61922,61922,61922 62180,62180,62180 62438,62438,62438 62696,62696,62696 62954,62954,62954 63212,63212,63212 63470,63470,63470 63728,63728,63728 63986,63986,63986 64244,64244,64244 64502,64502,64502 64760,64760,64760 65018,65018,65018 65276,65276,65276 65535,65535,65535 ########## g256.clr 0,0,0 257,257,257 514,514,514 771,771,771 1028,1028,1028 1285,1285,1285 1542,1542,1542 1799,1799,1799 2056,2056,2056 2313,2313,2313 2570,2570,2570 2827,2827,2827 3084,3084,3084 3341,3341,3341 3598,3598,3598 3855,3855,3855 4112,4112,4112 4369,4369,4369 4626,4626,4626 4883,4883,4883 5140,5140,5140 5397,5397,5397 5654,5654,5654 5911,5911,5911 6168,6168,6168 6425,6425,6425 6682,6682,6682 6939,6939,6939 7196,7196,7196 7453,7453,7453 7710,7710,7710 7967,7967,7967 8224,8224,8224 8481,8481,8481 8738,8738,8738 8995,8995,8995 9252,9252,9252 9509,9509,9509 9766,9766,9766 10023,10023,10023 10280,10280,10280 10537,10537,10537 10794,10794,10794 11051,11051,11051 11308,11308,11308 11565,11565,11565 11822,11822,11822 12079,12079,12079 12336,12336,12336 12593,12593,12593 12850,12850,12850 13107,13107,13107 13364,13364,13364 13621,13621,13621 13878,13878,13878 14135,14135,14135 14392,14392,14392 14649,14649,14649 14906,14906,14906 15163,15163,15163 15420,15420,15420 15677,15677,15677 15934,15934,15934 16191,16191,16191 16448,16448,16448 16705,16705,16705 16962,16962,16962 17219,17219,17219 17476,17476,17476 17733,17733,17733 17990,17990,17990 18247,18247,18247 18504,18504,18504 18761,18761,18761 19018,19018,19018 19275,19275,19275 19532,19532,19532 19789,19789,19789 20046,20046,20046 20303,20303,20303 20560,20560,20560 20817,20817,20817 21074,21074,21074 21331,21331,21331 21588,21588,21588 21845,21845,21845 22102,22102,22102 22359,22359,22359 22616,22616,22616 22873,22873,22873 23130,23130,23130 23387,23387,23387 23644,23644,23644 23901,23901,23901 24158,24158,24158 24415,24415,24415 24672,24672,24672 24929,24929,24929 25186,25186,25186 25443,25443,25443 25700,25700,25700 25957,25957,25957 26214,26214,26214 26471,26471,26471 26728,26728,26728 26985,26985,26985 27242,27242,27242 27499,27499,27499 27756,27756,27756 28013,28013,28013 28270,28270,28270 28527,28527,28527 28784,28784,28784 29041,29041,29041 29298,29298,29298 29555,29555,29555 29812,29812,29812 30069,30069,30069 30326,30326,30326 30583,30583,30583 30840,30840,30840 31097,31097,31097 31354,31354,31354 31611,31611,31611 31868,31868,31868 32125,32125,32125 32382,32382,32382 32639,32639,32639 32896,32896,32896 33153,33153,33153 33410,33410,33410 33667,33667,33667 33924,33924,33924 34181,34181,34181 34438,34438,34438 34695,34695,34695 34952,34952,34952 35209,35209,35209 35466,35466,35466 35723,35723,35723 35980,35980,35980 36237,36237,36237 36494,36494,36494 36751,36751,36751 37008,37008,37008 37265,37265,37265 37522,37522,37522 37779,37779,37779 38036,38036,38036 38293,38293,38293 38550,38550,38550 38807,38807,38807 39064,39064,39064 39321,39321,39321 39578,39578,39578 39835,39835,39835 40092,40092,40092 40349,40349,40349 40606,40606,40606 40863,40863,40863 41120,41120,41120 41377,41377,41377 41634,41634,41634 41891,41891,41891 42148,42148,42148 42405,42405,42405 42662,42662,42662 42919,42919,42919 43176,43176,43176 43433,43433,43433 43690,43690,43690 43947,43947,43947 44204,44204,44204 44461,44461,44461 44718,44718,44718 44975,44975,44975 45232,45232,45232 45489,45489,45489 45746,45746,45746 46003,46003,46003 46260,46260,46260 46517,46517,46517 46774,46774,46774 47031,47031,47031 47288,47288,47288 47545,47545,47545 47802,47802,47802 48059,48059,48059 48316,48316,48316 48573,48573,48573 48830,48830,48830 49087,49087,49087 49344,49344,49344 49601,49601,49601 49858,49858,49858 50115,50115,50115 50372,50372,50372 50629,50629,50629 50886,50886,50886 51143,51143,51143 51400,51400,51400 51657,51657,51657 51914,51914,51914 52171,52171,52171 52428,52428,52428 52685,52685,52685 52942,52942,52942 53199,53199,53199 53456,53456,53456 53713,53713,53713 53970,53970,53970 54227,54227,54227 54484,54484,54484 54741,54741,54741 54998,54998,54998 55255,55255,55255 55512,55512,55512 55769,55769,55769 56026,56026,56026 56283,56283,56283 56540,56540,56540 56797,56797,56797 57054,57054,57054 57311,57311,57311 57568,57568,57568 57825,57825,57825 58082,58082,58082 58339,58339,58339 58596,58596,58596 58853,58853,58853 59110,59110,59110 59367,59367,59367 59624,59624,59624 59881,59881,59881 60138,60138,60138 60395,60395,60395 60652,60652,60652 60909,60909,60909 61166,61166,61166 61423,61423,61423 61680,61680,61680 61937,61937,61937 62194,62194,62194 62451,62451,62451 62708,62708,62708 62965,62965,62965 63222,63222,63222 63479,63479,63479 63736,63736,63736 63993,63993,63993 64250,64250,64250 64507,64507,64507 64764,64764,64764 65021,65021,65021 65278,65278,65278 65535,65535,65535 ########## g26.clr 0,0,0 2621,2621,2621 5242,5242,5242 7864,7864,7864 10485,10485,10485 13107,13107,13107 15728,15728,15728 18349,18349,18349 20971,20971,20971 23592,23592,23592 26214,26214,26214 28835,28835,28835 31456,31456,31456 34078,34078,34078 36699,36699,36699 39321,39321,39321 41942,41942,41942 44563,44563,44563 47185,47185,47185 49806,49806,49806 52428,52428,52428 55049,55049,55049 57670,57670,57670 60292,60292,60292 62913,62913,62913 65535,65535,65535 ########## g27.clr 0,0,0 2520,2520,2520 5041,5041,5041 7561,7561,7561 10082,10082,10082 12602,12602,12602 15123,15123,15123 17644,17644,17644 20164,20164,20164 22685,22685,22685 25205,25205,25205 27726,27726,27726 30246,30246,30246 32767,32767,32767 35288,35288,35288 37808,37808,37808 40329,40329,40329 42849,42849,42849 45370,45370,45370 47890,47890,47890 50411,50411,50411 52932,52932,52932 55452,55452,55452 57973,57973,57973 60493,60493,60493 63014,63014,63014 65535,65535,65535 ########## g28.clr 0,0,0 2427,2427,2427 4854,4854,4854 7281,7281,7281 9708,9708,9708 12136,12136,12136 14563,14563,14563 16990,16990,16990 19417,19417,19417 21845,21845,21845 24272,24272,24272 26699,26699,26699 29126,29126,29126 31553,31553,31553 33981,33981,33981 36408,36408,36408 38835,38835,38835 41262,41262,41262 43690,43690,43690 46117,46117,46117 48544,48544,48544 50971,50971,50971 53398,53398,53398 55826,55826,55826 58253,58253,58253 60680,60680,60680 63107,63107,63107 65535,65535,65535 ########## g29.clr 0,0,0 2340,2340,2340 4681,4681,4681 7021,7021,7021 9362,9362,9362 11702,11702,11702 14043,14043,14043 16383,16383,16383 18724,18724,18724 21064,21064,21064 23405,23405,23405 25745,25745,25745 28086,28086,28086 30426,30426,30426 32767,32767,32767 35108,35108,35108 37448,37448,37448 39789,39789,39789 42129,42129,42129 44470,44470,44470 46810,46810,46810 49151,49151,49151 51491,51491,51491 53832,53832,53832 56172,56172,56172 58513,58513,58513 60853,60853,60853 63194,63194,63194 65535,65535,65535 ########## g3.clr 0,0,0 32767,32767,32767 65535,65535,65535 ########## g30.clr 0,0,0 2259,2259,2259 4519,4519,4519 6779,6779,6779 9039,9039,9039 11299,11299,11299 13558,13558,13558 15818,15818,15818 18078,18078,18078 20338,20338,20338 22598,22598,22598 24858,24858,24858 27117,27117,27117 29377,29377,29377 31637,31637,31637 33897,33897,33897 36157,36157,36157 38417,38417,38417 40676,40676,40676 42936,42936,42936 45196,45196,45196 47456,47456,47456 49716,49716,49716 51976,51976,51976 54235,54235,54235 56495,56495,56495 58755,58755,58755 61015,61015,61015 63275,63275,63275 65535,65535,65535 ########## g31.clr 0,0,0 2184,2184,2184 4369,4369,4369 6553,6553,6553 8738,8738,8738 10922,10922,10922 13107,13107,13107 15291,15291,15291 17476,17476,17476 19660,19660,19660 21845,21845,21845 24029,24029,24029 26214,26214,26214 28398,28398,28398 30583,30583,30583 32767,32767,32767 34952,34952,34952 37136,37136,37136 39321,39321,39321 41505,41505,41505 43690,43690,43690 45874,45874,45874 48059,48059,48059 50243,50243,50243 52428,52428,52428 54612,54612,54612 56797,56797,56797 58981,58981,58981 61166,61166,61166 63350,63350,63350 65535,65535,65535 ########## g32.clr 0,0,0 2114,2114,2114 4228,4228,4228 6342,6342,6342 8456,8456,8456 10570,10570,10570 12684,12684,12684 14798,14798,14798 16912,16912,16912 19026,19026,19026 21140,21140,21140 23254,23254,23254 25368,25368,25368 27482,27482,27482 29596,29596,29596 31710,31710,31710 33824,33824,33824 35938,35938,35938 38052,38052,38052 40166,40166,40166 42280,42280,42280 44394,44394,44394 46508,46508,46508 48622,48622,48622 50736,50736,50736 52850,52850,52850 54964,54964,54964 57078,57078,57078 59192,59192,59192 61306,61306,61306 63420,63420,63420 65535,65535,65535 ########## g33.clr 0,0,0 2047,2047,2047 4095,4095,4095 6143,6143,6143 8191,8191,8191 10239,10239,10239 12287,12287,12287 14335,14335,14335 16383,16383,16383 18431,18431,18431 20479,20479,20479 22527,22527,22527 24575,24575,24575 26623,26623,26623 28671,28671,28671 30719,30719,30719 32767,32767,32767 34815,34815,34815 36863,36863,36863 38911,38911,38911 40959,40959,40959 43007,43007,43007 45055,45055,45055 47103,47103,47103 49151,49151,49151 51199,51199,51199 53247,53247,53247 55295,55295,55295 57343,57343,57343 59391,59391,59391 61439,61439,61439 63487,63487,63487 65535,65535,65535 ########## g34.clr 0,0,0 1985,1985,1985 3971,3971,3971 5957,5957,5957 7943,7943,7943 9929,9929,9929 11915,11915,11915 13901,13901,13901 15887,15887,15887 17873,17873,17873 19859,19859,19859 21845,21845,21845 23830,23830,23830 25816,25816,25816 27802,27802,27802 29788,29788,29788 31774,31774,31774 33760,33760,33760 35746,35746,35746 37732,37732,37732 39718,39718,39718 41704,41704,41704 43690,43690,43690 45675,45675,45675 47661,47661,47661 49647,49647,49647 51633,51633,51633 53619,53619,53619 55605,55605,55605 57591,57591,57591 59577,59577,59577 61563,61563,61563 63549,63549,63549 65535,65535,65535 ########## g35.clr 0,0,0 1927,1927,1927 3855,3855,3855 5782,5782,5782 7710,7710,7710 9637,9637,9637 11565,11565,11565 13492,13492,13492 15420,15420,15420 17347,17347,17347 19275,19275,19275 21202,21202,21202 23130,23130,23130 25057,25057,25057 26985,26985,26985 28912,28912,28912 30840,30840,30840 32767,32767,32767 34695,34695,34695 36622,36622,36622 38550,38550,38550 40477,40477,40477 42405,42405,42405 44332,44332,44332 46260,46260,46260 48187,48187,48187 50115,50115,50115 52042,52042,52042 53970,53970,53970 55897,55897,55897 57825,57825,57825 59752,59752,59752 61680,61680,61680 63607,63607,63607 65535,65535,65535 ########## g36.clr 0,0,0 1872,1872,1872 3744,3744,3744 5617,5617,5617 7489,7489,7489 9362,9362,9362 11234,11234,11234 13107,13107,13107 14979,14979,14979 16851,16851,16851 18724,18724,18724 20596,20596,20596 22469,22469,22469 24341,24341,24341 26214,26214,26214 28086,28086,28086 29958,29958,29958 31831,31831,31831 33703,33703,33703 35576,35576,35576 37448,37448,37448 39321,39321,39321 41193,41193,41193 43065,43065,43065 44938,44938,44938 46810,46810,46810 48683,48683,48683 50555,50555,50555 52428,52428,52428 54300,54300,54300 56172,56172,56172 58045,58045,58045 59917,59917,59917 61790,61790,61790 63662,63662,63662 65535,65535,65535 ########## g37.clr 0,0,0 1820,1820,1820 3640,3640,3640 5461,5461,5461 7281,7281,7281 9102,9102,9102 10922,10922,10922 12742,12742,12742 14563,14563,14563 16383,16383,16383 18204,18204,18204 20024,20024,20024 21845,21845,21845 23665,23665,23665 25485,25485,25485 27306,27306,27306 29126,29126,29126 30947,30947,30947 32767,32767,32767 34587,34587,34587 36408,36408,36408 38228,38228,38228 40049,40049,40049 41869,41869,41869 43690,43690,43690 45510,45510,45510 47330,47330,47330 49151,49151,49151 50971,50971,50971 52792,52792,52792 54612,54612,54612 56432,56432,56432 58253,58253,58253 60073,60073,60073 61894,61894,61894 63714,63714,63714 65534,65534,65534 ########## g38.clr 0,0,0 1771,1771,1771 3542,3542,3542 5313,5313,5313 7084,7084,7084 8856,8856,8856 10627,10627,10627 12398,12398,12398 14169,14169,14169 15940,15940,15940 17712,17712,17712 19483,19483,19483 21254,21254,21254 23025,23025,23025 24797,24797,24797 26568,26568,26568 28339,28339,28339 30110,30110,30110 31881,31881,31881 33653,33653,33653 35424,35424,35424 37195,37195,37195 38966,38966,38966 40737,40737,40737 42509,42509,42509 44280,44280,44280 46051,46051,46051 47822,47822,47822 49594,49594,49594 51365,51365,51365 53136,53136,53136 54907,54907,54907 56678,56678,56678 58450,58450,58450 60221,60221,60221 61992,61992,61992 63763,63763,63763 65535,65535,65535 ########## g39.clr 0,0,0 1724,1724,1724 3449,3449,3449 5173,5173,5173 6898,6898,6898 8623,8623,8623 10347,10347,10347 12072,12072,12072 13796,13796,13796 15521,15521,15521 17246,17246,17246 18970,18970,18970 20695,20695,20695 22419,22419,22419 24144,24144,24144 25869,25869,25869 27593,27593,27593 29318,29318,29318 31042,31042,31042 32767,32767,32767 34492,34492,34492 36216,36216,36216 37941,37941,37941 39665,39665,39665 41390,41390,41390 43115,43115,43115 44839,44839,44839 46564,46564,46564 48288,48288,48288 50013,50013,50013 51738,51738,51738 53462,53462,53462 55187,55187,55187 56911,56911,56911 58636,58636,58636 60361,60361,60361 62085,62085,62085 63810,63810,63810 65534,65534,65534 ########## g4.clr 0,0,0 21845,21845,21845 43690,43690,43690 65535,65535,65535 ########## g40.clr 0,0,0 1680,1680,1680 3360,3360,3360 5041,5041,5041 6721,6721,6721 8401,8401,8401 10082,10082,10082 11762,11762,11762 13443,13443,13443 15123,15123,15123 16803,16803,16803 18484,18484,18484 20164,20164,20164 21845,21845,21845 23525,23525,23525 25205,25205,25205 26886,26886,26886 28566,28566,28566 30246,30246,30246 31927,31927,31927 33607,33607,33607 35288,35288,35288 36968,36968,36968 38648,38648,38648 40329,40329,40329 42009,42009,42009 43690,43690,43690 45370,45370,45370 47050,47050,47050 48731,48731,48731 50411,50411,50411 52091,52091,52091 53772,53772,53772 55452,55452,55452 57133,57133,57133 58813,58813,58813 60493,60493,60493 62174,62174,62174 63854,63854,63854 65534,65534,65534 ########## g41.clr 0,0,0 1638,1638,1638 3276,3276,3276 4915,4915,4915 6553,6553,6553 8191,8191,8191 9830,9830,9830 11468,11468,11468 13107,13107,13107 14745,14745,14745 16383,16383,16383 18022,18022,18022 19660,19660,19660 21298,21298,21298 22937,22937,22937 24575,24575,24575 26214,26214,26214 27852,27852,27852 29490,29490,29490 31129,31129,31129 32767,32767,32767 34405,34405,34405 36044,36044,36044 37682,37682,37682 39321,39321,39321 40959,40959,40959 42597,42597,42597 44236,44236,44236 45874,45874,45874 47512,47512,47512 49151,49151,49151 50789,50789,50789 52428,52428,52428 54066,54066,54066 55704,55704,55704 57343,57343,57343 58981,58981,58981 60619,60619,60619 62258,62258,62258 63896,63896,63896 65535,65535,65535 ########## g42.clr 0,0,0 1598,1598,1598 3196,3196,3196 4795,4795,4795 6393,6393,6393 7992,7992,7992 9590,9590,9590 11188,11188,11188 12787,12787,12787 14385,14385,14385 15984,15984,15984 17582,17582,17582 19180,19180,19180 20779,20779,20779 22377,22377,22377 23976,23976,23976 25574,25574,25574 27173,27173,27173 28771,28771,28771 30369,30369,30369 31968,31968,31968 33566,33566,33566 35165,35165,35165 36763,36763,36763 38361,38361,38361 39960,39960,39960 41558,41558,41558 43157,43157,43157 44755,44755,44755 46354,46354,46354 47952,47952,47952 49550,49550,49550 51149,51149,51149 52747,52747,52747 54346,54346,54346 55944,55944,55944 57542,57542,57542 59141,59141,59141 60739,60739,60739 62338,62338,62338 63936,63936,63936 65535,65535,65535 ########## g43.clr 0,0,0 1560,1560,1560 3120,3120,3120 4681,4681,4681 6241,6241,6241 7801,7801,7801 9362,9362,9362 10922,10922,10922 12482,12482,12482 14043,14043,14043 15603,15603,15603 17163,17163,17163 18724,18724,18724 20284,20284,20284 21844,21844,21844 23405,23405,23405 24965,24965,24965 26526,26526,26526 28086,28086,28086 29646,29646,29646 31207,31207,31207 32767,32767,32767 34327,34327,34327 35888,35888,35888 37448,37448,37448 39008,39008,39008 40569,40569,40569 42129,42129,42129 43689,43689,43689 45250,45250,45250 46810,46810,46810 48371,48371,48371 49931,49931,49931 51491,51491,51491 53052,53052,53052 54612,54612,54612 56172,56172,56172 57733,57733,57733 59293,59293,59293 60853,60853,60853 62414,62414,62414 63974,63974,63974 65534,65534,65534 ########## g44.clr 0,0,0 1524,1524,1524 3048,3048,3048 4572,4572,4572 6096,6096,6096 7620,7620,7620 9144,9144,9144 10668,10668,10668 12192,12192,12192 13716,13716,13716 15240,15240,15240 16764,16764,16764 18288,18288,18288 19812,19812,19812 21336,21336,21336 22861,22861,22861 24385,24385,24385 25909,25909,25909 27433,27433,27433 28957,28957,28957 30481,30481,30481 32005,32005,32005 33529,33529,33529 35053,35053,35053 36577,36577,36577 38101,38101,38101 39625,39625,39625 41149,41149,41149 42673,42673,42673 44198,44198,44198 45722,45722,45722 47246,47246,47246 48770,48770,48770 50294,50294,50294 51818,51818,51818 53342,53342,53342 54866,54866,54866 56390,56390,56390 57914,57914,57914 59438,59438,59438 60962,60962,60962 62486,62486,62486 64010,64010,64010 65535,65535,65535 ########## g45.clr 0,0,0 1489,1489,1489 2978,2978,2978 4468,4468,4468 5957,5957,5957 7447,7447,7447 8936,8936,8936 10426,10426,10426 11915,11915,11915 13404,13404,13404 14894,14894,14894 16383,16383,16383 17873,17873,17873 19362,19362,19362 20852,20852,20852 22341,22341,22341 23830,23830,23830 25320,25320,25320 26809,26809,26809 28299,28299,28299 29788,29788,29788 31278,31278,31278 32767,32767,32767 34256,34256,34256 35746,35746,35746 37235,37235,37235 38725,38725,38725 40214,40214,40214 41704,41704,41704 43193,43193,43193 44682,44682,44682 46172,46172,46172 47661,47661,47661 49151,49151,49151 50640,50640,50640 52130,52130,52130 53619,53619,53619 55108,55108,55108 56598,56598,56598 58087,58087,58087 59577,59577,59577 61066,61066,61066 62556,62556,62556 64045,64045,64045 65535,65535,65535 ########## g46.clr 0,0,0 1456,1456,1456 2912,2912,2912 4369,4369,4369 5825,5825,5825 7281,7281,7281 8738,8738,8738 10194,10194,10194 11650,11650,11650 13107,13107,13107 14563,14563,14563 16019,16019,16019 17476,17476,17476 18932,18932,18932 20388,20388,20388 21845,21845,21845 23301,23301,23301 24757,24757,24757 26214,26214,26214 27670,27670,27670 29126,29126,29126 30583,30583,30583 32039,32039,32039 33495,33495,33495 34952,34952,34952 36408,36408,36408 37864,37864,37864 39321,39321,39321 40777,40777,40777 42233,42233,42233 43690,43690,43690 45146,45146,45146 46602,46602,46602 48059,48059,48059 49515,49515,49515 50971,50971,50971 52428,52428,52428 53884,53884,53884 55340,55340,55340 56797,56797,56797 58253,58253,58253 59709,59709,59709 61166,61166,61166 62622,62622,62622 64078,64078,64078 65535,65535,65535 ########## g47.clr 0,0,0 1424,1424,1424 2849,2849,2849 4274,4274,4274 5698,5698,5698 7123,7123,7123 8548,8548,8548 9972,9972,9972 11397,11397,11397 12822,12822,12822 14246,14246,14246 15671,15671,15671 17096,17096,17096 18520,18520,18520 19945,19945,19945 21370,21370,21370 22794,22794,22794 24219,24219,24219 25644,25644,25644 27068,27068,27068 28493,28493,28493 29918,29918,29918 31342,31342,31342 32767,32767,32767 34192,34192,34192 35616,35616,35616 37041,37041,37041 38466,38466,38466 39890,39890,39890 41315,41315,41315 42740,42740,42740 44164,44164,44164 45589,45589,45589 47014,47014,47014 48438,48438,48438 49863,49863,49863 51288,51288,51288 52712,52712,52712 54137,54137,54137 55562,55562,55562 56986,56986,56986 58411,58411,58411 59836,59836,59836 61260,61260,61260 62685,62685,62685 64110,64110,64110 65535,65535,65535 ########## g48.clr 0,0,0 1394,1394,1394 2788,2788,2788 4183,4183,4183 5577,5577,5577 6971,6971,6971 8366,8366,8366 9760,9760,9760 11154,11154,11154 12549,12549,12549 13943,13943,13943 15337,15337,15337 16732,16732,16732 18126,18126,18126 19521,19521,19521 20915,20915,20915 22309,22309,22309 23704,23704,23704 25098,25098,25098 26492,26492,26492 27887,27887,27887 29281,29281,29281 30675,30675,30675 32070,32070,32070 33464,33464,33464 34859,34859,34859 36253,36253,36253 37647,37647,37647 39042,39042,39042 40436,40436,40436 41830,41830,41830 43225,43225,43225 44619,44619,44619 46013,46013,46013 47408,47408,47408 48802,48802,48802 50197,50197,50197 51591,51591,51591 52985,52985,52985 54380,54380,54380 55774,55774,55774 57168,57168,57168 58563,58563,58563 59957,59957,59957 61351,61351,61351 62746,62746,62746 64140,64140,64140 65535,65535,65535 ########## g49.clr 0,0,0 1365,1365,1365 2730,2730,2730 4095,4095,4095 5461,5461,5461 6826,6826,6826 8191,8191,8191 9557,9557,9557 10922,10922,10922 12287,12287,12287 13653,13653,13653 15018,15018,15018 16383,16383,16383 17749,17749,17749 19114,19114,19114 20479,20479,20479 21845,21845,21845 23210,23210,23210 24575,24575,24575 25940,25940,25940 27306,27306,27306 28671,28671,28671 30036,30036,30036 31402,31402,31402 32767,32767,32767 34132,34132,34132 35498,35498,35498 36863,36863,36863 38228,38228,38228 39594,39594,39594 40959,40959,40959 42324,42324,42324 43690,43690,43690 45055,45055,45055 46420,46420,46420 47785,47785,47785 49151,49151,49151 50516,50516,50516 51881,51881,51881 53247,53247,53247 54612,54612,54612 55977,55977,55977 57343,57343,57343 58708,58708,58708 60073,60073,60073 61439,61439,61439 62804,62804,62804 64169,64169,64169 65535,65535,65535 ########## g5.clr 0,0,0 16383,16383,16383 32767,32767,32767 49151,49151,49151 65535,65535,65535 ########## g50.clr 0,0,0 1337,1337,1337 2674,2674,2674 4012,4012,4012 5349,5349,5349 6687,6687,6687 8024,8024,8024 9362,9362,9362 10699,10699,10699 12037,12037,12037 13374,13374,13374 14711,14711,14711 16049,16049,16049 17386,17386,17386 18724,18724,18724 20061,20061,20061 21399,21399,21399 22736,22736,22736 24074,24074,24074 25411,25411,25411 26748,26748,26748 28086,28086,28086 29423,29423,29423 30761,30761,30761 32098,32098,32098 33436,33436,33436 34773,34773,34773 36111,36111,36111 37448,37448,37448 38786,38786,38786 40123,40123,40123 41460,41460,41460 42798,42798,42798 44135,44135,44135 45473,45473,45473 46810,46810,46810 48148,48148,48148 49485,49485,49485 50823,50823,50823 52160,52160,52160 53497,53497,53497 54835,54835,54835 56172,56172,56172 57510,57510,57510 58847,58847,58847 60185,60185,60185 61522,61522,61522 62860,62860,62860 64197,64197,64197 65534,65534,65534 ########## g51.clr 0,0,0 1310,1310,1310 2621,2621,2621 3932,3932,3932 5242,5242,5242 6553,6553,6553 7864,7864,7864 9174,9174,9174 10485,10485,10485 11796,11796,11796 13107,13107,13107 14417,14417,14417 15728,15728,15728 17039,17039,17039 18349,18349,18349 19660,19660,19660 20971,20971,20971 22281,22281,22281 23592,23592,23592 24903,24903,24903 26214,26214,26214 27524,27524,27524 28835,28835,28835 30146,30146,30146 31456,31456,31456 32767,32767,32767 34078,34078,34078 35388,35388,35388 36699,36699,36699 38010,38010,38010 39321,39321,39321 40631,40631,40631 41942,41942,41942 43253,43253,43253 44563,44563,44563 45874,45874,45874 47185,47185,47185 48495,48495,48495 49806,49806,49806 51117,51117,51117 52428,52428,52428 53738,53738,53738 55049,55049,55049 56360,56360,56360 57670,57670,57670 58981,58981,58981 60292,60292,60292 61602,61602,61602 62913,62913,62913 64224,64224,64224 65535,65535,65535 ########## g52.clr 0,0,0 1285,1285,1285 2570,2570,2570 3855,3855,3855 5140,5140,5140 6425,6425,6425 7710,7710,7710 8995,8995,8995 10280,10280,10280 11565,11565,11565 12850,12850,12850 14135,14135,14135 15420,15420,15420 16705,16705,16705 17990,17990,17990 19275,19275,19275 20560,20560,20560 21845,21845,21845 23130,23130,23130 24415,24415,24415 25700,25700,25700 26985,26985,26985 28270,28270,28270 29555,29555,29555 30840,30840,30840 32125,32125,32125 33410,33410,33410 34695,34695,34695 35980,35980,35980 37265,37265,37265 38550,38550,38550 39835,39835,39835 41120,41120,41120 42405,42405,42405 43690,43690,43690 44975,44975,44975 46260,46260,46260 47545,47545,47545 48830,48830,48830 50115,50115,50115 51400,51400,51400 52685,52685,52685 53970,53970,53970 55255,55255,55255 56540,56540,56540 57825,57825,57825 59110,59110,59110 60395,60395,60395 61680,61680,61680 62965,62965,62965 64250,64250,64250 65535,65535,65535 ########## g53.clr 0,0,0 1260,1260,1260 2520,2520,2520 3780,3780,3780 5041,5041,5041 6301,6301,6301 7561,7561,7561 8822,8822,8822 10082,10082,10082 11342,11342,11342 12602,12602,12602 13863,13863,13863 15123,15123,15123 16383,16383,16383 17644,17644,17644 18904,18904,18904 20164,20164,20164 21424,21424,21424 22685,22685,22685 23945,23945,23945 25205,25205,25205 26466,26466,26466 27726,27726,27726 28986,28986,28986 30246,30246,30246 31507,31507,31507 32767,32767,32767 34027,34027,34027 35288,35288,35288 36548,36548,36548 37808,37808,37808 39068,39068,39068 40329,40329,40329 41589,41589,41589 42849,42849,42849 44110,44110,44110 45370,45370,45370 46630,46630,46630 47890,47890,47890 49151,49151,49151 50411,50411,50411 51671,51671,51671 52932,52932,52932 54192,54192,54192 55452,55452,55452 56712,56712,56712 57973,57973,57973 59233,59233,59233 60493,60493,60493 61754,61754,61754 63014,63014,63014 64274,64274,64274 65535,65535,65535 ########## g54.clr 0,0,0 1236,1236,1236 2473,2473,2473 3709,3709,3709 4946,4946,4946 6182,6182,6182 7419,7419,7419 8655,8655,8655 9892,9892,9892 11128,11128,11128 12365,12365,12365 13601,13601,13601 14838,14838,14838 16074,16074,16074 17311,17311,17311 18547,18547,18547 19784,19784,19784 21020,21020,21020 22257,22257,22257 23493,23493,23493 24730,24730,24730 25966,25966,25966 27203,27203,27203 28439,28439,28439 29676,29676,29676 30912,30912,30912 32149,32149,32149 33385,33385,33385 34622,34622,34622 35858,35858,35858 37095,37095,37095 38331,38331,38331 39568,39568,39568 40804,40804,40804 42041,42041,42041 43277,43277,43277 44514,44514,44514 45750,45750,45750 46987,46987,46987 48223,48223,48223 49460,49460,49460 50696,50696,50696 51933,51933,51933 53169,53169,53169 54406,54406,54406 55642,55642,55642 56879,56879,56879 58115,58115,58115 59352,59352,59352 60588,60588,60588 61825,61825,61825 63061,63061,63061 64298,64298,64298 65535,65535,65535 ########## g55.clr 0,0,0 1213,1213,1213 2427,2427,2427 3640,3640,3640 4854,4854,4854 6068,6068,6068 7281,7281,7281 8495,8495,8495 9708,9708,9708 10922,10922,10922 12136,12136,12136 13349,13349,13349 14563,14563,14563 15776,15776,15776 16990,16990,16990 18204,18204,18204 19417,19417,19417 20631,20631,20631 21845,21845,21845 23058,23058,23058 24272,24272,24272 25485,25485,25485 26699,26699,26699 27913,27913,27913 29126,29126,29126 30340,30340,30340 31553,31553,31553 32767,32767,32767 33981,33981,33981 35194,35194,35194 36408,36408,36408 37621,37621,37621 38835,38835,38835 40049,40049,40049 41262,41262,41262 42476,42476,42476 43690,43690,43690 44903,44903,44903 46117,46117,46117 47330,47330,47330 48544,48544,48544 49758,49758,49758 50971,50971,50971 52185,52185,52185 53398,53398,53398 54612,54612,54612 55826,55826,55826 57039,57039,57039 58253,58253,58253 59466,59466,59466 60680,60680,60680 61894,61894,61894 63107,63107,63107 64321,64321,64321 65535,65535,65535 ########## g56.clr 0,0,0 1191,1191,1191 2383,2383,2383 3574,3574,3574 4766,4766,4766 5957,5957,5957 7149,7149,7149 8340,8340,8340 9532,9532,9532 10723,10723,10723 11915,11915,11915 13107,13107,13107 14298,14298,14298 15490,15490,15490 16681,16681,16681 17873,17873,17873 19064,19064,19064 20256,20256,20256 21447,21447,21447 22639,22639,22639 23830,23830,23830 25022,25022,25022 26214,26214,26214 27405,27405,27405 28597,28597,28597 29788,29788,29788 30980,30980,30980 32171,32171,32171 33363,33363,33363 34554,34554,34554 35746,35746,35746 36937,36937,36937 38129,38129,38129 39321,39321,39321 40512,40512,40512 41704,41704,41704 42895,42895,42895 44087,44087,44087 45278,45278,45278 46470,46470,46470 47661,47661,47661 48853,48853,48853 50044,50044,50044 51236,51236,51236 52428,52428,52428 53619,53619,53619 54811,54811,54811 56002,56002,56002 57194,57194,57194 58385,58385,58385 59577,59577,59577 60768,60768,60768 61960,61960,61960 63151,63151,63151 64343,64343,64343 65535,65535,65535 ########## g57.clr 0,0,0 1170,1170,1170 2340,2340,2340 3510,3510,3510 4681,4681,4681 5851,5851,5851 7021,7021,7021 8191,8191,8191 9362,9362,9362 10532,10532,10532 11702,11702,11702 12872,12872,12872 14043,14043,14043 15213,15213,15213 16383,16383,16383 17554,17554,17554 18724,18724,18724 19894,19894,19894 21064,21064,21064 22235,22235,22235 23405,23405,23405 24575,24575,24575 25745,25745,25745 26916,26916,26916 28086,28086,28086 29256,29256,29256 30426,30426,30426 31597,31597,31597 32767,32767,32767 33937,33937,33937 35108,35108,35108 36278,36278,36278 37448,37448,37448 38618,38618,38618 39789,39789,39789 40959,40959,40959 42129,42129,42129 43299,43299,43299 44470,44470,44470 45640,45640,45640 46810,46810,46810 47980,47980,47980 49151,49151,49151 50321,50321,50321 51491,51491,51491 52662,52662,52662 53832,53832,53832 55002,55002,55002 56172,56172,56172 57343,57343,57343 58513,58513,58513 59683,59683,59683 60853,60853,60853 62024,62024,62024 63194,63194,63194 64364,64364,64364 65535,65535,65535 ########## g58.clr 0,0,0 1149,1149,1149 2299,2299,2299 3449,3449,3449 4598,4598,4598 5748,5748,5748 6898,6898,6898 8048,8048,8048 9197,9197,9197 10347,10347,10347 11497,11497,11497 12647,12647,12647 13796,13796,13796 14946,14946,14946 16096,16096,16096 17246,17246,17246 18395,18395,18395 19545,19545,19545 20695,20695,20695 21845,21845,21845 22994,22994,22994 24144,24144,24144 25294,25294,25294 26443,26443,26443 27593,27593,27593 28743,28743,28743 29893,29893,29893 31042,31042,31042 32192,32192,32192 33342,33342,33342 34492,34492,34492 35641,35641,35641 36791,36791,36791 37941,37941,37941 39091,39091,39091 40240,40240,40240 41390,41390,41390 42540,42540,42540 43690,43690,43690 44839,44839,44839 45989,45989,45989 47139,47139,47139 48288,48288,48288 49438,49438,49438 50588,50588,50588 51738,51738,51738 52887,52887,52887 54037,54037,54037 55187,55187,55187 56337,56337,56337 57486,57486,57486 58636,58636,58636 59786,59786,59786 60936,60936,60936 62085,62085,62085 63235,63235,63235 64385,64385,64385 65535,65535,65535 ########## g59.clr 0,0,0 1129,1129,1129 2259,2259,2259 3389,3389,3389 4519,4519,4519 5649,5649,5649 6779,6779,6779 7909,7909,7909 9039,9039,9039 10169,10169,10169 11299,11299,11299 12429,12429,12429 13558,13558,13558 14688,14688,14688 15818,15818,15818 16948,16948,16948 18078,18078,18078 19208,19208,19208 20338,20338,20338 21468,21468,21468 22598,22598,22598 23728,23728,23728 24858,24858,24858 25988,25988,25988 27117,27117,27117 28247,28247,28247 29377,29377,29377 30507,30507,30507 31637,31637,31637 32767,32767,32767 33897,33897,33897 35027,35027,35027 36157,36157,36157 37287,37287,37287 38417,38417,38417 39546,39546,39546 40676,40676,40676 41806,41806,41806 42936,42936,42936 44066,44066,44066 45196,45196,45196 46326,46326,46326 47456,47456,47456 48586,48586,48586 49716,49716,49716 50846,50846,50846 51976,51976,51976 53105,53105,53105 54235,54235,54235 55365,55365,55365 56495,56495,56495 57625,57625,57625 58755,58755,58755 59885,59885,59885 61015,61015,61015 62145,62145,62145 63275,63275,63275 64405,64405,64405 65535,65535,65535 ########## g6.clr 0,0,0 13107,13107,13107 26214,26214,26214 39321,39321,39321 52428,52428,52428 65535,65535,65535 ########## g60.clr 0,0,0 1110,1110,1110 2221,2221,2221 3332,3332,3332 4443,4443,4443 5553,5553,5553 6664,6664,6664 7775,7775,7775 8886,8886,8886 9996,9996,9996 11107,11107,11107 12218,12218,12218 13329,13329,13329 14439,14439,14439 15550,15550,15550 16661,16661,16661 17772,17772,17772 18882,18882,18882 19993,19993,19993 21104,21104,21104 22215,22215,22215 23326,23326,23326 24436,24436,24436 25547,25547,25547 26658,26658,26658 27769,27769,27769 28879,28879,28879 29990,29990,29990 31101,31101,31101 32212,32212,32212 33322,33322,33322 34433,34433,34433 35544,35544,35544 36655,36655,36655 37765,37765,37765 38876,38876,38876 39987,39987,39987 41098,41098,41098 42208,42208,42208 43319,43319,43319 44430,44430,44430 45541,45541,45541 46652,46652,46652 47762,47762,47762 48873,48873,48873 49984,49984,49984 51095,51095,51095 52205,52205,52205 53316,53316,53316 54427,54427,54427 55538,55538,55538 56648,56648,56648 57759,57759,57759 58870,58870,58870 59981,59981,59981 61091,61091,61091 62202,62202,62202 63313,63313,63313 64424,64424,64424 65535,65535,65535 ########## g61.clr 0,0,0 1092,1092,1092 2184,2184,2184 3276,3276,3276 4369,4369,4369 5461,5461,5461 6553,6553,6553 7645,7645,7645 8738,8738,8738 9830,9830,9830 10922,10922,10922 12014,12014,12014 13107,13107,13107 14199,14199,14199 15291,15291,15291 16383,16383,16383 17476,17476,17476 18568,18568,18568 19660,19660,19660 20752,20752,20752 21845,21845,21845 22937,22937,22937 24029,24029,24029 25121,25121,25121 26214,26214,26214 27306,27306,27306 28398,28398,28398 29490,29490,29490 30583,30583,30583 31675,31675,31675 32767,32767,32767 33859,33859,33859 34952,34952,34952 36044,36044,36044 37136,37136,37136 38228,38228,38228 39321,39321,39321 40413,40413,40413 41505,41505,41505 42597,42597,42597 43690,43690,43690 44782,44782,44782 45874,45874,45874 46966,46966,46966 48059,48059,48059 49151,49151,49151 50243,50243,50243 51335,51335,51335 52428,52428,52428 53520,53520,53520 54612,54612,54612 55704,55704,55704 56797,56797,56797 57889,57889,57889 58981,58981,58981 60073,60073,60073 61166,61166,61166 62258,62258,62258 63350,63350,63350 64442,64442,64442 65535,65535,65535 ########## g62.clr 0,0,0 1074,1074,1074 2148,2148,2148 3223,3223,3223 4297,4297,4297 5371,5371,5371 6446,6446,6446 7520,7520,7520 8594,8594,8594 9669,9669,9669 10743,10743,10743 11817,11817,11817 12892,12892,12892 13966,13966,13966 15040,15040,15040 16115,16115,16115 17189,17189,17189 18263,18263,18263 19338,19338,19338 20412,20412,20412 21486,21486,21486 22561,22561,22561 23635,23635,23635 24709,24709,24709 25784,25784,25784 26858,26858,26858 27932,27932,27932 29007,29007,29007 30081,30081,30081 31155,31155,31155 32230,32230,32230 33304,33304,33304 34379,34379,34379 35453,35453,35453 36527,36527,36527 37602,37602,37602 38676,38676,38676 39750,39750,39750 40825,40825,40825 41899,41899,41899 42973,42973,42973 44048,44048,44048 45122,45122,45122 46196,46196,46196 47271,47271,47271 48345,48345,48345 49419,49419,49419 50494,50494,50494 51568,51568,51568 52642,52642,52642 53717,53717,53717 54791,54791,54791 55865,55865,55865 56940,56940,56940 58014,58014,58014 59088,59088,59088 60163,60163,60163 61237,61237,61237 62311,62311,62311 63386,63386,63386 64460,64460,64460 65535,65535,65535 ########## g63.clr 0,0,0 1057,1057,1057 2114,2114,2114 3171,3171,3171 4228,4228,4228 5285,5285,5285 6342,6342,6342 7399,7399,7399 8456,8456,8456 9513,9513,9513 10570,10570,10570 11627,11627,11627 12684,12684,12684 13741,13741,13741 14798,14798,14798 15855,15855,15855 16912,16912,16912 17969,17969,17969 19026,19026,19026 20083,20083,20083 21140,21140,21140 22197,22197,22197 23254,23254,23254 24311,24311,24311 25368,25368,25368 26425,26425,26425 27482,27482,27482 28539,28539,28539 29596,29596,29596 30653,30653,30653 31710,31710,31710 32767,32767,32767 33824,33824,33824 34881,34881,34881 35938,35938,35938 36995,36995,36995 38052,38052,38052 39109,39109,39109 40166,40166,40166 41223,41223,41223 42280,42280,42280 43337,43337,43337 44394,44394,44394 45451,45451,45451 46508,46508,46508 47565,47565,47565 48622,48622,48622 49679,49679,49679 50736,50736,50736 51793,51793,51793 52850,52850,52850 53907,53907,53907 54964,54964,54964 56021,56021,56021 57078,57078,57078 58135,58135,58135 59192,59192,59192 60249,60249,60249 61306,61306,61306 62363,62363,62363 63420,63420,63420 64477,64477,64477 65535,65535,65535 ########## g64.clr 0,0,0 1040,1040,1040 2080,2080,2080 3120,3120,3120 4160,4160,4160 5201,5201,5201 6241,6241,6241 7281,7281,7281 8321,8321,8321 9362,9362,9362 10402,10402,10402 11442,11442,11442 12482,12482,12482 13523,13523,13523 14563,14563,14563 15603,15603,15603 16643,16643,16643 17684,17684,17684 18724,18724,18724 19764,19764,19764 20804,20804,20804 21845,21845,21845 22885,22885,22885 23925,23925,23925 24965,24965,24965 26005,26005,26005 27046,27046,27046 28086,28086,28086 29126,29126,29126 30166,30166,30166 31207,31207,31207 32247,32247,32247 33287,33287,33287 34327,34327,34327 35368,35368,35368 36408,36408,36408 37448,37448,37448 38488,38488,38488 39529,39529,39529 40569,40569,40569 41609,41609,41609 42649,42649,42649 43690,43690,43690 44730,44730,44730 45770,45770,45770 46810,46810,46810 47850,47850,47850 48891,48891,48891 49931,49931,49931 50971,50971,50971 52011,52011,52011 53052,53052,53052 54092,54092,54092 55132,55132,55132 56172,56172,56172 57213,57213,57213 58253,58253,58253 59293,59293,59293 60333,60333,60333 61374,61374,61374 62414,62414,62414 63454,63454,63454 64494,64494,64494 65535,65535,65535 ########## g65.clr 0,0,0 1023,1023,1023 2047,2047,2047 3071,3071,3071 4095,4095,4095 5119,5119,5119 6143,6143,6143 7167,7167,7167 8191,8191,8191 9215,9215,9215 10239,10239,10239 11263,11263,11263 12287,12287,12287 13311,13311,13311 14335,14335,14335 15359,15359,15359 16383,16383,16383 17407,17407,17407 18431,18431,18431 19455,19455,19455 20479,20479,20479 21503,21503,21503 22527,22527,22527 23551,23551,23551 24575,24575,24575 25599,25599,25599 26623,26623,26623 27647,27647,27647 28671,28671,28671 29695,29695,29695 30719,30719,30719 31743,31743,31743 32767,32767,32767 33791,33791,33791 34815,34815,34815 35839,35839,35839 36863,36863,36863 37887,37887,37887 38911,38911,38911 39935,39935,39935 40959,40959,40959 41983,41983,41983 43007,43007,43007 44031,44031,44031 45055,45055,45055 46079,46079,46079 47103,47103,47103 48127,48127,48127 49151,49151,49151 50175,50175,50175 51199,51199,51199 52223,52223,52223 53247,53247,53247 54271,54271,54271 55295,55295,55295 56319,56319,56319 57343,57343,57343 58367,58367,58367 59391,59391,59391 60415,60415,60415 61439,61439,61439 62463,62463,62463 63487,63487,63487 64511,64511,64511 65535,65535,65535 ########## g66.clr 0,0,0 1008,1008,1008 2016,2016,2016 3024,3024,3024 4032,4032,4032 5041,5041,5041 6049,6049,6049 7057,7057,7057 8065,8065,8065 9074,9074,9074 10082,10082,10082 11090,11090,11090 12098,12098,12098 13107,13107,13107 14115,14115,14115 15123,15123,15123 16131,16131,16131 17139,17139,17139 18148,18148,18148 19156,19156,19156 20164,20164,20164 21172,21172,21172 22181,22181,22181 23189,23189,23189 24197,24197,24197 25205,25205,25205 26214,26214,26214 27222,27222,27222 28230,28230,28230 29238,29238,29238 30246,30246,30246 31255,31255,31255 32263,32263,32263 33271,33271,33271 34279,34279,34279 35288,35288,35288 36296,36296,36296 37304,37304,37304 38312,38312,38312 39321,39321,39321 40329,40329,40329 41337,41337,41337 42345,42345,42345 43353,43353,43353 44362,44362,44362 45370,45370,45370 46378,46378,46378 47386,47386,47386 48395,48395,48395 49403,49403,49403 50411,50411,50411 51419,51419,51419 52428,52428,52428 53436,53436,53436 54444,54444,54444 55452,55452,55452 56460,56460,56460 57469,57469,57469 58477,58477,58477 59485,59485,59485 60493,60493,60493 61502,61502,61502 62510,62510,62510 63518,63518,63518 64526,64526,64526 65535,65535,65535 ########## g67.clr 0,0,0 992,992,992 1985,1985,1985 2978,2978,2978 3971,3971,3971 4964,4964,4964 5957,5957,5957 6950,6950,6950 7943,7943,7943 8936,8936,8936 9929,9929,9929 10922,10922,10922 11915,11915,11915 12908,12908,12908 13901,13901,13901 14894,14894,14894 15887,15887,15887 16880,16880,16880 17873,17873,17873 18866,18866,18866 19859,19859,19859 20852,20852,20852 21845,21845,21845 22837,22837,22837 23830,23830,23830 24823,24823,24823 25816,25816,25816 26809,26809,26809 27802,27802,27802 28795,28795,28795 29788,29788,29788 30781,30781,30781 31774,31774,31774 32767,32767,32767 33760,33760,33760 34753,34753,34753 35746,35746,35746 36739,36739,36739 37732,37732,37732 38725,38725,38725 39718,39718,39718 40711,40711,40711 41704,41704,41704 42697,42697,42697 43690,43690,43690 44682,44682,44682 45675,45675,45675 46668,46668,46668 47661,47661,47661 48654,48654,48654 49647,49647,49647 50640,50640,50640 51633,51633,51633 52626,52626,52626 53619,53619,53619 54612,54612,54612 55605,55605,55605 56598,56598,56598 57591,57591,57591 58584,58584,58584 59577,59577,59577 60570,60570,60570 61563,61563,61563 62556,62556,62556 63549,63549,63549 64542,64542,64542 65535,65535,65535 ########## g68.clr 0,0,0 978,978,978 1956,1956,1956 2934,2934,2934 3912,3912,3912 4890,4890,4890 5868,5868,5868 6846,6846,6846 7825,7825,7825 8803,8803,8803 9781,9781,9781 10759,10759,10759 11737,11737,11737 12715,12715,12715 13693,13693,13693 14672,14672,14672 15650,15650,15650 16628,16628,16628 17606,17606,17606 18584,18584,18584 19562,19562,19562 20540,20540,20540 21518,21518,21518 22497,22497,22497 23475,23475,23475 24453,24453,24453 25431,25431,25431 26409,26409,26409 27387,27387,27387 28365,28365,28365 29344,29344,29344 30322,30322,30322 31300,31300,31300 32278,32278,32278 33256,33256,33256 34234,34234,34234 35212,35212,35212 36190,36190,36190 37169,37169,37169 38147,38147,38147 39125,39125,39125 40103,40103,40103 41081,41081,41081 42059,42059,42059 43037,43037,43037 44016,44016,44016 44994,44994,44994 45972,45972,45972 46950,46950,46950 47928,47928,47928 48906,48906,48906 49884,49884,49884 50862,50862,50862 51841,51841,51841 52819,52819,52819 53797,53797,53797 54775,54775,54775 55753,55753,55753 56731,56731,56731 57709,57709,57709 58688,58688,58688 59666,59666,59666 60644,60644,60644 61622,61622,61622 62600,62600,62600 63578,63578,63578 64556,64556,64556 65535,65535,65535 ########## g69.clr 0,0,0 963,963,963 1927,1927,1927 2891,2891,2891 3855,3855,3855 4818,4818,4818 5782,5782,5782 6746,6746,6746 7710,7710,7710 8673,8673,8673 9637,9637,9637 10601,10601,10601 11565,11565,11565 12528,12528,12528 13492,13492,13492 14456,14456,14456 15420,15420,15420 16383,16383,16383 17347,17347,17347 18311,18311,18311 19275,19275,19275 20238,20238,20238 21202,21202,21202 22166,22166,22166 23130,23130,23130 24093,24093,24093 25057,25057,25057 26021,26021,26021 26985,26985,26985 27948,27948,27948 28912,28912,28912 29876,29876,29876 30840,30840,30840 31803,31803,31803 32767,32767,32767 33731,33731,33731 34695,34695,34695 35658,35658,35658 36622,36622,36622 37586,37586,37586 38550,38550,38550 39513,39513,39513 40477,40477,40477 41441,41441,41441 42405,42405,42405 43368,43368,43368 44332,44332,44332 45296,45296,45296 46260,46260,46260 47223,47223,47223 48187,48187,48187 49151,49151,49151 50115,50115,50115 51078,51078,51078 52042,52042,52042 53006,53006,53006 53970,53970,53970 54933,54933,54933 55897,55897,55897 56861,56861,56861 57825,57825,57825 58788,58788,58788 59752,59752,59752 60716,60716,60716 61680,61680,61680 62643,62643,62643 63607,63607,63607 64571,64571,64571 65535,65535,65535 ########## g7.clr 0,0,0 10922,10922,10922 21845,21845,21845 32767,32767,32767 43690,43690,43690 54612,54612,54612 65535,65535,65535 ########## g70.clr 0,0,0 949,949,949 1899,1899,1899 2849,2849,2849 3799,3799,3799 4748,4748,4748 5698,5698,5698 6648,6648,6648 7598,7598,7598 8548,8548,8548 9497,9497,9497 10447,10447,10447 11397,11397,11397 12347,12347,12347 13296,13296,13296 14246,14246,14246 15196,15196,15196 16146,16146,16146 17096,17096,17096 18045,18045,18045 18995,18995,18995 19945,19945,19945 20895,20895,20895 21845,21845,21845 22794,22794,22794 23744,23744,23744 24694,24694,24694 25644,25644,25644 26593,26593,26593 27543,27543,27543 28493,28493,28493 29443,29443,29443 30393,30393,30393 31342,31342,31342 32292,32292,32292 33242,33242,33242 34192,34192,34192 35141,35141,35141 36091,36091,36091 37041,37041,37041 37991,37991,37991 38941,38941,38941 39890,39890,39890 40840,40840,40840 41790,41790,41790 42740,42740,42740 43690,43690,43690 44639,44639,44639 45589,45589,45589 46539,46539,46539 47489,47489,47489 48438,48438,48438 49388,49388,49388 50338,50338,50338 51288,51288,51288 52238,52238,52238 53187,53187,53187 54137,54137,54137 55087,55087,55087 56037,56037,56037 56986,56986,56986 57936,57936,57936 58886,58886,58886 59836,59836,59836 60786,60786,60786 61735,61735,61735 62685,62685,62685 63635,63635,63635 64585,64585,64585 65535,65535,65535 ########## g71.clr 0,0,0 936,936,936 1872,1872,1872 2808,2808,2808 3744,3744,3744 4681,4681,4681 5617,5617,5617 6553,6553,6553 7489,7489,7489 8425,8425,8425 9362,9362,9362 10298,10298,10298 11234,11234,11234 12170,12170,12170 13107,13107,13107 14043,14043,14043 14979,14979,14979 15915,15915,15915 16851,16851,16851 17788,17788,17788 18724,18724,18724 19660,19660,19660 20596,20596,20596 21532,21532,21532 22469,22469,22469 23405,23405,23405 24341,24341,24341 25277,25277,25277 26214,26214,26214 27150,27150,27150 28086,28086,28086 29022,29022,29022 29958,29958,29958 30895,30895,30895 31831,31831,31831 32767,32767,32767 33703,33703,33703 34639,34639,34639 35576,35576,35576 36512,36512,36512 37448,37448,37448 38384,38384,38384 39321,39321,39321 40257,40257,40257 41193,41193,41193 42129,42129,42129 43065,43065,43065 44002,44002,44002 44938,44938,44938 45874,45874,45874 46810,46810,46810 47746,47746,47746 48683,48683,48683 49619,49619,49619 50555,50555,50555 51491,51491,51491 52428,52428,52428 53364,53364,53364 54300,54300,54300 55236,55236,55236 56172,56172,56172 57109,57109,57109 58045,58045,58045 58981,58981,58981 59917,59917,59917 60853,60853,60853 61790,61790,61790 62726,62726,62726 63662,63662,63662 64598,64598,64598 65535,65535,65535 ########## g72.clr 0,0,0 923,923,923 1846,1846,1846 2769,2769,2769 3692,3692,3692 4615,4615,4615 5538,5538,5538 6461,6461,6461 7384,7384,7384 8307,8307,8307 9230,9230,9230 10153,10153,10153 11076,11076,11076 11999,11999,11999 12922,12922,12922 13845,13845,13845 14768,14768,14768 15691,15691,15691 16614,16614,16614 17537,17537,17537 18460,18460,18460 19383,19383,19383 20306,20306,20306 21229,21229,21229 22152,22152,22152 23075,23075,23075 23998,23998,23998 24921,24921,24921 25844,25844,25844 26767,26767,26767 27690,27690,27690 28613,28613,28613 29536,29536,29536 30459,30459,30459 31382,31382,31382 32305,32305,32305 33229,33229,33229 34152,34152,34152 35075,35075,35075 35998,35998,35998 36921,36921,36921 37844,37844,37844 38767,38767,38767 39690,39690,39690 40613,40613,40613 41536,41536,41536 42459,42459,42459 43382,43382,43382 44305,44305,44305 45228,45228,45228 46151,46151,46151 47074,47074,47074 47997,47997,47997 48920,48920,48920 49843,49843,49843 50766,50766,50766 51689,51689,51689 52612,52612,52612 53535,53535,53535 54458,54458,54458 55381,55381,55381 56304,56304,56304 57227,57227,57227 58150,58150,58150 59073,59073,59073 59996,59996,59996 60919,60919,60919 61842,61842,61842 62765,62765,62765 63688,63688,63688 64611,64611,64611 65535,65535,65535 ########## g73.clr 0,0,0 910,910,910 1820,1820,1820 2730,2730,2730 3640,3640,3640 4551,4551,4551 5461,5461,5461 6371,6371,6371 7281,7281,7281 8191,8191,8191 9102,9102,9102 10012,10012,10012 10922,10922,10922 11832,11832,11832 12742,12742,12742 13653,13653,13653 14563,14563,14563 15473,15473,15473 16383,16383,16383 17293,17293,17293 18204,18204,18204 19114,19114,19114 20024,20024,20024 20934,20934,20934 21845,21845,21845 22755,22755,22755 23665,23665,23665 24575,24575,24575 25485,25485,25485 26396,26396,26396 27306,27306,27306 28216,28216,28216 29126,29126,29126 30036,30036,30036 30947,30947,30947 31857,31857,31857 32767,32767,32767 33677,33677,33677 34587,34587,34587 35498,35498,35498 36408,36408,36408 37318,37318,37318 38228,38228,38228 39138,39138,39138 40049,40049,40049 40959,40959,40959 41869,41869,41869 42779,42779,42779 43690,43690,43690 44600,44600,44600 45510,45510,45510 46420,46420,46420 47330,47330,47330 48241,48241,48241 49151,49151,49151 50061,50061,50061 50971,50971,50971 51881,51881,51881 52792,52792,52792 53702,53702,53702 54612,54612,54612 55522,55522,55522 56432,56432,56432 57343,57343,57343 58253,58253,58253 59163,59163,59163 60073,60073,60073 60983,60983,60983 61894,61894,61894 62804,62804,62804 63714,63714,63714 64624,64624,64624 65534,65534,65534 ########## g74.clr 0,0,0 897,897,897 1795,1795,1795 2693,2693,2693 3590,3590,3590 4488,4488,4488 5386,5386,5386 6284,6284,6284 7181,7181,7181 8079,8079,8079 8977,8977,8977 9875,9875,9875 10772,10772,10772 11670,11670,11670 12568,12568,12568 13466,13466,13466 14363,14363,14363 15261,15261,15261 16159,16159,16159 17057,17057,17057 17954,17954,17954 18852,18852,18852 19750,19750,19750 20648,20648,20648 21545,21545,21545 22443,22443,22443 23341,23341,23341 24238,24238,24238 25136,25136,25136 26034,26034,26034 26932,26932,26932 27829,27829,27829 28727,28727,28727 29625,29625,29625 30523,30523,30523 31420,31420,31420 32318,32318,32318 33216,33216,33216 34114,34114,34114 35011,35011,35011 35909,35909,35909 36807,36807,36807 37705,37705,37705 38602,38602,38602 39500,39500,39500 40398,40398,40398 41296,41296,41296 42193,42193,42193 43091,43091,43091 43989,43989,43989 44886,44886,44886 45784,45784,45784 46682,46682,46682 47580,47580,47580 48477,48477,48477 49375,49375,49375 50273,50273,50273 51171,51171,51171 52068,52068,52068 52966,52966,52966 53864,53864,53864 54762,54762,54762 55659,55659,55659 56557,56557,56557 57455,57455,57455 58353,58353,58353 59250,59250,59250 60148,60148,60148 61046,61046,61046 61944,61944,61944 62841,62841,62841 63739,63739,63739 64637,64637,64637 65534,65534,65534 ########## g75.clr 0,0,0 885,885,885 1771,1771,1771 2656,2656,2656 3542,3542,3542 4428,4428,4428 5313,5313,5313 6199,6199,6199 7084,7084,7084 7970,7970,7970 8856,8856,8856 9741,9741,9741 10627,10627,10627 11512,11512,11512 12398,12398,12398 13284,13284,13284 14169,14169,14169 15055,15055,15055 15940,15940,15940 16826,16826,16826 17712,17712,17712 18597,18597,18597 19483,19483,19483 20368,20368,20368 21254,21254,21254 22140,22140,22140 23025,23025,23025 23911,23911,23911 24797,24797,24797 25682,25682,25682 26568,26568,26568 27453,27453,27453 28339,28339,28339 29225,29225,29225 30110,30110,30110 30996,30996,30996 31881,31881,31881 32767,32767,32767 33653,33653,33653 34538,34538,34538 35424,35424,35424 36309,36309,36309 37195,37195,37195 38081,38081,38081 38966,38966,38966 39852,39852,39852 40737,40737,40737 41623,41623,41623 42509,42509,42509 43394,43394,43394 44280,44280,44280 45166,45166,45166 46051,46051,46051 46937,46937,46937 47822,47822,47822 48708,48708,48708 49594,49594,49594 50479,50479,50479 51365,51365,51365 52250,52250,52250 53136,53136,53136 54022,54022,54022 54907,54907,54907 55793,55793,55793 56678,56678,56678 57564,57564,57564 58450,58450,58450 59335,59335,59335 60221,60221,60221 61106,61106,61106 61992,61992,61992 62878,62878,62878 63763,63763,63763 64649,64649,64649 65535,65535,65535 ########## g76.clr 0,0,0 873,873,873 1747,1747,1747 2621,2621,2621 3495,3495,3495 4369,4369,4369 5242,5242,5242 6116,6116,6116 6990,6990,6990 7864,7864,7864 8738,8738,8738 9611,9611,9611 10485,10485,10485 11359,11359,11359 12233,12233,12233 13107,13107,13107 13980,13980,13980 14854,14854,14854 15728,15728,15728 16602,16602,16602 17476,17476,17476 18349,18349,18349 19223,19223,19223 20097,20097,20097 20971,20971,20971 21845,21845,21845 22718,22718,22718 23592,23592,23592 24466,24466,24466 25340,25340,25340 26214,26214,26214 27087,27087,27087 27961,27961,27961 28835,28835,28835 29709,29709,29709 30583,30583,30583 31456,31456,31456 32330,32330,32330 33204,33204,33204 34078,34078,34078 34952,34952,34952 35825,35825,35825 36699,36699,36699 37573,37573,37573 38447,38447,38447 39321,39321,39321 40194,40194,40194 41068,41068,41068 41942,41942,41942 42816,42816,42816 43690,43690,43690 44563,44563,44563 45437,45437,45437 46311,46311,46311 47185,47185,47185 48059,48059,48059 48932,48932,48932 49806,49806,49806 50680,50680,50680 51554,51554,51554 52428,52428,52428 53301,53301,53301 54175,54175,54175 55049,55049,55049 55923,55923,55923 56797,56797,56797 57670,57670,57670 58544,58544,58544 59418,59418,59418 60292,60292,60292 61166,61166,61166 62039,62039,62039 62913,62913,62913 63787,63787,63787 64661,64661,64661 65535,65535,65535 ########## g77.clr 0,0,0 862,862,862 1724,1724,1724 2586,2586,2586 3449,3449,3449 4311,4311,4311 5173,5173,5173 6036,6036,6036 6898,6898,6898 7760,7760,7760 8623,8623,8623 9485,9485,9485 10347,10347,10347 11209,11209,11209 12072,12072,12072 12934,12934,12934 13796,13796,13796 14659,14659,14659 15521,15521,15521 16383,16383,16383 17246,17246,17246 18108,18108,18108 18970,18970,18970 19832,19832,19832 20695,20695,20695 21557,21557,21557 22419,22419,22419 23282,23282,23282 24144,24144,24144 25006,25006,25006 25869,25869,25869 26731,26731,26731 27593,27593,27593 28455,28455,28455 29318,29318,29318 30180,30180,30180 31042,31042,31042 31905,31905,31905 32767,32767,32767 33629,33629,33629 34492,34492,34492 35354,35354,35354 36216,36216,36216 37079,37079,37079 37941,37941,37941 38803,38803,38803 39665,39665,39665 40528,40528,40528 41390,41390,41390 42252,42252,42252 43115,43115,43115 43977,43977,43977 44839,44839,44839 45702,45702,45702 46564,46564,46564 47426,47426,47426 48288,48288,48288 49151,49151,49151 50013,50013,50013 50875,50875,50875 51738,51738,51738 52600,52600,52600 53462,53462,53462 54325,54325,54325 55187,55187,55187 56049,56049,56049 56911,56911,56911 57774,57774,57774 58636,58636,58636 59498,59498,59498 60361,60361,60361 61223,61223,61223 62085,62085,62085 62948,62948,62948 63810,63810,63810 64672,64672,64672 65534,65534,65534 ########## g78.clr 0,0,0 851,851,851 1702,1702,1702 2553,2553,2553 3404,3404,3404 4255,4255,4255 5106,5106,5106 5957,5957,5957 6808,6808,6808 7659,7659,7659 8511,8511,8511 9362,9362,9362 10213,10213,10213 11064,11064,11064 11915,11915,11915 12766,12766,12766 13617,13617,13617 14468,14468,14468 15319,15319,15319 16170,16170,16170 17022,17022,17022 17873,17873,17873 18724,18724,18724 19575,19575,19575 20426,20426,20426 21277,21277,21277 22128,22128,22128 22979,22979,22979 23830,23830,23830 24682,24682,24682 25533,25533,25533 26384,26384,26384 27235,27235,27235 28086,28086,28086 28937,28937,28937 29788,29788,29788 30639,30639,30639 31490,31490,31490 32341,32341,32341 33193,33193,33193 34044,34044,34044 34895,34895,34895 35746,35746,35746 36597,36597,36597 37448,37448,37448 38299,38299,38299 39150,39150,39150 40001,40001,40001 40852,40852,40852 41704,41704,41704 42555,42555,42555 43406,43406,43406 44257,44257,44257 45108,45108,45108 45959,45959,45959 46810,46810,46810 47661,47661,47661 48512,48512,48512 49364,49364,49364 50215,50215,50215 51066,51066,51066 51917,51917,51917 52768,52768,52768 53619,53619,53619 54470,54470,54470 55321,55321,55321 56172,56172,56172 57023,57023,57023 57875,57875,57875 58726,58726,58726 59577,59577,59577 60428,60428,60428 61279,61279,61279 62130,62130,62130 62981,62981,62981 63832,63832,63832 64683,64683,64683 65535,65535,65535 ########## g79.clr 0,0,0 840,840,840 1680,1680,1680 2520,2520,2520 3360,3360,3360 4200,4200,4200 5041,5041,5041 5881,5881,5881 6721,6721,6721 7561,7561,7561 8401,8401,8401 9242,9242,9242 10082,10082,10082 10922,10922,10922 11762,11762,11762 12602,12602,12602 13443,13443,13443 14283,14283,14283 15123,15123,15123 15963,15963,15963 16803,16803,16803 17644,17644,17644 18484,18484,18484 19324,19324,19324 20164,20164,20164 21004,21004,21004 21845,21845,21845 22685,22685,22685 23525,23525,23525 24365,24365,24365 25205,25205,25205 26045,26045,26045 26886,26886,26886 27726,27726,27726 28566,28566,28566 29406,29406,29406 30246,30246,30246 31087,31087,31087 31927,31927,31927 32767,32767,32767 33607,33607,33607 34447,34447,34447 35288,35288,35288 36128,36128,36128 36968,36968,36968 37808,37808,37808 38648,38648,38648 39489,39489,39489 40329,40329,40329 41169,41169,41169 42009,42009,42009 42849,42849,42849 43690,43690,43690 44530,44530,44530 45370,45370,45370 46210,46210,46210 47050,47050,47050 47890,47890,47890 48731,48731,48731 49571,49571,49571 50411,50411,50411 51251,51251,51251 52091,52091,52091 52932,52932,52932 53772,53772,53772 54612,54612,54612 55452,55452,55452 56292,56292,56292 57133,57133,57133 57973,57973,57973 58813,58813,58813 59653,59653,59653 60493,60493,60493 61334,61334,61334 62174,62174,62174 63014,63014,63014 63854,63854,63854 64694,64694,64694 65534,65534,65534 ########## g8.clr 0,0,0 9362,9362,9362 18724,18724,18724 28086,28086,28086 37448,37448,37448 46810,46810,46810 56172,56172,56172 65535,65535,65535 ########## g80.clr 0,0,0 829,829,829 1659,1659,1659 2488,2488,2488 3318,3318,3318 4147,4147,4147 4977,4977,4977 5806,5806,5806 6636,6636,6636 7466,7466,7466 8295,8295,8295 9125,9125,9125 9954,9954,9954 10784,10784,10784 11613,11613,11613 12443,12443,12443 13272,13272,13272 14102,14102,14102 14932,14932,14932 15761,15761,15761 16591,16591,16591 17420,17420,17420 18250,18250,18250 19079,19079,19079 19909,19909,19909 20738,20738,20738 21568,21568,21568 22398,22398,22398 23227,23227,23227 24057,24057,24057 24886,24886,24886 25716,25716,25716 26545,26545,26545 27375,27375,27375 28204,28204,28204 29034,29034,29034 29864,29864,29864 30693,30693,30693 31523,31523,31523 32352,32352,32352 33182,33182,33182 34011,34011,34011 34841,34841,34841 35670,35670,35670 36500,36500,36500 37330,37330,37330 38159,38159,38159 38989,38989,38989 39818,39818,39818 40648,40648,40648 41477,41477,41477 42307,42307,42307 43136,43136,43136 43966,43966,43966 44796,44796,44796 45625,45625,45625 46455,46455,46455 47284,47284,47284 48114,48114,48114 48943,48943,48943 49773,49773,49773 50602,50602,50602 51432,51432,51432 52262,52262,52262 53091,53091,53091 53921,53921,53921 54750,54750,54750 55580,55580,55580 56409,56409,56409 57239,57239,57239 58068,58068,58068 58898,58898,58898 59728,59728,59728 60557,60557,60557 61387,61387,61387 62216,62216,62216 63046,63046,63046 63875,63875,63875 64705,64705,64705 65535,65535,65535 ########## g81.clr 0,0,0 819,819,819 1638,1638,1638 2457,2457,2457 3276,3276,3276 4095,4095,4095 4915,4915,4915 5734,5734,5734 6553,6553,6553 7372,7372,7372 8191,8191,8191 9011,9011,9011 9830,9830,9830 10649,10649,10649 11468,11468,11468 12287,12287,12287 13107,13107,13107 13926,13926,13926 14745,14745,14745 15564,15564,15564 16383,16383,16383 17202,17202,17202 18022,18022,18022 18841,18841,18841 19660,19660,19660 20479,20479,20479 21298,21298,21298 22118,22118,22118 22937,22937,22937 23756,23756,23756 24575,24575,24575 25394,25394,25394 26214,26214,26214 27033,27033,27033 27852,27852,27852 28671,28671,28671 29490,29490,29490 30309,30309,30309 31129,31129,31129 31948,31948,31948 32767,32767,32767 33586,33586,33586 34405,34405,34405 35225,35225,35225 36044,36044,36044 36863,36863,36863 37682,37682,37682 38501,38501,38501 39321,39321,39321 40140,40140,40140 40959,40959,40959 41778,41778,41778 42597,42597,42597 43416,43416,43416 44236,44236,44236 45055,45055,45055 45874,45874,45874 46693,46693,46693 47512,47512,47512 48332,48332,48332 49151,49151,49151 49970,49970,49970 50789,50789,50789 51608,51608,51608 52428,52428,52428 53247,53247,53247 54066,54066,54066 54885,54885,54885 55704,55704,55704 56523,56523,56523 57343,57343,57343 58162,58162,58162 58981,58981,58981 59800,59800,59800 60619,60619,60619 61439,61439,61439 62258,62258,62258 63077,63077,63077 63896,63896,63896 64715,64715,64715 65535,65535,65535 ########## g82.clr 0,0,0 809,809,809 1618,1618,1618 2427,2427,2427 3236,3236,3236 4045,4045,4045 4854,4854,4854 5663,5663,5663 6472,6472,6472 7281,7281,7281 8090,8090,8090 8899,8899,8899 9708,9708,9708 10517,10517,10517 11327,11327,11327 12136,12136,12136 12945,12945,12945 13754,13754,13754 14563,14563,14563 15372,15372,15372 16181,16181,16181 16990,16990,16990 17799,17799,17799 18608,18608,18608 19417,19417,19417 20226,20226,20226 21035,21035,21035 21845,21845,21845 22654,22654,22654 23463,23463,23463 24272,24272,24272 25081,25081,25081 25890,25890,25890 26699,26699,26699 27508,27508,27508 28317,28317,28317 29126,29126,29126 29935,29935,29935 30744,30744,30744 31553,31553,31553 32362,32362,32362 33172,33172,33172 33981,33981,33981 34790,34790,34790 35599,35599,35599 36408,36408,36408 37217,37217,37217 38026,38026,38026 38835,38835,38835 39644,39644,39644 40453,40453,40453 41262,41262,41262 42071,42071,42071 42880,42880,42880 43690,43690,43690 44499,44499,44499 45308,45308,45308 46117,46117,46117 46926,46926,46926 47735,47735,47735 48544,48544,48544 49353,49353,49353 50162,50162,50162 50971,50971,50971 51780,51780,51780 52589,52589,52589 53398,53398,53398 54207,54207,54207 55017,55017,55017 55826,55826,55826 56635,56635,56635 57444,57444,57444 58253,58253,58253 59062,59062,59062 59871,59871,59871 60680,60680,60680 61489,61489,61489 62298,62298,62298 63107,63107,63107 63916,63916,63916 64725,64725,64725 65534,65534,65534 ########## g83.clr 0,0,0 799,799,799 1598,1598,1598 2397,2397,2397 3196,3196,3196 3996,3996,3996 4795,4795,4795 5594,5594,5594 6393,6393,6393 7192,7192,7192 7992,7992,7992 8791,8791,8791 9590,9590,9590 10389,10389,10389 11188,11188,11188 11988,11988,11988 12787,12787,12787 13586,13586,13586 14385,14385,14385 15184,15184,15184 15984,15984,15984 16783,16783,16783 17582,17582,17582 18381,18381,18381 19180,19180,19180 19980,19980,19980 20779,20779,20779 21578,21578,21578 22377,22377,22377 23177,23177,23177 23976,23976,23976 24775,24775,24775 25574,25574,25574 26373,26373,26373 27173,27173,27173 27972,27972,27972 28771,28771,28771 29570,29570,29570 30369,30369,30369 31169,31169,31169 31968,31968,31968 32767,32767,32767 33566,33566,33566 34365,34365,34365 35165,35165,35165 35964,35964,35964 36763,36763,36763 37562,37562,37562 38361,38361,38361 39161,39161,39161 39960,39960,39960 40759,40759,40759 41558,41558,41558 42357,42357,42357 43157,43157,43157 43956,43956,43956 44755,44755,44755 45554,45554,45554 46354,46354,46354 47153,47153,47153 47952,47952,47952 48751,48751,48751 49550,49550,49550 50350,50350,50350 51149,51149,51149 51948,51948,51948 52747,52747,52747 53546,53546,53546 54346,54346,54346 55145,55145,55145 55944,55944,55944 56743,56743,56743 57542,57542,57542 58342,58342,58342 59141,59141,59141 59940,59940,59940 60739,60739,60739 61538,61538,61538 62338,62338,62338 63137,63137,63137 63936,63936,63936 64735,64735,64735 65535,65535,65535 ########## g84.clr 0,0,0 789,789,789 1579,1579,1579 2368,2368,2368 3158,3158,3158 3947,3947,3947 4737,4737,4737 5527,5527,5527 6316,6316,6316 7106,7106,7106 7895,7895,7895 8685,8685,8685 9474,9474,9474 10264,10264,10264 11054,11054,11054 11843,11843,11843 12633,12633,12633 13422,13422,13422 14212,14212,14212 15001,15001,15001 15791,15791,15791 16581,16581,16581 17370,17370,17370 18160,18160,18160 18949,18949,18949 19739,19739,19739 20529,20529,20529 21318,21318,21318 22108,22108,22108 22897,22897,22897 23687,23687,23687 24476,24476,24476 25266,25266,25266 26056,26056,26056 26845,26845,26845 27635,27635,27635 28424,28424,28424 29214,29214,29214 30003,30003,30003 30793,30793,30793 31583,31583,31583 32372,32372,32372 33162,33162,33162 33951,33951,33951 34741,34741,34741 35531,35531,35531 36320,36320,36320 37110,37110,37110 37899,37899,37899 38689,38689,38689 39478,39478,39478 40268,40268,40268 41058,41058,41058 41847,41847,41847 42637,42637,42637 43426,43426,43426 44216,44216,44216 45005,45005,45005 45795,45795,45795 46585,46585,46585 47374,47374,47374 48164,48164,48164 48953,48953,48953 49743,49743,49743 50533,50533,50533 51322,51322,51322 52112,52112,52112 52901,52901,52901 53691,53691,53691 54480,54480,54480 55270,55270,55270 56060,56060,56060 56849,56849,56849 57639,57639,57639 58428,58428,58428 59218,59218,59218 60007,60007,60007 60797,60797,60797 61587,61587,61587 62376,62376,62376 63166,63166,63166 63955,63955,63955 64745,64745,64745 65535,65535,65535 ########## g85.clr 0,0,0 780,780,780 1560,1560,1560 2340,2340,2340 3120,3120,3120 3900,3900,3900 4681,4681,4681 5461,5461,5461 6241,6241,6241 7021,7021,7021 7801,7801,7801 8581,8581,8581 9362,9362,9362 10142,10142,10142 10922,10922,10922 11702,11702,11702 12482,12482,12482 13263,13263,13263 14043,14043,14043 14823,14823,14823 15603,15603,15603 16383,16383,16383 17163,17163,17163 17944,17944,17944 18724,18724,18724 19504,19504,19504 20284,20284,20284 21064,21064,21064 21844,21844,21844 22625,22625,22625 23405,23405,23405 24185,24185,24185 24965,24965,24965 25745,25745,25745 26526,26526,26526 27306,27306,27306 28086,28086,28086 28866,28866,28866 29646,29646,29646 30426,30426,30426 31207,31207,31207 31987,31987,31987 32767,32767,32767 33547,33547,33547 34327,34327,34327 35108,35108,35108 35888,35888,35888 36668,36668,36668 37448,37448,37448 38228,38228,38228 39008,39008,39008 39789,39789,39789 40569,40569,40569 41349,41349,41349 42129,42129,42129 42909,42909,42909 43689,43689,43689 44470,44470,44470 45250,45250,45250 46030,46030,46030 46810,46810,46810 47590,47590,47590 48371,48371,48371 49151,49151,49151 49931,49931,49931 50711,50711,50711 51491,51491,51491 52271,52271,52271 53052,53052,53052 53832,53832,53832 54612,54612,54612 55392,55392,55392 56172,56172,56172 56953,56953,56953 57733,57733,57733 58513,58513,58513 59293,59293,59293 60073,60073,60073 60853,60853,60853 61634,61634,61634 62414,62414,62414 63194,63194,63194 63974,63974,63974 64754,64754,64754 65534,65534,65534 ########## g86.clr 0,0,0 771,771,771 1542,1542,1542 2313,2313,2313 3084,3084,3084 3855,3855,3855 4626,4626,4626 5397,5397,5397 6168,6168,6168 6939,6939,6939 7710,7710,7710 8481,8481,8481 9252,9252,9252 10023,10023,10023 10794,10794,10794 11565,11565,11565 12336,12336,12336 13107,13107,13107 13878,13878,13878 14649,14649,14649 15420,15420,15420 16191,16191,16191 16962,16962,16962 17733,17733,17733 18504,18504,18504 19275,19275,19275 20046,20046,20046 20817,20817,20817 21588,21588,21588 22359,22359,22359 23130,23130,23130 23901,23901,23901 24672,24672,24672 25443,25443,25443 26214,26214,26214 26985,26985,26985 27756,27756,27756 28527,28527,28527 29298,29298,29298 30069,30069,30069 30840,30840,30840 31611,31611,31611 32382,32382,32382 33153,33153,33153 33924,33924,33924 34695,34695,34695 35466,35466,35466 36237,36237,36237 37008,37008,37008 37779,37779,37779 38550,38550,38550 39321,39321,39321 40092,40092,40092 40863,40863,40863 41634,41634,41634 42405,42405,42405 43176,43176,43176 43947,43947,43947 44718,44718,44718 45489,45489,45489 46260,46260,46260 47031,47031,47031 47802,47802,47802 48573,48573,48573 49344,49344,49344 50115,50115,50115 50886,50886,50886 51657,51657,51657 52428,52428,52428 53199,53199,53199 53970,53970,53970 54741,54741,54741 55512,55512,55512 56283,56283,56283 57054,57054,57054 57825,57825,57825 58596,58596,58596 59367,59367,59367 60138,60138,60138 60909,60909,60909 61680,61680,61680 62451,62451,62451 63222,63222,63222 63993,63993,63993 64764,64764,64764 65535,65535,65535 ########## g87.clr 0,0,0 762,762,762 1524,1524,1524 2286,2286,2286 3048,3048,3048 3810,3810,3810 4572,4572,4572 5334,5334,5334 6096,6096,6096 6858,6858,6858 7620,7620,7620 8382,8382,8382 9144,9144,9144 9906,9906,9906 10668,10668,10668 11430,11430,11430 12192,12192,12192 12954,12954,12954 13716,13716,13716 14478,14478,14478 15240,15240,15240 16002,16002,16002 16764,16764,16764 17526,17526,17526 18288,18288,18288 19050,19050,19050 19812,19812,19812 20574,20574,20574 21336,21336,21336 22099,22099,22099 22861,22861,22861 23623,23623,23623 24385,24385,24385 25147,25147,25147 25909,25909,25909 26671,26671,26671 27433,27433,27433 28195,28195,28195 28957,28957,28957 29719,29719,29719 30481,30481,30481 31243,31243,31243 32005,32005,32005 32767,32767,32767 33529,33529,33529 34291,34291,34291 35053,35053,35053 35815,35815,35815 36577,36577,36577 37339,37339,37339 38101,38101,38101 38863,38863,38863 39625,39625,39625 40387,40387,40387 41149,41149,41149 41911,41911,41911 42673,42673,42673 43435,43435,43435 44198,44198,44198 44960,44960,44960 45722,45722,45722 46484,46484,46484 47246,47246,47246 48008,48008,48008 48770,48770,48770 49532,49532,49532 50294,50294,50294 51056,51056,51056 51818,51818,51818 52580,52580,52580 53342,53342,53342 54104,54104,54104 54866,54866,54866 55628,55628,55628 56390,56390,56390 57152,57152,57152 57914,57914,57914 58676,58676,58676 59438,59438,59438 60200,60200,60200 60962,60962,60962 61724,61724,61724 62486,62486,62486 63248,63248,63248 64010,64010,64010 64772,64772,64772 65535,65535,65535 ########## g88.clr 0,0,0 753,753,753 1506,1506,1506 2259,2259,2259 3013,3013,3013 3766,3766,3766 4519,4519,4519 5272,5272,5272 6026,6026,6026 6779,6779,6779 7532,7532,7532 8286,8286,8286 9039,9039,9039 9792,9792,9792 10545,10545,10545 11299,11299,11299 12052,12052,12052 12805,12805,12805 13558,13558,13558 14312,14312,14312 15065,15065,15065 15818,15818,15818 16572,16572,16572 17325,17325,17325 18078,18078,18078 18831,18831,18831 19585,19585,19585 20338,20338,20338 21091,21091,21091 21845,21845,21845 22598,22598,22598 23351,23351,23351 24104,24104,24104 24858,24858,24858 25611,25611,25611 26364,26364,26364 27117,27117,27117 27871,27871,27871 28624,28624,28624 29377,29377,29377 30131,30131,30131 30884,30884,30884 31637,31637,31637 32390,32390,32390 33144,33144,33144 33897,33897,33897 34650,34650,34650 35403,35403,35403 36157,36157,36157 36910,36910,36910 37663,37663,37663 38417,38417,38417 39170,39170,39170 39923,39923,39923 40676,40676,40676 41430,41430,41430 42183,42183,42183 42936,42936,42936 43690,43690,43690 44443,44443,44443 45196,45196,45196 45949,45949,45949 46703,46703,46703 47456,47456,47456 48209,48209,48209 48962,48962,48962 49716,49716,49716 50469,50469,50469 51222,51222,51222 51976,51976,51976 52729,52729,52729 53482,53482,53482 54235,54235,54235 54989,54989,54989 55742,55742,55742 56495,56495,56495 57248,57248,57248 58002,58002,58002 58755,58755,58755 59508,59508,59508 60262,60262,60262 61015,61015,61015 61768,61768,61768 62521,62521,62521 63275,63275,63275 64028,64028,64028 64781,64781,64781 65534,65534,65534 ########## g89.clr 0,0,0 744,744,744 1489,1489,1489 2234,2234,2234 2978,2978,2978 3723,3723,3723 4468,4468,4468 5213,5213,5213 5957,5957,5957 6702,6702,6702 7447,7447,7447 8191,8191,8191 8936,8936,8936 9681,9681,9681 10426,10426,10426 11170,11170,11170 11915,11915,11915 12660,12660,12660 13404,13404,13404 14149,14149,14149 14894,14894,14894 15639,15639,15639 16383,16383,16383 17128,17128,17128 17873,17873,17873 18617,18617,18617 19362,19362,19362 20107,20107,20107 20852,20852,20852 21596,21596,21596 22341,22341,22341 23086,23086,23086 23830,23830,23830 24575,24575,24575 25320,25320,25320 26065,26065,26065 26809,26809,26809 27554,27554,27554 28299,28299,28299 29043,29043,29043 29788,29788,29788 30533,30533,30533 31278,31278,31278 32022,32022,32022 32767,32767,32767 33512,33512,33512 34256,34256,34256 35001,35001,35001 35746,35746,35746 36491,36491,36491 37235,37235,37235 37980,37980,37980 38725,38725,38725 39469,39469,39469 40214,40214,40214 40959,40959,40959 41704,41704,41704 42448,42448,42448 43193,43193,43193 43938,43938,43938 44682,44682,44682 45427,45427,45427 46172,46172,46172 46917,46917,46917 47661,47661,47661 48406,48406,48406 49151,49151,49151 49895,49895,49895 50640,50640,50640 51385,51385,51385 52130,52130,52130 52874,52874,52874 53619,53619,53619 54364,54364,54364 55108,55108,55108 55853,55853,55853 56598,56598,56598 57343,57343,57343 58087,58087,58087 58832,58832,58832 59577,59577,59577 60321,60321,60321 61066,61066,61066 61811,61811,61811 62556,62556,62556 63300,63300,63300 64045,64045,64045 64790,64790,64790 65535,65535,65535 ########## g9.clr 0,0,0 8191,8191,8191 16383,16383,16383 24575,24575,24575 32767,32767,32767 40959,40959,40959 49151,49151,49151 57343,57343,57343 65535,65535,65535 ########## g90.clr 0,0,0 736,736,736 1472,1472,1472 2209,2209,2209 2945,2945,2945 3681,3681,3681 4418,4418,4418 5154,5154,5154 5890,5890,5890 6627,6627,6627 7363,7363,7363 8099,8099,8099 8836,8836,8836 9572,9572,9572 10308,10308,10308 11045,11045,11045 11781,11781,11781 12517,12517,12517 13254,13254,13254 13990,13990,13990 14726,14726,14726 15463,15463,15463 16199,16199,16199 16936,16936,16936 17672,17672,17672 18408,18408,18408 19145,19145,19145 19881,19881,19881 20617,20617,20617 21354,21354,21354 22090,22090,22090 22826,22826,22826 23563,23563,23563 24299,24299,24299 25035,25035,25035 25772,25772,25772 26508,26508,26508 27244,27244,27244 27981,27981,27981 28717,28717,28717 29453,29453,29453 30190,30190,30190 30926,30926,30926 31662,31662,31662 32399,32399,32399 33135,33135,33135 33872,33872,33872 34608,34608,34608 35344,35344,35344 36081,36081,36081 36817,36817,36817 37553,37553,37553 38290,38290,38290 39026,39026,39026 39762,39762,39762 40499,40499,40499 41235,41235,41235 41971,41971,41971 42708,42708,42708 43444,43444,43444 44180,44180,44180 44917,44917,44917 45653,45653,45653 46389,46389,46389 47126,47126,47126 47862,47862,47862 48598,48598,48598 49335,49335,49335 50071,50071,50071 50808,50808,50808 51544,51544,51544 52280,52280,52280 53017,53017,53017 53753,53753,53753 54489,54489,54489 55226,55226,55226 55962,55962,55962 56698,56698,56698 57435,57435,57435 58171,58171,58171 58907,58907,58907 59644,59644,59644 60380,60380,60380 61116,61116,61116 61853,61853,61853 62589,62589,62589 63325,63325,63325 64062,64062,64062 64798,64798,64798 65534,65534,65534 ########## g91.clr 0,0,0 728,728,728 1456,1456,1456 2184,2184,2184 2912,2912,2912 3640,3640,3640 4369,4369,4369 5097,5097,5097 5825,5825,5825 6553,6553,6553 7281,7281,7281 8009,8009,8009 8738,8738,8738 9466,9466,9466 10194,10194,10194 10922,10922,10922 11650,11650,11650 12378,12378,12378 13107,13107,13107 13835,13835,13835 14563,14563,14563 15291,15291,15291 16019,16019,16019 16747,16747,16747 17476,17476,17476 18204,18204,18204 18932,18932,18932 19660,19660,19660 20388,20388,20388 21116,21116,21116 21845,21845,21845 22573,22573,22573 23301,23301,23301 24029,24029,24029 24757,24757,24757 25485,25485,25485 26214,26214,26214 26942,26942,26942 27670,27670,27670 28398,28398,28398 29126,29126,29126 29854,29854,29854 30583,30583,30583 31311,31311,31311 32039,32039,32039 32767,32767,32767 33495,33495,33495 34223,34223,34223 34952,34952,34952 35680,35680,35680 36408,36408,36408 37136,37136,37136 37864,37864,37864 38592,38592,38592 39321,39321,39321 40049,40049,40049 40777,40777,40777 41505,41505,41505 42233,42233,42233 42961,42961,42961 43690,43690,43690 44418,44418,44418 45146,45146,45146 45874,45874,45874 46602,46602,46602 47330,47330,47330 48059,48059,48059 48787,48787,48787 49515,49515,49515 50243,50243,50243 50971,50971,50971 51699,51699,51699 52428,52428,52428 53156,53156,53156 53884,53884,53884 54612,54612,54612 55340,55340,55340 56068,56068,56068 56797,56797,56797 57525,57525,57525 58253,58253,58253 58981,58981,58981 59709,59709,59709 60437,60437,60437 61166,61166,61166 61894,61894,61894 62622,62622,62622 63350,63350,63350 64078,64078,64078 64806,64806,64806 65535,65535,65535 ########## g92.clr 0,0,0 720,720,720 1440,1440,1440 2160,2160,2160 2880,2880,2880 3600,3600,3600 4320,4320,4320 5041,5041,5041 5761,5761,5761 6481,6481,6481 7201,7201,7201 7921,7921,7921 8641,8641,8641 9362,9362,9362 10082,10082,10082 10802,10802,10802 11522,11522,11522 12242,12242,12242 12962,12962,12962 13683,13683,13683 14403,14403,14403 15123,15123,15123 15843,15843,15843 16563,16563,16563 17283,17283,17283 18004,18004,18004 18724,18724,18724 19444,19444,19444 20164,20164,20164 20884,20884,20884 21604,21604,21604 22325,22325,22325 23045,23045,23045 23765,23765,23765 24485,24485,24485 25205,25205,25205 25925,25925,25925 26646,26646,26646 27366,27366,27366 28086,28086,28086 28806,28806,28806 29526,29526,29526 30246,30246,30246 30967,30967,30967 31687,31687,31687 32407,32407,32407 33127,33127,33127 33847,33847,33847 34567,34567,34567 35288,35288,35288 36008,36008,36008 36728,36728,36728 37448,37448,37448 38168,38168,38168 38888,38888,38888 39609,39609,39609 40329,40329,40329 41049,41049,41049 41769,41769,41769 42489,42489,42489 43209,43209,43209 43930,43930,43930 44650,44650,44650 45370,45370,45370 46090,46090,46090 46810,46810,46810 47530,47530,47530 48251,48251,48251 48971,48971,48971 49691,49691,49691 50411,50411,50411 51131,51131,51131 51851,51851,51851 52572,52572,52572 53292,53292,53292 54012,54012,54012 54732,54732,54732 55452,55452,55452 56172,56172,56172 56893,56893,56893 57613,57613,57613 58333,58333,58333 59053,59053,59053 59773,59773,59773 60493,60493,60493 61214,61214,61214 61934,61934,61934 62654,62654,62654 63374,63374,63374 64094,64094,64094 64814,64814,64814 65535,65535,65535 ########## g93.clr 0,0,0 712,712,712 1424,1424,1424 2137,2137,2137 2849,2849,2849 3561,3561,3561 4274,4274,4274 4986,4986,4986 5698,5698,5698 6411,6411,6411 7123,7123,7123 7835,7835,7835 8548,8548,8548 9260,9260,9260 9972,9972,9972 10685,10685,10685 11397,11397,11397 12109,12109,12109 12822,12822,12822 13534,13534,13534 14246,14246,14246 14959,14959,14959 15671,15671,15671 16383,16383,16383 17096,17096,17096 17808,17808,17808 18520,18520,18520 19233,19233,19233 19945,19945,19945 20657,20657,20657 21370,21370,21370 22082,22082,22082 22794,22794,22794 23507,23507,23507 24219,24219,24219 24931,24931,24931 25644,25644,25644 26356,26356,26356 27068,27068,27068 27781,27781,27781 28493,28493,28493 29205,29205,29205 29918,29918,29918 30630,30630,30630 31342,31342,31342 32055,32055,32055 32767,32767,32767 33479,33479,33479 34192,34192,34192 34904,34904,34904 35616,35616,35616 36329,36329,36329 37041,37041,37041 37753,37753,37753 38466,38466,38466 39178,39178,39178 39890,39890,39890 40603,40603,40603 41315,41315,41315 42027,42027,42027 42740,42740,42740 43452,43452,43452 44164,44164,44164 44877,44877,44877 45589,45589,45589 46301,46301,46301 47014,47014,47014 47726,47726,47726 48438,48438,48438 49151,49151,49151 49863,49863,49863 50575,50575,50575 51288,51288,51288 52000,52000,52000 52712,52712,52712 53425,53425,53425 54137,54137,54137 54849,54849,54849 55562,55562,55562 56274,56274,56274 56986,56986,56986 57699,57699,57699 58411,58411,58411 59123,59123,59123 59836,59836,59836 60548,60548,60548 61260,61260,61260 61973,61973,61973 62685,62685,62685 63397,63397,63397 64110,64110,64110 64822,64822,64822 65535,65535,65535 ########## g94.clr 0,0,0 704,704,704 1409,1409,1409 2114,2114,2114 2818,2818,2818 3523,3523,3523 4228,4228,4228 4932,4932,4932 5637,5637,5637 6342,6342,6342 7046,7046,7046 7751,7751,7751 8456,8456,8456 9160,9160,9160 9865,9865,9865 10570,10570,10570 11274,11274,11274 11979,11979,11979 12684,12684,12684 13388,13388,13388 14093,14093,14093 14798,14798,14798 15502,15502,15502 16207,16207,16207 16912,16912,16912 17616,17616,17616 18321,18321,18321 19026,19026,19026 19730,19730,19730 20435,20435,20435 21140,21140,21140 21845,21845,21845 22549,22549,22549 23254,23254,23254 23959,23959,23959 24663,24663,24663 25368,25368,25368 26073,26073,26073 26777,26777,26777 27482,27482,27482 28187,28187,28187 28891,28891,28891 29596,29596,29596 30301,30301,30301 31005,31005,31005 31710,31710,31710 32415,32415,32415 33119,33119,33119 33824,33824,33824 34529,34529,34529 35233,35233,35233 35938,35938,35938 36643,36643,36643 37347,37347,37347 38052,38052,38052 38757,38757,38757 39461,39461,39461 40166,40166,40166 40871,40871,40871 41575,41575,41575 42280,42280,42280 42985,42985,42985 43690,43690,43690 44394,44394,44394 45099,45099,45099 45804,45804,45804 46508,46508,46508 47213,47213,47213 47918,47918,47918 48622,48622,48622 49327,49327,49327 50032,50032,50032 50736,50736,50736 51441,51441,51441 52146,52146,52146 52850,52850,52850 53555,53555,53555 54260,54260,54260 54964,54964,54964 55669,55669,55669 56374,56374,56374 57078,57078,57078 57783,57783,57783 58488,58488,58488 59192,59192,59192 59897,59897,59897 60602,60602,60602 61306,61306,61306 62011,62011,62011 62716,62716,62716 63420,63420,63420 64125,64125,64125 64830,64830,64830 65535,65535,65535 ########## g95.clr 0,0,0 697,697,697 1394,1394,1394 2091,2091,2091 2788,2788,2788 3485,3485,3485 4183,4183,4183 4880,4880,4880 5577,5577,5577 6274,6274,6274 6971,6971,6971 7668,7668,7668 8366,8366,8366 9063,9063,9063 9760,9760,9760 10457,10457,10457 11154,11154,11154 11852,11852,11852 12549,12549,12549 13246,13246,13246 13943,13943,13943 14640,14640,14640 15337,15337,15337 16035,16035,16035 16732,16732,16732 17429,17429,17429 18126,18126,18126 18823,18823,18823 19521,19521,19521 20218,20218,20218 20915,20915,20915 21612,21612,21612 22309,22309,22309 23006,23006,23006 23704,23704,23704 24401,24401,24401 25098,25098,25098 25795,25795,25795 26492,26492,26492 27190,27190,27190 27887,27887,27887 28584,28584,28584 29281,29281,29281 29978,29978,29978 30675,30675,30675 31373,31373,31373 32070,32070,32070 32767,32767,32767 33464,33464,33464 34161,34161,34161 34859,34859,34859 35556,35556,35556 36253,36253,36253 36950,36950,36950 37647,37647,37647 38344,38344,38344 39042,39042,39042 39739,39739,39739 40436,40436,40436 41133,41133,41133 41830,41830,41830 42528,42528,42528 43225,43225,43225 43922,43922,43922 44619,44619,44619 45316,45316,45316 46013,46013,46013 46711,46711,46711 47408,47408,47408 48105,48105,48105 48802,48802,48802 49499,49499,49499 50197,50197,50197 50894,50894,50894 51591,51591,51591 52288,52288,52288 52985,52985,52985 53682,53682,53682 54380,54380,54380 55077,55077,55077 55774,55774,55774 56471,56471,56471 57168,57168,57168 57866,57866,57866 58563,58563,58563 59260,59260,59260 59957,59957,59957 60654,60654,60654 61351,61351,61351 62049,62049,62049 62746,62746,62746 63443,63443,63443 64140,64140,64140 64837,64837,64837 65535,65535,65535 ########## g96.clr 0,0,0 689,689,689 1379,1379,1379 2069,2069,2069 2759,2759,2759 3449,3449,3449 4139,4139,4139 4828,4828,4828 5518,5518,5518 6208,6208,6208 6898,6898,6898 7588,7588,7588 8278,8278,8278 8967,8967,8967 9657,9657,9657 10347,10347,10347 11037,11037,11037 11727,11727,11727 12417,12417,12417 13107,13107,13107 13796,13796,13796 14486,14486,14486 15176,15176,15176 15866,15866,15866 16556,16556,16556 17246,17246,17246 17935,17935,17935 18625,18625,18625 19315,19315,19315 20005,20005,20005 20695,20695,20695 21385,21385,21385 22074,22074,22074 22764,22764,22764 23454,23454,23454 24144,24144,24144 24834,24834,24834 25524,25524,25524 26214,26214,26214 26903,26903,26903 27593,27593,27593 28283,28283,28283 28973,28973,28973 29663,29663,29663 30353,30353,30353 31042,31042,31042 31732,31732,31732 32422,32422,32422 33112,33112,33112 33802,33802,33802 34492,34492,34492 35181,35181,35181 35871,35871,35871 36561,36561,36561 37251,37251,37251 37941,37941,37941 38631,38631,38631 39321,39321,39321 40010,40010,40010 40700,40700,40700 41390,41390,41390 42080,42080,42080 42770,42770,42770 43460,43460,43460 44149,44149,44149 44839,44839,44839 45529,45529,45529 46219,46219,46219 46909,46909,46909 47599,47599,47599 48288,48288,48288 48978,48978,48978 49668,49668,49668 50358,50358,50358 51048,51048,51048 51738,51738,51738 52428,52428,52428 53117,53117,53117 53807,53807,53807 54497,54497,54497 55187,55187,55187 55877,55877,55877 56567,56567,56567 57256,57256,57256 57946,57946,57946 58636,58636,58636 59326,59326,59326 60016,60016,60016 60706,60706,60706 61395,61395,61395 62085,62085,62085 62775,62775,62775 63465,63465,63465 64155,64155,64155 64845,64845,64845 65535,65535,65535 ########## g97.clr 0,0,0 682,682,682 1365,1365,1365 2047,2047,2047 2730,2730,2730 3413,3413,3413 4095,4095,4095 4778,4778,4778 5461,5461,5461 6143,6143,6143 6826,6826,6826 7509,7509,7509 8191,8191,8191 8874,8874,8874 9557,9557,9557 10239,10239,10239 10922,10922,10922 11605,11605,11605 12287,12287,12287 12970,12970,12970 13653,13653,13653 14335,14335,14335 15018,15018,15018 15701,15701,15701 16383,16383,16383 17066,17066,17066 17749,17749,17749 18431,18431,18431 19114,19114,19114 19797,19797,19797 20479,20479,20479 21162,21162,21162 21845,21845,21845 22527,22527,22527 23210,23210,23210 23892,23892,23892 24575,24575,24575 25258,25258,25258 25940,25940,25940 26623,26623,26623 27306,27306,27306 27988,27988,27988 28671,28671,28671 29354,29354,29354 30036,30036,30036 30719,30719,30719 31402,31402,31402 32084,32084,32084 32767,32767,32767 33450,33450,33450 34132,34132,34132 34815,34815,34815 35498,35498,35498 36180,36180,36180 36863,36863,36863 37546,37546,37546 38228,38228,38228 38911,38911,38911 39594,39594,39594 40276,40276,40276 40959,40959,40959 41642,41642,41642 42324,42324,42324 43007,43007,43007 43690,43690,43690 44372,44372,44372 45055,45055,45055 45737,45737,45737 46420,46420,46420 47103,47103,47103 47785,47785,47785 48468,48468,48468 49151,49151,49151 49833,49833,49833 50516,50516,50516 51199,51199,51199 51881,51881,51881 52564,52564,52564 53247,53247,53247 53929,53929,53929 54612,54612,54612 55295,55295,55295 55977,55977,55977 56660,56660,56660 57343,57343,57343 58025,58025,58025 58708,58708,58708 59391,59391,59391 60073,60073,60073 60756,60756,60756 61439,61439,61439 62121,62121,62121 62804,62804,62804 63487,63487,63487 64169,64169,64169 64852,64852,64852 65535,65535,65535 ########## g98.clr 0,0,0 675,675,675 1351,1351,1351 2026,2026,2026 2702,2702,2702 3378,3378,3378 4053,4053,4053 4729,4729,4729 5404,5404,5404 6080,6080,6080 6756,6756,6756 7431,7431,7431 8107,8107,8107 8783,8783,8783 9458,9458,9458 10134,10134,10134 10809,10809,10809 11485,11485,11485 12161,12161,12161 12836,12836,12836 13512,13512,13512 14187,14187,14187 14863,14863,14863 15539,15539,15539 16214,16214,16214 16890,16890,16890 17566,17566,17566 18241,18241,18241 18917,18917,18917 19592,19592,19592 20268,20268,20268 20944,20944,20944 21619,21619,21619 22295,22295,22295 22971,22971,22971 23646,23646,23646 24322,24322,24322 24997,24997,24997 25673,25673,25673 26349,26349,26349 27024,27024,27024 27700,27700,27700 28375,28375,28375 29051,29051,29051 29727,29727,29727 30402,30402,30402 31078,31078,31078 31754,31754,31754 32429,32429,32429 33105,33105,33105 33780,33780,33780 34456,34456,34456 35132,35132,35132 35807,35807,35807 36483,36483,36483 37159,37159,37159 37834,37834,37834 38510,38510,38510 39185,39185,39185 39861,39861,39861 40537,40537,40537 41212,41212,41212 41888,41888,41888 42563,42563,42563 43239,43239,43239 43915,43915,43915 44590,44590,44590 45266,45266,45266 45942,45942,45942 46617,46617,46617 47293,47293,47293 47968,47968,47968 48644,48644,48644 49320,49320,49320 49995,49995,49995 50671,50671,50671 51347,51347,51347 52022,52022,52022 52698,52698,52698 53373,53373,53373 54049,54049,54049 54725,54725,54725 55400,55400,55400 56076,56076,56076 56751,56751,56751 57427,57427,57427 58103,58103,58103 58778,58778,58778 59454,59454,59454 60130,60130,60130 60805,60805,60805 61481,61481,61481 62156,62156,62156 62832,62832,62832 63508,63508,63508 64183,64183,64183 64859,64859,64859 65535,65535,65535 ########## g99.clr 0,0,0 668,668,668 1337,1337,1337 2006,2006,2006 2674,2674,2674 3343,3343,3343 4012,4012,4012 4681,4681,4681 5349,5349,5349 6018,6018,6018 6687,6687,6687 7355,7355,7355 8024,8024,8024 8693,8693,8693 9362,9362,9362 10030,10030,10030 10699,10699,10699 11368,11368,11368 12037,12037,12037 12705,12705,12705 13374,13374,13374 14043,14043,14043 14711,14711,14711 15380,15380,15380 16049,16049,16049 16718,16718,16718 17386,17386,17386 18055,18055,18055 18724,18724,18724 19393,19393,19393 20061,20061,20061 20730,20730,20730 21399,21399,21399 22067,22067,22067 22736,22736,22736 23405,23405,23405 24074,24074,24074 24742,24742,24742 25411,25411,25411 26080,26080,26080 26748,26748,26748 27417,27417,27417 28086,28086,28086 28755,28755,28755 29423,29423,29423 30092,30092,30092 30761,30761,30761 31430,31430,31430 32098,32098,32098 32767,32767,32767 33436,33436,33436 34104,34104,34104 34773,34773,34773 35442,35442,35442 36111,36111,36111 36779,36779,36779 37448,37448,37448 38117,38117,38117 38786,38786,38786 39454,39454,39454 40123,40123,40123 40792,40792,40792 41460,41460,41460 42129,42129,42129 42798,42798,42798 43467,43467,43467 44135,44135,44135 44804,44804,44804 45473,45473,45473 46141,46141,46141 46810,46810,46810 47479,47479,47479 48148,48148,48148 48816,48816,48816 49485,49485,49485 50154,50154,50154 50823,50823,50823 51491,51491,51491 52160,52160,52160 52829,52829,52829 53497,53497,53497 54166,54166,54166 54835,54835,54835 55504,55504,55504 56172,56172,56172 56841,56841,56841 57510,57510,57510 58179,58179,58179 58847,58847,58847 59516,59516,59516 60185,60185,60185 60853,60853,60853 61522,61522,61522 62191,62191,62191 62860,62860,62860 63528,63528,63528 64197,64197,64197 64866,64866,64866 65534,65534,65534 icon-9.4.3/ipl/gdata/brennan.gif0000664000175000017500000005217207140713052015767 0ustar chrishchrishGIF87a[[[222,(*Uz h,jBv44 ^\$(EepDԴrJS CZmVqdE# 0>.fJ2Pw0)mg*f(N%V]Z5[uo?hJ%lSqas6`6)HLQOB_J܁dBqb3(TSȏ(cQh U6Amnxꂇ;Ą(>ԡ'1حc0Ӯ!ZR!N.dF"$7 XE0 .BINz20 =+JZjh"N ns0XJ :E'JS,#0Il8R¶ k@gV%Vᆗ$=g H\bt03&Gdž5j-t}\ӴLB'MőC']KT2]}e3ʓ% <ՙ1x0'’L*2M4JZ"yW3 $|֬)Nm@XsƎrz e.YyQ5=T!Yel|PP|!87WZ/ҋJn׹&}(/d0GnS575O)iVlT'dxaױ:Ny/TkBBMQv%3Ko"|0vIJN9Vu+ =Xц@n)ıybUiآg):R*uz7׿NE!KZon&l)z [E$q&ќL@ \|Q p(s:^1":D7zdn0:A m8'W 7ORFړ$ȋUF_*vzyAjJ$.թU['hF5=WYL}YEGYLOQ<6Pȝp_'i{y8-m 8l=E#j]`[/hԺk핟ZSHnp'8'5`dc W@]z8;JKĒ峭\u6Ukǔ5G·mr7|r&U%ΎY,wd,B]5sy<ۖ  m+삖8IiRa1~cV^/}Z}*PZ@c!afF/oK2oV &D_>9[Cd4$n9h}ʋô`}*gV\bRյNW%](Ag~Vj8'{7JfY@qB@v`maGy!kBpuL!JSS#RFieLu4x9p1k71oejv1R0#_Fymrd1Vs3z4Uh%3_}h#LAUYWv9jWC4hr%(%6$sWp%c}{ ?*uNTG8p(i$3r F2ES2aF&x:~+e %4:D]2G_sWxVUX1kW7h~ہ@>xTEd:r]SՖ80 &9I ݠ\UX>r8F.&u'hpD|ji[4Lz# 91Ews䦅2WrƤY< 5II(BrosZ'\_sHwxp:vV IS-TJ7I=f'dd A#':pDIgxcZXŔ)EeyKH!RGmzb*: 55upg_by%Pd:Y$$.Itd"c(?}aBOj,!b+u!+ (P: A0HFt"sF6t=@ySK'zpPɫdhD^)\8!ЄV{TV65=C((`jv0څb6v6QWjV])) (ASbӜ;yKpiV.n ^HUP"h*6u ^é0FIWp yqyTC²eG{AIydTlfp _jv5Yg&ukAX尣Gw>"zD*B]JJ|{D)£:כbȶXf1hdQ] yjGV`xmHD<ׄgֹ6G+% I{Y!̖ {E,nKW5.j2Jk(E8s ˳WJu>h%}̔hoWFߙ!w3o?;!kʼ7'ZI\ίU;?b+v:Ĝ6\촑@h''c 4YT;6RÑ;c'ۀ}l\{j!r䍉V܀#w˸W]IK "JO.{Sy2`mʱ=ȫ~" Ηl7Hig+ճvK{Y 3mࡌ իh]`j4E/fk@T8ɽй KQֶĮ}uWwrl̞4byFfx}7vڧh,2μ?黻@מ <^ JW*݁͛9ȞM߂}.#vqR㺯-N{&'BG.ojc?vB̮ZcA !ٗ@ jԌ\ 6l\(r>9B ~uL]t瓔[vqA׋>g(u>9ٯ_d[X V|-QZ)jY_+E}$:!W]\5Iͳ Zڮ &7>ZBdA|Y`zycg2Vn(%}]Ĉxg>r8:H sYNiNs.0{$^vHAW4SwdkIŚn,G~ʜI66"rnƛ>XB$p :F^_-(2(S?|^NA[*aFc6mKT'aݝxlłڡI$Oii ֘`}4v`vuUaⷄ/_|1ڊHkqQ sO\j%{Zf7o-{)V͜t5,L]22X%24uFڡwkxS2sj0vtWU8XYՑ&WJ0y:}L575fcr-Xōvkׄﹽ}n'QԖY_(nVxRs2;dyBx;ljNƬ7`ԛ P}Q Mcp `2?*^yT+9 uޱ1dD=L3kvLgm IS2!t%D鮷¾*gj_رh'0FU!fk&cUQFQ@BA1I((At ^'kz\>Q2eJl0E ɋ5"b#H,pDzNOs`!yfWOG2GF#W)ErC) )Arc$D$dgE_ǡE[2ޜqt Θ ҊiAFI>bRh:1=Y$B[.BӋa<@>t;V #͹Oց6Rѱ0vJD z =K %N=r)-IjP؟t`oYU¡8{( JyU%*cJ-ԛR,-GVzH`-(> xz&%$טX&9 *Κ6_PTgb+ )%pj]jZI&z "ԗƓ lwxx&O/6z&B7ȯ)OiôAes*ϖ a joo5?r@#*ZjQj@0,Atz7SȞwUj5JU K FHlp!gӪW3qۄ&֫t/{[ZXi*K':MivF++#ː U)Ki)2yR V3eNjz@T(^)/e2U}8)ci&T5(D_Շ U2o&?R);@d{4]=Zpr LF*2XԦi6M? N(_ԹuƥİTA(Q )^Ky 95Qwsf8=''Ka%*; Nvkyj2(-8p K`" P#̽hqcf<}G]]G|r+|zcrTGEY;:RJ8ltHg`y3osY̕˯?6 $'Nkm#kߢ#N/.'i)՝^!S74g#ͯ:ۻ-joxFo_ n"FbK<ob=|v!t?yr͗5B d~0K`Lg1ۥ""y!T24'+~Hj05l/&)gbC\}e#e2NbP loI rC2$|ā:h. 5\0!_lEV2`"v 8 +u(f2nb|p@$3__nnAVc Kk%{c*'$5] "\(~#R7pP P{s>?|TPr"YT*#,ܕXP"9 T~v&9PawDlChBDURvq+<3]nJuJڒDgE`\M(@g6g VsIVnH6$,Qg6 _Ԓd~ygH~c +K܊%7RuByLPɧ[fP ;SLXh=sO1xV"ĥbƩ(BóOhGFLȏ'>1mI;\\D.V: J~3 aF1RHU% +zss?r-adzcI+f-3DFQRSܵ_aͶO{ y|Fw}:\vkɴ@woDOb֣j1n^1/D*4f_?"wy+97itEZeyYc+I2G#eb Q+WƥrkX$4uH|jk҉Q!uj0<j_IՖKڴtBъ6{"cv!&B+7%2t*{񼧖(i`)7w14W[4lNYSR+,JQْeЃbBV2b9vyjz2:Fwvywt^<+b[(3tG չa0R;V e_#ZTjcTػ?O()~H<%LgFbz7cZ]Ewƙo~z;+Z0|qXo.M 1C JZDTDeDc-GHhkMdLK~BMt#Pzw(:> heC{}#LXze(Ćl4+YEׁiV%?xP|xVTBNƎFM;+M,#uo;v0?+s4l9>H-p' Nb @RL|h $.6mORHr#"87ejn+oz8,[SmژCHgak+6 I'%*,G r"|nZe{@!CFFH$K}~jPl~WU9e^_d\egQRu%BzlJÆ )/?PcDBEvO8khz]|<>^XhhOoRlSLl93)i(}J"^ ,.@'x NR{ Iͬ_.vDG;Ɇ̥_yxH"EP {fRyfLXqxeȭΦ<׼ѻe:t&)jGZlX\*Y! x~)8HEJ[h%T )w YǾ&Μ㩬"Ȃn kZ{n2f+cRiZϠe%ܗ ٺ2m\QI{䩐5'uaK/_tq5`IypۤHs̴Kq--eT 0WulQ3< pJ'Y $ = @hR1C99iCBl_-O&#QRґNf1pj0UPR$2s uWrv&i 1N][vG[xhzpdE ЀaV;nh֜o0cK$uč{\ Y7謨U(x f٠Vn%Wzn.ܝ.&..ԠݩBZk X+޲AE `i,Sv(Hk `FBq6f-.+xP0H`l*e$Icq;kёplQxzhzhZ6LF1 &|dh *s"g볮hXiR۲~j⹼x4*2fv/Ҏ*jH˴4˹:+%%ۋxB qM36< Wlډ噄&gWqAwDՈǭ}D&I Q^PĹeWy_VPYf[~|CA"I6c\Ƭ%׈ռ5]>;!r_8$ǹ[X6"A)@z*!}#rMr̃lHPl@a Ųms!z DW흏;tL` oFaK&j}`8<|<[47a~UjEOX`yu՘4DR r- b'n'=*.*TKE,O+"5jIE6O:o@hщBa 8E2Ȫ(A-"K5mJ!c,I`MUi$u)>fCWFj t AԹJt:Sq K,IXć6ňB E` RABY'W?H}䕘ɇ#SeL)ݨMgmnKFU5M0gyY# –O@۰v|gG_ H7 鉓I-K@?B,&Y4ϸмkT[u`V G,t`RKZ֘\5,"(" ╒,L-fP/_`0t]^e%? cv{JtO[^ajQ)_*H ]6B%Et1vd5Y|A4$$KѮǺ-6)W&f&OJՊΙX/#C Tө3$!OV?Мr)xgBZ8spT,u0KAL _Yt;f.)t ;\.jQF{VMSR(.o4&Mf528ĝsJSqU؍؍xƕՆF /KHc tSm72jpO]xr݈"56T ̧gܦ?L8KpisO'q-:{q`rH1dJtPV?hwcD#eMdj6*{f+vPJ,Ѧϩ{ABuG3i{/hri ߸I+&:sOsoZt&v1JF}f]HJ޷uF&q^\B4ʬ1j?]~<`M AOC:Kdk,8F ɸ8Tmqk(n5E~=H~xQ̝]s \pJsSȔL|u7զ.h~T`űZ\sg2d:j4jNqQ*PD4U2>P73-g~}CtF5`#<(O H+HI[{Es7q`F?&c:¦JJgde+,:x&;ܐ<ͲO²DkHvHTސnҐnt|zjw GB1FEqBib'&UL3W.w E&G 1Q+˗^(LahjIdH <#Hx_^E<"7B;!+&DE6`4S! (QK"%4d6D>( 29jwmX:O\~ ag14yVczc'{Y(Dyxue|}9ZFwBwKaĕB)sodMwx$;iDPE#B8^drp6bH$u:(W%%$5x8- oq.bqDP 8 eTC67#H'nܡKi(x%5 ĒRe53PNiJz|<19hkTFE  ,8DQoQ)tYW2a/p&QzV1a"Hd[a)iYk;T;KK@vI'%wkA1Xq*r NsUYb)>G82ÛQLStzDERCQc'XL{&7y1F%'궹IGvLp6g&4= ]xjzJ '@Fw/')%I\xGPU,x9Z]rRG2!$vSMɊD:*HzZgvfaJ'YO}b@qilR+s_@DqEeou?wHu.etgݑ{h6tOO t` ts5yǁ˶98FCiH?TK8c)UE& s4Χ7Un-9+ElR_Tl";ɐ$\]XH6ԺK)Q *ˆTmhb6Ə<.l(0$469͍EV=|\6:T?:Wz -O_y}(b R2-Lm"Lu A5ls'$Xؤ+`j"4,AiH1:•*dJ(re9r1]G7͇j,j7x= sJmTFZ ,IwjI&[.IԁL!|I եfof![a4I5lNV3apB܅~6Zxj\ * u[ΰ=7cp#pĶCiJK<9 []l% UMgtiŝ2JG'XiUaWv&kݥmW&ImuL5zHlCKodpX^J3GjKZ$32jctƗ:߭="߈=]K& ؉J|K$7 F6(EhSª>iW##zP5t*91~ _9^h& 5GX4\%  oC)2R13oH34 ; UZ~<Gk=8χ#|֎wɋqy(V{fgf3?|Y^դx6 U#nYhhq~60Ҵ3D]8Tj!6Y-FK߈omb-.ү/Oh d-r %*c:2{vg揰+ @ b~U^HփDGqRt%9 e.Uƽ,fluMcoL rɁ} ZAR $cєl<} Y} VڎR FH>&(PѭQlflG|ly{uv~ַڔ1׍ݬ!꒵ҝ<@*y"`ʦOAÿ9BI"+ޕmYsa/eJD,=]':Q6~wI[> '>hTQ o-Cq 7N%Z5!B6#{@b-(Z۶;}e\?LXVm21,׾: Sʜw[+rMK5wn . K#RM &0B,LZu3Ʈr@V!^ Қu1i$ę8\GFbϢGϿ9mfli)nj884bI$r䒕FLElVqcAπ 1|D@O&]4;VPM$M=׋p7gKtFD+.m3o&F!{ QS>Q4RA%!e9*\s'B xGTe(H#Jex#3qM r`gg"}}"h{bl-$UC]\iWΈP@vMcRJOgE9hO"m~h*Ok_LG(L!jgbk3gDs'[^ XVn)>bxaFV'5,I/#\+а0h/hTC0D۱ROcZӂf6tg69| #ј=~XF:`|"Xk g&}ըԛ g,MDOLЂb9KaR r(zK S Q"n=^"7rH}Qa`2C#a'lKjBgiJ t8H%Ck9.)r_$y-L*Ҡ K"yiAI"F@0:Q%'a@ew|7>Fl|Vɺc2&v=c𬙝Jx #-um]/lyUjh//Y4RVWyy'AO}ʫ]ʽXf65{,IxV_jS w'j [v 88bQ%D/Ǝ$W_FRVAg+ل0V.8VhSSJ8,$s8GptpCXv.Ȇ2?}LG<3zdD{_b=BIE%j@DegRwȃjSL]Biuq[tȗ%Y% bvQi]l[d |Jtv+@'}ya1x 5ҙpIN&`gYl)f++2PVB$_3B"/M3<0"l"vMĘ` Z#jP#TxWF,cʹ 蹒:3!8w_4"JW!M!1QWgJՆ3%jw oI;OvK/J6Tu-zIu2$ynuI3P"pQ b+ӐyF::uxUwkE"FX. X՝"w[nETKHAa"UJXT4(EQZUT)X4!&d$/ !o7 8T}Gmba}aV/m9bїH$ iPpv:\p)*SKT rjPsU=GG'EVo0~x҆SqSrpfIb2 J,Q c9 KlVw< I R#ྥ ɫ13e}։ZӀ&!kxR")ysq$zmA,H7JW ‰:UA em@hnr4,]1vW/ƨ[n{`N'zG uyu>Ddµ@=YWL RlnsN1DȋmN8|Ǔμ_gS@߂Y<?ҔHU׽p=[v=$wZo>_Xbb-2;=8Xj^7.C0e"їfxj tѣ(NqNJ"*CS(!PJ¹b=+a[앺^ޣ+f#RiAyjo(9s0Ib$Z&Nt,We3^}+0]f%"Fgdy€y]TcF4}Nu7CT g%mNw֭^z20L eQ^PXĹC{]YuXHC+dvGi_G^GM(6ZCquT-'rœg&W{ x`f2&UXTBO(b69F㋩lMdX?8\UeP~呑>j S!ۙUa$׈mw5Z4^tAʉ䔚>cnڣky'm.UƎi:ړ%DKv9_(i9^>*,YWMiI'ozMz2lA"dd吷Gነ""WL;jfk" W۬l.da ]hcnzFtn qK[f#*v*t2lTb:y-ס*EkjiP n%:t&%W{z'0E)0uyױ}7[lhBm3Yr-o,-iv',Y,-kmmrm%'oK~DSeݓa^slۄ~8ֳo':uKa!m8>͘7lƕC$SNane^܍jnJ;Vk̊IkHCAbEc31s]ƃ(n-(>Llde+Gj-eASzſ!M-4X 2;^}52P}3.d}-qʆ9v8tɅsU=v@ AJ;&%1KL"D9`3ۤ3r+?NlɆjeB+F4."F+|fhiš'B.7{Q}u^ZsT,Nt[⌯4s|J,'_[iAـv֗qjyRY97MshX]]1K[Sؔrr+Wm{bjJØݐpK9Et덵*'XȮ&I׊w2訮0.LdfE@8| {0S{`^`IjAMfJ36.l/5<~Vlr[0xLɉB+ LP{aiVvnG,fޥfj]u_"Yi3DeSB}jYZZTE7R4~ǣi邗BO*3*9w$sb fvXmw{h֪glMjN:/jGU J[,=bLօ"NJg:N )k]n 8M}׽[Cl>ܝs_|ښ-xΙIRUnf~ !`;߽IA2h`2}`\ Vte3@ #8&j$w |56ZU ohpͶ@VJ0MvZyxtn9>|TNkg US,e\`">W~A'*1Z[C᛺!Pq} -;ڼ>#k[mPߟ.ǎǏY*ޗ/+m9:իkݜ~dnA7Yog Vvvhaz@czbf} c(Im&n'0fчR3='j7@eJ"R *XH_'a|^_6xV\ExhƇIxxZwv^}͐~v."CVl0=8)aFA{crAhCskׁwmwfTXsCdrGBz}YSwz0M7k;'s(uݧw;w|hI7qاxGV'~a!4^4w,ՃX'PY8EW,;3BG֋{mp^((tH)Gd6:Z8)i4-y1nR`Z)J >iCQ(sno\{iFcr3B* +ȊgyPPQ,TAhL陾xahx䠋㸙G2H'g6eVs ?LZ^(ai+\xzNHPW9XfyKbGB璙)6 z7 )}A؁4'q. k(8+J^(ifiz?_t"Z⸁9yF99ީ^4g}L'Lǹj* ݈]$pL>CP(ZzU% ay`%h ƙAzE2U6WkǧhyY6Ǥ'Wׁ'U@fzh0):i$/B؉%IghȆUZ|epY9^#d AJav0zpB"Wu3 (%AWg Y?~7U%Jkj gJjpBR%KRyY*ժS dc"nڅXC:ªJ&*fدJꪥ{׋pʃ)d*QlG"ٮ5HzGFЉjfYBdmh,ꁕLz: hs(p :\* kme8jhjL/ה}VɣoJ3+uOz%![yS7u˹Kr걒WjZ|DvC;ېyQaۗ`eɰj{Uo[_{f785sE;{}{{k:fJY,zXȼ&Z'02NИ]˰Sp+(:ض%Y/j=sh(T;ϚVv\xEʫt°Z;u۱ KKK˻9F <ɪI@芸`zFh4KwxR*N9¥i*l <)A^d*BQ0)z Y ubkuhٛVYJAfo&(iEj﹡p\)[ZŒ1F˺עG)aks9|ȵKʖ;X! )W0[b] ȓˇ$jǙƬpsr\& ,SEa<0Ző Z ;ȸ:jzfYAhQi̐PیsIyT<Ņg:AE+p(@;Mhm UڌL| S D񊐰 :9k`Aw|ʐ]W+W-WDLq=Ԑ\ߌVdݵ[|7V| ͪL1:֓pۿ,FlAŌkKoδ܉=;B  .lm5<ͪڥK=Jڒͣb{+y8z2rrBE[,)"{Vs{ `mK֮ͩ=__L_*@3QbiٞœI ]qYrktpHOMoZݦdm))Uh\SWݟ"ѼŌ?䮽RLx.@ /|c14Y YP%L댝Y[>?k_sm.zwטg:0b~ՋOֺ ߋ*>pz 02*$DHy@VJ(ZSbÐa61!q?0A$rl:?PXV4G&2:\FKժ|}őh}) 53'"} | <2icL\OJaheTnV^^Z=_ibk]k>nqxxz̒6' .$Ѐ64|!;*&Wۙ?\w y8QO;Hz3$"h7]h LP3 yLRznl'^vy y 1b&EZȍslFP Vml Դ$2ށϭ?wNfҭ+/{ "A.:pN[wx$Գ*VmFYGx#5LcE_ G1h/`YL$wٕjJ~u֢5^KQQVHtUtMzѥFMW =HX6 syфO,01lb@ՊOLGPĤ,.A0'lU5̃u1u 9^qHwLrVp[+NA:vO~a p2#mM F0ˆӈy1H9!G9҃mȡfXi~< Y>$).%\+_3a#DjuیvQ9O) .FFz#Fr%b!2<5!Xl)Y< $U4G>7dCÕ4ewI*q*iUJf{لD40Zsh~j 1QD^PIE>kKp6LM‡D]㔧9m' +1 S<jH.Rh k*@*Mnl_n7J~,E8%n㦀@N#Yv#uGs8 [%jF0\0Tdhnp4q=u7k%pKc%BNgd$+-6R?=6{>`9}BpdA Kh$#Wf3B&Hj%ݪb>4O޲(HίjHqAǝ\ޘKDXRK4M AاRA$g'h /v5M9[DF6d4Z8KI?~$ϕOL88jqDZ)3l O)i#fKy'40 7//?x6]ki|jͥ0$ ,f<^K̡j[jtR`@(xM*T&6j%o|ͫRKGN Gg͂G 8Ҏ5k w*'J_'];0$ӽ&ֶMlBM]l#ڭy]gsY*7Uj@,)!I +oGVԬ1>-Z~<(s+*_x-nkR.нknZ_5zQEⶊhd,an9ݮΏu*] Gs AޭD,3W|u_7X>p`@C:N:VPBri'X1|F4׿IhF'3)l8D+#х2c˹gRۀ Q10zK{9\wöU36l0+sWdzGnW_"zs|7O- 7EҨYfeaExLj_L([wnqSKc۹κ{W8Jfw|tHV2lu9t4 'rgSD @Z'r9ze}8zzv7k{dyvAGW]DxSp7PCgķxT6;#<Tmk*w0^ v%l'sWw~6so7gr&V{%2PY=xlYk)90+آa ߆[r @Wz&v(~wXv+'swoWfTHMMZdu+x7AK3XuDVGTHj%9Lfwyx}hׇrJXoEM%lq1hZuew5 bV)6,!e8*E[}tyȊz-}W~gtay0xCTxPutt&x*e5G" ̱qQ9ÌL?ov\GHY~8l'kV{KAN'ȎoA4[Zxbq!==qvŁ惬g0Bw@ؐ#goAt0˴.D l*(Z4'VR)>V64Gv%d(ZD؇Ys4rWyeTPO8ePes-ÇFFSg8P 8Z%M x!\yAj7$ט~(v{vf|p>f3!y|&S$$vPn9rgc3sWb]dPh61EKȹQMF;JilDZ'ORUH9ާsY~nQT`hZǎSI d+2e9b!HtkYxlِ-GMu- ɩA(x*"8PѓDؖj,Z؊;8y:@lEQ\.\'uyi2L/WA-ZvxwzjQ'P#|V]U-5!+9bNtOYiVڧ|ȍjw3t= Z&i[Ƨl (Q@ 2:~1is)a@ &m5MIC&lJH|3rS"FH(:ǛT ?pd&HsHZΩ-wPGKZDCꚘ ɍI-A08dڎҖ+#kR^alGOZ Z׀ڰJe93Q[] b(CN1@n5JZ[7 @ 6KYb)zt*xʣhCoZl27o˿9_tľG)P{I6C-^{`IVP,A>egcB :D>^k!܍(L9G5JMy$ɘ%/w&†ۮ,j(O pѦ!;ٽWL:N, 5~>뱫i`x(x2=@ Oɉǰ@M-"m: hb Z|gqy/#6=jZ%sz ~?:̬9ъ-j?건8 $I%Ƅ2,%WÓYxQОCًt!͔@+u8_ͮ x\وn@:|H'|.MmF=FSC$B, 8gV ܵ\jMKQxaMO}Ȇlxw|j-3`-10t[9i0=)qԭ#=|jk2OuS6͝-zh ^P0vГ{!ۖŻ.Hϲ9cė̄]s7ƭ8kR:9H (hAIL"1K|ӗ_r6]݇ ࡇ݀}rhjb5@ @YRcC>@R!W.)*=>:49)Bk&ْ|B~y2m,kb]d|vo[Q7rZH4!.*H!KᆗlW0\);0GҚsCpxyG.@]#ÂIٙZ.Vz>ؾ+]!$ +]K4&0pH$W hy.l|y7{@JZʔ_eZj|ţ60tA=hv\jʅ7so_gFWPgLxǧ|Kr-P&_ō VkT z6}@ ۻFaB/V#q{x'sbE0_Ss* } &Q;WNڵ%2W`Kطjbe9G7F=J/VI!|䰮(ƴ)S/Лxu8]{)ݑliNJSH߲hZ*16oh%.Źe̅Y4]7eҕRp8*O}RmEْ3*@a($.ΩTE29<)pNl-5!n=sfјpQU #`nu9#M;6jv%mrneUyD#WET}W_[\@d Rg֠%U{41%Nf~{u֣W?A鄰Eh;A_rU #Vg6FW0}6H-saFӇ$K!}lَp:`3ZjdwmHMJVZlՕ/+0cNtݝ0w-NLe'هDg8fﳽEGJD&w->3ͦƞmW\>4{V;(9d 4'e'Њ+iwIHbe\D%(]t >8I'sb,(J.B<ȕrnFoJ1h}H~;o&Su`gaxOW8.v,餸J֯yx}u{؛~!x GˢvM%m$oM\_!u/Ye_k۶mK$mFu6u|682q)0’nozX~qaE(v4!S~u|K!"PB7IG"iro&o[`|H?)4T1scDE}ng]HV^ Em/ V TvB7og=.(YBsjX4{nx(Iq31'_ @vi5шq`a0&/! @Td7Xt 7 +;%d9!MeW\S7-@psd1Sk8X\T!fTW!6;?&!&h;_(DTvcs8\ Wr#~ ZdW2 5oDoHPJҳ42"4C'j?J#e%Xifo,H_A-WW#}hxju=֔Z+p~= B] Ȣ}HgE!XU?L@KuwT|7RGA 4_EB_”Y>xxqH~q0iQeI}y°}p2RI~ 2m 9I4xOy 2l>ז240('$dv'`jqcdy ,X5-M)ɞ?wszWD)OgLl3#pjmVPUM#;l+Q)?v>P%;;BwIS~YI cVٗyWoWzgDF D ؖ|"4&}{֘K6>k}uF=II);>pG]=qb):JCp8jkx>i4Ou(VGZͧDG:?k)&Jid>)::9w=d5F]BUP3AE"s>eq~eę,d?u<|QA \1Ob#Gq\%22yr WP~*` t=Z>%UJ`WmzhzQ@8X[}T"A1*;Dxk4)3 r2j:|6j+ K\9b^WreJ/[kM%6+&Y+Tǧ.RjNˈZ^i k:y[:q^p;:s4@Z@6i z'(/2#Il<6FC{›y7""<egʺu%!/EvZJX WYPS*3vFsDuLOuZWħr~ZMoWx(pI|e  (gP% ƻg7G MGAReay@h\@j\| D{۹,Uk<=iZ{A[ 9;O,)+Gt5QIV*HMnn(klY xubm| ؟%C-,ӸC8r,ɼ'g(3D\K7mz#ZZ8mt~'d>2]eaJLV6'fXfd(TwtΤhU0 tǙ8c™ns3mfA /D_8WLH1$Ƭew*xiQKvdH5}ӂfwk9ox[̑mCCѝetb>l9]ulOB([>}6V-/SvLՒGnt;Sgo'`tF֝"H07`g($}OT:'sNX`z47t&܀VhNfL%?/z2v4sCtr>0.3+&68bpQZO'DQEPNL]_6YTZ`b8:gjh;M&)/1wu)ˊ{1ي =ؗ{$?oU"!MHCXK |߬*au03oEJGYd6Q!J(qԶ-QdJU ;) ڧHTČo_-7OPXK$:l4X3|Ηg^rt֤z@?f{7o"մ Yĉqpy~*7ZaIVi h.mD-^d&yh# D0` ;]*7Io9FB>XMEج'U0C2}!3 Q+[-#*=кҺ /gբR>4YBS-AɳsJC4!\EncI.@PW4Q%oG3vy"/էk.bĂE ܲP"dPşG0'syOyєp-{'ly4bW(tJ|$l&IAOPfS۩8rhDB v6 [1zkB0.`) 7zN1r#̚WC|ʮ9EUyT&Y`PcM92NqZ,*>du([\)*NWy(&)>ka7Pb-Ⱥ/ d9{!tuBH(ot+F;\cOq=s~tΰ& ZAKidz,x6Rg 7PvVj8Ka%Ү+vʡ+O_LVviBLr[H*ˆP99"Cu(iJLU-Q- #JDKG|AnnE`DϭM0BgԞ`n t*@0E YBʇn풉!4&KG*LFU[QNY1DDLDǛk v6;ߔ;fA4@cKg}g&. (V/s U ,*贞r@IRF̛-dWGV9e,; :`a mOtc*QUqD7| p](+CU06:Y[NOv Jl_7<,PUiy޴=|NBs}DĎr9۽byٞ~3?ȣ& S5 8q.fRKLK<[㞹,-=Ҳ8'n-";:ٯJlK፹Ѯs/k~k؆V]kH7&B_\OF."ҒIP2C-yO!ynE9m_"3ɢY\tY_fw sŽ!HLkT ukB1$gua{,$WteR1b"0YoEw#6{k%5FVrpGK,RZ#a—G5Ň2j)y@fQysE^nZx͔0F&SN4z5pOF7GGU A~7?Snvsf//gpM,Ggu#<]d<)nXtS)~G~[{ӄ?O"YSFct ,$=8h$`/f|i&m3g+NP;d;6;!3!4- WM>}H(M^ɥKK4=>gfs((y) c92%еXIL#It-f0fKr3,q%#]\#:qP `r'G/srF|HŒeHQ$ qcC]?UGN8TD@W<~1gDaR\=|uj́x5a-8IS`b4JА1 k FfCEh -f&sE=avP|zy-8mM6}QhRnHpPAII1IOWS82 gi$98yₐ$^FD]6$[9?H"lF'EJ1MBP Oy|١'&kTnsbіp$6huRo4"c~gFR /)Wڞym0Xg(*1'wsJ'첤✲@jVp/b 4nJ2A~%(/icF$tɥ:' F6Uz4iUiYTX AJ VYP(#=u \}@_: MR) Z)A}u7I&˦Xa s5?MCPy=U;orH3cm <_jb*)tYUJ b4z? AV2gsr5'&vv+| yj61c6<&O!5 /Qj@VJʥUz밴9wrf=F5e^rf 9 F,BQ jfUC7c"{JG)Jk0PF4)֗>wf%#2?`Cg~ 3 gsi2qrġeZ x!P" Kv{˚j҇ך;Xl ZWj5&dՠs 蕒T_n[B=':Mz{0oJwaʩ>7(Vz5b)*Qq|f`F7!A'@{&4&+ЁڽF;qh3% Sy$٤MvG.CP뇿ŗ6OUS=xi`N|Gl&NiNӈhC5:ɋOѸWc+')T vN*X²8k:@ vIA3Er寵gP~63jcM SCoжA)F|-ܺLI.CN'Xt? gΒw(OIѼ/B:;sa2bZ*{ DHA&7$5u e=>ܳYm\}|ɨxO$Qwj!';$'ſ<$LEx8 d Z`Xg8g ̳ELVa=zoWn%ĝN\wꓔ ~׾ %ˣj&8lf "eQ5x߰:|1"1HĿd3]lp/uy R=si䚨 m Dz8YI,X͸/{)tm41ln"C&?=9"() ϖ6|tRD.Q<,YʫD8g등ɚ~97b&mN!%*s˹푇[;Dی* nwc FLm5]XlQO! LM׎#% ٴQZ_6nuk )w䀎WS΅]bxtJje۵`5:WHJs*SM"/'ִ=,>su uRM VʰA>GcG}f}?&tդ vE1E ̋Ѣa" KEJN ).9t$.<~*IA3 b 3b|SM$'#@|Ʒ赑2]`40.b(> D.zAXu$ y+Tv6Sy%vuwiSUC>1)®6 cCW#㉽0 AGfZ6if.QZ#>Vf&)F:~HR09IgĒ2d=!Ӂ3jMY*ʩ)|ocgrm`pۓc=gsO#M41h==!Khvg&Rk g7v#6|ʚz#yGէ 2*jLfpJ7N-nB$yoGg9[h%V?P)|`i*c')Ƅ^$aDTU ̶cߊFWKH,h]oHXP ̲%bYoXtbK,&)/{xza \()g:_nWp[MMc>j$""%n+g.F75HQ >OC<^N ?K3^Kl'Zrty{vwsakϠʅϿƐdiq(#%n]SG/ ɏ( |GlR"8v%!%ZUiBJr*w4@v['u+4٧ldQơߘ#2HO/d.RBZC- 4ATB,1@#-ƗPV&_&ID-RsZԷ1;J3sʔA  +,EnUE fehcLCv LX>?>[ Fae@Ss(wn,DStakӶBuZ^NBdhp HP?G!ey*\f"ƅLoS9b&>%4W^eÑ$Wp#XO c~RJ}%XeC5*"ou%`Z!!e&v%q#sOEv?V5VTW8X΍Uw=U\ ZQ_}S6]/ RzQoIy~Pb`Ϛa]J:}ySP0 j&|禍DzˢUoD-݃&uuznyZx^_ !jb/5bG\`JI8zD] lBg+S2T j:ʙ@F{(W)9E#\| TP[¶`F>ɕ\Mn8 Jc6g:)kig.S."${: +TGijm)&J6r;D֗OMȂ2b`.iR(BkM<ɱݾ^44Z(4rw@"ˆzh]]:ps#4٬66(qCM̾vEșQ xOOT tfhVdXs"2! qɗyCd ^6FF)?`}N;z o;E87$9P +X:Al%DFbسF%4O\~(A s'mm{\(;-_R%o$r2xpV l5mRZ$U}.^<3Emr>!E o6b6u0t o'8.`Wh$ ZT𣐸i住\QDtiwweeҚ M(-_'@/8'0`ĮS)ʼn%NIivGT9}>U6U;uggK\(ӭAw~07i[_"pNmI}\D +q{o#g2j t =o_2q0 ?9W]6`R_u5=ro6bfTiTwl>.eT*" |?,zof$YʵUaa C"}MSg}8aEQԖb caxgj8bMxL\&sȷFQ|u>z'QkC-r7"4DxN 1iSvz!/]5U,O'QrLd&D/ -q?i^78FkBvuGr`v6]6%i=w\hu'pbuDQqm_Q1"H&]"GxU1|zVW'tAqt#Ifx&*&;ffx#Uy'|D&}ihgTyVHo\!v-x/(]D~nV9#Pdx1MT7e%BNnفg3(5TuG|yCe!LT,UԈ,WT״XiLp ހJTĉfGV8yȉai|rp v 7sɣ&ubwVf`P!87TDftuGB?i'lu4uO\C.iIyFBci\ILI@*f=!DPi'~h>+ĖGHW7њEЃAIx;r9c&`@Fa?{i" hC)d9d)o ٜdO8xw9UJ蝮g#-ׄ^{rj3_a#\avv?=;7ȟVwؖix0XB'?g|Cؗ`(&s3Ł,T:M8F&7꣏I`_ɂ8'"ņPJ2:N)ɟ hpBIĔ{impXx#K3A_Ƈ&9*m-`j>ng`We?ahh[gWe z&)iHM*M9[$1#9V(`hd Mr;ٖfkukQSDX0P*pvWE~K7֤P]Hq2WKTYɍdYs|Ȣ| ̖>W`Ԡک:m09B5fl$)\V ~vҕ72d74i,:]vZ}ͺXqz&yW3<ES[+6QY(bM0{yYlrHnjj0%s\ ™a u6<:`GB˔ց9{Ǫ7 tiޔQ[f!k yCꮵlX.MXnb+yHA3~tWF 3 D̦)&9sVQv[1 ebǟ]oJʇ6dK! 28[AP#䱇Ƌp'0{YpΰV עU'8v{Ss40ʸy؇>GΚr[1uF0wНk_+*}֑Z`qGU1+U)w.'&:򼱐H f[b¬z\z/%4pv š=,v(OR [eB(#J*(Tw>̵Qڧ@%w2}}*&2 h31JVR$xs*8%lS[{e^wZLNtcM8Ջ\8 XS{lNAQmEZ$}aӡ:U~|iK øYT!ƈŗ滵<0id{R&,i'Vsګj!rұ⠀hn&gD)Q]q6 TLʛ ̲]H_K?|x ņ:|/?epH7/h.@ +ɺc,(B֫՗ l>Թ~12/qbD>4ibDN۵LrUv",E3#Mwc<,Q;k^HS> ]*:&\-}e䴽56klE8X.M?DJ~`%q*}7?ZL*'VͤASp|벮ߔÃ[ g^:'+B7y!~>b~R$~0VpM}=В{<{^(~pJt)GD~p8 6@Z>N˛wcW [#Wd%{h>]He2rnM߄~< JM#7>b Xi촧,@垱,!,Rߦ+L[N/11)U'|QFqĬfƺ~B5NYGc[Iy(٧[1V \ý9~xI*SFvza\,w^W2ڂl/?bwm ߦf9h1m7؇ߔ!2 +.sҾ.LJp0JŔ 2Q>h4"!Q|]@,bǜXel8,lNZbB6!<*vjwSR6dW5*nQ-&(0ax?=B;CJKHJ8a0PScfOu16ghGCzvGYz+Q }vz!M{[ЫԁeZޒƷ3gL;ee@ [$2>zOeHM5AWj6ȣSbRu-A(igڙo6u56dp:M2xrU8x0Wިgg+$Yd8'݁"cfhӅgl/ZlGtH)3("x`AlhgaBĔhEmfXxT\ȀLJ!/j'"a(G0 Q Wp7Ό81)lUl Sa \*j(ͅ]ٔXr4aIQ}H\tVI_@_rV{F%Gw^l%OIh[X@5*$Ki$EUiȪTE?XTWJ(q-=3CTg"$f{QeslPqStqJÒq-ܼ^YH.xXX,ؐhkΟMBzfFÃPMֱI+a{ߑ4sin'R\"K%Ю1ur")*3u5KVng:Wna`6 ]];龜pҚ4^p֠BR6ڐd6>KXW1C핟uOFiOZM[u3 2ONUdON$,{aFf$]D­ fi:r똟.Y?]*:OM $Zu^S)88ũǠ=U#QraxDvƷQ␸RU H$3p).OaTuO3R@ js%À<5JYL^|_] #DVn+q;?哅3ed`cA{[GHF𠞆C-~̥H/|蟝:-xe ,#@)UXe/;GՎ69x$iE,BGEwJc $kuTZҢ,G/2XHXb WvSS!u(Q\5KWzr6E%M~N9L>I; )ZD@mQϳ-pi~%/ =+~cX;ǒ[(|<_:3G8ATlTha;qeaB_Z=`VW=AecF򼹛}9lpRϱX"{!րY| kx`g|i[ӻALqLuT߈/wvDp5rce0b\%ibbw}?Kg{ \_>vE- Gp7UbYm ;iIo;~|q=c,2]hOOw}5K@KGU|qq$j|l̑zs]vZ6WxJCY ~! U vƀ`0'~UstVx|KsXN^na]?%vRn5{1b7V6pǕAU߷. ~I hqRBW'}aT g(7LITߣwt.aVYTo*BtTTYHCbEzug6!/KJ`~g3E&FVVhrjbPV(1!V+0wVDV37,xJ>*-0{FDoS7e rOsSQhcJe2\1qboRKPwf5.stFqQt6ȆqIsD7N'o!$4t#z"`3rwHnj1rsm@MGxp QD6?N8]u|tV#1WA t&_i^ Z5?_!tdÉ4G|8c(e!i 4csde$TB8lzFaA6U]I9 '{[(CL^eq]'hcAMP*XGXyrx1#CUiv\BuU!e|yt.=}҆et1C^)NSq&7R9b: 07?tiHE&tYv_Vď)]a曓a_Ŵdxq-)wfHhЏӸ x13PSB!4vOcp'RIuDH6ـN.:Xj\WQ;OOxxBDgL18yxiCy]0t!d袶 ƍ*f-8HA٠H/9@~"gGawCwF/!yuw-vbguL+Zau0jBDJ&TZU^^)\M4-g~p:9k7ӕDْYi6`7[ԉϨ)(j+)Z(*4fR8RڂikwД·dH=z"m@얧:J*n*8M #*rnN6oj iarE,%SLdO/1! By:NX1QeI%qfRDFgz*3Tӫ*) $ǔ@7R0pD#jMCDezX-JN2#x3SIu@@Į˱.Q{e6VV9S.^hk1 ņQAgf`R4HjF/{u  S < XF1i w9WixGۇ+[~@'rհ͒f"o4*Fm"g[7I[#2P+BJ@8o@"#޹lc{Y&&`!wk,`b)h  3'6j:‡\0릛1KѶ/CfQʹ t8*r!Kp: PmZ+RKgY u'DžyWH@5oPi؛uhecak3Ȋyַ_zC нbPœ5N`Rn`nj7DxuzIa3H< fx'$Kf-75qO 3ɤpz:cmD:哜zmX I ŽxHUF7*4Tu2LiCЮB#/F=RlA3) Ǚr̻fA~iN 2!e*Τ IϺtS#%%i9tL@kjZ=)7bqkB*no<H+A*M@'(jR،̈\_ yKNm:칞qIxw̷׏tliV,1eR` yQh7۷ @q|נ!u6zx-]DܾN \!ׇ97T\x-C1:Fıw:eՀ=Ÿ<ǩ kр?* .kSB#ǎ8Ea8"Ǐ="9r ˗0cʜIMɳϗ IQJ =ʴ̜::ȦLRDT`BXf̪9Zornˤu"Ѻu$Cv]"0R\mUmaf\l^MbNJT8?ix>9' vjg y\z{1ÄquS8./w$P5XumJ6(uԦCy;wRKw܀wQy%ZM<(sE(M8e f`\'Hg""b!ՠ{>!L0֨=b5Tu'ɏ"T)t"HdѨ$Q^`ޘdVYWP]\poEi8ih҇bFayX% Vj b$biY. 'gfv)cUjZlW㨚n9h:X.!j NҶ*T*g.(_ᩩ[jױj~>(ܭk7lJU8n謭D 9hmnly+ң'W̡mk&R&-kɦ/ &lfhثOy߆|b.|-7qs,y *X2z۪|:Z͋w0G󔫓ݙVjtJrˤZJ3`ˇ}n~ݶpPM*sjG&6սhHwY]LxLGJ%)-z Eox=cdu ǟ38C8Nk1-Nn: yg,j.wcQyEtiєܿ i9ҷ>ar^]k9৾w5sY7ÙߝFH``VʕP.ls!vgeLX,/ roEOqSd31B *]Br.bDv65*^:׵.O7Wp1Fg\'CЅWDW5 O^τ>ѐv!6+[PbHG}$DղФ=;2N wS!HFqt% YuЋ"?7J2qgw)-4+ƒ-$1H,'P?!턢>.@e*P<8EO]$L5F,JLplo7iRΤgz)',L  +j N1sL4>p- ES6HZ4wDM|/(ksv#gDDC,i4LQ/di5U@PqLSXT5|yfCxTrj\+˭3[j JVk.ywԽ2jMX&Y2h7kW>Ď?qWurV|M6RtU,[ӅbSu\%0C4K sۓT/ܖhb4*۳;_+Y emcRvIJJ8gߒ7yIz\QelY6Sl\yeEWWu .b bZLӺY/a;.t|J W"T(*X;*/|Qum- }[S i10U_*1,^IΨ DI`ѽ IaB4LS%!72J̝FyI2,ٙ"4yͿJdE)'GےSf3K4Įod77y[k?94h :֧1&hWN~stL͕`0[}9/3L/qw={gW6ց! bZ:f39uf:]z;=\C3Il–կ-@ȵ c0{ea geߌ7wG,Us% (%~2}ζŷqGxt)e;Nc9)> d7'4h fgTՀ/];LXt3z1*sǼݚƨhN&(zv-ݷ+x:7mo?ۨq:p^^`fm w;6Yhw8q OyGRNJkF8N)QK~7ظ[^: Xdi(Sc!wg~9ZʸbDi:yyKiPmQNuH(b"f}R$omšUF-2uzs83Xmjmod;ؐL9jFDx7x~ECrEhy_9<Eѷ9Mm~ '3Dz~Xȹzfc86TAYGyuxy5SȎe]ѩWY`% kQz3H֓cn s zsCģG5AâV_?ڞ 7/ZW 8:KI(e%ט6H.v 0*q&& No gl¡iƧ*YbeHϘA!y B2pI$`㒠YY0i4:( Hd頟JRRة jAZg|D%sץ*)\EI/}Q9PZsŚo:UёzWGZ!Fj*!ʮڮAjz*J S{{ ۯK k˯{+!{J &024 1[,+6;;P>C-K I#k:*7۳R 9\eKes,V#~5e̕E{]BL|} 5 [t ޘ6 l3ƣ|vGbdjaq,<;+N&콝`6,tF&ʡhF,cχT_XumVwk,ܽ YDzͯ8ͯ\W啐)v2=d_9B v̉Lƿ|ɛ4EܛD|54:|R!%B5,ÛtD f:DqA  ’|2|-R%*#ϰlbTy&iW=0G=!ԚC e I s ʗ$UGUMs<{*\,Ňӽ:y|"85rf1{̖ |Į;e[qJՠ˂( &gz1='z @]uڴ{'M :@:v2\SυbxEb<͌m (:UK$ֻPMË:Z l7R-p9LFٕ]i0xզu_S6mJifYTߒDB'9} ]z$}ˊ}[;z" ɚY=;$N3MMА}; ?BzK+LQՈ&-tmԄC9m6+Pb>k2xV06 ޤ5( -e ٫EEn1:7]@Umנ߉QMn\Ql?=*{Ɓ^M -l]nɛmQ]MG0G~ݯA`]PGzn%w>/"{?^\;B_e{lI%[#ݵ{P:^> ԷHMRBFfabG^DGW$ժg,B٭]oz\cGMvKoԼbmRЈQkJi2?F/beSw뻼\BP?9\DIzݻ]=ˆbn2-{h6BWo=%JJ\cVEBoP^hR t؝{xOISg>G^joFvO_$nO:P?@"螇nyczIi`6q,Qnũ52df3RsK=l[2_әcsr]iW ֔7 \z& QԳn>s.QuqA'mTDTܑIƧM5aߏ;x,0 J#/ M5<-8L3//&wЈ.LÎܓo(%[A1dsL􍊦[SR SLQiQBQE-UN*r,5FS7,h5H.0^J=BIf6˓ZB_l(V>]Ped25]&L%Zj5:lĦ yL5 { L*]vfa 8eTٚ M҄dϹn>M 4v[\]q˶GiFs{e㐋Y8} 6`?~ڨlsheA/gܝzptSljU3]k#M\N>uKЧbU}2{Z.N)Tv™bڨVTg5E*G\!\<":HEcX-px`T %32h9T&AcM"v͔&'b gY۞ TN6ØL(Rc!pBF%tKg˰|I'xʑ$\z >J:h)bxM+Чt $zV`!Zw꜈2;9nʍV_R섨*SKĚJHn ^auRO2Ntn=ehꬿڧF$BlNU#;BV벓53x))ad]JY}t1zsJ13@P4!sl+t- jIG[L6Y$!j mHʺ|3b(TY5N$M߀8pqSnF 5~" T&FՑp֬Wlp,3gť6BZ`ROM6xj;ލ;Qikj**1LFq̇Abo {5{]':N awl]ԙqyU$!(_@jiԲC YߌW6{SgJzt3 F Vt!]#){4v"k ""ҜD(x ϔ^/[1qXW]~/ӄѿ{ߩ" 3=ګrN3RHӋ4CMZY9*2]!+:x0aZ72ߠ^/î,I(fl[ =6gSc,]*lQ˫X8J %T,TtKC/Ƒ򃟍lɥ3X xKayģf 9yuc]r͡UCcߙ:`r_Qs\:6ձf@2#;Y5vx}Jӊimvn1'땳Moc ϖ;EcwlBI.< sGb}D{8͝Vj>_x#Zk<8)S]t,:خJs]_i;vÝZ-/][uzV6Hxw JeЫOE"I"،菿 r Doh Lonؘf.Yoo+Ed( BAf K?ffH.(R7, n0r뢾 O ! DFiMB & ojۨi,p *^O<P aDO(/H&>R Fq0gʜfZWځ UdN -ڣl$| P XA +%sJ3@Mb@i?n~"wXFC OM(l(/4;1'Q6w4@TF,3&/Qܢ/r v dF,BK2.}Js"І g4sKPMRv+v2"lz{{7wJ:ruw0P敒xɷ|y#g0tW~S{GUxu2O}1O)yǗ 8 @8X ؂'}C UVvo7wyL@/hLxʹ4W8@K@E 8x؈}؉X)>Rt緄).4Or`0P LanJzxD`X x9KX/uQo4tI؋@w4e XFz/n&.S(J,mHN&KX  @Pxy|@9 y5zuw}K4c3Bg'+N]Tyioٶr)L( /`0Z z ZZ0ڠ51X}P3y:ͅMO-`ROQwJ9񎗟}my)XY#ښ 9ZQ >LQRw9=98NڹpgJЅzPy[Imրؗ38 ۙ![),97;/`%:Qwє}ѭإд7CYPek|Қ8IJ< ca܄~% [!;K {ۻ՘5?ιww۝X3wQbyưC< ۽;'<;‰7:3\ uPc۾X\+kJmr {#it<I\ 8;'ȭ[<ӛɧ\ë\yԒYw7\|Y!Cw1qh'Skq[: < } ] КQP9IW[s۸s1|dx}m yi8 =WՋO;O]=cg}QٺR|Qu Mͽ7A=kwxLbO" Qܽ@y#9MWTWaW9ү҆%k8n[N4>ӍpM!R-3h8zU#>&^ȹO鏚u~O^P4%}[ͺptNh(vDF}{L;KX@Q? ?>js@^E~+_TÝeٹ :ך.s,d/ydB}A<'_C{EY~7G8BgϳE6șpD0zMKm9v_I|3MU-%**6BZF+/3ޮ蕝MoYeqGD=C77'v~[~ Grx׮vbizl!Å[V*_2%, p8CY.f#F=bir[Pvmm6usw Uq5W+'Rć~h}bbu^:7TS bnEdvm۷qem rHv1ӼfSQ|pլY.h6]$ƞ*ORM O8D_Ct JjY!iظq [%ɣ3>h'ƶx[cz"Sgtdڣtw οzgb PaAXSP  t]E<@Vxa ZX܈J(!"jhQfy1M_ E^&Qy$P= ;DbYLYU Х_c)`R p  $"&riĝysIŸm'JV:c?ğF. f!ih:Y6jhXQAEP뙸wH&&," k0k1m΢][# JJڦZ{8jZF:fд[CLN,۹ PV! @qcq{!oa|AWEƸ璁~DK/[gF+Y|ui=j{Zu?2[ڰ1G[pZ*b F-Bg[l@ -E6qЌ1wHʺyѨT𙚹A=%c&@)P]OCYIׯn- 1_|xtߞrV4Ӵ⋋1?k /خS/Lbn>:>ˆL=#xSDv 0ma06o"غycG=p`<ڡ3&EDz0UGfQҍ.HWW{bc o V@"%dxb8*>Њbp! nP17WaoHPi/': ,᪮Bn>AXNI$^"aQ#!YI Zdxd$IMZQ^JI0BJ!#>qBdzvLNj+la%ä%c ?Z&Ԓ8.rkS~PRdv&J06Yqܦv@(R2DxƼ2D٥ʼ]DS:rH9"Mؗ*1z54 D> @A4.Bىz(H %LR %T`0}QŊ \ݬ*:6%$ f}x 6-cWlڔI*j/yִquQ7}}nFPö蒑42TJ82g)՘=|0CZQE0"%4IBrN<3[S; lnsa9wSc袺-3 ׆~+ @y4m^0s"kۂKS[HYVZɝ˩b"ʷc&E)U 2 $Wc4c@zIp\Ep2`:WNER4:^v;n7,X$AկYm1:+Y}4a뒩1#6<oħU\D܊^1 qCrm}E0Q媞>w8Ϭ_;շ }-ư&Κ@4t7]'tswꑞoCIPS@ANkBԞP_(ӷ~rc ۻ\sjV–z).й,d(~]yHO𞊗egaKoֱ%,s[:?şsy*d^Q؈Q}a^ (eǴL%ʔt| LSu_ Ɲm Z5YZ+XJQ`^Mݸ @L< ;  ҠUQ$`Tfe^؜dNz! d.bD#2"]!a ae AD Ռa j<):b3EY=P11R}` 3"i&]'z'(V[W!.Ϥ%V,aD! emLid d` ;56f6n̍zܜIT = ֞Hci#4pӈ3ъ])MM.a,$']'% AO6(u$ %@$IDRdEZΜC _.%O=lӥ{XI^t1ҹe] \Nf7;:-d8i9}9%_: 9SFTNeE .eeW>WBEұfʡ z]ɤǓi%]NNژKJXIml &&.&c6&bFd&AP f>r&"Z:]O(5]:Vj=M6*Z[zzXeZXmZo'i*R&(IƑe&[%ԍfSҿOagqaeViiVjh\'''p'(]4-#fvhP~W8OeB}S<^&cihxN( F]}hzc)nhGY9hT@gW&^i9DٔV5~iݹFPe憓 rvNT\2Nc*B&սaJWF*KxFQNY&BE. HNIdCꝪJjJ*]2!f߫ggUeJB6o>[,XRXiW8. YsokYN 6n`DLȜ`~pw&*05U^B. g;`&m Wΐnj^?*!q{ʲaVJ r 2 R*z#  k(ez2h6 Ǐ*lw\"Kq+C&$%N-S-3G. $F#&&$ s;/O oI:3jsF6^b@)r+5V'264J369G#::Ls<')&$7f2ְk~l4J1sg1̲77Ctá?$@@6QB*E'F[ sHK:j>+Tn;n&e2LM.#:ө|UO e%%e& uP*eQeP#%jH;t+Z%+pLtRV3ⴇN42!<`&^[f`e:ѵ\cMS:S02WU4OE1YW0,Z_Om&Jkfl6HK 1, 'ߪ>vdoogf7pgZG<_k2>_g*4613$Vo6vn܊(^7h(ҷ|w)lt t3v%wwO^EO֖wr*ホ~#mMx4n[8wwp08dfiѸw1lۯ c3O[Bw X;7y3`?yGksOySwy9y9y빜9yz#'z;:/:?C9kWzozsz:zz : ;7::zc:?{S{#g{oCs{_kw{{{;;c{{{ۻ{{c{;˻<' <;+Z~_~~  ޣ#3Bo~g=>C~k{=~'3?~ӿ?ρJ8@Gd2 h5F$*WlV VECX<>ZsD]~:@8/8þĿD9 IJK'MNJMMQSJVWXYZV:(,R^`-d.?ghi2A¹CBklopqrCst?OPzLj"p $X+z=qѰ&'G~傗2Ss6G֥$u&SlwR]˕/ܦ!xIgy;.eTWQ>dh be1iHa$Y6fM3Ϛ-zCug%-Wo MlQT4YT (NV6X̙Etgqqɉ6Gh:)ODYm)6‰cN%/H5ֹivKK?zhxvnL-R\UG|> ;;F/+:.ҫSbfЩC>{Rf=tQ@[EiDpF!3p ;ʿ64 [bJTr q-e/üQL.Q|8I3H JH8qO S;52᤼OiŒL/TK0MQDlA3bS4ߌYN̆>=C e5Q\%T,yRWG}B.mM=0@!.ڤiLU'ku XcUPZu\-sMRvE74 deԛfh(M}k˖2f[pM^ѕuit^yW9-|=UXQJ>FfNfnF_r':/ގzגoS`jJe_ X`#Q/K#gF3XmV15n^u1`QR,M@ӳpĭF,_F+W9 Xm3X;h{sN]z鈺k}lB+r̿ݜ2 %EG BcS/7l{f=xȁ m8ۭhU Muzyݲ]4vc`Ǘ8@=S,'}go +Ǽ/Y2JfG 9P;DRxv>p-` "g2CE('/z(4UXEɭ{ag@!*9pF4˜Ϭhn^0kB݊+wY:6λ#=˾D@7;C%j6󛽾J?U V˽z?ӄ{S˿+9̓12.)[@d@\{@ T@ 0VkA{04<),?ǁ*42A4A8A8K;sòӫ9! 񳻟:x=hB@(-iKB(.˪J|*CM̙ 4Dk`CÉ1{<,BK8f=@@4C0K:ETF\`82.~Zj1\9M4<,6Q6C;$0(#PKC@A\8yB DL" _"cReqg3̓jF㱈GGzoNǤ G6YtTGKwx &9<9<}GTI HUI'z>cĖ#KȜ+4H\BYuED=]4ě: JbTIclI\&f KܜⲕC"hH=t G) L.@ʤAEuvDɕ"'AL-J}tSaa K9˙,("6AP ͝ķ24\EKL-|WȿHgHv=*BJ{|ģdT&l<ˁ?:C5Mí+M!I͝ McBtM|\DqiS 9V`Dą\ N`"8oaYܝЮ6cTc'}bO=Z` f=.4+b"_:b 1\)jӾ-\*^Ý+-R k11="U62'A1NUUK@c=n>?F;AӓJL[dF PE$&t?PLM,a&O=.PF^t5E! UnfXݼIec(V\^v],^_^@a6AejkfV6P;YNm eշӴgP;<4]e]!vޤh斄Ld^Hgf^fP۾4NLh乆&]1A9^JhNh;9L;$^0ViJ 6in`gG; =^@a! dx\qTj³+{:rk;468fl^kQsUnОʮi[gsl%:gNmi`n5.n~Y8n^Xn.nnnܦ_Ƕovl6m>oofno#.~o.ooކ ;icon-9.4.3/ipl/gdata/xnames.ed0000664000175000017500000000216207140713052015454 0ustar chrishchrishg/VNotice/s//Notice/g g/XActive/s//Active/g g/XAlert/s//Alert/g g/XAttrib/s//WAttrib/g g/XBg/s//Bg/g g/XClearArea/s//EraseArea/g g/XClip/s//Clip/g g/XClone/s//Clone/g g/XColor/s//Color/g g/XColorValue/s//ColorValue/g g/XCopyArea/s//CopyArea/g g/XDefault/s//WDefault/g g/XDrawCurve/s//DrawCurve/g g/XDrawImage/s//DrawImage/g g/XDrawLine/s//DrawLine/g g/XDrawPoint/s//DrawPoint/g g/XDrawRectangle/s//DrawRectangle/g g/XDrawSegment/s//DrawSegment/g g/XDrawString/s//DrawString/g g/XEraseArea/s//EraseArea/g g/XEvent/s//Event/g g/XFg/s//Fg/g g/XFillPolygon/s//FillPolygon/g g/XFillRectangle/s//FillRectangle/g g/XFlush/s//WFlush/g g/XFont/s//Font/g g/XFreeColor/s//FreeColor/g g/XGotoRC/s//GotoRC/g g/XGotoXY/s//GotoXY/g g/XLower/s//Lower/g g/XNewColor/s//NewColor/g g/XPaletteChars/s//PaletteChars/g g/XPaletteColor/s//PaletteColor/g g/XPaletteKey/s//PaletteKey/g g/XPattern/s//Pattern/g g/XPending/s//Pending/g g/XPixel/s//Pixel/g g/XQueryPointer/s//QueryPointer/g g/XRGBKey/s//RGBKey/g g/XRaise/s//Raise/g g/XReadImage/s//ReadImage/g g/XSync/s//WSync/g g/XTextWidth/s//TextWidth/g g/XUnbind/s//Uncouple/g g/XWriteImage/s//WriteImage/g w q icon-9.4.3/ipl/gdata/iml.pak0000664000175000017500000022316507140713052015135 0ustar chrishchrish########## w01.iml 1,#0001 1,#0 1,#0010 1,#0100 1,#01 1,#0110 1,#10 1,#0111 1,#1 1,#00001000 1,#00001010 1,#00001100 1,#00001110 1,#10001010 1,#00110101 1,#00111100 1,#10001101 1,#10100101 1,#01010111 1,#10011111 1,#11111110 1,#0000001100000000 1,#0000001111000000 1,#0011001100000000 1,#0011001100000011 1,#0011111100000000 1,#0000111111110000 1,#1100110000110011 1,#1100110011110000 1,#1100111100000011 1,#1111110011001100 1,#1111111111000011 1,#0011111111111111 1,#10100 1,#11100 1,#00000000000000001111000000000000 1,#00000000000000001111000011110000 1,#00000000000000001111111100000000 1,#00000000000000001111111111110000 1,#11110000000000001111000011110000 1,#00000000111111110000111100001111 1,#00000000111111111111111100000000 1,#11110000000000001111111100001111 1,#11110000111100000000111100001111 1,#00001111000011110000111111111111 1,#11110000000011111111111111111111 1,#11111111111111111111111111110000 ########## w02.iml 2,#10 2,#1020 2,#0111 2,#1 2,#12 2,#1221 2,#1323 2,#00301010 2,#12000021 2,#12000120 2,#12021021 2,#12030120 2,#12121213 2,#000000000021 2,#0021 ########## w03.iml 3,#7000007 3,#700000 3,#770000 3,#777000 3,#777700 3,#777770 3,#241 3,#000000007777 3,#000000777777 3,#000077777777 3,#007777777777 3,#000777000000000000000077 3,#777777770000000000000000 3,#777777777777000000000000 3,#777777777777777700000000 3,#777777777777777777770000 3,#007777777777777777777777 ########## w04.iml 4,#0010 4,#0104 4,#0420 4,#0820 4,#8010 4,#0124 4,#0142 4,#0224 4,#0260 4,#0424 4,#0504 4,#0601 4,#0610 4,#080a 4,#2208 4,#8050 4,#0158 4,#0161 4,#0168 4,#0258 4,#0306 4,#0660 4,#1 4,#1144 4,#1248 4,#1284 4,#14 4,#1842 4,#2 4,#4221 4,#4 4,#4510 4,#0272 4,#0433 4,#0515 4,#0525 4,#1922 4,#281c 4,#8443 4,#8641 4,#a052 4,#0356 4,#07 4,#070d 4,#1a4a 4,#1c32 4,#2a54 4,#2c34 4,#5451 4,#8711 4,#88e1 4,#a452 4,#0787 4,#121f 4,#124f 4,#2555 4,#2f22 4,#5a1a 4,#6538 4,#8356 4,#9887 4,#a552 4,#f222 4,#33cc 4,#36c9 4,#39c6 4,#6 4,#e0ea 4,#0ddd 4,#7ca9 4,#9ac7 4,#e5b5 4,#f731 4,#5f5b 4,#7 4,#7bde 4,#7d 4,#7edb 4,#f5f7 4,#df7f 4,#fffe 4,#00100040 4,#003000c0 4,#21008100 4,#05020508 4,#0a08020a 4,#1240 4,#4210 4,#80502050 4,#00cc0033 4,#04a4 4,#1248 4,#1e004b00 4,#3300 4,#88421124 4,#00f41414 4,#1a42 4,#4470 4,#1370 4,#70d0 4,#913264c8 4,#525a585a 4,#78555870 4,#35c5 4,#71d4 4,#5b5a5e5a 4,#770d7d07 4,#6ecd9b37 4,#77bdeedb 4,#bddbb77f 4,#eeeeeeef 4,#7fafdfaf 4,#f5f7fdf5 4,#9fff6fff 4,#ffdf7fdf ########## w05.iml 5,#0102040810 5,#1f00000000 5,#0304040418 5,#11040a0411 5,#010101011f 5,#04041f0404 5,#0609090e00 5,#11040e0411 5,#110a040a11 5,#1504040415 5,#000103070f 5,#0303030303 5,#05090a1214 5,#1f1f000000 5,#150a040a15 5,#110e0a0e11 5,#15041f0415 5,#150a150a15 5,#0103070f1f 5,#0707070707 5,#1f1f1f0000 5,#1f09091f09 5,#0f0f0f0f0f 5,#1f1f1f1f00 5,#1f000000000000000000 5,#1f1f0000000000000000 5,#1f1f1f00000000000000 5,#0000000000001f1f1f1f 5,#1f1f1f1f000000000000 5,#1f1f1f1f1f0000000000 5,#000000001f1f1f1f1f1f 5,#1f1f1f1f1f1f00000000 5,#1f1f1f1f1f1f1f000000 5,#00001f1f1f1f1f1f1f1f 5,#1f1f1f1f1f1f1f1f0000 5,#1f1f1f1f1f1f1f1f1f00 5,#0000000000000000000000000000000000001f1f 5,#000000000000000000000000000000001f1f1f1f 5,#00000000000000000000000000001f1f1f1f1f1f 5,#0000000000000000000000001f1f1f1f1f1f1f1f 5,#1f1f1f1f1f1f1f1f000000000000000000000000 5,#000000000000000000001f1f1f1f1f1f1f1f1f1f 5,#00000000000000001f1f1f1f1f1f1f1f1f1f1f1f 5,#1f1f1f1f1f1f1f1f1f1f1f1f0000000000000000 5,#0000000000001f1f1f1f1f1f1f1f1f1f1f1f1f1f 5,#000000001f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f 5,#1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f00000000 5,#00001f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f 5,#1f071f0000 5,#1f0000000000000000000000000000000000000000000000000000000000 ########## w06.iml 6,#1f11151517101f011d1515111f00 6,#00001f1f1111151515151d1d01011f1f101017171515151511111f1f 6,#00001f1f1111151515151d1d01011f1f101017171515151511111f1f 6,#010101 6,#010204081020 6,#201008040201 6,#00120c0c1200 6,#1028140a0502 6,#221408142201 6,#01010101013f 6,#03060c183021 6,#050a14281122 6,#210c12120c21 6,#21120c0c1221 6,#211e12121e21 6,#2d1e1e00211e 6,#1535053d013f 6,#0f1e3c393327 6,#090909090f00000f09090909 6,#1e1212121e00 ########## w07.iml 7,#7f007f7f 7,#01020408102040 7,#7f000000000000 7,#08142241221408 7,#41221408142241 7,#7f010101010101 7,#03060c18306041 7,#7f7f0000000000 7,#1c22414141221c 7,#081c3e7f3e1c08 7,#1d1d1d1d1d1d1d 7,#1c3e7f7f7f3e1c ########## w08.iml 8,#0000000000000040 8,#0000008000000008 8,#0081000000000000 8,#0200000000000002 8,#4400000004000000 8,#0000000008080808 8,#00000000f0000000 8,#00020020 8,#0100010010001000 8,#0100100080000800 8,#0500000050000000 8,#0102040010004000 8,#0001004400100044 8,#0040804004000c00 8,#0040a00000040a00 8,#0204080080402000 8,#1020408004020100 8,#000000030f030000 8,#0022000200aa0002 8,#01 8,#0110800420048010 8,#0120048010024008 8,#0180402010080402 8,#02022020 8,#0204081020408001 8,#08 8,#0880021040040120 8,#11020020 8,#1c1c080800000000 8,#2005200002500200 8,#2050200002050200 8,#0880104200092002 8,#5500010011000a00 8,#0207020020702000 8,#1122048011024008 8,#2050880502018040 8,#8420092002480110 8,#00450051 8,#0084483030488400 8,#01808c1020c40402 8,#0400a40303940080 8,#04210034b0001280 8,#0480280303500480 8,#0500201323100082 8,#1102440811204480 8,#22082280 8,#4008688400008458 8,#4008823030054008 8,#430b004900004a00 8,#4488245000002890 8,#500012410a210028 8,#7038200280040110 8,#8201000000c62944 8,#0000fc0c04040484 8,#0702018040207088 8,#1418102040c04122 8,#304884030c102020 8,#8403c02010103048 8,#010101718e808080 8,#0103060c18306040 8,#0182442810284482 8,#0814222222224180 8,#108a1022408a4022 8,#1128448211005500 8,#4122140810284482 8,#8244281028448201 8,#9211824428101010 8,#aa00001788170000 8,#0509112141810103 8,#08080808ff080808 8,#15a0100251280122 8,#2020508827885020 8,#5100aa005500aa00 8,#8822082288228822 8,#ff02020202020202 8,#002050a855a85020 8,#00a44834b0489400 8,#00ca08430b404d00 8,#010204c423138c80 8,#020e070420e07040 8,#0245204a04a84224 8,#033006c00cc00c60 8,#03844830 8,#048001128b472102 8,#0480524c8004c829 8,#05 8,#0c03c030 8,#0c 8,#102000683a715800 8,#10a4480582489420 8,#132384200a411084 8,#14a01200b2350021 8,#14a012208a451021 8,#1c1001c183800838 8,#2412098442219048 8,#281000102854aa54 8,#404404b10444401b 8,#4058850480866808 8,#411482481248210a 8,#43005a400869000b 8,#430b400530308208 8,#448821940840a412 8,#50204a0582491028 8,#502884210a411284 8,#50 8,#55a04040550a0404 8,#55aa0404040404a4 8,#74102104801220b8 8,#74b8681000002058 8,#8142241818244281 8,#81c06030180c0603 8,#834438000e11e000 8,#83443800 8,#88010200f8482858 8,#88502000d8250505 8,#aa140808aa418080 8,#00003f2422312824 8,#0000ff2141810103 8,#0055085500558055 8,#0181f1e1c1810100 8,#020205f82020508f 8,#21c12111121c1211 8,#41e05088050e1422 8,#9122448811224489 8,#9301824439102844 8,#001c323e3e1c0000 8,#02819a680c518054 8,#400000b14a1bb1e0 8,#44a0093825101562 8,#01c80917a3424c02 8,#038c90703824c403 8,#040c1c38e4050706 8,#04809668884458a5 8,#0500a517a3960082 8,#0548a514a0964882 8,#058201942b53a402 8,#0603ef7030180808 8,#060f906060900f06 8,#0709d840086c4283 8,#0783126888445821 8,#10381247e2481c08 8,#10ac90458a24d420 8,#132058458a681023 8,#132350248a459028 8,#143e3e7860800001 8,#148d90410a24c6a0 8,#1c22c141c1221c14 8,#2280c9aac9802288 8,#242424e70000e724 8,#2e112e00a344a300 8,#304a01478b024930 8,#3148841323844832 8,#38387c3c0e020400 8,#3911824439448211 8,#3f29252d120c0000 8,#430b5005b0348228 8,#4328ca04804d500b 8,#43844a303049840b 8,#445a214488126988 8,#4488255288442992 8,#448869128844215a 8,#451220532b10218a 8,#478b422508409209 8,#4aaaa4a040aa040a 8,#5028406d0a41da08 8,#508c82313205c428 8,#538412410a21842b 8,#540112713a2102a8 8,#54a886210a411285 8,#54a8864902014a85 8,#54aaff0204081020 8,#57098201020542ab 8,#72202020728a8a8a 8,#75102114a01220ba 8,#aaff080402018045 8,#f088b4d488f00000 8,#121213f30000f312 8,#255211a412c52288 8,#38387c2854aa0100 8,#413d0301033d4181 8,#881422eb221488c1 8,#88f88088888f8888 8,#2020ff020202ff20 8,#206064e0e0c50d1c 8,#2255085522558055 8,#3124313f00003f30 8,#83543a40e8112e04 8,#90909090909090ff 8,#c121160c1830e887 8,#ff010101ff101010 8,#01a1c1e1f03b0a02 8,#0dc4b520135c2441 8,#0e512e01689215e0 8,#120bcc0760c01c72 8,#290192280193c7c6 8,#418041ff0000ff22 8,#50d1326283092d24 8,#5212931312331312 8,#a908e6842c324560 8,#e3140c49882ac914 8,#003c5a66665a3c00 8,#01ca8d54a8c64d02 8,#0303d424b87490ac 8,#05ca28532b504d82 8,#0783c1e070381c0e 8,#0990e1c384483c1e 8,#0e1c3870e0c18307 8,#1080be80969610d7 8,#132394688a4558a4 8,#1b1881b136066063 8,#1c 8,#20101a1c1f0fb3a0 8,#2121212121213f3f 8,#2a158a45a251a854 8,#30304cc683078dc8 8,#35b20552a8542982 8,#3f21213c8484fc00 8,#4008506db874da28 8,#40089469b8745aa4 8,#40d88d0783c66c08 8,#410a6d402b5308da 8,#430b506d8844da28 8,#4328ca34b04d500b 8,#4458a50783966888 8,#448825528b472992 8,#4512a554a896218a 8,#458a2112ab572112 8,#47854a303049868b 8,#478bd605800482ad 8,#47a512448821968b 8,#5229944a259249a4 8,#538412713a21842b 8,#6432198c462391c8 8,#65d088e2660d9410 8,#709209478b422538 8,#713a6886a0148558 8,#713a69842850845a 8,#71da085028406d3a 8,#7558a410209468ba 8,#75ba21102b532012 8,#75ba6812a0142158 8,#75ba69102850205a 8,#83e0380e 8,#84188e244398d872 8,#8b65068860d63884 8,#b18d0cc0d81b0330 8,#e029000001abc7ef 8,#e3c33714102061e0 8,#ff83110155011129 8,#0000063f7f3d2524 8,#0000cfcaccc8c9ca 8,#0010387cfe7c3810 8,#13266631984cc489 8,#38854a200dd311bc 8,#508cb8aa0968c2d2 8,#55ff4020100804ff 8,#7909097f48484f00 8,#a22489e195922472 8,#cee12c853e02c810 8,#1f0e44e0f1e0440e 8,#4545c71154547c11 8,#5522558a552255a8 8,#60e0e8e1e18b1a18 8,#88c1e3c1881c3e1c 8,#aa6c006caaee00c6 8,#cfc949494a4c4848 8,#ef111111fe111111 8,#f120ee021f02ee20 8,#f80808ff8888888f 8,#80c0707c3f3e1c88 8,#830e3c7cf8783010 8,#f352f25232121213 8,#ff052101ff149018 8,#ff8080fe0202ff00 8,#000103070f1f3f7f 8,#0080c0e0f0f8fcfe 8,#010100f9fd0d0dfd 8,#01ca8d57abc64d02 8,#1323506cba75d828 8,#31324dc42b538cca 8,#345aa543c2a55a2c 8,#352a 8,#390000c9f8f8f1f1 8,#40086dc68b478dda 8,#4008d46db874daac 8,#41da0957ab426d0a 8,#43a45a74b869940b 8,#478b5225b8749229 8,#4b4bcbcf0000cfc8 8,#5028d425ba7592ac 8,#532b406d3a71da08 8,#532b9449b2354aa4 8,#548dca31324dc6a8 8,#558a55a8 8,#578d82313205c6ab 8,#818181ffff818181 8,#a03656c38c9520cf 8,#b66b0a440a168e4f 8,#b98c432690b68ea8 8,#c3663c183c66c381 8,#d6116d11 8,#ff818181818181ff 8,#0101ffff0000ff43 8,#06f2828e80ff80fc 8,#1111ffff0000ff01 8,#1c2bcab6e284626c 8,#1ec28a8e80ff80f8 8,#407a95e1905b2b3c 8,#48758340ab3cf658 8,#602058b859fbf1e0 8,#682a468d474ed32a 8,#76ebc582070e1c2c 8,#8a1e475132b532d8 8,#a18c70fa8326572c 8,#ecececfc0000fc44 8,#fea2a0a1ad292f20 8,#fea2a2a2a8a92f20 8,#ff8181c2a49999a4 8,#0001abc7fffe3900 8,#1e0e83c1c1e1e1f3 8,#39e1e0f0931e0e0f 8,#3e5c88c5e3d1881d 8,#55a255aa552a55aa 8,#ab24ba093a64cb96 8,#c56037945da2d549 8,#00d4aad4aad4aafe 8,#0cdd2b26645923b7 8,#23b4ac4b96a926dc 8,#3393933353939352 8,#3f2e3b203b2e3b20 8,#5c21b5665d6ce681 8,#8232dca2279bcce6 8,#c4796e15317d4896 8,#d23d8145bf08e99a 8,#d5495293f21a915e 8,#0000f3d3b372f3f3 8,#05caad57abd64d82 8,#0f0f0f0ff0f0f0f0 8,#0f1e3c78f0e1c387 8,#1d8e47a3d1e8743a 8,#1e87e178 8,#28147dbe7dbe2814 8,#31324dc6ab578dca 8,#361b8dc663b1d86c 8,#4b 8,#4da653a9d46a359a 8,#54a55a75ba6996a8 8,#57ab524db235ca29 8,#57abd64d8205caad 8,#713a6dc6a8548dda 8,#74b869968b47a55a 8,#7592ad54a8d625ba 8,#75ba6912ab57215a 8,#783c1e0f87c3e1f0 8,#c9c949c9c9c949cf 8,#d8 8,#ddddd800d8dddd00 8,#e472399c4e2793c9 8,#f0e1c3870f1e3c78 8,#f0 8,#f90909f99f90909f 8,#ff818199998181ff 8,#0000ff75ba5dae57 8,#0000ffd5d5d5d5d5 8,#0000ffead5ab57ae 8,#01552b552b552bff 8,#03020393dbffdb93 8,#2ab6ad6c0de56ea1 8,#2dc27eba40f71665 8,#3b8691eace82b769 8,#7dcd235dd8643319 8,#a3de4a99a293197e 8,#aabaa2aaaaab2aea 8,#bf00bfbfa1a1a1a1 8,#f322d4d99ba6dc48 8,#36f0f878630f8f87 8,#3a9fc86ba25d2ab6 8,#54db45f6c59b3469 8,#5b9f9fdf031011ba 8,#5daa55aad5aa55aa 8,#7c7cfefe10107c38 8,#a4f1aa1f4a1faaf1 8,#c61e1f0f6ce1f1f0 8,#cccecfceccc8c94a 8,#df54d2ded28afe00 8,#015d5d5d5756d0df 8,#55ae5f8c55eaf1c8 8,#5e738f057cd9a8d3 8,#75e1b8aecd4acd27 8,#7cc3a59999a5c37e 8,#97d5b972b8b12cd5 8,#b78a7cbf54c309a7 8,#bf856a1e6fa4d4c3 8,#dde3f7ff0000ff80 8,#e13d75717f007f07 8,#e3d435491d7b9d93 8,#f2f212f2f2f212f3 8,#f90d7d717f007f03 8,#007e7e7e7e7e7e00 8,#3d3d3d3f203f3d25 8,#4673bcd96f497157 8,#4acfca4f4a4fcacf 8,#5593ff115511ff39 8,#57aa75aa 8,#5faf0b0d0b0d5faf 8,#5fc9a93c736adf30 8,#74daad478bd66db8 8,#75ba6996ab57a55a 8,#bb7cfeff0000ff18 8,#dbe7e7ff0000ff11 8,#ff7f3f1f0f070301 8,#fffefcf8f0e0c080 8,#307a7afcdfe7c131 8,#7cf1c3830787cfef 8,#7f3f8f83c0c1e377 8,#c783c7eeee00eeee 8,#ece4ececec0cecfc 8,#0101ffff00ffff0f 8,#0edf11fde0fd11df 8,#445f5b5f44f5b5f5 8,#72020500fffffffd 8,#773e1c3e77e3c1e3 8,#77aa5daa77aad5aa 8,#aa88ff9caac9ffc9 8,#baba38eeabab83ee 8,#bb46c7c7bb647c7c 8,#c7a2cfaf4fae4daa 8,#c7c7bb647c7cbb46 8,#e0f1bb1f0e1fbbf1 8,#e3773e1c3e77e3c1 8,#e3773e383e77e383 8,#ef395593fe935539 8,#ef55aaf72cb5ad34 8,#f3b018185dbddfdf 8,#ff02f2f2f2f202ff 8,#fffab0d0b0d0f5fa 8,#1c1c1cffffff1c1c 8,#311ed37ac1fd37ef 8,#5ddb761e6a6ddb8d 8,#6e9e1e3e5a3e3e7e 8,#af734755f6973d2d 8,#c77ab5dff22cee43 8,#fc3cfcfc7c84ecec 8,#ff8e5fae54e8f1e2 8,#fffff9c080c2dadb 8,#1fc7f17c 8,#4e72f33f27e4fccf 8,#7be771dbbc67278d 8,#7c3e1f8fc7e3f1f8 8,#7dcdcefabee01cf5 8,#9a2f771d99f26bef 8,#aabfa0bfaafb0afb 8,#b4f714f7bfa0bfb4 8,#b796f5d730afbea5 8,#b9d9e6679b9d6e76 8,#d8ee36bb8dee63bb 8,#ea 8,#f8 8,#ffc3a59999a5c3ff 8,#56f7197bd3cdba9f 8,#8eb5bbdbe0dbbbb5 8,#a3c78f1f3bfdfa71 8,#af2ecd9d7cf6d2db 8,#edf433f89f3fe38d 8,#f23b4adfeca3dbbe 8,#fcacf45cfc7cfcbc 8,#007f7f7f00f7f7f7 8,#aaddaa7faaddaaf7 8,#10ba7cfefefffe38 8,#5fdeffffe7860e0e 8,#77077f7777707777 8,#77d88fd877afafaf 8,#7efc99cbe7f3993f 8,#7efeebd5ebd5eb14 8,#7f3fea75ea75ea75 8,#df33aa77ff33aa77 8,#0f774b2b770fffff 8,#5f8f5baff5f8b5fa 8,#b5555b5fbf55fbf5 8,#bbfb0afbbbbfa0bf 8,#c0d6dad2edf3ffff 8,#d1eed1ff5cbb5cff 8,#ebbdb6da6bedb6de 8,#edde73b3deed3b37 8,#f714f7777f417f77 8,#f9fc108fcfe7f7f7 8,#fbf3e3c71bfaf8f9 8,#ff606f6f6f6f60ff 8,#bb5ff6c7daefea9d 8,#fd7e6597f3ae7fab 8,#55ff55bf55ff55fb 8,#de3edeeeede3edee 8,#fdfdfa07dfdfaf70 8,#1eff87ffe1ff78ff 8,#3c3cffffffff3c3c 8,#3f3fdeedf3f3edde 8,#7e3f9fcfe7f3f9fc 8,#7ebddbe7e7dbbd7e 8,#b7dd7fd57dd7db7d 8,#b7de7bd7faaff5de 8,#befafaebebafafbe 8,#dbedf67bbdde6fb7 8,#df1f8fbffdf1f8fb 8,#f3f33f3f 8,#f97e9fe7 8,#fc7bb7cf 8,#fc 8,#ffdfaf57aa57afdf 8,#00fdfdfdfdfdfdfd 8,#77ddf7dd77dd77dd 8,#aeff55ffaaff55ff 8,#7dbbd7efd7bb7dfe 8,#99e7ff7e99e7ffff 8,#bbf5ee5fbbffaaff 8,#dfeef7baf7eedfba 8,#f7f7f7f7f7f007ff 8,#df8f77f8fdfe7fbf 8,#ebe7efdfbf3fbedd 8,#7727ffffff2777ff 8,#bbefbbfe 8,#efdbbdfe7fbddbf7 8,#fd77ff8dff77fddd 8,#feffeefffe7daa7d 8,#ffbaffae 8,#bfed7fdb7ff7defb 8,#fdf8fdffdf8fdfff 8,#ff5ffb5ffff5bff5 8,#57fd7ffd77ff7fff 8,#aafffeffeefff5ff 8,#fff6dffdf77fefbd 8,#7fbfdfeff7fbfdfe 8,#7ffefdfbf7efdfbf 8,#bf 8,#e3e3f7f7ffffffff 8,#f77f7ff7 8,#fdef7ff7fedffbbf 8,#fffffffcf0fcffff 8,#efdfbf7ffbfdfeff 8,#f7fbfdfeffefdfbf 8,#7dfeffffd7efffff 8,#bfffeefffbffeeff 8,#efffbbff 8,#fbf5ffffbfafffff 8,#ffbf7fbffbfff3ff 8,#bffffbff 8,#ffffffff0fffffff 8,#fffffffff7f7f7f7 8,#bbfffffffbffffff 8,#7ffffffff7ffffff 8,#fdfffffffffffffd 8,#ff7effffffffffff 8,#ffffffffffffffbf 8,#00003030000000000000030300000000 8,#0000f0f00000000000000f0f00000000 8,#0000333300000c0c000033330000c0c0 8,#0f0f0f0f00000000f0f0f0f000000000 8,#00003f3fc0c0333333333333c0c03f3f 8,#ffffccccfffff3f3ffffccccffff3f3f ########## w09.iml 9,#004002005008010020140080040 9,#000038044082082082044038000 9,#145082145000000000145082145 9,#0000380100920fe092010038000 9,#044082145028010028145082044 9,#145082145028010028145082145 9,#0ff0800800fc0040041fc100100 9,#1010ba0100920fe0920100ba101 9,#155082145028111028145082155 9,#08218704e03c0380780e41c3082 9,#1110ba0100921ff0920100ba111 9,#1f10110110111ff11011011011f ########## w10.iml 10,#001002001002001002001002004008004008004008004008004008010020010020010020010020010020040080040080040080100200100200100200 10,#3cf048048048048048048048048048048048048048048048048048048048048048048048048048048048048048048048048048048048048048048048 10,#3fc2042042042042042042042042042042042042042042042042042042042042042042042042042042042042042042042042042042042043fc000000 10,#3cf0480480480480480480480483cf0480480480480480480483cf0003ff0000000000000000000000000000000003ff0003cf048048048048048048 10,#3cf0480480480480480480480480480480480480480480480480483cf0000003cf0480480480480480480480480480480480480480480480480483cf 10,#0000000000f80880880880f8000000 10,#0010010010010010010010010013ff 10,#303303000000030030000000303303 10,#00007800013214a14a132000078000 10,#0000000000f80f80f80f80f8000000 10,#0001fe1021021021021021021fe000 10,#12231302001014528a020010323112 10,#20107800013214a14a132000078201 10,#32321102001014528a020010221313 10,#1c000e 10,#03007800013234b34b132000078030 10,#3033030300300cc0cc030030303303 10,#32322102002003f3f0010010211313 10,#0000000fc0fc0fc0fc0fc0fc000000 10,#0300300300303ff3ff030030030030 10,#23107800013234b34b132000078231 10,#333333030030030030030030333333 10,#3ff2012012012012012012012013ff 10,#0001fe10217a14a14a17a1021fe000 10,#00f00f00f00f00f 10,#3232210a406803f3f0058094211313 10,#33033030c30c0cc0cc0c30c3033033 10,#3c000f 10,#3fc0043f40141d41141f40043fc000 10,#3a72212a506800f3c0058295211393 10,#1323330300303cf3cf030030333132 10,#2011fe10217a14a14a17a1021fe203 10,#00000100300700f01f03f07f0ff3ff 10,#3033030fc0fc0cc0cc0fc0fc303303 10,#3bf22122026920f3c10592112113f7 10,#0000fe0fe0fe0fe0fe0fe0fe000000 10,#3bf22122126920f3c12592112113f3 10,#1d122e 10,#3e001f 10,#3bf2212a526820f3c10592952113f3 10,#3333330300303ff3ff030030333333 10,#00100300700f01f03f07f0ff1ff3ff 10,#03f03f03f03f03f 10,#0c30c33ff3ff0c30c30c30c33ff3ff 10,#0ff0ff0ff0ff0ff ########## w11.iml 11,#7ff000000000000000000000000000000 11,#104104707000000000000000707104104 11,#00300600c0180300600c0180300600401 11,#7ff7ff000000000000000000000000000 11,#104104707080040020010008707104104 11,#0410a2114208404202101082144228410 11,#08808808878f00000000078f088088088 11,#0410a2114208414222141082144228410 11,#104104707088070020050088707104104 11,#2aa0012a80052a0015280055200155000 11,#00300600c0180300600f019830c606403 11,#08808808878f05002005078f088088088 11,#4412a211420841422214108214422a411 11,#7ff7ff7ff000000000000000000000000 11,#08808808878f05002007078f088088088 11,#08808818c78f05002005078f18c088088 11,#124124707088070623050088707124124 11,#48908808878f05002007078f088088489 11,#2222223fe2222222222222222222223fe 11,#48928a18c78f05002005078f18c28a489 11,#0a80a818c78f05072305078f18c0a80a8 11,#48928a18c78f05002007078f18c28a489 11,#174124727088451727451088727124174 11,#555124727088451326451088727124555 11,#174124727088471727451088727124174 11,#0a80f818c78f25262325278f18c0f80a8 11,#0003fe2222223fe2222223fe2222223fe 11,#3ff0013fd2052f52952852fd2013ff000 11,#7ff7ff7ff7ff7ff7ff000000000000000 11,#7ff7ff7ff7ff7ff7ff7ff000000000000 11,#7ff7ff7ff7ff7ff7ff7ff7ff000000000 11,#7ff7ff7ff7ff7ff7ff7ff7ff7ff000000 11,#7ff7ff7ff7ff7ff7ff7ff7ff7ff7ff000 11,#0000000000000000000000000000000000000000000000000000000000007ff7ff 11,#0000000000000000000000000000000000000000000000000000007ff7ff7ff7ff 11,#0000000000000000000000000000000000000000000000007ff7ff7ff7ff7ff7ff 11,#0000000000000000000000000000007ff7ff7ff7ff7ff7ff7ff7ff7ff7ff7ff7ff 11,#0000000000000000000000007ff7ff7ff7ff7ff7ff7ff7ff7ff7ff7ff7ff7ff7ff 11,#0000000000000000007ff7ff7ff7ff7ff7ff7ff7ff7ff7ff7ff7ff7ff7ff7ff7ff 11,#0000000000007ff7ff7ff7ff7ff7ff7ff7ff7ff7ff7ff7ff7ff7ff7ff7ff7ff7ff 11,#0000007ff7ff7ff7ff7ff7ff7ff7ff7ff7ff7ff7ff7ff7ff7ff7ff7ff7ff7ff7ff ########## w12.iml 12,#0007fe4024024024024024024024024024024024024024024024027fe000 12,#0440aa11120a4448a24112221440881112224448881142224418a2514208 12,#000000fff800800800ffc004004004fc72042042043fc200200200fff000 12,#0003fc4024024624924924924924924924924924924924624024023fc000 12,#7df4515555555dd4017ff4015dd4517ff 12,#0007fe4024024f24924924924924924924924924924924f24024027fe000 12,#7df4515555555dd4017ff4015dd5555554517df000 12,#0007fe4025fa50a50a50a50a50a50a50a50a50a50a50a50a5fa4027fe000 12,#0000007ff7ff4514515dd5dd4014017ff7ff4014015dd5dd5555555555554514517df7df 12,#0000007df7df4514515555555555555dd5dd4014017ff7ff4014015dd5dd5555555555554514517df7df 12,#0000003ff3ff3033033333333333333f33f30030033ff3ff30030033f33f3333333333333033033ff3ff 12,#0000007df7df4514515555555555555dd5dd4014017ff7ff4014015dd5dd5555555555554514517df7df 12,#f0f108108108f0f000000000000000000000 12,#00300600c0180300600c0180300600c00801 12,#00900900900900f00000000f009009009009 12,#4018024052081100a0050088104a02401802 12,#80300700e01c0380700e01c0380700e00c01 12,#80340720e11c0b80700e01d0388704e02c01 12,#f0f108108108f0f000 12,#f9f090090090f9f000 12,#c03e0770e39c1f80f00f01f839c70ee07c03 12,#2493ff249 12,#9cfdcffcf1cf0cf04ffeffff00f007003001 12,#ffffff003003ff3ff3033033f33f33333333 12,#9cfdcffcf1cf0cf04ffeffff00f007003fff 12,#000000000fffffffff0000000000000000f80f80f80f80f80f8000000000000000ffffff 12,#000000000fffffffff00000000000000078478efff78e784000000000000000000ffffff 12,#264dfbdfb66650afff7de70eb6def7ef75fad9bf9fb9db9df9f79e7fe7fe7fe76ef9fa65 ########## w13.iml 13,#1fff00001fff00001fff00001fff 13,#1fff00001fff1fff1fff00001fff 13,#1fff1fff1fff00001fff1fff1fff 13,#10411041080204440248020805f409121151091205f4020805f409121151091205f4020802480444080210411041 13,#124912490db60248024801b00040004003b8044404441bbb0444044403b80040004001b0024802480db612491249 13,#12490db604440248024801b0024802480db613591f5f03181f5f13590db60248024801b00248024804440db61249 13,#000000000040000004a400000110000004a40000004000000000 13,#0001000200040008001000200040008001000200040008001000 13,#004000000040004004a400001319000004a40040004000000040 13,#0001000100010002000203840444043808000800100010001000 13,#10001000100018000f80008000400020003e0003000100010001 13,#1001080204040208011000a0004000a001100208040408021001 13,#1fff000100010001000100010001000100010001000100010001 13,#10010802040402a80110020800400208011002a8040408021001 13,#0001000100010002000207b40ca605bc08000800100010001000 13,#08001400100208050708089000400122021c1402080100050002 13,#18010401020101be004000400040004000400fb0100810041003 13,#1fff000300050009001100210041008101010201040108011001 13,#00000ffe0802080208020802080208020802080208020ffe0000 13,#10410842044402a8011002081c470208011002a8044408421041 13,#18610e41038100020002038404440438080008001038104e10c3 13,#1fff080304050209011100a1004100a101110209040508031001 13,#004000e001f003f8060c0e0e1e0f0e0e060c03f801f000e00040 13,#1fff00001fff00001fff00001fff00001fff00001fff00001fff ########## w14.iml 14,#03f303f303f303f303f303f303f3 ########## w15.iml 15,#0040015004e404441c47075c18e3004018e3075c1c47044404e401500040 15,#1004288a45d123e217f40f781e3c3c1e1e3c0f7817f423e245d1288a1004 15,#1004388e7d5f3e3e1c9c09c813e427f213e409c81c9c3e3e7d5f388e1004 15,#1004388e7ddf3ffe1ffc0f781e3c3c1e1e3c0f781ffc3ffe7ddf388e1004 ########## w16.iml 16,#060009801860261961869864061801900060 16,#3000300000000000000000000000000000000000000000000000000000000000 16,#00c000c0000000000000000000000000c000c000000000000000000000000000 16,#0000000000000000000000000030003000000000000000000000000030303030 16,#000000000000000000000000ff00ff0000000000000000000000000000000000 16,#00000000030003000000000000030003 16,#00c000c000c000c000c000c000c000c000000000000000000000000000000000 16,#0c000c0000000000000c000c00000000 16,#0000000000cc00cc003000300000000000000000cc00cc003000300000000000 16,#3030303000000000030003000000000030303030000000000003000300000000 16,#0003 16,#000c000c00000000cccccccc00000000000c000c000000000c0c0c0c00000000 16,#0c000c0000030003003000303000300003000300000c000cc000c00000c000c0 16,#0c000c000c000c00000c000c000c000c 16,#8001400220041008081004200240018001800240042008101008200440028001 16,#000000000c000c003f003f000c000c0000000000000c000c003f003f000c000c 16,#00030003303030300300030030303030 16,#8001400240024002781e081008108bd18bd108100810781e4002400240028001 16,#000c000c000c000c000c000c000c000c000c000c000c000c000c000cffffffff 16,#0c000c0033003300c0c0c0c00c3f0c3fc0c0c0c0330033000c000c000c000c00 16,#3224322448990000322400004899000032244899489932240000489900003224 16,#0000fc3f042004207c3e4002400240024002400240027c3e04200420fc3f0000 16,#0033 16,#00cf00cf000000003cc33cc300c000c03000300033cc33cc00000000300f300f 16,#00f0 16,#03cf03cf300030003030303000300030cf03cf03003000303030303030003000 16,#700e40024002700e08100810c66341824182c66308100810700e40024002700e 16,#8181c0032004300c1008118813c86426642613c811881008300c2004c0038181 16,#8811442222441188881144222244118811882244442288111188224444228811 16,#8001600620042004781e69960db01a581a580db06996781e2004200460068001 16,#8181c2432424381c100811889249c423c423924911881008381c2424c2438181 16,#8421524a8811524a8811542a8a51018001808a51542a8811524a8811524a8421 16,#8421524a8811524a8811542a8a51200420048a51542a8811524a8811524a8421 16,#00c300c3c30cc30c3000300000c000c00c330c33300c300cc0cfc0cf303f303f 16,#00cc00cc00300030cccccccc30003000cc00cc00cc30cc30cccccccc30cc30cc 16,#0c0f0c0f030003003cc03cc0c0ccc0cc3033303333c033c00c000c00030f030f 16,#0c300c30fc3ffc3f0000000000000000fc3ffc3f0c300c300c300c300c300c30 16,#0cc00cc0c00cc00c0f300f30cf00cf00003300333300330000cf00cf300f300f 16,#c0ccc0cc0c030c03030003000ccf0ccf330f330f0c000c00030c030c30333033 16,#c0ccc0ccc0ccc0ccc0ccc0cc3f0c3f0c0c000c000c000c000c000c003f0c3f0c 16,#0000fc3f042004207c3e40024ff2481248124ff240027c3e04200420fc3f0000 16,#724e4242424273ce08100810c66341824182c6630810081073ce42424242724e 16,#30003000ffffffff003000300030003000300030ffffffff3000300030003000 16,#ffffffffc300c300c300c300c300c300c300c300c300c300c300c300c300c300 16,#000000000ff00ff033cc33cc3c3c3c3c3c3c3c3c33cc33cc0ff00ff000000000 16,#03f0 16,#0fff0fff0fff0fff0c030c030c030c030c030c030c030c030c030c030c030c03 16,#c00cc00c0cc30cc333303330ccc0ccc0330c330c00330033cf0ccf0c0f330f33 16,#f33ff33f03000300c33cc33cc33cc33cc000c000cffccffcc000c00003000300 16,#030303033ff03ff0333033303330333003030303f03ff03f3033303330333033 16,#0c000c00fcfcfcfc000c000c03ff03ff000c000cfcfcfcfc0c000c00ff03ff03 16,#333333330ccc0ccc33333333c0c0c0c033333333cc0ccc0c33333333c0c0c0c0 16,#f03cf03c00000000fcfcfcfccccccccc3cf03cf0000000003cf03cf0cccccccc 16,#00f000f000f000f0ffffffffffffffff00f000f000f000f000f000f000f000f0 16,#3fff3fff0fff0fff03ff03ff00ff00ff003f003f000f000f0003000300000000 16,#fffcfffcfff0fff0ffc0ffc0ff00ff00fc00fc00f000f000c000c00000000000 16,#ffffffffc003c003c003c003c003c003c003c003c003c003c003c003ffffffff 16,#0ff0 16,#30cf 16,#c3ffc3ffc300c300c300c300c3ffc3ffffc3ffc300c300c300c300c3ffc3ffc3 16,#f3c0 16,#ff00ff00ff00ff00ff00ff00ff00ff0000ff00ff00ff00ff00ff00ff00ff00ff 16,#cc03cc03cc03cc03cc03cc03cc03cc03cfffcfffcfffcfff00000000cfffcfff 16,#000000003ffc3ffc3ffc3ffc3ffc3ffc3ffc3ffc3ffc3ffc3ffc3ffc00000000 16,#ffff7ffe3ffc1ff80ff007e003c00180018003c007e00ff01ff83ffc7ffeffff 16,#ccccccccf333f333cccccccc3f3f3f3fcccccccc33f333f3cccccccc3f3f3f3f 16,#f0c3f0c3fffffffff0c3f0c3ccccccccc3f0c3f0ffffffffc0c0c0c0cccccccc 16,#f3fff3ff03030303fff3fff3fc00fc00fff3fff303030303f3fff3ff00fc00fc 16,#fc0ffc0ff003f003fc0ffc0f3f3f3f3f0ffc0ffc03f003f00ffc0ffc3f3f3f3f 16,#fcfcfcfcc00fc00fcccfcccfcccfcccffcfcfcfc0fc00fc0cfcccfcccfcccfcc 16,#ff33ff33cf33cf33ff33ff333030303033ff33ff33cf33cf33ff33ff30303030 16,#ffffffff000c000cff0cff0cff0cff0cff0cff0cff0cff0c000c000cffffffff 16,#03f003f003f003f0ffffffffffffffffffffffff03f003f003f003f003f003f0 16,#cf30cf30cfffcfffcc00cc00cfffcfffff3fff3f03300330ff3fff3fcf30cf30 16,#f0fff0fffff0fff0fc30fc300c3f0c3f0fff0fffff0fff0f3f0c3f0c30fc30fc 16,#fccc 16,#ffc0 16,#fffffffff00ff00fcc33cc33c3c3c3c3c3c3c3c3cc33cc33f00ff00fffffffff 16,#ff3fff3fccccccccf3f3f3f3cccccccc3fff3fffccccccccf3f3f3f3cccccccc 16,#ff3fff3fff3fff3fff3fff3f000000003fff3fff3fff3fff3fff3fff00000000 16,#ccffccffccffccffccffccff3f3f3f3ff3c0f3c0c0ffc0fff3c0f3c03f3f3f3f 16,#3f3f3f3f3fff3fff300330033fff3fff3f3f3f3fff3fff3f03300330ff3fff3f 16,#ffffffff3c003c003cff3cff3cff3cff3cff3cff3cff3cff3c003c00ffffffff 16,#ffcfffcf33333333ffffffff33333333cfffcfff33333333ffffffff33333333 16,#cddbfeffb766ffbdcddbb766b766cddbffbdb766feffcddb7bffb766cddbcddb 16,#fffffefffabfec6feeef8ee3e28f9c73feff9c73e28f8ee3eeefec6ffabffeff 16,#0ff00ff00ff00ff0ffffffffffffffffffffffffffffffff0ff00ff00ff00ff0 16,#0fff0fff0fff0fffff0fff0fff0fff0f 16,#f3fcf3fcfcf3fcf3ff0fff0fff0fff0ffcf3fcf3f3fcf3fc0fff0fff0fff0fff 16,#f3fff3ffccffccff333f333fcccccccc333f333fccffccfff3fff3ffffffffff 16,#fff0 16,#ffffffff3fc03fc0fffffffffc03fc03ffffffffc03fc03fffffffff03fc03fc 16,#fff3fff3fff3fff3fff3fff3fff3fff3fff3fff3fff3fff3fff3fff300000000 16,#3f3f3f3fffffffffc0f3c0f3ffffffff3f3f3f3ffff3fff3f3f3f3f3fff3fff3 16,#ffffffff3f3f3f3f0c3f0c3fffffffffffffffffffffffff0c3f0c3f3f3f3f3f 16,#cfff 16,#cfffcfffffcfffcff3fff3fffffcfffcff3fff3f3fff3ffffcfffcfffff3fff3 16,#f76effffddfbfffff76efffffffff76effffddfbfffff76effffddfbffffffff 16,#fffffffffcfcfcfcffffffffffcfffcffffffffffcfcfcfcffffffffcfffcfff 16,#ffffffffffcfffcfffffffffcfffcfff 16,#ffffffffffffffffffffffffffcfffcfffffffffffffffffffffffffcfcfcfcf 16,#ffffffffffffffffffffffffff3fff3fffffffffffffffffffffffff3fff3fff 16,#cfffcfffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 16,#00000000000000000000000000000000000f000f000f000f0000000000000000000000000000000000000000000000000f000f000f000f000000000000000000 16,#00000000000000000000000000000000ff00ff00ff00ff00ff00ff00ff00ff000000000000000000000000000000000000ff00ff00ff00ff00ff00ff00ff00ff ########## w17.iml 17,#1000108002040040200801010008200044000280001000028000440008200101002008040040800210001 17,#001000028000440008200101002108041040428418fe30428404104021080101000820004400028000100 17,#10101081020410402108011100092000540002801fd7f0028000540009200111002108041040810210101 17,#1000118003080020c006040040482407ffc0682c0701c0682c07ffc04824040040c006080021800310001 17,#10921085420438402108011101092108542042841fd7f0428408542109210111002108043840854210921 17,#100010fffe000000c006040040482407efc0682c010100682c07efc04824040040c006000000fffe10001 17,#14925085421438502108011101092108542042841fd7f0428408542109210111002108143850854214925 ########## w18.iml 18,#20fc12102122011240092800530003200010000000000000000000020001300032800524009220112102120fc1 18,#132241322404899000001322400000048990000013224048990489913224000000489900000132240000004899 18,#20fc1210212201124009280053000320001000003ffff000000000020001300032800524009220112102120fc1 18,#20001110220a854044880a314114a208844054a80201002010054a808844114a20a314044880a8541102220001 18,#20841110220a014040080a314114a208844054a80231002310054a808844114a20a314040080a0141102220841 18,#1122604c8904c89112260210004c8908040112262001004c89112261122604c8920010112260804004c8902100 18,#20fc1110220a014040080a314314a300840014a00231002310014a000840314a30a314040080a0141102220fc1 18,#000000fffc080040844408aa40844408104081040911408924097d408444086c40810408284085441f93e00100 18,#20fc1210212201124009280053000320001000003ffff3ffff0000020001300032800524009220112102120fc1 18,#157aa2186103330260190c30c3800710302000002ab552ab550000010302380070c30c260190333021861157aa 18,#0c9990c99933264122640c99900000332640c8910c99933264332640c9990c89133264000000c9991226433264 18,#20fc12186123031260192c00d3800730003000003ffff3ffff0000030003380072c00d26019230312186120fc1 18,#20fc121b6123331263192c30d3830730303003003ffff3ffff0030030303383072c30d263192333121b6120fc1 18,#3fcff21b6123331263192c30d3830730303003001fcfe1fcfe0030030303383072c30d263192333121b613fcff 18,#3ffff21b6123331263192c30d3830730303003003ffff3ffff0030030303383072c30d263192333121b613ffff 18,#19b3619b3626ccd264c919b363d5ea26ccd1933219b3626ccd26ccd19b361933226ccd3d5ea19b36264c926ccd 18,#26edd1bb371bb3726edd3fdef1bb373f7fb26edd3dffe1bb3726edd26edd1bb373dffe26edd3f7fb1bb373fdef 18,#37bff2cddb1feff3b7663ffbd2cddb3b7663b7662cddb3ffbd3b7661feff2cddb37bff3b7662cddb2cddb3b766 18,#3f76e3ffff2ddfb3ffff3f76e3ffff3ffff3f76e3ffff2ddfb3ffff3f76e3ffff2ddfb3ffff3ffff2ddfb3ffff 18,#3effd3ffff3fbf73ffff3ffff3ffff3ffff3ffff3ffff3fbf73ffff3effd3ffff3ffff3ffff3ffff3ffff3ffff ########## w19.iml 19,#4c70f4c70f4c70f4c70f4c70f4c70f4c70f4c70f4c70f4c70f4c70f4c70f4c70f4c70f4c70f4c70f4c70f4c70f4c70f4c70f4c70f4c70f4c70f 19,#7871978719787197871978719787197871978719787197871978719787197871978719787197871978719787197871978719787197871978719 19,#40001100040401001040005000000000880000000104000000010400000000880000000050001040040101000440001 19,#40001400012603221042320261c01c000000000000000000000000000000000001c01c3202621042260324000140001 19,#4000110204040100124020502080082088200000012402a52a012400000020882080082050201240040101020440001 19,#400013174608008040100202001040088880050048a896800b48a890050008888010400202004010080083174640001 19,#49249248921252409248048900252001240008800050000200005000088001240025200489009248125242489249249 19,#40001400012603221042320261c01c00d80030602222260503222220306000d801c01c3202621042260324000140001 19,#40201407012623221042320261c01c00d80030602222270507222220306000d801c01c3202621042262324070140201 19,#407011820c0623001240207021820c24a9200200412417e53f412410020024a921820c2070201240062301820c40701 19,#4050131dc6080080401002020010400f8f80850868f8b2252268f8b085080f8f80104002020040100800831dc640501 19,#55555000005555500000555550000055555000005555500000555550000055555000005555500000555550000055555 19,#4000131fc6080080401002020010400f8f80850868f8b6870b68f8b085080f8f80104002020040100800831fc640001 19,#0000024d92645130088030006260320c898318c6462310451046231318c60c8982603230006008806451324d9200000 19,#2000224d92645130088030006260320c898718c74e039040104e039718c70c8982603230006008806451324d9220002 19,#0000000000000000fbf03ff0c7fff27138a625c5629c5629c5629c5629c57178a7f3f23fc0c0fbf0000000000000000 19,#7ffff3fffe1fffc0fff807ff003fe001fc000f800070000200007000088001240025200489009248125242489249249 19,#7ffff40001400014fff9480094800949fc9490494904949249490494904949fc948009480094fff940001400017ffff 19,#7ffff3fffe1fffc0fff807ff003fe001fc000f8000700002000070000f8001fc003fe007ff009248125242489249249 19,#7ffff3fffe1fffc0fff807ff003fe001fc000f8000700002000070000f8001fc003fe007ff00fff81fffc3fffe7ffff 19,#0fff008a2836db44fffa4d14d7edbf5861968a297edbf4b0cb4d14d7edbf5861968a297edbf4fffb4514436db40fff8 19,#0eba835d744fffa7dd7d6ebaf586196ebaf7dd7d4b0ca7dd7d6ebaf586196ebaf7dd7d4fffa35d740eba80fff000000 19,#0fff00eba835d744fffa7dd7d6ebaf586196ebaf7dd7d4b0ca7dd7d6ebaf586196ebaf7dd7d4fffa35d740eba80fff0 19,#07df00e79e13cf22fffa7bcfb5e79f5c51d5e79f7bcfb2a8aa7bcfb5e79f5c51d5e79f7bcfb2fffa13cf20e79c07df0 ########## w20.iml 20,#0000000000000000000000000000000000000000000000000000000000000000000000000000000003fff03fff03fff03fff 20,#000000000000000000000ffc00ffc00c0c00c0c00c0c00c0c00c0c00c0c00ffc00ffc0000000000000000000000000000000 20,#60006b000dd000b600060801004020020400108000f00009000090000f000108002040040200801060006d000bb000d60006 20,#ffffffffff000030000300003000030000300003000030000300003000030000300003000030000300003000030000300003 20,#7000eb000dd000be0007006000090000900006000606009090090900606000600009000090000600e0007d000bb000d7000e 20,#7000eb000dd000bf000f0801004020020400108000f00009000090000f0001080020400402008010f000fd000bb000d7000e 20,#f000ff000ff000ff000f0000000000000000000000f0000f0000f0000f0000000000000000000000f000ff000ff000ff000f 20,#60006b000dd000b6000608610049200294001680069600969009690069600168002940049200861060006d000bb000d60006 20,#000000000000000000000ffc00ffc00ffc00ffc00ffc00ffc00ffc00ffc00ffc00ffc0000000000000000000000000000000 20,#7000eb000dd000bf000f086100492002940016800696009690096900696001680029400492008610f000fd000bb000d7000e 20,#00000000003fffc3fffc3000c3000c3000c3000c3000c3000c3000c3000c3000c3000c3000c3000c3fffc3fffc0000000000 20,#000fc000fc3f0003f000 20,#64026b204dd108b6090608610849214294221684169680969009690169682168442942849210861060906d108bb204d64026 20,#f000ff000ff000ff000f00f0000f0000f0000f000f0f00f0f00f0f00f0f000f0000f0000f0000f00f000ff000ff000ff000f 20,#000000000000000000000fff00fff00fff00fff00fff00fff00fff00fff00fff00fff00fff00fff000000000000000000000 20,#f0f0ff0f0ff0f0ff0f0f00f0000f0000f0000f0000f0000f0000f0000f0000f0000f0000f0000f00f0f0ff0f0ff0f0ff0f0f 20,#ffffffffffc0003c0003c0003c0003c0003c0003c0003c0003c0003c0003c0003c0003c0003c0003c0003c0003ffffffffff 20,#4c9994c99933264122644c99900000332644c8914c99933264332644c9994c89133264000004c99912264332644c9994c999 20,#00000000003fffc3fffc3000c3000c33fcc33fcc330cc330cc330cc330cc33fcc33fcc3000c3000c3fffc3fffc0000000000 20,#000ff000ff000ff000ff000ff 20,#000ff000ffff000ff000 20,#00f0f00f0f00f0f00f0f0f00f0f00f0f00f0f00f0f0f00f0f00f0f00f0f0f00f0f00f0f00f0f00f0f0f00f0f00f0f00f0f00 20,#a82a0a82a0a82a0a82a0a82a0affffa8000affffa8000affffa82a0a82a0a82a0a82a0a82a0ffebf002a0ffebf002a0ffebf 20,#f000ff000ff000ff000f0fff00fff00fff00fff00f0f00f0f00f0f00f0f00fff00fff00fff00fff0f000ff000ff000ff000f 20,#000000000000000000000fffc0fffc0fffc0fffc0fffc0fffc0fffc0fffc0fffc0fffc0fffc0fffc0fffc0fffc0000000000 20,#3ffff3ffff00003000033fff33fff3300333003333f3333f33330333303333ff333ff330003300033ffff3ffff0000000000 20,#003ff003ffffc00ffc00 20,#c0cfcc0cfc3f3033f303 20,#f0f0ff0f0ff0f0ff0f0f00f0000f0000f0000f00ffffffffffffffffffff00f0000f0000f0000f00f0f0ff0f0ff0f0ff0f0f 20,#fffff80000bfffea0002afffaa800aabfeaaa02aaafaaaa8aaaaaaaaaaaaaaaaaaabaaaa82aaafeaaa00aabffaa8002afffe 20,#99b3699b3666ccd664c999b36bd5ea66ccd9933299b3666ccd66ccd99b369933266ccdbd5ea99b36664c966ccd99b3699b36 20,#00fff00fff00fff00fff00fff 20,#ffffffffffffffffffff0f00f0f00f0f00f0f00f0f00f0f00f0f00f0f00fffffffffffffffffffff0f00f0f00f0f00f0f00f 20,#e0703e0f83e1fc311fc40fff80fff80fff87ffff7fffffffffff8ffff8fffffff7ffff7ffff1fff807ff807ff809fc471fc3 20,#0ffff0ffff0ffff0ffff0ffff 20,#ffd7fff97fff5bfff5bfff5bfff97fffd7fe017f9fd607fa1fffaf8ff38eff4b6febd9fe7dffffdffffdfffffffffbffffbf ########## w21.iml 21,#1c00071c00071c00071c00071c00071c00071c0007 21,#1c00071c00071c00071c00071c0e071c1f071c1f071c1f071c0e071c00071c00071c00071c00071c00071c00071c00071c0e071c1f071c1f071c1f071c0e07 21,#1e000f1e000f1e000f1e000f1e000f1e000f1e000f 21,#1c00071c00071c00071c00071c00071c00071c7f871c4c871c4c871c40871c4c871c4c871c4c871c40871c4c871c4c871c7f871c00071c00071c00071c0007 21,#1c00071c00071c00071c1f071c1f071c1f071c1f071c1f071c00071c00071c00071c00071c00071c00071c00071c1f071c1f071c1f071c1f071c1f071c0007 21,#1c08071c3e071c3e071c3e071c3e071c08071c08071c08071c1c071c3e071c1c071c08071c08071c3e071c3e071c3e071c3e071c08071c08071c08071c1c07 21,#1ffbfe100a0217eafa142a8a15aa2a14abea16a80a10affa1fa002002dfe1fed0010017e17fd4214055a15f54a15156a14550a17d5fa1014021ff7fe000000 ########## w22.iml 22,#202101007f80181e060e001c01806000c0c000ad4002619002a15007a17806619806619807a17802a15002619000ad4000c0c00180600e001c181e06007f80202101 22,#202d01007f801812060e0c1c01806000c0c030ad4302619002a15007a17828618528618507a17802a15002619030ad4300c0c00180600e0c1c181206007f80202d01 22,#3ffff03ffff00000300000303fff303fff300003300003300ff3300ff3300c33300c33300c03300c03300fff300fff300000300000303ffff03ffff0000000000000 22,#07e03e0838410fedbf1837611f1a4f3ccc993f6d2731b92c00da580052900c72931e24a71e25270c2923004a70005a5000d2d831a4ac3f65b71fc99f1812c00c3761 22,#01803007863e1f0f1f3b0f1d33061533803532c0693371d9398f332c61e612387d19861b0c71c61b0c3337c3892c7046399e333371c932c06d338635330f151b0f1f 22,#3fffff25a5a525a5a53a5a5a25a5a53a5a5a3a5a5a25a5a53a5a5a25a5a525a5a53a5a5a25a5a53a5a5a3a5a5a25a5a53a5a5a25a5a525a5a53a5a5a25a5a53a5a5a 22,#3fffff25c03a25c03a3a3fc525e67a3be07d3be07d3bf9fd27999e27999e27999e241f8224198227fffe27fffe2606062606063bc63d3bc63d25c63a3a7fe525801a 22,#3fffff25be5a25be5a3fdbbd25fbe63e7bdf3e7bdf27a1bd3bc07b3d80263d802626001d3f803e3c00073f807e3bc06b27c07d3fb1a73fbba7267bde3dda6527bbbe ########## w23.iml 23,#60410310a28409144806083001f7c00114406d555b01144001f7c006083009144810a284604103 23,#6008031008041036046c491b1249241249246db6db1249241249246c491b103604100804600803 23,#4036012055023055064db6d9227f222241225db6dd224122227f224db6d9305506205502403601 23,#0000003ff7fe2014022fd5fa28550a2b556a28550a2fd5fa2014023ff7fe0000003ff7fe2014022fd5fa28550a2b556a28550a2fd5fa2014023ff7fe000000 23,#0000003ffffe2000022ffffa28000a2bffea2a002a2affaa2a80aa2abeaa2aa2aa2abeaa2a80aa2affaa2a002a2bffea28000a2ffffa2000023ffffe000000 23,#0000003fffff2000002fffff2800002bffff2a00002affff2a80002abfff2aa0002abfff2a80002affff2a00002bffff2800002fffff2000003fffff000000 23,#0002aa7ffeaa0000aa7fffaa00002a7fffea00000a7ffffa0000027ffffe0000003fffff2000002fffff2800002bffff2a00002affff2a80002abfff2aa000 23,#7fffff0000000000007fffff7fffff0000000000000000007fffff7fffff7fffff0000000000000000000000007fffff7fffff7fffff7fffff 23,#7fffff7fffff7fffff7fffff0000000000000000000000007fffff7fffff7fffff0000000000000000007fffff7fffff0000000000007fffff 23,#0000003ff7fe2014022ff7fa28140a2bf7ea2a142a2af7aa2a94aa3ff7fe0000003ff7fe2a94aa2af7aa2a142a2bf7ea28140a2ff7fa2014023ff7fe000000 23,#0208200208200236200008000008007200270008000008000036001049041049046db6db104904104904003600000800000800720027000800000800023620020820020820 23,#42082122082212082400410000410072412701b6c00122400e003801b6c001224070080701224001b6c00e003801224001b6c0724127004100004100120824220822420821 23,#04001008000811ffc4220022440011087f08108084110044121c24122224124124124924124124122224121c24110044108084087f0844001122002211ffc4080008040010 23,#4180c12108421108440900480580d00036007d005f4480910049000236200222203049060222200236200049004480917d005f0036000580d00900481108442108424180c1 23,#6c001b4980c91100446c001b4800090236203180c62100420049000236200222200049000222200236200049022100463180c00236204800096c001b1100444980c96c001b 23,#0180c00100400180c00080800180c001004077ebf75da2dd0108400188c0001c00017740001c000188c00108405da2dd77ebf70100400180c00080800180c00100400180c0 23,#1249242249224449110888881108446208230414100822087041070088800114407e2a3f011440008880704107082208041410620823110844088888444911224922124924 23,#0000000000000000000000000000007c7f8f1e925e0f213c07c0f807c0f809e1e412f3d209e1e404c0c80640980f213c1e925e7c7f8f000000000000000000000000000000 23,#4236212222221249240222200236207c081f0300600200201088846c551b4422111249244422116c551b1088840200200300607c081f023620022220124924222222423621 23,#0249200249200041000388e00288a06e773b0949480c49187380e7023e200236206da2db023620023e207380e70c49180949486e773b0288a00388e0004100024920024920 23,#1088841188c46000030e77380bdde80c00182580d26500530c6b180855080c22186441130c22180855080c6b186500532580d20c00180bdde80e77386000031188c4108884 23,#000800001c00003e00007f0000f78001e3c003c1e00780f00f08781e1c3c3c3e1e78770f3c3e1e1e1c3c0f08780780f003c1e001e3c000f780007f00003e00001c00000800 23,#001c00003e0000770000e38001c1c003c1e00780f00f80f81f007c3f007e7e003f7e003f7e003f3f007e1f007c0f80f80780f003c1e001c1c000e380007700003e00001c00 23,#001c00003e00007f0000ff8001ffc003ffe007e3f00f80f81e003c38000e70000760000370000738000e1e003c0f80f807e3f003ffe001ffc000ff80007f00003e00001c00 23,#410841208882108884084908044910024920412a4130be860e7f3801ffc000ff807fffff00ff8001ffc00e7f3830be86412a41024920044910084908108884208882410841 23,#70000778000f7c001f3e003e1f007c0f80f807c1f003e3e001f7c000ff80007f00003e00007f0000ff8001f7c003e3e007c1f00f80f81f007c3e003e7c001f78000f700007 23,#003e00003e0001f7c001b6c001b6c00fb6f80db6d80db6d87db6df6db6db6db6db6db6db6db6db6db6db7db6df0db6d80db6d80fb6f801b6c001b6c001f7c0003e00003e00 ########## w24.iml 24,#0000f000030cf00c630c31f8e3c7fff81f073ffc000ff000 24,#0000000000003ff3ff3ff3ff30330330330333333333333333333333333333f3f333f3f33000033000033fffff3fffff30000330000333f3f333f3f33333333333333333333333333033033033033ff3ff3ff3ff 24,#0000000000000000000000000000000000000000000000000000000000000000004adb524adb52000000000000000000000000000000000000000000000000000000000000000000 24,#000000000000000000000000000000000000000000000000000000000040000358401b0240d8021ac000020000000000000000000000000000000000000000000000000000000000 24,#000000001800000000000000001800000000001800000000001800001800000000001800001800000000001800001800000000001800000000001800000000000000001800000000 24,#80100140100220280410aa08094d1004442002444001388000910001d70001550000390000380001550001d70000910001388002444004442009451010a608202804402802801001 24,#00000000000000000100000100000100000300000300000600000e00003e0000fc00fffc03fff807fff00fffe01fffc03fff003f00007c0000700000600000c00000c00000800000 24,#000000000000800000800000800000c00000c000006000007000007c00003f00003fff001fffc00fffe007fff003fff800fffc0000fc00003e00000e000006000003000003000001 24,#000000000000000000000000000000203c04183c18043c20043c20021840019980005a00005a003c3c3c3ffffc3c3c3c3c3c3c005a00019980021840021840043c20183c18203c04 24,#0000000000000000007ffffe7ffffe6000066000066000066000066000066000066000066000066000066000066000066000066000066000066000066000066000066000067ffffe 24,#00000000000000000076db6e76db6e76db6e00000070000e70000e00000070000e70000e00000070000e70000e00000070000e70000e00000070000e70000e00000076db6e76db6e 24,#82104144102228281410aa08294d1444442282444141388220910411d70809551004392004382009551011d70820910441388282444144442229451410a608282814442822821041 24,#0000000000000000000000003c003c3c003c3e007c3e007c3e007c1f81f80381c001c38001c380003c00003c00003c00003c0001c3800381c01f81f81f81f83e007c3e007c3c003c 24,#00000000000000000000180000180010080808081006086006086001f780817e8161e78661e7861e81f80781601ee7f81ee7f861fe86809701017e80017e80060860080810000800 24,#80002160002e5c00324800624400c664284f5c44780744c001ed0000c2c0066520093b00019320093cc006460000ab000145805f44f864284a4600c6840066980032ac002ac00007 24,#000000000000000000ffffffffffffffffff0000000000000000000000000000000700e00700e00f81f00f81f00700e00700e0000000000000000000000000000000ffffffffffff 24,#000000000000000000ffffffffffffffffff00000000000000000000000001ffc001004001004001ddc001ddc001004001004001ffc0000000000000000000000000ffffffffffff 24,#00000000000000000004081004081033086608888804491004491003496070be87087f080f7f7800ff807fffff00ff8000ff800f7f7870be87014940024920044910088888010840 24,#301008481816c83c1388f71170660e002600002600003c001018081818183f18f461ff83c1ff823f18fc1c1878101808003c0000640000240070660e88e711c83c13281816100808 24,#00000000000038000e38000e38000e38000e38000e38000e387f8e384c8e384c8e38408e384c8e384c8e384c8e38408e384c8e384c8e387f8e38000e38000e38000e38000e38000e 24,#0000000000000000003ffffe3ffffe3fc1fe3f007e3e003e3c001e38000e38000e30000620000220000220000220000230000638000638000e3c001e3e001e3f003e3fc1fe3ffffe 24,#0000000000000000003ffffe3ffffe3ffffe38000e38000e38000e38000e38000e38000e38000e38000e38000e38000e38000e38000e38000e38000e38000e38000e3ffffe3ffffe 24,#00000000000000000076db6e76db6e76db6e00000070180e703c0e007e0070ff0e71e78e03c3c07781ee7781ee03c3c071e78e70ff0e007e00703c0e70180e00000076db6e76db6e 24,#0000000000000000003ffffe2000022ffffa28000a2bffea2a002a2affaa2a80aa2abeaa2aa2aa2aaaaa2aaaaa2aaaaa2abaaa2a82aa2afeaa2a00aa2bffaa28002a2fffea20000a 24,#00000000000000000076db6e76db6e76db6e00000070080e701c0e003e00707f0e70ff8e01ffc073ffee73ffee01ffc070ff8e707f0e003e00701c0e70080e00000076db6e76db6e 24,#0000000000000000003ffffe3ffffe3ffffe38000e38000e387f8e384c8e384c8e38408e384c8e384c8e384c8e38408e384c8e384c8e387f8e38000e38000e38000e3ffffe3ffffe 24,#0000000000000000003ffffe3ffffe3ffffe3ffffe3c001e3c001e3c001e3c001e3c001e3c001e3c001e3c001e3c001e3c001e3c001e3c001e3c001e3c001e3ffffe3ffffe3ffffe 24,#0000000000000000003ffffe3ffffe3ffffe3800ce3800ce3800ce3ffffe3980ce3980ce3980ce3980ce3980ce3980ce3980ce3980ce3fffce3980ce3980ce3980ce3ffffe3ffffe 24,#0000000000003fffff3fffff30330330330333f3f333f3f33000033000033fffff3fffff30000330000333f3f333f3f33333333333333333333333333033033033033ff3ff3ff3ff 24,#000000000000000000381c0e383e0e387f0e047f1003ffe003ffe003ffe01ffffc1ffffc3ffffe3fe3fe3fe3fe3ffffe1ffffc1ffffc03fff003ffc003ffc0047f20387f1c383e1c 24,#0000000000000000003ffffe3ffffe3ffffe383e0e383e0e383e0e383e0e383e0e3fc1fe3fc1fe3fc1fe3fc1fe3fc1fe3fc1fe383e0e383e0e383e0e383e0e383e0e3ffffe3ffffe 24,#3fffff6e8c7f8e10d1c862f1b06e33b0d61d68b87f6db9e3c972e78b58a73f71bd1e61392ee3f306e74726dd0d9eb82d5c00ef600f2bc6f03fd992f7fbf52382577d8423d5f81c64 24,#0000000000008442216e66733ffffe3ffffe1ffffc8e7e798e7e79c7fff1c3e3e363c1e2719cc671ffc678ff8e787f0efc7f1ffe3e3f1e1c380f1c708008014000027ffffe7ffffe 24,#26381fabc421beea41c4afdfef499bfc0f62d4f004f70038b41d78b0bb66e2e763cfc7779c867fbd8efde51ad2e74e90c79db6fe1d15b86b0ecc760c8f46128b0873fe3176fffffe 24,#00000000000000000001ffc001ffc001ffc001ffc001ffc001ffc03ffffe3ffffe3ffffe3ffffe3ffffe3ffffe3ffffe3ffffe3ffffe3ffffe01ffc001ffc001ffc001ffc001ffc0 24,#0f0f0f0f0f0f0f0f0f0f0f0fff0f0fff0f0fff0f0fff0f0f000f0f000f0f000f0f000f0fffff0fffff0fffff0fffff0f00000f00000f00000f00000fffffffffffffffffffffffff 24,#0000000000000000003ffffe3ffffe3ffffe381c0e383e0e383e0e387f0e39ffce3bffee3bffee3ffffe3ffffe3bffee3bffee39ffce387f0e383e0e383e0e381c0e3ffffe3ffffe 24,#0000000000000000003ffffe3ffffe3ffffe3ffffe3c3e1e3c3e1e3c3e1e3c3e1e3fc1fe3fc1fe3fc1fe3fc1fe3fc1fe3fc1fe3c3e1e3c3e1e3c3e1e3c3e1e3ffffe3ffffe3ffffe 24,#00000000000000000001ffc001ffc001ffc003ffe007fff007fff03ffffe3ffffe3ffffe3ffffe3ffffe3ffffe3ffffe3ffffe3ffffe3ffffe07fff007fff003ffe001ffc001ffc0 24,#0000000000000000003ffffe3ffffe3ffffe38000e3bffee3bffee3bffee3b80ee3bbeee3bbeee3bbeee3bb6ee3bb6ee3bb6ee3b86ee3bfeee3bfeee3bfeee3800ee3fffee3fffee 24,#0000000000000000003ffffe3ffffe3ffffe381c0e387f0e387f0e387f0e3bffee3bffee3bffee3ffffe3ffffe3bffee3bffee3bffee387f0e387f0e387f0e381c0e3ffffe3ffffe 24,#c1f7267f3efeffe7e97ff9f65ffe66bc0f6fbc0f2f5ffe667ff9f6ffe7e97f3efec1f726 24,#0000000000000000003ffffe3ffffe3ffffe3ffffe3ffffe3ffffe3ffffe3ffffe3ffffe3ffffe3ffffe3ffffe3ffffe3ffffe3ffffe3ffffe3ffffe3ffffe3ffffe3ffffe3ffffe ########## w25.iml 25,#1000001080000204000040200008010001000800200040040002008000101000008200000440000028000001000000280000044000008200001010000200800040040008002001000100200008040000408000021000001 25,#1040041082008204101040208208010441000828201041041082008204101040208208010441000828200041040008282001044100208208041010408200821041041008282001044100208208041010408200821040041 25,#1044441082288204111040208208010441000828201041041082008204101040208208110441108828220441044088282211044110208208041010408200821041041008282001044100208208041110408228821044441 25,#000000300000010000001000000300000010000009000001f0000009000004100000e3000004100002490000fff0000249000104100038e300010410009209001ff1f0009209004104100e38e3004104112492491ffffff 25,#1047c41082388204111040208208010441000828201041041082108204111040209208110541118838231c7ffc7188382311054110209208041110408210821041041008282001044100208208041110408238821047c41 25,#00000001ffc7ff00044000004400000440003fc7f802000080200008020000803ffff8000000000000001ffffff0000000000000003ffff802000080200008020000803fc7f80004400000440000044001ffc7ff0000000 25,#10000011807c03080c60208145020c17d06041010404101040210108020ee0801628d001c827003b01b8014005003b01b801c827001628d0020ee080210108041010404101040c17d060814502080c6021807c031000001 25,#0c000061c038071806c03000c600038823804783c404038040203808018383010c006118600c30c339860c0aa060c3398618600c310c006101838300203808040380404783c40388238000c6001806c031c038070c00006 25,#10000011806c03080c60208145020c16d06040000404101041210109120ee0911628d111c827113b01b9114005113b01b911c827111628d1120ee091210109041010404000040c16d060814502080c6021806c031000001 25,#1001001180100308e10e208a10a209e10f20a1110a0409204020540801fbbf0000ba0000028000606c0c1ffc7ff0606c0c0002800000ba0001fbbf0020540804092040a1110a09e10f208a10a208e10e218010031001001 25,#12000091906c13088c62208545420c16d06040000404101041210109120ee0901628d011c827103b01b8114005103b01b811c827101628d0120ee091210109041010404000040c16d060854542088c6221906c131200009 25,#00000001ffc7ff1004401100440110044011ffc7ff02000080200008020000803ffff8000000000000001ffffff0000000000000003ffff80200008020000802000081ffc7ff1004401100440110044011ffc7ff0000000 25,#1111000111100011110001111fff1111000111100011110001111fff1111000111100011110001111fff1fff8881000888100088810008881fff8881000888100088810008881fff8881000888100088810008881ffffff 25,#00000001ffc7ff10044011004401100440113fc7f912000091200009120000913ffff9100000110000011ffffff1000001100000113ffff912000091200009120000913fc7f91004401100440110044011ffc7ff0000000 25,#0c044061ffbbff1806c03000c600038823804783c404038040202808018383010c006118600c30c33986040aa040c3398618600c310c006101838300202808040380404783c40388238000c6001806c031ffbbff0c04406 25,#1001001180540308e7ce208a54a209e10f20a1110a0409204020540801fbbf0100ba0110028011606c0d1ffc7ff1606c0d1002801100ba0101fbbf0020540804092040a1110a09e10f208a54a208e7ce218054031001001 25,#00000001ffc7ff1004401100440110044011ffc7ff0200008020000803ffff803ffff8000000000000001ffffff0000000000000003ffff803ffff8020000802000081ffc7ff1004401100440110044011ffc7ff0000000 25,#1ffffff1249249104104918e38e3104104112092091f1ff1f1209209104104118e38e3104104112482491ffcfff1248249104104118e38e3104104112092091f1ff1f1209209104104118e38e3104104112492491ffffff 25,#1ffffff1249249104104918e38e3104104112092091f1ff1f1209209104104118e38e3104104112482491ffefff1248249104104118e38e3104104112092091f1ff1f1209209104104118e38e3104104112492491ffffff ########## w26.iml 26,#020001004000080a00014110002220800410040080002010000102000008400000480000048000008400001020000201000040080208004111000220a0001404000080200010 26,#2aafffc0aa15543abfffc02815543effffc00015543effffc02815543abfffc0aa15542aafffc2aa95542aa95543fff5542aa85503fffd5c2aa81403ffff7c2aa80003ffff7c2aa81403fffd5c2aa85503fff5542aa95542aa9554 ########## w27.iml 27,#20000023100046100d8047008807001040008000080aa22a80000000080200800020000002000612224338d258e1cc899c38d258e612224300020000002000080200800000000aa22a8080000800104007008807100d80431000462000002 27,#22202223260326114d94471888c7001040008000080aa22a800c018008e238801a22c00002000612224338d258e140881438d258e6122243000200001a22c008e238800c01800aa22a80800008001040071888c7114d94432603262220222 27,#40b268170a228708e238808421080402010460203161820c33042106604210340c218107870f00c3fe180862308180200c08623080c3fe1807870f040c21816042103304210661820c346020310402010084210808e238870a228740b2681 27,#4000001600000325d8dd220070027a2522f15edbd4194014c180000c0800008160f83417edbf4250a85201a8ac0208008201a8ac0250a85217edbf4160f8340800008180000c194014c15edbd47a2522f200700225d8dd260000034000001 ########## w28.iml 28,#92024800000000920248000000009202480000000092024800155555920000000000009355555000000092000000155555920248000000009202480000000092024800000000920248055540550002480000000055564d50000000000248055560d5 28,#920248092024809202480920248092024809202480920248093fffff9200000920000093fffff9200000920000093fffff9202480920248092024809202480920248092024809202480fffe4ff00024800002480fffe4ff00024800002480fffe4ff 28,#aa02a80aa02a80aa02a80aa02a80aa02a80aa02a80aa02a80abfffffaa00000abfffffaa00000abfffffaa00000abfffffaa02a80aa02a80aa02a80aa02a80aa02a80aa02a80aa02a80fffeaff0002a80fffeaff0002a80fffeaff0002a80fffeaff ########## w29.iml 29,#010444100104a41002071c080202a8080401f004040000040400000404000004042000840620008c01c040700001100000031800000ce60000084200000ce600000318000001100001c040700620008c042000840400000404000004040000040401f0040202a80802071c080104a41001044410 29,#010444100104a41002071c080202a8080401f0040400000404000004041fff04042000840620008c01c040700101101001031810010ce61001084210010ce610010318100101101001c040700620008c04200084041fff0404000004040000040401f0040202a80802071c080104a41001044410 29,#11004011090040120600400c0300401804804024054040541ca040a704504144042842840624448c09c040720001500000035800000ce6001ff843ff000ce600000358000001500009c040720624448c04284284045041441ca040a70540405404804024030040180600400c0900401211004011 29,#110444110904a41206071c0c0302a8180481f024054110541ca0a0a704504144042842840624448c09c040720001100010031801080ce60207f843fc080ce602100318010001100009c040720624448c04284284045041441ca0a0a7054110540481f0240302a81806071c0c0904a41211044411 29,#1fffffff100150011001b001100150011001b001100150011001b001100150011001b001100150011001b001100150011fffbfff155555551aaaaaab155555551fffbfff100150011001b001100150011001b001100150011001b001100150011001b001100150011001b001100150011fffffff 29,#1fffffff180150031401b005120150091101b011108150211041b041102150811011b101100952011005b401100358011fffbfff155555551aaaaaab155555551fffbfff100358011005b401100952011011b101102150811041b041108150211101b011120150091401b005180150031fffffff 29,#1fffffff1c0150071e01b00f1701501d1381b03911c1507110e1b0e1107151c11039b381101d5701100fbe0110075c011fffbfff155555551aaaaaab155555551fffbfff10075c01100fbe01101d57011039b381107151c110e1b0e111c150711381b0391701501d1e01b00f1c0150071fffffff 29,#1fffffff1c0150071e01b00f1701501d13ffbff911ffdff111e1b0f111f151f111b9b3b1119d5731118fbe3111875c311fffbfff155555551aaaaaab155555551fffbfff11875c31118fbe31119d573111b9b3b111f151f111e1b0f111ff5ff113ffbff91701501d1e01b00f1c0150071fffffff ########## w30.iml 30,#3fffffff0000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001 30,#20000001100000020800000404000008020000100100002000800040004000800020010000100200000804000004080000021000000120000000c0000000c0000001200000021000000408000008040000100200002001000040008000800040010000200200001004000008080000041000000220000001 30,#28000005000000002800000505000028000000000500002800a001400000000000a0014000140a000000000000140a000002d000000528000002100000021000000528000002d00000140a000000000000140a0000a001400000000000a00140050000280000000005000028280000050000000028000005 30,#3fffffff0000000300000005000000090000001100000021000000410000008100000101000002010000040100000801000010010000200100004001000080010001000100020001000400010008000100100001002000010040000100800001010000010200000104000001080000011000000120000001 30,#28000005100000022800000505000028020000100500002800a001400040008000a0014000140a000008040000140a000002d000000528000002d0000002d000000528000002d00000140a000008040000140a0000a001400040008000a00140050000280200001005000028280000051000000228000005 30,#100000023fffffff10000002100000021000000210000002100000021000000210000002100000021000000210000002100000021000000210000002100000021000000210000002100000021000000210000002100000021000000210000002100000021000000210000002100000023fffffff10000002 30,#00008003000080040000400800004008000020080000100800e00808011004040210020202080102040800820807c0420800303c08000c00040003f003f00008000c00040f0300041080f80410400408102004101010021008080220040401c0040200000401000004008000040080000800400030004000 30,#0010040120280a0210441104088220880501405002008020010100500082008800440104002802020010040100200802004010040080200801004010020080200401004008020080100401002008020010100500082008800440104002802020010040100280a02804411044082208821014050120080200 30,#2800c005100120022802100505040828020804100510022800a0c1400041208000a2114001140a200208041004140a080822d104104528822082d0412082d041104528820822d10404140a080208041001140a2000a211400041208000a0c14005100228020804100504082828021005100120022800c005 30,#3000000310000002080000040800000408000004041ffe080231e310224000911240009213800072138000721281e05212821052120408121004c8021004c80212040812128210521281e052138000721380007212400092224000910231e310041ffe080800000408000004080000041000000230000003 30,#000000000000000003ffffff0200000102000003020000060200000c07fffff80c0000101800001030000010200000103ffffff00000000000000000 30,#200000011000c0020c00c00c0380c07000fad7c00000c000000ad4000018c6003c12120f0e18061c060c0c180215ea1001340b203938072719100226191002263938072701340b200215ea10060c0c180e18061c3c12120f0018c600000ad4000000c00000fad7c00380c0700c00c00c1000c00220000001 30,#100000023fffffff100000021000000210000002100000021ffffffe1080004210800042108000421080004210ffffc210840842108408421084084210840842108408421084084210ffffc2108000421080004210800042108000421ffffffe100000021000000210000002100000023fffffff10000002 30,#200120011002d0020c04c80c0388c47000fad7c00020c100004ad4800098c6403d12122f0e18061c060c0c180215ea1001340b203938072719100226191002263938072701340b200215ea10060c0c180e18061c3d12122f0098c640004ad4800020c10000fad7c00388c4700c04c80c1002d00220012001 30,#100000023fffffff100000021000000210000002100000021ffffffe1080004210800042108000421080004210ffffc21087f8421087f8421087f8421087f8421087f8421087f84210ffffc2108000421080004210800042108000421ffffffe100000021000000210000002100000023fffffff10000002 ########## w31.iml 31,#0001030000008280000044400000282000001010000020200000404000008080000101000002020000040400000808000010100000202000004040000020a00000111000000a080000060400 31,#04100200080805001004088020021040400120200000c0110000800a000100040002000800040010000800201010004028200080444001000280020101000402008008040040100800202010 31,#000000000000000000000000000000000600000006000000060000000600000006000000060000000600000006000000060000000600000006000000060000000600000007ffffff07ffffff 31,#0000000000000000000000000000000007ffffff06000001060000010600000106000001060000010600000106000001060000010600000106000001060000010600000107ffffff07ffffff 31,#0000000000000000000000000000000007ffffff060070010600e0010601c0010603800106070001060e0001061c0001063800010670000106e0000107c000010780000107ffffff07ffffff 31,#00008000000140000002200000041000000808000010040000280a000044110000822080010140400200802005014050088220881044110420280a024010040120280a021044110408822088050140500200802001014040008220800044110000280a00001004000008080000041000000220000001400000008000 31,#0200802005014050088220881044110420280a024010040120280a021044110408822088050140500200802005014050088220881044110420280a024010040120280a021044110408822088050140500200802005014050088220881044110420280a024010040120280a0210441104088220880501405002008020 31,#07c221f0080220081181c0c422000022443ffe1148000009480410094008080140100401021ffc200430061008200208084081080848890808488908084889080848890808488908084081080820020804300610021ffc2040100401400808014804100948000009443ffe11220000221181c0c40802200807c221f0 31,#07c221f0080220081181c0c422000022443ffe1148000009480410094008080140100401021ffc200430061008200208084081084848890948488909484889094848890948488909084081080820020804300610021ffc2040100401400808014804100948000009443ffe11220000221181c0c40802200807c221f0 31,#47c2a1f1080220081181c0c422000022443ffe1148000009480410094008080140100401021ffc200430061008200208084081084848890948488909484ff9094848890948488909084081080820020804300610021ffc2040100401400808014804100948000009443ffe11220000221181c0c40802200847c2a1f1 31,#47c2a1f1080220081181c0c422000022443ffe1148422109488410894109c84141100441021ffc2004300610082002080847f1084848890948488909484ff90948488909484889090847f1080820020804300610021ffc20411004414109c8414884108948422109443ffe11220000221181c0c40802200847c2a1f1 31,#3cf00000249000002493ffff24920000249200002493fffe2490000224900002249ffff2248000122480001224ffff92240000922400009224f8f89224890892248f8f92248000122480001224ffff92240000922400009227fffc9220000492200004923fffe49200002492000024927fffe492000004920000079e ########## w32.iml 32,#00000000000000000000000000000000000000f0000000f0000000f0000000f00000000000000000000000000000000000f0000000f0000000f0000000f00000 32,#0000000f0000000f0000000f0000000f00000000000000000000000000000000000f0000000f0000000f0000000f000000000000000000000000000000000000 32,#0004200000081000001008000020040000400200008001000100008002000040050000a00880011010400208202004044010080280081001000420000002400000024000000420008008100140100802202004041040020808800110050000a00200004001000080008001000040020000200400001008000008100000042000 32,#000420008008100140100802202004041040020808800110050000a002000040050000a00880011010400208202004044010080280081001000420000002400000024000000420008008100140100802202004041040020808800110050000a002000040050000a0088001101040020820200404401008028008100100042000 32,#0000000f 32,#0000f0000000f0000000f0000000f000f0000000f0000000f0000000f0000000000f0000000f0000000f0000000f00000f0000f00f0000f00f0000f00f0000f0000000000000000000000000000000000000f00f0000f00f0000f00f0000f00f00f0000000f0000000f0000000f00000000000f0000000f0000000f0000000f0 32,#8000000160000006600ff006001008000020040000400200008001000080010000800100008001000083c100804c320140300c0220181804100ff0080b0420d00b0420d0100ff0082018180440300c02804c32010083c10000800100008001000080010000800100004002000020040000100800600ff0066000000680000001 32,#000080000001c0000003600000063000000c180000180c00000c180000063000000360000001c000020080200701c0700d8360d818c6318c306c1b0660380e03306c1b0618c6318c0d8360d80701c070020080200001c0000003600000063000000c180000180c00000c180000063000000360000001c0000000800000000000 32,#000420008008100140181802202424041042420808818110050180a002024040050420a00888111010500a082020040460500a0690881109090420900602406006024060090420909088110960500a062020040410500a0808881110050420a002024040050180a0088181101042420820242404401818028008100100042000 32,#88181811880420110403c0208200004181d00b81800db0014023c40200866100408811020090090000000000100240080102408080adb5014000000260400206604002064000000280adb5010102408010024008000000000090090040881102008661004023c402800db00181d00b81820000410403c0208804201188181811 32,#04042020880810115018180a202424045042420a88818111050180a002024040050420a00888111010500a082020040460500a0690881109090420900602406006024060090420909088110960500a062020040410500a0808881110050420a002024040050180a0888181115042420a202424045018180a8808101104042020 32,#8000000160000006600ff006101008080c2004300c43c230028421400085a1000085a100008001000083c100804c320140318c0220181804100ff008cb0420d3cb0420d3100ff0082018180440318c02804c32010083c100008001000085a1000085a100028421400c43c2300c20043010100808600ff0066000000680000001 32,#8001800160018006600ff006101008080c2004300c43c23002842140018421800083c100008001000083c100804c320140300c0220181804900c30094d542ab24aa43552900c30092018180440300c02804c32010083c100008001000083c10001842180028421400c43c2300c20043010100808600ff0066001800680018001 32,#88199811880420110403c0208200004181d00b81900db0095023c40a08866110408811022090090400000000100240080102408088adb5114000000264466226644662264000000288adb5110102408010024008000000002090090440881102088661105023c40a900db00981d00b81820000410403c0208804201188199811 32,#3f0000fc3f0000fc3000000c3000000c3000000c3000000c3f0000fc3f0000fc00000300000003000000030000000300f03c3c0ff03c3c0f3003000c3003000c3003000c3003000cf03c3c0ff03c3c0f000003000000030000000300000003003f0000fc3f0000fc3000000c3000000c3000000c3000000c3f0000fc3f0000fc 32,#0000f0000000f0000000f0000000f0000000f0000000f0000000f0000000f0000000f0000000f0000000f0000000f0000000f0000000f0000000f0000000f000ffffffffffffffffffffffffffffffff0000f0000000f0000000f0000000f0000000f0000000f0000000f0000000f0000000f0000000f0000000f0000000f000 32,#00000000000000000000000000000000ff00f0f0ff00f0f0ff00f0f0ff00f0f00000f0000000f0000000f0000000f0000f0000ff0f0000ff0f0000ff0f0000ff0000f0ff0000f0ff0000f0ff0000f0ff0f0000000f0000000f0000000f0000000f00ff0f0f00ff0f0f00ff0f0f00ff0f00000000000000000000000000000000 32,#0000000000000000fff00ffffff00fff00300c0000300c0000300c0000300c003ff00ffc3ff00ffc3000000c3000000c3000000c3000000c3000000c3000000c3000000c3000000c3000000c3000000c3000000c3000000c3ff00ffc3ff00ffc00300c0000300c0000300c0000300c00fff00ffffff00fff0000000000000000 32,#00000f0f 32,#0000ff00 32,#0f0000ff0f0000ff0f0000ff0f0000ff000000000000000000000000000000000f0ff0f00f0ff0f00f0ff0f00f0ff0f00f0000000f0000000f0000000f0000000000f0000000f0000000f0000000f0000ff0f00f0ff0f00f0ff0f00f0ff0f00f000000000000000000000000000000000000f0ff0000f0ff0000f0ff0000f0ff 32,#0f0000ff0f0000ff0f0000ff0f0000ff0000f0ff0000f0ff0000f0ff0000f0ff0f0000000f0000000f0000000f00000000000f0f00000f0f00000f0f00000f0f00ff000000ff000000ff000000ff000000ff000000ff000000ff000000ff0000f00000f0f00000f0f00000f0f00000f00000f0000000f0000000f0000000f000 32,#8001800160018006600ff0063010080c2c2004342c43c234228421442085a1042085a104208001042083c104804c320140318c0220181804100ff008cba425d3cba425d3100ff0082018180440318c02804c32012083c104208001042085a1042085a104228421442c43c2342c2004343010080c600ff0066001800680018001 32,#7fffffff42108421421084214210842142108421421084214210842142108421421084214210842142108421421084214210842142108421421084214210842142108421421084214210842142108421421084214210842142108421421084214210842142108421421084214210842142108421421084217fffffff00000000 32,#1111ffff1111000011110000111100001111ffff1111000011110000111100001111ffff1111000011110000111100001111ffff111111111111111111111111ffff1111000011110000111100001111ffff1111000011110000111100001111ffff1111000011110000111100001111ffff1111000011110000111100001111 32,#1111ffff1111000111110001111100011111ffff1111000111110001111100011111ffff1111000111110001111100011111ffff111111111111111111111111ffff1111000111110001111100011111ffff1111000111110001111100011111ffff1111000111110001111100011111ffff1111111111111111111111111111 32,#0000000000000000fff00ffffff00fff00300c0000300c0000300c0000300c003ff00ffc3ff00ffc3000000c3000000c30ffff0c30ffff0c3000030c3000030c3000030c3000030c30ffff0c30ffff0c3000000c3000000c3ff00ffc3ff00ffc00300c0000300c0000300c0000300c00fff00ffffff00fff0000000000000000 32,#0f0000000f0000000f0000000f0000000f0000000f0000000f0000000f000000ffffffffffffffffffffffffffffffff00000f0000000f0000000f0000000f0000000f0000000f0000000f0000000f0000000f0000000f0000000f0000000f00ffffffffffffffffffffffffffffffff0f0000000f0000000f0000000f000000 32,#f00f0000f00f0000f00f0000f00f0000f00f0000f00f0000f00f0000f00f0000f00f0000f00f0000f00f0000f00f0000f00f0000f00f0000f00f0000f00f0000f00f0000f00f0000f00f0000f00f0000f00f0000f00f0000f00f0000f00f0000f00f0000f00f0000f00f0000f00f0000ffffffffffffffffffffffffffffffff 32,#0000000000000000000000000000000000ffff0000ffff0000ffff0000ffff000f0ff0f00f0ff0f00f0ff0f00f0ff0f00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00f0ff0f00f0ff0f00f0ff0f00f0ff0f000ffff0000ffff0000ffff0000ffff0000000000000000000000000000000000 32,#000fff00 32,#00f0000f00f0000f00f0000f00f0000f00f0000f00f0000f00f0000f00f0000f00f0000f00f0000f00f0000f00f0000f00f0000f00f0000f00f0000f00f0000f00f0000f00f0000f00f0000f00f0000f00f0000f00f0000f00f0000f00f0000f00ffffff00ffffff00ffffff00ffffff00ffffff00ffffff00ffffff00ffffff 32,#ffff000fffff000fffff000fffff000f00f0000000f0000000f0000000f00000fff0fff0fff0fff0fff0fff0fff0fff0000000f0000000f0000000f0000000f0000fffff000fffff000fffff000fffff000000f0000000f0000000f0000000f0fff0fff0fff0fff0fff0fff0fff0fff000f0000000f0000000f0000000f00000 32,#532954aa 32,#fffffffffffffffffffffffffffffffff000000ff000000ff000000ff000000ff000000ff000000ff000000ff000000ff000000ff000000ff000000ff000000ff000000ff000000ff000000ff000000ff000000ff000000ff000000ff000000ff000000ff000000ff000000ff000000fffffffffffffffffffffffffffffffff 32,#0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0ff0f000f0f0f000f0f0f000f0f0f000f00f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0ff0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f00f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f00f0f0f000f0f0f000f0f0f000f0f0f00f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0ff0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 32,#38e38e38 32,#0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffffffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000 32,#00ffff00 32,#0f00f0ff 32,#ff0ff000 32,#ff0fff0fff0fff0fff0fff0fff0fff0fff0fff0fff0fff0fff0fff0fff0fff0fff0ff000ff0ff000ff0ff000ff0ff00000000000000000000000000000000000ff0ff000ff0ff000ff0ff000ff0ff000ff0fff0fff0fff0fff0fff0fff0fff0fff0fff0fff0fff0fff0fff0fff0fff0f00000000000000000000000000000000 32,#fffff00ffffff00ffffff00ffffff00f0000f00f0000f00f0000f00f0000f00f0000f00f0000f00f0000f00f0000f00ffffff00ffffff00ffffff00ffffff00ff00ffffff00ffffff00ffffff00ffffff00f0000f00f0000f00f0000f00f0000f00f0000f00f0000f00f0000f00f0000f00ffffff00ffffff00ffffff00fffff 32,#f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0fff0f0f0fff0f0f0fff0f0f0fff0f0f0f000f0f0f000f0f0f000f0f0f000f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0fff0f0f0fff0f0f0fff0f0f0ff00f0f0f000f0f0f000f0f0f000f0f0f0fff0f0f0fff0f0f0fff0f0f0fff0f0f0 32,#000000000000000000000000000000000ffffff00ffffff00ffffff00ffffff00ffffff00ffffff00ffffff00ffffff00ffffff00ffffff00ffffff00ffffff00ffffff00ffffff00ffffff00ffffff00ffffff00ffffff00ffffff00ffffff00ffffff00ffffff00ffffff00ffffff000000000000000000000000000000000 32,#3a756ad5 32,#0000fff00000fff00000fff00000fff0ff0fffffff0fffffff0fffffff0fffff000f000f000f000f000f000f000f000fffffff0fffffff0fffffff0fffffff0ffff00000fff00000fff00000fff00000ffffff0fffffff0fffffff0fffffff0f000f000f000f000f000f000f000f000fff0fffffff0fffffff0fffffff0fffff 32,#0f000f000f000f000f000f000f000f000f0fffff0f0fffff0f0fffff0f0fffff0f0ff0ff0f0ff0ff0f0ff0ff0f0ff0ff0f0fffff0f0fffff0f0fffff0f0fffff0f000f000f000f000f000f000f000f00ffff0f0fffff0f0fffff0f0fffff0f0ff0ff0f0ff0ff0f0ff0ff0f0ff0ff0f0fffff0f0fffff0f0fffff0f0fffff0f0f 32,#000fff00000fff00000fff00000fff00000fff00000fff00000fff00000fff00000fff00000fff00000fff00000fff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000fff00000fff00000fff00000fff00000fff00000fff00000fff00000fff00 32,#0f00fff00f00fff00f00fff00f00fff00fff00f00fff00f00fff00f00fff00f0ffff00ffffff00ffffff00ffffff00ff00ffffff00ffffff00ffffff00ffffff00f00fff00f00fff00f00fff00f00ffffff00f00fff00f00fff00f00fff00f00ffffff00ffffff00ffffff00ffffff00ff00ffffff00ffffff00ffffff00ffff 32,#f0ff0f00f0ff0f00f0ff0f00f0ff0f00ffff0fffffff0fffffff0fffffff0fff000f0f00000f0f00000f0f00000f0f00ffff0fffffff0fffffff0fffffff0ffff0fffffff0fffffff0fffffff0fffffff0f00000f0f00000f0f00000f0f00000f0fffffff0fffffff0fffffff0fffffff0ff0f00f0ff0f00f0ff0f00f0ff0f00 32,#fff0f0f0 32,#fffff000 32,#000000000000000000000000000000000fffffff0fffffff0fffffff0fffffff0fffffff0fffffff0fffffff0fffffff0fffffff0fffffff0fffffff0fffffff00000000000000000000000000000000ffff0fffffff0fffffff0fffffff0fffffff0fffffff0fffffff0fffffff0fffffff0fffffff0fffffff0fffffff0fff 32,#9f1f3e7c 32,#ffff0fffffff0fffffff0fffffff0fff000f0f00000f0f00000f0f00000f0f00ffff0fffffff0fffffff0fffffff0fff0fff0fff0fff0fff0fff0fff0fff0fff0fffffff0fffffff0fffffff0fffffff0f00000f0f00000f0f00000f0f00000f0fffffff0fffffff0fffffff0fffffff0fff0fff0fff0fff0fff0fff0fff0fff 32,#ffffffffffffffffffffffffffffffff0ff000000ff000000ff000000ff000000ff0ffff0ff0ffff0ff0ffff0ff0ffff0ff0ffff0ff0ffff0ff0ffff0ff0ffff0ff0ffff0ff0ffff0ff0ffff0ff0ffff0ff0ffff0ff0ffff0ff0ffff0ff0ffff0ff000000ff000000ff000000ff00000ffffffffffffffffffffffffffffffff 32,#000ffff0000ffff0000ffff0000ffff0fffffffffffffffffffffffffffffffff0000ffff0000ffff0000ffff0000ffffffffffffffffffffffffffffffffffffff0000ffff0000ffff0000ffff0000fffffffffffffffffffffffffffffffff0ffff0000ffff0000ffff0000ffff000ffffffffffffffffffffffffffffffff 32,#00ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff00 32,#f0fffff0f0fffff0f0fffff0f0fffff0fffff0f0fffff0f0fffff0f0fffff0f0fffff0f0fffff0f0fffff0f0fffff0f0fff0f0fffff0f0fffff0f0fffff0f0fffff0f0fffff0f0fffff0f0fffff0f0fff0f0fffff0f0fffff0f0fffff0f0fffff0f0fffff0f0fffff0f0fffff0f0fffff0fffff0f0fffff0f0fffff0f0fffff0 32,#ffff00ffffff00ffffff00ffffff00ffffff00ffffff00ffffff00ffffff00ff00ffffff00ffffff00ffffff00ffffff00ffffff00ffffff00ffffff00ffffff 32,#ffffff00 32,#00000000000000000000000000000000ffffff0fffffff0fffffff0fffffff0fffffff0fffffff0fffffff0fffffff0fffffff0fffffff0fffffff0fffffff0fffffff0fffffff0fffffff0fffffff0fffffff0fffffff0fffffff0fffffff0fffffff0fffffff0fffffff0fffffff0fffffff0fffffff0fffffff0fffffff0f 32,#ffffffffffffffffffffffffffffffffffff0ff0ffff0ff0ffff0ff0ffff0ff0ff0fffffff0fffffff0fffffff0fffffffffff0fffffff0fffffff0fffffff0fffff0fffffff0fffffff0fffffff0fff0fffffff0fffffff0fffffff0ffffffffff0fffffff0fffffff0fffffff0fffff0ffff0ff0ffff0ff0ffff0ff0ffff0f 32,#f0ffffff icon-9.4.3/ipl/gdata/gxplor.dat0000664000175000017500000000034607140713052015656 0ustar chrishchrishfg fg blue linewidth 72 drawline 12 20 55 73 erasearea fillarea fillrectangle pattern pattern grid fillstyle fillstyle opaque fillstyle opaquepatterned clip 50 50 400 200 fillrectangle zoom 40 40 100 100 300 50 200 200 icon-9.4.3/ipl/gdata/linden.dat0000664000175000017500000001514207140713052015614 0ustar chrishchrishname:ebush comment: 3D drawing. P->I+[P+O]--//[--L]I[++L]-[PO]++PO I->FS[//&&L][//^^L]FS S->SFS L->['{+f-ff-f+|+f-ff-f}] O->[&&&D'/W////W////W////W////W] D->FF W->['^F][{&&&&-f+f|-f+f}] axiom:P angle:18 gener:5 length:3 name:bush F->FF-[-F+F+F]+[+F-F-F] axiom:F angle:22.5 yorg:50 name:cesaro X->----F!X!++++++++F!X!---- F-> gener:10 length:3 axiom:FX angle:10.58823529 yorg:100 name:curve1 comment: A Koch curve. F->FF-F-F-F-F-F+F axiom:F-F-F-F- angle:90.0 xorg:100 name:curve2 comment: A Koch tiling. F->FF-F+F-F-FF axiom:F-F-F-F- angle:90.0 name:curve3 comment: Another Koch curve; dull. F->F-FF--F-F axiom:F-F-F-F- angle:90.0 name:curve4 X->YF+XF+Y Y->XF-YF-X axiom:YF angle:60.0 gener:5 name:dragon X->-FX++FY- Y->+FX--FY+ F-> axiom:FX angle:45.0 gener:10 name:dragon1 r->-Fl-r l->l+rF+ axiom:Fl gener:10 name:dragonc X->X-YF- Y->+FX+Y axiom:X angle:90.0 gener:10 name:fass1 comment: Space-filling curve. R->-LFLF+RFRFR+F+RF-LFL-FR L->LF+RFR+FL-F-LFLFL-FRFR+ axiom:-L angle:90.0 name:fass2 comment: Space-filling curve. R->-LFLFLF+RFR+FL-F-LF+RFR+FLF+RFRF-LFL-FRFR L->LFLF+RFR+FLFL-FRF-LFL-FR+F+RF-LFL-FRFRFR+ axiom:-L angle:90.0 length:4 xorg:100 yorg:100 name:flake3 X->++FXFY--FX--FY Y->FYFX+++FYFX++FX++FYFX|+FX--FY--FXFY++ F-> axiom:FX angle:30.0 gener:4 length:4 yorg:-150 name:hilbert comment: Space-filling curve. X->-YF+XFX+FY- Y->+XF-YFY-FX+ axiom:X angle:90.0 gener:5 name:island1 F->FFFF-F+F+F-F[-FF+F+FF+F]FF axiom:F+F+F+F angle:90.0 gener:2 length:2 xorg:-100 yorg:100 name:island2 F->F+F-FF-F-FF++FF-F+FF+F+FF--FFF axiom:F+F+F+F angle:90.0 gener:2 xorg:-100 yorg:50 name:koch1 F->F+F--F+F axiom:F--F--F angle:60.0 gener:4 length:3 yorg:100 xorg:100 name:koch2 F->-F+++F---F+ axiom:F---F---F---F angle:30.0 gener:4 length:4 name:koch3 F->F-F+F+FF-F-F+F axiom:F-F-F-F angle:90.0 gener:3 length:3 xorg:100 yorg:100 name:koch4 F->+F--F++F- axiom:F++++F++++F angle:30.0 gener:4 length:3 xorg:-100 name:koch5 F->F+F-F-FFF+F+F-F axiom:F+F+F+F angle:90.0 gener:3 length:3 yorg:150 name:koch6 F->F-FF+FF+F+F-F-FF+F+F-F-FF-FF+F axiom:F+F+F+F angle:90.0 gener:2 length:3 name:koch7 F->F+F-F+F+F axiom:F+F+F+F gener:4 name:koch8 F->F+F--F+F axiom:F angle:60.0 name:lakeisle F->F-f+FF-F-FF-Ff-FF+f-FF+F+FF+Ff+FFF f->ffffff axiom:F-F-F-F gener:2 xorg:100 yorg:100 name:leaf1 H->J P->X X->F[+AAAA]FY E->H B->E J->Y O->P A->N Y->F[-BBBB]FX N->O axiom:X angle:45.0 length:3 gener:13 name:leaf2 comment: Not much like a leaf. X->A B->F[-Y]FA A->F[+X]BF Y->B axiom:A angle:45.0 gener:16 name:path X->FX+FX+FX+FX+f F->FF axiom:X angle:90 length:6 gener:5 name:peano1 comment: Space-filling curve. F->F-F+F+F+F-F-F-F+F axiom:F-F-F-F angle:90.0 name:peano2 comment: Nifty space-filling curve. X->XY-F-FXY++F++FXY Y->-F-FXY axiom:FXY++F++FXY++F angle:45.0 gener:4 length:7 yorg:180 name:peano3 comment: Space-filling curve. X->XFYFX+F+YFXFY-F-XFYFX Y->YFXFY-F-XFYFX+F+YFXFY axiom:X angle:90.0 name:penrose1 X->+YF--ZF[---WF--XF]+ Z->--YF++++WF[+ZF++++XF]--XF W->YF++ZF----XF[-YF----WF]++ Y->-WF++XF[+++YF++ZF]- F-> axiom:+WF--XF---YF--ZF gener:4 length:20 angle:36.0 yorg:100 name:penrose2 X->+YF--ZF[---WF--XF]+ Z->--YF++++WF[+ZF++++XF]--XF W->YF++ZF----XF[-YF----WF]++ Y->-WF++XF[+++YF++ZF]- F-> axiom:++ZF----XF-YF----WF angle:36.0 gener:5 length:10 name:penrose3 X->+YF--ZF[---WF--XF]+ Z->--YF++++WF[+ZF++++XF]--XF W->YF++ZF----XF[-YF----WF]++ Y->-WF++XF[+++YF++ZF]- F-> axiom:[X]++[X]++[X]++[X]++[X] angle:36.0 gener:5 length:10 name:penrose4 X->+YF--ZF[---WF--XF]+ Z->--YF++++WF[+ZF++++XF]--XF W->YF++ZF----XF[-YF----WF]++ Y->-WF++XF[+++YF++ZF]- F-> axiom:[Y]++[Y]++[Y]++[Y]++[Y] angle:36.0 gener:5 length:10 name:penrosed comment: Double Penrose tiling; looks nice. X->+YF--ZF[---WF--XF]+ Z->--YF++++WF[+ZF++++XF]--XF W->YF++ZF----XF[-YF----WF]++ Y->-WF++XF[+++YF++ZF]- F-> axiom:[X][Y]++[X][Y]++[X][Y]++[X][Y]++[X][Y] angle:36.0 length:40 name:plant01 comment: Not bad. F->F[+F]F[-F]F axiom:F angle:25.71428571 gener:4 length:4 yorg:150 name:plant02 F->F[+F]F[-F][F] axiom:F angle:20.0 gener:5 length:6 yorg:190 name:plant03 F->FF-[-F+F+F]+[+F-F-F] axiom:F angle:22.5 gener:4 yorg:175 name:plant04 comment: Dull. X->F[+X]F[-X]+X F->FF axiom:X angle:20.0 gener:5 length:4 yorg:180 name:plant05 comment: Not bad. X->F[+X][-X]FX F->FF axiom:X angle:25.71428571 gener:6 length:3 yorg:180 name:plant06 comment: Pretty good. X->F-[[X]+X]+F[+FX]-X F->FF axiom:X angle:22.5 gener:5 length:4 yorg:180 name:plant07 comment: Strange but fascinating. X->X[-FFF][+FFF]FX Z->ZFX[+Z][-Z] axiom:Z angle:25.71428571 gener:5 yorg:180 name:plant08 S->[+++Z][---Z]TS H->-Z[+H]L Z->+H[-Z]L L->[-FFF][+FFF]F T->TL axiom:SLFFF angle:18.0 gener:8 length:12 yorg:180 name:plant09 comment: Symmetric; bushy and unnatural. F->F[+FF][-FF]F[+FF][-FF]F axiom:F angle:36.0 gener:3 length:8 yorg:180 name:plant10 comment: Unnatural but cute. F->F[+F[+F][-F]F][-F[+F][-F]F]F[+F][-F]F axiom:F angle:30.0 gener:3 length:10 yorg:180 name:quadgos comment: Space-filling curve. R->+FLFL-FR-FR+FL+FLFR+FL-FRFR-FL-FR+FLFRFR-FL-FRFL+FL+FR-FR-FL+FL+FRFR L->FLFL-FR-FR+FL+FL-FR-FRFL+FR+FLFLFR-FL+FR+FLFL+FR-FLFR-FR-FL+FL+FRFR- F-> axiom:-FR angle:90.0 gener:2 xorg:100 yorg:100 name:quadkoch comment: Yet another Koch curve. F->F+FF-FF-F-F+F+FF-F-F+F+FF+FF-F axiom:F++F++F++F++F gener:2 angle:90.0 name:quartet comment: Space-filling curve. H->- B->FB+FA-FB-JFBFA J->+ A->FBFA+HFA+FB-FA F-> axiom:FB angle:90.0 gener:4 length:4 xorg:-100 yorg:100 name:sier1 comment: Well, not so great. X->+FXF-FXF-FXF+ F->FXF axiom:F angle:120.0 gener:5 name:sier2 X->--FXF++FXF++FXF-- F->FF axiom:FXF--FF--FF angle:60.0 gener:5 length:4 xorg:50 yorg:100 name:sier3 F->F[-F]F axiom:F-F-F angle:120.0 gener:5 name:siersqar F->FF+F+F+F+FF axiom:F+F+F+F angle:90.0 gener:4 length:3 xorg:-100 yorg:100 name:snoflake F->F-F+F+F-F axiom:+F gener:4 length:3 xorg:-100 name:space1 X->YFXFY+F+YFXFY-F-XFYFX Y->YFXFY-F-XFYFX+F+YFXFY axiom:X length:3 gener:4 yorg:150 name:sphinx comment: Vaguely interesting. X->+FF-YFF+FF--FFFXF--YFFFYFFF G->GG Y->-FF+XFF-FF++FFFYF++XFFFXFFF F->GG axiom:X angle:60.0 gener:5 length:10 name:sqgasket comment: Dull. X->+FXF+FXF+FXF+FXF F->FF axiom:X angle:90.0 gener:5 xorg:-100 yorg:-100 name:square comment: Sierpinski gasket. F->FF+F+F+F+FF axiom:F+F+F+F angle:90.0 name:tile comment: A circular tiling; comes out nicely. X->[F+F+F+F[---X-Y]+++++F++++++++F-F-F-F] Y->[F+F+F+F[---Y]+++++F++++++++F-F-F-F] axiom:X+X+X+X+X+X+X+X+X+X+X+X+X+X+X+X+X+X+X+X+X+X+X+X angle:15.0 length:10 name:tree1 comment: Symmetric, not life-like. X->[-FX]+FX axiom:---+++FX angle:30.0 gener:9 length:15 name:tree2 X->[-FX]+FX axiom:---+++FX angle:30.0 gener:9 length:10 name:tree3 comment: Dull. X->+FY Y->-FX F->FF-[XY]+[XY] axiom:----++++F angle:22.5 gener:6 length:3 yorg:175 icon-9.4.3/ipl/gdata/unicorn.ims0000664000175000017500000001024707140713052016041 0ustar chrishchrish# xpmtoiim -c1 unicorn.xpm "64,c1,_ 6666666666666666666666666666666666666666666666666666666660666666_ 6666666666666666666666666666666666666666666666666666666006666666_ 6666666666666666666666666666666060666666666666666666600066666666_ 6666666666666666666666666666666060066666666666666660000666666666_ 6666666666666666666666666666666000066666666666666600066666666666_ 6666666666666666666606060606060,0,066666666666660040666666666666_ 6666666666666666660606060606060,0,,06666666666000406666666666666_ 666666666666666606060606060600,,,0,06666666660040066666666666666_ 66666666666666660606060606060,,,,0,06666666604000666666666666666_ 66666666666666660600000000000,,,,0,06666660040006666666666666666_ 6666666666666606000,,,,,,,,0,,,,,0,06666600400666666666666666666_ 666666666666660660,,,,,,,,0,,,,,0,066660040006666666666666666666_ 66666666666666600,,,,,,,,,00,,,000666000440066666666666666666666_ 66666666666606600,,,,,,,,,,,000,06600444000666666666666666666666_ 66666666666660660,,,,,,,,,,,,,,,,0044044006666666666666666666666_ 66666666666660660,,,,,,0,,,,,,,,,,,04400666666666666666666666666_ 6666666666666600,,,,,,,0,,,,,,,,,,,,0406666666666666666666666666_ 6666666666660660,,,,,,,0,,,,,,,,,,,,,066666666666666666666666666_ 666666666666600,,,,,,,,0,,,,,,,,000,,,06666666666666666666666666_ 666666666666600,,,,,,,0,,,,,,,,066J0,,06666666666666666666666666_ 666666666666660,,,,,,0,,,,,,,,066JJJ0,,0666666666666666666666666_ 666666666666660,,,,,,0,,,,,,,066660000,,066666666666666666666666_ 66666666666660,,,,,,0,,,,,,,,00000,,,,,,066666666666666666666666_ 66666666666660,,,,,,0,,,,,,,,,,,,,0,,,,,,06666666666666666666666_ 66666666666660,,,,,0,,,,,,,,,,,,,,,00,,,,,0666666666666666666666_ 66666666666660,,,,,0,,,,,,,,,,,,,,,,,,,,,,,006666666666666666666_ 66666666606660,,,,,0,,,,,,,,,,,,,,,,0,,,,,,,,0666666666666666666_ 66666666600060,,,,,0,,,,,,,,,,,,,,,,0,,,,,,,,,066666666666666666_ 66666666033000,,,,,0,,,,,,,,,,,,,,,,0,,,,,,,,,,00666666666666666_ 666666660330300,,,,0,,,,,,,,,,,,,,,,0,,,,,,,,,,,,066666666666666_ 66666660333033300,,,0,,,,,,,,,,,,,,0,,,,,,,,,,,0,,06666666666666_ 666666603303333030,,0,,,,,,,,,,,,,,0,,,,,,,,,,,,0,,0666666666666_ 66666666000333033000,,,,,,,,,,,,,,0,,,,,,,,,,,,,,0,,066666666666_ 666666666603303330330,,,,,,,,,,,,,0,,,,,,,,,,,,,,,,,066666666666_ 66666660006003330333300,,,,,,,,,00,,,,,,,,,,,,,,,,,,,06666666666_ 6666600333003003033303000,,,,,00,,,,,,,,,,,,,,,,,,00,06666666666_ 66666033303333300330330330,,,0,,,,,,000000,,,,,0,,,,,,0666666666_ 6666603330333330000330333000,,,,,,00,,,,,,,,,,,0,,000,,066666666_ 66666033303333303303303303300,,,,,,,,,,,,,,,,,,,0,000,,066666666_ 6666033330333303333000330330300,,,,00000000,,,,,0,,0,,,066666666_ 666603000A0033033330A0303303330000066040,,,00,,,,0,,,00666666666_ 666600AAAAAA000333330A0033033033066666040,,,,0,,,,,,,06666666666_ 66660AAAAAAAAAA0030030AA000330330666666040,,,,00,,,,066666666666_ 66660AAAAAAAAAAAA00330AAA003033066666660440,,,,,0000666666666666_ 66660AAAAAAAAAAAA033330AAAA003306666666604400,,,0666666666666666_ 6660AAAAAAAAAAAAAA03330AAAAAA00666666666044060006666666666666666_ 6660AAAAAAAAAAAAAA033330AAAAAAA066666666044066666666666666666666_ 6660AAAAAAAAAAAAAAA0000AAAAAAAA066666666044406666666666666666666_ 6660AAAAAAAAAAAAAAA03330AAAAAAAA06666666044406666666666666666666_ 660AAAAAAAAAAAAAAAA03330AAAAAAAA06666666604406666666666666666666_ 660AAAAAAAAAAAAAAAA03330AAAAAAAAA0666666604066666666666666666666_ 660AAAAAAAAAAAAAAAA0330AAAAAAAAAA0666666660666666666666666666666_ 660AAAAAAAAAAAAAAA00000AAAAAAAAAAA066666666666666666666666666666_ 60AAAAAAAAAAAAAAAA03330AAAAAAAAAAA066666666666666666666666666666_ 60AAAAAAAAAAAAAAAA0330AAAAAAAAAAAAA06666666666666666666666666666_ 60AAAAAAAAAAAAAAAA030AAAAAAAAAAAAAA06666666666666666666666666666_ 60AAAAAAAAAAAAAAA0330AAAAAAAAAAAAAAA0666666666666666666666666666_ 60AAAAAAAAAAAAAAA000AAAAAAAAAAAAAAAAA066666666666666666666666666_ 60AAAAAAAAAAAAAAA0AAAAAAAAAAAAAAAAAAA066666666666666666666666666_ 60AAAAAAAAAAAAAAA0AAAAAAAAAAAAAAAAAAAA06666666666666666666666666_ 0AAAAAAAAAAAAAAAA0AAAAAAAAAAAAAAAAAAAA06666666666666666666666666_ 0AAAAAAAAAAAAAAA0AAAAAAAAAAAAAAAAAAAAAA0666666666666666666666666_ 0AAAAAAAAAAAAAAA0AAAAAAAAAAAAAAAAAAAAAA0666666666666666666666666_ JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ_ " icon-9.4.3/ipl/gdata/vneumann.gif0000664000175000017500000007563207140713052016201 0ustar chrishchrishGIF87a xxx888,X0I8u~'dH橮llP 664oH,kEaOdAyrFlEƙ*&kW;\noU~۷W}ohk\>6a|=;:\7~+^hc1iD%@`z(mBNF f)G8ÈpuǑϯHҼؠ"ynјRݹ畦xbT-Z9wZ a}wVq/=!d= E)N8^ ) .3x D Tّ W5W^#TJɏCJ ċLdLz =n% )brӊ!SQr \FER{1-{ǚK+̋n>MN31ÅGX=&-vZMZ<]dqs󍲸6Cow=Y*!:G^á6ZIWMb҄C4Y]5JwW~H2pt QȟfVe{uGw6GmYWZףi4gㄲQQ|{ُVbq2|VB[=V\SO͖Y_b #oUVe A#WrG_zSrIe[Iֆ(a~5XmCYbt6&(e&XGi@)FxzU&5ꡇTT=rVK꺪chb*zgRKva^thaj}:K P% d+[{v({^zhF;l.k&G qci!Eˬoy LEB#G,.ˢ{~("Zqz Yz sor3fplZ%`3f^[c\-4! 6Ig9#0&شQ ^b Mw Y+˟9-k.mhHȦkśFmOb $ uCM(2}eZwK~|D<l95#rsj{ԩ騉|;F?˱+MWfotS#H@Pzӣ^<'!^[UY*+Yb&!'JWm|m:>zUL A9Ѐ8 C9<tz߸\6)I ^3 b^h3PH:8= w;E>֩ @:Ӳ j-{nkkd&4 ws[wL%*yJ<FD8)" Ùop ZzNeǗO[1A"QpT691F#ImdaXR; SN(4}+$7r HJSvqC҄%~k5mԦ f+_ p3{TJHbTΒȫmcTo#"FϮaNyS; cKIE28NU,h71jI$9K5=&`i(ʰִtiY%CчUkdS,iTk Pn'/F>,@]l\XŦN|EԱfʴnh,C;l+P}I Ed=P *Yg*3Vjoq^V\+,Fe{L+umvkڱXUKn-=  {uoXMԕ(NM߄ اFp3DJnvv#(ۨWJQA\=1iR8r>i8O!E*A1"M;suj't,,Lh!Ј.劗G`s> UQc 3)Oz{aC-< :5=цFY0P $0DCN9e@aIOZXFnTELSCYʻ~eh& gq5xOYqNmeq=irǜn%)wbm5\Wе>4]Qܥ$A8ouӡvaqԨ.&l`;Պr5Ȫk6 7ܴuO7w܈G\U!Qr5DU jVsx[y7wq͛^ԧ{zS:8z]Nw9sg/y_,_i2?po,6[t]"s_XG<x:^ie гge_yWgpƄ}$JLSVfkguVgnGxoon~~`@8wfW`5|tvKFMu7җszph3EYx~WuG4~'xRG=?lOGu 'D`RPc3D|3flY6+4IODO:+>fEsagw9ͳ}z&AxOqKWSg=2ńGh{yn_e\vJ%mGEeafp`#Lz^(R^fu7|^WbGn8g~N(x|(JIX=闁uhnwU–v`G/wcj41cgQx3вpj2}(\D{wMxD~FhzX{؈_g}]Dc'Ȃè;W%᥌狼E$i=&_rȊ7)IkJ8؄eMfSr/^`4&R1`b29YǏ4dX'hwD?)?xMwQ~D7~<75`VWcgwxdd%vCSl$TedhgiKYMiXA5VH;ov[uaoJM8&٘mوH to$`{xIx㘑xXMw~IoF)DiRmbE_DYym.I'y&fyķrgo88Jpx_9Dt $ o@9N{̥P4`98wpEz0BOIȌXȖԈ"hsuGxYLٚ䙑 :{詎#X4 jCVXWvȏzEe{'tJiI:),j9qzwd5@栾󸆔[tF6lPuFXzgIGnT$HF`zDڔ엤JjS!؆c#8AWZ9g@7l(ɓv0E葳Ȟ<^SihŖj9ɜٟ3SB{Vs8LiVD9iC7nV@ez|*U剌ZJM]gnV:֊u):u& 7:娚(Kʪ~ڜsaDEyُ2˩v'te4qDĊ~g٦ڡL)Kh5Z@ؙI՛{,h)Ehkjo)̹g:7kmڬR@}|ɲi}Y+Y2zՈYwk(}zw[Ƶ_njuCT() K>#;8J4ķ{"{lY+*'ڵj٘P(c#ly۩+zWyDž88 nyYkQ':ڋ):4˽Yxh6ncEGū<z;KYUK[*YɈ*<:@Y}8a:oц++)8S7n=[򷱠*یȕ z=۱<͚B9dQ+xˆ 9w)8FF똍p`$Z8ܱZ˖t: t䫗ʲf쬹K<ҭ w`{xTtGk7Ò XW+̘ )jjʇJ r7p\{MyLm JN}Z&쬵 xmdߩI-+Y ؉h ߭v{a gsdҋ ~Gg=ƽܜLԛb ̨z72>ろ@Z7~ԧM Gy/;N"дͭ NL}ڶK#=hLא~+ךka cܸ^t9;=վyPXݔ;.UBɮ&ɗ.Ll]}s0yFބ7u߰v؛$nz*(엘b4+ٻy;wc}#ۑH*PJ.Ժzs^϶{:nX :T}% w0_.9|VK4.v>,s,=gUةnؼ?H3.P~#9SFZ|* Ju-:аM 깈_Vx;Bfkk杅+^O^uX0lOi{ZeLՕDƔq3^kmU;lK]/`++?ȳJܗnܲdL|(M#jEǎT%"\0ܮ 7`xubfZ~`!T\[xn}*n[  $x$D@@"L,ysC_BǧnţУٴv"CLJI5;t&,,hpj!xww2]_q#$ =9ZLQ}}X|yCB;+pgniolfb@_3DzVHKص)v[1᜝r*A0ѨSU{Zse"N ,T8Ō[U)9Db 1 o(˗oFkdZ'X]qI0jvX w} `cQ 1j-CAtGLweYV a\\yvpQ[B۝,ED|M8U'! .pjwV6Hc>GPAg`DidyG>T@hx䕹ekQq[ccpWmwj 0K.[&Љ5ЛOF4!EkNEmơr|h:\)NUhEBх1)Wr9 UQ( )zLl2IM01%cJFk^)5ZId)kXrB^D4ELM҈Ŵb)*~Q-#=~(.b^#$`XN-j+S\82'sgM+2P4JĽ5^UB?H;i+,V KtLNv 1.%bfb/(2Oh6Ln3('&'iLŕYh+ Fzf,U6 3 3UQuWqwME Dv*;މs:·7VG.dhGqb7Dn!)si qnЛRO2N) ŻhBuAyfIozݙwg[V qǜXij1#nqN^,q9[Ȑ&T,7y6&;tdBjS4Q[fDg~d\`x.wjkJq&m\9s!׸˹XSy'$eaͥ@'STmr rr _,} $*Qx(Z/;-Q4 _in'Zl3`(^$iR6bħOmzPj_Gv6]ݼkkSȍrRRl36g <8"vυVaP@Bﴨd?_;$x.Vf_1WFCAU+Nf*f깳 0AFÆUw+"qS1Jaװ=KZ$ݵגQڈ49ہ9N(?V\DvwSg G;E˚l{^2ے3y;N\%LZ|CHʅ&3)*]JN_lpjj3]U>%o}-"H`d5u $\yy/չ"ȁ-o:@y5]sB Rvĭ2Ѓf/XG6K{f4ך@[;+Q83xT3m*iOnۚ k<7~ av" .v# !0pAr6, #w#-I VsҲla_; nI4Z! 4fp; |+b2f(B\ԝ2u-RH{Q/4#!Kz-D^f QIE}g^Il<ޚDxby'w%giq!N=BiPB.3)&>qc~Q^>|)h([#c~^Q^49~2bWZAuHv^~Keyd'y"ofq#ts}3S(z |kcgh߇ z%xgr1>h'Dl(t|e~Vyd%H Z~񉡇@5&F4#Ud8v#ȍ7pVt5v8C8-e1U~5kȅ}=LfASօ1Xc@GH+Q}GvIӖyƑpd3g3FYfnukHpl3(*rr/bFEQf8ɇ8ߘ?$GHtRW(\W%x֘2!ccW_fP8'i1Q)Gפu!VHQHf dy`&3x]xA gJȖJFS)Ak#z~9/n92(W8ȉI萓(ǘ8Q8C60iSM}5F\E;'&eqt=:؏`o3wTKlf]e=/IQ֙ty,O`U5;VsȚk8?GIғVڣEJl2aٞ]te՟KqRJXFYk%Hi䔬cIထWUN`abvn%Q9ai 1p,ւ#oI؟w(Z'p k%)8:m>c:U`bu9 I|S( !t[e'cDȖ2P@n"ْ T(?((z~XTG.~A$IGBA+\$ICIj.*yqV|hefƟF]%DxžMuyfeU4U̓xm4KC~$;jt]*VQi94`T ``}{7ي)9t+ Dv?4P/U:_󭃴2}/T/9"*V3,LNX!wtaca+\jŽ#jR :}j7f>$۰f TV)$+'z0)Uu n(@~6O(׳+i^6^:DZ>Zȴ{Sr*+pY벊>tIs)a\w5*Pnewtl!u@GFٕ3RaV%CXp*wR>,26+_&H;={a!OٶYW2kG[gZhxzkvAƛ+J{_g! Wǻn&:c2pJ6hNf9Ry‘EJѪC= Hm ('i3{lҙ$#`;K͘A)y;r eamF2BlPkim)4l/>,xkw膪UUgԼ*cBh,B o*DC,5+ D{!hNzWGr7"fJy$cp?o@1[<פak1QB9Nj*HoYU@yxK1blp풺yˆLy:0ŭ7kB qըiļ,QE4 HñL%x4Ik3}&ƣ{6kք%uW*-!SpTt8z(EqPÈQ _/rIk50ש#J˴KxBY5bE!C-^1dfzEܳtܴ]ē$mΙ}OC=(c7ƚ<դM7V>* 5q%mw^io4Mlh X[7^@WvJ}O]rkfmp)>逘-};Hz$ME;ʵq!u7ZJ廣|{6]S{RzAKmNye`3O"&ʒN\==ˆYͰC{l*S<&9bH)6m頯Tj2Zg<-}{Nfl"r!:sl|xΡK}*R2pq1 g*~ɒ6֊-~=$Fsy=n:*A0J^KNo; (kMI Z.ƪ=cɲngT4>1Dmi=uN+h[ 4]yGog 'Stұ4tێúw i< Ow~on8/1^)z>0{˵)>;iP?q N6~8VS>26bߦU͐/w} sql,L&&I.So̝gg"A,YW%EcrΖ#e@鷔.ڌlִζyjVF'xVOPnD^ ο<5h!/xO*6m 1 dihk^U0C8-ik#XCrx΂ 1nkSPu̥#T.L,%.H3{AA7 ;9<~s M'ORJ1$N2Uq^[nljnkkmfeqs3t=BvP٥0@@8u0ٰq^bkhOD'rx*thɺx3Bq;<uN3tKE9v׃-,o_9ol@QHh q4YVYH"n3M0VII^jDa͡BWn>33Њ RL@eP+N9P5 aLGW[}trǓU8coh+(r),tХґ=W?YDH7tOHm+uxvZ~>7ݓV]N8;d3p?$&)eZ(}pq kƃduCM{1D&^}‰!=LC"9Gz t FuW-E^!L(DhՈ *D5 (pJW`e0NuS*qf_~RTF9 7јO'V0Xj\ATDt VavTMrx<6[QH:ҩY% R6cً'3V~£8XI::t*0_ 6]ĭܧYe zH2lB@cခK >hgj^8yRW5&xXgnb{ i9v Pw?6/XOO;b#,8㢻% =ng=+LMm-T] #1t3)7bΰ" by*x'>YH9QKl: AOܤ,&1_Q^ę@9g) D9 @DOmS(AF %Pj($N25 SшJnyu.Ѐ݆,52\cBe-CKK>E8aP, xNs+jȕurb`ֹHH/ J9*b 5huf`qh*JK)ardec6.?pll(BjNo9NZ8!R"lrvVpt}uv&x"ZL*E-Q-܂˞buWmRGdK-rh)>oΔDYt5gF,,w /ri>˪JQo'>dxCc*G|(o2{Zt5#1TŶ#Rn[9JE]8Q#d%Oq.֟B_Z㗑{#Qȿ,*V9ŤV*eu:НI|d76JH1US3 ӒSS-h󎵺;ڭ[`QKLy7~s0]L'eyDd7KY!x+`A!ؔ5,j,ꮡVZZ }T aXH-TNgf6 FJYN9Ex*eX@yM׍hDvlnx3bdVG=~13S6;咛uDM–T)1GhGgՎ6KNaYSvEg $_)O؆ e-ګziVq+f4V43g/fy8l綵$MۧHH^}?_E> n Y/u9u0>cIzG6v>*1D`Vb>+pZg*S[nu-0DĐzitB 3l3k9eu`S.\6 >71TAOxA^P5F&DWcboA&xJ&n ؀ (`5|C(WNdq YfЖ~vD2DD_t}fV~6@}Q%:7xpT=BwWgHWMi4_zH"'KsGeTJ3;Gph) V.s!5ph==pyty5c (j&B>Vt#k>@,xR:TĂl( ^Db%XGo,~%1u`(ŀ4` JБ|c\4g~Uzh;j3)׈R|]hbn 'XؓgtMBS @;']"b'd`T_QAͰQ`q8$S|a[RۓjT%Jv0 "Y\+h,U )6)qy|P*8h PIS6gb5 ;ygG@U<(' *A7lčF;)bDx8JRw'gj[-9 }d[2AwĨ eYEuI%7b$ČRMz|FwHVi8c!*mbă`sIW׆֚BxY6SԓRgAwH:wAw~M't\y\ي5ر$DCgf9D'{D;q8(]0 U-UeÝS *;U.%"Y6NxPJ] _ eaCڑYru Rhp zD%dgt;@JoHHzjIVp.$Քq@uYWJ%9!8\؋HU>ylw7d6TdxQCc:6zjy_yHJnƒ@'RjI`$2G!@YgX/93d%\8:벭uçDʸٗuJI:OACV$$6r;bU)ՕfE|9[C)JOcj> VuTv/#A=IĀLdk{7ùU=x*[at0OckX, WJx:%gVF6ZK3W i}x'|31aH_Lۢik1:OTLۧ[)/sJfZny6E2~QrJEI;<0|TkW:V˨[j9)`5ux. M3q$yMz堷E2wS9k9Y4R%XhLwk|cGJ`nVUwӓ 2HPxTx;R;PKOk%mX֘whԴF:j:L\y0XL[f3,p+ q\!R`s5::LAsv$ZFzkۙkءO=}F2 K=>D!S{/}+j RPӡe,eI,VW݀X aNw\%L2|U(=ǃ<9Yubr4=mȵӘk 1ѦkdNmJ/; z3SLxePgujj1eX31w͇4H{Tι2}>mPA*7|aRTps+\ΊSUk*ҭӽvyKSZ<аa, 4*d^dI;0o-Jf I PԗgLghfZyQqsX!kU:iaST@v>V4m"}~e[9PR-ծm%Ƣ?P3~FSm1idI.~3[-,ԪA;!k2((H$_ܢl?^'n^M_ȹWDd2>n LR$}3W &y//*iwl}Dlu#xWga;6H8:=&,NMQ=hP]]U[ZY\.f-Csokmusc+c` nA ςg7L->~pFIf `Sn!&Xa$\̈U25#G8̺ s :p 8[DITpS2&<]yVR)-hBؐkPH(%Յl ѕzq\Ǎ Ӣ Uw!Mp3;=\z$x^b8[<]s1 (+R~y٤g둻1{ƶi}|k5_ZŒѮ۞3/ x$1;_RdqnęaYJ[q̆v[.P5TEaնfʤf}Fdp &.Bj:+%7MgʃLRNI),\)/XtzlPCM&VIzW)̪@ir:j2p!p5 &=:c`$40R=USds5x*CL&rAqpjJJI^kHI">%s>8,ROKQɳunhȦI޿H̴q̦5\/ǐܵq<+{۽fմU΄w"֝W97.sbx@H3#h傑=o$ψ 7X!HF.F:w ]089#_j ã+1kCwB (Rq| T.euJ|=hI*"w*@<W[de8Xڴ%"Йt>ߒ*Ih.O~l5TSHPɨ!W=}Jf֢J$4ibYS[E4No)!0RL5raL(FV&Vрզ}jJ%_q( df Д Sk_)֏!,8#L߂"'G}2J<9YAQXG 4Ldi-Dv>8Ɗ;LQZO#00%f@IPV1ү(IY2NE|]j$9yv1G8?CQK6D{2j$wMgE/N% lXu*%DH&=b^0!(5SZN g%DP+G|Xl__Fl<$"eX6CY=R'\1ȹH!5ۊ<,jLǣR);S(u=WXrS]ydAʎvxeY2cBzӉմH -IxU'MZ!lJ'Stw ^8)r6H4C$ZE֮HEE9;%R41Laqo Ҿ9>W,uʉ-s۵&.j-qs-h(xu ;Ҽٲ*2JTW.z9}X(&w&.78td5EDQH&qEW;vW?_ut&,C%hXMƑusqw elh xsH wjM(XVp_+bzZqgOX?4eMea0lȉ$TE|ogBV)vfz7wqeP'{҃Hx4"pĢv16RyzvR*e*8~giKn@~l '~yeI(ȧyCz%83ѥQPD:HSv&^3$DF}hWƅ6A( [7G](vwGՓ.i1"Q觓ă3X3rpȇ1FOȗfQiu7,r&/9\E*\XY9 "2$iRWTIE,*V&F8Y}/7uйi,m;wFVeUllj&(QcH99oՕ@nDG֝S-nfN|Q y:#x']''q;_Uy27br6%‘ᵄI$/@U*8-7x)i=Yfs`IBZgIdKvH7X%s&[xTٞFJ!=.,(?(q-gɤ!:Sіia#xgpCwip-wtwrtFN39]#*^crA`z6U#OVf-U[/hh#B(Z}lXd7{94T>h[xn&j9y{u39Y5Y58t0rBrx1 UxzEet:YYҜH}:` eZFu9q*m桲U3ˊOɵAFLETF91ѱˆ㷚j* :Wf 9{W|pRU>uatzL 8XVAlTxz ck%9*Š)^&FMq5YaVwËJ, ,27ȷ#3L⳽JazgP+á78_ E?sGwF\=ujج:Ų!ʉE/개ba™E)770d_s%($@5}EEI82վjޖA,;:L#hK$ʚ~=zn .-4,JB /rgP4Y1:k:$W4&ǫk# 3 K̉c-NfgĩERRQ|,ͩ qP Zr̚5(srDpv 몠At {nXXwY֗x9KgrkyNJB,92=mځ͹3mҊJ5v۹܎qM"0tYM8BLRzX-Am܎l]Q똳Pt,0$`ym͇p͛ta3vLH2طzU{ B]Xn[w >tdO0Dgi\gKݾ<3Fv>q_lmRW.96*_ ?]}ۤSmH!USzGھmʈ:D}+9KLYJdb x-[J㩮CS!PATQ, wɍκE4vKnUI%Fe_?Ww(\V_M$жʟ.\oXKT_4"[}/IemqظZyËmvwȼУMtK]0_h??QLF5 A[L Yu:`Ob1#o*4ʯeDzx*y87U?ꡠbtLmҦ;R.[p.`]BCm}Gb`:0I8 `(jغ 3iDn"P HdQlBi<ج8N4E]rtV td95+&Qv7867,@0!<~@-?4eVIr_b*OT\UZf]bgmpoYWeS: {|~v41>/ӑ5?>'[c*BdKf[RsM_WpHrtfd  Rx6ԣm0fivTmTrw#oXUхENt'\@L*(LQ?j&Ghd5[J2Yzɓ˟L`|N!O OXmƐ'TX \s $FqK(6cyFumTs%g}*Z,a¸vH8F8|+˖+NcnegK۹gO?xW]> 3vA㭑"F%Uq]1\t]$kVNtד(5qVP PH|5u"Q}}IFM͋('yX)." /z B"∇)D>Ηb beqY[aHfUFыy`y7jR J^!4蕄چeDx)YHڀ9O~ZZy5NEi]{&DlH%!eGUa8Q9%_ߩ3vU*hgd92w J_ˆ 6zV0l:Vcט{-Ѻ@A*{!)w;;nJNDmb[[(K_b[ aF“tLkִ mExZ;<,m֋(.jeS_-%)ۯ\wivlㄲ$MLj t]fuZaQ)DPc6T8 }H#]q(<[rs^`7V31_F.!"Wm5! [06]XqcjzI1v ܢ k+~^fuј$'>~.ӞW"3{4Ǡ3\v,uIPȖsJ3LfrNP V a=e5vD$Cpqes6][|Ihv 6-Z^EJ;s|&-ؠUsc PhYjoWT^L` Fv.KhFAaRT pP۬­X ׵-41hn׉.}=òMtLQW #ayj>?<92>yw&v)AsRND.~%8liRyN>sogcp%.JuJ#Lyv7zh0?Ezd뱢sY;; CϷU}S0/6%; Q@eTŒxd6F6O1Xw7GIPgSݧ_p|3RRZ7C;{Pehd|['P9sPd}-ULcEnQ6SQxkzb(n"s'NZ:B% N |5zt|&sl7ZyR9S1 wtŀMkHgDt+g^œYГBȦ=7=0 f*?3v Qvvv Es*kD7Vst\b}Erm8G+*@4},"rik4|V1 ЅDžg"at7wFVn}lYfq{@'jD&P#3:o9{Zrr ÂOZuOBD@vsɑGqGthXVN:nG^/tRD-y3׉@EM2^ӘI)%]ŧ|gW;pX%tȃÆ`[X*I'%j| 9oYe&I&\Ÿ59h {+Lq7>%aULOMAMN2ssb0 Ra%Ĕ|ٗŧ! ciY>j&"n8ȉ5P$A~w^X9N楖jiׁ4{8#)2)|Yr@spyjn%٢%yEș5h'ڃOʂ( gY9h]ʙSrsٕoOJi|8Iz}dmm"YJY(>EI0(ƊA^47ʪHSYPr2z3'R˷^ddgʞB$v[vj  ʯu,8n:!V|Z9Ȫ'ԊM0[9n%gA̙(5Z^)`,s4#lV,^YdA_T޺3vhJQ6eQws阫w)K(:bz5Kڂ,z*0F˪< ]7ڙ3'Ů#j%i[)Q:ajkkU+1{q8IѺَz}kkȴGXtOJQ2IZ>@xl+0jD(cNݩ̧ݪ)sxInS+e`$\Oɮ9ɿhk^+ca˙+[J3k×i y5:ۯ.C0h )* *jٖ<۶ŅŝsGwmCGd{į* Ym—Wt7u\]낪 [ j?r`G̷lɪ DVZ[̜* z 3{LƷ|ɕDNŏܫ@A`w\y ѭ{4ۯ,Ma+飵̿5!,㿁j,]k# T|>zh@ʥaۺ|KLs[ SkKlgOꎀ)n0[*0ϐ1~:ad~3, XʤuM.(kbݟ^_K:l|{9`vYk"`ذ&3 8<L{Ʀ)q-I],,[?J\!S=,}12CoB) gsf++(P<U*}Di>kcZ6 mᘅ\ox/!-j0~z >Y:KJG 6˵*̬ŌK<7M4Ҁ'P_v4"֬NցN߰60-@-%+=nŽO-/@N,*ovd<+j<5{s5'~nߏ6l9~Y[SɅN KNdjNBvS?,+@.Wr4P>G % '#~J$ z朲v~SB#JD=764_Ahظ;5E59YY؝|kޝx\qM;syY-rؐ./\[+6 .t צ .Ijplڮkũ6;W`3}߲}lxE"R=ЫIHm>;b/{r#l_݊RaР0Ŋ%#N@ grVMxSIdGHp݅=WDms^tE{ܕCW_bƐ|B96R13eYFM;8WE72^k2AڂG̳mJ!QE&|F1CB)Jkތ $Q$dw.ɦ\Te5Ed(a$e_;wKdA`԰Y0uf$hGҠjM{5]'( ᡶYQYNY_iqR53=R TJ"t(4 ^ƔE5^L)7‰A46bؑKnnV9,lrH_D!zB64phlQlxZ,2F-@4Sl>lѡX muZ]AȇF%5I92m&(2'lō9mɣ-K@HwF}L>- BLY="(Wk)uggÙ0qqo,E3`[97~Kw>\{9j #ߞSf'4F-ѫ}4DE_x N1Uk>'6x*${6ao(V0E{l"1/*|X) %tl.j׮>K#Gz&u-1W@d _.Y}?ﰶlqPf)  X8A@PP{Y Vh" ^HDFo}ND6+ 0eV+} c:lEH(^8T1$-yWv,❢(RxA\_޴AxR-D;#E b$$9LFp)Xy4bG˚T6X/YL$[ՐۚC\G;s1XM"nD˜ 8^5jhBc )mA3yK8@ir@Ǒg ibcܧ4%n0e#0C,#Jhꘉ% R-x;R>h.`~!IK{ӍdX*4,*b@+H "6j;^"~FhjD]GTlqT 5kLb)J@(Q;G {:25r@늃ą4pIPwV fpX],cjOh&VlZfTb1>m+۱"FUԂ$):^6#mfj0zlc't;֔%P?U SAԙ71݀e*+[9)JzַW? u_BBSٟɲ&2F*sP9h - HJ$JhQ}d1پtR/)n RoF>9:򘋅5xaxQ9t#Zk/ sV.˚>vZN16# z2wr`n{wJ^ELdo0eB] e3|Y8|!I=אd̖GW5K "Gǘ`FV:S4@/]!\(4s{p!NdxwyXaI(Ihy|̄+6E9j[Zd8}^s4giqj$t- Eq$'xY]Bu+b XؒQ 9v7dBBpɌx p(pt>ًՁxCDnV8K @aC0Wy5L F)qq|h3?ɛ‰ؖ%; ;icon-9.4.3/ipl/gdata/vneumann.pts0000664000175000017500000000262407140713052016231 0ustar chrishchrish: 120 225 : 222 226 : 75 221 74 213 87 190 108 188 138 197 140 203 : 186 201 193 198 215 189 238 190 257 202 260 211 : 77 219 87 208 107 200 138 203 : 192 204 222 202 246 205 260 219 : 88 227 120 216 150 228 : 187 227 220 213 251 228 : 100 228 119 218 139 229 : 198 230 222 220 240 228 : 101 228 119 235 140 230 : 200 230 222 236 240 231 : 114 219 110 226 118 234 129 227 130 222 : 215 220 211 226 222 234 232 227 230 221 : 149 216 151 236 145 262 141 283 144 296 158 307 : 179 219 178 241 175 265 181 275 179 291 158 303 : 137 280 134 285 132 292 137 298 141 293 156 305 : 191 280 196 288 196 297 190 304 178 294 162 303 : 118 341 131 336 148 336 159 342 175 339 196 342 215 345 : 117 340 135 343 147 344 160 347 177 347 196 347 214 345 : 0 0 0 0 0 0 0 0 0 0 0 0 0 0 : 117 341 132 345 145 354 160 357 178 357 198 350 215 346 : 59 216 51 213 44 228 46 245 54 273 55 296 68 305 : 313 223 332 215 344 227 337 262 325 292 314 307 302 305 : 70 254 55 179 50 141 85 87 116 59 143 42 176 35 230 46 240 56 246 52 302 94 324 163 307 245 : 67 241 67 192 71 137 96 84 122 64 145 52 173 47 236 57 258 74 275 99 290 147 295 190 293 259 : 0 0 0 0 0 0 : 0 0 0 0 0 0 : 65 244 69 302 79 353 95 392 133 422 169 431 219 428 263 394 278 356 293 302 302 248 : 118 263 139 258 150 234 : 184 226 192 248 218 261 : 141 272 127 292 118 311 : 185 272 196 286 211 305 : 84 310 89 355 108 387 : 270 340 259 381 231 411 : 0 0 0 0 : 122 402 165 421 212 411 icon-9.4.3/ipl/gdocs/0002775000175000017500000000000010336137154013673 5ustar chrishchrishicon-9.4.3/ipl/gdocs/gtrace.txt0000664000175000017500000001137307303574363015713 0ustar chrishchrish Graphic Traces Introduction Several graphical components of the Icon program library rely on the concept of graphic traces. A graphic trace is simply a sequence of points. The purpose of graphic traces is to separate the computation of the geometrical components of figures from the rendering of them. This allows procedures that generate points to be used in a variety of ways. For example, they can be used by rendering procedures to draw figures. Alternatively, the points need not produce any figure at all, but they simply could be written to a file for later use or analysis. This approach also allows dif- ferent kinds of rendering procedures to use the same graphic traces. For example, the rendering might be done directly by drawing functions like XDrawPoint() or by using turtle graphics. The same graphic trace - sequence of points - also can be used in different ways. For example, individual points can be draw, suc- cessive points can be connected by lines, or the points can be used as locii for drawing other figures. Points In the abstract, a point is a location in n-dimensional space. We'll limit our considerations to two dimensions, although most of the ideas are easily generalized. The natural concrete representation of a point is an object with coordinate values. A record provides the natural programming interpretation of this: record Point(x, y) Thus Point(200, 100) creates a point at with x-y coordinates 200,100. A typical graphic trace procedure looks like this: procedure polygon(n, r) local angle, incr angle := 0 incr := 2 * &pi / n every 1 to n do { suspend Point(r * cos(angle), r * sin(angle)) angle +:= incr } end Dealing with points as objects with coordinate values is very - 1 - natural and intuitively appealing. The drawing functions, how- ever, require coordinate positions as x-y argument pairs, as in XDrawLine(200, 100, 300, 200) which draws a line from 200,100 to 300,200. There are good reasons why the drawling functions require x-y argument pairs. It is more efficient to represent points in this way, and in some cases it is simpler to compute a series of x-y values than it is to create points. Argument pairs can be stored in lists, as in point_list := [p1.x, p1.y, p2.x, p2.y] and supplied to drawing functions using list invocation: XDrawLine ! point_list There really is no way to reconcile the two different representation of points, one as objects with coordinate values and the other as argument pairs. Conversion between the two representations is simple, however, and utility procedures are provided for this. Since graphic traces are designed to provide a high level of abstraction, we will deal with points as objects and leave the conversion to argument pairs, when needed, to the rendering domain. Producing_and_Using_Graphic_Traces The Icon program library currently contains several collec- tions of procedures for generating graphic traces: curves.icn various plane curves rstars.icn regular stars fstars.icn ``fractal stars'' See these procedures for examples of how graphic traces can be produced. The procedures in gtrace.icn and xgrtrace.icn provide various operations on graphic traces. In order to perform a sequence of operations on graphic traces, it is helpful to use ``packaged'' calls, in which a pro- cedure and an argument list for it are encapsulated in an object. See calls.icn. Two programs in the current library use graphic traces: rstarlab.icn and fstarlab.icn. These programs use the procedures rstars.icn and fstars.icn mentioned earlier. These programs allow points from graphic traces to be used in various ways. - 2 - Turtle graphics (see turtle.icn) are used by default for render- ing. Limitations_of_Graphic_Traces A graphic trace is just a sequence of points. It contains no context for these points, other than the order in which they occur. For example, there is no information in a graphic trace (unless it is contrived) to identify transitions between parts of a composite object. Procedures that use graphic traces can, of course, use separately derived contextual information or coding techniques, such as buffering the points, to circumvent some kinds of prob- lems. By their nature, graphic graces are most appropriate for applications in which all points (except perhaps the first) are treated in the same way. Ralph E. Griswold Department of Computer Science The University of Arizona June 8, 1993 - 3 - icon-9.4.3/ipl/gdocs/README0000664000175000017500000000005507304761033014551 0ustar chrishchrish gtrace.txt documentation for graphic traces icon-9.4.3/ipl/gincl/0002775000175000017500000000000010336137154013670 5ustar chrishchrishicon-9.4.3/ipl/gincl/xcolors.icn0000664000175000017500000006772507140713046016072 0ustar chrishchrish############################################################################ # # File: xcolors.icn # # Subject: Definitions for X color names # # Author: Ralph E. Griswold # # Date: December 16, 1994 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # These definitions correspond to the colors that X provides on a typical # UNIX platform. # ############################################################################ $define AliceBlue "#f0f8ff" $define AntiqueWhite "#faebd7" $define AntiqueWhite1 "#ffefdb" $define AntiqueWhite2 "#eedfcc" $define AntiqueWhite3 "#cdc0b0" $define AntiqueWhite4 "#8b8378" $define BlanchedAlmond "#ffebcd" $define BlueViolet "#8a2be2" $define CadetBlue "#5f9ea0" $define CadetBlue1 "#98f5ff" $define CadetBlue2 "#8ee5ee" $define CadetBlue3 "#7ac5cd" $define CadetBlue4 "#53868b" $define CornflowerBlue "#6495ed" $define DarkGoldenrod "#b8860b" $define DarkGoldenrod1 "#ffb90f" $define DarkGoldenrod2 "#eead0e" $define DarkGoldenrod3 "#cd950c" $define DarkGoldenrod4 "#8b6508" $define DarkGreen "#006400" $define DarkKhaki "#bdb76b" $define DarkOliveGreen "#556b2f" $define DarkOliveGreen1 "#caff70" $define DarkOliveGreen2 "#bcee68" $define DarkOliveGreen3 "#a2cd5a" $define DarkOliveGreen4 "#6e8b3d" $define DarkOrange "#ff8c00" $define DarkOrange1 "#ff7f00" $define DarkOrange2 "#ee7600" $define DarkOrange3 "#cd6600" $define DarkOrange4 "#8b4500" $define DarkOrchid "#9932cc" $define DarkOrchid1 "#bf3eff" $define DarkOrchid2 "#b23aee" $define DarkOrchid3 "#9a32cd" $define DarkOrchid4 "#68228b" $define DarkSalmon "#e9967a" $define DarkSeaGreen "#8fbc8f" $define DarkSeaGreen1 "#c1ffc1" $define DarkSeaGreen2 "#b4eeb4" $define DarkSeaGreen3 "#9bcd9b" $define DarkSeaGreen4 "#698b69" $define DarkSlateBlue "#483d8b" $define DarkSlateGray "#2f4f4f" $define DarkSlateGray1 "#97ffff" $define DarkSlateGray2 "#8deeee" $define DarkSlateGray3 "#79cdcd" $define DarkSlateGray4 "#528b8b" $define DarkSlateGrey "#2f4f4f" $define DarkTurquoise "#00ced1" $define DarkViolet "#9400d3" $define DeepPink "#ff1493" $define DeepPink1 "#ff1493" $define DeepPink2 "#ee1289" $define DeepPink3 "#cd1076" $define DeepPink4 "#8b0a50" $define DeepSkyBlue "#00bfff" $define DeepSkyBlue1 "#00bfff" $define DeepSkyBlue2 "#00b2ee" $define DeepSkyBlue3 "#009acd" $define DeepSkyBlue4 "#00688b" $define DimGray "#696969" $define DimGrey "#696969" $define DodgerBlue "#1e90ff" $define DodgerBlue1 "#1e90ff" $define DodgerBlue2 "#1c86ee" $define DodgerBlue3 "#1874cd" $define DodgerBlue4 "#104e8b" $define FloralWhite "#fffaf0" $define ForestGreen "#228b22" $define GhostWhite "#f8f8ff" $define GreenYellow "#adff2f" $define HotPink "#ff69b4" $define HotPink1 "#ff6eb4" $define HotPink2 "#ee6aa7" $define HotPink3 "#cd6090" $define HotPink4 "#8b3a62" $define IndianRed "#cd5c5c" $define IndianRed1 "#ff6a6a" $define IndianRed2 "#ee6363" $define IndianRed3 "#cd5555" $define IndianRed4 "#8b3a3a" $define LavenderBlush "#fff0f5" $define LavenderBlush1 "#fff0f5" $define LavenderBlush2 "#eee0e5" $define LavenderBlush3 "#cdc1c5" $define LavenderBlush4 "#8b8386" $define LawnGreen "#7cfc00" $define LemonChiffon "#fffacd" $define LemonChiffon1 "#fffacd" $define LemonChiffon2 "#eee9bf" $define LemonChiffon3 "#cdc9a5" $define LemonChiffon4 "#8b8970" $define LightBlue "#add8e6" $define LightBlue1 "#bfefff" $define LightBlue2 "#b2dfee" $define LightBlue3 "#9ac0cd" $define LightBlue4 "#68838b" $define LightCoral "#f08080" $define LightCyan "#e0ffff" $define LightCyan1 "#e0ffff" $define LightCyan2 "#d1eeee" $define LightCyan3 "#b4cdcd" $define LightCyan4 "#7a8b8b" $define LightGoldenrod "#eedd82" $define LightGoldenrod1 "#ffec8b" $define LightGoldenrod2 "#eedc82" $define LightGoldenrod3 "#cdbe70" $define LightGoldenrod4 "#8b814c" $define LightGoldenrodYellow"#fafad2" $define LightGray "#d3d3d3" $define LightGrey "#d3d3d3" $define LightPink "#ffb6c1" $define LightPink1 "#ffaeb9" $define LightPink2 "#eea2ad" $define LightPink3 "#cd8c95" $define LightPink4 "#8b5f65" $define LightSalmon "#ffa07a" $define LightSalmon1 "#ffa07a" $define LightSalmon2 "#ee9572" $define LightSalmon3 "#cd8162" $define LightSalmon4 "#8b5742" $define LightSeaGreen "#20b2aa" $define LightSkyBlue "#87cefa" $define LightSkyBlue1 "#b0e2ff" $define LightSkyBlue2 "#a4d3ee" $define LightSkyBlue3 "#8db6cd" $define LightSkyBlue4 "#607b8b" $define LightSlateBlue "#8470ff" $define LightSlateGray "#778899" $define LightSlateGrey "#778899" $define LightSteelBlue "#b0c4de" $define LightSteelBlue1 "#cae1ff" $define LightSteelBlue2 "#bcd2ee" $define LightSteelBlue3 "#a2b5cd" $define LightSteelBlue4 "#6e7b8b" $define LightYellow "#ffffe0" $define LightYellow1 "#ffffe0" $define LightYellow2 "#eeeed1" $define LightYellow3 "#cdcdb4" $define LightYellow4 "#8b8b7a" $define LimeGreen "#32cd32" $define MediumAquamarine "#66cdaa" $define MediumBlue "#0000cd" $define MediumOrchid "#ba55d3" $define MediumOrchid1 "#e066ff" $define MediumOrchid2 "#d15fee" $define MediumOrchid3 "#b452cd" $define MediumOrchid4 "#7a378b" $define MediumPurple "#9370db" $define MediumPurple1 "#ab82ff" $define MediumPurple2 "#9f79ee" $define MediumPurple3 "#8968cd" $define MediumPurple4 "#5d478b" $define MediumSeaGreen "#3cb371" $define MediumSlateBlue "#7b68ee" $define MediumSpringGreen "#00fa9a" $define MediumTurquoise "#48d1cc" $define MediumVioletRed "#c71585" $define MidnightBlue "#191970" $define MintCream "#f5fffa" $define MistyRose "#ffe4e1" $define MistyRose1 "#ffe4e1" $define MistyRose2 "#eed5d2" $define MistyRose3 "#cdb7b5" $define MistyRose4 "#8b7d7b" $define NavajoWhite "#ffdead" $define NavajoWhite1 "#ffdead" $define NavajoWhite2 "#eecfa1" $define NavajoWhite3 "#cdb38b" $define NavajoWhite4 "#8b795e" $define NavyBlue "#000080" $define OldLace "#fdf5e6" $define OliveDrab "#6b8e23" $define OliveDrab1 "#c0ff3e" $define OliveDrab2 "#b3ee3a" $define OliveDrab3 "#9acd32" $define OliveDrab4 "#698b22" $define OrangeRed "#ff4500" $define OrangeRed1 "#ff4500" $define OrangeRed2 "#ee4000" $define OrangeRed3 "#cd3700" $define OrangeRed4 "#8b2500" $define PaleGoldenrod "#eee8aa" $define PaleGreen "#98fb98" $define PaleGreen1 "#9aff9a" $define PaleGreen2 "#90ee90" $define PaleGreen3 "#7ccd7c" $define PaleGreen4 "#548b54" $define PaleTurquoise "#afeeee" $define PaleTurquoise1 "#bbffff" $define PaleTurquoise2 "#aeeeee" $define PaleTurquoise3 "#96cdcd" $define PaleTurquoise4 "#668b8b" $define PaleVioletRed "#db7093" $define PaleVioletRed1 "#ff82ab" $define PaleVioletRed2 "#ee799f" $define PaleVioletRed3 "#cd6889" $define PaleVioletRed4 "#8b475d" $define PapayaWhip "#ffefd5" $define PeachPuff "#ffdab9" $define PeachPuff1 "#ffdab9" $define PeachPuff2 "#eecbad" $define PeachPuff3 "#cdaf95" $define PeachPuff4 "#8b7765" $define PowderBlue "#b0e0e6" $define RosyBrown "#bc8f8f" $define RosyBrown1 "#ffc1c1" $define RosyBrown2 "#eeb4b4" $define RosyBrown3 "#cd9b9b" $define RosyBrown4 "#8b6969" $define RoyalBlue "#4169e1" $define RoyalBlue1 "#4876ff" $define RoyalBlue2 "#436eee" $define RoyalBlue3 "#3a5fcd" $define RoyalBlue4 "#27408b" $define SaddleBrown "#8b4513" $define SandyBrown "#f4a460" $define SeaGreen "#2e8b57" $define SeaGreen1 "#54ff9f" $define SeaGreen2 "#4eee94" $define SeaGreen3 "#43cd80" $define SeaGreen4 "#2e8b57" $define SkyBlue "#87ceeb" $define SkyBlue1 "#87ceff" $define SkyBlue2 "#7ec0ee" $define SkyBlue3 "#6ca6cd" $define SkyBlue4 "#4a708b" $define SlateBlue "#6a5acd" $define SlateBlue1 "#836fff" $define SlateBlue2 "#7a67ee" $define SlateBlue3 "#6959cd" $define SlateBlue4 "#473c8b" $define SlateGray "#708090" $define SlateGray1 "#c6e2ff" $define SlateGray2 "#b9d3ee" $define SlateGray3 "#9fb6cd" $define SlateGray4 "#6c7b8b" $define SlateGrey "#708090" $define SpringGreen "#00ff7f" $define SpringGreen1 "#00ff7f" $define SpringGreen2 "#00ee76" $define SpringGreen3 "#00cd66" $define SpringGreen4 "#008b45" $define SteelBlue "#4682b4" $define SteelBlue1 "#63b8ff" $define SteelBlue2 "#5cacee" $define SteelBlue3 "#4f94cd" $define SteelBlue4 "#36648b" $define VioletRed "#d02090" $define VioletRed1 "#ff3e96" $define VioletRed2 "#ee3a8c" $define VioletRed3 "#cd3278" $define VioletRed4 "#8b2252" $define WhiteSmoke "#f5f5f5" $define YellowGreen "#9acd32" $define alice_blue "#f0f8ff" $define antique_white "#faebd7" $define aquamarine "#7fffd4" $define aquamarine1 "#7fffd4" $define aquamarine2 "#76eec6" $define aquamarine3 "#66cdaa" $define aquamarine4 "#458b74" $define azure "#f0ffff" $define azure1 "#f0ffff" $define azure2 "#e0eeee" $define azure3 "#c1cdcd" $define azure4 "#838b8b" $define beige "#f5f5dc" $define bisque "#ffe4c4" $define bisque1 "#ffe4c4" $define bisque2 "#eed5b7" $define bisque3 "#cdb79e" $define bisque4 "#8b7d6b" $define black "#000000" $define blanched_almond "#ffebcd" $define blue "#0000ff" $define blue1 "#0000ff" $define blue2 "#0000ee" $define blue3 "#0000cd" $define blue4 "#00008b" $define blue_violet "#8a2be2" $define brown "#a52a2a" $define brown1 "#ff4040" $define brown2 "#ee3b3b" $define brown3 "#cd3333" $define brown4 "#8b2323" $define burlywood "#deb887" $define burlywood1 "#ffd39b" $define burlywood2 "#eec591" $define burlywood3 "#cdaa7d" $define burlywood4 "#8b7355" $define cadet_blue "#5f9ea0" $define chartreuse "#7fff00" $define chartreuse1 "#7fff00" $define chartreuse2 "#76ee00" $define chartreuse3 "#66cd00" $define chartreuse4 "#458b00" $define chocolate "#d2691e" $define chocolate1 "#ff7f24" $define chocolate2 "#ee7621" $define chocolate3 "#cd661d" $define chocolate4 "#8b4513" $define coral "#ff7f50" $define coral1 "#ff7256" $define coral2 "#ee6a50" $define coral3 "#cd5b45" $define coral4 "#8b3e2f" $define cornflower_blue "#6495ed" $define cornsilk "#fff8dc" $define cornsilk1 "#fff8dc" $define cornsilk2 "#eee8cd" $define cornsilk3 "#cdc8b1" $define cornsilk4 "#8b8878" $define cyan "#00ffff" $define cyan1 "#00ffff" $define cyan2 "#00eeee" $define cyan3 "#00cdcd" $define cyan4 "#008b8b" $define dark_goldenrod "#b8860b" $define dark_green "#006400" $define dark_khaki "#bdb76b" $define dark_olive_green "#556b2f" $define dark_orange "#ff8c00" $define dark_orchid "#9932cc" $define dark_salmon "#e9967a" $define dark_sea_green "#8fbc8f" $define dark_slate_blue "#483d8b" $define dark_slate_gray "#2f4f4f" $define dark_slate_grey "#2f4f4f" $define dark_turquoise "#00ced1" $define dark_violet "#9400d3" $define deep_pink "#ff1493" $define deep_sky_blue "#00bfff" $define dim_gray "#696969" $define dim_grey "#696969" $define dodger_blue "#1e90ff" $define firebrick "#b22222" $define firebrick1 "#ff3030" $define firebrick2 "#ee2c2c" $define firebrick3 "#cd2626" $define firebrick4 "#8b1a1a" $define floral_white "#fffaf0" $define forest_green "#228b22" $define gainsboro "#dcdcdc" $define ghost_white "#f8f8ff" $define gold "#ffd700" $define gold1 "#ffd700" $define gold2 "#eec900" $define gold3 "#cdad00" $define gold4 "#8b7500" $define goldenrod "#daa520" $define goldenrod1 "#ffc125" $define goldenrod2 "#eeb422" $define goldenrod3 "#cd9b1d" $define goldenrod4 "#8b6914" $define gray "#bebebe" $define gray0 "#000000" $define gray1 "#030303" $define gray10 "#1a1a1a" $define gray100 "#ffffff" $define gray11 "#1c1c1c" $define gray12 "#1f1f1f" $define gray13 "#212121" $define gray14 "#242424" $define gray15 "#262626" $define gray16 "#292929" $define gray17 "#2b2b2b" $define gray18 "#2e2e2e" $define gray19 "#303030" $define gray2 "#050505" $define gray20 "#333333" $define gray21 "#363636" $define gray22 "#383838" $define gray23 "#3b3b3b" $define gray24 "#3d3d3d" $define gray25 "#404040" $define gray26 "#424242" $define gray27 "#454545" $define gray28 "#474747" $define gray29 "#4a4a4a" $define gray3 "#080808" $define gray30 "#4d4d4d" $define gray31 "#4f4f4f" $define gray32 "#525252" $define gray33 "#545454" $define gray34 "#575757" $define gray35 "#595959" $define gray36 "#5c5c5c" $define gray37 "#5e5e5e" $define gray38 "#616161" $define gray39 "#636363" $define gray4 "#0a0a0a" $define gray40 "#666666" $define gray41 "#696969" $define gray42 "#6b6b6b" $define gray43 "#6e6e6e" $define gray44 "#707070" $define gray45 "#737373" $define gray46 "#757575" $define gray47 "#787878" $define gray48 "#7a7a7a" $define gray49 "#7d7d7d" $define gray5 "#0d0d0d" $define gray50 "#7f7f7f" $define gray51 "#828282" $define gray52 "#858585" $define gray53 "#878787" $define gray54 "#8a8a8a" $define gray55 "#8c8c8c" $define gray56 "#8f8f8f" $define gray57 "#919191" $define gray58 "#949494" $define gray59 "#969696" $define gray6 "#0f0f0f" $define gray60 "#999999" $define gray61 "#9c9c9c" $define gray62 "#9e9e9e" $define gray63 "#a1a1a1" $define gray64 "#a3a3a3" $define gray65 "#a6a6a6" $define gray66 "#a8a8a8" $define gray67 "#ababab" $define gray68 "#adadad" $define gray69 "#b0b0b0" $define gray7 "#121212" $define gray70 "#b3b3b3" $define gray71 "#b5b5b5" $define gray72 "#b8b8b8" $define gray73 "#bababa" $define gray74 "#bdbdbd" $define gray75 "#bfbfbf" $define gray76 "#c2c2c2" $define gray77 "#c4c4c4" $define gray78 "#c7c7c7" $define gray79 "#c9c9c9" $define gray8 "#141414" $define gray80 "#cccccc" $define gray81 "#cfcfcf" $define gray82 "#d1d1d1" $define gray83 "#d4d4d4" $define gray84 "#d6d6d6" $define gray85 "#d9d9d9" $define gray86 "#dbdbdb" $define gray87 "#dedede" $define gray88 "#e0e0e0" $define gray89 "#e3e3e3" $define gray9 "#171717" $define gray90 "#e5e5e5" $define gray91 "#e8e8e8" $define gray92 "#ebebeb" $define gray93 "#ededed" $define gray94 "#f0f0f0" $define gray95 "#f2f2f2" $define gray96 "#f5f5f5" $define gray97 "#f7f7f7" $define gray98 "#fafafa" $define gray99 "#fcfcfc" $define green "#00ff00" $define green1 "#00ff00" $define green2 "#00ee00" $define green3 "#00cd00" $define green4 "#008b00" $define green_yellow "#adff2f" $define grey "#bebebe" $define grey0 "#000000" $define grey1 "#030303" $define grey10 "#1a1a1a" $define grey100 "#ffffff" $define grey11 "#1c1c1c" $define grey12 "#1f1f1f" $define grey13 "#212121" $define grey14 "#242424" $define grey15 "#262626" $define grey16 "#292929" $define grey17 "#2b2b2b" $define grey18 "#2e2e2e" $define grey19 "#303030" $define grey2 "#050505" $define grey20 "#333333" $define grey21 "#363636" $define grey22 "#383838" $define grey23 "#3b3b3b" $define grey24 "#3d3d3d" $define grey25 "#404040" $define grey26 "#424242" $define grey27 "#454545" $define grey28 "#474747" $define grey29 "#4a4a4a" $define grey3 "#080808" $define grey30 "#4d4d4d" $define grey31 "#4f4f4f" $define grey32 "#525252" $define grey33 "#545454" $define grey34 "#575757" $define grey35 "#595959" $define grey36 "#5c5c5c" $define grey37 "#5e5e5e" $define grey38 "#616161" $define grey39 "#636363" $define grey4 "#0a0a0a" $define grey40 "#666666" $define grey41 "#696969" $define grey42 "#6b6b6b" $define grey43 "#6e6e6e" $define grey44 "#707070" $define grey45 "#737373" $define grey46 "#757575" $define grey47 "#787878" $define grey48 "#7a7a7a" $define grey49 "#7d7d7d" $define grey5 "#0d0d0d" $define grey50 "#7f7f7f" $define grey51 "#828282" $define grey52 "#858585" $define grey53 "#878787" $define grey54 "#8a8a8a" $define grey55 "#8c8c8c" $define grey56 "#8f8f8f" $define grey57 "#919191" $define grey58 "#949494" $define grey59 "#969696" $define grey6 "#0f0f0f" $define grey60 "#999999" $define grey61 "#9c9c9c" $define grey62 "#9e9e9e" $define grey63 "#a1a1a1" $define grey64 "#a3a3a3" $define grey65 "#a6a6a6" $define grey66 "#a8a8a8" $define grey67 "#ababab" $define grey68 "#adadad" $define grey69 "#b0b0b0" $define grey7 "#121212" $define grey70 "#b3b3b3" $define grey71 "#b5b5b5" $define grey72 "#b8b8b8" $define grey73 "#bababa" $define grey74 "#bdbdbd" $define grey75 "#bfbfbf" $define grey76 "#c2c2c2" $define grey77 "#c4c4c4" $define grey78 "#c7c7c7" $define grey79 "#c9c9c9" $define grey8 "#141414" $define grey80 "#cccccc" $define grey81 "#cfcfcf" $define grey82 "#d1d1d1" $define grey83 "#d4d4d4" $define grey84 "#d6d6d6" $define grey85 "#d9d9d9" $define grey86 "#dbdbdb" $define grey87 "#dedede" $define grey88 "#e0e0e0" $define grey89 "#e3e3e3" $define grey9 "#171717" $define grey90 "#e5e5e5" $define grey91 "#e8e8e8" $define grey92 "#ebebeb" $define grey93 "#ededed" $define grey94 "#f0f0f0" $define grey95 "#f2f2f2" $define grey96 "#f5f5f5" $define grey97 "#f7f7f7" $define grey98 "#fafafa" $define grey99 "#fcfcfc" $define honeydew "#f0fff0" $define honeydew1 "#f0fff0" $define honeydew2 "#e0eee0" $define honeydew3 "#c1cdc1" $define honeydew4 "#838b83" $define hot_pink "#ff69b4" $define indian_red "#cd5c5c" $define ivory "#fffff0" $define ivory1 "#fffff0" $define ivory2 "#eeeee0" $define ivory3 "#cdcdc1" $define ivory4 "#8b8b83" $define khaki "#f0e68c" $define khaki1 "#fff68f" $define khaki2 "#eee685" $define khaki3 "#cdc673" $define khaki4 "#8b864e" $define lavender "#e6e6fa" $define lavender_blush "#fff0f5" $define lawn_green "#7cfc00" $define lemon_chiffon "#fffacd" $define light_blue "#add8e6" $define light_coral "#f08080" $define light_cyan "#e0ffff" $define light_goldenrod "#eedd82" $define light_goldenrod_yell"#fafad2" $define light_gray "#d3d3d3" $define light_grey "#d3d3d3" $define light_pink "#ffb6c1" $define light_salmon "#ffa07a" $define light_sea_green "#20b2aa" $define light_sky_blue "#87cefa" $define light_slate_blue "#8470ff" $define light_slate_gray "#778899" $define light_slate_grey "#778899" $define light_steel_blue "#b0c4de" $define light_yellow "#ffffe0" $define lime_green "#32cd32" $define linen "#faf0e6" $define magenta "#ff00ff" $define magenta1 "#ff00ff" $define magenta2 "#ee00ee" $define magenta3 "#cd00cd" $define magenta4 "#8b008b" $define maroon "#b03060" $define maroon1 "#ff34b3" $define maroon2 "#ee30a7" $define maroon3 "#cd2990" $define maroon4 "#8b1c62" $define medium_aquamarine "#66cdaa" $define medium_blue "#0000cd" $define medium_orchid "#ba55d3" $define medium_purple "#9370db" $define medium_sea_green "#3cb371" $define medium_slate_blue "#7b68ee" $define medium_spring_green "#00fa9a" $define medium_turquoise "#48d1cc" $define medium_violet_red "#c71585" $define midnight_blue "#191970" $define mint_cream "#f5fffa" $define misty_rose "#ffe4e1" $define moccasin "#ffe4b5" $define navajo_white "#ffdead" $define navy "#000080" $define navy_blue "#000080" $define old_lace "#fdf5e6" $define olive_drab "#6b8e23" $define orange "#ffa500" $define orange1 "#ffa500" $define orange2 "#ee9a00" $define orange3 "#cd8500" $define orange4 "#8b5a00" $define orange_red "#ff4500" $define orchid "#da70d6" $define orchid1 "#ff83fa" $define orchid2 "#ee7ae9" $define orchid3 "#cd69c9" $define orchid4 "#8b4789" $define pale_goldenrod "#eee8aa" $define pale_green "#98fb98" $define pale_turquoise "#afeeee" $define pale_violet_red "#db7093" $define papaya_whip "#ffefd5" $define peach_puff "#ffdab9" $define peru "#cd853f" $define pink "#ffc0cb" $define pink1 "#ffb5c5" $define pink2 "#eea9b8" $define pink3 "#cd919e" $define pink4 "#8b636c" $define plum "#dda0dd" $define plum1 "#ffbbff" $define plum2 "#eeaeee" $define plum3 "#cd96cd" $define plum4 "#8b668b" $define powder_blue "#b0e0e6" $define purple "#a020f0" $define purple1 "#9b30ff" $define purple2 "#912cee" $define purple3 "#7d26cd" $define purple4 "#551a8b" $define red "#ff0000" $define red1 "#ff0000" $define red2 "#ee0000" $define red3 "#cd0000" $define red4 "#8b0000" $define rosy_brown "#bc8f8f" $define royal_blue "#4169e1" $define saddle_brown "#8b4513" $define salmon "#fa8072" $define salmon1 "#ff8c69" $define salmon2 "#ee8262" $define salmon3 "#cd7054" $define salmon4 "#8b4c39" $define sandy_brown "#f4a460" $define sea_green "#2e8b57" $define seashell "#fff5ee" $define seashell1 "#fff5ee" $define seashell2 "#eee5de" $define seashell3 "#cdc5bf" $define seashell4 "#8b8682" $define sienna "#a0522d" $define sienna1 "#ff8247" $define sienna2 "#ee7942" $define sienna3 "#cd6839" $define sienna4 "#8b4726" $define sky_blue "#87ceeb" $define slate_blue "#6a5acd" $define slate_gray "#708090" $define slate_grey "#708090" $define snow "#fffafa" $define snow1 "#fffafa" $define snow2 "#eee9e9" $define snow3 "#cdc9c9" $define snow4 "#8b8989" $define spring_green "#00ff7f" $define steel_blue "#4682b4" $define tan "#d2b48c" $define tan1 "#ffa54f" $define tan2 "#ee9a49" $define tan3 "#cd853f" $define tan4 "#8b5a2b" $define thistle "#d8bfd8" $define thistle1 "#ffe1ff" $define thistle2 "#eed2ee" $define thistle3 "#cdb5cd" $define thistle4 "#8b7b8b" $define tomato "#ff6347" $define tomato1 "#ff6347" $define tomato2 "#ee5c42" $define tomato3 "#cd4f39" $define tomato4 "#8b3626" $define turquoise "#40e0d0" $define turquoise1 "#00f5ff" $define turquoise2 "#00e5ee" $define turquoise3 "#00c5cd" $define turquoise4 "#00868b" $define violet "#ee82ee" $define violet_red "#d02090" $define wheat "#f5deb3" $define wheat1 "#ffe7ba" $define wheat2 "#eed8ae" $define wheat3 "#cdba96" $define wheat4 "#8b7e66" $define white "#ffffff" $define white_smoke "#f5f5f5" $define yellow "#ffff00" $define yellow1 "#ffff00" $define yellow2 "#eeee00" $define yellow3 "#cdcd00" $define yellow4 "#8b8b00" $define yellow_green "#9acd32" icon-9.4.3/ipl/gincl/xnames.icn0000664000175000017500000000565707140713045015667 0ustar chrishchrish############################################################################ # # File: xnames.icn # # Subject: Definitions for graphic procedure names # # Author: Ralph E. Griswold # # Date: May 26, 1994 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # These definitions are provided for compatibility between versions 8.10 # and 9.0 of Icon. # ############################################################################ $ifdef _V9 $define VNotice Notice $define XActive Active $define XAlert Alert $define XAttrib WAttrib $define XBg Bg $define XClearArea EraseArea $define XClip Clip $define XClone Clone $define XColor Color $define XColorValue ColorValue $define XCopyArea CopyArea $define XDefault WDefault $define XDrawCurve DrawCurve $define XDrawImage DrawImage $define XDrawLine DrawLine $define XDrawPoint DrawPoint $define XDrawRectangle DrawRectangle $define XDrawSegment DrawSegment $define XDrawString DrawString $define XEraseArea EraseArea $define XEvent Event $define XFg Fg $define XFillPolygon FillPolygon $define XFillRectangle FillRectangle $define XFlush WFlush $define XFont Font $define XFreeColor FreeColor $define XGotoRC GotoRC $define XGotoXY GotoXY $define XLower Lower $define XNewColor NewColor $define XPaletteChars PaletteChars $define XPaletteColor PaletteColor $define XPaletteKey PaletteKey $define XPattern Pattern $define XPending Pending $define XPixel Pixel $define XQueryPointer QueryPointer $define XRGBKey RGBKey $define XRaise Raise $define XReadImage ReadImage $define XSync WSync $define XTextWidth TextWidth $define XUnbind Uncouple $define XWriteImage WriteImage $else $define Notice VNotice $define Active XActive $define Alert XAlert $define Bg XBg $define Bind XBind $define ClearArea XClearArea $define Clip XClip $define Clone XClone $define Color XColor $define ColorValue XColorValue $define CopyArea XCopyArea $define DrawCurve XDrawCurve $define DrawImage XDrawImage $define DrawLine XDrawLine $define DrawPoint XDrawPoint $define DrawRectangle XDrawRectangle $define DrawSegment XDrawSegment $define DrawString XDrawString $define EraseArea XEraseArea $define Event XEvent $define Fg XFg $define FillPolygon XFillPolygon $define FillRectangle XFillRectangle $define Font XFont $define FreeColor XFreeColor $define GotoRC XGotoRC $define GotoXY XGotoXY $define Lower XLower $define NewColor XNewColor $define PaletteChars XPaletteChars $define PaletteColor XPaletteColor $define PaletteKey XPaletteKey $define Pattern XPattern $define Pending XPending $define Pixel XPixel $define QueryPointer XQueryPointer $define RGBKey XRGBKey $define Raise XRaise $define ReadImage XReadImage $define TextWidth XTextWidth $define WAttrib XAttrib $define WDefault XDefault $define WFlush XFlush $define WSync XSync $define Uncouple XUnbind $define WriteImage XWriteImage $endif icon-9.4.3/ipl/gincl/vdefns.icn0000664000175000017500000000214407140713046015646 0ustar chrishchrish############################################################################ # # File: vdefns.icn # # Subject: Definitions for visual interface # # Author: Gregg M. Townsend # # Date: October 26, 1997 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # This file contains definitions used by the dialog and vidget library # and by the interface builder, VIB. # ############################################################################ # # Requires: Version 9.0 of Icon # ############################################################################ # Fixed font width, in pixels, assumed by VIB $define VFWidth 7 # Geometry rules for sliders and scrollbars $define VSlider_MinAspect 3 $define VSlider_MinWidth 10 $define VSlider_DefWidth 15 $define VSlider_DefLength 60 # Background color $ifdef _MS_WINDOWS $define VBackground "#C0C0C0" # good value for 4-bit MSWIN systems $else $define VBackground "pale gray" # somewhat lighter under X $endif icon-9.4.3/ipl/gincl/keysyms.icn0000664000175000017500000000753007140713045016070 0ustar chrishchrish############################################################################ # # File: keysyms.icn # # Subject: Definitions for event key symbols # # Authors: Ralph E. Griswold, Gregg M. Townsend, Clinton L. Jeffery # # Date: July 14, 1998 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # This file contains definitions for the graphics event values returned # by "outboard" keys such as Key_F1, Key_Insert, Key_Pause, and so on. # ############################################################################ # # Requires: Version 9.0 of Icon # ############################################################################ $ifdef _X_WINDOW_SYSTEM $define Key_Compose 65312 $define Key_Do 65383 $define Key_Down 65364 $define Key_End 65367 $define Key_F1 65470 $define Key_F2 65471 $define Key_F3 65472 $define Key_F4 65473 $define Key_F5 65474 $define Key_F6 65475 $define Key_F7 65476 $define Key_F8 65477 $define Key_F9 65478 $define Key_F10 65479 $define Key_F11 65480 $define Key_F12 65481 $define Key_F13 65482 $define Key_F14 65483 $define Key_F15 65484 $define Key_F16 65485 $define Key_F17 65486 $define Key_F18 65487 $define Key_F19 65488 $define Key_F20 65489 $define Key_Find 65384 $define Key_Help 65386 $define Key_Home 65360 $define Key_Insert 65379 $define Key_KP_Down 65433 $define Key_KP_Left 65430 $define Key_KP_Right 65432 $define Key_KP_Up 65431 $define Key_L1 65480 # clash with f11 $define Key_L2 65481 # clash with f12 $define Key_L3 65482 $define Key_L4 65483 $define Key_L5 65484 $define Key_L6 65485 $define Key_L7 65486 $define Key_L8 65487 $define Key_L9 65488 $define Key_L10 65489 $define Key_Left 65361 $define Key_PF1 65425 $define Key_PF2 65426 $define Key_PF3 65427 $define Key_PF4 65428 $define Key_Pause 65299 $define Key_PgDn 65366 $define Key_PgUp 65365 $define Key_PrSc 65377 $define Key_R1 65490 $define Key_R2 65491 $define Key_R3 65492 $define Key_R4 65493 $define Key_R5 65494 $define Key_R6 65495 $define Key_R7 65496 $define Key_R8 65497 $define Key_R9 65498 $define Key_R10 65499 $define Key_R11 65500 $define Key_R12 65501 $define Key_R13 65502 $define Key_R14 65503 $define Key_R15 65504 $define Key_Right 65363 $define Key_ScrollLock 65300 $define Key_Select 65376 $define Key_Up 65362 $endif $ifdef _MS_WINDOWS $define Key_Down 40 $define Key_End 35 $define Key_ScrollLock 145 $define Key_F1 112 $define Key_F2 113 $define Key_F3 114 $define Key_F4 115 $define Key_F5 116 $define Key_F6 117 $define Key_F7 118 $define Key_F8 119 $define Key_F9 120 $define Key_F10 121 $define Key_F11 122 $define Key_F12 123 $define Key_F13 124 $define Key_F14 125 $define Key_F15 126 $define Key_F16 127 $define Key_F17 128 $define Key_F18 129 $define Key_F19 130 $define Key_F20 131 $define Key_F21 132 $define Key_F22 133 $define Key_F23 134 $define Key_F24 135 $define Key_Help 47 $define Key_Home 36 $define Key_Insert 45 $define Key_Left 37 $define Key_Pause 19 $define Key_PgDn 34 $define Key_PgUp 33 $define Key_PrSc 44 $define Key_Right 39 $define Key_Select 41 $define Key_Up 38 $endif $ifdef _JAVA $define Key_PrSc 154 $define Key_ScrollLock 145 $define Key_Pause 19 $define Key_Insert 155 $define Key_PgUp 33 $define Key_PgDn 34 $define Key_Home 36 $define Key_End 35 $define Key_Left 37 $define Key_Up 38 $define Key_Right 39 $define Key_Down 40 $define Key_F1 112 $define Key_F2 113 $define Key_F3 114 $define Key_F4 115 $define Key_F5 116 $define Key_F6 117 $define Key_F7 118 $define Key_F8 119 $define Key_F9 120 $define Key_F10 121 $define Key_F11 122 $define Key_F12 123 $endif icon-9.4.3/ipl/gincl/maccolor.icn0000664000175000017500000002060507140713046016162 0ustar chrishchrish############################################################################ # # File: maccolor.icn # # Subject: Definitions for Macintosh color mappings # # Author: Ralph E. Griswold # # Date: August 14, 1996 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # The table map16 maps hexadecimal digits for Macintosh the 16-color # system palette to RGB equivalents. The table map256 does the same for # the 256-color system palette. # ############################################################################ map16 := table() map256 := table() map16["0"] := "#FFFFFF" map16["1"] := "#FFFF00" map16["2"] := "#FF6600" map16["3"] := "#DD0000" map16["4"] := "#FF0099" map16["5"] := "#330099" map16["6"] := "#0000DD" map16["7"] := "#0099FF" map16["8"] := "#00BB00" map16["9"] := "#006600" map16["A"] := "#663300" map16["B"] := "#996633" map16["C"] := "#CCCCCC" map16["D"] := "#888888" map16["E"] := "#444444" map16["F"] := "#000000" map256["00"] := "#FFFFFF" map256["01"] := "#FFFFCC" map256["02"] := "#FFFF99" map256["03"] := "#FFFF66" map256["04"] := "#FFFF33" map256["05"] := "#FFFF00" map256["06"] := "#FFCCFF" map256["07"] := "#FFCCCC" map256["08"] := "#FFCC99" map256["09"] := "#FFCC66" map256["0A"] := "#FFCC33" map256["0B"] := "#FFCC00" map256["0C"] := "#FF99FF" map256["0D"] := "#FF99CC" map256["0E"] := "#FF9999" map256["0F"] := "#FF9966" map256["10"] := "#FF9933" map256["11"] := "#FF9900" map256["12"] := "#FF66FF" map256["13"] := "#FF66CC" map256["14"] := "#FF6699" map256["15"] := "#FF6666" map256["16"] := "#FF6633" map256["17"] := "#FF6600" map256["18"] := "#FF33FF" map256["19"] := "#FF33CC" map256["1A"] := "#FF3399" map256["1B"] := "#FF3366" map256["1C"] := "#FF3333" map256["1D"] := "#FF3300" map256["1E"] := "#FF00FF" map256["1F"] := "#FF00CC" map256["20"] := "#FF0099" map256["21"] := "#FF0066" map256["22"] := "#FF0033" map256["23"] := "#FF0000" map256["24"] := "#CCFFFF" map256["25"] := "#CCFFCC" map256["26"] := "#CCFF99" map256["27"] := "#CCFF66" map256["28"] := "#CCFF33" map256["29"] := "#CCFF00" map256["2A"] := "#CCCCFF" map256["2B"] := "#CCCCCC" map256["2C"] := "#CCCC99" map256["2D"] := "#CCCC66" map256["2E"] := "#CCCC33" map256["2F"] := "#CCCC00" map256["30"] := "#CC99FF" map256["31"] := "#CC99CC" map256["32"] := "#CC9999" map256["33"] := "#CC9966" map256["34"] := "#CC9933" map256["35"] := "#CC9900" map256["36"] := "#CC66FF" map256["37"] := "#CC66CC" map256["38"] := "#CC6699" map256["39"] := "#CC6666" map256["3A"] := "#CC6633" map256["3B"] := "#CC6600" map256["3C"] := "#CC33FF" map256["3D"] := "#CC33CC" map256["3E"] := "#CC3399" map256["3F"] := "#CC3366" map256["40"] := "#CC3333" map256["41"] := "#CC3300" map256["42"] := "#CC00FF" map256["43"] := "#CC00CC" map256["44"] := "#CC0099" map256["45"] := "#CC0066" map256["46"] := "#CC0033" map256["47"] := "#CC0000" map256["48"] := "#99FFFF" map256["49"] := "#99FFCC" map256["4A"] := "#99FF99" map256["4B"] := "#99FF66" map256["4C"] := "#99FF33" map256["4D"] := "#99FF00" map256["4E"] := "#99CCFF" map256["4F"] := "#99CCCC" map256["50"] := "#99CC99" map256["51"] := "#99CC66" map256["52"] := "#99CC33" map256["53"] := "#99CC00" map256["54"] := "#9999FF" map256["55"] := "#9999CC" map256["56"] := "#999999" map256["57"] := "#999966" map256["58"] := "#999933" map256["59"] := "#999900" map256["5A"] := "#9966FF" map256["5B"] := "#9966CC" map256["5C"] := "#996699" map256["5D"] := "#996666" map256["5E"] := "#996633" map256["5F"] := "#996600" map256["60"] := "#9933FF" map256["61"] := "#9933CC" map256["62"] := "#993399" map256["63"] := "#993366" map256["64"] := "#993333" map256["65"] := "#993300" map256["66"] := "#9900FF" map256["67"] := "#9900CC" map256["68"] := "#990099" map256["69"] := "#990066" map256["6A"] := "#990033" map256["6B"] := "#990000" map256["6C"] := "#66FFFF" map256["6D"] := "#66FFCC" map256["6E"] := "#66FF99" map256["6F"] := "#66FF66" map256["70"] := "#66FF33" map256["71"] := "#66FF00" map256["72"] := "#66CCFF" map256["73"] := "#66CCCC" map256["74"] := "#66CC99" map256["75"] := "#66CC66" map256["76"] := "#66CC33" map256["77"] := "#66CC00" map256["78"] := "#6699FF" map256["79"] := "#6699CC" map256["7A"] := "#669999" map256["7B"] := "#669966" map256["7C"] := "#669933" map256["7D"] := "#669900" map256["7E"] := "#6666FF" map256["7F"] := "#6666CC" map256["80"] := "#666699" map256["81"] := "#666666" map256["82"] := "#666633" map256["83"] := "#666600" map256["84"] := "#6633FF" map256["85"] := "#6633CC" map256["86"] := "#663399" map256["87"] := "#663366" map256["88"] := "#663333" map256["89"] := "#663300" map256["8A"] := "#6600FF" map256["8B"] := "#6600CC" map256["8C"] := "#660099" map256["8D"] := "#660066" map256["8E"] := "#660033" map256["8F"] := "#660000" map256["90"] := "#33FFFF" map256["91"] := "#33FFCC" map256["92"] := "#33FF99" map256["93"] := "#33FF66" map256["94"] := "#33FF33" map256["95"] := "#33FF00" map256["96"] := "#33CCFF" map256["97"] := "#33CCCC" map256["98"] := "#33CC99" map256["99"] := "#33CC66" map256["9A"] := "#33CC33" map256["9B"] := "#33CC00" map256["9C"] := "#3399FF" map256["9D"] := "#3399CC" map256["9E"] := "#339999" map256["9F"] := "#339966" map256["A0"] := "#339933" map256["A1"] := "#339900" map256["A2"] := "#3366FF" map256["A3"] := "#3366CC" map256["A4"] := "#336699" map256["A5"] := "#336666" map256["A6"] := "#336633" map256["A7"] := "#336600" map256["A8"] := "#3333FF" map256["A9"] := "#3333CC" map256["AA"] := "#333399" map256["AB"] := "#333366" map256["AC"] := "#333333" map256["AD"] := "#333300" map256["AE"] := "#3300FF" map256["AF"] := "#3300CC" map256["B0"] := "#330099" map256["B1"] := "#330066" map256["B2"] := "#330033" map256["B3"] := "#330000" map256["B4"] := "#00FFFF" map256["B5"] := "#00FFCC" map256["B6"] := "#00FF99" map256["B7"] := "#00FF66" map256["B8"] := "#00FF33" map256["B9"] := "#00FF00" map256["BA"] := "#00CCFF" map256["BB"] := "#00CCCC" map256["BC"] := "#00CC99" map256["BD"] := "#00CC66" map256["BE"] := "#00CC33" map256["BF"] := "#00CC00" map256["C0"] := "#0099FF" map256["C1"] := "#0099CC" map256["C2"] := "#009999" map256["C3"] := "#009966" map256["C4"] := "#009933" map256["C5"] := "#009900" map256["C6"] := "#0066FF" map256["C7"] := "#0066CC" map256["C8"] := "#006699" map256["C9"] := "#006666" map256["CA"] := "#006633" map256["CB"] := "#006600" map256["CC"] := "#0033FF" map256["CD"] := "#0033CC" map256["CE"] := "#003399" map256["CF"] := "#003366" map256["D0"] := "#003333" map256["D1"] := "#003300" map256["D2"] := "#0000FF" map256["D3"] := "#0000CC" map256["D4"] := "#000099" map256["D5"] := "#000066" map256["D6"] := "#000033" map256["D7"] := "#EE0000" map256["D8"] := "#DD0000" map256["D9"] := "#BB0000" map256["DA"] := "#AA0000" map256["DB"] := "#880000" map256["DC"] := "#770000" map256["DD"] := "#550000" map256["DE"] := "#440000" map256["DF"] := "#220000" map256["E0"] := "#110000" map256["E1"] := "#00EE00" map256["E2"] := "#00DD00" map256["E3"] := "#00BB00" map256["E4"] := "#00AA00" map256["E5"] := "#008800" map256["E6"] := "#007700" map256["E7"] := "#005500" map256["E8"] := "#004400" map256["E9"] := "#002200" map256["EA"] := "#001100" map256["EB"] := "#0000EE" map256["EC"] := "#0000DD" map256["ED"] := "#0000BB" map256["EE"] := "#0000AA" map256["EF"] := "#000088" map256["F0"] := "#000077" map256["F1"] := "#000055" map256["F2"] := "#000044" map256["F3"] := "#000022" map256["F4"] := "#000011" map256["F5"] := "#EEEEEE" map256["F6"] := "#DDDDDD" map256["F7"] := "#BBBBBB" map256["F8"] := "#AAAAAA" map256["F9"] := "#888888" map256["FA"] := "#777777" map256["FB"] := "#555555" map256["FC"] := "#444444" map256["FD"] := "#222222" map256["FE"] := "#111111" map256["FF"] := "#000000" icon-9.4.3/ipl/mincl/0002775000175000017500000000000010336137157013701 5ustar chrishchrishicon-9.4.3/ipl/mincl/etdefs.icn0000664000175000017500000000161307140713052015636 0ustar chrishchrish############################################################################ # # File: etdefs.icn # # Subject: Definitions for artificial event codes # # Author: Ralph E. Griswold # # Date: August 16, 1994 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # This file contains definitions for event codes. # # This file is intended for use with event monitors running under # MT Icon. # ############################################################################ $define T_01 "A" $define T_02 "B" $define T_03 "C" $define T_04 "D" $define T_05 "E" $define T_06 "F" $define T_07 "G" $define T_08 "H" $define T_09 "I" $define T_10 "J" $define T_11 "K" $define T_12 "L" $define T_13 "M" $define T_14 "N" $define T_Mask1 cset("ABCDEFGHIJKLM") icon-9.4.3/ipl/mincl/evdefs.icn0000664000175000017500000002151607424071014015644 0ustar chrishchrish############################################################################ # # File: evdefs.icn # # Subject: Definitions for event codes # # Author: Ralph E. Griswold # # Date: February 28, 1997 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # This file contains definitions for event codes. # # This file is intended for use with event monitors running under # MT Icon. # ############################################################################ # # This file is generated automatically from monitor.h. # ############################################################################ $define T_Coexpr 19 $define T_Cset 5 $define T_External 20 $define T_File 6 $define T_Integer 2 $define T_Kywdevent 26 $define T_Kywdint 21 $define T_Kywdpos 22 $define T_Kywdstr 25 $define T_Kywdsubj 23 $define T_Kywdwin 24 $define T_Lelem 10 $define T_List 9 $define T_Lrgint 3 $define T_Null 1 $define T_Proc 7 $define T_Real 4 $define T_Record 8 $define T_Refresh 18 $define T_Selem 12 $define T_Set 11 $define T_Slots 16 $define T_String 0 $define T_Table 13 $define T_Telem 14 $define T_Tvsubs 17 $define T_Tvtbl 15 $define E_Aconv "\111" # Conversion attempt $define E_Alien "\172" # Alien allocation $define E_Assign "\347" # Assignment $define E_BlkDeAlc "\055" # Block deallocation $define E_Bsusp "\142" # Suspension from operation $define E_Coact "\101" # Co-expression activation $define E_Coexpr "\170" # Co-expression allocation $define E_Cofail "\104" # Co-expression failure $define E_Collect "\107" # Garbage collection $define E_Coret "\102" # Co-expression return $define E_Cset "\145" # Cset allocation $define E_Ecall "\143" # Call of operation $define E_Efail "\146" # Failure from expression $define E_EndCollect "\360" # End of garbage collection $define E_Erem "\166" # Removal of a suspended generator $define E_Eresum "\165" # Resumption of expression $define E_Error "\105" # Run-time error $define E_Esusp "\141" # Suspension from alternation $define E_Exit "\130" # Program exit $define E_External "\152" # External allocation $define E_Fcall "\072" # Function call $define E_Fconv "\112" # Conversion failure $define E_Ffail "\115" # Function failure $define E_File "\147" # File allocation $define E_Free "\132" # Free region $define E_Frem "\133" # Function suspension removal $define E_Fresum "\131" # Function resumption $define E_Fret "\120" # Function return $define E_Fsusp "\127" # Function suspension $define E_Intcall "\351" # interpreter call $define E_Integer "\100" # Integer value pseudo-event $define E_Intret "\352" # interpreter return $define E_Kywdint "\136" # Integer keyword value pseudo-event $define E_Kywdpos "\046" # Position value pseudo-event $define E_Kywdsubj "\052" # Subject value pseudo-event $define E_Lbang "\301" # List generation $define E_Lcreate "\302" # List creation $define E_Lelem "\155" # List element allocation $define E_Lget "\356" # List get/pop -- only E_Lget used $define E_Line "\355" # Line change $define E_List "\153" # List allocation $define E_Loc "\174" # Location change $define E_Lpop "\356" # List get/pop $define E_Lpull "\304" # List pull $define E_Lpush "\305" # List push $define E_Lput "\306" # List put $define E_Lrand "\307" # List random reference $define E_Lref "\310" # List reference $define E_Lrgint "\114" # Large integer allocation $define E_Lsub "\311" # List subscript $define E_Lsusp "\154" # Suspension from limitation $define E_MXevent "\370" # monitor input event $define E_Nconv "\116" # Conversion not needed $define E_Null "\044" # Null value pseudo-event $define E_Ocall "\134" # Operator call $define E_Ofail "\135" # Operator failure $define E_Opcode "\117" # Virtual-machine instruction $define E_Orem "\177" # Operator suspension removal $define E_Oresum "\175" # Operator resumption $define E_Oret "\140" # Operator return $define E_Osusp "\173" # Operator suspension $define E_Pcall "\103" # Procedure call $define E_Pfail "\106" # Procedure failure $define E_Prem "\126" # Suspended procedure removal $define E_Presum "\125" # Procedure resumption $define E_Pret "\122" # Procedure return $define E_Proc "\045" # Procedure value pseudo-event $define E_Psusp "\123" # Procedure suspension $define E_Rbang "\312" # Record generation $define E_Rcreate "\313" # Record creation $define E_Real "\144" # Real allocation $define E_Record "\150" # Record allocation $define E_Refresh "\171" # Refresh allocation $define E_Rrand "\314" # Record random reference $define E_Rref "\315" # Record reference $define E_Rsub "\316" # Record subscript $define E_Sbang "\317" # Set generation $define E_Sconv "\121" # Conversion success $define E_Screate "\320" # Set creation $define E_Sdelete "\321" # Set deletion $define E_Selem "\164" # Set element allocation $define E_Set "\161" # Set allocation $define E_Sfail "\341" # Scanning failure $define E_Sinsert "\322" # Set insertion $define E_Slots "\167" # Hash header allocation $define E_Smember "\323" # Set membership $define E_Snew "\340" # Scanning environment creation $define E_Spos "\346" # Scanning position $define E_Srand "\336" # Set random reference $define E_Srem "\344" # Scanning environment removal $define E_Sresum "\343" # Scanning resumption $define E_Ssasgn "\354" # Sub-string assignment $define E_Ssusp "\342" # Scanning suspension $define E_Stack "\353" # stack depth $define E_StrDeAlc "\176" # String deallocation $define E_String "\163" # String allocation $define E_Sval "\324" # Set value $define E_Table "\156" # Table allocation $define E_Tbang "\325" # Table generation $define E_Tconv "\113" # Conversion target $define E_Tcreate "\326" # Table creation $define E_Tdelete "\327" # Table deletion $define E_Telem "\157" # Table element allocation $define E_TenureBlock "\362" # Tenure a block region $define E_TenureString "\361" # Tenure a string region $define E_Tick "\056" # Clock tick $define E_Tinsert "\330" # Table insertion $define E_Tkey "\331" # Table key generation $define E_Tmember "\332" # Table membership $define E_Trand "\337" # Table random reference $define E_Tref "\333" # Table reference $define E_Tsub "\334" # Table subscript $define E_Tval "\335" # Table value $define E_Tvsubs "\151" # Substring tv allocation $define E_Tvtbl "\160" # Table-element tv allocation $define E_Value "\350" # Value assigned $define E_Disable 1000000 $define E_Enable 1000001 $define E_Quit 1000002 $define E_ALoc 2000000 $define E_Spoof 1728345 $define AllocMask cset(E_List || E_Lelem || E_File || E_Lrgint || E_Real || E_Record || E_Selem || E_Set || E_Slots || E_Table || E_Telem || E_Tvsubs || E_Tvtbl || E_Cset || E_Refresh || E_String || E_Coexpr) $define AssignMask cset(E_Assign || E_Value) $define TypeMask AllocMask ++ (E_Integer || E_Null || E_Proc) $define ConvMask cset(E_Aconv || E_Tconv || E_Sconv || E_Nconv || E_Fconv) $define ProcMask cset(E_Pcall || E_Pfail || E_Pret || E_Psusp || E_Presum || E_Prem) $define FncMask cset(E_Fcall || E_Ffail || E_Fret || E_Fsusp || E_Fresum || E_Frem) $define OperMask cset(E_Ocall || E_Ofail || E_Oret || E_Osusp || E_Oresum || E_Orem) $define EvalMask (FncMask ++ ProcMask ++ OperMask) $define ListMask cset(E_Lbang || E_Lcreate || E_Lpop || E_Lpull || E_Lpush || E_Lput || E_Lrand || E_Lsub) $define RecordMask cset(E_Rbang || E_Rcreate || E_Rrand || E_Rsub) $define ScanMask cset(E_Snew || E_Sfail || E_Spos || E_Ssusp || E_Sresum || E_Srem) $define SetMask cset(E_Sbang || E_Screate || E_Sdelete || E_Sinsert || E_Smember || E_Sval) $define TableMask cset(E_Tbang || E_Tcreate || E_Tdelete || E_Tinsert || E_Tkey || E_Tmember || E_Trand || E_Tsub) $define StructMask ListMask ++ RecordMask ++ SetMask ++TableMask $define EmptyMask '' $define AllMask &cset icon-9.4.3/ipl/packs/0002775000175000017500000000000010336137160013672 5ustar chrishchrishicon-9.4.3/ipl/packs/idol/0002775000175000017500000000000010336137160014621 5ustar chrishchrishicon-9.4.3/ipl/packs/idol/sequence.iol0000664000175000017500000000132607140713042017134 0ustar chrishchrishprocedure sequence(bounds[ ]) return Sequence(bounds) end class Sequence(bounds,indices) method max(i) elem := self.bounds[i] return (type(elem)== "integer",elem) | *elem-1 end method elem(i) elem := self.bounds[i] return (type(elem)== "integer",self.indices[i]) | elem[self.indices[i]+1] end method activate() top := *(self.indices) if self.indices[1] > self$max(1) then fail s := "" every i := 1 to top do { s ||:= self$elem(i) } repeat { self.indices[top] +:= 1 if top=1 | (self.indices[top] <= self$max(top)) then break self.indices[top] := 0 top -:= 1 } return s end initially / (self.indices) := list(*self.bounds,0) end icon-9.4.3/ipl/packs/idol/labelgen.iol0000664000175000017500000000033507140713042017074 0ustar chrishchrishclass labelgen : Sequence(prefix,postfix) method activate() return self.prefix||self$Sequence.activate()||self.postfix end initially /(self.prefix) := "" /(self.postfix) := "" /(self.bounds) := [50000] end icon-9.4.3/ipl/packs/idol/msdos.icn0000664000175000017500000000433307140713042016440 0ustar chrishchrish# # @(#)msdos.icn 1.5 5/5/90 # OS-specific code for MS-DOS Idol # # For systems which cannot run icont from within an Icon program, # the approach is for Idol to generate a script/batch file to do this. # global icontopt,cd,md,env,sysok,batfile procedure mysystem(s) if /batfile then batfile := open("idolt.bat","w") if \loud then write(s) write(batfile,s) return sysok # system(s) # MS-DOS Icon is generally too big to use system() end procedure filename(s,ext) s[9:0] := "" s ||:= \ext return s end # if the filename s has extension ext then return the filename less the # extension, otherwise fail. procedure fileroot(s,ext) if s[- *ext : 0] == ext then return s[1 : - *ext] end procedure writesublink(s) writelink(env||"\\\\"||s) end procedure envpath(filename) return env||"\\"||filename end # # Installation. # Uses hierarchical filesystem on some systems (see initialize) # procedure install(args) write("Installing idol environment in ",env) if env ~== "" then mysystem(md||env) if fout := envopen("i_object.icn","w") then { write(fout,"record idol_object(__state,__methods)") close(fout) } else { if not (fout := open("i_object.icn","w")) then stop("can't open i_object") write(fout,"record idol_object(__state,__methods)") close(fout) mysystem("copy i_object.icn "||env) mysystem("del i_object.icn") } fout := &null cdicont(["i_object"]) end procedure uninstall(args) # not implemented yet end procedure makeexe(args,i) exe := args[i] if icont(exe) = \sysok then { if \exec then { write("Executing:") exe := "iconx "||exe every i := exec+1 to *args do exe ||:= " "||args[i] mysystem(exe) } } end # # system-dependent compilation of idolfile.icn # (in the idol subdirectory, if there is one) # procedure cdicont(idolfiles) if comp = -2 then return # -t --> don't call icont at all args := " -c" rms := "" every ifile := !idolfiles do args ||:= " " || ifile every ifile := !idolfiles do rms ||:= " " || ifile || ".icn" mysystem("cd idolcode.env") icont(args) mysystem("cd ..") return end procedure sysinitialize() icontopt := " -Sr500 -SF30 -Si1000 " cd := "cd " md := "mkdir " env := getenv("IDOLENV") | "idolcode.env" sysok := 0 end icon-9.4.3/ipl/packs/idol/Makefile0000664000175000017500000000071407142651136016266 0ustar chrishchrish# # Sample makefile for compiling Idol # idol: idol.iol idolmain.u1 unix.u1 idolboot ./idolboot idol unix.u1 idolmain.u1 idolboot: idolboot.icn unix.u1 icont -s idolboot unix.u1 unix.u1: unix.icn icont -s -c unix idolmain.u1: idolmain.icn icont -s -c idolmain # Build executable and copy to ../../iexe. # (Nothing done in this case because the executable doesn't stand alone.) Iexe: Clean: rm -rf *.u[12] idol idolboot idolmain unix idolcode.env icon-9.4.3/ipl/packs/idol/point.iol0000664000175000017500000000041307140713042016451 0ustar chrishchrishclass Cartesian : Radian (x,y) initially if /(self.r) then { self.r := sqrt(self.x^2+self.y^2) self.d := 0 # this should really be some awful mess } end class Radian : Cartesian(d,r) initially if /(self.x) then { self.x := 0 self.y := 0 } end icon-9.4.3/ipl/packs/idol/indextst.iol0000664000175000017500000000020707140713042017163 0ustar chrishchrishclass indextst() method index(y) write("index(",y,")") end end procedure main() x := indextst() x $[ "hello, world" ] end icon-9.4.3/ipl/packs/idol/install.bat0000664000175000017500000000041407140713042016752 0ustar chrishchrishrem msdos Idol installation rem This compiles Idol in order to to test the system icont -Sr1000 -SF30 -Si1000 idolboot msdos mkdir idolcode.env iconx idolboot -t -install chdir idolcode.env icont -c i_object chdir .. iconx idolboot idol idolmain msdos idolt icon-9.4.3/ipl/packs/idol/unix.icn0000664000175000017500000000344207142570442016305 0ustar chrishchrish# # @(#)unix.icn 1.6 3/14/91 # OS-specific code for UNIX Idol # global icontopt,env,sysok,comp procedure mysystem(s) if \loud then write(s) return system(s) end procedure filename(s,ext) s[9:0] := "" s ||:= \ext return s end # if the filename s has extension ext then return the filename less the # extension, otherwise fail. procedure fileroot(s,ext) if s[- *ext : 0] == ext then return s[1 : - *ext] end procedure writesublink(s) writelink(env||"/"||s) end procedure envpath(filename) return env||"/"||filename end # # Installation. # Uses hierarchical filesystem on some systems (see initialize) # procedure install(args) if "-t" == !args then comp := -2 write("Installing idol environment in ",env) if env ~== "" then mysystem("mkdir "||env) fout := envopen("i_object.icn","w") write(fout,"record idol_object(__state,__methods)") close(fout) fout := &null cdicont(["i_object"]) end procedure uninstall(args) mysystem("rm -r "||env) end procedure makeexe(args,i) exe := args[i] if icont(exe) = \sysok then { mysystem("rm "||exe||".icn") if \exec then { write("Executing:") every i := exec+1 to *args do exe ||:= " "||args[i] return mysystem(exe) } else return } end # # system-dependent compilation of idolfile.icn # (in the idol subdirectory, if there is one) # procedure cdicont(idolfiles) if comp = -2 then return # -t --> don't translate at all args := " -c" rms := "" every ifile := !idolfiles do args ||:= " " || ifile every ifile := !idolfiles do rms ||:= " " || ifile || ".icn" if (rv := icont(args,"cd "||env||"; ")) = \sysok then mysystem("cd "||env||"; rm "||rms) if \rv = 0 then return rv end procedure sysinitialize() icontopt := " -s " env := getenv("IDOLENV") | "idolcode.env" sysok := 0 end icon-9.4.3/ipl/packs/idol/vmsidol.com0000664000175000017500000000023207140713042016767 0ustar chrishchrish$ ! VMS Idol invocation script for simple compiles $ iconx idol "-t" 'P1' 'P2' 'P3' 'P4' 'P5' 'P6' 'P7' 'P8' 'P9' $ icont "-Sr1000" "-Sg500" "-SF30" 'P1' icon-9.4.3/ipl/packs/idol/multitst.iol0000664000175000017500000000102707140713042017207 0ustar chrishchrishclass multitst( a, b, c, d, e, f, g, h , i, j, k) method writemsg(x,y,z) write(x,y,z) end method write( plus, other ,stuff) every write(image(!self)) write(plus,other,stuff) end initially self$writemsg( "this ", "is ","not the") self$writemsg ("this is a","classical Icon-style bug","and it isn't printed") self$writemsg("this ", "is ","almost the") self$writemsg() self$write("end","of","test") end procedure main() multitst("hi","there","this",,"is",1,"test") end icon-9.4.3/ipl/packs/idol/linvktst.iol0000664000175000017500000000063507140713042017204 0ustar chrishchrish# # List invocation for methods. Icon uses binary ! but Idol # uses $! for "foreach", so list invocation is specified via $$. # class abang() method a(args[]) write("a:") every write (image(!args)) end end class bbang : abang() method b(args[]) write("b:") every write (image(!args)) return self $$ a(["yo"]|||args) end end procedure main() x := bbang() x$b("yin","yang") end icon-9.4.3/ipl/packs/idol/amiga.icn0000664000175000017500000000357707140713042016402 0ustar chrishchrish# # @(#)amiga.icn 1.4 3/14/91 # OS-specific code for Amiga Idol # global icontopt,cd,md,env,sysok,comp procedure mysystem(s) if \loud then write(s) return system(s) end procedure filename(s,ext) s[9:0] := "" s ||:= \ext return s end # if the filename s has extension ext then return the filename less the # extension, otherwise fail. procedure fileroot(s,ext) if s[- *ext : 0] == ext then return s[1 : - *ext] end procedure writesublink(s) writelink(env||"/"||s) end procedure envpath(filename) return env||"/"||filename end # # Installation. # Uses hierarchical filesystem on some systems (see initialize) # procedure install(args) if "-t" == !args then comp := -2 write("Installing idol environment in ",env) if env ~== "" then mysystem(md||env) fout := envopen("i_object.icn","w") write(fout,"record idol_object(__state,__methods)") close(fout) fout := &null cdicont(["i_object"]) end procedure uninstall(args) # not implemented yet end procedure makeexe(args,i) exe := args[i] if icont(exe) = \sysok then { mysystem("delete "||exe||".icn") if \exec then { write("Executing:") exe := "iconx "||exe every i := exec+1 to *args do exe ||:= " "||args[i] return mysystem(exe) } else return } end # # system-dependent compilation of idolfile.icn # (in the idol subdirectory, if there is one) # procedure cdicont(idolfiles) if comp = -2 then return # -t --> don't call icont at all args := " -c" rms := "" every ifile := !idolfiles do args ||:= " " || ifile every ifile := !idolfiles do rms ||:= " " || ifile || ".icn" mysystem("cd idolcode.env") if icont(args) = \sysok then every ifile := !idolfiles do mysystem("delete "||ifile||".icn") mysystem("cd /") return end procedure sysinitialize() icontopt := " -Sr500 -SF30 -Si1000 " cd := "cd " md := "makedir " env := getenv("IDOLENV") | "idolcode.env" sysok := 0 end icon-9.4.3/ipl/packs/idol/README0000664000175000017500000000364607140713042015506 0ustar chrishchrishThis is the Idol public distribution directory. Read idol.man and idol.doc for details on running Idol. Read systems.doc for system-dependent notes, such as how to build Idol for your system. The Idol source is idol.iol; the Idol booting kit is idolboot.icn. In addition to these two files, there is a system-specific Icon file which must be linked in to produce an Idol executable: so far there are files amiga.icn, mpw.icn, msdos.icn, mvs.icn, os2.icn, unix.icn, and vms.icn. BUILDING IDOL If you are running MS-DOS, the file install.bat contains the sequence of commands necessary to build Idol. This sequence consists of: (1) Compile idolboot with a line such as icont -Sr1000 -SF30 -Si1000 idolboot msdos (2) Install an Idol environment directory with a line such as iconx idolboot -install For MS-DOS, this generates a batch file named idolt.bat which you would then execute to create the environment directory. For other systems, idolboot creates the directory itself. (3) Translate Idol from its idol.iol source file with a line such as iconx idolboot idol msdos.icn (Again, on MS-DOS, this generates a batch file named idolt.bat which you should then execute.) This makes a good initial test of the system's operation. In addition there are several other files with extension .iol; these are unfinished fragments of Idol source code for your perusal. Contributions are of course welcome! Note that Idol is still a work in progress, and this must be considered a test distribution. Support for non-UNIX systems is minimally tested; feel free to add code to support your system and send it in. The -strict flag not only generates paranoid code for public field access, it generates extra warning messages when inherited fields are named in a subclass. The file idol.hqx is a Macintosh BinHex 4.0 file of configuration material for Icon to run under MPW. Mail jeffery@ringer.cs.utas.edu when you have questions or bug fixes for Idol. icon-9.4.3/ipl/packs/idol/incltest.iol0000664000175000017500000000010307140713042017141 0ustar chrishchrish#include events.iol procedure main() write("E_Tick ",E_Tick) end icon-9.4.3/ipl/packs/idol/consttst.iol0000664000175000017500000000023407140713042017202 0ustar chrishchrishconst foo := 1 global barfoo procedure baz() barfoo := "OK" end procedure main() baz() bar1 := "gag!" write(foo) write(barfoo) write("foo") end icon-9.4.3/ipl/packs/idol/inverse.iol0000664000175000017500000000032607140713042016776 0ustar chrishchrishclass inverse:fraction(d) initially self.n := 1 end procedure main() x := inverse(2) y := fraction(3,4) z := x$times(y) write("The decimal equivalent of ",z$asString(), " is ",trim(z$asReal(),'0')) end icon-9.4.3/ipl/packs/idol/main.iol0000664000175000017500000000044107140713042016245 0ustar chrishchrishprocedure main() mydeque := Deque() mydeque$push("hello") mydeque$push("world") write("My deque is size ",mydeque$size()) every write("give me a ",mydeque$foreach()) write("A random element is ",mydeque$random()) write("getting ",mydeque$get()," popping ",mydeque$pop()) end icon-9.4.3/ipl/packs/idol/NEW.8_00000664000175000017500000000476507140713042015572 0ustar chrishchrishThis document notes differences between Idol version 6 (the previous distributed version) and the current release, version 8. See the idol reference manual (idol.doc, TR 90-10) and the Idol man page for a complete description of Idol. Summary of New Features (example/reference) * Constants (const bar := 3.1415, version := "Idol 8.0") * Include files (#include foo.iol) * Index meta-operator (x$["baz"]) * Automatic installation (no "idol -install" step) * Shared class environment (IDOLENV environment variable) * Temporary environments (clean single-file translation) * Contributed ports (Amiga, MPW, MS-DOS, MVS, OS/2, UNIX, VMS) Idol Version 8 incorporates significant improvements in usability without any major changes in the object model used in the previous release. Code from Idol release 6 may have to be recompiled but will function unchanged under release 8. CONSTANTS Idol supports a "const" declaration for Icon values of type string, cset, integer, and real. See the Idol reference manual for details. INCLUDE FILES Idol supports textual inclusion. This is intended primarily to facilitate sharing of constant values amongst separately translated files. INDEX META OPERATOR x $[ y, z, ...] is shorthand notation for the expression x$index(y,z,...). Many classes implement an index or lookup operation, and this notation supports that operation as closely to Icon's syntax as possible. AUTOMATIC INSTALLATION The "idol -install" step required in the previous release is performed automatically if required. SHARED CLASS ENVIRONMENT On systems supporting the getenv() function, the environment variable IDOLENV may optionally denote a class code repository for use by all Idol operations. This allows sharing of classes amongst programs translated in different directories. TEMPORARY ENVIRONMENTS "Automatically installed environments" as described above are considered temporary and automatically removed after successful compilation if compilation consists of a single source file, and no IDOLENV variable is present. CONTRIBUTED PORTS Icon enthusiasts transported Idol to several machines; these ports were for version 6, but many or most of them will work for version 8. They have been adapted to include new features to the best of my abilities, but if you are not using MS-DOS you may want to examine things and make adjustments. This should be much easier than writing your own port, at any rate. I am available by e-mail or telephone should questions arise. icon-9.4.3/ipl/packs/idol/sinvktst.iol0000664000175000017500000000035707140713042017214 0ustar chrishchrishclass sinvbuffer : strinvokable() method forward_char() write("success") end method eval(s,args[]) suspend self$strinvokable.eval(map(s,"-","_")) end end procedure main() x := sinvbuffer() x $ eval("forward-char") end icon-9.4.3/ipl/packs/idol/autoparn.iol0000664000175000017500000000040607140713042017153 0ustar chrishchrish# # Here is a sample test of automatic parenthesizing # class autotest(public yo) method foo(x) return x end initially self.yo := "yo, bro" end procedure main() x := autotest() write(x$foo(x$yo)) # yo almost becomes a data item, notation-wise end icon-9.4.3/ipl/packs/idol/idolboot.icn0000664000175000017500000011403107140713042017123 0ustar chrishchrishglobal fin,fout,fName,fLine,alpha,alphadot,white,nonwhite,nonalpha global classes,comp,exec,strict,links,imports,loud,compiles,compatible,ct procedure gencode() #line 11 "idol.iol" if \loud then write("Class import/export:") every cl := (__self1 := classes).__methods.foreach_t(__self1.__state) do (__self2 := cl).__methods.writespec(__self2.__state) repeat { added := 0 every super:= ((__self2 := ((__self1 := classes).__methods.foreach_t(__self1.__state))).__methods.foreachsuper(__self2.__state) | !imports) do{ if /(__self1 := classes).__methods.lookup(__self1.__state,super) then { added := 1 fname := filename(super) readinput(envpath(fname),2) if /(__self1 := classes).__methods.lookup(__self1.__state,super) then halt("can't import class '",super,"'") writesublink(fname) } } if added = 0 then break } every (__self2 := ((__self1 := classes).__methods.foreach_t(__self1.__state))).__methods.transitive_closure(__self2.__state) if \loud then write("Generating code:") writesublink("i_object") every s := !links do writelink(s) write(fout) every out := (__self1 := classes).__methods.foreach(__self1.__state) do { name := filename((__self1 := out).__methods.name(__self1.__state)) (__self1 := out).__methods.write(__self1.__state) put(compiles,name) writesublink(name) } if *compiles>0 then return cdicont(compiles) else return end procedure readinput(name,phase,ct2) #line 686 "idol.iol" if \loud then write("\t",name) fName := name fLine := 0 fin := sysopen(name,"r") ct := \ct2 | constant() while line := readln("wrap") do { line ? { tab(many(white)) if ="class" then { decl := class() (__self1 := decl).__methods.read(__self1.__state,line,phase) if phase=1 then { (__self1 := decl).__methods.writemethods(__self1.__state) (__self1 := classes).__methods.insert(__self1.__state,decl,(__self2 := decl).__methods.name(__self2.__state)) } else (__self1 := classes).__methods.insert_t(__self1.__state,decl,(__self2 := decl).__methods.name(__self2.__state)) } else if ="procedure" then { if comp = 0 then comp := 1 decl := method("") (__self1 := decl).__methods.read(__self1.__state,line,phase) (__self1 := decl).__methods.write(__self1.__state,fout,"") } else if ="record" then { if comp = 0 then comp := 1 decl := declaration(line) (__self1 := decl).__methods.write(__self1.__state,fout,"") } else if ="global" then { if comp = 0 then comp := 1 decl := vardecl(line) (__self1 := decl).__methods.write(__self1.__state,fout,"") } else if ="const" then { (__self1 := ct).__methods.append(__self1.__state,constdcl(line) ) } else if ="method" then { halt("readinput: method outside class") } else if ="#include" then { savedFName := fName savedFLine := fLine savedFIn := fin tab(many(white)) readinput(tab(if ="\"" then find("\"") else many(nonwhite)), phase,ct) fName := savedFName fLine := savedFLine fin := savedFIn } } } close(fin) end procedure readln(wrap) #line 745 "idol.iol" count := 0 prefix := "" while /finished do { if not (line := read(fin)) then fail fLine +:= 1 if match("#include",line) then return line line[ 1(x<-find("#",line),notquote(line[1:x])) : 0] := "" line := trim(line,white) x := 1 while ((x := find("$",line,x)) & notquote(line[1:x])) do { z := line[x+1:0] ||" " case line[x+1] of { "(": line[x+:2] := "{" ")": line[x+:2] := "}" "<": line[x+:2] := "[" ">": line[x+:2] := "]" "!"|"*"|"@"|"?": { z ? { move(1) tab(many(white)) if not (id := tab(many(alphadot))) then { if not match("(") then halt("readln can't parse ",line) if not (id := tab(&pos=(x+methlen+1))|0)\1)] := front || methodname || back || c } } } if /wrap | (prefix==line=="") then finished := line else { prefix ||:= line || " " prefix ? { if ((*prefix = bal()) & (not find(",",prefix[-2]))) then finished := prefix[1:-1] } } } return (__self1 := ct).__methods.expand(__self1.__state,finished) end record idol_object(__state,__methods) procedure declaration_read(self,decl) #line 63 "idol.iol" decl ? ( (tab(many(white)) | "") , (self.tag := =("procedure"|"class"|"method"|"record")) , (tab(many(white)) | "") , (self.name := tab(many(alpha))) , (tab(find("(")+1)), (tab(many(white)) | "") , ((__self1 := (self.fields := classFields())).__methods.parse(__self1.__state,tab(find(")")))) ) | halt("declaration/read can't parse decl ",decl) end procedure declaration_write(self,f) #line 81 "idol.iol" write(f,(__self1 := self).__methods.String(__self1.__state)) end procedure declaration_String(self) #line 87 "idol.iol" return self.tag || " " || self.name || "(" || (__self1 := self.fields).__methods.String(__self1.__state) || ")" end record declaration__state(__state,__methods,name,fields,tag) record declaration__methods(read,write,String,name) global declaration__oprec procedure declaration(name,fields,tag) local self,clone initial { if /declaration__oprec then declarationinitialize() } self := declaration__state(&null,declaration__oprec,name,fields,tag) self.__state := self declarationinitially(self) return idol_object(self,declaration__oprec) end procedure declarationinitialize() initial declaration__oprec := declaration__methods(declaration_read,declaration_write,declaration_String,declaration_name) end procedure declarationinitially(self) #line 90 "idol.iol" if \self.name then (__self1 := self).__methods.read(__self1.__state,self.name) end procedure declaration_name(self) return .(self.name) end procedure vardecl_write(self,f) #line 98 "idol.iol" write(f,self.s) end record vardecl__state(__state,__methods,s) record vardecl__methods(write) global vardecl__oprec procedure vardecl(s) local self,clone initial { if /vardecl__oprec then vardeclinitialize() } self := vardecl__state(&null,vardecl__oprec,s) self.__state := self return idol_object(self,vardecl__oprec) end procedure vardeclinitialize() initial vardecl__oprec := vardecl__methods(vardecl_write) end procedure constant_expand(self,s) #line 107 "idol.iol" i := 1 while ((i <- find(k <- (__self1 := self).__methods.foreach(__self1.__state),s,i)) & ((i=1) | any(nonalpha,s[i-1])) & ((*s = i+*k-1) | any(nonalpha,s[i+*k])) & notquote(s[1:i])) do { val := \ (self.t[k]) | stop("internal error in expand") s[i +: *k] := val } return s end procedure constant_foreach(self) #line 122 "idol.iol" suspend key(self.t) end procedure constant_eval(self,s) #line 125 "idol.iol" if s2 := \ self.t[s] then return s2 end procedure constant_parse(self,s) #line 128 "idol.iol" s ? { k := trim(tab(find(":="))) | fail move(2) tab(many(white)) val := tab(0) | fail (*val > 0) | fail self.t [ k ] := val } return end procedure constant_append(self,cd) #line 139 "idol.iol" every s := (__self1 := cd).__methods.parse(__self1.__state)do (__self2 := self).__methods.parse(__self2.__state,s) end record constant__state(__state,__methods,t) record constant__methods(expand,foreach,eval,parse,append) global constant__oprec procedure constant(t) local self,clone initial { if /constant__oprec then constantinitialize() } self := constant__state(&null,constant__oprec,t) self.__state := self constantinitially(self) return idol_object(self,constant__oprec) end procedure constantinitialize() initial constant__oprec := constant__methods(constant_expand,constant_foreach,constant_eval,constant_parse,constant_append) end procedure constantinitially(self) #line 142 "idol.iol" self.t := table() end procedure constdcl_parse(self) #line 151 "idol.iol" self.s ? { tab(find("const")+6) tab(many(white)) while s2 := trim(tab(find(","))) do { suspend s2 move(1) tab(many(white)) } suspend trim(tab(0)) } end record constdcl__state(__state,__methods,s) record constdcl__methods(parse,write,vardecl) global constdcl__oprec, vardecl__oprec procedure constdcl(s) local self,clone initial { if /constdcl__oprec then constdclinitialize() if /vardecl__oprec then vardeclinitialize() constdcl__oprec.vardecl := vardecl__oprec } self := constdcl__state(&null,constdcl__oprec,s) self.__state := self return idol_object(self,constdcl__oprec) end procedure constdclinitialize() initial constdcl__oprec := constdcl__methods(constdcl_parse,vardecl_write) end procedure body_read(self) #line 170 "idol.iol" self.fn := fName self.ln := fLine self.text := [] while line := readln() do { put(self.text, line) line ? { tab(many(white)) if ="end" & &pos > *line then return else if =("local"|"static"|"initial") & any(nonalpha) then { self.ln +:= 1 pull(self.text) / (self.vars) := [] put(self.vars, line) } } } halt("body/read: eof inside a procedure/method definition") end procedure body_write(self,f) #line 189 "idol.iol" if \self.vars then every write(f,!self.vars) if \compatible then write(f," \\self := self.__state") if \self.ln then write(f,"#line ",self.ln + ((*\self.vars)|0)," \"",self.fn,"\"") every write(f,(__self1 := self).__methods.foreach(__self1.__state)) end procedure body_delete(self) #line 196 "idol.iol" return pull(self.text) end procedure body_size(self) #line 199 "idol.iol" return (*\ (self.text)) | 0 end procedure body_foreach(self) #line 202 "idol.iol" if t := \self.text then suspend !self.text end record body__state(__state,__methods,fn,ln,vars,text) record body__methods(read,write,delete,size,foreach) global body__oprec procedure body(fn,ln,vars,text) local self,clone initial { if /body__oprec then bodyinitialize() } self := body__state(&null,body__oprec,fn,ln,vars,text) self.__state := self return idol_object(self,body__oprec) end procedure bodyinitialize() initial body__oprec := body__methods(body_read,body_write,body_delete,body_size,body_foreach) end procedure class_read(self,line,phase) #line 214 "idol.iol" (__self1 := self).__methods.declaration.read(__self1.__state,line) self.supers := idTaque(":") (__self1 := self.supers).__methods.parse(__self1.__state,line[find(":",line)+1:find("(",line)] | "") self.methods:= taque() self.text := body() while line := readln("wrap") do { line ? { tab(many(white)) if ="initially" then { (__self1 := self.text).__methods.read(__self1.__state) if phase=2 then return (__self1 := self.text).__methods.delete(__self1.__state) return } else if ="method" then { decl := method(self.name) (__self1 := decl).__methods.read(__self1.__state,line,phase) (__self1 := self.methods).__methods.insert(__self1.__state,decl,(__self2 := decl).__methods.name(__self2.__state)) } else if ="end" then { return } else if ="procedure" then { decl := method("") (__self1 := decl).__methods.read(__self1.__state,line,phase) /self.glob := [] put(self.glob,decl) } else if ="global" then { /self.glob := [] put(self.glob,vardecl(line)) } else if ="record" then { /self.glob := [] put(self.glob,declaration(line)) } else if upto(nonwhite) then { halt("class/read expected declaration on: ",line) } } } halt("class/read syntax error: eof inside a class definition") end procedure class_has_initially(self) #line 258 "idol.iol" return (__self1 := self.text).__methods.size(__self1.__state) > 0 end procedure class_ispublic(self,fieldname) #line 261 "idol.iol" if (__self1 := self.fields).__methods.ispublic(__self1.__state,fieldname) then return fieldname end procedure class_foreachmethod(self) #line 264 "idol.iol" suspend (__self1 := self.methods).__methods.foreach(__self1.__state) end procedure class_foreachsuper(self) #line 267 "idol.iol" suspend (__self1 := self.supers).__methods.foreach(__self1.__state) end procedure class_foreachfield(self) #line 270 "idol.iol" suspend (__self1 := self.fields).__methods.foreach(__self1.__state) end procedure class_isvarg(self,s) #line 273 "idol.iol" if (__self1 := self.fields).__methods.isvarg(__self1.__state,s) then return s end procedure class_transitive_closure(self) #line 276 "idol.iol" count := (__self1 := self.supers).__methods.size(__self1.__state) while count > 0 do { added := taque() every sc := (__self1 := self.supers).__methods.foreach(__self1.__state) do { if /(super := (__self1 := classes).__methods.lookup(__self1.__state,sc)) then halt("class/transitive_closure: couldn't find superclass ",sc) every supersuper := (__self1 := super).__methods.foreachsuper(__self1.__state) do { if / (__self1 := self.supers).__methods.lookup(__self1.__state,supersuper) & /(__self1 := added).__methods.lookup(__self1.__state,supersuper) then { (__self1 := added).__methods.insert(__self1.__state,supersuper) } } } count := (__self1 := added).__methods.size(__self1.__state) every (__self1 := self.supers).__methods.insert(__self1.__state,(__self2 := added).__methods.foreach(__self2.__state)) } end procedure class_writedecl(self,f,s) #line 298 "idol.iol" writes(f, s," ",self.name) if s=="class" & ( *(supers := (__self1 := self.supers).__methods.String(__self1.__state)) > 0 ) then writes(f," : ",supers) writes(f,"(") rv := (__self1 := self.fields).__methods.String(__self1.__state,s) if *rv > 0 then rv ||:= "," if s~=="class" & *(\self.ifields)>0 then { every l := !self.ifields do rv ||:= l.ident || "," if /(superclass := (__self1 := classes).__methods.lookup(__self1.__state,l.class)) then halt("class/resolve: couldn't find superclass ",sc) if (__self1 := superclass).__methods.isvarg(__self1.__state,l.ident) then rv := rv[1:-1]||"[]," } writes(f,rv[1:-1]) write(f,,")") end procedure class_writespec(self,f) #line 314 "idol.iol" f := envopen(filename(self.name),"w") (__self1 := self).__methods.writedecl(__self1.__state,f,"class") every (__self2 := ((__self1 := self.methods).__methods.foreach(__self1.__state))).__methods.writedecl(__self2.__state,f,"method") if (__self1 := self).__methods.has_initially(__self1.__state) then write(f,"initially") write(f,"end") close(f) end procedure class_writemethods(self) #line 327 "idol.iol" f:= envopen(filename(self.name,".icn"),"w") every (__self2 := ((__self1 := self.methods).__methods.foreach(__self1.__state))).__methods.write(__self2.__state,f,self.name) if \self.glob & *self.glob>0 then { write(f,"#\n# globals declared within the class\n#") every i := 1 to *self.glob do (__self1 := (self.glob[i])).__methods.write(__self1.__state,f,"") } close(f) end procedure class_write(self) #line 341 "idol.iol" f:= envopen(filename(self.name,".icn"),"a") if /self.ifields then (__self1 := self).__methods.resolve(__self1.__state) writes(f,"record ",self.name,"__state(__state,__methods") rv := "," rv ||:= (__self1 := self.fields).__methods.idTaque.String(__self1.__state) if rv[-1] ~== "," then rv ||:= "," every s := (!self.ifields).ident do rv ||:= s || "," write(f,rv[1:-1],")") writes(f,"record ",self.name,"__methods(") rv := "" every s := (((__self2 := ((__self1 := self.methods).__methods.foreach(__self1.__state))).__methods.name(__self2.__state)) | (__self1 := self.fields).__methods.foreachpublic(__self1.__state) | (!self.imethods).ident | (__self1 := self.supers).__methods.foreach(__self1.__state)) do rv ||:= s || "," if *rv>0 then rv[-1] := "" write(f,rv,")") writes(f,"global ",self.name,"__oprec") every writes(f,", ", (__self1 := self.supers).__methods.foreach(__self1.__state),"__oprec") write(f) (__self1 := self).__methods.writedecl(__self1.__state,f,"procedure") write(f,"local self,clone") write(f,"initial {\n", " if /",self.name,"__oprec then ",self.name,"initialize()") if (__self1 := self.supers).__methods.size(__self1.__state) > 0 then every (super <- (__self1 := self.supers).__methods.foreach(__self1.__state)) ~== self.name do write(f," if /",super,"__oprec then ",super,"initialize()\n", " ",self.name,"__oprec.",super," := ", super,"__oprec") write(f," }") writes(f," self := ",self.name,"__state(&null,",self.name,"__oprec") every writes(f,",",(__self1 := self.fields).__methods.foreach(__self1.__state)) if \self.ifields then every writes(f,",",(!self.ifields).ident) write(f,")\n self.__state := self") if (__self1 := self.text).__methods.size(__self1.__state) > 0 then write(f," ",self.name,"initially(self)") if (__self1 := self.supers).__methods.size(__self1.__state) > 0 then { every (super <- (__self1 := self.supers).__methods.foreach(__self1.__state)) ~== self.name do { if (__self2 := ((__self1 := classes).__methods.lookup(__self1.__state,super))).__methods.has_initially(__self2.__state) then { if /madeclone := 1 then { write(f," clone := ",self.name,"__state()\n", " clone.__state := clone\n", " clone.__methods := ",self.name,"__oprec") } write(f," # inherited initialization from class ",super) write(f," every i := 2 to *self do clone[i] := self[i]\n", " ",super,"initially(clone)") every l := !self.ifields do { if l.class == super then write(f," self.",l.ident," := clone.",l.ident) } } } } write(f," return idol_object(self,",self.name,"__oprec)\n", "end\n") write(f,"procedure ",self.name,"initialize()") writes(f," initial ",self.name,"__oprec := ",self.name,"__methods") rv := "(" every s := (__self2 := ((__self1 := self.methods).__methods.foreach(__self1.__state))).__methods.name(__self2.__state) do { if *rv>1 then rv ||:= "," rv ||:= self.name||"_"||s } every me := (__self1 := self.fields).__methods.foreachpublic(__self1.__state) do { if *rv>1 then rv ||:= "," rv ||:= self.name||"_"||me } every l := !self.imethods do { if *rv>1 then rv ||:= "," rv ||:= l.class||"_"||l.ident } write(f,rv,")\n","end") if (__self1 := self).__methods.has_initially(__self1.__state) then { write(f,"procedure ",self.name,"initially(self)") (__self1 := self.text).__methods.write(__self1.__state,f) write(f,"end") } every me := (__self1 := self.fields).__methods.foreachpublic(__self1.__state) do { write(f,"procedure ",self.name,"_",me,"(self)") if \strict then { write(f," if type(self.",me,") == ", "(\"list\"|\"table\"|\"set\"|\"record\") then\n", " runerr(501,\"idol: scalar type expected\")") } write(f," return .(self.",me,")") write(f,"end") write(f) } close(f) end procedure class_resolve(self) #line 492 "idol.iol" self.imethods := [] self.ifields := [] ipublics := [] addedfields := table() addedmethods := table() every sc := (__self1 := self.supers).__methods.foreach(__self1.__state) do { if /(superclass := (__self1 := classes).__methods.lookup(__self1.__state,sc)) then halt("class/resolve: couldn't find superclass ",sc) every superclassfield := (__self1 := superclass).__methods.foreachfield(__self1.__state) do { if /(__self1 := self.fields).__methods.lookup(__self1.__state,superclassfield) & /addedfields[superclassfield] then { addedfields[superclassfield] := superclassfield put ( self.ifields , classident(sc,superclassfield) ) if (__self1 := superclass).__methods.ispublic(__self1.__state,superclassfield) then put( ipublics, classident(sc,superclassfield) ) } else if \strict then { warn("class/resolve: '",sc,"' field '",superclassfield, "' is redeclared in subclass ",self.name) } } every superclassmethod := (__self2 := ((__self1 := superclass).__methods.foreachmethod(__self1.__state))).__methods.name(__self2.__state) do { if /(__self1 := self.methods).__methods.lookup(__self1.__state,superclassmethod) & /addedmethods[superclassmethod] then { addedmethods[superclassmethod] := superclassmethod put ( self.imethods, classident(sc,superclassmethod) ) } } every public := (!ipublics) do { if public.class == sc then put (self.imethods, classident(sc,public.ident)) } } end # # globals declared within the class # record classident(class,ident) record class__state(__state,__methods,supers,methods,text,imethods,ifields,glob,name,fields,tag) record class__methods(read,has_initially,ispublic,foreachmethod,foreachsuper,foreachfield,isvarg,transitive_closure,writedecl,writespec,writemethods,write,resolve,String,name,declaration) global class__oprec, declaration__oprec procedure class(supers,methods,text,imethods,ifields,glob,name,fields,tag) local self,clone initial { if /class__oprec then classinitialize() if /declaration__oprec then declarationinitialize() class__oprec.declaration := declaration__oprec } self := class__state(&null,class__oprec,supers,methods,text,imethods,ifields,glob,name,fields,tag) self.__state := self clone := class__state() clone.__state := clone clone.__methods := class__oprec # inherited initialization from class declaration every i := 2 to *self do clone[i] := self[i] declarationinitially(clone) self.name := clone.name self.fields := clone.fields self.tag := clone.tag return idol_object(self,class__oprec) end procedure classinitialize() initial class__oprec := class__methods(class_read,class_has_initially,class_ispublic,class_foreachmethod,class_foreachsuper,class_foreachfield,class_isvarg,class_transitive_closure,class_writedecl,class_writespec,class_writemethods,class_write,class_resolve,declaration_String,declaration_name) end procedure method_read(self,line,phase) #line 535 "idol.iol" (__self1 := self).__methods.declaration.read(__self1.__state,line) self.text := body() if phase = 1 then (__self1 := self.text).__methods.read(__self1.__state) end procedure method_writedecl(self,f,s) #line 541 "idol.iol" decl := (__self1 := self).__methods.String(__self1.__state) if s == "method" then decl[1:upto(white,decl)] := "method" else { decl[1:upto(white,decl)] := "procedure" if *(self.class)>0 then { decl[upto(white,decl)] ||:= self.class||"_" i := find("(",decl) decl[i] ||:= "self" || (((decl[i+1] ~== ")"), ",") | "") } } write(f,decl) end procedure method_write(self,f) #line 554 "idol.iol" if self.name ~== "initially" then (__self1 := self).__methods.writedecl(__self1.__state,f,"procedure") (__self1 := self.text).__methods.write(__self1.__state,f) self.text := &null end record method__state(__state,__methods,class,text,name,fields,tag) record method__methods(read,writedecl,write,String,name,declaration) global method__oprec, declaration__oprec procedure method(class,text,name,fields,tag) local self,clone initial { if /method__oprec then methodinitialize() if /declaration__oprec then declarationinitialize() method__oprec.declaration := declaration__oprec } self := method__state(&null,method__oprec,class,text,name,fields,tag) self.__state := self clone := method__state() clone.__state := clone clone.__methods := method__oprec # inherited initialization from class declaration every i := 2 to *self do clone[i] := self[i] declarationinitially(clone) self.name := clone.name self.fields := clone.fields self.tag := clone.tag return idol_object(self,method__oprec) end procedure methodinitialize() initial method__oprec := method__methods(method_read,method_writedecl,method_write,declaration_String,declaration_name) end procedure Table_size(self) #line 566 "idol.iol" return (* \ self.t) | 0 end procedure Table_insert(self,x,key) #line 569 "idol.iol" /self.t := table() /key := x if / (self.t[key]) := x then return end procedure Table_lookup(self,key) #line 574 "idol.iol" if t := \self.t then return t[key] return end procedure Table_foreach(self) #line 578 "idol.iol" if t := \self.t then every suspend !self.t end record Table__state(__state,__methods,t) record Table__methods(size,insert,lookup,foreach) global Table__oprec procedure Table(t) local self,clone initial { if /Table__oprec then Tableinitialize() } self := Table__state(&null,Table__oprec,t) self.__state := self return idol_object(self,Table__oprec) end procedure Tableinitialize() initial Table__oprec := Table__methods(Table_size,Table_insert,Table_lookup,Table_foreach) end procedure taque_insert(self,x,key) #line 589 "idol.iol" /self.l := [] if (__self1 := self).__methods.Table.insert(__self1.__state,x,key) then put(self.l,x) end procedure taque_foreach(self) #line 593 "idol.iol" if l := \self.l then every suspend !self.l end procedure taque_insert_t(self,x,key) #line 596 "idol.iol" (__self1 := self).__methods.Table.insert(__self1.__state,x,key) end procedure taque_foreach_t(self) #line 599 "idol.iol" suspend (__self1 := self).__methods.Table.foreach(__self1.__state) end record taque__state(__state,__methods,l,t) record taque__methods(insert,foreach,insert_t,foreach_t,size,lookup,Table) global taque__oprec, Table__oprec procedure taque(l,t) local self,clone initial { if /taque__oprec then taqueinitialize() if /Table__oprec then Tableinitialize() taque__oprec.Table := Table__oprec } self := taque__state(&null,taque__oprec,l,t) self.__state := self return idol_object(self,taque__oprec) end procedure taqueinitialize() initial taque__oprec := taque__methods(taque_insert,taque_foreach,taque_insert_t,taque_foreach_t,Table_size,Table_lookup) end procedure idTaque_parse(self,s) #line 609 "idol.iol" s ? { tab(many(white)) while name := tab(find(self.punc)) do { (__self1 := self).__methods.insert(__self1.__state,trim(name)) move(1) tab(many(white)) } if any(nonwhite) then (__self1 := self).__methods.insert(__self1.__state,trim(tab(0))) } return end procedure idTaque_String(self) #line 621 "idol.iol" if /self.l then return "" out := "" every id := !self.l do out ||:= id||self.punc return out[1:-1] end record idTaque__state(__state,__methods,punc,l,t) record idTaque__methods(parse,String,insert,foreach,insert_t,foreach_t,size,lookup,taque,Table) global idTaque__oprec, taque__oprec, Table__oprec procedure idTaque(punc,l,t) local self,clone initial { if /idTaque__oprec then idTaqueinitialize() if /taque__oprec then taqueinitialize() idTaque__oprec.taque := taque__oprec if /Table__oprec then Tableinitialize() idTaque__oprec.Table := Table__oprec } self := idTaque__state(&null,idTaque__oprec,punc,l,t) self.__state := self return idol_object(self,idTaque__oprec) end procedure idTaqueinitialize() initial idTaque__oprec := idTaque__methods(idTaque_parse,idTaque_String,taque_insert,taque_foreach,taque_insert_t,taque_foreach_t,Table_size,Table_lookup) end procedure argList_insert(self,s) #line 633 "idol.iol" if \self.varg then halt("variable arg must be final") if i := find("[",s) then { if not (j := find("]",s)) then halt("variable arg expected ]") s[i : j+1] := "" self.varg := s := trim(s) } (__self1 := self).__methods.idTaque.insert(__self1.__state,s) end procedure argList_isvarg(self,s) #line 642 "idol.iol" if s == \self.varg then return s end procedure argList_String(self) #line 645 "idol.iol" return (__self1 := self).__methods.idTaque.String(__self1.__state) || ((\self.varg & "[]") | "") end record argList__state(__state,__methods,varg,punc,l,t) record argList__methods(insert,isvarg,String,varg,parse,foreach,insert_t,foreach_t,size,lookup,idTaque,taque,Table) global argList__oprec, idTaque__oprec, taque__oprec, Table__oprec procedure argList(varg,punc,l,t) local self,clone initial { if /argList__oprec then argListinitialize() if /idTaque__oprec then idTaqueinitialize() argList__oprec.idTaque := idTaque__oprec if /taque__oprec then taqueinitialize() argList__oprec.taque := taque__oprec if /Table__oprec then Tableinitialize() argList__oprec.Table := Table__oprec } self := argList__state(&null,argList__oprec,varg,punc,l,t) self.__state := self argListinitially(self) return idol_object(self,argList__oprec) end procedure argListinitialize() initial argList__oprec := argList__methods(argList_insert,argList_isvarg,argList_String,argList_varg,idTaque_parse,taque_foreach,taque_insert_t,taque_foreach_t,Table_size,Table_lookup) end procedure argListinitially(self) #line 648 "idol.iol" self.punc := "," end procedure argList_varg(self) return .(self.varg) end procedure classFields_String(self,s) #line 656 "idol.iol" if *(rv := (__self1 := self).__methods.argList.String(__self1.__state)) = 0 then return "" if /s | (s ~== "class") then return rv if (__self1 := self).__methods.ispublic(__self1.__state,self.l[1]) then rv := "public "||rv every field:=(__self1 := self).__methods.foreachpublic(__self1.__state) do rv[find(","||field,rv)] ||:= "public " return rv end procedure classFields_foreachpublic(self) #line 663 "idol.iol" if \self.publics then every suspend !self.publics end procedure classFields_ispublic(self,s) #line 666 "idol.iol" if \self.publics then every suspend !self.publics == s end procedure classFields_insert(self,s) #line 669 "idol.iol" s ? { if ="public" & tab(many(white)) then { s := tab(0) /self.publics := [] put(self.publics,s) } } (__self1 := self).__methods.argList.insert(__self1.__state,s) end record classFields__state(__state,__methods,publics,varg,punc,l,t) record classFields__methods(String,foreachpublic,ispublic,insert,isvarg,varg,parse,foreach,insert_t,foreach_t,size,lookup,argList,idTaque,taque,Table) global classFields__oprec, argList__oprec, idTaque__oprec, taque__oprec, Table__oprec procedure classFields(publics,varg,punc,l,t) local self,clone initial { if /classFields__oprec then classFieldsinitialize() if /argList__oprec then argListinitialize() classFields__oprec.argList := argList__oprec if /idTaque__oprec then idTaqueinitialize() classFields__oprec.idTaque := idTaque__oprec if /taque__oprec then taqueinitialize() classFields__oprec.taque := taque__oprec if /Table__oprec then Tableinitialize() classFields__oprec.Table := Table__oprec } self := classFields__state(&null,classFields__oprec,publics,varg,punc,l,t) self.__state := self classFieldsinitially(self) clone := classFields__state() clone.__state := clone clone.__methods := classFields__oprec # inherited initialization from class argList every i := 2 to *self do clone[i] := self[i] argListinitially(clone) self.varg := clone.varg return idol_object(self,classFields__oprec) end procedure classFieldsinitialize() initial classFields__oprec := classFields__methods(classFields_String,classFields_foreachpublic,classFields_ispublic,classFields_insert,argList_isvarg,argList_varg,idTaque_parse,taque_foreach,taque_insert_t,taque_foreach_t,Table_size,Table_lookup) end procedure classFieldsinitially(self) #line 679 "idol.iol" self.punc := "," end # # Idol: Icon-derived object language, version 8.0 # # SYNOPSIS: # # idol -install # idol prog[.iol] ... [-x args ] # prog # # FILES: # # ./prog.iol : source file # ./prog.icn : Icon code for non-classes in prog.iol # ./idolcode.env/i_object.* : Icon code for the universal object type # ./idolcode.env/classname.icn : Icon files are generated for each class # ./idolcode.env/classname.u[12] : translated class files # ./idolcode.env/classname : class specification/interface # # SEE ALSO: # # "Programming in Idol: An Object Primer" # (U of Arizona Dept of CS Technical Report #90-10) # serves as user's guide and reference manual for Idol # ### Global variables # # FILES : fin = input (.iol) file, fout = output (.icn) file # CSETS : alpha = identifier characters, nonalpha = everything else # alphadot = identifiers + '.' # white = whitespace, nonwhite = everything else # TAQUES : classes in this module # FLAGS : comp if we should try to make an executable from args[1] # strict if we should generate paranoic encapsulation protection # loud if Idol should generate extra console messages # exec if we should run the result after translation # LISTS : links = names of external icon code to link to # imports = names of external classes to import # compiles = names of classes which need to be compiled # global fin,fout,fName,fLine,alpha,alphadot,white,nonwhite,nonalpha global classes,comp,exec,strict,links,imports,loud,compiles,compatible,ct global icontopt,tempenv # # initialize global variables # procedure initialize() loud := 1 comp := 0 alpha := &ucase ++ &lcase ++ '_' ++ &digits nonalpha := &cset -- alpha alphadot := alpha ++ '.' white := ' \t\f' nonwhite := &cset -- white classes := taque() links := [] imports := [] compiles := [] sysinitialize() end procedure main(args) initialize() if *args = 0 then write("usage: idol files...") else { if (!args ~== "-version") & not tryenvopen(filename("i_object",".u1")) then { tempenv := 0 install(args) } every i := 1 to *args do { if \exec then next # after -x, args are for execution if args[i][1] == "-" then { case map(args[i]) of { "-c" : { sysok := &null if comp = 0 then comp := -1 # don't make exe } "-ic" : compatible := 1 "-quiet" : loud := &null "-strict" : strict := 1 "-s" : sysok := &null "-t" : comp := -2 # don't translate "-version": return write("Idol version 8.0 of 10/6/90") & 0 "-x" : exec := i default : icontopt ||:= args[i] || " " } } else { \tempenv +:= 1 if args[i] := fileroot(args[i],".cl") then { push(imports,args[i]) } else if args[i] := fileroot(args[i],".icn") then { push(links,args[i]) icont(" -c "||args[i]) } else if args[i] := fileroot(args[i],".u1") then { push(links,args[i]) } else if (args[i] := fileroot(args[i],".iol")) | tryopen(filename(args[i],".iol"),"r") then { /exe := i args[i] := fileroot(args[i],".iol") /fout := sysopen(filename(args[i],".icn"),"w") readinput(filename(args[i],".iol"),1) } else { # # look for an appropriate .icn, .u1 or class file # if tryopen(filename(args[i],".icn"),"r") then { push(links,args[i]) icont(" -c "||args[i]) } else if tryopen(filename(args[i],".u1")) then { push(links,args[i]) } else if tryenvopen(args[i]) then { push(imports,args[i]) } } } } if gencode() then { close(\fout) if comp = 1 & (not makeexe(args,exe)) then stop("Idol exits after errors creating executable") } else { close(\fout) stop("Idol exits after errors translating") } } # # if we built an executable without separate compilation AND # there's no IDOLENV class environment AND # we had to install an environment then remove the environment # if (comp = 1) & (\tempenv < 2) & not getenv("IDOLENV") then uninstall() end # # tell whether the character following s is within a quote or not # procedure notquote(s) outs := "" # # eliminate escaped quotes. # this is a bug for people who write code like \"hello"... s ? { while outs ||:= tab(find("\\")+1) do move(1) outs ||:= tab(0) } # see if every quote has a matching endquote outs ? { while s := tab(find("\""|"'")+1) do { if not tab(find(s[-1])+1) then fail } } return end # # A contemplated addition: shorthand $.foo for self.foo ? # #procedure selfdot(line) # i := 1 # while ((i := find("$.",line,i)) & notquote(line[1:i])) do line[i]:="self" #end # # error/warning/message handling # procedure halt(args[]) errsrc() every writes(&errout,!args) stop() end procedure warn(args[]) errsrc() every writes(&errout,!args) write(&errout) end procedure errsrc() writes(&errout,"\"",\fName,"\", line ",\fLine,": Idol/") end # # System-independent, but system related routines # procedure tryopen(file,mode) if f := open(file,mode) then return close(f) end procedure tryenvopen(file,mode) return tryopen(envpath(file),mode) end procedure sysopen(file,mode) if not (f := open(file,mode)) then halt("Couldn't open file ",file," for mode ",mode) return f end procedure envopen(file,mode) return sysopen(envpath(file),mode) end procedure writelink(s) write(fout,"link \"",s,"\"") end procedure icont(argstr,prefix) static s initial { s := (getenv("ICONT")|"icont") } return mysystem((\prefix|"") ||s||icontopt||argstr) end icon-9.4.3/ipl/packs/idol/idol.bat0000664000175000017500000000005607140713042016235 0ustar chrishchrishiconx idol %1 %2 %3 %4 %5 %6 %7 %8 %9 idolt icon-9.4.3/ipl/packs/idol/idol.hqx0000664000175000017500000000763507140713042016301 0ustar chrishchrish----------------------------------------------------------------- (This file must be converted with BinHex 4.0) :#de39dPNEf`ZFfPd!&0*9#&6593K!*!%#aJ!N!3jU90*9#%!!`!!#aKb6'&e!I) !N!-@!E!#!JKTC'pX,Qe`Ffi!N"C6"J#3&!*K!*!%rj!%9%9B9%e38b!"!+M[3Z' Sp`Y3!!!"V!#3!r)!!!%T!*!$XP-9Gm-!N!BeZ!!!"!JSd!e"J`&p!)JJ3&4!EQ3 !-'MiN!!0J!-#2$hN"-#"J&)235&)3qB0'aGYi-aj)i!JP5*BU$5"-J8%`48!r"& d#9-Q6CX"FHVF5E4S3&6[K)3M+#pJ!&EGF!&J)F"9`'lF!&33m1SU1`!HZ!EdaJ# !!3'`aR+BLRBX%+d#BSf&!MEZ@$KQ"FJD#`J!#VeM5F'G0CB@!!i##!2`4Lf[iFA Nr!Tir#hJePS"[d%i,!!cJ'mdkYl+M)BJ%J!*QVaa%fE-'`!D!*`3Z#pYJ(pV3a$ 8R3#!lKDqc3*!!)!4!!S"'JRS8IaimZ@SlLfJHj9JYjd$#ATSMP`jFq2GPaXG,j! !B!#%!0!V2$B!h30Q"0FU"$"cLT6b#JDdqrG[r!"ir"(%"!$*G-%')aU-!!'L#C3 V)+DJ+F1'$BJjBq5NJ8-("*dh)168F3-L$CNhE!3f5$2QM4Xm)2D3!$6Cab0)(5l CZ##*FSm)1'(NK'P6KNiC1A0%p!("K`m)@`d)%N3a*Sa20dl,T&cTTZ9(0M#[ZLM CTNdB0f6QJ0J"JJc$RP*9PU`D-b[)V@qkIJdl&N3C2'NUaNJa8LYAVf$&&J@"`L` EY"hpaJ9-PqcG[#$f0M#-1#CFZB%E2+i)S`%#!Ja0B@YPCQPXC5jYF(F!N"0Fe!# 3%4B!!!6M!*!%rj!%9%9B9'4[Ff%"!+MfZ3USp`Sk!!!"V!!!!9!!!!&-!*!$aYa BHYi!N!B#Q!!!"!JSd!e"J`&p"(((cji3###S`%!"`!`5B#m!)((6d%NV!lVJ!-L iX@'$*Q(@P$'6KNdC%'2H`-NMJ##9)PLSN!"j-bI-3!!3J!DmQA0Rcjp"Ja*FbT3 T+RZj&!3-!'8UUihpl'hmTe82!')[$Va`mBqI%ehiq2%!m13G!!TQ5,4Smdr12ha q0,VaTp809kci`SkpHaDIYE9Yh`SjSX5)'5!L-ilejfmMAim!G#a1c!!-!4J(T"a KF!3!!MB+&[*9!N1N'ABJ@[`6")eA3#cY*#mJL!4!JLC[h)5*#H!0'a"TGV*T%bD 0'aGeBS#SibB0(ZM5N`-`B"V!@K)"ZJRSi4d!H2%p80e6S)0J&IG,I`Ed82lmq2V KlcIG2j9J!)3!!1J$!-F-J%i$l3A%!3!$!Y!%&&0))4!!#Jc3cMrrm$F!2"J5a!3 !bA$"##-DM!$4*-bD-QE5X#N$`X`E15$'['N$4f%D0fG!*#(cKJf)1Ql)P)(B"-S 9J3dDT1()aN@D-AK!%!1aXQ1$"(,+Z!R6KQ',2$4C"ZhS%QE+QKjR)RACF5LE0Q% ZZUJ6!`6&1e1V)KAcjJfGQeZldR&U&3j@UNkK5U8+PU8,L@fJKTac8q4#1JbA`T9 ,KUj+PPbpbR3DQ%j40fA2aJ!VdFhBX)+[CNdT'He-b5rG-(lM'%5,-BQ2XP6V*ZY JT+32Eqlm1@e8c3)#"fe`GbjTBfjP,R9ZDAJ!N"*dK`#3%!*K!*!)rj!%9%9B9%e 38b!"!+M[2VkU'm)V!!!"V!!!"l!!!!%%!!!%`FBZUki!N!C8Q3!!"!JSd!e"J`& p"*bJ!X+3!#pMf)5C-mG)QM*Xb-aa88I''!%%U46"3LA0Q!0Yi0aaBG)0b)!L56D "-JA%3!!8"S!K#!!,(jJMUFbXH62R6Tj)N`C%pFk(Vi!(B!8-`%UT8JJ%'5Ti11D 0QcPd`VLK!q!PJ*K8V#DG%!MTR)!'e#jp&m34db0Kj1S&S+bI`,ekN3")d-4VQ+i !dSap-`F0L*PA'S`!%B4-'$KdbT!!!@&'cTXf!1)L!)!(!)B!M36d)'dDY@T9'i5 YJ#S93&5H0`0kB(dkpHV5[98$*TJl!%)!ahd%L(8"N34H"$N!8!KJU*5r#JDdqrI 2kJ"ih!Nb#6!,$L-M'S`!!36&L"4Yi0aaN@D-Q`3aA03!%32'#aNiAZ5B)C!!S%' %#KNkK1L#"SJD,e$QJ0(abC3@Fq#8'C2'6%-3Bpk3!#N$`X`E15#DK+(TKXkE1@L #3VR5-3LC-($SP#(68mkE0L$UZ%Q$4k3E%',bJ"L#*S`F0QAQJ'!5CXh4MNedeN` c&DaB)@r%J!L#&NmB0cZ"9VbBFD2!"QIBj!h$"N6$0dAI4'94aSdG&R2bc(QcTN% $1&E(6+dMKfFEcCUPYN%a*d8$%)l0J1#LZ!j91QJUJlJM*ie8eUjKPkC$qQ[Q1DU "0kK-aM2S0k,*N!$QD41YQc"YbV#QM)G1F""UqI$4d@0fQHk[33`[$RijB-m$Di, !66f0GH`meCC9HekUQcPT3!C#Ir2PpY9kFRa&Adrf9BBI#'M0S4Cp(I9A'B#3!,% !`K[dbA&('R03&iCp,R`@fQLP-BL@94aZepphmXfa43XJU%#J$L$!d!8)2C4()(d (PN&FJZ"Y%3-)10*SBhGGZ0HFLG#Kb"0[[U99KaKXT1(''XV"4U98@@k*3Q9fL#I #&b+)ejU6cTdSABTN`K%'ELK8jf"fhb(i&CPQSLQHRGGPafC!!bAa(af-X6&RJ'k 81&!9)HT(PaaQMB&'3ibTQ&CUC@!Pi'ECJFGT'fUa9JC2@[U@"Q0Tk&''D`%p&pe dMKfD+!TQRE'QPlhp*S+Kb#@Uj4Q1NI&'Bf5QBC8Ef4@eQfp*J9D'6AL!)!*PPRh R8aed)1QMCC*9KS))DAb4PaScdH(9Y5,F)F*hAfUh,4dXL&"D6R*3PBDaE*JV"VT Md)(#&em%+a8,"'H(QdkY[C[H')U&@1FEh'T,FEINJ@##'h@``FE$C$a@&!TEN!$ V,m"dL0#&Dmbe'H@E2'QPCE!HibU(VYm0j!D(ML@%9V058C@(N!"X3MPVLQfdG5S HfZ8k"`YTI(FH6aNl[88D6F)QRmJ#6jd#Ml-GaeQ"ZZf4(Qb`RACFFL,XK*C8eSS hYCRVISGfE1Ba23ECAjQG3,cM&U%hYm2Ui(!#CGK4KKaLTH(YJ(U[F+4406S0JV' 3!2-NAXBLa-f(e9JhN!#!fU11bE6GD2H4RZV##9PFdB5+LPbR,H`N%f#9GCY63[B Y+Z!EXZelV*eHG33E#PU5AHbai&dCmVe'-DkKI"fLUKCNVaiQUj3iKCc6b-+cBHH Z)&M113JYM#&#HR+3!!SEjq[$P[MLMG[jH!MKMhrj'qAI(0jijHPFjm3c)-[)L8j c3B[8&-Hif$6SI[PVN!"D-0FqYB"JF`'deJAj8%!l("!0b,26e`JSJR9j4QZbf4d F`0B#'I"02DiM%JJ'dS*ZYD!&2YLI'dl3,6T3kMq+JYZFbZHap'cYH`*c@VhH"6B ZL+dcX!%5#%JhZp@dV3a[idQDq&$"2-A3$8AE(XaNPbSkV#T,VN)"M*!!+"Q-C6" q(H6F%1$ia-Ha"$DeS8V'0YDaMlA-D0aE@kHk"#(SC-S-B)50`@jL"L0ZaBbC-Y[ G%2NiF[(,"EY,'Q$Q!%IBb#CMiA*$RGa3,hH0%$a'JF1iK[!A(QlSGYCL!5,VeC1 IE)KEF1#@`qi'1$28+d6GQJNDq"H$AB+!GE[TPE``im8K'8FcR'%6HpX!!!: icon-9.4.3/ipl/packs/idol/idol.iol0000664000175000017500000005360307140713042016260 0ustar chrishchrish# # global variables # global fin,fout,fName,fLine,alpha,alphadot,white,nonwhite,nonalpha global classes,comp,exec,strict,links,imports,loud,compiles,compatible,ct # # gencode first generates specifications for all defined classes # It then imports those classes' specifications which it needs to # compute inheritance. Finally, it writes out all classes' .icn files. # procedure gencode() if \loud then write("Class import/export:") # # export specifications for each class # every cl := classes$foreach_t() do cl$writespec() # # import class specifications, transitively # repeat { added := 0 every super:= ((classes$foreach_t())$foreachsuper() | !imports) do{ if /classes$lookup(super) then { added := 1 fname := filename(super) readinput(envpath(fname),2) if /classes$lookup(super) then halt("can't import class '",super,"'") writesublink(fname) } } if added = 0 then break } # # compute the transitive closure of the superclass graph # every (classes$foreach_t())$transitive_closure() # # generate output # if \loud then write("Generating code:") writesublink("i_object") every s := !links do writelink(s) write(fout) every out := $!classes do { name := filename(out$name()) out$write() put(compiles,name) writesublink(name) } if *compiles>0 then return cdicont(compiles) else return end # # a class defining objects resulting from parsing lines of the form # tag name ( field1 , field2, ... ) # If the constructor is given an argument, it is passed to self$read # class declaration(public name,fields,tag) # # parse a declaration string into its components # method read(decl) decl ? ( (tab(many(white)) | "") , # get my tag (self.tag := =("procedure"|"class"|"method"|"record")) , (tab(many(white)) | "") , # get my name (self.name := tab(many(alpha))) , # get my fields (tab(find("(")+1)), (tab(many(white)) | "") , ((self.fields := classFields())$parse(tab(find(")")))) ) | halt("declaration/read can't parse decl ",decl) end # # write a declaration; at the moment, only used by records # method write(f) write(f,self$String()) end # # convert self to a string # method String() return self.tag || " " || self.name || "(" || self.fields$String() || ")" end initially if \self.name then self$read(self.name) end # # A class for ordinary Icon global declarations # class vardecl(s) method write(f) write(f,self.s) end end # # A class defining the constants for a given scope # class constant(t) method expand(s) i := 1 # # conditions for expanding a constant: # must not be within a larger identifier nor within a quote # while ((i <- find(k <- $!self,s,i)) & ((i=1) | any(nonalpha,s[i-1])) & ((*s = i+*k-1) | any(nonalpha,s[i+*k])) & notquote(s[1:i])) do { val := \ (self.t[k]) | stop("internal error in expand") s[i +: *k] := val # i +:= *val } return s end method foreach() # in this case, we mean the keys, not the values suspend key(self.t) end method eval(s) if s2 := \ self.t[s] then return s2 end method parse(s) s ? { k := trim(tab(find(":="))) | fail move(2) tab(many(white)) val := tab(0) | fail (*val > 0) | fail self.t [ k ] := val } return end method append(cd) every s := cd$parse do self$parse(s) end initially self.t := table() end # # A class defining a single constant declaration # class constdcl : vardecl() # suspend the individual constant := value strings method parse() self.s ? { tab(find("const")+6) tab(many(white)) while s2 := trim(tab(find(","))) do { suspend s2 move(1) tab(many(white)) } suspend trim(tab(0)) } end end # # class body manages a list of strings holding the code for # procedures/methods/classes # class body(fn,ln,vars,text) method read() self.fn := fName self.ln := fLine self.text := [] while line := readln() do { put(self.text, line) line ? { tab(many(white)) if ="end" & &pos > *line then return else if =("local"|"static"|"initial") & any(nonalpha) then { self.ln +:= 1 pull(self.text) / (self.vars) := [] put(self.vars, line) } } } halt("body/read: eof inside a procedure/method definition") end method write(f) if \self.vars then every write(f,!self.vars) if \compatible then write(f," \\self := self.__state") if \self.ln then write(f,"#line ",self.ln + ((*\self.vars)|0)," \"",self.fn,"\"") every write(f,$!self) end method delete() return pull(self.text) end method size() return (*\ (self.text)) | 0 end method foreach() if t := \self.text then suspend !self.text end end # # a class defining operations on classes # class class : declaration (supers,methods,text,imethods,ifields,glob) # imethods and ifields are all lists of these: record classident(class,ident) method read(line,phase) self$declaration.read(line) self.supers := idTaque(":") self.supers$parse(line[find(":",line)+1:find("(",line)] | "") self.methods:= taque() self.text := body() while line := readln("wrap") do { line ? { tab(many(white)) if ="initially" then { self.text$read() if phase=2 then return self.text$delete() # "end" appended manually during writing after # generation of the appropriate return value return } else if ="method" then { decl := method(self.name) decl$read(line,phase) self.methods$insert(decl,decl$name()) } else if ="end" then { # "end" is tossed here. see "initially" above return } else if ="procedure" then { decl := method("") decl$read(line,phase) /self.glob := [] put(self.glob,decl) } else if ="global" then { /self.glob := [] put(self.glob,vardecl(line)) } else if ="record" then { /self.glob := [] put(self.glob,declaration(line)) } else if upto(nonwhite) then { halt("class/read expected declaration on: ",line) } } } halt("class/read syntax error: eof inside a class definition") end # # Miscellaneous methods on classes # method has_initially() return $*self.text > 0 end method ispublic(fieldname) if self.fields$ispublic(fieldname) then return fieldname end method foreachmethod() suspend $!self.methods end method foreachsuper() suspend $!self.supers end method foreachfield() suspend $!self.fields end method isvarg(s) if self.fields$isvarg(s) then return s end method transitive_closure() count := $*self.supers while count > 0 do { added := taque() every sc := $!self.supers do { if /(super := classes$lookup(sc)) then halt("class/transitive_closure: couldn't find superclass ",sc) every supersuper := super$foreachsuper() do { if / self.supers$lookup(supersuper) & /added$lookup(supersuper) then { added$insert(supersuper) } } } count := $*added every self.supers$insert($!added) } end # # write the class declaration: if s is "class" write as a spec # otherwise, write as a constructor # method writedecl(f,s) writes(f, s," ",self.name) if s=="class" & ( *(supers := self.supers$String()) > 0 ) then writes(f," : ",supers) writes(f,"(") rv := self.fields$String(s) if *rv > 0 then rv ||:= "," if s~=="class" & *(\self.ifields)>0 then { # inherited fields every l := !self.ifields do rv ||:= l.ident || "," if /(superclass := classes$lookup(l.class)) then halt("class/resolve: couldn't find superclass ",sc) if superclass$isvarg(l.ident) then rv := rv[1:-1]||"[]," } writes(f,rv[1:-1]) write(f,,")") end method writespec(f) # write the specification of a class f := envopen(filename(self.name),"w") self$writedecl(f,"class") every ($!self.methods)$writedecl(f,"method") if self$has_initially() then write(f,"initially") write(f,"end") close(f) end # # write out the Icon code for this class' explicit methods # and its "nested global" declarations (procedures, records, etc.) # method writemethods() f:= envopen(filename(self.name,".icn"),"w") every ($!self.methods)$write(f,self.name) if \self.glob & *self.glob>0 then { write(f,"#\n# globals declared within the class\n#") every i := 1 to *self.glob do (self.glob[i])$write(f,"") } close(f) end # # write - write an Icon implementation of a class to file f # method write() f:= envopen(filename(self.name,".icn"),"a") # # must have done inheritance computation to write things out # if /self.ifields then self$resolve() # # write a record containing the state variables # writes(f,"record ",self.name,"__state(__state,__methods") # reserved fields rv := "," rv ||:= self.fields$idTaque.String() # my fields if rv[-1] ~== "," then rv ||:= "," every s := (!self.ifields).ident do rv ||:= s || "," # inherited fields write(f,rv[1:-1],")") # # write a record containing the methods # writes(f,"record ",self.name,"__methods(") rv := "" every s := ((($!self.methods)$name()) | # my explicit methods self.fields$foreachpublic() | # my implicit methods (!self.imethods).ident | # my inherited methods $!self.supers) # super.method fields do rv ||:= s || "," if *rv>0 then rv[-1] := "" # trim trailling , write(f,rv,")") # # write a global containing this classes' operation record # along with declarations for all superclasses op records # writes(f,"global ",self.name,"__oprec") every writes(f,", ", $!self.supers,"__oprec") write(f) # # write the constructor procedure. # This is a long involved process starting with writing the declaration. # self$writedecl(f,"procedure") write(f,"local self,clone") # # initialize operation records for this and superclasses # write(f,"initial {\n", " if /",self.name,"__oprec then ",self.name,"initialize()") if $*self.supers > 0 then every (super <- $!self.supers) ~== self.name do write(f," if /",super,"__oprec then ",super,"initialize()\n", " ",self.name,"__oprec.",super," := ", super,"__oprec") write(f," }") # # create self, initialize from constructor parameters # writes(f," self := ",self.name,"__state(&null,",self.name,"__oprec") every writes(f,",",$!self.fields) if \self.ifields then every writes(f,",",(!self.ifields).ident) write(f,")\n self.__state := self") # # call my own initially section, if any # if $*self.text > 0 then write(f," ",self.name,"initially(self)") # # call superclasses' initially sections # if $*self.supers > 0 then { every (super <- $!self.supers) ~== self.name do { if (classes$lookup(super))$has_initially() then { if /madeclone := 1 then { write(f," clone := ",self.name,"__state()\n", " clone.__state := clone\n", " clone.__methods := ",self.name,"__oprec") } write(f," # inherited initialization from class ",super) write(f," every i := 2 to *self do clone[i] := self[i]\n", " ",super,"initially(clone)") every l := !self.ifields do { if l.class == super then write(f," self.",l.ident," := clone.",l.ident) } } } } # # return the pair that comprises the object: # a pointer to the instance (__mystate), and # a pointer to the class operation record # write(f," return idol_object(self,",self.name,"__oprec)\n", "end\n") # # write out class initializer procedure to initialize my operation record # write(f,"procedure ",self.name,"initialize()") writes(f," initial ",self.name,"__oprec := ",self.name,"__methods") rv := "(" every s := ($!self.methods)$name() do { # explicit methods if *rv>1 then rv ||:= "," rv ||:= self.name||"_"||s } every me := self.fields$foreachpublic() do { # implicit methods if *rv>1 then rv ||:= "," # (for public fields) rv ||:= self.name||"_"||me } every l := !self.imethods do { # inherited methods if *rv>1 then rv ||:= "," rv ||:= l.class||"_"||l.ident } write(f,rv,")\n","end") # # write out initially procedure, if any # if self$has_initially() then { write(f,"procedure ",self.name,"initially(self)") self.text$write(f) write(f,"end") } # # write out implicit methods for public fields # every me := self.fields$foreachpublic() do { write(f,"procedure ",self.name,"_",me,"(self)") if \strict then { write(f," if type(self.",me,") == ", "(\"list\"|\"table\"|\"set\"|\"record\") then\n", " runerr(501,\"idol: scalar type expected\")") } write(f," return .(self.",me,")") write(f,"end") write(f) } close(f) end # # resolve -- primary inheritance resolution utility # method resolve() # # these are lists of [class , ident] records # self.imethods := [] self.ifields := [] ipublics := [] addedfields := table() addedmethods := table() every sc := $!self.supers do { if /(superclass := classes$lookup(sc)) then halt("class/resolve: couldn't find superclass ",sc) every superclassfield := superclass$foreachfield() do { if /self.fields$lookup(superclassfield) & /addedfields[superclassfield] then { addedfields[superclassfield] := superclassfield put ( self.ifields , classident(sc,superclassfield) ) if superclass$ispublic(superclassfield) then put( ipublics, classident(sc,superclassfield) ) } else if \strict then { warn("class/resolve: '",sc,"' field '",superclassfield, "' is redeclared in subclass ",self.name) } } every superclassmethod := (superclass$foreachmethod())$name() do { if /self.methods$lookup(superclassmethod) & /addedmethods[superclassmethod] then { addedmethods[superclassmethod] := superclassmethod put ( self.imethods, classident(sc,superclassmethod) ) } } every public := (!ipublics) do { if public.class == sc then put (self.imethods, classident(sc,public.ident)) } } end end # # a class defining operations on methods and procedures # class method : declaration (class,text) method read(line,phase) self$declaration.read(line) self.text := body() if phase = 1 then self.text$read() end method writedecl(f,s) decl := self$String() if s == "method" then decl[1:upto(white,decl)] := "method" else { decl[1:upto(white,decl)] := "procedure" if *(self.class)>0 then { decl[upto(white,decl)] ||:= self.class||"_" i := find("(",decl) decl[i] ||:= "self" || (((decl[i+1] ~== ")"), ",") | "") } } write(f,decl) end method write(f) if self.name ~== "initially" then self$writedecl(f,"procedure") self.text$write(f) self.text := &null # after writing out text, forget it! end end # # a class corresponding to an Icon table, with special treatment of empties # class Table(t) method size() return (* \ self.t) | 0 end method insert(x,key) /self.t := table() /key := x if / (self.t[key]) := x then return end method lookup(key) if t := \self.t then return t[key] return end method foreach() if t := \self.t then every suspend !self.t end end # # tabular queues (taques): # a class defining objects which maintain synchronized list and table reps # Well, what is really provided are loosely-coordinated list/tables # class taque : Table (l) method insert(x,key) /self.l := [] if self$Table.insert(x,key) then put(self.l,x) end method foreach() if l := \self.l then every suspend !self.l end method insert_t(x,key) self$Table.insert(x,key) end method foreach_t() suspend self$Table.foreach() end end # # support for taques found as lists of ids separated by punctuation # constructor called with (separation char, source string) # class idTaque : taque(punc) method parse(s) s ? { tab(many(white)) while name := tab(find(self.punc)) do { self$insert(trim(name)) move(1) tab(many(white)) } if any(nonwhite) then self$insert(trim(tab(0))) } return end method String() if /self.l then return "" out := "" every id := !self.l do out ||:= id||self.punc return out[1:-1] end end # # parameter lists in which the final argument may have a trailing [] # class argList : idTaque(public varg) method insert(s) if \self.varg then halt("variable arg must be final") if i := find("[",s) then { if not (j := find("]",s)) then halt("variable arg expected ]") s[i : j+1] := "" self.varg := s := trim(s) } self$idTaque.insert(s) end method isvarg(s) if s == \self.varg then return s end method String() return self$idTaque.String() || ((\self.varg & "[]") | "") end initially self.punc := "," end # # Idol class field lists in which fields may be preceded by a "public" keyword # class classFields : argList(publics) method String(s) if *(rv := self$argList.String()) = 0 then return "" if /s | (s ~== "class") then return rv if self$ispublic(self.l[1]) then rv := "public "||rv every field:=self$foreachpublic() do rv[find(","||field,rv)] ||:= "public " return rv end method foreachpublic() if \self.publics then every suspend !self.publics end method ispublic(s) if \self.publics then every suspend !self.publics == s end method insert(s) s ? { if ="public" & tab(many(white)) then { s := tab(0) /self.publics := [] put(self.publics,s) } } self$argList.insert(s) end initially self.punc := "," end # # procedure to read a single Idol source file # procedure readinput(name,phase,ct2) if \loud then write("\t",name) fName := name fLine := 0 fin := sysopen(name,"r") ct := \ct2 | constant() while line := readln("wrap") do { line ? { tab(many(white)) if ="class" then { decl := class() decl$read(line,phase) if phase=1 then { decl$writemethods() classes$insert(decl,decl$name()) } else classes$insert_t(decl,decl$name()) } else if ="procedure" then { if comp = 0 then comp := 1 decl := method("") decl$read(line,phase) decl$write(fout,"") } else if ="record" then { if comp = 0 then comp := 1 decl := declaration(line) decl$write(fout,"") } else if ="global" then { if comp = 0 then comp := 1 decl := vardecl(line) decl$write(fout,"") } else if ="const" then { ct$append ( constdcl(line) ) } else if ="method" then { halt("readinput: method outside class") } else if ="#include" then { savedFName := fName savedFLine := fLine savedFIn := fin tab(many(white)) readinput(tab(if ="\"" then find("\"") else many(nonwhite)), phase,ct) fName := savedFName fLine := savedFLine fin := savedFIn } } } close(fin) end # # filter the input translating $ references # (also eats comments and trims lines) # procedure readln(wrap) count := 0 prefix := "" while /finished do { if not (line := read(fin)) then fail fLine +:= 1 if match("#include",line) then return line line[ 1(x<-find("#",line),notquote(line[1:x])) : 0] := "" line := trim(line,white) # line := selfdot(line) x := 1 while ((x := find("$",line,x)) & notquote(line[1:x])) do { z := line[x+1:0] ||" " # " " is for bal() case line[x+1] of { # # IBM 370 digraphs # "(": line[x+:2] := "{" ")": line[x+:2] := "}" "<": line[x+:2] := "[" ">": line[x+:2] := "]" # # Invocation operators $! $* $@ $? (for $$ see below) # "!"|"*"|"@"|"?": { z ? { move(1) tab(many(white)) if not (id := tab(many(alphadot))) then { if not match("(") then halt("readln can't parse ",line) if not (id := tab(&pos=(x+methlen+1))|0)\1)] := front || methodname || back || c } } # case } # while there's a $ to process if /wrap | (prefix==line=="") then finished := line else { prefix ||:= line || " " # " " is for bal() prefix ? { # we are done if the line is balanced wrt parens and # doesn't end in a continuation character (currently just ,) if ((*prefix = bal()) & (not find(",",prefix[-2]))) then finished := prefix[1:-1] } } } # while / finished return ct$expand(finished) end icon-9.4.3/ipl/packs/idol/idol.man0000664000175000017500000000470307140713042016245 0ustar chrishchrishNAME idol - Icon-Derived Object Language SYNOPSIS idol [ option ... ] mainfile otherfiles... [-x arguments] DESCRIPTION Idol is an object-oriented preprocessor for Version 8+ Icon. It is a front-end for icont(1); typically one invokes idol on a source file (extension .iol) which is translated into an Icon source file (extension .icn) which is translated into a file suitable for interpretation by the Icon interpreter. On systems with directories, Idol typically stores its generated class library code in a separate directory from the source code. If the environment variable IDOLENV is defined, Idol uses this directory for generated code. If no IDOLENV is defined, Idol creates a subdirectory named idolcode.env, and removes it after successful compilation if the creation occurred for a single source file. Producing an executable is skipped when the first file on the list contains only classes and no Icon entities. Idol uses an Icon translator selected by the environment variable ICONT, if it is present. The following options are recognized by idol: -c Suppress the linking phase -t Suppress all translation by icont -s Suppress removal of .icn files after translation by icont -quiet Suppress most Idol-specific console messages -strict Generate code that is paranoid about ensuring encapsulation -version Print out the version of Idol and its date of creation -ic Generate code to create Icon-compatible class libraries The second and following files on the command line may include extensions .icn, .u1, and .cl. The first two Idol treats as Icon source code which should be translated and linked into the resulting executable. Files with extension .cl are treated as class names which are linked into the resulting executable. If no extension is given, Idol attempts to find the desired source file by appending .iol, .icn, .u1, or .cl in that order. FILES prog.iol : source file prog.icn : code generated for non-classes in prog.iol idolcode.env/i_object.* : Icon code for the universal object type idolcode.env/classname.icn : Icon files are generated for each class idolcode.env/classname.u[12] : translated class files idolcode.env/classname : class specification/interface SEE ALSO "Programming in Idol: An Object Primer" (U of Arizona Dept of CS Technical Report #90-10) serves as user's guide and reference manual for Idol icon-9.4.3/ipl/packs/idol/idol.txt0000664000175000017500000014674207303574645016342 0ustar chrishchrish Programming in Idol: An Object Primer Clinton L. Jeffery January 25, 1990; Last revised March 4, 1991 Idol is an object-oriented extension and environment for the Icon programming language. This document describes Idol in two parts. The first part presents Idol's object-oriented programming concepts as an integral tool with which a programmer maps a good program design into a good implementation. As such, it serves as the "user's guide" for Idol's extensions to Icon. Idol's object-oriented programming facilities are viewed within the broader framework of structured programming and modular design in general. Idol's precise syntax and semantics are detailed in the second part, "An Icon-Derived Object Language", which serves as a reference manual. Object-Oriented Programming After a Fashion Object-oriented programming means different things to different people. In Idol, object-oriented programming centers around encapsulation, inheritance, and polymorphism. These key ideas are shared by most object-oriented languages as well as many languages that are not considered object-oriented. This paper introduces these ideas and illustrates their use in actual code. Idol is relevant in this discussion because programming concepts are more than mental exercises; they are mathematical notations by which programmers share their knowledge. Object-oriented programming can be done in Smalltalk, C++, or assembler language for that matter, but this does not mean these programming notations are equally desirable. Assembler languages are not portable. For most programmers, Smalltalk uses an alien notation; Smalltalk programs also share the flaw that they do not work well in environments such as UNIX and DOS that consist of interacting programs written in many languages. C++ has neither of these flaws, but the same low-level machine-oriented character that makes it efficient also makes C++ less than ideal as an algorithmic notation usable by nonexperts. Idol owes most of its desirable traits to its foundation, the Icon programming language, developed at the University of Arizona [Gris90]. In fact, Idol presents objects simply as a tool to aid in the writing of Icon programs. Idol integrates a concise, robust notation for object-oriented programming into a language considerably more advanced than C or Pascal. Icon already uses a powerful notation for expressing a general class of algorithms. The purpose of Idol is to enhance that notation, not to get in the way. Key Concepts This section describes the general concepts that Idol supplies to authors of large Icon programs. The following section provides programming examples that employ these tools. The reader is encouraged to refer back to this section when clarification in the examples section is needed. The single overriding reason for object-oriented programming is the large program. Simple programs can be easily written in any notation. Somewhere between the 1,000-line mark and the 10,000-line mark most programmers can no longer keep track of their entire program at once. By using a very high-level programming language, less lines of code are required; a programmer can write perhaps ten times as large a program and still be able to keep track of things. As programmers are required to write larger and larger programs, the benefit provided by very-high level languages does not keep up with program complexity. This obstacle has been labelled the "software crisis", and object-oriented programming addresses this crisis. In short, the goals of object-oriented programming are to reduce the amount of coding required to write very large programs and to allow code to be understood independently of the context of the surrounding program. The techniques employed to achieve these goals are discussed below. Encapsulation The primary concept advocated by object-oriented programming is the principle of encapsulation. Encapsulation is the isolation, in the source code that a programmer writes, of a data representation and the code that manipulates the data representation. In some sense, encapsulation is an assertion that no other routines in the program have "side-effects" with respect to the data structure in question. It is easier to reason about encapsulated data because all of the source code that could affect that data is immediately present with its definition. Encapsulation does for data structures what the procedure does for algorithms: it draws a line of demarcation in the program text, the outside of which is (or can be, or ought to be) irrelevant to the inside. We call an encapsulated data structure an object. Just as a set of named variables called parameters comprise the only interface between a procedure and the code that uses it, a set of named procedures called methods comprise the only interface between an object and the code that uses it. This textual definition of encapsulation as a property of program source code accounts for the fact that good programmers can write encapsulated data structures in any language. The problem is not capability, but verification. In order to verify encapsulation some object-oriented languages, like C++, define an elaborate mechanism by which a programmer can govern the visibility of each data structure. Like Smalltalk, Idol instead attempts to simplify verification by preventing violations of encapsulation entirely. Inheritance In large programs, the same or nearly the same data structures are used over and over again for a myriad of different purposes. Similarly, variations on the same algorithms are employed by structure after structure. In order to minimize redundancy, techniques are needed to support code sharing for both data structures and algorithms. Code is shared by related data structures by a programming concept called inheritance. The basic premise of inheritance is simple: if I need to write code for a new data structure which is similar to one that's already written, I can specify the new structure by giving the differences between it and the old structure, instead of copying and then modifying the old structure's code. Obviously there are times when the inheritance mechanism is not useful: if the two data structures are more different than they are similar, or if they are simple enough that inheritance would only confuse things, for example. Inheritance addresses a variety of common programming problems found at different conceptual levels. The most obvious software engineering problem it solves might be termed enhancement. During the development of a program, its data structures may require extension via new state variables or new operations or both; inheritance is especially useful when both the original structure and the extension are used by the application. Inheritance also supports simplification, or the reduction of a data structure's state variables or operations. Simplification is analogous to argument culling after the fashion of the lambda calculus; it captures a logical relation between structures rather than a common situation in software development. In general, inheritance may be used in source code to describe any sort of relational hyponymy, or special-casing; in Idol the collection of all inheritance relations defines a directed (not necessarily acyclic) graph. Polymorphism From the perspective of the writer of related data structures, inheritance provides a convenient method for code sharing, but what about the code that uses objects? Since objects are encapsulated, that code is not dependent upon the internals of the object at all, and it makes no difference to the client code whether the object in questions belongs to the original class or the inheriting class. In fact, we can make a stronger statement. Due to encapsulation, two different executions of some code that uses objects to implement a particular algorithm may operate on different objects that are not related by inheritance at all. Such code may effectively be shared by any objects that happen to implement the operations that the code invokes. This facility is called polymorphism, and such algorithms are called generic. This feature is found in non-object oriented languages; in object-oriented languages it is a natural extension of encapsulation. Object Programming The concepts introduced above are used in many programming languages in one form or another. The following text presents these concepts in the context of actual Idol code. This serves a dual purpose: it should clarify the object model adopted by Idol as well as provide an initial impression of these concepts' utility in coding. In order to motivate the constructs provided by Idol, our example begins by contrasting conventional Icon code with Idol code which implements the same behavior. The semantics of the Idol code given here is defined by the Idol reference manual, included later in this document in the section entitled, "An Icon-Derived Object Language". Before Objects In order to place Idol objects in their proper context, the first example is taken from from regular Icon. Suppose I am writing some text-processing application such as a text editor. Such applications need to be able to process Icon structures holding the contents of various text files. I might begin with a simple structure like the following: record buffer(filename,text,index) where filename is a string, text is a list of strings corresponding to lines in the file, and index is a marker for the current line at which the buffer is being processed. Icon record declarations are global; in principle, if the above declaration needs to be changed, the entire program must be rechecked. A devotee of structured programming would no doubt write Icon procedures to read the buffer in from a file, write it out to a file, examine, insert and delete individual lines, etc. These procedures, along with the record declaration given above, can be kept in a separate source file (buffer.icn) and understood independently of the program(s) in which they are used. Here is one such procedure: # read a buffer in from a file procedure read_buffer(b) f := open(b.filename) | fail b.text := [ ] b.position := 1 every put(b.text,!f) close(f) return b end There is nothing wrong with this example; in fact its similarity to the object-oriented example that follows demonstrates that a good, modular design is the primary effect encouraged by object-oriented programming. Using a separate source file to contain a record type and those procedures which operate on that type allows an Icon programmer to maintain a voluntary encapsulation of that type. After Objects Here is the same buffer abstraction coded in Idol. This example lays the groundwork for some more substantial techniques to follow. class buffer(public filename,text,index) # read a buffer in from a file method read() f := open(self.filename) | fail selferase() every put(self.text,!f) close(f) return end # write a buffer out to a file method write() f := open(self.filename,"w") | fail every write(f,!self.text) close(f) end # insert a line at the current index method insert(s) if self.index = 1 then { push(self.text,s) } else if self.index > *self.text then { put(self.text,s) } else { self.text := self.text[1:self.index] ||| [s] ||| self.text[self.index:0] } self.index +:= 1 return end # delete a line at the current index method delete() if self.index > *self.text then fail rv := self.text[self.index] if self.index=1 then pull(self.text) else if self.index = *self.text then pop(self.text) else self.text := self.text[1:self.index]|||self.text[self.index+1:0] return rv end # move the current index to an arbitrary line method goto(l) if (0 <= l) & (l <= self.index+1) then return self.index := l end # return the current line and advance the current index method forward() if self.index > *self.text then fail rv := self.text[self.index] self.index +:= 1 return rv end method erase() self.text := [ ] self.index := 1 end initially if (self.filename) then { if not selfread() then selferase() } else { self.filename := "*scratch*" selferase() } end This first example is not complex enough to illustrate the full object-oriented style, but its a start. Pertaining to the general concepts introduced above, we can make the following initial observations: Polymorphism. A separate name space for each class's methods makes for shorter names. The same method name can be used in each class that implements a given operation. This notation is more concise than is possible with standard Icon procedures. More importantly it allows algorithms to operate correctly upon objects of any class which implements the operations required by the algorithm. Constructors. A section of code is executed automatically when the constructor is called, allowing initialization of fields to values other than &null. Of course, this could be simulated in Icon by writing a procedure that had the same effect; the value of the constructor is that it is automatic; the programmer is freed from the responsibility of remembering to call this code everywhere objects are created in the client program(s). This tighter coupling of memory allocation and its corresponding initialization removes one more source of program errors, especially on multiprogrammer projects. These two observations share a common theme: the net effect is that each piece of data is made responsible for its own behavior in the system. Although this first example dealt with simple line-oriented text files, the same methodology applies to more abstract entities such as the components of a compiler's grammar (This example is taken from the Idol translator itself, which provides another extended example of polymorphism and inheritance.). Idol's code sharing facilities are illustrated if we extend the above example. Suppose the application is more than just a text editor--- it includes word-associative databases such as a dictionary, bibliography, spell-checker, thesaurus, etc. These various databases can be represented internally using Icon tables. The table entries for the databases vary, but the databases all use string keyword lookup. As external data, the databases can be stored in text files, one entry per line, with the keyword at the beginning. The format of the rest of the line varies from database to database. Although all these types of data are different, the code used to read the data files can be shared, as well as the initial construction of the tables. In fact, since we are storing our data one entry per line in text files, we can use the code already written for buffers to do the file i/o itself. class buftable : buffer() method read() selfbuffer.read() tmp := table() every line := !self.text do line ? { tmp[tab(many(&letters))] := line | fail } self.text := tmp return end method index(s) return self.text[s] end end This concise example shows how little must be written to achieve data structures with vastly different behavioral characteristics, by building on code that is already written. The superclass read() operation is one important step of the subclass read() operation; this technique is common enough to have a name: it is called method combination in the literature. It allows one to view the subclass as a transformation of the superclass. The buftable class is given in its entirety, but our code sharing example is not complete: what about the data structures required to support the databases themselves? They are all variants of the buftable class, and a set of possible implementations is given below. Note that the formats presented are designed to illustrate code sharing; clearly, an actual application might make different choices. Bibliographies Bibliographies might consist of a keyword followed by an uninterpreted string of information. This imposes no additional structure on the data beyond that imposed by the buftable class. An example keyword would be Jeffery90. class bibliography : buftable() end Spell-checkers The database for a spell-checker is presumably just a list of words, one per line; the minimal structure required by the buftable class given above. Some classes exist to introduce new terminology rather than define a new data structure. In this case we introduce a lookup operation which may fail, for use in tests. In addition, since many spell-checking systems allow user definable dictionaries in addition to their central database, we allow spellChecker objects to chain together for the purpose of looking up words. class spellChecker : buftable(parentSpellChecker) method spell(s) return (self.text[s]) | ( (self.parentSpellChecker))spell(s) end end Dictionaries Dictionaries are slightly more involved. Each entry might consist of a part of speech, an etymology, and an arbitrary string of uninterpreted text comprising a definition for that entry, separated by semicolons. Since each such entry is itself a structure, a sensible decomposition of the dictionary structure consists of two classes: one that manages the table and external file i/o, and one that handles the manipulation of dictionary entries, including their decoding and encoding as strings. class dictionaryentry(word,pos,etymology,definition) method decode(s) # decode a dictionary entry into its components s ? { self.word := tab(upto(';')) move(1) self.pos := tab(upto(';')) move(1) self.etymology := tab(upto(';')) move(1) self.definition := tab(0) } end method encode() # encode a dictionary entry into a string return self.word || ";" || self.pos || ";" || self.etymology || ";" || self.definition end initially if /self.pos then { # constructor was called with a single string argument selfdecode(self.word) } end class dictionary : buftable() method read() selfbuffer.read() tmp := table() every line := !self.text do line ? { tmp[tab(many(&letters))] := dictionaryentry(line) | fail } self.text := tmp end method write() f := open(b.filename,"w") | fail every write(f,(!self.text)encode()) close(f) end end Thesauri Although an oversimplification, one might conceive of a thesauri as a list of entries, each of which consists of a comma-separated list of synonyms followed by a comma-separated list of antonyms, with a semicolon separating the two lists. Since the code for such a structure is nearly identical to that given for dictionaries above, we omit it here (but one might reasonably capture a generalization regarding entries organized as fields separated by semicolons). Objects and Icon Programming Techniques In examining any addition to a language as large as Icon, a significant question is how that addition relates to the rest of the language. In particular, how does object-oriented programming fit into the suite of advanced techniques used regularly by Icon programmers? Previous sections of this document expound objects as an organizational tool, analogous but more effective than the use of separate compilation to achieve program modularity. Object-oriented programming goes considerably beyond that viewpoint. Whether viewed dynamically or statically, the primary effect achieved by object-oriented programming is the subdivision of program data in parallel with the code. Icon already provides a variety of tools that achieve related effects: Local and Static Variables in Icon procedures are the simplest imaginable parallel association of data and code. We do not discuss them further, although they are by no means insignificant. Records allow a simple form of user-defined types. They provide a useful abstraction, but keeping records associated with the right pieces of code is still the job of the programmer. String Scanning creates scanning environments. These are very useful, but not very general: not all problems can be cast as string operations. Co-expressions save a program state for later evaluation. This powerful facility has a sweeping range of uses, but unfortunately it is a relatively expensive mechanism that is frequently misused to achieve a simple effect. Objects and classes, if they are successful, allow a significant generalization of the techniques developed around the above language mechanisms. Objects do not replace these language mechanisms, but in many cases presented below they provide an attractive alternative means of achieving similar effects. Objects and Records Objects are simply records whose field accesses are voluntarily limited to a certain set of procedures. Objects and Scanning Environments String scanning in Icon is another example of associating a piece of data with the code that operates on it. In an Icon scanning expression of the form e1 ? e2, the result of evaluating e1 is used implicitly in e2 via a variety of scanning functions. In effect, the scanning operation defines a scope in which state variables &subject and &pos are redefined. [Walk86] proposes an extension to Icon allowing programmer-defined scanning environments. The extension involves a new record data type augmented by sections of code to be executed upon entry, resumption, and exit of the scanning environment. The Icon scanning operator was modified to take advantage of the new facility when its first argument was of the new environment data type. While objects cannot emulate Icon string scanning syntactically, they generalize the concept of the programmer-defined scanning environment. Classes in the Idol standard library include a wide variety of scanning environments in addition to conventional strings. The variation is not limited to the type of data scanned; it also includes the form and function of the scanning operations. The form of scanning operations available are defined by the state variables they access; in the case of Icon's built-in string scanning, a single string and a single integer index into that string. There is no reason that a scanning environment cannot maintain a more complex state, such as an input string, an output string, and a pair of indices and directions for each string. Rather than illustrate the use of objects to construct scanning environments with such an abstract model, a concrete example is presented below. List Scanning List scanning is a straightforward adaptation of string scanning to the list data type. It consists of a library class named ListScan that implements the basic scanning operations, and various user classes that include the scanning expressions. This format is required due to Idol's inability to redefine the semantics of the ? operator or to emulate its syntax in any reasonable way. The state maintained during a list scan consists of Subject and Pos, analogous to &subject and &pos, respectively. ListScan defines analogies to the basic scanning functions of Icon, e.g. tab, upto, many, any, etc. These functions are used in methods of a ListScan client class, which in turn defines itself as a subclass of ListScan. A client such as: class PreNum : ListScan() method scan() mypos := self.Pos suspend selftab(selfupto(numeric)) self.Pos := mypos end end may be used in an expression such as (PreNum(["Tucson", "Pima", 15.0, [ ], "3"]))scan() producing the result ["Tucson", "Pima"]. The conventional Icon string scanning analogy would be: "abc123" ? tab(upto(&digits)), which produces the result "abc". Note that ListScan methods frequently take list-element predicates as arguments where their string scanning counterparts take csets. In the above example, the predicate numeric supplied to upto is an Icon function, but predicates may also be arbitrary user-defined procedures. The part of the Idol library ListScan class required to understand the previous example is presented below. This code is representative of user-defined scanning classes allowing pattern matching over arbitrary data structures in Idol. Although user-defined scanning is more general than Icon's built-in scanning facilities, the scanning methods given below are always activated in the context of a specific environment. Icon string scanning functions can be supplied an explicit environment using additional arguments to the function. class ListScan(Subject,Pos) method tab(i) if i<0 then i := *self.Subject+1-i if i<0 | i>*self.Subject+1 then fail origPos := self.Pos self.Pos := i suspend self.Subject[origPos:i] self.Pos := origPos end method upto(predicate) origPos := self.Pos every i := self.Pos to *(self.Subject) do { if predicate(self.Subject[i]) then suspend i } self.Pos := origPos end initially /(self.Subject) := [ ] /(self.Pos) := 1 end Objects and Co-expressions Objects cannot come close to providing the power of co-expressions, but they do provide a more efficient means of achieving well-known computations such as parallel expression evaluation that have been promoted as uses for co-expressions. In particular, a co-expression is able to capture implicitly the state of a generator for later evaluation; the programmer is saved the trouble of explicitly coding what can be internally and automatically performed by Icon's expression mechanism. While objects cannot capture a generator state implicitly, the use of library objects mitigates the cost of explicitly encoding the computation to be performed, as an alternative to the use of co-expressions. The use of objects also is a significant alternative for implementations of Icon in which co-expressions are not available or memory is limited. Parallel Evaluation In [Gris87], co-expressions are used to obtain the results from several generators in parallel: decimal := create(0 to 255) hex := create(!"0123456789ABCDEF" || !"0123456789ABCDEF") octal := create((0 to 3) || (0 to 7) || (0 to 7)) character := create(image(!&cset)) while write(right(@decimal,3)," ",@hex," ",@octal," ",@character) For the Idol programmer, one alternative to using co-expressions would be to link in the following code from the Idol standard library: procedure sequence(bounds[ ]) return Sequence(bounds) end class Sequence(bounds,indices) method max(i) elem := self.bounds[i] return (type(elem)== "integer",elem) | *elem-1 end method elem(i) elem := self.bounds[i] return (type(elem)== "integer",self.indices[i]) | elem[self.indices[i]+1] end method activate() top := *(self.indices) if self.indices[1] > selfmax(1) then fail s := "" every i := 1 to top do { s ||:= selfelem(i) } repeat { self.indices[top] +:= 1 if top=1 | (self.indices[top] <= selfmax(top)) then break self.indices[top] := 0 top -:= 1 } return s end initially / (self.indices) := list(*self.bounds,0) end On the one hand, the above library code is neither terse nor general compared with co-expressions. This class does, however, allow the parallel evaluation problem described previously to be coded as: dec := sequence(255) hex := sequence("0123456789ABCDEF","0123456789ABCDEF") octal := sequence(3,7,7) character := sequence(string(&cset)) while write(right(@dec,3)," ",@hex," ",@octal," ",image(@character)) $@ is the unary Idol meta-operator that invokes the activate() operation. Since the sequence class is already written and available, its use is an attractive alternative to co-expressions in many settings. For example, a general class of label generators (another use of co-expressions cited in [Gris87]) is defined by the following library class: class labelgen : Sequence(prefix,postfix) method activate() return self.prefix||selfSequence.activate()||self.postfix end initially /(self.prefix) := "" /(self.postfix) := "" /(self.bounds) := [50000] end After creation of a label generator object (e.g. label := labelgen("L",":")), each resulting label is obtained via $@label. The sequence defined by this example is L0: L1: ... L50000: Conclusion Idol presents object programming as a collection of tools to reduce the complexity of large Icon programs. These tools are encapsulation, inheritance, and polymorphism. Since a primary goal of Idol is to promote code sharing and reuse, a variety of specific programming problems have elegant solutions available in the Idol class library. An Icon-Derived Object Language This section serves as the language reference manual for Idol. Idol is a preprocessor for Icon which implements a means of associating a piece of data with the procedures which manipulate it. The primary benefits to the programmer are thus organizational. The Icon programmer may view Idol as providing an augmented record type in which field accesses are made not directly on the records' fields, but rather through a set of procedures associated with the type. Classes Since Idol implements ideas found commonly in object-oriented programming languages, its terminology is taken from that domain. The augmented record type is called a "class". The syntax of a class is: class foo(field1,field2,field3,...) # procedures to access # class foo objects [code to initialize class foo objects] end In order to emphasize the difference between ordinary Icon procedures and the procedures which manipulate class objects, these procedures are called "methods" (the term is again borrowed from the object-oriented community). Nevertheless, the syntax of a method is that of a procedure: method bar(param1,param2,param3,...) # Icon code which may access # fields of a class foo object end Since execution of a class method is always associated with a given object of that class, the method has access to an implicit variable called self which is a record containing fields whose names are those given in the class declaration. References to the self variable look just like normal record references; they use the dot (.) operator. In addition to methods, classes may also contain regular Icon procedure, global, and record declarations; such declarations have the standard semantics and exist in the global Icon name space. Objects Like records, instances of a class type are created with a constructor function whose name is that of the class. Instances of a class are called objects, and their fields may be initialized explicitly in the constructor in exactly the same way as for records. For example, after defining a class foo(x,y) one may write: procedure main() f := foo(1,2) end The fields of an object need not be initialized by the class constructor. For many objects it is more logical to initialize their fields to some standard value. In this case, the class declaration may include an "initially" section after its methods are defined and before its end. This section begins with a line containing the word "initially" and then contains lines which are executed whenever an object of that class is constructed. These lines may reference and assign to the class fields as if they were normal record fields for the object being constructed. The "record" being constructed is named self; more on self later. For example, suppose one wished to implement an enhanced table type which permitted sequential access to elements in the order they were inserted into the table. This can be implemented by a combination of a list and a table, both of which would initialized to the appropriate empty structure: class taque(l,t) # pronouned `taco' # methods to manipulate taques, # e.g. insert, index, foreach... initially self.l := [ ] self.t := table() end And in such a case one can create objects without including arguments to the class constructor: procedure main() mytaque := taque() end In the absence of an initially section, missing arguments to a constructor default to the null value. Together with an initially section, the class declaration looks rather like a procedure that constructs objects of that class. Note that one may write classes with some fields that are initialized explicitly by the constructor and other fields are initialized automatically in the initially section. In this case one must either declare the automatically initialized fields after those that are initialized in the constructor, or insert &null in the positions of the automatically initialized fields in the constructor. Object Invocation Once one has created an object with a class constructor, one manipulates the object by invoking methods defined by its class. Since objects are both procedures and data, object invocation is similar to both a procedure call and a record access. The dollar ($) operator invokes one of an object's methods. The syntax is object $ method name ( arguments ) where the parenthesis may be omitted if the argument list is empty. $ is used similarly to the dot (.) operator used to access record fields. Using the taque example: procedure main() mytaque := taque() mytaqueinsert("greetings","hello") mytaqueinsert(123) every write(mytaqueforeach()) if \(mytaqueindex("hello")) then write(", world") end Note that direct access to an object's fields using the usual dot (.) operator is not possible outside of a method of the appropriate class. Attempts to reference mystack.l in procedure main() would result in a runtime error (invalid field name). Within a class method, the implicit variable self allows access to the object's fields in the usual manner. The taque insert method is thus: method insert(x,key) /key := x put(self.l,x) self.t[key] := x end The self variable is both a record and an object. It allows field access just like a record, as well as method invocation like any other object. Thus class methods can use self to invoke other class methods without any special syntax. Inheritance In many cases, two classes of objects are very similar. In particular, many classes can be thought of simply as enhancements of some class that has already been defined. Enhancements might take the form of added fields, added methods, or both. In other cases a class is just a special case of another class. For example, if one had defined a class fraction(numerator, denominator), one might want to define a class inverses(denominator) whose behavior was identical to that of a fraction, but whose numerator was always 1. Idol supports both of these ideas with the concept of inheritance. When the definition of a class is best expressed in terms of the definition of another class or classes, we call that class a subclass of the other classes. This corresponds to the logical relation of hyponymy. It means an object of the subclass can be manipulated just as if it were an object of one of its defining classes. In practical terms it means that similar objects can share the code that manipulates their fields. The syntax of a subclass is class foo : superclasses (fields...) # methods [optional initially section] end Multiple Inheritance There are times when a new class might best be described as a combination of two or more classes. Idol classes may have more than one superclass, separated by colons in the class declaration. This is called multiple inheritance. Subclasses define a record type consisting of all the fieldnames found in the class itself and in all its superclasses. The subclass has associated methods consisting of those in its own body, those in the first superclass which were not defined in the subclass, those in the second superclass not defined in the subclass or the first superclass, and so on. Fields are initialized either by the constructor or by the initially section of the first class of the class:superclass list in which the field is defined. For example, to define a class of inverses in terms of a class fraction(numerator,denominator) one would write: class inverse : fraction (denominator) initially self.numerator := 1 end Objects of class inverse can be manipulated using all the methods defined in class fraction; the code is actually shared by both classes at runtime. Viewing inheritance as the addition of fieldnames and methods of superclasses not already defined in the subclass is the opposite of the more traditional object-oriented view that a subclass starts with an instance of the superclass and augments or overrides portions of the definition with code in the subclass body. Idol's viewpoint adds quite a bit of leverage, such as the ability to define classes which are subclasses of each other. This feature is described further below. Invoking Superclass Operations When a subclass defines a method of the same name as a method defined in the superclass, invocations on subclass objects always result in the subclass' version of the method. This can be overridden by explicitly including the superclass name in the invocation: objectsuperclass.method(parameters) This facility allows the subclass method to do any additional work required for added fields before or after calling an appropriate superclass method to achieve inherited behavior. The result is frequently a chain of inherited method invocations. Public Fields As noted above, there is a strong correspondence between records and classes. Both define new types that extend Icon's built-in repertoire. For simple jobs, records are slightly faster as well as more convenient: the user can directly read and write a record's fields by name. Classes, on the other hand, promote the re-use of code and reduce the complexity required to understand or maintain large, involved structures. They should be used especially when manipulating composite structures ontaining mixes of structures as elements, e.g. lists containing tables, sets, and lists in various positions. Sometimes it is useful to access fields in an object directly, as with records. An example from the Idol program itself is the name field associated with methods and classes---it is a string which is intended to be read outside the object. One can always implement a method which returns (or assigns, for that matter) a field value, but this gets tedious. Idol currently supports read-only access to fields via the public keyword. If public precedes a fieldname in a class declaration, Idol automatically generates a method of the same name which dereferences and returns the field. For example, the declaration class sinner(pharisee,public publican) generates code equivalent to the following class method in addition to any explicitly defined methods: method publican() return .(self.publican) end This feature, despite its utility and the best of intentions, makes it possible to subvert object encapsulation: it should not be used with fields whose values are structures, since the structure could then be modified from the outside. When invoked with the -strict option, Idol generates code for public methods which checks for a scalar type at runtime before returning the field. Superclass Cycles and Type Equivalence In many situations, there are several ways to represent the same abstract type. Two-dimensional points might be represented by Cartesian coordinates x and y, or equivalently by radial coordinates expressed as degree d and radian r. If one were implementing classes corresponding to these types there is no reason why one of them should be considered a subclass of the other. The types are truly interchangeable and equivalent. In Idol, expressing this equivalence is simple and direct. In defining classes Cartesian and Radian we may declare them to be superclasses of each other: class Cartesian : Radian (x,y) # code which manipulates objects using cartesian coordinates end class Radian : Cartesian (d,r) # code which manipulates objects using radian coordinates end These superclass declarations make the two types equivalent names for the same type of object; after inheritance, instances of both classes will have fields x, y, d, and r, and support the same set of operations. Equivalent types each have their own constructor given by their class name; although they export the same set of operations, the actual procedures invoked by the different instances may be different. For example, if both classes define an implementation of a method print, the method invoked by a given instance depends on which constructor was used when the object was created. If a class inherits any methods from one of its equivalent classes, it is responsible for initializing the state of all the fields used by those methods in its own constructor, and maintaining the state of the inherited fields when its methods make state changes to its own fields. In the geometric example given above, in order for class Radian to use any methods inherited from class Cartesian, it must at least initialize x and y explicity in its constructor from calculations on its d and r parameters. In general, this added responsibility is minimized in those classes which treat an object's state as a value rather than a structure. The utility of equivalent types expressed by superclass cycles remains to be seen. At the least, they provide a convenient way to write several alternative constructors for the same class of objects. Perhaps more importantly, their presence in Idol causes us to question the almost religious dogmatism that the superclass graph must always be acyclic. Miscellany Unary Meta-operators Idol supports some shorthand for convenient object invocation. In particular, if a class defines methods named size, foreach, random, or activate, these methods can be invoked by a modified version of the usual Icon operator: $*x is equivalent to xsize() $?x is equivalent to xrandom() $!x is equivalent to xforeach() $@x is equivalent to xactivate() Other operators may be added to this list. If x is an identifier it may be used directly. If x is a more complex expression such as a function call, it should be parenthesized, e.g. $*(complex_expression()). Parentheses are also required in the case of invoking an object returned from an invocation, e.g. (classesindex("theClass"))name() These requirements are artifacts of the first implementation and are subject to change. Nonunary Meta-operators In addition to the unary meta-operators described above, Idol supports certain operators with more exotic capabilities. The expression x $$ y(arguments) denotes a list invocation of method y for object x and is analogous to Icon's list invocation operator (binary !). Arguments is some list which will be applied to the method as its actual parameter list. List invocation is particularly useful in handling methods which take a variable number of arguments and allows such methods to call each other. Idol list invocation is a direct application of Icon list invocation to object methods that could not be done otherwise without knowledge of Idol internals. Another binary meta-operator is the object index operator given by $[, as in the expression x $[ e ]. This expression is an equivalent shorthand for x$index(e). Note that only the left brace is preceded by a dollar sign. The expression in the braces is in actuality simply a comma separated list of arguments to the index method. Constants As a convenience to the programmer, Idol supports constant declarations for the builtin Icon types that are applicative--- strings, integers, reals, and csets. Constant declarations are similar to global variable declarations with a predefined value: const E_Tick := ".", E_Line := "_", E_Mask := '._' Constant declarations are defined from their point of declaration to the end of the source file if they are defined globally, or to the end of the class definition if they are located within a class. Constants may not be declared within a procedure. Constants are equivalent to the textual replacement of the name by the value. Include Files Idol supports an \#include directive as a convenience to the programmer. The include directive consists of a line beginning with the string "\#include" followed by a filename that is optionally enclosed in quotation marks. When the include directive is encountered, Idol reads the contents of the named file as if it were part of the current file. Include files may be nested, but not recursive. Since Idol and Icon do not have a compile-time type system, their need for sharing via file inclusion is significantly less than in conventional programming languages. Nevertheless, this is one of the more frequently requested features missing in Icon. Include files are primarily intended for the sharing of constants and global variable identifiers in separately translated modules. Implementation Restrictions The Idol preprocessor is written in Idol and does not actually parse the language it purports to implement. In particular, the preprocessor is line-oriented and the initially keyword, and the class and method end keyword need to be on a line by themselves. Similarly, both the object being invoked and its method name must be on the same line for invocations. If an object invocation includes an argument list, it must begin on the line of the invocation, since Idol inserts parentheses for invocations where they are omitted. This is comparable to Icon's semi-colon insertion; it is a convenience that may prove dangerous to the novice. Likewise, the $[ index operator, its arguments, and its corresponding close brace must all be on the same line with the invoking object. Class and method declarations are less restricted: the field/parameter list may be written over multiple lines if required, but the keyword is recognized only if it begins a line (only whitespace may precede it), and that line must include the class/method name, any superclasses, and the left parenthesis that opens the field/parameter list. The Idol preprocessor reserves certain names for internal use. In particular, __state and __methods are not legal class field names. Similarly, the name idol_object is reserved in the global name space, and may not be used as a global variable, procedure, or record name. Finally, for each class foo amongst the user's code, the names foo, foo__state, foo__methods, foo__oprec are reserved, as are the names foo_bar corresponding to each method bar in class foo. These details are artifacts of the current implementation and are subject to change. Caveats Subclass constructors can be confusing, especially when multiple inheritance brings in various fields from different superclasses. One significant problem for users of the subclass is that the parameters expected in the constructor may not be obvious if they are inherited from a superclass. On the other side of the spectrum, superclasses which automatically initialize their fields can be less than useful if the subclass might need to override the default initialization value--the subclass must then explicitly name the field in order to make its initially section have precedence over the superclass. The first of the two problems given above can be solved by naming fields explicitly in a subclass when initialization by constructor. This achieves clarity at the expense of changing the inheritance behavior, since the subclass no longer inherits the superclass automatic initialization for that field if there is one. The latter of the two problems can generally be solved by using the / operator in automatic field initializations unless the initialization should never be overridden. While it is occasionally convenient to redeclare an inherited field in a subclass, accidentally doing so and then using that field to store an unrelated value would be disastrous. Although Idol offers no proper solution to this problem, the -strict option causes the generation of warning messages for each redefined field name noting the relevant sub- and superclasses. Running Idol Idol requires Version 8 of Icon. It runs best on UNIX systems. It has been ported to most but not all the various systems on which Icon runs. In particular, if your version of Icon does not support the system() function, or your machine does not have adequate memory available, Idol will not be able to invoke icont to complete its translation and linking. Since Idol is untested on some systems, you may have to make small changes to the source code in order to port it to a new system. Since its initial inception, Idol has gone through several major revisions. This document describes Idol Version 8. Contact the author for current version information. Getting a Copy Idol is in the public domain. It is available on the Icon RBBS and by anonymous ftp from cs.arizona.edu. Idol is also distributed with the program library for Version 8 of Icon and is available by U.S. mail in this way. Interested parties may contact the author (cjeffery@cs.arizona.edu): Clinton Jeffery Department of Computer Science University of Arizona Tucson, AZ 85721 Creating an Idol Executable Idol is typically distributed in both Idol and Icon source forms. Creating an Idol executable requires a running version of Icon and a copy of idolboot.icn, the Icon source for Idol. A second Icon source file contains the operating-system dependent portion of Idol; for example, unix.icn (see the Idol README file for the name of your system file if you are not on a UNIX system; you may have to write your own, but it is not difficult). Using icont, compile idolboot.icn and unix.icn into an executable file (named idolboot, or idolboot.icx). As a final step, rename this executable to idol (or idol.icx). Translating Idol Programs The syntax for invoking idol is normally idol file1[.iol] [files...] (on some systems you may have to say "iconx idol" where it says "idol" above). The Idol translator creates a separate Icon file for each class in the Idol source files you give it. On most systems it calls icont automatically to create ucode for these files. If the first file on the command line has any normal Icon code in it (in addition to any class definitions it may contain), Idol attempts to link it to any classes it may need and create an executable. The file extension defaults to .iol. Idol also accepts extensions .icn, .u1, and .cl. The first two refer to Icon source or already translated code for which Idol generates link statements in the main (initial) Idol source file. Idol treats arguments with the extension .cl as class names and generates link statements for that class and its superclasses. Class names are case-sensitive; Deque.cl is not the same class as deque.cl. References [Gris87] Griswold, R.E. Programming in Icon; Part I---Programming with Co-Expressions. Technical Report 87-6, Department of Computer Science, University of Arizona, June 1987. [Gris90] Griswold, R.E. and Griswold, M.T. The Icon Programming Language, second edition. Prentice-Hall, Englewood Cliffs, New Jersey, 1990. [Walk86] Walker, K. Dynamic Environments---A Generalization of Icon String Scanning. Technical Report 86-7, Department of Computer Science, University of Arizona, March 1986. icon-9.4.3/ipl/packs/idol/builtins.iol0000664000175000017500000001014307140713042017152 0ustar chrishchrish# %W% %G% # # Builtin Icon objects, roughly corresponding to the language builtins. # (These are not builtin to the Idol interpreter!) # # Taxonomy of builtin types: # # __Object___ # _-' `-_ # _-' `-_ # Collection Atom_ # / | \ _' `-. # Stack Queue Vector _-' Number # \ / / | \ _-' / \ # Deque / | \ _' Integer Real # \ / | \ / # List Table String # # # # this is the Smalltalk-style ideal root of an inheritance hierarchy. # add your favorite methods here. # class Object() # return the class name as a string method class() return image(self)[8:find("_",image(self))] end # generate the field names as strings method fieldnames() i := 1 every s := name(!(self.__state)) do { if i>2 then s ? { tab(find(".")+1); suspend tab(0) } i +:= 1 } end # generate the method names as strings method methodnames() every s := name(!(self.__methods)) do { s ? { tab(find(".")+1); suspend tab(0) } } end end # Collections support Icon's *?! operators class Collection : Object (theCollection) method size() return *self.theCollection end method foreach() suspend !self.theCollection end method random() return ?self.theCollection end end # Vectors have the ability to access individual elements class Vector : Collection() method getElement(i) return self.theCollection[i] end method setElement(i,v) return self.theCollection[i] := v end end class Table : Vector(initialvalue,theCollection) initially self.theCollection := table(self.initialvalue) end # # The field theCollection is explicitly named so that subclasses of Stack # and Queue use these automatic initializations. The / operator is used # to reduce the number of throw-away list allocations for subclasses which # >don't< inherit theCollection from Stack or Queue (e.g. class List). # It also allows initialization by constructor. If one wanted to # guarantee that all Stacks start out empty but still allow class List # to be explicitly intitialized, one could remove the / here, and name # theCollection in class List, causing its initially section to override # the superclass with respect to the field theCollection. I choose here # to maximize code sharing rather than protecting my Stack class. # # When allowing initialization by constructor one might consider # checking the type of the input to guarantee it conforms to the # type expected by the class. # class Stack : Collection(theCollection) method push(value) push(self.theCollection,value) end method pop() return pop(self.theCollection) end initially /self.theCollection := [] end class Queue : Collection(theCollection) method get() return get(self.theCollection) end method put(value) put(self.theCollection,value) end initially /self.theCollection := [] end # Deques are a first example of multiple inheritance. class Deque : Queue : Stack() end # # List inherits Queue's theCollection initialization, because Queue is the # first class on List's (transitively closed) superclass list to name # theCollection explicitly # class List : Deque : Vector() method concat(l) return List(self.theCollection ||| l) end end class Atom : Object(public val) method asString() return string(self.val) end method asInteger() return integer(self.val) end method asReal() return real(self.val) end end class Number : Atom () method plus(n) return self.val + n$val() end method minus(n) return self.val - n$val() end method times(n) return self.val * n$val() end method divide(n) return self.val / n$val() end end class Integer : Number() initially if not (self.val := integer(self.val)) then stop("can't make Integer from ",image(self.val)) end class Real : Number() initially if not (self.val := real(self.val)) then stop("can't make Real from ",image(self.val)) end class String : Vector : Atom() method concat(s) return self.theCollection || s end end icon-9.4.3/ipl/packs/idol/mpw.icn0000664000175000017500000000351207140713042016114 0ustar chrishchrish# # @(#)mpw.icn 1.4 5/5/90 # OS-specific code for Macintosh MPW # Adapted from unix.icn by Charles Lakos # global icontopt,env,sysok procedure mysystem(s) if \loud then write(s) return system(s) end procedure filename(s,ext) s ||:= \ext return s end # if the filename s has extension ext then return the filename less the # extension, otherwise fail. procedure fileroot(s,ext) if s[- *ext : 0] == ext then return s[1 : - *ext] end procedure writesublink(s) writelink(env||"_"||s) end procedure envpath(filename) return env||"_"||filename end # # Installation. # Uses hierarchical filesystem on some systems (see initialize) # procedure install(args) write("Installing idol environment with prefix ",env) fout := envopen("i_object.icn","w") write(fout,"record idol_object(__state,__methods)") close(fout) fout := &null cdicont(["i_object"]) end procedure uninstall(args) # not implemented yet end procedure makeexe(args,i) exe := args[i] if icont(exe) = \sysok then { mysystem("delete "||exe||".icn") if \exec then { write("Executing:") every i := exec+1 to *args do exe ||:= " "||args[i] mysystem(exe) } } end # # system-dependent compilation of idolfile.icn # (in the idol subdirectory, if there is one) # procedure cdicont(idolfiles) args := " -c" rms := "" every ifile := !idolfiles do args ||:= " " || envpath(ifile) every ifile := !idolfiles do rms ||:= " " || envpath(ifile) || ".icn" if comp = -2 then return # -t --> don't translate at all if icont(args,"") = \sysok then mysystem("delete "||rms) return end procedure sysinitialize() icontopt := " -Sr500 -SF30 -Si1000 " env:= "C" sysok := 0 loud := &null write(&errout) write(&errout, "*** Select and run the following commands ***") write(&errout) end procedure system(s) write(&errout,s) return sysok end icon-9.4.3/ipl/packs/idol/idol.10000664000175000017500000000644507140713042015637 0ustar chrishchrish.TH IDOL 1 "10 March 1991" .UC 4 .SH NAME idol \- Icon-Derived Object Language .SH SYNOPSIS .B idol [ .B option... ] mainfile otherfiles [ .B \-x arguments ] .SH DESCRIPTION .PP .I Idol is an object-oriented preprocessor for Version 8+ Icon. It is a front-end for .I icont(1) ; typically one invokes idol on a source file (extension .iol) which is translated into an Icon source file (extension .icn) which is translated into a file suitable for interpretation by the Icon interpreter. .PP On systems with directories, Idol typically stores its generated class library code in a separate directory from the source code. If the environment variable IDOLENV is defined, Idol uses this directory for generated code. If no IDOLENV is defined, Idol creates a subdirectory named idolcode.env, and removes it after successful compilation if the creation occured for a single source file. .PP Producing an executable is skipped when the first file on the list contains only classes and no Icon entities. Idol uses an Icon translator selected by the environment variable ICONT, if it is present. .PP The .B \-c option suppresses the linking phase normally done by .I Icont. .PP The .B \-t option suppresses .B all translation by .I Icont; it is useful on systems for which Icon does not support the .br .B system\(\) function. .PP The .B \-s option suppresses removal of .B \.icn files after translation by .I Icont; normally they are deleted after a successful translation. .PP The .B \-quiet option suppresses most Idol-specific console messages. .PP The .B \-strict option causes .I Idol to generate code which is paranoid about ensuring encapsulation. .PP The .B \-ic option causes .I Idol to generate code that is .I Icon-compatible. The code will be slightly slower, but allows method invocation using a traditional Icon procedure call. Such procedure calls are of the form class_method(o,args...). Inherited methods cannot currently be so invoked, the class that defines the method must be explicitly named in the procedure call. .PP The .B \-version option causes .I Idol to print out its version and date of creation, and then exit. .PP The second and following files on the command line may include extensions .B \.icn , .B \.u1 , and .B \.cl\. The first two Idol treats as Icon source code which should be translated and linked into the resulting executable. Files with extension .B \.cl are treated as class names which are linked into the resulting executable. Class names are case sensitive; Deque.cl is a different class than deque.cl. If the operating system does not support case sensitive filenames, such class names will not coexist peacefully. .PP .SH AUTHOR .PP Clinton Jeffery, cjeffery@cs.arizona.edu .PP .SH FILES .PP .nf idol The Idol translator itself. .br prog.iol Idol source files .br prog.icn Icon code (non-classes) from prog.iol .br idolcode.env/i_object.* Icon code for the Idol object type .br idolcode.env/classname.icn Icon files generated for each class .br idolcode.env/classname.u[12] Translated class files .br idolcode.env/classname Class specification/interface .fi .SH SEE ALSO .PP .br "Programming in Idol: An Object Primer" .br (U of Arizona Dept of CS Technical Report #90-10) .br serves as a user's guide and reference manual for Idol icon-9.4.3/ipl/packs/idol/mvs.icn0000664000175000017500000000447307140713042016125 0ustar chrishchrish# # @(#)mvs.icn 1.3 5/5/90 # OS-specific code for MVS Idol # Adapted from os2.icn by Alan Beale (4/29/90) # Modified by cjeffery (9/27/90) # global icontopt,cd,md,env,sysok,sysopen procedure mysystem(s) if \loud then write(s) return system(s) end procedure filename(s,ext) s $<9:0$> := "" if \ext then return qualify(map(s, "_", "#"),ext) else return map(s, "_", "#") end procedure writesublink(s) writelink(qualify(map(s, "_", "#"),".u1")) end procedure envpath(filename) return filename end # # Installation. # Uses hierarchical filesystem on some systems (see initialize) # procedure install(args) fout := envopen("i#object.icn","w") write(fout,"record idol_object(__state,__methods)") close(fout) fout := &null cdicont($<"i#object"$>) end procedure uninstall(args) # not implemented yet end procedure makeexe(args,i) exe := args$ if icont(exe) = \sysok then { mysystem("delete "||qualify(exe, ".icn")) if \exec then { write("Executing:") exe := "iconx "||exe every i := exec+1 to *args do exe ||:= " "||args$ mysystem(exe) } } end # # system-dependent compilation of idolfile.icn # (in the idol subdirectory, if there is one) # procedure cdicont(idolfiles) if comp = -2 then return # -t --> don't call icont at all args := " -c" every ifile := !idolfiles do args ||:= " " || ifile mysystem("icont " || args) return end # # force .icn files to receive large line size, hoping to avoid # output line splitting # procedure myopen(file, mode) if not(f := open(file,mode,if mode ~== "r" then "recfm=v,reclen=4000" else &null)) then halt("Couldn't open file ", file, " for mode ", mode) return f end # # generate a file name from a root and a qualifier. This procedure # is required in MVS due to the file.icn(member) syntax! # procedure qualify(root, qual) if (i := upto('(', root)) then return root$<1:i$> || qual || root$ else return root || qual end # # remove a qualifier from a file name (but leave any member name # intact). Fail if qualifier not found. # procedure fileroot(name, qual) if not (i := find(qual, name)) then fail if name$ ~== "(" then fail name$ := "" return name end procedure sysinitialize() icontopt := " -Sr500 -SF30 -Si1000 " sysok := 0 sysopen := myopen end icon-9.4.3/ipl/packs/idol/fraction.iol0000664000175000017500000000053507140713042017132 0ustar chrishchrishclass fraction(n,d) method n() return self.n end method d() return self.d end method times(f) return fraction(self.n * f$n(), self.d * f$d()) end method asString() return self.n||"/"||self.d end method asReal() return real(self.n) / self.d end initially if self.d=0 then stop("fraction: denominator=0") end icon-9.4.3/ipl/packs/idol/seqtest.iol0000664000175000017500000000040607140713042017012 0ustar chrishchrishprocedure main() decimal := sequence(255) hex := sequence("0123456789ABCDEF","0123456789ABCDEF") octal := sequence(3,7,7) character := sequence(string(&cset)) while write(right($@decimal,3)," ",$@hex," ",$@octal," ",image($@character)) end icon-9.4.3/ipl/packs/idol/warntest.iol0000664000175000017500000000020007140713042017161 0ustar chrishchrish# This is a test of the emergency broadcasting system. # This is only a test. class a ( field ) end class b : a ( field ) end icon-9.4.3/ipl/packs/idol/os2.icn0000664000175000017500000000424507140713042016020 0ustar chrishchrish# # @(#)os2.icn 1.5 5/5/90 # OS-specific code for OS/2 Idol # Adapted from msdos.icn by cheyenne wills # global icontopt,cd,md,env,sysok procedure mysystem(s) if \loud then write(s) return system(s) end procedure filename(s,ext) s[9:0] := "" s ||:= \ext return s end # if the filename s has extension ext then return the filename less the # extension, otherwise fail. procedure fileroot(s,ext) if s[- *ext : 0] == ext then return s[1 : - *ext] end procedure writesublink(s) writelink(env||"\\\\"||s) end procedure envpath(filename) return env||"\\"||filename end # # Installation. # Uses hierarchical filesystem on some systems (see initialize) # procedure install(args) write("Installing idol environment in ",env) if env ~== "" then mysystem(md||env) fout := envopen("i_object.icn","w") write(fout,"record idol_object(__state,__methods)") close(fout) fout := &null cdicont(["i_object"]) end procedure uninstall(args) # not implemented yet end procedure makeexe(args,i) exe := args[i] if icont(exe) = \sysok then { mysystem((if find("UNIX",&features) then "rm " else "del ")||exe||".icn") if \exec then { write("Executing:") if not find("UNIX",&features) then exe := "iconx "||exe every i := exec+1 to *args do exe ||:= " "||args[i] mysystem(exe) } } end # # system-dependent compilation of idolfile.icn # (in the idol subdirectory, if there is one) # procedure cdicont(idolfiles) initial { s := (getenv("ICONT")|"icont") } if comp = -2 then return # -t --> don't call icont at all args := " -c" rms := "" every ifile := !idolfiles do args ||:= " " || ifile every ifile := !idolfiles do rms ||:= " " || ifile || ".icn" cdcmd := open("idolenv.cmd","w") write(cdcmd,"@echo off") write(cdcmd,"cd idolcode.env") write(cdcmd,s,args) write(cdcmd,"if errorlevel 1 goto xit") every ifile := !idolfiles do write(cdcmd,"del ",ifile,".icn") write(cdcmd,":xit") write(cdcmd,"cd ..") close(cdcmd) mysystem("idolenv.cmd") mysystem("del idolenv.cmd") return end procedure sysinitialize() icontopt := " -Sr500 -SF30 -Si1000 " cd := "cd " md := "mkdir " env := getenv("IDOLENV") | "idolcode.env" sysok := 0 end icon-9.4.3/ipl/packs/idol/ictest.iol0000664000175000017500000000024007140713042016611 0ustar chrishchrishclass ictester() method classmethod() write("hello, world") end end procedure main() x := ictester() x$classmethod() ictester_classmethod(x) end icon-9.4.3/ipl/packs/idol/systems.txt0000664000175000017500000000517207303574645017111 0ustar chrishchrishThis file contains system-dependent notes on Idol. Compiling idolboot for your system requires a command of the form icont -Sr1000 -SF30 -Si1000 idolboot system where system is the name of your system (so far amiga, mpw, msdos, mvs, os2, unix, or vms). UNIX If you are running UNIX, count yourself lucky! The Idol distribution comes with a Makefile which ought to take care of things for you. MSDOS Due to memory limitations, Idol for MS-DOS Icon does not use the system() function. Instead, it generates a batch file, idolt.bat, containing the sequence of commands required to finish the translation and linking of the output into executable icode. The batch file idol.bat runs idol and then calls idolt for you; it should suffice in ordinary situations. It is invoked as described in the man page and reference manual, e.g. C> idol idol msdos The file install.bat performs the initial bootstrap translation of idol. Note that the translation scripts cannot automatically remove .icn files, so you may have to remove them manually if your disk space is precious. VMS Idol compiles and runs under VMS Icon version 7.0, but its a little klunky; idol may fail to execute icont, or icont may fail to execute ilink (under version 7.0). Unfortunately I do not have access to a VMS machine running a current version of Icon. Note that there are two DCL scripts in the distribution: vms.com is used by Idol internally, while vmsidol.com is a convenience script if icont fails on your system when invoked from inside Idol. You are encouraged to rename vmsidol.com to idol.com; it is not named idol.com to avoid a nasty situation for MS-DOS users where .com files are assumed to be binary executables! Remember when specifying options to either idol or icont one must put quotes around the argument in order for VMS to leave it alone! OS/2 Cheyenne Wills has provided us all with an OS/2 system file! Although problems should be reported to me, the credit is all his. MPW Charles Lakos has provided a system file for Icon running under the Macintosh Programmer's Workshop. Icon source for class X is generated as C_X.icn. After the Idol translation phase, the commands for the Icon translation have been written to the MPW Worksheet. They can simply be selected and run. Thanks Charles! AMIGA Idol runs fairly comfortably on Version 8 of Amiga Icon (it won't work with Version 7.5 of Amiga Icon). MVS Alan Beale has ported Idol to IBM mainframes running MVS. This was a bigger job than most ports! Thanks Alan. OTHERS Porting idol consists of writing a new system.icn file for your system. Take a look at unix.icn, vms.icn, os2.icn, mpw.icn, and msdos.icn. icon-9.4.3/ipl/packs/idol/vms.com0000664000175000017500000000014707140713042016124 0ustar chrishchrish$ ! A script used internally by Idol on VMS $ set default [.idolenv] $ icont -c 'P1' $ set default [-] icon-9.4.3/ipl/packs/idol/vms.icn0000664000175000017500000000341407140713042016117 0ustar chrishchrish# # @(#)vms.icn 1.6 5/5/90 # OS-specific code for VMS Idol # global icontopt,cd,md,env,sysok procedure mysystem(s) if \loud then write(s) return system(s) end procedure filename(s,ext) s[9:0] := "" s ||:= \ext return s end # if the filename s has extension ext then return the filename less the # extension, otherwise fail. procedure fileroot(s,ext) if s[- *ext : 0] == ext then return s[1 : - *ext] end procedure writesublink(s) writelink(env||s) end procedure envpath(filename) return env||filename end # # Installation. # Uses hierarchical filesystem on some systems (see initialize) # procedure install(args) write("Installing idol environment in ",env) if env ~== "" then mysystem(md||env) fout := envopen("i_object.icn","w") write(fout,"record idol_object(__state,__methods)") close(fout) fout := &null cdicont(["i_object"]) end procedure uninstall(args) # not implemented yet end procedure makeexe(args,i) exe := args[i] if icont(exe) = \sysok then { mysystem("del "||exe||".icn") if \exec then { write("Executing:") exe := "iconx "||exe every i := exec+1 to *args do exe ||:= " "||args[i] mysystem(exe) } } end # # system-dependent compilation of idolfile.icn # (in the idol subdirectory, if there is one) # procedure cdicont(idolfiles) if comp = -2 then return # -t --> don't icont at all args := " -c" rms := "" every ifile := !idolfiles do args ||:= " " || ifile every ifile := !idolfiles do rms ||:= " " || ifile || ".icn" every ifile := !idolfiles do mysystem("@vms "||ifile||".icn") return end procedure sysinitialize() icontopt := " \"-Sr500\" \"-Si1000\" \"-SF30\" \"-Sg500\" " cd := "set default " md := "create/dir " env := getenv("IDOLENV") | "[.idolenv]" sysok := 1 end icon-9.4.3/ipl/packs/idol/bi_test.iol0000664000175000017500000000124507140713042016755 0ustar chrishchrish# # Tests for the various builtins # procedure main() x := Table(1) write("\nTesting class ",x$class()) write("Fields:") every write("\t", x$fieldnames ) write("Methods:") every write("\t", x$methodnames ) write() x$setElement("world","hello") write(x$getElement("world")) write(x$getElement("hello")) x := Deque() write("\nTesting class ",x$class()) x$push("hello") x$push("world") write("My deque is size ",$*x) every write("give me a ",$!x) write("A random element is ",$?x) write("getting ",x$get()," popping ",x$pop()) x := List(["Tucson", "Pima", 85721]) write("\nTesting class ",x$class()) every write("give me a ",$!x) end icon-9.4.3/ipl/packs/idol/itags.iol0000664000175000017500000001675607140713042016450 0ustar chrishchrish# itags - an Icon/Idol tag generator by Nick Kline # hacks (such as this header comment) by Clint Jeffery # last edit: 12/13/89 # # the output is a sorted list of lines of the form # identifier owning_scope category_type filename lineno(:length) # # owning scope is the name of the class or procedure or record in which # the tag is defined. # category type is the kind of tag; one of: # (global,procedure,record,class,method,param,obj_field,rec_field) # global ibrowseflag procedure main(args) local line, lineno, fout, i, fin, notvar, objects, actual_file, outlines initial { fout := open("ITAGS", "w") | stop("can't open ITAGS for writing"); outlines := [[0,0,0,0,0,0]] i := 1 notid := &cset -- &ucase -- &digits -- &lcase -- '_' } if(*args=0) then stop("usage: itags file1 [file2 ...]") while i <= *args do { if args[i] == "-i" then { ibrowseflag := 1 i +:= 1 continue } fin := open(args[i],"r") | stop("could not open file ",args[i]," exiting") lineno := 1 objects := program( args[i] ) while line := read(fin) do { line[upto('#',line):0] := "" line ? { tab(many(' ')) if =("global") then { if(any(notid)) then every objects$addvar( getword(), lineno ) } if =("procedure") then if(any(notid)) then { objects$addproc( getword(), lineno ) objects$myline(tab(0),lineno) } if =("class") then if any(notid) then { objects$addclass( getword(), lineno ) objects$myline(tab(0),lineno) } if =("method") then { if any(notid) then { objects$addmethod( getword(), lineno ) objects$myline(tab(0),lineno) } } if =("local") then { if any(notid) then every objects$addvar( getword(), lineno ) } if =("static") then { if any(notid) then every objects$addstat( getword(), lineno ) } if =("record") then { if any(notid) then { objects$addrec( getword(), lineno ) objects$myline(tab(0),lineno) objects$endline( lineno) } } if =("end") then objects$endline(lineno) } lineno +:= 1 } objects$drawthyself(outlines) i +:= 1 } # now process all the resulting lines every i := 2 to *outlines do { outlines[i] := ( left(outlines[i][1],outlines[1][1]+1) || left(outlines[i][2],outlines[1][2]+1) || left(outlines[i][3],outlines[1][3]+1) || left(outlines[i][4],outlines[1][4]+1) || left(outlines[i][5],outlines[1][5]) || (if \outlines[i][6] then ":"||outlines[i][6] else "")) } outlines := outlines[2:0] outlines := sort(outlines) every write(fout,!outlines) end class functions(name, lineno,vars,lastline, parent, params,stat,paramtype) method drawthyself(outfile) local k every k := !self.vars do emit(outfile, k[1], self.name, "local", self.parent$myfile(),k[2]) every k := !self.params do emit(outfile, k[1], self.name, self.paramtype, self.parent$myfile(),k[2]) every k := !self.stat do emit(outfile, k[1], self.name, "static", self.parent$myfile(),k[2]) end method myline(line,lineno) local word static ids, letters initial { ids := &lcase ++ &ucase ++ &digits ++ '_' letters := &ucase ++ &lcase } line ? while tab(upto(letters)) do { word := tab(many(ids)) self.params|||:= [[word,lineno]] } end method addstat(varname, lineno) self.stat|||:=[[varname, lineno]] return end method addvar(varname, lineno) self.vars|||:=[[varname, lineno]] return end method endline( lineno ) self.lastline := lineno end method resetcontext() self.parent$resetcontext() end initially self.vars := [] self.params := [] self.stat := [] self.paramtype := "param" end # end of class functions class proc : functions(name,lineno, parent,paramtype) method drawthyself(outfile) emit(outfile,self.name, "*" , "procedure", self.parent$myfile(),self.lineno, self.lastline-self.lineno+1) self$functions.drawthyself(outfile) end initially self.paramtype := "param" end # of class proc class rec : functions(name, lineno, parent, line, paramtype) method drawthyself(outfile) emit(outfile,self.name, "*", "record", self.parent$myfile(), self.lineno) self$functions.drawthyself(outfile) end initially self.paramtype := "rec_field" end # class record class program(public myfile, vars, proc, records, classes, curcontext, contextsave,globals) method endline( lineno ) self.curcontext$endline( lineno ) self.curcontext := pop(self.contextsave) end method myline( line,lineno) self.curcontext$myline( line,lineno) end method drawthyself(outfile) every k := !self.globals do emit(outfile,k[1], "*", "global", self.myfile,k[2]) every (!self.proc)$drawthyself(outfile) every (!self.records)$drawthyself(outfile) every (!self.classes)$drawthyself(outfile) end method addmethod(name, lineno) push(self.contextsave,self.curcontext) self.curcontext := self.curcontext$addmethod(name,lineno) return end method addstat(varname, lineno) self.curcontext$addstat(varname, lineno) end method addvar(varname, lineno) if self.curcontext === self then self.globals|||:= [[varname,lineno]] else self.curcontext$addvar(varname,lineno) return end method addproc(procname, lineno) push(self.contextsave, self.curcontext) self.curcontext := proc(procname, lineno, self) self.proc|||:= [self.curcontext] return end method addrec(recname, lineno) push(self.contextsave, self.curcontext) self.curcontext := rec(recname, lineno,self) self.records|||:=[self.curcontext] return end method addclass(classname, lineno) push(self.contextsave, self.curcontext) self.curcontext := class_(classname, lineno, self) self.classes|||:=[self.curcontext] return end method resetcontext() self.curcontext := pop(self.contextsave) end initially self.globals := [] self.proc := [] self.records := [] self.classes := [] self.curcontext := self self.contextsave := [] end # end of class program class class_ : functions (public name, lineno, parent, meth,paramtype) method myfile() return self.parent$myfile() end method addmethod(methname, lineno) self.meth|||:= [methods(methname, lineno, self)] return (self.meth[-1]) end method drawthyself(outfile) emit(outfile,self.name, "*" , "class", self.parent$myfile(),self.lineno, self.lastline-self.lineno+1) every (!self.meth)$drawthyself(outfile) self$functions.drawthyself(outfile) end initially self.meth := [] self.paramtype := "obj_field" end #end of class_ class methods: functions(name, lineno, parent,paramtype) method drawthyself(outfile) emit(outfile,self.name, self.parent$name() , "method", self.parent$myfile(),self.lineno, self.lastline-self.lineno+1) self$functions.drawthyself(outfile) end initially self.paramtype := "param" end #end of members class procedure emit(outlist,ident, scope, type, filename, line, length) outlist[1][1] := outlist[1][1] < *ident outlist[1][2] := outlist[1][2] < *scope outlist[1][3] := outlist[1][3] < *type outlist[1][4] := outlist[1][4] < *filename outlist[1][5] := outlist[1][5] < *line outlist[1][6] := outlist[1][6] < *\length if /ibrowseflag then put( outlist, [ident,scope,type,filename,line,length] ) else put( outlist, [ident,scope,type,filename,line,length] ) end procedure getword() local word static ids,letts initial { ids := &ucase ++ &lcase ++ &digits ++ '_' letts := &ucase ++ &lcase } while tab(upto(letts)) do { word := tab(many(ids)) suspend word } end icon-9.4.3/ipl/packs/idol/buffer.iol0000664000175000017500000000613407140713042016577 0ustar chrishchrishclass buffer(public filename,text,index) # read a buffer in from a file method read() f := open(self.filename,"r") | fail self$erase() every put(self.text,!f) close(f) return end # write a buffer out to a file method write() f := open(self.filename,"w") | fail every write(f,!self.text) close(f) end # insert a line at the current index method insert(s) if self.index = 1 then { push(self.text,s) } else if self.index > *self.text then { put(self.text,s) } else { self.text := self.text[1:self.index]|||[s]|||self.text[self.index:0] } self.index +:= 1 return end # delete a line at the current index method delete() if self.index > *self.text then fail rv := self.text[self.index] if self.index=1 then pull(self.text) else if self.index = *self.text then pop(self.text) else self.text := self.text[1:self.index]|||self.text[self.index+1:0] return rv end # move the current index to an arbitrary line method goto(l) if (1 <= l) & (l <= *self.text+1) then return self.index := l end # return the current line and advance the current index method forward() if self.index > *self.text then fail rv := self.text[self.index] self.index +:= 1 return rv end # place the buffer's text into a contiguously allocated list method linearize() tmp := list(*self.text) every i := 1 to *tmp do tmp[i] := self.text[i] self.text := tmp end method erase() self.text := [ ] self.index := 1 end method size() return *(self.text) end initially if \ (self.filename) then { if not self$read() then self$erase() } else { self.filename := "*scratch*" self.erase() } end class buftable : buffer() method read() self$buffer.read() tmp := table() every line := !self.text do line ? { tmp[tab(many(&ucase++&lcase))] := line | fail } self.text := tmp return end method lookup(s) return self.text[s] end end class bibliography : buftable() end class spellChecker : buftable(parentSpellChecker) method spell(s) return \ (self.text[s]) | (\ (self.parentSpellChecker))$spell(s) end end class dictentry(word,pos,etymology,definition) method decode(s) # decode a dictionary entry into its components s ? { self.word := tab(upto(';')) move(1) self.pos := tab(upto(';')) move(1) self.etymology := tab(upto(';')) move(1) self.definition := tab(0) } end method encode() # encode a dictionary entry into a string return self.word||";"||self.pos||";"||self.etymology||";"||self.definition end initially if /self.pos then { # constructor was called with a single string argument self$decode(self.word) } end class dictionary : buftable() method read() self$buffer.read() tmp := table() every line := !self.text do line ? { tmp[tab(many(&ucase++&lcase))] := dictentry(line) | fail } self.text := tmp end method write() f := open(b.filename,"w") | fail every write(f,(!self.text)$encode()) close(f) end end icon-9.4.3/ipl/packs/idol/globtest.iol0000664000175000017500000000015707140713042017150 0ustar chrishchrishglobal here, # here are, # are some, # some globals # globals procedure main() write("hi there") end icon-9.4.3/ipl/packs/idol/idolmain.icn0000664000175000017500000001340707140713042017111 0ustar chrishchrish# # Idol: Icon-derived object language, version 8.0 # # SYNOPSIS: # # idol -install # idol prog[.iol] ... [-x args ] # prog # # FILES: # # ./prog.iol : source file # ./prog.icn : Icon code for non-classes in prog.iol # ./idolcode.env/i_object.* : Icon code for the universal object type # ./idolcode.env/classname.icn : Icon files are generated for each class # ./idolcode.env/classname.u[12] : translated class files # ./idolcode.env/classname : class specification/interface # # SEE ALSO: # # "Programming in Idol: An Object Primer" # (U of Arizona Dept of CS Technical Report #90-10) # serves as user's guide and reference manual for Idol # ### Global variables # # FILES : fin = input (.iol) file, fout = output (.icn) file # CSETS : alpha = identifier characters, nonalpha = everything else # alphadot = identifiers + '.' # white = whitespace, nonwhite = everything else # TAQUES : classes in this module # FLAGS : comp if we should try to make an executable from args[1] # strict if we should generate paranoic encapsulation protection # loud if Idol should generate extra console messages # exec if we should run the result after translation # LISTS : links = names of external icon code to link to # imports = names of external classes to import # compiles = names of classes which need to be compiled # global fin,fout,fName,fLine,alpha,alphadot,white,nonwhite,nonalpha global classes,comp,exec,strict,links,imports,loud,compiles,compatible,ct global icontopt,tempenv # # initialize global variables # procedure initialize() loud := 1 comp := 0 alpha := &ucase ++ &lcase ++ '_' ++ &digits nonalpha := &cset -- alpha alphadot := alpha ++ '.' white := ' \t\f' nonwhite := &cset -- white classes := taque() links := [] imports := [] compiles := [] sysinitialize() end procedure main(args) initialize() if *args = 0 then write("usage: idol files...") else { if (!args ~== "-version") & not tryenvopen(filename("i_object",".u1")) then { tempenv := 0 install(args) } every i := 1 to *args do { if \exec then next # after -x, args are for execution if args[i][1] == "-" then { case map(args[i]) of { "-c" : { sysok := &null if comp = 0 then comp := -1 # don't make exe } "-ic" : compatible := 1 "-quiet" : loud := &null "-strict" : strict := 1 "-s" : sysok := &null "-t" : comp := -2 # don't translate "-version": return write("Idol version 8.0 of 10/6/90") & 0 "-x" : exec := i default : icontopt ||:= args[i] || " " } } else { \tempenv +:= 1 if args[i] := fileroot(args[i],".cl") then { push(imports,args[i]) } else if args[i] := fileroot(args[i],".icn") then { push(links,args[i]) icont(" -c "||args[i]) } else if args[i] := fileroot(args[i],".u1") then { push(links,args[i]) } else if (args[i] := fileroot(args[i],".iol")) | tryopen(filename(args[i],".iol"),"r") then { /exe := i args[i] := fileroot(args[i],".iol") /fout := sysopen(filename(args[i],".icn"),"w") readinput(filename(args[i],".iol"),1) } else { # # look for an appropriate .icn, .u1 or class file # if tryopen(filename(args[i],".icn"),"r") then { push(links,args[i]) icont(" -c "||args[i]) } else if tryopen(filename(args[i],".u1")) then { push(links,args[i]) } else if tryenvopen(args[i]) then { push(imports,args[i]) } } } } if gencode() then { close(\fout) if comp = 1 & (not makeexe(args,exe)) then stop("Idol exits after errors creating executable") } else { close(\fout) stop("Idol exits after errors translating") } } # # if we built an executable without separate compilation AND # there's no IDOLENV class environment AND # we had to install an environment then remove the environment # if (comp = 1) & (\tempenv < 2) & not mygetenv("IDOLENV") then uninstall() end # # tell whether the character following s is within a quote or not # procedure notquote(s) outs := "" # # eliminate escaped quotes. # this is a bug for people who write code like \"hello"... s ? { while outs ||:= tab(find("\\")+1) do move(1) outs ||:= tab(0) } # see if every quote has a matching endquote outs ? { while s := tab(find("\""|"'")+1) do { if not tab(find(s[-1])+1) then fail } } return end # # A contemplated addition: shorthand $.foo for self.foo ? # #procedure selfdot(line) # i := 1 # while ((i := find("$.",line,i)) & notquote(line[1:i])) do line[i]:="self" #end # # error/warning/message handling # procedure halt(args[]) errsrc() every writes(&errout,!args) stop() end procedure warn(args[]) errsrc() every writes(&errout,!args) write(&errout) end procedure errsrc() writes(&errout,"\"",\fName,"\", line ",\fLine,": Idol/") end # # System-independent, but system related routines # procedure tryopen(file,mode) if f := open(file,mode) then return close(f) end procedure tryenvopen(file,mode) return tryopen(envpath(file),mode) end procedure sysopen(file,mode) if not (f := open(file,mode)) then halt("Couldn't open file ",file," for mode ",mode) return f end procedure envopen(file,mode) return sysopen(envpath(file),mode) end procedure writelink(s) write(fout,"link \"",s,"\"") end procedure icont(argstr,prefix) static s initial { s := (mygetenv("ICONT")|"icont") } return mysystem((\prefix|"") ||s||icontopt||argstr) end procedure mygetenv(s) return if &features == "environment variables" then getenv(s) end icon-9.4.3/ipl/packs/idol/events.iol0000664000175000017500000000006307140713042016625 0ustar chrishchrishconst E_Tick := ".", E_Line := "_", E_Mask := '._' icon-9.4.3/ipl/packs/idol/lbltest.iol0000664000175000017500000000013007140713042016765 0ustar chrishchrishprocedure main() label := labelgen("L",":") every i := 1 to 10 do write($@label) end icon-9.4.3/ipl/packs/idol/strinvok.iol0000664000175000017500000000066207140713042017205 0ustar chrishchrish# # a builtin class, subclasses of which support string invocation for methods # (sort of) # this is dependent upon Idol internals which are subject to change... # class strinvokable() method eval(s,args[]) i := 1 every methodname := name(!(self.__methods)) do { methodname[1 : find(".",methodname)+1 ] := "" if s == methodname then { suspend self.__methods[i] ! ([self]|||args) fail } i +:= 1 } end end icon-9.4.3/ipl/packs/idol/buftest.iol0000664000175000017500000000052407140713042016777 0ustar chrishchrish# buffer classes' tests procedure main(args) if *args=0 then stop("usage: buftest cp file1 file2") every i := 1 to *args do { case args[i] of { "cp": { cp(args) } } } end procedure cp(args) b1 := buffer(args[2]) b2 := buffer(args[3]) b2$erase() while s:=b1$forward() do b2$insert(s) b2$write() end icon-9.4.3/ipl/packs/euler/0002775000175000017500000000000010336137160015006 5ustar chrishchrishicon-9.4.3/ipl/packs/euler/Makefile0000664000175000017500000000036007142651136016450 0ustar chrishchrisheuler: icont -s -c xcode escape ebcdic icont -s -c parsell1 readll1 semstk eulerscn icont -s -fs euler eulersem eulerint \ parsell1.u1 readll1.u1 semstk.u1 eulerscn.u1 Iexe: euler cp euler ../../iexe/ Clean: rm -f euler *.u[12] icon-9.4.3/ipl/packs/euler/escape.icn0000664000175000017500000000377607307530333016757 0ustar chrishchrish############################################################################ # # File: escape.icn # # Subject: Procedures to interpret Icon literal escapes # # Authors: William H. Mitchell; modified by Ralph E. Griswold and # Alan Beale # # Date: April 16, 1993 # ############################################################################ # # The procedure escape(s) produces a string in which Icon quoted # literal escape conventions in s are replaced by the corresponding # characters. For example, escape("\\143\\141\\164") produces the # string "cat". # ############################################################################ # # Links: ebcdic # ############################################################################ link ebcdic procedure escape(s) local ns, c ns := "" s ? { while ns ||:= tab(upto('\\')) do { move(1) ns ||:= case map(c := move(1)) | fail of { # trailing \ illegal "b": "\b" "d": "\d" "e": "\e" "f": "\f" "l": "\n" "n": "\n" "r": "\r" "t": "\t" "v": "\v" "x": hexcode() "^": ctrlcode() !"01234567": octcode() default: c # takes care of ", ', and \ } } return ns || tab(0) } end procedure hexcode() local i, s s := tab(many('0123456789ABCDEFabcdef')) | "" # get hex digits if (i := *s) > 2 then { # if too many digits, back off s := s[1:3] move(*s - i) } return char("16r" || s) end procedure octcode() local i, s move(-1) # put back first octal digit s := tab(many('01234567')) | "" # get octal digits i := *s if (i := *s) > 3 then { # back off if too large s := s[1:4] move(*s - i) } if s > 377 then { # still could be too large s := s[1:3] move(-1) } return char("8r" || s) end procedure ctrlcode(s) return Control(move(1)) end icon-9.4.3/ipl/packs/euler/xcode.icn0000664000175000017500000002661507307530333016616 0ustar chrishchrish############################################################################ # # File: xcode.icn # # Subject: Procedures to save and restore Icon data # # Author: Bob Alexander # # Date: January 1, 1996 # ############################################################################ # # Contributor: Ralph E. Griswold # ############################################################################ # # Description # ----------- # # These procedures provide a way of storing Icon values in files # and retrieving them. The procedure xencode(x,f) stores x in file f # such that it can be converted back to x by xdecode(f). These # procedures handle several kinds of values, including structures of # arbitrary complexity and even loops. The following sequence will # output x and recreate it as y: # # f := open("xstore","w") # xencode(x,f) # close(f) # f := open("xstore") # y := xdecode(f) # close(f) # # For "scalar" types -- null, integer, real, cset, and string, the # above sequence will result in the relationship # # x === y # # For structured types -- list, set, table, and record types -- # y is, for course, not identical to x, but it has the same "shape" and # its elements bear the same relation to the original as if they were # encoded and decoded individually. # # Files, co-expressions, and windows cannot generally be restored in any # way that makes much sense. These objects are restored as empty lists so # that (1) they will be unique objects and (2) will likely generate # run-time errors if they are (probably erroneously) used in # computation. However, the special files &input, &output, and &errout are # restored. # # Not much can be done with functions and procedures, except to preserve # type and identification. # # The encoding of strings and csets handles all characters in a way # that it is safe to write the encoding to a file and read it back. # # xdecode() fails if given a file that is not in xcode format or it # the encoded file contains a record for which there is no declaration # in the program in which the decoding is done. Of course, if a record # is declared differently in the encoding and decoding programs, the # decoding may be bogus. # # xencoden() and xdecoden() perform the same operations, except # xencoden() and xdecoden() take the name of a file, not a file. # ############################################################################ # # Complete calling sequences # -------------------------- # # xencode(x, f, p) # returns f # # where # # x is the object to encode # # f is the file to write (default &output) # # p is a procedure that writes a line on f using the # same interface as write() (the first parameter is # always a the value passed as "file") (default: write) # # # xencode(f, p) # returns the restored object # # where # # f is the file to read (default &input) # # p is a procedure that reads a line from f using the # same interface as read() (the parameter is # always a the value passed as "file") (default: read) # # # The "p" parameter is not normally used for storage in text files, but # it provides the flexibility to store the data in other ways, such as # a string in memory. If "p" is provided, then "f" can be any # arbitrary data object -- it need not be a file. # # For example, to "write" x to an Icon string: # # record StringFile(s) # # procedure main() # ... # encodeString := xencode(x,StringFile(""),WriteString).s # ... # end # # procedure WriteString(f,s[]) # every f.s ||:= !s # f.s ||:= "\n" # return # end # ############################################################################ # # Notes on the encoding # --------------------- # # Values are encoded as a sequence of one or more lines written to # a plain text file. The first or only line of a value begins with a # single character that unambiguously indicates its type. The # remainder of the line, for some types, contains additional value # information. Then, for some types, additional lines follow # consisting of additional object encodings that further specify the # object. The null value is a special case consisting of an empty # line. # # Each object other than &null is assigned an integer tag as it is # encoded. The tag is not, however, written to the output file. On # input, tags are assigned in the same order as objects are decoded, so # each restored object is associated with the same integer tag as it # was when being written. In encoding, any recurrence of an object is # represented by the original object's tag. Tag references are # represented as integers, and are easily recognized since no object's # representation begins with a digit. # # Where a structure contains elements, the encodings of the # elements follow the structure's specification on following lines. # Note that the form of the encoding contains the information needed to # separate consecutive elements. # # Here are some examples of values and their encodings: # # x encode(x) # ------------------------------------------------------- # # 1 N1 # 2.0 N2.0 # &null # "\377" "\377" # '\376\377' '\376\377' # procedure main p # "main" # co-expression #1 (0) C # [] L # N0 # set() "S" # N0 # table("a") T # N0 # "a" # ["hi","there"] L # N2 # "hi" # "there" # # A loop is illustrated by # # L2 := [] # put(L2,L2) # # for which # # x encode(x) # ------------------------------------------------------- # # L2 L # N1 # 2 # # The "2" on the third line is a tag referring to the list L2. The tag # ordering specifies that an object is tagged *after* its describing # objects, thus the list L2 has the tag 2 (the integer 1 has tag 1). # # Of course, you don't have to know all this to use xencode and # xdecode. # ############################################################################ # # Links: escape # ############################################################################ # # See also: object.icn, codeobj.icn # ############################################################################ invocable all link escape record xcode_rec(file,ioProc,done,nextTag) procedure xencode(x,file,writeProc) #: write structure to file /file := &output return xencode_1( xcode_rec( file, (\writeProc | write) \ 1, table(), 0), x) end procedure xencode_1(data,x) local tp,wr,f,im wr := data.ioProc f := data.file # # Special case for &null. # if /x then { wr(f) return f } # # If this object has already been output, just write its tag. # if tp := \data.done[\x] then { wr(f,tp) return f } # # Check to see if it's a "distinguished" that is represented by # a keyword (special files and csets). If so, just use the keyword # in the output. # im := image(x) if match("integer(", im) then im := string(x) else if match("&",im) then { wr(f,im) data.done[x] := data.nextTag +:= 1 return f } # # Determine the type and handle accordingly. # tp := case type(x) of { "cset" | "string": "" "file" | "window": "f" "integer" | "real": "N" "co-expression": "C" "procedure": "p" "external": "E" "list": "L" "set": "S" "table": "T" default: "R" } case tp of { # # String, cset, or numeric outputs its string followed by its # image. # "" | "N": wr(f,tp,im) # # Procedure writes "p" followed (on subsequent line) by its name # as a string object. # "p": { wr(f,tp) im ? { while tab(find(" ") + 1) xencode_1(data,tab(0)) } } # # Co-expression, file, or external just outputs its letter. # !"CEf": wr(f,tp) # # Structured type outputs its letter followed (on subsequent # lines) by additional data. A record writes its type as a # string object; other type writes its size as an integer object. # Structure elements follow on subsequent lines (alternating keys # and values for tables). # default: { wr(f,tp) case tp of { !"LST": { im ? { tab(find("(") + 1) xencode_1(data,integer(tab(-1))) } if tp == "T" then xencode_1(data,x[[]]) } default: xencode_1(data,type(x)) } # # Create the tag. It's important that the tag is assigned # *after* other other objects that describe this object (e.g. # the length of a list) are output (and tagged), but *before* # the structure elements; otherwise decoding would be # difficult. # data.done[x] := data.nextTag +:= 1 # # Output the elements of the structure. # every xencode_1(data, !case tp of {"S": sort(x); "T": sort(x,3); default: x}) } } # # Tag the object if it's not already tagged. # /data.done[x] := data.nextTag +:= 1 return f end procedure xdecode(file,readProc) #: read structure from file /file := &input return xdecode_1( xcode_rec( file, (\readProc | read) \ 1, [])) end # This procedure fails if it encounters bad data procedure xdecode_1(data) local x,tp,sz, i data.ioProc(data.file) ? { if any(&digits) then { # # It's a tag -- return its value from the object table. # return data.done[tab(0)] } if tp := move(1) then { x := case tp of { "N": numeric(tab(0)) "\"": escape(tab(-1)) "'": cset(escape(tab(-1))) "p": proc(xdecode_1(data)) | fail "L": list(xdecode_1(data)) | fail "S": {sz := xdecode_1(data) | fail; set()} "T": {sz := xdecode_1(data) | fail; table(xdecode_1(data)) | fail} "R": proc(xdecode_1(data))() | fail "&": case tab(0) of { # # Special csets. # "cset": &cset "ascii": &ascii "digits": &digits "letters": &letters "lcase": &lcase "ucase": &ucase # # Special files. # "input": &input "output": &output "errout": &errout default: [] # so it won't crash if new keywords arise } "f" | "C": [] # unique object for things that can't # be restored. default: fail } put(data.done,x) case tp of { !"LR": every i := 1 to *x do x[i] := xdecode_1(data) | fail "T": every 1 to sz do insert(x,xdecode_1(data),xdecode_1(data)) | fail "S": every 1 to sz do insert(x,xdecode_1(data)) | fail } return x } else return } end procedure xencoden(x, name, opt) local output /opt := "w" output := open(name, opt) | stop("*** xencoden(): cannot open ", name) xencode(x, output) close(output) return end procedure xdecoden(name) local input, x input := open(name) | stop("*** xdecoden(): cannot open ", name) if x := xdecode(input) then { close(input) return x } else { close(input) fail } end icon-9.4.3/ipl/packs/euler/semstk.icn0000664000175000017500000000141407307530333017010 0ustar chrishchrish# Semantics stack manipulation routines to be called by # parseLL1(...), the parser for the TLCLL1 LL(1) parser # generator. # (written by Dr. Thomas W. Christopher) # global semanticsStack record ErrorToken(type,body,line,column) procedure initSemanticsStack() semanticsStack:=[] return end procedure outToken(tok) push(semanticsStack,tok) return end procedure outAction(a) a() return end procedure outError(t,l,c) push(semanticsStack,ErrorToken(t,t,\l|0,\c|0)) return end procedure isError(v) return type(v)=="ErrorToken" end procedure popSem(n) local V V:=[] every 1 to n do push(V,pop(semanticsStack)) return V end procedure pushSem(s) push(semanticsStack,s) return end procedure anyError(V) local v if v:=!V & type(v)=="ErrorToken" then { return v } fail end icon-9.4.3/ipl/packs/euler/eulerint.icn0000664000175000017500000001661107307530333017336 0ustar chrishchrish# Euler Interpreter global S,k,i,mp,fct record Reference(lst,pos) record Progref(mix,adr) record procDescr(bln,mix,adr) procedure reference(on,bn) local j j := mp while j>0 do { if S[j][1] = bn then return Reference(S[j][4],on) j := S[j][3] #static link } RTError("dangling reference") fail end procedure progref(pa,bn) local j j := mp while j>0 do { if S[j][1] = bn then return Progref(j,pa) j := S[j][3] #static link } RTError("dangling reference") fail end procedure deref(x) if type(x) ~== "Reference" then return x return x.lst[x.pos] end procedure assignThroughRef(x,v) local j if type(x) ~== "Reference" then { RTError("reference needed on left of '<-'") fail } return x.lst[x.pos] := v end procedure interpreter() local l,r,t S := list(500) i := 1 S[1] := [0,0,0,[]] #outer, empty activation record mp := 1 k := 1 repeat { if k>*P then return case P[k][1] of { "+": { if not (l:=numeric(S[i-1])) then return RTError("numeric required") if not (r:=numeric(S[i])) then return RTError("numeric required") i -:= 1 S[i] := l + r } "-": { if not (l:=numeric(S[i-1])) then return RTError("numeric required") if not (r:=numeric(S[i])) then return RTError("numeric required") i -:= 1 S[i] := l - r } "*": { if not (l:=numeric(S[i-1])) then return RTError("numeric required") if not (r:=numeric(S[i])) then return RTError("numeric required") i -:= 1 S[i] := l * r } "/": { if not (l:=real(S[i-1])) then return RTError("numeric required") if not (r:=real(S[i])) then return RTError("numeric required") i -:= 1 S[i] := l / r } "div": { if not (l:=integer(S[i-1])) then return RTError("numeric required") if not (r:=integer(S[i])) then return RTError("numeric required") i -:= 1 S[i] := l / r } "mod": { if not (l:=integer(S[i-1])) then return RTError("numeric required") if not (r:=integer(S[i])) then return RTError("numeric required") i -:= 1 S[i] := l % r } "**": { if not (l:=numeric(S[i-1])) then return RTError("numeric required") if not (r:=numeric(S[i])) then return RTError("numeric required") i -:= 1 S[i] := l ^ r } "neg": { if not (r:=numeric(S[i])) then return RTError("numeric required") S[i] := - r } "abs": { if not (r:=numeric(S[i])) then return RTError("numeric required") S[i] := abs(r) } "integer": { if not (r:=numeric(S[i])) then return RTError("numeric required") S[i] := integer(r) } "logical": { if not (r:=numeric(S[i])) then return RTError("numeric required") S[i] := if r ~= 0 then True else False } "real": { if type(r:=S[i])~=="Logical" then return RTError("logical required") S[i] := if r === True then 1 else 0 } "min": { if not (l:=numeric(S[i-1])) then return RTError("numeric required") if not (r:=numeric(S[i])) then return RTError("numeric required") i -:= 1 S[i] := if l < r then l else r } "max": { if not (l:=numeric(S[i-1])) then return RTError("numeric required") if not (r:=numeric(S[i])) then return RTError("numeric required") i -:= 1 S[i] := if l > r then l else r } "isn": { r:=deref(S[i]) S[i] := if numeric(r) then True else False } "isb": { r:=deref(S[i]) S[i] := if type(r)=="Logical" then True else False } "isr": { r:=deref(S[i]) S[i] := if type(r)=="Reference" then True else False } "isl": { r:=deref(S[i]) S[i] := if type(r)=="Progref" then True else False } "isli": { r:=deref(S[i]) S[i] := if type(r)=="list" then True else False } "isy": { r:=deref(S[i]) S[i] := if type(r)=="string" then True else False } "isp": { r:=deref(S[i]) S[i] := if type(r)=="procDescr" then True else False } "isu": { r:=deref(S[i]) S[i] := if /r then True else False } "in": { i+:=1 S[i]:=reads() } "out": { r:=deref(S[i]) case type(r) of { "Logical": write(r.s) "null": write("undef") "Reference":write("Reference(",image(r.lst),",",r.pos,")") "Progref":write("Program_Reference(",r.mix,",",r.adr,")") "procDescr":write("Procedure_Descriptor(", r.bln,",",r.mix,",",r.adr,")") default: write(r) } } "<=": { if not (l:=numeric(S[i-1])) then return RTError("numeric required") if not (r:=numeric(S[i])) then return RTError("numeric required") i -:= 1 S[i] := if l <= r then True else False } "<": { if not (l:=numeric(S[i-1])) then return RTError("numeric required") if not (r:=numeric(S[i])) then return RTError("numeric required") i -:= 1 S[i] := if l < r then True else False } ">=": { if not (l:=numeric(S[i-1])) then return RTError("numeric required") if not (r:=numeric(S[i])) then return RTError("numeric required") i -:= 1 S[i] := if l >= r then True else False } ">": { if not (l:=numeric(S[i-1])) then return RTError("numeric required") if not (r:=numeric(S[i])) then return RTError("numeric required") i -:= 1 S[i] := if l > r then True else False } "=": { i -:= 1 S[i] := if S[i] === S[i+1] then True else False } "~=": { i -:= 1 S[i] := if S[i] ~=== S[i+1] then True else False } "and": { if type(r:=S[i])~=="Logical" then return RTError("logical required") if r===True then i-:=1 else { k:=P[k][2]; next } } "or": { if type(r:=S[i])~=="Logical" then return RTError("logical required") if r===True then { k:=P[k][2]; next } else i-:=1 } "~": { if type(r:=S[i])~=="Logical" then return RTError("logical required") S[i] := if r===True then False else True } "then": { if type(r:=S[i])~=="Logical" then return RTError("logical required") i-:=1 if r===False then { k:=P[k][2]; next } } "else": { k:=P[k][2] next } "length": { r:=deref(S[i]) if type(r)~=="list" then return RTError("list required") S[i] := *r } "tail": { if type(r:=S[i])~=="list" then return RTError("list required") if *r<1 then return RTError("non-empty list required") S[i] := r[2:0] } "&": { if not (type(l:=S[i-1])==type(r:=S[i])=="list") then return RTError("list required") i -:= 1 S[i] := l ||| r } "list": { if not (r:=numeric(S[i])) then return RTError("numeric required") S[i] := list(r) } "number"|"logval"|"symbol" : { i +:= 1 S[i] := P[k][2] } "undef": { i +:= 1 S[i] := &null } "label": { i +:= 1 S[i] := progref(P[k][2],P[k][3]) } "@": { i +:= 1 S[i] := reference(P[k][2],P[k][3]) } "new": { put(S[mp][4],&null) } "formal": { fct +:= 1 if fct > *S[mp][4] then put(S[mp][4],&null) } "<-": { i -:= 1 S[i] := assignThroughRef(S[i],S[i+1]) | fail } ";": { i -:= 1 } "]": { if not (r:=numeric(S[i])) then return RTError("numeric required") if r <= 0 then return RTError("subscript must be positive") i -:= 1 l := deref(S[i]) if type(l)~=="list" then return RTError("list required") if r > *l then return RTError("subscript too large") S[i] := Reference(l,r) } "begin": { i +:= 1 S[i] := [S[mp][1]+1,mp,mp,[]] mp := i } "end": { t := S[mp][2] S[mp] := S[i] i := mp mp := t } "proc": { i +:= 1 S[i] := procDescr(S[mp][1]+1,mp,k) k := P[k][2] next } "value": { S[i] := t := deref(S[i]) if type(t)=="procDescr" then { fct := 0 S[i] := [t.bln,mp,t.mix,[],k] mp := i k := t.adr } } "call": { i -:= 1 t := deref(S[i]) if type(t)~=="procDescr" then return RTError("procedure required") fct := 0 S[i] := [t.bln,mp,t.mix,S[i+1],k] mp := i k := t.adr } "endproc": { k := S[mp][5] t := S[mp][2] S[mp] := S[i] i := mp mp := t } "halt": { break } "goto": { if type(S[i])~=="Progref" then return RTError("label required") mp := S[i].mix k := S[i].adr i := mp next } ")": { i +:= 1 r := S[i-P[k][2]:i] i -:= P[k][2] S[i] := r } } k+:=1 } return end procedure RTError(s) stop(k," ",P[k][1]," --- ",s) end icon-9.4.3/ipl/packs/euler/parsell1.icn0000664000175000017500000000354107307530333017230 0ustar chrishchrish record Token(type,body,line,column) link readll1 procedure parseLL1(ll1) local predictionStack local x,y,z,top,cur predictionStack:=[ll1.start,ll1.eoi] cur := scan() repeat { if not(top := pop(predictionStack)) then return if top == cur.type then { outToken(cur) if top == ll1.eoi then break cur := scan() } else if member(ll1.actions,top) then { outAction(top) } else if x:=\ll1.sel[top] & y:=\x[cur.type] then { every z:=y[*y to 1 by -1] do push(predictionStack,z) } else if y:=\ll1.deflt[top] then { every z:=y[*y to 1 by -1] do push(predictionStack,z) } else { #panic mode error recovery reportParseError(cur) push(predictionStack,top) repeat { while not member(ll1.fiducials,cur.type) & cur.type~==ll1.eoi do { #write("scanning past ",cur.body) cur := scan() } if x:=!predictionStack & (x==cur.type) | member(\ll1.firstFiducials[x], cur.type) then break else cur := scan() } repeat { top := pop(predictionStack) | stop("system error in panic mode") #write("pruning stack ",top) if top==cur.type then { push(predictionStack,top) break } if member(ll1.actions,top) then { outAction(top) } else if member(ll1.terminals,top) then { outError(top) } else if member(\ll1.firstFiducials[top],cur.type) then { push(predictionStack,top) break } else { predictionStack := ll1.minLengRHS[top] ||| predictionStack } } } } return end # # Copyright (C) 1994, T.W. Christopher and G.K. Thiruvathukal. # All rights reserved. The use of TLC is governed by conditions # similar to GNU Copyleft. Please consult the files distributed # with TLC for more information: COPYLEFT, WARRANTY, and README. # If the aforementioned files are missing, you can obtain them # from {tc,gkt}@iitmax.acc.iit.edu. # # icon-9.4.3/ipl/packs/euler/t0.eul0000664000175000017500000000002107307530333016032 0ustar chrishchrishbegin out 1 end icon-9.4.3/ipl/packs/euler/t1.eul0000664000175000017500000000013107307530333016035 0ustar chrishchrishbegin new x; new s; s <- (2, 'begin x<- x+1; s[x] end', 'out x'); x <- s[1]; s[x] end icon-9.4.3/ipl/packs/euler/t2.eul0000664000175000017500000000013307307530333016040 0ustar chrishchrishbegin new a; new r; a<-(1,(2,3),4); r<-@a[2]; out r.[1]; out r.[2]; r.[1] <- undef end icon-9.4.3/ipl/packs/euler/t3.eul0000664000175000017500000000020107307530333016035 0ustar chrishchrishbegin new p; new n; new f; n<-0; p<-'begin n<-n+1; if n < 100 then p else p<-f(n) end'; f<-'formal x; x'; out p; out p end icon-9.4.3/ipl/packs/euler/t4.eul0000664000175000017500000000025507307530333016047 0ustar chrishchrishbegin new p; new a; new i; p <- 'formal x; formal k; begin k <- k+1; out x end'; i <- 1; a <- (4,9,16); p(a[i],@i); p('a[i]',@i); out i (* should write: 4 16 3 *) end icon-9.4.3/ipl/packs/euler/t5.eul0000664000175000017500000000035207307530333016046 0ustar chrishchrishbegin new p; new a; new i; p <- 'formal x; formal k; begin k <- k+1; x<-k end'; i <- 1; a <- list 3; p(@a[i],@i); p('@a[i]',@i); out a[1]; out if isu a[2] then "undef" else "~undef"; out a[3] (* should write: 2 undef 3 *) end icon-9.4.3/ipl/packs/euler/t6.eul0000664000175000017500000000167707307530333016062 0ustar chrishchrishbegin new for; new sum; new equal; new i; new array; new x; new a1; new a2; for <- 'formal v; formal n; formal s; begin label k; v <- 1; k: if v <= n then begin s; v <- v + 1; goto k end else undef end'; x<-(1,2,3,4,5); sum <- 0; for(@i,length x,'sum<-sum+x[i]') ; out sum; equal<-'formal x; formal y; begin new t; new i; label k; t <- false; if isli x and isli y and length x = length y then begin for(@i,length x, 'if ~ equal(x[i],y[i]) then goto k else undef'); t <- true end else t <- isn x and isn y and x=y; k: t end'; out equal(1,1); array<-'formal l; formal x; begin new t; new a; new b; new i; b <- l; t <- list b[1]; a <- 'if length b>1 then array(tail b,x) else x'; for(@i,b[1],'t[i]<-a'); t end'; a1 <- array((2,3,4),1); a2 <- array((2,3,4),1); out equal(a1,a2) end icon-9.4.3/ipl/packs/euler/t7.eul0000664000175000017500000000026207307530333016050 0ustar chrishchrishbegin new x; new s; x<-1; out x; s <- (1,2,3); out s[1]; out s[2]; out s[3]; s[1] <- s[1] + 1; out s[1]; out s[2]; out s[3]; x<-1; out s[x]; out s[x+1]; out s[x+2] end icon-9.4.3/ipl/packs/euler/t8.eul0000664000175000017500000000144707307530333016057 0ustar chrishchrishbegin label L; new i; new pr; out "1 + 2"; out 1 + 2; out "1 - 2"; out 1 - 2; out "1 * 2"; out 1 * 2; out "1 / 2"; out 1 / 2; out "2 ** 2"; out 2 ** 2; out "1 max 2"; out 1 max 2; out "1 min 2"; out 1 min 2; out "i<-((A)&(B));out length i"; i<-(("A")&("B"));out length i; i <- 1; L:out "i<-"; out i; out "i = 2"; out i = 2; out "i ~= 2"; out i ~= 2; out "i < 2"; out i < 2; out "i <= 2"; out i <= 2; out "i > 2"; out i > 2; out "i >= 2"; out i >= 2; i <- i + 1; if i <= 3 then goto L else undef; out "~true"; out ~true; out "~false"; out ~false; pr<-'formal p; formal q; begin out "p<-"; out p; out "q<-"; out q; out "p and q"; out p and q; out "p or q"; out p or q end'; pr(false,false); pr(true,false); pr(false,true); pr(true,true); out "done" end icon-9.4.3/ipl/packs/euler/t9.eul0000664000175000017500000000073107307530333016053 0ustar chrishchrishbegin new p; new i; label L; L: p<-'formal x; begin out "isn x"; out isn x; out "isb x"; out isb x; out "isr x"; out isr x; out "isl x"; out isl x; out "isli x"; out isli x; out "isy x"; out isy x; out "isp x"; out isp x; out "isu x"; out isu x; undef end'; out "x<-1;"; p(1); out "x<-true;"; p(true); out "x<-@i;"; p(@i); out "x<-L;"; p(L); out "x<-();"; p(()); out "x<-symbol;"; p("A"); out "x<-'1';"; p('1'); out "x<-undef;"; p(undef); out "done" end icon-9.4.3/ipl/packs/euler/t10.eul0000664000175000017500000000022207307530333016116 0ustar chrishchrishbegin new P; new Q; new S; P <- '0'; Q <- ' begin new R; R <- ' out "Hi!" ' ; P; R end' ; S <- ' begin P; Q end'; S end icon-9.4.3/ipl/packs/euler/t11.eul0000664000175000017500000000010507307530333016117 0ustar chrishchrishbegin label L; new x; x<-@x; L: out L; out 'x'; out @x end icon-9.4.3/ipl/packs/euler/readme0000664000175000017500000000411607307564246016203 0ustar chrishchrish EULER A COMPILER AND INTERPRETER Wirth's and Weber's contribution to the development of ALGOL translated into Icon. euler.icn The EULER compiler and interpreter main program eulerscn.icn The EULER scanner eulersem.icn The EULER translator module eulerint.icn The EULER interpreter euler.ll1 The parse tables for parsellk euler.grm The grammar file used by TLCLL1 to build euler.ll1 From the TLCLL1 Parser: PARSELL1.ICN LL(1) parser READLL1.ICN input routine for translated grammars SEMSTK.ICN semantics routines called by PARSELL1.ICN to handle the semantics stack From the Icon Program Library: xcode.icn escape.icn ebcdic.icn Building EULER You can execute the batch file buildk.bat to build EULER. Six files from the Icon Program Library and three files from the TLCLL1 parser generator are included with this distribution and can be compiled separately. To build EULER by hand, you may execute icont -c xcodeobj escape ebcdic icont -c parsell1 readll1 semstk icont -fs euler eulerscn eulersem eulerint parsell1.u1 readll1.u1 semstk.u1 The first icont line compiles the files from the IPL. You may omit the line if you have the IPL installed. The second icont line compiles modules from the TLCLL1 parser. The third line compiles EULER's modules. The flag -fs tells the translator that EULER calls some procedures by giving their names as strings. In Icon version 8, this flag is not needed; in version 9 it is. Running EULER To have EULER translate and execute a program prog.eul, execute Under Icon version 8: iconx euler prog.eul Under Icon version 9: euler prog.eul If you would also like a listing of the translated code, execute Under Icon version 8: iconx euler -s prog.eul Under Icon version 9: euler -s prog.eul Getting Icon If you do not have a copy of Icon, you can get it over the Internet: ftp it from cs.arizona.edu: ftp ftp.cs.arizona.edu name: anonymous password: your_e-mail_address cd icon Versions of Icon for several machines are in subdirectories of directory icon. You may also want to pick up the Icon Programming Library. icon-9.4.3/ipl/packs/euler/ebcdic.icn0000664000175000017500000001442507307530333016721 0ustar chrishchrish############################################################################ # # File: ebcdic.icn # # Subject: Procedures to convert between ASCII and EBCDIC # # Author: Alan Beale # # Date: March 31, 1990 # ############################################################################ # # These procedures assist in use of the ASCII and EBCDIC character sets, # regardless of the native character set of the host: # # Ascii128() Returns a 128-byte string of ASCII characters in # numerical order. Ascii128() should be used in # preference to &ascii for applications which might # run on an EBCDIC host. # # Ascii256() Returns a 256-byte string representing the 256- # character ASCII character set. On an EBCDIC host, # the order of the second 128 characters is essentially # arbitrary. # # Ebcdic() Returns a 256-byte string of EBCDIC characters in # numerical order. # # AsciiChar(i) Returns the character whose ASCII representation is i. # # AsciiOrd(c) Returns the position of the character c in the ASCII # collating sequence. # # EbcdicChar(i) Returns the character whose EBCDIC representation is i. # # EbcdicOrd(c) Returns the position of the character c in the EBCDIC # collating sequence. # # MapEtoA(s) Maps a string of EBCDIC characters to the equivalent # ASCII string, according to a plausible mapping. # # MapAtoE(s) Maps a string of ASCII characters to the equivalent # EBCDIC string, according to a plausible mapping. # # Control(c) Returns the "control character" associated with the # character c. On an EBCDIC host, with $ representing # an EBCDIC character with no 7-bit ASCII equivalent, # Control("$") may not be identical to "\^$", as # translated by ICONT (and neither result is particularly # meaningful). # ############################################################################ # # Notes: # # There is no universally accepted mapping between ASCII and EBCDIC. # See the SHARE Inc. publication "ASCII and EBCDIC Character Set and # Code Issues in Systems Application Architecture" for more information # than you would ever want to have on this subject. # # The mapping of the first 128 characters defined below by Ascii128() # is the most commonly accepted mapping, even though it probably # is not exactly like the mapping used by your favorite PC to mainframe # file transfer utility. The mapping of the second 128 characters # is quite arbitrary, except that where an alternate translation of # ASCII char(n) is popular, this translation is assigned to # Ascii256()[n+129]. # # The behavior of all functions in this package is controlled solely # by the string literals in the _Eascii() procedure. Therefore you # may modify these strings to taste, and still obtain consistent # results, provided that each character appears exactly once in the # result of _Eascii(). # # Yes, it's really true that the EBCDIC "\n" (NL, char(16r15)) is not # the same as "\l" (LF, char(16r25)). How can that be? "Don't blame # me, man, I didn't do it." # ############################################################################ procedure _Eascii() static EinAorder initial EinAorder := # NUL SOH STX ETX EOT ENQ ACK BEL BS HT NL VT FF CR SO SI "\x00\x01\x02\x03\x37\x2d\x2e\x2f\x16\x05\x15\x0b\x0c\x0d\x0e\x0f"|| # DLE DC1 DC2 DC3 DC4 NAK SYN ETB CAN EM SUB ESC FS GS RS US "\x10\x11\x12\x13\x3c\x3d\x32\x26\x18\x19\x3f\x27\x1c\x1d\x1e\x1f"|| # sp ! " # $ % & ' ( ) * + , - . / "\x40\x5a\x7f\x7b\x5b\x6c\x50\x7d\x4d\x5d\x5c\x4e\x6b\x60\x4b\x61"|| # 0 1 2 3 4 5 6 7 8 9 : ; < = > ? "\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\x7a\x5e\x4c\x7e\x6e\x6f"|| # @ A B C D E F G H I J K L M N O "\x7c\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xd1\xd2\xd3\xd4\xd5\xd6"|| # P Q R S T U V W X Y Z $< \ $> ^ _ "\xd7\xd8\xd9\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xad\xe0\xbd\x5f\x6d"|| # ` a b c d e f g h i j k l m n o "\x79\x81\x82\x83\x84\x85\x86\x87\x88\x89\x91\x92\x93\x94\x95\x96"|| # p q r s t u v w x y z $( | $) ~ DEL "\x97\x98\x99\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xc0\x4f\xd0\xa1\x07"|| "\x04\x06\x08\x09\x0a\x14\x17\x1a\x1b\x20\x25\x21\x22\x23\x24\x28_ \x29\x2a\x2b\x2c\x30\x31\x33\x34\x35\x36\x38\x39\x3a\x3b\x3e\xff_ \x41\x42\x43\x44\x4a\x45\x46\x47\x48\x49\x51\x52\x53\x54\x55\x56_ \x57\x58\x59\x62\x63\x64\x65\x66\x67\x68\x69\x70\x71\x72\x73\x74_ \x75\x76\x77\x78\x80\x8a\x8c\x8d\x8e\x8f\x90\x9a\x9c\x9d\x9e\x9f_ \xa0\xaa\xab\xac\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9_ \xba\xbb\xbc\xbe\xbf\xca\xcb\xcc\xcd\xce\xcf\xda\xdb\xdc\xdd\xde_ \xdf\xe1\xea\xeb\xec\xed\xee\xef\xfa\xfb\xfc\x8b\x6a\x9b\xfd\xfe" return EinAorder end procedure Ascii128() if "\l" == "\n" then return string(&ascii) return _Eascii()[1+:128] end procedure Ascii256() if "\l" == "\n" then return string(&cset) return _Eascii() end procedure Ebcdic() if "\l" ~== "\n" then return &cset return map(&cset, _Eascii(), &cset) end procedure AsciiChar(i) if "\l" == "\n" then return char(i) return _Eascii()[0 < i+1] | runerr(205,i) end procedure AsciiOrd(c) if "\l" == "\n" then return ord(c) return ord(MapEtoA(c)) end procedure EbcdicChar(i) if "\l" ~== "\n" then return char(i) return map(char(i), _Eascii(), &cset) end procedure EbcdicOrd(c) if "\l" ~== "\n" then return ord(c) return ord(MapAtoE(c)) end procedure MapEtoA(s) return map(s, _Eascii(), &cset) end procedure MapAtoE(s) return map(s, &cset, _Eascii()) end procedure Control(c) return AsciiChar(iand(AsciiOrd(c),16r1f)) end icon-9.4.3/ipl/packs/euler/build.bat0000664000175000017500000000025207307530333016575 0ustar chrishchrishicont -c xcode escape ebcdic icont -s -c parsell1 readll1 semstk eulerscn icont -s -fs euler eulersem eulerint parsell1.u1 readll1.u1 semstk.u1 eulerscn.u1 rem pause icon-9.4.3/ipl/packs/euler/eulerscn.icn0000664000175000017500000000624707307530333017333 0ustar chrishchrish global inputFile global inputLine,inputLineNumber,inputColumn,eoiToken global keywordSet procedure initScanner(filename) inputFile := open(filename,"r") | stop("unable to open input: ",filename) return end procedure fractionPart() return ="." || (tab(many(&digits)) | "") end procedure scaleFactor() return tab(any('ED')) || (tab(any('+-')) | "") || tab(many(&digits)) end procedure scan() local t,c,b static whiteSpace,initIdChars,idChars,hexdigits,commentDepth,commentLineNo initial { /inputFile := &input inputLineNumber := 1 inputColumn := 1 inputLine := read(inputFile) eoiToken := &null whiteSpace := &ascii[1:34] #control ++ blank initIdChars := &letters hexdigits := &digits ++ 'ABCDEF' idChars := &letters ++ &digits ++ '$_' keywordSet := set([ "new", "formal", "label", "tail", "undef", "in", "isb", "isn", "isr", "isl", "isli", "isy", "isp", "isu", "abs", "length", "integer", "real", "logical", "true", "false", "list", "div", "mod", "max", "min", "and", "or", "else", "if", "then", "goto", "out", "begin", "end" ]) } if \eoiToken then return eoiToken repeat inputLine ? { tab(inputColumn) tab(many(whiteSpace)) c := &pos if b := tab(many(&digits)) then { if b := b || fractionPart() || scaleFactor() then { t := Token("realN",b, inputLineNumber,c) } else if b ||:= fractionPart() then { t := Token("realN",b, inputLineNumber,c) } else if b ||:= ="." || scaleFactor() then { t := Token("realN",b, inputLineNumber,c) } else { t := Token("integerN",b, inputLineNumber,c) } inputColumn := &pos return t } else if any(initIdChars) then { t := Token("id",tab(many(idChars)), inputLineNumber,c) inputColumn := &pos if member(keywordSet,t.body) then t.type := t.body return t } else if b := =("<-" | ">=" | "<=" | "~=" | "**" ) then { inputColumn := &pos return Token(b,b,inputLineNumber,c) } else if ="(*" then { inputColumn := &pos commentDepth := 1 commentLineNo := inputLineNumber while commentDepth > 0 do { tab(upto('*(')|0) if pos(0) then { &pos := 1 inputLineNumber +:= 1 if not (&subject := inputLine := read(inputFile)) then { eoiToken := Token("EOI","EOI", inputLineNumber,1) write("end of input in comment beginning at ", commentLineNo) return eoiToken } } else if ="*)" then { commentDepth -:= 1 } else if ="(*" then { commentDepth +:= 1 } else { move(1) } } inputColumn := &pos } else if b := tab(any('\',=()[]~+-*/@&;:><.')) then { inputColumn := &pos return Token(b,b,inputLineNumber,c) } else if pos(0) then { inputColumn := 1 inputLineNumber +:= 1 if not (inputLine := read(inputFile)) then { eoiToken := Token("EOI","EOI", inputLineNumber,1) return eoiToken } } else if ="\"" then { b := tab(find("\"")) if not( = "\"" ) then { write("unterminated string at ", inputLineNumber," ",c) } t := Token("symbol",b,inputLineNumber,c) inputColumn := &pos return t } else { write("unexpected character: ",move(1), " at line ",inputLineNumber," column ",c) inputColumn := &pos } } end icon-9.4.3/ipl/packs/euler/euler.grm0000664000175000017500000000523307307530333016635 0ustar chrishchrishstart : program . program = block ENDPROG!. vardecl = new id NEWDECL! . fordecl = formal id FORMALDECL! . labdecl = label id LABELDECL! . var = id VARID! { "[" expr "]" SUBSCR! | "." DOT! } . logval = true LOGVALTRUE! . logval = false LOGVALFALSE! . number = realN | integerN. reference = "@" var REFERENCE! . # listhead -> "(" LISTHD1! # listhead -> listhead expr "," LISTHD2! # listN -> listhead ")" LISTN1! # listN -> listhead expr ")" LISTN2! listN = "(" LISTHD1! ( ")" LISTN1! | expr listTl ) . listTl = ")" LISTN2! | "," LISTHD2! ( expr listTl | ")" LISTN1! ) . prochead = "'" PROCHD! { fordecl ";" PROCFORDECL! } . procdef = prochead expr "'" PROCDEF! . primary = var ( listN CALL! | VALUE!) | primary1 . primary1 = logval LOADLOGVAL! | number LOADNUM! | symbol LOADSYMB!| reference | listN | tail primary UOP! | procdef | undef LOADUNDEF! | "[" expr "]" PARENS! | in INPUT! | isb var UOP! | isn var UOP! | isr var UOP! | isl var UOP! | isli var UOP! | isy var UOP! | isp var UOP! | isu var UOP! | abs primary UOP! | length var UOP! | integer primary UOP! | real primary UOP! | logical primary UOP! | list primary UOP! . factor = primary factortail. factortail = { "**" primary BOP! } . term = factor termtail. termtail = { "*" factor BOP! | "/" factor BOP! | div factor BOP! | mod factor BOP! } . sum = ("+" term UPLUS! | "-" term NEG! | term) sumtail. sumtail = { "+" term BOP! | "-" term BOP! } . choice = sum choicetail. choicetail = { min sum BOP! | max sum BOP! } . relation = choice relationtail. relationtail = [ "=" choice BOP! | "~=" choice BOP! | "<" choice BOP! | "<=" choice BOP! | ">" choice BOP! | ">=" choice BOP! ] . negation = "~" relation UOP! | relation . conj = negation conjtail. conjtail = [ and CONJHD! conj CONJ! ]. disj = conj disjtail. disjtail = [ or DISJHD! disj DISJ! ] . catenatail = { "&" primary BOP! }. truepart = expr else TRUEPT! . ifclause = if expr then IFCLSE! . expr = var exprtail | expr1. exprtail = "<-" expr BOP! | ( listN CALL! | VALUE!) factortail termtail sumtail choicetail relationtail conjtail disjtail catenatail . expr1 = block . expr1 = ifclause truepart expr IFEXPR! . expr1 = goto primary UOP! . expr1 = out expr UOP! . expr1 = primary1 factortail termtail sumtail choicetail relationtail conjtail disjtail catenatail . expr1 = ( "+" term UPLUS! | "-" term NEG! ) sumtail choicetail relationtail conjtail disjtail catenatail . expr1 = "~" relation UOP! conjtail disjtail catenatail . stat = expr1 | id ( ":" LABDEF! stat LABSTMT! | VARID! { "[" expr "]" SUBSCR! | "." DOT! } exprtail ) . block = begin BEGIN! { vardecl ";" BLKHD! | labdecl ";" BLKHD!} stat { ";" BLKBODY! stat } end BLK! . icon-9.4.3/ipl/packs/euler/euler.icn0000664000175000017500000000214607307530333016621 0ustar chrishchrishlink eulerscn,readll1 #,parsell1 global primTbl procedure main(L) local filename,flags,splitFilename local ptbl #write("hi") #&trace:=-1 if *L<1 then stop("usage: [iconx] euler [-s] filename.eul") flags := "" if L[1][1]=="-" then { flags := L[1] filename := L[2] } else { filename:=L[1] } if /filename then stop("usage: [iconx] euler [-s] filename.eul") splitFilename:=fileSuffix(filename) if \splitFilename[2] then initScanner(filename) else initScanner(splitFilename[1]||".eul") initSemanticsStack() initTrans() #write("before readLL1") ptbl:=readLL1("euler.ll1") #write("after readLL1") parseLL1(ptbl) if find("s",flags) then showCode() interpreter() end # From: filename.icn in Icon Program Library # Author: Robert J. Alexander, 5 Dec. 89 # Modified: Thomas Christopher, 12 Oct. 94 procedure fileSuffix(s,separator) local i /separator := "." i := *s + 1 every i := find(separator,s) return [s[1:i],s[(*s >= i) + 1:0] | &null] end # #required by parseLL1() # procedure reportParseError(t) write("unexpected input ",t.body, " at line ",t.line," column ",t.column) return end icon-9.4.3/ipl/packs/euler/euler.ll10000664000175000017500000001245607307530333016545 0ustar chrishchrishL N10 L N128 L N5 L N1 "[" L 7 "expr" L 7 "]" L 7 "SUBSCR" L 7 "var_6_17" L N3 L 7 "abs" L 7 "primary" L 7 "UOP" L N4 L 7 "and" L 7 "CONJHD" L 7 "conj" L 7 "CONJ" L N0 L N2 L 7 "false" L 7 "LOGVALFALSE" L 18 L 7 "list" 22 24 L 38 L 7 "factor" L 7 "termtail" L 18 10 L 7 "else" L 7 "TRUEPT" L 38 10 L 7 "listTl" L 18 L 7 "," L 7 "LISTHD2" L 7 "listTl_16_37" 37 L 7 L 7 "VALUE" L 18 L 7 "goto" 22 24 L 38 L 7 "listN" L 7 "CALL" L 38 L 7 "sum_34_7" L 7 "sumtail" L 38 L 7 "sum" L 7 "choicetail" L N7 L 7 "expr1_80_10" 81 86 L 7 "relationtail" L 7 "conjtail" L 7 "disjtail" L 7 "catenatail" L 38 L 7 "number" L 7 "LOADNUM" L 38 L 7 "choice" 92 L 26 L 7 ":" L 7 "LABDEF" L 7 "stat" L 7 "LABSTMT" L 7 L 7 "procdef" L 18 L 7 "isn" L 7 "var" 24 L 18 L 7 ">" 106 L 7 "BOP" L 26 L 7 "labdecl" L 7 ";" L 7 "BLKHD" L 7 "block_97_3" L 18 L 7 "formal" L 7 "id" L 7 "FORMALDECL" L 18 L 7 "isp" 123 24 L 7 L 7 "relation" L 38 32 96 L 18 142 L 7 "VARID" 16 L 18 L 7 "real" 22 24 37 37 L 18 L 7 "@" 123 L 7 "REFERENCE" L 38 L 7 ")" L 7 "LISTN1" L 26 L 7 "div" 48 128 L 7 "termtail_32_12" L 7 L 7 "expr1" L 18 L 7 "'" L 7 "PROCHD" L 7 "prochead_17_24" L 18 L 7 "-" L 7 "term" L 7 "NEG" L 7 L 7 "block" L 18 L 7 "+" 187 L 7 "UPLUS" L 7 L 7 "primary1" 37 37 L 18 L 7 "." L 7 "DOT" L 7 "stat_93_12" L 7 74 L 38 L 7 "in" L 7 "INPUT" L 18 L 7 "<" 106 128 L 38 142 L 7 "stat_92_7" 37 L 38 192 L 7 "ENDPROG" L 18 L 7 "isli" 123 24 L 7 L 7 "relationtail_40_16" 37 L 18 203 205 16 L 18 L 7 "length" 123 24 L 7 L 7 "disjtail_48_12" L 7 L 7 "realN" L 38 22 L 7 "factortail" L 26 L 7 "*" 48 128 172 L 26 L 7 "if" 10 L 7 "then" L 7 "IFCLSE" L 18 L 7 "(" L 7 "LISTHD1" L 7 "listN_15_22" L 26 L 7 "fordecl" 133 L 7 "PROCFORDECL" 182 L 7 172 L 18 L 7 "<-" 10 128 L 18 L 7 "out" 10 24 L 7 68 L 26 195 187 128 L 7 "sumtail_35_11" L 26 L 7 "min" 84 128 L 7 "choicetail_37_14" L N6 L 7 "~" 150 24 94 96 98 L 38 L 7 "symbol" L 7 "LOADSYMB" L 38 L 7 "undef" L 7 "LOADUNDEF" L 18 L 7 "=" 106 128 L 18 154 207 L 7 "exprtail" L 18 L 7 "isr" 123 24 L 18 L 7 ">=" 106 128 37 L 18 L 7 "label" 142 L 7 "LABELDECL" L 18 L 7 "isu" 123 24 L 38 L 7 "negation" 94 L 26 L 7 "or" L 7 "DISJHD" L 7 "disj" L 7 "DISJ" L 38 L 7 "true" L 7 "LOGVALTRUE" L 18 L 7 "logical" 22 24 L 7 L 7 "factortail_30_14" L 7 L 7 "catenatail_49_14" L 38 165 167 L 38 165 L 7 "LISTN2" L 26 L 7 "mod" 48 128 172 L 38 74 76 L 26 L 7 "ifclause" L 7 "truepart" 10 L 7 "IFEXPR" L 26 L 7 "prochead" 10 178 L 7 "PROCDEF" L 7 187 L 18 185 187 189 L 38 L 7 "logval" L 7 "LOADLOGVAL" L 7 274 L 7 279 37 L 18 L 7 "tail" 22 24 L 18 L 7 "isb" 123 24 L 18 L 7 "<=" 106 128 L 26 L 7 "vardecl" 133 135 137 L 88 L 7 "begin" L 7 "BEGIN" 137 113 L 7 "block_98_8" L 7 "end" L 7 "BLK" L 18 L 7 "new" 142 L 7 "NEWDECL" L 18 L 7 "isy" 123 24 L 18 283 150 24 L 7 L 7 "conjtail_46_12" 37 L 18 L 7 "integer" 22 24 L 26 L 7 "**" 22 128 336 L 26 L 7 "&" 22 128 339 L 7 L 7 "integerN" L 26 L 7 "/" 48 128 172 L 38 123 299 L 38 10 58 37 L 18 195 187 197 L N9 L 7 "exprtail_56_2" 241 50 81 86 92 94 96 98 L 423 200 241 50 81 86 92 94 96 98 L 38 123 L 7 "primary_19_15" L 26 185 187 128 274 L 26 L 7 "max" 84 128 279 L 5 8 10 12 14 207 L 7 L 7 "reference" L 26 8 10 12 L 7 "PARENS" L 18 L 7 "~=" 106 128 L 7 175 L 26 133 L 7 "BLKBODY" 113 387 L 18 L 7 "isl" 123 24 37 T N30 182 T 7 140 260 316 T 7 283 401 228 T 281 296 295 305 304 443 442 216 215 377 376 126 125 200 T N26 160 436 333 332 238 100 40 363 254 209 121 120 313 312 374 373 371 370 147 146 45 44 415 100 406 405 291 290 157 156 302 301 225 224 399 398 178 117 8 439 328 363 286 285 211 210 232 231 20 19 450 449 258 T 7 165 341 101 T 38 238 237 415 414 79 T 38 185 184 195 422 16 T 38 203 230 8 6 22 T 7 142 428 219 T 7 109 108 364 T 38 40 39 328 327 279 T 38 277 276 433 432 172 T 26 418 417 244 243 170 169 346 345 10 T 7 142 420 207 T 38 203 202 8 435 336 T 7 409 408 90 T 38 185 362 195 194 58 T 38 61 60 165 342 137 T 38 308 130 394 379 113 T 7 142 218 65 T 7 165 164 425 T 7 254 348 175 T 88 247 349 185 89 270 269 71 70 383 191 283 282 195 89 339 T 7 412 411 274 T 38 185 431 195 273 387 T 7 133 446 299 T 7 267 266 403 T 7 28 27 235 T 7 319 318 429 T 7 254 73 T N52 182 37 316 149 228 37 258 57 187 47 94 402 96 234 79 361 16 37 357 177 22 199 131 307 261 139 86 369 123 153 219 298 279 37 32 315 323 152 172 37 10 174 207 37 74 253 241 335 50 265 336 37 380 393 137 37 113 445 65 421 425 67 437 159 175 427 L 7 "program" 221 98 338 192 382 106 83 150 105 339 37 118 356 84 78 48 240 81 368 274 37 350 246 387 37 299 424 403 37 235 37 429 272 92 227 352 52 L N64 328 291 450 170 377 383 415 20 195 249 254 45 28 371 302 409 418 216 238 178 313 283 247 267 308 8 333 433 61 286 244 443 142 121 147 160 157 277 296 412 109 394 40 133 374 399 305 165 406 270 L 7 "EOI" 203 211 225 346 126 53 389 140 232 185 71 12 319 L N42 396 263 135 167 359 354 154 24 115 180 55 385 144 391 256 288 325 111 222 330 68 189 103 34 321 213 128 76 197 251 447 310 366 30 205 63 440 42 162 14 343 293 L 7 491 T 36 T N57 182 37 316 149 228 37 200 363 258 341 101 237 187 47 94 402 96 234 79 361 16 37 357 177 22 428 131 307 261 139 86 369 123 153 219 298 364 327 279 37 32 315 323 152 172 37 10 420 207 37 74 253 241 335 50 265 336 37 90 194 380 393 58 342 137 37 113 445 65 164 425 67 437 159 175 427 487 221 98 338 192 382 106 83 150 105 339 37 118 356 84 78 48 240 81 368 274 37 350 246 387 37 299 424 403 37 235 37 429 272 92 227 352 52 487 491 icon-9.4.3/ipl/packs/euler/eulersem.icn0000664000175000017500000001547607307530333017340 0ustar chrishchrish# EULER semantics routines record Logical(s) global True, False global P,N,n,m,bn,on,V,semantics procedure initTrans() P:=[] N:=list(100) bn:=0 on:=0 n:=0 m:=0 True := Logical("true") False := Logical("false") return end procedure pushCTError(M[]) every writes(!M) write() push(semanticsStack,&null) return end procedure showCode() local i,h h:=*string(*P) every i:=1 to *P do { writes(right(i,h), " ", left(P[i][1],10)) every writes(image(P[i][2 to *P[i]-1]),",") if P[i][1]=="logval" then writes(P[i][2].s) else writes(image(P[i][1<*P[i]])) write() } return end procedure ENDPROG() put(P,["halt"]) return end procedure NEWDECL() V:=popSem(2) if errorFound:=anyError(V) then return pushSem(errorFound) put(P,["new"]) on+:=1 n+:=1 N[n] := [V[2].body,bn,on,"new"] pushSem(&null) return end procedure FORMALDECL() V:=popSem(2) if errorFound:=anyError(V) then return pushSem(errorFound) put(P,["formal"]) on+:=1 n+:=1 N[n] := [V[2].body,bn,on,"formal"] pushSem(&null) return end procedure LABELDECL() V:=popSem(2) if errorFound:=anyError(V) then return pushSem(errorFound) n+:=1 N[n] := [V[2].body,bn,&null,&null] pushSem(&null) return end procedure VARID() local t V:=popSem(1) if errorFound:=anyError(V) then return pushSem(errorFound) t:=n while t>=1 do { if N[t][1]===V[1].body then break t -:= 1 } if t<1 then return pushCTError("identifier ",V[1].body," undeclared") if N[t][4]==="new" then { put(P, ["@",N[t][3],N[t][2]] ) } else if N[t][4]==="label" then { put(P, ["label",N[t][3],N[t][2]] ) } else if N[t][4]==="formal" then { put(P, ["@",N[t][3],N[t][2]] ) put(P, ["value"]) } else { put(P, ["label",N[t][3],N[t][2]] ) N[t][3] := *P } pushSem(&null) return end procedure SUBSCR() V:=popSem(4) if errorFound:=anyError(V) then return pushSem(errorFound) put(P, ["]"] ) pushSem(&null) return end procedure DOT() V:=popSem(2) if errorFound:=anyError(V) then return pushSem(errorFound) put(P, ["value"] ) pushSem(&null) return end procedure LOGVALTRUE() V:=popSem(1) if errorFound:=anyError(V) then return pushSem(errorFound) pushSem(True) return end procedure LOGVALFALSE() V:=popSem(1) if errorFound:=anyError(V) then return pushSem(errorFound) pushSem(False) return end procedure REFERENCE() V:=popSem(2) if errorFound:=anyError(V) then return pushSem(errorFound) pushSem(&null) return end procedure LISTHD2() V:=popSem(3) if errorFound:=anyError(V) then return pushSem(errorFound) pushSem(V[1]+1) return end procedure LISTHD1() V:=popSem(1) if errorFound:=anyError(V) then return pushSem(errorFound) pushSem(0) return end procedure LISTN2() V:=popSem(3) if errorFound:=anyError(V) then return pushSem(errorFound) put(P, [")",V[1]+1] ) pushSem(&null) return end procedure LISTN1() V:=popSem(2) if errorFound:=anyError(V) then return pushSem(errorFound) put(P, [")",V[1]] ) pushSem(&null) return end procedure PROCFORDECL() V:=popSem(3) if errorFound:=anyError(V) then return pushSem(errorFound) pushSem(V[1]) return end procedure PROCHD() V:=popSem(1) if errorFound:=anyError(V) then return pushSem(errorFound) bn +:= 1; on := 0 put(P, ["proc",&null] ) pushSem(*P) n +:= 1 N[n] := ["",m] m := n return end procedure PROCDEF() V:=popSem(3) if errorFound:=anyError(V) then return pushSem(errorFound) put(P, ["endproc"] ) P[V[1]][2] := *P+1 bn -:= 1 n := m-1 m := N[m][2] pushSem(&null) return end procedure VALUE() V:=popSem(1) if errorFound:=anyError(V) then return pushSem(errorFound) put(P, ["value"] ) pushSem(&null) return end procedure CALL() V:=popSem(2) if errorFound:=anyError(V) then return pushSem(errorFound) put(P, ["call"] ) pushSem(&null) return end procedure LOADLOGVAL() V:=popSem(1) if errorFound:=anyError(V) then return pushSem(errorFound) put(P, ["logval",V[1]] ) pushSem(&null) return end procedure LOADNUM() V:=popSem(1) if errorFound:=anyError(V) then return pushSem(errorFound) put(P, ["number",numeric(V[1].body)] ) pushSem(&null) return end procedure LOADSYMB() V:=popSem(1) if errorFound:=anyError(V) then return pushSem(errorFound) put(P, ["symbol",V[1].body] ) pushSem(&null) return end procedure LOADUNDEF() put(P, ["undef"] ) return end procedure PARENS() V:=popSem(3) if errorFound:=anyError(V) then return pushSem(errorFound) pushSem(&null) return end procedure INPUT() put(P, ["in"] ) return end procedure UOP() V:=popSem(2) if errorFound:=anyError(V) then return pushSem(errorFound) put(P, [V[1].body] ) pushSem(&null) return end procedure BOP() V:=popSem(3) if errorFound:=anyError(V) then return pushSem(errorFound) put(P, [V[2].body] ) pushSem(&null) return end procedure UPLUS() V:=popSem(2) if errorFound:=anyError(V) then return pushSem(errorFound) pushSem(&null) return end procedure NEG() V:=popSem(2) if errorFound:=anyError(V) then return pushSem(errorFound) put(P, ["neg"] ) pushSem(&null) return end procedure CONJHD() V:=popSem(2) if errorFound:=anyError(V) then return pushSem(errorFound) put(P, ["and",&null] ) pushSem(*P) return end procedure CONJ() V:=popSem(2) if errorFound:=anyError(V) then return pushSem(errorFound) P[V[1]][2] := *P+1 pushSem(&null) return end procedure DISJHD() V:=popSem(2) if errorFound:=anyError(V) then return pushSem(errorFound) put(P, ["or",&null] ) pushSem(*P) return end procedure DISJ() V:=popSem(2) if errorFound:=anyError(V) then return pushSem(errorFound) P[V[1]][2] := *P+1 pushSem(&null) return end procedure TRUEPT() V:=popSem(2) if errorFound:=anyError(V) then return pushSem(errorFound) put(P, ["else",&null] ) pushSem(*P) return end procedure IFCLSE() V:=popSem(3) if errorFound:=anyError(V) then return pushSem(errorFound) put(P, ["then",&null] ) pushSem(*P) return end procedure IFEXPR() V:=popSem(3) if errorFound:=anyError(V) then return pushSem(errorFound) P[V[1]][2] := V[2]+1 P[V[2]][2] := *P+1 pushSem(&null) return end procedure LABSTMT() V:=popSem(2) if errorFound:=anyError(V) then return pushSem(errorFound) pushSem(&null) return end procedure LABDEF() local t,s V:=popSem(2) if errorFound:=anyError(V) then return pushSem(errorFound) t:=n repeat { # write(N[t][1]," : ",V[1].body) if t<=m then return pushCTError("undeclared label "||V[1].body) if N[t][1]===V[1].body then break t -:= 1 } if N[t][4]~===&null then return pushCTError("redefinition of "||V[1].body) s := N[t][3] N[t][3] := *P+1; N[t][4]:="label" while s ~=== &null do { t := P[s][2] P[s][2] := *P+1 s := t } pushSem(&null) return end procedure BEGIN() V:=popSem(1) if errorFound:=anyError(V) then return pushSem(errorFound) bn +:= 1 on := 0 put(P, ["begin"] ) n +:= 1 N[n] := ["",m] m := n pushSem(&null) return end procedure BLKHD() V:=popSem(3) if errorFound:=anyError(V) then return pushSem(errorFound) pushSem(&null) return end procedure BLKBODY() V:=popSem(3) if errorFound:=anyError(V) then return pushSem(errorFound) put(P, [";"] ) pushSem(&null) return end procedure BLK() V:=popSem(3) if errorFound:=anyError(V) then return pushSem(errorFound) put(P, ["end"] ) n := m-1 m := N[m][2] bn := bn-1 pushSem(&null) return end icon-9.4.3/ipl/packs/euler/readll1.icn0000664000175000017500000000534007307530333017030 0ustar chrishchrish# Read in parse tables produced by TCLL1 # (written by Thomas W. Christopher) # link xcode #xcode is provided by the Icon Programming Library invocable all record LL1(sel,deflt, terminals,actions, fiducials,firstFiducials, minLengRHS, start,eoi) procedure readLL1(filename) local g,s,f f:=open(filename) | fail s:=xdecode(f) | fail g:=unpackLL1(s) close(f) return g end procedure unpackLL1(h) local startSymbol, eoiSymbol, rhsList, selIn, defltIn, termList, actionList, fiducList, firstFiduc, minLengRhs local r,i,n,t,s, actionSet,terminalSet, defaultTable,selTable, fiducialSet,firstFiducials, minLengRHS # the following must be in the same order they were listed in # return statement of genLL1() in module "ll1.icn". With the # exception of rhsList, they are in the same order as in record # LL1. rhsList := get(h) selIn := get(h) defltIn := get(h) termList:= get(h) actionList:=get(h) fiducList:=get(h) firstFiduc:=get(h) minLengRhs:=get(h) startSymbol := get(h)[1] eoiSymbol := get(h)[1] every r:= !rhsList & i := 1 to *r do r[i]:=r[i][1] actionSet:=set() every insert(actionSet,(!actionList)[1]) terminalSet:=set() every insert(terminalSet,(!termList)[1]) defaultTable:=table() every n:=key(defltIn) do defaultTable[n[1]]:=defltIn[n] selTable:=table() every n:=key(selIn) do { /selTable[n[1]] := t := table() every s:= key(selIn[n]) do { t[s[1]] := selIn[n][s] } } fiducialSet:=set() every insert(fiducialSet,(!fiducList)[1]) firstFiducials:=table() every n:=key(firstFiduc) & s:=firstFiduc[n] do { firstFiducials[n[1]]:=set() every insert(firstFiducials[n[1]],(!s)[1]) } minLengRHS:=table() every n:=key(minLengRhs) do minLengRHS[n[1]]:=minLengRhs[n] return LL1(selTable,defaultTable, terminalSet,actionSet, fiducialSet,firstFiducials, minLengRHS, startSymbol,eoiSymbol) end procedure showStructure(h, indent) local t,i /indent:="" i := indent||" " case type(h) of { "string": write(indent,"\"",h,"\"") "list": {write(indent,"[") every showStructure(!h,i) write(indent,"]") } "table":{write(indent,"table") t := sort(h,3) while showStructure(get(t),i) do { write(indent,"->") showStructure(get(t),i) write(indent,"---") } write(indent,"end table") } "set": {write(indent,"{") every showStructure(!h,i) write(indent,"}") } } return end procedure showLL1(g) write("start symbol") showStructure( g.start) write("eoi symbol") showStructure( g.eoi) write("action set") showStructure( g.actions) write("terminal set") showStructure( g.terminals) write("default table") showStructure( g.deflt) write("selection table") showStructure( g.sel) write("fiducial set") showStructure( g.fiducials) write("first fiducials") showStructure( g.firstFiducials) write("minimum length RHSs") showStructure( g.minLengRHS) return end icon-9.4.3/ipl/packs/skeem/0002775000175000017500000000000010336137160014776 5ustar chrishchrishicon-9.4.3/ipl/packs/skeem/skfun.icn0000664000175000017500000000673707140713043016631 0ustar chrishchrish############################################################################ # # Name: skfun.icn # # Title: Scheme in Icon # # Author: Bob Alexander # # Date: March 23, 1995 # # Description: see skeem.icn # ############################################################################ # # skeem -- Scheme in Icon # # # Function/syntax list format # # Each function and syntax defined appears in a definition list which is # processed at skeem-initialization time. The following are the rules # for function/syntax list entries: # # - Each entry begins with a procedure name and ends just preceding # the next procedure name or the end of the list. # - Rules regarding number of arguments: # - If an entry contains the object "oneOrMore", then it requires # at least one argument. # - If an entry contains the object "twoOrMore", then it requires # at least two arguments. # - If an entry contains one number N, it requires exactly N # arguements. # - If an entry contains a number N followed by &null, the function # requires at least N arguments. # - If an entry contains a number N followed by a number M, the # function requires at least N arguments but can take no more than # M arguments. # - If an entry contains no numbers but contains &null, the function # can take any number of arguments. # - If an entry contains no numbers and no &null, the procedure # requires exactly one argument. # - If an entry contains a string, then that string is used as the # function's skeem-name rather that the name calculated from its # Icon procedure name. # procedure InitFunctions() every ( InitBasic | # basic syntaxes skbasic.icn InitControl | # control functions skcontrl.icn InitIO | # I/O functions skio.icn InitList | # list & vector functions sklist.icn InitMisc | # misc functions skmisc.icn InitNumber | # number functions sknumber.icn InitString | # string and char functions skstring.icn \!InitUser())() # user-defined functions skuser.icn end procedure DefFunction(prcList,funType) local item,funName,prc,minArgs,maxArgs,gotNull,special /funType := Function prc := get(prcList) while \prc do { funName := minArgs := maxArgs := gotNull := special := &null repeat { (item := get(prcList)) | { item := &null break } if type(item) == "procedure" then break if type(item) == "integer" then /minArgs | maxArgs := item else if /item then gotNull := "true" else if type(item) == "string" then (if item == ("oneOrMore" | "twoOrMore") then special else funName) := item } if special === "oneOrMore" then minArgs := 1 else if special === "twoOrMore" then minArgs := 2 else if /minArgs then if \gotNull then minArgs := 0 else minArgs := maxArgs := 1 else if /gotNull then /maxArgs := minArgs /funName := ProcName(prc) #write("+++ ",funName,": ",image(prc),", ",image(minArgs),", ", # image(maxArgs)) DefVar(funName,funType(prc,funName,minArgs,maxArgs)) prc := item } return end procedure DefSyntax(prc) return DefFunction(prc,Syntax) end procedure ProcName(prc) local nm image(prc) ? { tab(find(" ") + 1) nm := "" while nm ||:= tab(find("_")) do { move(1) nm ||:= if ="BANG" & pos(0) then "!" else if ="2_" then "->" else if ="P" & pos(0) then "?" else "-" } nm ||:= tab(0) } return nm end icon-9.4.3/ipl/packs/skeem/Makefile0000664000175000017500000000064507314423462016446 0ustar chrishchrishICONT=icont IFLAGS=-us SRC = skeem.icn skbasic.icn skcontrl.icn skdebug.icn skextra.icn skfun.icn \ skin.icn skio.icn sklist.icn skmisc.icn sknumber.icn skout.icn \ skstring.icn skuser.icn skutil.icn llist.icn skeem: $(SRC) $(ICONT) $(IFLAGS) $(SRC) Test: skeem MSTKSIZE=500000 ./skeem test.scm >test.out cmp test.std test.out Iexe: skeem cp skeem ../../iexe/ Clean: rm -f skeem *.u? *.out tmp? icon-9.4.3/ipl/packs/skeem/skmisc.icn0000664000175000017500000000371707140713043016767 0ustar chrishchrish############################################################################ # # Name: skmisc.icn # # Title: Scheme in Icon # # Author: Bob Alexander # # Date: March 23, 1995 # # Description: see skeem.icn # ############################################################################ # # skeem -- Scheme in Icon # # Various procedures: # # Booleans # Equivalence predicates # Symbols # System interface # # # Initialize # # List entries are described in skfun.icn. # procedure InitMisc() DefFunction([ BOOLEAN_P, EQUAL_P,2, EQV_P,2, EQ_P,2, LOAD, NOT, STRING_2_SYMBOL, SYMBOL_2_STRING, SYMBOL_P]) return end # # Booleans # procedure NOT(bool) return (F === bool,T) | F end procedure BOOLEAN_P(x) return (x === (T | F),T) | F end # # Equivalence predicates # procedure EQV_P(x1,x2) return (Eqv(x1,x2),T) | F end procedure EQ_P(x1,x2) return (x1 === x2,T) | F end procedure EQUAL_P(x1,x2) return (Equal(x1,x2),T) | F end procedure Eqv(x1,x2) local t1,t2 t1 := type(x1) t2 := type(x2) return { if not (("integer" | "real") ~== (t1 | t2)) then x1 = x2 else if not ("Char" ~== (t1 | t2)) then x1.value == x2.value else x1 === x2 } end procedure Equal(x1,x2) local t1,t2,i return Eqv(x1,x2) | { case (t1 := type(x1)) == (t2 := type(x2)) of { "LLPair": Equal(LLFirst(x1),LLFirst(x2)) & Equal(LLRest(x1),LLRest(x2)) "list": { not (every i := 1 to (*x1 == *x2) do if not Equal(x1[i],x2[i]) then break) } "String": x1.value == x2.value } } end # # Symbols # procedure SYMBOL_P(x) return (SymbolP(x),T) | F end procedure SYMBOL_2_STRING(sym) return String(sym) end procedure STRING_2_SYMBOL(s) return s.value end # # System interface # procedure LOAD(file) local result,f f := OpenFile(file,"r",LOAD) | fail result := ReadEvalPrint(f,"quiet") | Failure close(f) return Failure ~=== result end icon-9.4.3/ipl/packs/skeem/skdebug.icn0000664000175000017500000000145407140713043017116 0ustar chrishchrish############################################################################ # # Name: skdebug.icn # # Title: Scheme in Icon # # Author: Bob Alexander # # Date: February 19, 1995 # # Description: see skeem.icn # ############################################################################ # # skeem -- Scheme in Icon # # Debugging utility procedures (not needed for "production" version) # procedure ShowEnv(tag,env,showInitial) local frame,pair /env := CurrentEnv write("+++ Environment ",tag) every frame := LLPairs(env) do { if /showInitial & /LLRest(frame) then break write(" +++ Frame:") every pair := !sort(LLFirst(frame)) do { write(" ",Print(pair[1]),"\t",Print(pair[2])) } } return end procedure Show(x[]) every write("+++ ",Print(!x)) return end icon-9.4.3/ipl/packs/skeem/skuser.icn0000664000175000017500000000207607140713043017007 0ustar chrishchrish############################################################################ # # Name: skuser.icn # # Title: Scheme in Icon # # Author: Bob Alexander # # Date: March 23, 1995 # # Description: see skeem.icn # ############################################################################ # # skeem -- Scheme in Icon # # Initialization list for user-defined functions # # # Initialize # procedure InitUser() # # List of user-defined inialization functions to call at # skeem-initialization-time. # # Add entries to this list for your user-defined primitive functions # and syntaxes. # # Null entries are okay. The list is primed with the following # entries: # # - InitExtra: Some extra functions and syntaxes that are not # in the Scheme standard. # # - InitUser: An entry for an initialization function that can # be provided by a user (InitUser is not defined in # skeem). # return [ InitExtra, # extra functions provided -- skextra.icn InitUser] # user-defined primitive functions (not provided) end icon-9.4.3/ipl/packs/skeem/test.scm0000664000175000017500000006566707140713043016502 0ustar chrishchrish;;;; `test.scm' Test correctness of scheme implementations. ;;; Copyright (C) 1991, 1992, 1993, 1994, 1995 Aubrey Jaffer. ;;; This includes examples from ;;; William Clinger and Jonathan Rees, editors. ;;; Revised^4 Report on the Algorithmic Language Scheme ;;; and the IEEE specification. ;;; The input tests read this file expecting it to be named "test.scm". ;;; Files `tmp1', `tmp2' and `tmp3' will be created in the course of running ;;; these tests. You may need to delete them in order to run ;;; "test.scm" more than once. ;;; There are three optional tests: ;;; (TEST-CONT) tests multiple returns from call-with-current-continuation ;;; ;;; (TEST-SC4) tests procedures required by R4RS but not by IEEE ;;; ;;; (TEST-DELAY) tests DELAY and FORCE, which are not required by ;;; either standard. ;;; If you are testing a R3RS version which does not have `list?' do: ;;; (define list? #f) ;;; send corrections or additions to jaffer@ai.mit.edu or ;;; Aubrey Jaffer, 84 Pleasant St., Wakefield MA 01880, USA (define cur-section '())(define errs '()) (define SECTION (lambda args (display "SECTION") (write args) (newline) (set! cur-section args) #t)) (define record-error (lambda (e) (set! errs (cons (list cur-section e) errs)))) (define test (lambda (expect fun . args) (write (cons fun args)) (display " ==> ") ((lambda (res) (write res) (newline) (cond ((not (equal? expect res)) (record-error (list res expect (cons fun args))) (display " BUT EXPECTED ") (write expect) (newline) #f) (else #t))) (if (procedure? fun) (apply fun args) (car args))))) (define (report-errs) (newline) (if (null? errs) (display "Passed all tests") (begin (display "errors were:") (newline) (display "(SECTION (got expected (call)))") (newline) (for-each (lambda (l) (write l) (newline)) errs))) (newline)) (SECTION 2 1);; test that all symbol characters are supported. '(+ - ... !.. $.+ %.- &.! *.: /:. :+. <-. =. >. ?. ~. _. ^.) (SECTION 3 4) (define disjoint-type-functions (list boolean? char? null? number? pair? procedure? string? symbol? vector?)) (define type-examples (list #t #f #\a '() 9739 '(test) record-error "test" "" 'test '#() '#(a b c) )) (define i 1) (for-each (lambda (x) (display (make-string i #\ )) (set! i (+ 3 i)) (write x) (newline)) disjoint-type-functions) (define type-matrix (map (lambda (x) (let ((t (map (lambda (f) (f x)) disjoint-type-functions))) (write t) (write x) (newline) t)) type-examples)) (SECTION 4 1 2) (test '(quote a) 'quote (quote 'a)) (test '(quote a) 'quote ''a) (SECTION 4 1 3) (test 12 (if #f + *) 3 4) (SECTION 4 1 4) (test 8 (lambda (x) (+ x x)) 4) (define reverse-subtract (lambda (x y) (- y x))) (test 3 reverse-subtract 7 10) (define add4 (let ((x 4)) (lambda (y) (+ x y)))) (test 10 add4 6) (test '(3 4 5 6) (lambda x x) 3 4 5 6) (test '(5 6) (lambda (x y . z) z) 3 4 5 6) (SECTION 4 1 5) (test 'yes 'if (if (> 3 2) 'yes 'no)) (test 'no 'if (if (> 2 3) 'yes 'no)) (test '1 'if (if (> 3 2) (- 3 2) (+ 3 2))) (SECTION 4 1 6) (define x 2) (test 3 'define (+ x 1)) (set! x 4) (test 5 'set! (+ x 1)) (SECTION 4 2 1) (test 'greater 'cond (cond ((> 3 2) 'greater) ((< 3 2) 'less))) (test 'equal 'cond (cond ((> 3 3) 'greater) ((< 3 3) 'less) (else 'equal))) (test 2 'cond (cond ((assv 'b '((a 1) (b 2))) => cadr) (else #f))) (test 'composite 'case (case (* 2 3) ((2 3 5 7) 'prime) ((1 4 6 8 9) 'composite))) (test 'consonant 'case (case (car '(c d)) ((a e i o u) 'vowel) ((w y) 'semivowel) (else 'consonant))) (test #t 'and (and (= 2 2) (> 2 1))) (test #f 'and (and (= 2 2) (< 2 1))) (test '(f g) 'and (and 1 2 'c '(f g))) (test #t 'and (and)) (test #t 'or (or (= 2 2) (> 2 1))) (test #t 'or (or (= 2 2) (< 2 1))) (test #f 'or (or #f #f #f)) (test #f 'or (or)) (test '(b c) 'or (or (memq 'b '(a b c)) (+ 3 0))) (SECTION 4 2 2) (test 6 'let (let ((x 2) (y 3)) (* x y))) (test 35 'let (let ((x 2) (y 3)) (let ((x 7) (z (+ x y))) (* z x)))) (test 70 'let* (let ((x 2) (y 3)) (let* ((x 7) (z (+ x y))) (* z x)))) (test #t 'letrec (letrec ((even? (lambda (n) (if (zero? n) #t (odd? (- n 1))))) (odd? (lambda (n) (if (zero? n) #f (even? (- n 1)))))) (even? 88))) (define x 34) (test 5 'let (let ((x 3)) (define x 5) x)) (test 34 'let x) (test 6 'let (let () (define x 6) x)) (test 34 'let x) (test 7 'let* (let* ((x 3)) (define x 7) x)) (test 34 'let* x) (test 8 'let* (let* () (define x 8) x)) (test 34 'let* x) (test 9 'letrec (letrec () (define x 9) x)) (test 34 'letrec x) (test 10 'letrec (letrec ((x 3)) (define x 10) x)) (test 34 'letrec x) (SECTION 4 2 3) (define x 0) (test 6 'begin (begin (set! x 5) (+ x 1))) (SECTION 4 2 4) (test '#(0 1 2 3 4) 'do (do ((vec (make-vector 5)) (i 0 (+ i 1))) ((= i 5) vec) (vector-set! vec i i))) (test 25 'do (let ((x '(1 3 5 7 9))) (do ((x x (cdr x)) (sum 0 (+ sum (car x)))) ((null? x) sum)))) (test 1 'let (let foo () 1)) (test '((6 1 3) (-5 -2)) 'let (let loop ((numbers '(3 -2 1 6 -5)) (nonneg '()) (neg '())) (cond ((null? numbers) (list nonneg neg)) ((negative? (car numbers)) (loop (cdr numbers) nonneg (cons (car numbers) neg))) (else (loop (cdr numbers) (cons (car numbers) nonneg) neg))))) (SECTION 4 2 6) (test '(list 3 4) 'quasiquote `(list ,(+ 1 2) 4)) (test '(list a (quote a)) 'quasiquote (let ((name 'a)) `(list ,name ',name))) (test '(a 3 4 5 6 b) 'quasiquote `(a ,(+ 1 2) ,@(map abs '(4 -5 6)) b)) (test '((foo 7) . cons) 'quasiquote `((foo ,(- 10 3)) ,@(cdr '(c)) . ,(car '(cons)))) ;;; sqt is defined here because not all implementations are required to ;;; support it. (define (sqt x) (do ((i 0 (+ i 1))) ((> (* i i) x) (- i 1)))) (test '#(10 5 2 4 3 8) 'quasiquote `#(10 5 ,(sqt 4) ,@(map sqt '(16 9)) 8)) (test 5 'quasiquote `,(+ 2 3)) (test '(a `(b ,(+ 1 2) ,(foo 4 d) e) f) 'quasiquote `(a `(b ,(+ 1 2) ,(foo ,(+ 1 3) d) e) f)) (test '(a `(b ,x ,'y d) e) 'quasiquote (let ((name1 'x) (name2 'y)) `(a `(b ,,name1 ,',name2 d) e))) (test '(list 3 4) 'quasiquote (quasiquote (list (unquote (+ 1 2)) 4))) (test '`(list ,(+ 1 2) 4) 'quasiquote '(quasiquote (list (unquote (+ 1 2)) 4))) (SECTION 5 2 1) (define add3 (lambda (x) (+ x 3))) (test 6 'define (add3 3)) (define first car) (test 1 'define (first '(1 2))) (SECTION 5 2 2) (test 45 'define (let ((x 5)) (define foo (lambda (y) (bar x y))) (define bar (lambda (a b) (+ (* a b) a))) (foo (+ x 3)))) (define x 34) (define (foo) (define x 5) x) (test 5 foo) (test 34 'define x) (define foo (lambda () (define x 5) x)) (test 5 foo) (test 34 'define x) (define (foo x) ((lambda () (define x 5) x)) x) (test 88 foo 88) (test 4 foo 4) (test 34 'define x) (SECTION 6 1) (test #f not #t) (test #f not 3) (test #f not (list 3)) (test #t not #f) (test #f not '()) (test #f not (list)) (test #f not 'nil) (test #t boolean? #f) (test #f boolean? 0) (test #f boolean? '()) (SECTION 6 2) (test #t eqv? 'a 'a) (test #f eqv? 'a 'b) (test #t eqv? 2 2) (test #t eqv? '() '()) (test #t eqv? '10000 '10000) (test #f eqv? (cons 1 2)(cons 1 2)) (test #f eqv? (lambda () 1) (lambda () 2)) (test #f eqv? #f 'nil) (let ((p (lambda (x) x))) (test #t eqv? p p)) (define gen-counter (lambda () (let ((n 0)) (lambda () (set! n (+ n 1)) n)))) (let ((g (gen-counter))) (test #t eqv? g g)) (test #f eqv? (gen-counter) (gen-counter)) (letrec ((f (lambda () (if (eqv? f g) 'f 'both))) (g (lambda () (if (eqv? f g) 'g 'both)))) (test #f eqv? f g)) (test #t eq? 'a 'a) (test #f eq? (list 'a) (list 'a)) (test #t eq? '() '()) (test #t eq? car car) (let ((x '(a))) (test #t eq? x x)) (let ((x '#())) (test #t eq? x x)) (let ((x (lambda (x) x))) (test #t eq? x x)) (test #t equal? 'a 'a) (test #t equal? '(a) '(a)) (test #t equal? '(a (b) c) '(a (b) c)) (test #t equal? "abc" "abc") (test #t equal? 2 2) (test #t equal? (make-vector 5 'a) (make-vector 5 'a)) (SECTION 6 3) (test '(a b c d e) 'dot '(a . (b . (c . (d . (e . ())))))) (define x (list 'a 'b 'c)) (define y x) (and list? (test #t list? y)) (set-cdr! x 4) (test '(a . 4) 'set-cdr! x) (test #t eqv? x y) (test '(a b c . d) 'dot '(a . (b . (c . d)))) (and list? (test #f list? y)) (and list? (let ((x (list 'a))) (set-cdr! x x) (test #f 'list? (list? x)))) (test #t pair? '(a . b)) (test #t pair? '(a . 1)) (test #t pair? '(a b c)) (test #f pair? '()) (test #f pair? '#(a b)) (test '(a) cons 'a '()) (test '((a) b c d) cons '(a) '(b c d)) (test '("a" b c) cons "a" '(b c)) (test '(a . 3) cons 'a 3) (test '((a b) . c) cons '(a b) 'c) (test 'a car '(a b c)) (test '(a) car '((a) b c d)) (test 1 car '(1 . 2)) (test '(b c d) cdr '((a) b c d)) (test 2 cdr '(1 . 2)) (test '(a 7 c) list 'a (+ 3 4) 'c) (test '() list) (test 3 length '(a b c)) (test 3 length '(a (b) (c d e))) (test 0 length '()) (test '(x y) append '(x) '(y)) (test '(a b c d) append '(a) '(b c d)) (test '(a (b) (c)) append '(a (b)) '((c))) (test '() append) (test '(a b c . d) append '(a b) '(c . d)) (test 'a append '() 'a) (test '(c b a) reverse '(a b c)) (test '((e (f)) d (b c) a) reverse '(a (b c) d (e (f)))) (test 'c list-ref '(a b c d) 2) (test '(a b c) memq 'a '(a b c)) (test '(b c) memq 'b '(a b c)) (test '#f memq 'a '(b c d)) (test '#f memq (list 'a) '(b (a) c)) (test '((a) c) member (list 'a) '(b (a) c)) (test '(101 102) memv 101 '(100 101 102)) (define e '((a 1) (b 2) (c 3))) (test '(a 1) assq 'a e) (test '(b 2) assq 'b e) (test #f assq 'd e) (test #f assq (list 'a) '(((a)) ((b)) ((c)))) (test '((a)) assoc (list 'a) '(((a)) ((b)) ((c)))) (test '(5 7) assv 5 '((2 3) (5 7) (11 13))) (SECTION 6 4) (test #t symbol? 'foo) (test #t symbol? (car '(a b))) (test #f symbol? "bar") (test #t symbol? 'nil) (test #f symbol? '()) (test #f symbol? #f) ;;; But first, what case are symbols in? Determine the standard case: (define char-standard-case char-upcase) (if (string=? (symbol->string 'A) "a") (set! char-standard-case char-downcase)) (test #t 'standard-case (string=? (symbol->string 'a) (symbol->string 'A))) (test #t 'standard-case (or (string=? (symbol->string 'a) "A") (string=? (symbol->string 'A) "a"))) (define (str-copy s) (let ((v (make-string (string-length s)))) (do ((i (- (string-length v) 1) (- i 1))) ((< i 0) v) (string-set! v i (string-ref s i))))) (define (string-standard-case s) (set! s (str-copy s)) (do ((i 0 (+ 1 i)) (sl (string-length s))) ((>= i sl) s) (string-set! s i (char-standard-case (string-ref s i))))) (test (string-standard-case "flying-fish") symbol->string 'flying-fish) (test (string-standard-case "martin") symbol->string 'Martin) (test "Malvina" symbol->string (string->symbol "Malvina")) (test #t 'standard-case (eq? 'a 'A)) (define x (string #\a #\b)) (define y (string->symbol x)) (string-set! x 0 #\c) (test "cb" 'string-set! x) (test "ab" symbol->string y) (test y string->symbol "ab") (test #t eq? 'mISSISSIppi 'mississippi) (test #f 'string->symbol (eq? 'bitBlt (string->symbol "bitBlt"))) (test 'JollyWog string->symbol (symbol->string 'JollyWog)) (SECTION 6 5 5) (test #t number? 3) (test #t complex? 3) (test #t real? 3) (test #t rational? 3) (test #t integer? 3) (test #t exact? 3) (test #f inexact? 3) (test #t = 22 22 22) (test #t = 22 22) (test #f = 34 34 35) (test #f = 34 35) (test #t > 3 -6246) (test #f > 9 9 -2424) (test #t >= 3 -4 -6246) (test #t >= 9 9) (test #f >= 8 9) (test #t < -1 2 3 4 5 6 7 8) (test #f < -1 2 3 4 4 5 6 7) (test #t <= -1 2 3 4 5 6 7 8) (test #t <= -1 2 3 4 4 5 6 7) (test #f < 1 3 2) (test #f >= 1 3 2) (test #t zero? 0) (test #f zero? 1) (test #f zero? -1) (test #f zero? -100) (test #t positive? 4) (test #f positive? -4) (test #f positive? 0) (test #f negative? 4) (test #t negative? -4) (test #f negative? 0) (test #t odd? 3) (test #f odd? 2) (test #f odd? -4) (test #t odd? -1) (test #f even? 3) (test #t even? 2) (test #t even? -4) (test #f even? -1) (test 38 max 34 5 7 38 6) (test -24 min 3 5 5 330 4 -24) (test 7 + 3 4) (test '3 + 3) (test 0 +) (test 4 * 4) (test 1 *) (test -1 - 3 4) (test -3 - 3) (test 7 abs -7) (test 7 abs 7) (test 0 abs 0) (test 5 quotient 35 7) (test -5 quotient -35 7) (test -5 quotient 35 -7) (test 5 quotient -35 -7) (test 1 modulo 13 4) (test 1 remainder 13 4) (test 3 modulo -13 4) (test -1 remainder -13 4) (test -3 modulo 13 -4) (test 1 remainder 13 -4) (test -1 modulo -13 -4) (test -1 remainder -13 -4) (define (divtest n1 n2) (= n1 (+ (* n2 (quotient n1 n2)) (remainder n1 n2)))) (test #t divtest 238 9) (test #t divtest -238 9) (test #t divtest 238 -9) (test #t divtest -238 -9) (test 4 gcd 0 4) (test 4 gcd -4 0) (test 4 gcd 32 -36) (test 0 gcd) (test 288 lcm 32 -36) (test 1 lcm) ;;;;From: fred@sce.carleton.ca (Fred J Kaudel) ;;; Modified by jaffer. (define (test-inexact) (define f3.9 (string->number "3.9")) (define f4.0 (string->number "4.0")) (define f-3.25 (string->number "-3.25")) (define f.25 (string->number ".25")) (define f4.5 (string->number "4.5")) (define f3.5 (string->number "3.5")) (define f0.0 (string->number "0.0")) (define f0.8 (string->number "0.8")) (define f1.0 (string->number "1.0")) (define wto write-test-obj) (define dto display-test-obj) (define lto load-test-obj) (newline) (display ";testing inexact numbers; ") (newline) (SECTION 6 5 5) (test #t inexact? f3.9) (test #t 'inexact? (inexact? (max f3.9 4))) (test f4.0 'max (max f3.9 4)) (test f4.0 'exact->inexact (exact->inexact 4)) (test (- f4.0) round (- f4.5)) (test (- f4.0) round (- f3.5)) (test (- f4.0) round (- f3.9)) (test f0.0 round f0.0) (test f0.0 round f.25) (test f1.0 round f0.8) (test f4.0 round f3.5) (test f4.0 round f4.5) (set! write-test-obj (list f.25 f-3.25));.25 inexact errors less likely. (set! display-test-obj (list f.25 f-3.25));.3 often has such errors (~10^-13) (set! load-test-obj (list 'define 'foo (list 'quote write-test-obj))) (test #t call-with-output-file "tmp3" (lambda (test-file) (write-char #\; test-file) (display write-test-obj test-file) (newline test-file) (write load-test-obj test-file) (output-port? test-file))) (check-test-file "tmp3") (set! write-test-obj wto) (set! display-test-obj dto) (set! load-test-obj lto) (let ((x (string->number "4195835.0")) (y (string->number "3145727.0"))) (test #t 'pentium-fdiv-bug (> f1.0 (- x (* (/ x y) y))))) (report-errs)) (define (test-bignum) (define tb (lambda (n1 n2) (= n1 (+ (* n2 (quotient n1 n2)) (remainder n1 n2))))) (newline) (display ";testing bignums; ") (newline) (section 6 5 5) (test 0 modulo -2177452800 86400) (test 0 modulo 2177452800 -86400) (test 0 modulo 2177452800 86400) (test 0 modulo -2177452800 -86400) (test #t 'remainder (tb 281474976710655 65535)) (test #t 'remainder (tb 281474976710654 65535)) (SECTION 6 5 6) (test 281474976710655 string->number "281474976710655") (test "281474976710655" number->string 281474976710655) (report-errs)) (SECTION 6 5 6) (test "0" number->string 0) (test "100" number->string 100) (test "100" number->string 256 16) (test 100 string->number "100") (test 256 string->number "100" 16) (test #f string->number "") (test #f string->number ".") (test #f string->number "d") (test #f string->number "D") (test #f string->number "i") (test #f string->number "I") (test #f string->number "3i") (test #f string->number "3I") (test #f string->number "33i") (test #f string->number "33I") (test #f string->number "3.3i") (test #f string->number "3.3I") (test #f string->number "-") (test #f string->number "+") (SECTION 6 6) (test #t eqv? '#\ #\Space) (test #t eqv? #\space '#\Space) (test #t char? #\a) (test #t char? #\() (test #t char? #\ ) (test #t char? '#\newline) (test #f char=? #\A #\B) (test #f char=? #\a #\b) (test #f char=? #\9 #\0) (test #t char=? #\A #\A) (test #t char? #\A #\B) (test #f char>? #\a #\b) (test #t char>? #\9 #\0) (test #f char>? #\A #\A) (test #t char<=? #\A #\B) (test #t char<=? #\a #\b) (test #f char<=? #\9 #\0) (test #t char<=? #\A #\A) (test #f char>=? #\A #\B) (test #f char>=? #\a #\b) (test #t char>=? #\9 #\0) (test #t char>=? #\A #\A) (test #f char-ci=? #\A #\B) (test #f char-ci=? #\a #\B) (test #f char-ci=? #\A #\b) (test #f char-ci=? #\a #\b) (test #f char-ci=? #\9 #\0) (test #t char-ci=? #\A #\A) (test #t char-ci=? #\A #\a) (test #t char-ci? #\A #\B) (test #f char-ci>? #\a #\B) (test #f char-ci>? #\A #\b) (test #f char-ci>? #\a #\b) (test #t char-ci>? #\9 #\0) (test #f char-ci>? #\A #\A) (test #f char-ci>? #\A #\a) (test #t char-ci<=? #\A #\B) (test #t char-ci<=? #\a #\B) (test #t char-ci<=? #\A #\b) (test #t char-ci<=? #\a #\b) (test #f char-ci<=? #\9 #\0) (test #t char-ci<=? #\A #\A) (test #t char-ci<=? #\A #\a) (test #f char-ci>=? #\A #\B) (test #f char-ci>=? #\a #\B) (test #f char-ci>=? #\A #\b) (test #f char-ci>=? #\a #\b) (test #t char-ci>=? #\9 #\0) (test #t char-ci>=? #\A #\A) (test #t char-ci>=? #\A #\a) (test #t char-alphabetic? #\a) (test #t char-alphabetic? #\A) (test #t char-alphabetic? #\z) (test #t char-alphabetic? #\Z) (test #f char-alphabetic? #\0) (test #f char-alphabetic? #\9) (test #f char-alphabetic? #\space) (test #f char-alphabetic? #\;) (test #f char-numeric? #\a) (test #f char-numeric? #\A) (test #f char-numeric? #\z) (test #f char-numeric? #\Z) (test #t char-numeric? #\0) (test #t char-numeric? #\9) (test #f char-numeric? #\space) (test #f char-numeric? #\;) (test #f char-whitespace? #\a) (test #f char-whitespace? #\A) (test #f char-whitespace? #\z) (test #f char-whitespace? #\Z) (test #f char-whitespace? #\0) (test #f char-whitespace? #\9) (test #t char-whitespace? #\space) (test #f char-whitespace? #\;) (test #f char-upper-case? #\0) (test #f char-upper-case? #\9) (test #f char-upper-case? #\space) (test #f char-upper-case? #\;) (test #f char-lower-case? #\0) (test #f char-lower-case? #\9) (test #f char-lower-case? #\space) (test #f char-lower-case? #\;) (test #\. integer->char (char->integer #\.)) (test #\A integer->char (char->integer #\A)) (test #\a integer->char (char->integer #\a)) (test #\A char-upcase #\A) (test #\A char-upcase #\a) (test #\a char-downcase #\A) (test #\a char-downcase #\a) (SECTION 6 7) (test #t string? "The word \"recursion\\\" has many meanings.") (test #t string? "") (define f (make-string 3 #\*)) (test "?**" 'string-set! (begin (string-set! f 0 #\?) f)) (test "abc" string #\a #\b #\c) (test "" string) (test 3 string-length "abc") (test #\a string-ref "abc" 0) (test #\c string-ref "abc" 2) (test 0 string-length "") (test "" substring "ab" 0 0) (test "" substring "ab" 1 1) (test "" substring "ab" 2 2) (test "a" substring "ab" 0 1) (test "b" substring "ab" 1 2) (test "ab" substring "ab" 0 2) (test "foobar" string-append "foo" "bar") (test "foo" string-append "foo") (test "foo" string-append "foo" "") (test "foo" string-append "" "foo") (test "" string-append) (test "" make-string 0) (test #t string=? "" "") (test #f string? "" "") (test #t string<=? "" "") (test #t string>=? "" "") (test #t string-ci=? "" "") (test #f string-ci? "" "") (test #t string-ci<=? "" "") (test #t string-ci>=? "" "") (test #f string=? "A" "B") (test #f string=? "a" "b") (test #f string=? "9" "0") (test #t string=? "A" "A") (test #t string? "A" "B") (test #f string>? "a" "b") (test #t string>? "9" "0") (test #f string>? "A" "A") (test #t string<=? "A" "B") (test #t string<=? "a" "b") (test #f string<=? "9" "0") (test #t string<=? "A" "A") (test #f string>=? "A" "B") (test #f string>=? "a" "b") (test #t string>=? "9" "0") (test #t string>=? "A" "A") (test #f string-ci=? "A" "B") (test #f string-ci=? "a" "B") (test #f string-ci=? "A" "b") (test #f string-ci=? "a" "b") (test #f string-ci=? "9" "0") (test #t string-ci=? "A" "A") (test #t string-ci=? "A" "a") (test #t string-ci? "A" "B") (test #f string-ci>? "a" "B") (test #f string-ci>? "A" "b") (test #f string-ci>? "a" "b") (test #t string-ci>? "9" "0") (test #f string-ci>? "A" "A") (test #f string-ci>? "A" "a") (test #t string-ci<=? "A" "B") (test #t string-ci<=? "a" "B") (test #t string-ci<=? "A" "b") (test #t string-ci<=? "a" "b") (test #f string-ci<=? "9" "0") (test #t string-ci<=? "A" "A") (test #t string-ci<=? "A" "a") (test #f string-ci>=? "A" "B") (test #f string-ci>=? "a" "B") (test #f string-ci>=? "A" "b") (test #f string-ci>=? "a" "b") (test #t string-ci>=? "9" "0") (test #t string-ci>=? "A" "A") (test #t string-ci>=? "A" "a") (SECTION 6 8) (test #t vector? '#(0 (2 2 2 2) "Anna")) (test #t vector? '#()) (test '#(a b c) vector 'a 'b 'c) (test '#() vector) (test 3 vector-length '#(0 (2 2 2 2) "Anna")) (test 0 vector-length '#()) (test 8 vector-ref '#(1 1 2 3 5 8 13 21) 5) (test '#(0 ("Sue" "Sue") "Anna") 'vector-set (let ((vec (vector 0 '(2 2 2 2) "Anna"))) (vector-set! vec 1 '("Sue" "Sue")) vec)) (test '#(hi hi) make-vector 2 'hi) (test '#() make-vector 0) (test '#() make-vector 0 'a) (SECTION 6 9) (test #t procedure? car) (test #f procedure? 'car) (test #t procedure? (lambda (x) (* x x))) (test #f procedure? '(lambda (x) (* x x))) (test #t call-with-current-continuation procedure?) (test 7 apply + (list 3 4)) (test 7 apply (lambda (a b) (+ a b)) (list 3 4)) (test 17 apply + 10 (list 3 4)) (test '() apply list '()) (define compose (lambda (f g) (lambda args (f (apply g args))))) (test 30 (compose sqt *) 12 75) (test '(b e h) map cadr '((a b) (d e) (g h))) (test '(5 7 9) map + '(1 2 3) '(4 5 6)) (test '#(0 1 4 9 16) 'for-each (let ((v (make-vector 5))) (for-each (lambda (i) (vector-set! v i (* i i))) '(0 1 2 3 4)) v)) (test -3 call-with-current-continuation (lambda (exit) (for-each (lambda (x) (if (negative? x) (exit x))) '(54 0 37 -3 245 19)) #t)) (define list-length (lambda (obj) (call-with-current-continuation (lambda (return) (letrec ((r (lambda (obj) (cond ((null? obj) 0) ((pair? obj) (+ (r (cdr obj)) 1)) (else (return #f)))))) (r obj)))))) (test 4 list-length '(1 2 3 4)) (test #f list-length '(a b . c)) (test '() map cadr '()) ;;; This tests full conformance of call-with-current-continuation. It ;;; is a separate test because some schemes do not support call/cc ;;; other than escape procedures. I am indebted to ;;; raja@copper.ucs.indiana.edu (Raja Sooriamurthi) for fixing this ;;; code. The function leaf-eq? compares the leaves of 2 arbitrary ;;; trees constructed of conses. (define (next-leaf-generator obj eot) (letrec ((return #f) (cont (lambda (x) (recur obj) (set! cont (lambda (x) (return eot))) (cont #f))) (recur (lambda (obj) (if (pair? obj) (for-each recur obj) (call-with-current-continuation (lambda (c) (set! cont c) (return obj))))))) (lambda () (call-with-current-continuation (lambda (ret) (set! return ret) (cont #f)))))) (define (leaf-eq? x y) (let* ((eot (list 'eot)) (xf (next-leaf-generator x eot)) (yf (next-leaf-generator y eot))) (letrec ((loop (lambda (x y) (cond ((not (eq? x y)) #f) ((eq? eot x) #t) (else (loop (xf) (yf))))))) (loop (xf) (yf))))) (define (test-cont) (newline) (display ";testing continuations; ") (newline) (SECTION 6 9) (test #t leaf-eq? '(a (b (c))) '((a) b c)) (test #f leaf-eq? '(a (b (c))) '((a) b c d)) (report-errs)) ;;; Test Optional R4RS DELAY syntax and FORCE procedure (define (test-delay) (newline) (display ";testing DELAY and FORCE; ") (newline) (SECTION 6 9) (test 3 'delay (force (delay (+ 1 2)))) (test '(3 3) 'delay (let ((p (delay (+ 1 2)))) (list (force p) (force p)))) (test 2 'delay (letrec ((a-stream (letrec ((next (lambda (n) (cons n (delay (next (+ n 1))))))) (next 0))) (head car) (tail (lambda (stream) (force (cdr stream))))) (head (tail (tail a-stream))))) (letrec ((count 0) (p (delay (begin (set! count (+ count 1)) (if (> count x) count (force p))))) (x 5)) (test 6 force p) (set! x 10) (test 6 force p)) (test 3 'force (letrec ((p (delay (if c 3 (begin (set! c #t) (+ (force p) 1))))) (c #f)) (force p))) (report-errs)) (SECTION 6 10 1) (test #t input-port? (current-input-port)) (test #t output-port? (current-output-port)) (test #t call-with-input-file "test.scm" input-port?) (define this-file (open-input-file "test.scm")) (test #t input-port? this-file) (SECTION 6 10 2) (test #\; peek-char this-file) (test #\; read-char this-file) (test '(define cur-section '()) read this-file) (test #\( peek-char this-file) (test '(define errs '()) read this-file) (close-input-port this-file) (close-input-port this-file) (define (check-test-file name) (define test-file (open-input-file name)) (test #t 'input-port? (call-with-input-file name (lambda (test-file) (test load-test-obj read test-file) (test #t eof-object? (peek-char test-file)) (test #t eof-object? (read-char test-file)) (input-port? test-file)))) (test #\; read-char test-file) (test display-test-obj read test-file) (test load-test-obj read test-file) (close-input-port test-file)) (SECTION 6 10 3) (define write-test-obj '(#t #f #\a () 9739 -3 . #((test) "te \" \" st" "" test #() b c))) (define display-test-obj '(#t #f a () 9739 -3 . #((test) te " " st test #() b c))) (define load-test-obj (list 'define 'foo (list 'quote write-test-obj))) (test #t call-with-output-file "tmp1" (lambda (test-file) (write-char #\; test-file) (display write-test-obj test-file) (newline test-file) (write load-test-obj test-file) (output-port? test-file))) (check-test-file "tmp1") (define test-file (open-output-file "tmp2")) (write-char #\; test-file) (display write-test-obj test-file) (newline test-file) (write load-test-obj test-file) (test #t output-port? test-file) (close-output-port test-file) (check-test-file "tmp2") (define (test-sc4) (newline) (display ";testing scheme 4 functions; ") (newline) (SECTION 6 7) (test '(#\P #\space #\l) string->list "P l") (test '() string->list "") (test "1\\\"" list->string '(#\1 #\\ #\")) (test "" list->string '()) (SECTION 6 8) (test '(dah dah didah) vector->list '#(dah dah didah)) (test '() vector->list '#()) (test '#(dididit dah) list->vector '(dididit dah)) (test '#() list->vector '()) (SECTION 6 10 4) (load "tmp1") (test write-test-obj 'load foo) (report-errs)) (report-errs) (if (and (string->number "0.0") (inexact? (string->number "0.0"))) (test-inexact)) (let ((n (string->number "281474976710655"))) (if (and n (exact? n)) (test-bignum))) (newline) (display "To fully test continuations, Scheme 4, and DELAY/FORCE do:") (newline) (display "(test-cont) (test-sc4) (test-delay)") (newline) "last item in file" icon-9.4.3/ipl/packs/skeem/test.std0000664000175000017500000006262207314423462016504 0ustar chrishchrishCUR-SECTION ERRS SECTION RECORD-ERROR TEST REPORT-ERRS SECTION(2 1) #t (+ - ... !.. $.+ %.- &.! *.: /:. :+. <-. =. >. ?. ~. _. ^.) SECTION(3 4) #t DISJOINT-TYPE-FUNCTIONS TYPE-EXAMPLES I # # # # # # # # # # (#t #f #f #f #f #f #f #f #f)#t (#t #f #f #f #f #f #f #f #f)#f (#f #t #f #f #f #f #f #f #f)#\a (#f #f #t #f #f #f #f #f #f)() (#f #f #f #t #f #f #f #f #f)9739 (#f #f #f #f #t #f #f #f #f)(TEST) (#f #f #f #f #f #t #f #f #f)# (#f #f #f #f #f #f #t #f #f)"test" (#f #f #f #f #f #f #t #f #f)"" (#f #f #f #f #f #f #f #t #f)TEST (#f #f #f #f #f #f #f #f #t)#() (#f #f #f #f #f #f #f #f #t)#(A B C) TYPE-MATRIX SECTION(4 1 2) #t (QUOTE (QUOTE A)) ==> (QUOTE A) #t (QUOTE (QUOTE A)) ==> (QUOTE A) #t SECTION(4 1 3) #t (# 3 4) ==> 12 #t SECTION(4 1 4) #t (# 4) ==> 8 #t REVERSE-SUBTRACT (# 7 10) ==> 3 #t ADD4 (# 6) ==> 10 #t (# 3 4 5 6) ==> (3 4 5 6) #t (# 3 4 5 6) ==> (5 6) #t SECTION(4 1 5) #t (IF YES) ==> YES #t (IF NO) ==> NO #t (IF 1) ==> 1 #t SECTION(4 1 6) #t X (DEFINE 3) ==> 3 #t 4 (SET! 5) ==> 5 #t SECTION(4 2 1) #t (COND GREATER) ==> GREATER #t (COND EQUAL) ==> EQUAL #t (COND 2) ==> 2 #t (CASE COMPOSITE) ==> COMPOSITE #t (CASE CONSONANT) ==> CONSONANT #t (AND #t) ==> #t #t (AND #f) ==> #f #t (AND (F G)) ==> (F G) #t (AND #t) ==> #t #t (OR #t) ==> #t #t (OR #t) ==> #t #t (OR #f) ==> #f #t (OR #f) ==> #f #t (OR (B C)) ==> (B C) #t SECTION(4 2 2) #t (LET 6) ==> 6 #t (LET 35) ==> 35 #t (LET* 70) ==> 70 #t (LETREC #t) ==> #t #t X (LET 5) ==> 5 #t (LET 34) ==> 34 #t (LET 6) ==> 6 #t (LET 34) ==> 34 #t (LET* 7) ==> 7 #t (LET* 34) ==> 34 #t (LET* 8) ==> 8 #t (LET* 34) ==> 34 #t (LETREC 9) ==> 9 #t (LETREC 34) ==> 34 #t (LETREC 10) ==> 10 #t (LETREC 34) ==> 34 #t SECTION(4 2 3) #t X (BEGIN 6) ==> 6 #t SECTION(4 2 4) #t (DO #(0 1 2 3 4)) ==> #(0 1 2 3 4) #t (DO 25) ==> 25 #t (LET 1) ==> 1 #t (LET ((6 1 3) (-5 -2))) ==> ((6 1 3) (-5 -2)) #t SECTION(4 2 6) #t (QUASIQUOTE (LIST 3 4)) ==> (LIST 3 4) #t (QUASIQUOTE (LIST A (QUOTE A))) ==> (LIST A (QUOTE A)) #t (QUASIQUOTE (A 3 4 5 6 B)) ==> (A 3 4 5 6 B) #t (QUASIQUOTE ((FOO 7) . CONS)) ==> ((FOO 7) . CONS) #t SQT (QUASIQUOTE #(10 5 2 4 3 8)) ==> #(10 5 2 4 3 8) #t (QUASIQUOTE 5) ==> 5 #t (QUASIQUOTE (A (QUASIQUOTE (B (UNQUOTE (+ 1 2)) (UNQUOTE (FOO 4 D)) E)) F)) ==> (A (QUASIQUOTE (B (UNQUOTE (+ 1 2)) (UNQUOTE (FOO 4 D)) E)) F) #t (QUASIQUOTE (A (QUASIQUOTE (B (UNQUOTE X) (UNQUOTE (QUOTE Y)) D)) E)) ==> (A (QUASIQUOTE (B (UNQUOTE X) (UNQUOTE (QUOTE Y)) D)) E) #t (QUASIQUOTE (LIST 3 4)) ==> (LIST 3 4) #t (QUASIQUOTE (QUASIQUOTE (LIST (UNQUOTE (+ 1 2)) 4))) ==> (QUASIQUOTE (LIST (UNQUOTE (+ 1 2)) 4)) #t SECTION(5 2 1) #t ADD3 (DEFINE 6) ==> 6 #t FIRST (DEFINE 1) ==> 1 #t SECTION(5 2 2) #t (DEFINE 45) ==> 45 #t X FOO (#) ==> 5 #t (DEFINE 34) ==> 34 #t FOO (#) ==> 5 #t (DEFINE 34) ==> 34 #t FOO (# 88) ==> 88 #t (# 4) ==> 4 #t (DEFINE 34) ==> 34 #t SECTION(6 1) #t (# #t) ==> #f #t (# 3) ==> #f #t (# (3)) ==> #f #t (# #f) ==> #t #t (# ()) ==> #f #t (# ()) ==> #f #t (# NIL) ==> #f #t (# #f) ==> #t #t (# 0) ==> #f #t (# ()) ==> #f #t SECTION(6 2) #t (# A A) ==> #t #t (# A B) ==> #f #t (# 2 2) ==> #t #t (# () ()) ==> #t #t (# 10000 10000) ==> #t #t (# (1 . 2) (1 . 2)) ==> #f #t (# # #) ==> #f #t (# #f NIL) ==> #f #t (# # #) ==> #t #t GEN-COUNTER (# # #) ==> #t #t (# # #) ==> #f #t (# # #) ==> #f #t (# A A) ==> #t #t (# (A) (A)) ==> #f #t (# () ()) ==> #t #t (# # #) ==> #t #t (# (A) (A)) ==> #t #t (# #() #()) ==> #t #t (# # #) ==> #t #t (# A A) ==> #t #t (# (A) (A)) ==> #t #t (# (A (B) C) (A (B) C)) ==> #t #t (# "abc" "abc") ==> #t #t (# 2 2) ==> #t #t (# #(A A A A A) #(A A A A A)) ==> #t #t SECTION(6 3) #t (DOT (A B C D E)) ==> (A B C D E) #t X Y (# (A B C)) ==> #t #t 4 (SET-CDR! (A . 4)) ==> (A . 4) #t (# (A . 4) (A . 4)) ==> #t #t (DOT (A B C . D)) ==> (A B C . D) #t (# (A . 4)) ==> #f #t (LIST? #f) ==> #f #t (# (A . B)) ==> #t #t (# (A . 1)) ==> #t #t (# (A B C)) ==> #t #t (# ()) ==> #f #t (# #(A B)) ==> #f #t (# A ()) ==> (A) #t (# (A) (B C D)) ==> ((A) B C D) #t (# "a" (B C)) ==> ("a" B C) #t (# A 3) ==> (A . 3) #t (# (A B) C) ==> ((A B) . C) #t (# (A B C)) ==> A #t (# ((A) B C D)) ==> (A) #t (# (1 . 2)) ==> 1 #t (# ((A) B C D)) ==> (B C D) #t (# (1 . 2)) ==> 2 #t (# A 7 C) ==> (A 7 C) #t (#) ==> () #t (# (A B C)) ==> 3 #t (# (A (B) (C D E))) ==> 3 #t (# ()) ==> 0 #t (# (X) (Y)) ==> (X Y) #t (# (A) (B C D)) ==> (A B C D) #t (# (A (B)) ((C))) ==> (A (B) (C)) #t (#) ==> () #t (# (A B) (C . D)) ==> (A B C . D) #t (# () A) ==> A #t (# (A B C)) ==> (C B A) #t (# (A (B C) D (E (F)))) ==> ((E (F)) D (B C) A) #t (# (A B C D) 2) ==> C #t (# A (A B C)) ==> (A B C) #t (# B (A B C)) ==> (B C) #t (# A (B C D)) ==> #f #t (# (A) (B (A) C)) ==> #f #t (# (A) (B (A) C)) ==> ((A) C) #t (# 101 (100 101 102)) ==> (101 102) #t E (# A ((A 1) (B 2) (C 3))) ==> (A 1) #t (# B ((A 1) (B 2) (C 3))) ==> (B 2) #t (# D ((A 1) (B 2) (C 3))) ==> #f #t (# (A) (((A)) ((B)) ((C)))) ==> #f #t (# (A) (((A)) ((B)) ((C)))) ==> ((A)) #t (# 5 ((2 3) (5 7) (11 13))) ==> (5 7) #t SECTION(6 4) #t (# FOO) ==> #t #t (# A) ==> #t #t (# "bar") ==> #f #t (# NIL) ==> #t #t (# ()) ==> #f #t (# #f) ==> #f #t CHAR-STANDARD-CASE #f (STANDARD-CASE #t) ==> #t #t (STANDARD-CASE #t) ==> #t #t STR-COPY STRING-STANDARD-CASE (# FLYING-FISH) ==> "FLYING-FISH" #t (# MARTIN) ==> "MARTIN" #t (# |Malvina|) ==> "Malvina" #t (STANDARD-CASE #t) ==> #t #t X Y "cb" (STRING-SET! "cb") ==> "cb" #t (# |ab|) ==> "ab" #t (# "ab") ==> |ab| #t (# MISSISSIPPI MISSISSIPPI) ==> #t #t (STRING->SYMBOL #f) ==> #f #t (# "JOLLYWOG") ==> JOLLYWOG #t SECTION(6 5 5) #t (# 3) ==> #t #t (# 3) ==> #t #t (# 3) ==> #t #t (# 3) ==> #t #t (# 3) ==> #t #t (# 3) ==> #t #t (# 3) ==> #f #t (# 22 22 22) ==> #t #t (# 22 22) ==> #t #t (# 34 34 35) ==> #f #t (# 34 35) ==> #f #t (# 3 -6246) ==> #t #t (# 9 9 -2424) ==> #f #t (# 3 -4 -6246) ==> #t #t (# 9 9) ==> #t #t (# 8 9) ==> #f #t (# -1 2 3 4 5 6 7 8) ==> #t #t (# -1 2 3 4 4 5 6 7) ==> #f #t (# -1 2 3 4 5 6 7 8) ==> #t #t (# -1 2 3 4 4 5 6 7) ==> #t #t (# 1 3 2) ==> #f #t (# 1 3 2) ==> #f #t (# 0) ==> #t #t (# 1) ==> #f #t (# -1) ==> #f #t (# -100) ==> #f #t (# 4) ==> #t #t (# -4) ==> #f #t (# 0) ==> #f #t (# 4) ==> #f #t (# -4) ==> #t #t (# 0) ==> #f #t (# 3) ==> #t #t (# 2) ==> #f #t (# -4) ==> #f #t (# -1) ==> #t #t (# 3) ==> #f #t (# 2) ==> #t #t (# -4) ==> #t #t (# -1) ==> #f #t (# 34 5 7 38 6) ==> 38 #t (# 3 5 5 330 4 -24) ==> -24 #t (# 3 4) ==> 7 #t (# 3) ==> 3 #t (#) ==> 0 #t (# 4) ==> 4 #t (#) ==> 1 #t (# 3 4) ==> -1 #t (# 3) ==> -3 #t (# -7) ==> 7 #t (# 7) ==> 7 #t (# 0) ==> 0 #t (# 35 7) ==> 5 #t (# -35 7) ==> -5 #t (# 35 -7) ==> -5 #t (# -35 -7) ==> 5 #t (# 13 4) ==> 1 #t (# 13 4) ==> 1 #t (# -13 4) ==> 3 #t (# -13 4) ==> -1 #t (# 13 -4) ==> -3 #t (# 13 -4) ==> 1 #t (# -13 -4) ==> -1 #t (# -13 -4) ==> -1 #t DIVTEST (# 238 9) ==> #t #t (# -238 9) ==> #t #t (# 238 -9) ==> #t #t (# -238 -9) ==> #t #t (# 0 4) ==> 4 #t (# -4 0) ==> 4 #t (# 32 -36) ==> 4 #t (#) ==> 0 #t (# 32 -36) ==> 288 #t (#) ==> 1 #t TEST-INEXACT TEST-BIGNUM SECTION(6 5 6) #t (# 0) ==> "0" #t (# 100) ==> "100" #t (# 256 16) ==> "100" #t (# "100") ==> 100 #t (# "100" 16) ==> 256 #t (# "") ==> #f #t (# ".") ==> #f #t (# "d") ==> #f #t (# "D") ==> #f #t (# "i") ==> #f #t (# "I") ==> #f #t (# "3i") ==> #f #t (# "3I") ==> #f #t (# "33i") ==> #f #t (# "33I") ==> #f #t (# "3.3i") ==> #f #t (# "3.3I") ==> #f #t (# "-") ==> #f #t (# "+") ==> #f #t SECTION(6 6) #t (# #\space #\space) ==> #t #t (# #\space #\space) ==> #t #t (# #\a) ==> #t #t (# #\() ==> #t #t (# #\space) ==> #t #t (# #\newline) ==> #t #t (# #\A #\B) ==> #f #t (# #\a #\b) ==> #f #t (# #\9 #\0) ==> #f #t (# #\A #\A) ==> #t #t (# #\A #\B) ==> #t #t (# #\a #\b) ==> #t #t (# #\9 #\0) ==> #f #t (# #\A #\A) ==> #f #t (# #\A #\B) ==> #f #t (# #\a #\b) ==> #f #t (# #\9 #\0) ==> #t #t (# #\A #\A) ==> #f #t (# #\A #\B) ==> #t #t (# #\a #\b) ==> #t #t (# #\9 #\0) ==> #f #t (# #\A #\A) ==> #t #t (# #\A #\B) ==> #f #t (# #\a #\b) ==> #f #t (# #\9 #\0) ==> #t #t (# #\A #\A) ==> #t #t (# #\A #\B) ==> #f #t (# #\a #\B) ==> #f #t (# #\A #\b) ==> #f #t (# #\a #\b) ==> #f #t (# #\9 #\0) ==> #f #t (# #\A #\A) ==> #t #t (# #\A #\a) ==> #t #t (# #\A #\B) ==> #t #t (# #\a #\B) ==> #t #t (# #\A #\b) ==> #t #t (# #\a #\b) ==> #t #t (# #\9 #\0) ==> #f #t (# #\A #\A) ==> #f #t (# #\A #\a) ==> #f #t (# #\A #\B) ==> #f #t (# #\a #\B) ==> #f #t (# #\A #\b) ==> #f #t (# #\a #\b) ==> #f #t (# #\9 #\0) ==> #t #t (# #\A #\A) ==> #f #t (# #\A #\a) ==> #f #t (# #\A #\B) ==> #t #t (# #\a #\B) ==> #t #t (# #\A #\b) ==> #t #t (# #\a #\b) ==> #t #t (# #\9 #\0) ==> #f #t (# #\A #\A) ==> #t #t (# #\A #\a) ==> #t #t (# #\A #\B) ==> #f #t (# #\a #\B) ==> #f #t (# #\A #\b) ==> #f #t (# #\a #\b) ==> #f #t (# #\9 #\0) ==> #t #t (# #\A #\A) ==> #t #t (# #\A #\a) ==> #t #t (# #\a) ==> #t #t (# #\A) ==> #t #t (# #\z) ==> #t #t (# #\Z) ==> #t #t (# #\0) ==> #f #t (# #\9) ==> #f #t (# #\space) ==> #f #t (# #\;) ==> #f #t (# #\a) ==> #f #t (# #\A) ==> #f #t (# #\z) ==> #f #t (# #\Z) ==> #f #t (# #\0) ==> #t #t (# #\9) ==> #t #t (# #\space) ==> #f #t (# #\;) ==> #f #t (# #\a) ==> #f #t (# #\A) ==> #f #t (# #\z) ==> #f #t (# #\Z) ==> #f #t (# #\0) ==> #f #t (# #\9) ==> #f #t (# #\space) ==> #t #t (# #\;) ==> #f #t (# #\0) ==> #f #t (# #\9) ==> #f #t (# #\space) ==> #f #t (# #\;) ==> #f #t (# #\0) ==> #f #t (# #\9) ==> #f #t (# #\space) ==> #f #t (# #\;) ==> #f #t (# 46) ==> #\. #t (# 65) ==> #\A #t (# 97) ==> #\a #t (# #\A) ==> #\A #t (# #\a) ==> #\A #t (# #\A) ==> #\a #t (# #\a) ==> #\a #t SECTION(6 7) #t (# "The word \"recursion\\\" has many meanings.") ==> #t #t (# "") ==> #t #t F (STRING-SET! "?**") ==> "?**" #t (# #\a #\b #\c) ==> "abc" #t (#) ==> "" #t (# "abc") ==> 3 #t (# "abc" 0) ==> #\a #t (# "abc" 2) ==> #\c #t (# "") ==> 0 #t (# "ab" 0 0) ==> "" #t (# "ab" 1 1) ==> "" #t (# "ab" 2 2) ==> "" #t (# "ab" 0 1) ==> "a" #t (# "ab" 1 2) ==> "b" #t (# "ab" 0 2) ==> "ab" #t (# "foo" "bar") ==> "foobar" #t (# "foo") ==> "foo" #t (# "foo" "") ==> "foo" #t (# "" "foo") ==> "foo" #t (#) ==> "" #t (# 0) ==> "" #t (# "" "") ==> #t #t (# "" "") ==> #f #t (# "" "") ==> #f #t (# "" "") ==> #t #t (# "" "") ==> #t #t (# "" "") ==> #t #t (# "" "") ==> #f #t (# "" "") ==> #f #t (# "" "") ==> #t #t (# "" "") ==> #t #t (# "A" "B") ==> #f #t (# "a" "b") ==> #f #t (# "9" "0") ==> #f #t (# "A" "A") ==> #t #t (# "A" "B") ==> #t #t (# "a" "b") ==> #t #t (# "9" "0") ==> #f #t (# "A" "A") ==> #f #t (# "A" "B") ==> #f #t (# "a" "b") ==> #f #t (# "9" "0") ==> #t #t (# "A" "A") ==> #f #t (# "A" "B") ==> #t #t (# "a" "b") ==> #t #t (# "9" "0") ==> #f #t (# "A" "A") ==> #t #t (# "A" "B") ==> #f #t (# "a" "b") ==> #f #t (# "9" "0") ==> #t #t (# "A" "A") ==> #t #t (# "A" "B") ==> #f #t (# "a" "B") ==> #f #t (# "A" "b") ==> #f #t (# "a" "b") ==> #f #t (# "9" "0") ==> #f #t (# "A" "A") ==> #t #t (# "A" "a") ==> #t #t (# "A" "B") ==> #t #t (# "a" "B") ==> #t #t (# "A" "b") ==> #t #t (# "a" "b") ==> #t #t (# "9" "0") ==> #f #t (# "A" "A") ==> #f #t (# "A" "a") ==> #f #t (# "A" "B") ==> #f #t (# "a" "B") ==> #f #t (# "A" "b") ==> #f #t (# "a" "b") ==> #f #t (# "9" "0") ==> #t #t (# "A" "A") ==> #f #t (# "A" "a") ==> #f #t (# "A" "B") ==> #t #t (# "a" "B") ==> #t #t (# "A" "b") ==> #t #t (# "a" "b") ==> #t #t (# "9" "0") ==> #f #t (# "A" "A") ==> #t #t (# "A" "a") ==> #t #t (# "A" "B") ==> #f #t (# "a" "B") ==> #f #t (# "A" "b") ==> #f #t (# "a" "b") ==> #f #t (# "9" "0") ==> #t #t (# "A" "A") ==> #t #t (# "A" "a") ==> #t #t SECTION(6 8) #t (# #(0 (2 2 2 2) "Anna")) ==> #t #t (# #()) ==> #t #t (# A B C) ==> #(A B C) #t (#) ==> #() #t (# #(0 (2 2 2 2) "Anna")) ==> 3 #t (# #()) ==> 0 #t (# #(1 1 2 3 5 8 13 21) 5) ==> 8 #t (VECTOR-SET #(0 ("Sue" "Sue") "Anna")) ==> #(0 ("Sue" "Sue") "Anna") #t (# 2 HI) ==> #(HI HI) #t (# 0) ==> #() #t (# 0 A) ==> #() #t SECTION(6 9) #t (# #) ==> #t #t (# CAR) ==> #f #t (# #) ==> #t #t (# (LAMBDA (X) (* X X))) ==> #f #t (# #) ==> #t #t (# # (3 4)) ==> 7 #t (# # (3 4)) ==> 7 #t (# # 10 (3 4)) ==> 17 #t (# # ()) ==> () #t COMPOSE (# 12 75) ==> 30 #t (# # ((A B) (D E) (G H))) ==> (B E H) #t (# # (1 2 3) (4 5 6)) ==> (5 7 9) #t (FOR-EACH #(0 1 4 9 16)) ==> #(0 1 4 9 16) #t (# #) ==> -3 #t LIST-LENGTH (# (1 2 3 4)) ==> 4 #t (# (A B . C)) ==> #f #t (# # ()) ==> () #t NEXT-LEAF-GENERATOR LEAF-EQ? TEST-CONT TEST-DELAY SECTION(6 10 1) #t (# #) ==> #t #t (# #) ==> #t #t (# "test.scm" #) ==> #t #t THIS-FILE (# #) ==> #t #t SECTION(6 10 2) #t (# #) ==> #\; #t (# #) ==> #\; #t (# #) ==> (DEFINE CUR-SECTION (QUOTE ())) #t (# #) ==> #\( #t (# #) ==> (DEFINE ERRS (QUOTE ())) #t # # CHECK-TEST-FILE SECTION(6 10 3) #t WRITE-TEST-OBJ DISPLAY-TEST-OBJ LOAD-TEST-OBJ (# "tmp1" #) ==> #t #t (# #) ==> (DEFINE FOO (QUOTE (#t #f #\a () 9739 -3 . #((TEST) "te \" \" st" "" TEST #() B C)))) (# #) ==> #t (# #) ==> #t (INPUT-PORT? #t) ==> #t (# #) ==> #\; (# #) ==> (#t #f A () 9739 -3 . #((TEST) TE " " ST TEST #() B C)) (# #) ==> (DEFINE FOO (QUOTE (#t #f #\a () 9739 -3 . #((TEST) "te \" \" st" "" TEST #() B C)))) # TEST-FILE # # # # (# #) ==> #t #t # (# #) ==> (DEFINE FOO (QUOTE (#t #f #\a () 9739 -3 . #((TEST) "te \" \" st" "" TEST #() B C)))) (# #) ==> #t (# #) ==> #t (INPUT-PORT? #t) ==> #t (# #) ==> #\; (# #) ==> (#t #f A () 9739 -3 . #((TEST) TE " " ST TEST #() B C)) (# #) ==> (DEFINE FOO (QUOTE (#t #f #\a () 9739 -3 . #((TEST) "te \" \" st" "" TEST #() B C)))) # TEST-SC4 Passed all tests # ;testing inexact numbers; SECTION(6 5 5) (# 3.9) ==> #t (INEXACT? #t) ==> #t (MAX 4.0) ==> 4.0 (EXACT->INEXACT 4.0) ==> 4.0 (# -4.5) ==> -4.0 (# -3.5) ==> -4.0 (# -3.9) ==> -4.0 (# 0.0) ==> 0.0 (# 0.25) ==> 0.0 (# 0.8) ==> 1.0 (# 3.5) ==> 4.0 (# 4.5) ==> 4.0 (# "tmp3" #) ==> #t (# #) ==> (DEFINE FOO (QUOTE (0.25 -3.25))) (# #) ==> #t (# #) ==> #t (INPUT-PORT? #t) ==> #t (# #) ==> #\; (# #) ==> (0.25 -3.25) (# #) ==> (DEFINE FOO (QUOTE (0.25 -3.25))) (PENTIUM-FDIV-BUG #t) ==> #t Passed all tests # ;testing bignums; SECTION(6 5 5) (# -2177452800 86400) ==> 0 (# 2177452800 -86400) ==> 0 (# 2177452800 86400) ==> 0 (# -2177452800 -86400) ==> 0 (REMAINDER #t) ==> #t (REMAINDER #t) ==> #t SECTION(6 5 6) (# "281474976710655") ==> 281474976710655 (# 281474976710655) ==> "281474976710655" Passed all tests # # To fully test continuations, Scheme 4, and DELAY/FORCE do:# # (test-cont) (test-sc4) (test-delay)# # "last item in file" icon-9.4.3/ipl/packs/skeem/skout.icn0000664000175000017500000000513407140713043016636 0ustar chrishchrish############################################################################ # # Name: skout.icn # # Title: Scheme in Icon # # Author: Bob Alexander # # Date: February 19, 1995 # # Description: see skeem.icn # ############################################################################ # # skeem -- Scheme in Icon # # Output utility procedures # procedure Print(x,display) local s,node,sep static symFirst,symRest initial { symFirst := &ucase ++ '!$%&*/:<=>?~_^' symRest := symFirst ++ &digits ++ '.+-' } return { if LLIsNull(x) then "()" else if LLIsPair(x) then { s := "(" sep := "" every node := LLPairs(x) do { s ||:= sep || Print(LLFirst(node),display) sep := " " } s ||:= if LLIsNull(LLRest(node)) then ")" else " . " || Print(LLRest(node),display) || ")" } else if x === T then "#t" else if x === F then "#f" else if x === Unbound then "#" else if x === EOFObject then "#" else if type(x) == "Promise" then "#" else if type(x) == "Port" then "#<" || (if find("w",x.option) then "output " else "input ") || image(x.file) || ">" else if VectorP(x) then { s := "#(" sep := "" every node := !x do { s ||:= sep || Print(node,display) sep := " " } s ||:= ")" } else if s := case type(x) of { "Function": PrintFunction(x,"built-in function") "Lambda": PrintFunction(x,"interpreted function") "Macro": PrintFunction(x,"macro") "Syntax": PrintFunction(x,"syntax") } then s else if StringP(x) then if \display then x.value else image(x.value) else if CharP(x) then if \display then x.value else { "#\\" || (case x.value of { " ": "space" "\t": "tab" "\n": "newline" "\b": "backspace" "\d": "delete" "\e": "escape" "\f": "formfeed" "\r": "return" "\v": "verticaltab" default: x.value }) } else if SymbolP(x) then if \display then x else { (x ? ((=("+" | "-" | "...") | (tab(any(symFirst)) & tab(many(symRest)) | &null)) & pos(0)),x) | { x ? { s := "" while s ||:= tab(upto('|\\')) do s ||:= case move(1) of { "|": "\\|" default: "\\\\" } s ||:= tab(0) } "|" || s || "|" } } else if numeric(x) then string(x) else "#" } end procedure PrintFunction(fun,fType) local p return case type(p := fun.proc) of { "LLPair": "#<" || fType || " " || (\fun.name | "???") || ">" "procedure": "#<" || image(p) || ">" default: runerr(500,type(p)) } end icon-9.4.3/ipl/packs/skeem/skin.icn0000664000175000017500000001217307140713043016436 0ustar chrishchrish############################################################################ # # Name: skin.icn # # Title: Scheme in Icon # # Author: Bob Alexander # # Date: February 19, 1995 # # Description: see skeem.icn # ############################################################################ # # skeem -- Scheme in Icon # # Input utility procedures # global BackToken # # ReadAllExprs() - Generate expressions from file f # procedure ReadAllExprs(f) "" ? (suspend |ScanExpr(FileRec(f))) end # # ReadOneExpr() - Read one expression from f. # procedure ReadOneExpr(f) local result,fRec "" ? { result := ScanExpr(fRec := FileRec(f)) seek(f,fRec.where + &pos - 1) } return result end # # StringToExpr() - Generate expressions from string s # procedure StringToExpr(s) s ? (suspend |ScanExpr()) end procedure ScanExpr(f) local token return case token := ScanToken(f) | fail of { "(": ScanList(f) "#(": ScanVector(f) !"'`," | ",@": ScanQuote(f,token) default: if type(token) == "Symbol" then token.string else token } end procedure ScanList(f) local result,token,dot result := LLNull while (token := ScanToken(f)) ~=== ")" do { if token === "." then { dot := ScanExpr(f) } else { BackToken := token result := LLPair(ScanExpr(f),result) } } return LLInvert(result,dot) end procedure ScanVector(f) local result,token result := [] while (token := ScanToken(f)) ~=== ")" do { BackToken := token put(result,ScanExpr(f)) } return result end procedure ScanQuote(f,token) return LList( case token of { "'": "QUOTE" "`": "QUASIQUOTE" ",": "UNQUOTE" ",@": "UNQUOTE-SPLICING" }, ScanExpr(f)) end procedure ScanToken(f) return 1(\.BackToken,BackToken := &null) | { # # Skip over leading white space (including comments, possibly # spanning lines). # #showscan("before space") while { tab(many(Space)) | (if pos(0) then &subject := ReadFileRec(\f)) | (if =";" then tab(0)) | (if ="#|" then { until tab(find("|#") + 2) do &subject := ReadFileRec(\f) | fail &null }) } #showscan("after space") # # Scan then token. # ScanSymbol() | ScanNumber() | ScanSpecial() | ScanString() | ScanChar() | ScanBoolean() | move(1) } end procedure ScanSymbol() static symFirst,symRest,nonSym initial { symFirst := &letters ++ '!$%&*/:<=>?~_^' symRest := symFirst ++ &digits ++ '.+-' nonSym := ~symRest } return Symbol( (match("|"),escape(quotedstring("|")[2:-1])) | map(1((tab(any(symFirst)) || (tab(many(symRest)) | "") | =("+" | "-" | "...")), (any(nonSym) | pos(0))),&lcase,&ucase)) end procedure ScanNumber() local nbr static nbrFirst,nbrRest initial { nbrFirst := &digits ++ 'eE.' nbrRest := nbrFirst ++ &letters ++ '#+-' } (nbr := ((tab(any('+-')) | "") || tab(any(nbrFirst)) | ="#" || tab(any('bodxeiBODXEI'))) || (tab(many(nbrRest)) | "") & nbr ~== ".") | fail return StringToNumber(nbr) | Error("READER","bad number: ",image(nbr)) end procedure StringToNumber(nbr,radix) local exact,sign,number,c radix := if \radix ~= 10 then radix || "r" else "" sign := "" exact := 1 map(nbr) ? return { while ="#" do case move(1) of { "b": radix := "2r" "o": radix := "8r" "d": radix := "" "x": radix := "16r" "e": exact := Round "i": exact := real default: &null # this case prevents the expression from failing } sign := tab(any('+-')) number := "" while number ||:= tab(upto('#sfdl')) do { c := move(1) number ||:= if c == "#" then { if exact === 1 then exact := real "0" } else "e" } number ||:= tab(0) #write(&errout,"+++++ exact = ",image(exact), # "; radix = ",image(radix),"; sign = ",image(sign), # "; number = ",image(number)) exact(numeric(sign || radix || number)) } end procedure ScanSpecial() return =("#(" | ",@" | !"()'`,") | (="#<",Error("READER","unreadable object #<",tab(find(">") + 1 | 0)),F) end procedure ScanBoolean() return (="#",(=!"fF",F) | (=!"tT",T)) end procedure ScanString() return String((match("\""),escape(quotedstring()[2:-1]))) end procedure ScanChar() local chName return Char((="#\\", (case map(1(chName := tab(many(&letters)),*chName > 1)) of { "space": " " "tab": "\t" "newline": "\n" "backspace": "\b" "delete": "\d" "escape": "\e" "formfeed": "\f" "return": "\r" "verticaltab": "\v" default: Error("READER","unknown character name") }) | move(1))) end record FileRec(file,where) procedure ReadFileRec(f) local line static doPrompt initial doPrompt := if find("MPW",&host) then &null else "true" f.where := where(f.file) if f.file === &input then { if \doPrompt then writes(if BreakLevel = 0 then "> " else "[" || BreakLevel || "] ") line := read() | fail ## line ? { ## if =">" | (="[" || tab(find("]") + 1)) then ## \f.where +:= &pos - 1 ## line := tab(0) ## } return line } else return read(f.file) end icon-9.4.3/ipl/packs/skeem/skio.icn0000664000175000017500000000703407140713043016437 0ustar chrishchrish############################################################################ # # Name: skio.icn # # Title: Scheme in Icon # # Author: Bob Alexander # # Date: March 23, 1995 # # Description: see skeem.icn # ############################################################################ # # skeem -- Scheme in Icon # # Output procedures # # # Initialize # # List entries are described in skfun.icn. # procedure InitIO() DefFunction([ CALL_WITH_INPUT_FILE,2, CALL_WITH_OUTPUT_FILE,2, CLOSE_INPUT_PORT, CLOSE_OUTPUT_PORT, CURRENT_INPUT_PORT,0, CURRENT_OUTPUT_PORT,0, DISPLAY,1,2, EOF_OBJECT_P, INPUT_PORT_P, NEWLINE,0,1, OPEN_INPUT_FILE, OPEN_OUTPUT_FILE, OUTPUT_PORT_P, PEEK_CHAR,0,1, READ,0,1, READ_CHAR,0,1, WITH_INPUT_FROM_FILE,2, WITH_OUTPUT_FROM_FILE,2, WRITE,1,2, WRITE_CHAR,1,2]) return end # # Input and Output # # Ports # procedure CALL_WITH_INPUT_FILE(file,func) return CallWithFile(file,func,"r",CALL_WITH_INPUT_FILE) end procedure CALL_WITH_OUTPUT_FILE(file,func) return CallWithFile(file,func,"w",CALL_WITH_OUTPUT_FILE) end procedure CallWithFile(file,func,option,funName) local f,result f := OpenFile(file,option,funName) | fail result := Apply(func,LLPair(Port(f,option))) | fail close(f) return result end procedure INPUT_PORT_P(x) return (type(x) == "Port",find("w",x.option),F) | T end procedure OUTPUT_PORT_P(x) return (type(x) == "Port",find("w",x.option),T) | F end procedure CURRENT_INPUT_PORT() return InputPortStack[1] end procedure CURRENT_OUTPUT_PORT() return OutputPortStack[1] end procedure WITH_INPUT_FROM_FILE(file,func) return WithFile(file,func,"r",WITH_INPUT_FROM_FILE,InputPortStack) end procedure WITH_OUTPUT_FROM_FILE(file,func) return WithFile(file,func,"w",WITH_OUTPUT_FROM_FILE,OutputPortStack) end procedure WithFile(file,func,option,funName,portStack) local f,result f := OpenFile(file,option,funName) | fail push(portStack,Port(f,option)) result := Apply(func,LLNull) | fail close(f) pop(portStack) return result end procedure OpenFile(file,option,funName) local fn fn := file.value | fail return open(fn,option) | Error(funName,"Can't open file ",file) end procedure OPEN_INPUT_FILE(file) return Port(OpenFile(file,"r",OPEN_INPUT_FILE),"r") end procedure OPEN_OUTPUT_FILE(file) return Port(OpenFile(file,"w",OPEN_OUTPUT_FILE),"w") end procedure CLOSE_INPUT_PORT(port) return ClosePort(port) end procedure CLOSE_OUTPUT_PORT(port) return ClosePort(port) end procedure ClosePort(port) close(port.file) return port end # # Input # procedure READ(port) local f f := (\port | InputPortStack[1]).file return ReadOneExpr(f) | EOFObject end procedure READ_CHAR(port) local f f := (\port | InputPortStack[1]).file return Char(reads(f)) | EOFObject end procedure PEEK_CHAR(port) local f f := (\port | InputPortStack[1]).file return Char(1(reads(f),seek(f,where(f) - 1))) | EOFObject end procedure EOF_OBJECT_P(x) return (x === EOFObject,T) | F end # # Output. # procedure WRITE(value,port) /port := OutputPortStack[1] writes(port.file,Print(value)) return port end procedure DISPLAY(value,port) /port := OutputPortStack[1] writes(port.file,Print(value,"display")) return port end procedure NEWLINE(port) /port := OutputPortStack[1] write(port.file) return port end procedure WRITE_CHAR(char,port) /port := OutputPortStack[1] writes(port.file,char.value) return port end icon-9.4.3/ipl/packs/skeem/skutil.icn0000664000175000017500000001057407140713043017010 0ustar chrishchrish############################################################################ # # Name: skutil.icn # # Title: Scheme in Icon # # Author: Bob Alexander # # Date: February 19, 1995 # # Description: see skeem.icn # ############################################################################ # # skeem -- Scheme in Icon # # Miscellaneous utility procedures # # # Eval() # procedure Eval(ex,env) local saveEnv,result if LLIsNull(ex) then return NIL saveEnv := CurrentEnv CurrentEnv := \env result := Eval1(ex) | Failure CurrentEnv := saveEnv return Failure ~=== result end procedure Eval1(ex) local fcn,arg return { if LLIsNotPair(ex) then { if SymbolP(ex) then GetVar(ex) | Error(ex,"unbound variable") else ex } else { fcn := Eval(LLFirst(ex)) | fail arg := LLRest(ex) if type(fcn) == ("Function" | "Lambda") then arg := EvLList(arg) | fail Apply(fcn,arg) } } end procedure Apply(fcn,arg) local value,fName,traced,fProc,oldFName,argList oldFName := FuncName FuncName := fName := \fcn.name | "" if traced := \(FTrace | fcn.traced) then write(repl(" ",&level),Print(LLPair(fName,arg))) fProc := fcn.proc (value := case type(fcn) of { "Function" | "Syntax": { argList := LLToList(arg) CheckArgs(fcn,*argList) & fProc!argList } "Lambda": { CheckArgs(fcn,LLLength(arg)) & DoLambda(fProc,arg,fcn.env) } "Macro": { CheckArgs(fcn,LLLength(arg)) & Eval(DoLambda(fProc,arg,fcn.env)) } default: Error("Invoke",Print(fcn),": can't invoke as function") }) | {/FailProc := fName; fail} if \traced then write(repl(" ",&level),fName," -> ",Print(value)) FuncName := oldFName return value end # # DoLambda() - Invoke a lambda-defined function. # procedure DoLambda(def,actuals,env) local result,arg,p,saveEnv,formals formals := LLFirst(def) saveEnv := CurrentEnv CurrentEnv := \env PushFrame() if LLIsList(formals) then { p := actuals every DefVar(LLFirst(arg := LLPairs(formals)),LLFirst(p)) do p := LLRest(p) DefVar(\LLRest(arg),p) } else DefVar(formals,actuals) result := EvalSeq(LLRest(def)) | {CurrentEnv := saveEnv; fail} CurrentEnv := saveEnv return result end procedure CheckArgs(fcn,nbrArgs) return if fcn.minArgs > nbrArgs then Error(fcn.name,"too few args") else if \fcn.maxArgs < nbrArgs then Error(fcn.name,"too many args") else nbrArgs end procedure EvalSeq(L) local value,element if /L then fail every element := LLElements(L) do value := Eval(element) | fail return value end # # EvList() - Evaluate everything in a list, producing an Icon list. # procedure EvList(L) local arglist,arg arglist := [] every arg := LLElements(L) do put(arglist,Eval(arg)) | fail return arglist end # # EvLList() - Evaluate everything in a list, producing a LList. # procedure EvLList(L) local arglist,arg arglist := LLNull every arg := LLElements(L) do arglist := LLPair(Eval(arg),arglist) | fail return LLInvert(arglist) end # # Retrieve a bound variable value, failing if none. # procedure GetVar(sym,env) /env := CurrentEnv return Unbound ~=== LLElements(env)[sym] end # # Set a currently bound variable, failing if none. # procedure SetVar(sym,value,env) local frame /env := CurrentEnv return if Unbound ~=== (frame := LLElements(env))[sym] then .(frame[sym] := value) end # # Define and set a variable in the specified environment (default current env). # procedure DefVar(sym,value,env) /env := CurrentEnv return .(LLFirst(env)[sym] := value) end procedure UndefVar(sym,env) /env := CurrentEnv delete(LLFirst(env),sym) return end procedure PushFrame(env) /env := table(Unbound) return .(CurrentEnv := LLPair(env,CurrentEnv)) end procedure PopFrame() return 1(LLFirst(CurrentEnv),CurrentEnv := LLRest(CurrentEnv)) end procedure DiscardFrame() CurrentEnv := LLRest(CurrentEnv) return end procedure Error(tag,s[]) if type(tag) == "procedure" then tag := ProcName(tag) writes(&errout,"\n### Error: ") writes(&errout,\tag," -- ") every writes(&errout,!s) write(&errout) end procedure SymbolP(x) return (type(x) == "string",x) end procedure VectorP(x) return (type(x) == "list",x) end procedure StringP(x) return (type(x) == "String",x) end procedure CharP(x) return (type(x) == "Char",x) end icon-9.4.3/ipl/packs/skeem/sklist.icn0000664000175000017500000001013707140713043017001 0ustar chrishchrish############################################################################ # # Name: sklist.icn # # Title: Scheme in Icon # # Author: Bob Alexander # # Date: March 23, 1995 # # Description: see skeem.icn # ############################################################################ # # skeem -- Scheme in Icon # # List and vector procedures # # # Initialize # # List entries are described in skfun.icn. # procedure InitList() DefFunction([ APPEND,&null, ASSOC,2, ASSQ,2, ASSV,2, CAR, CDR, CONS,2, CXXR,"CAAR", CXXR,"CADR", CXXR,"CDAR", CXXR,"CDDR", CXXR,"CAAAR", CXXR,"CAADR", CXXR,"CADAR", CXXR,"CADDR", CXXR,"CDAAR", CXXR,"CDADR", CXXR,"CDDAR", CXXR,"CDDDR", CXXR,"CAAAAR", CXXR,"CAAADR", CXXR,"CAADAR", CXXR,"CAADDR", CXXR,"CADAAR", CXXR,"CADADR", CXXR,"CADDAR", CXXR,"CADDDR", CXXR,"CDAAAR", CXXR,"CDAADR", CXXR,"CDADAR", CXXR,"CDADDR", CXXR,"CDDAAR", CXXR,"CDDADR", CXXR,"CDDDAR", CXXR,"CDDDDR", LENGTH, LIST,&null, LIST_2_VECTOR, LIST_P, LIST_REF,2, LIST_TAIL,2, MAKE_VECTOR,1,2, MEMBER,2, MEMQ,2, MEMV,2, NULL_P, PAIR_P, REVERSE, SET_CAR_BANG,2, SET_CDR_BANG,2, VECTOR,&null, VECTOR_2_LIST, VECTOR_FILL_BANG,2, VECTOR_LENGTH, VECTOR_P, VECTOR_REF,2, VECTOR_SET_BANG,3]) return end # # Pairs and lists. # procedure PAIR_P(x) return (LLIsPair(x),T) | F end procedure CONS(first,rest) return LLPair(first,rest) end procedure CAR(pair) return LLFirst(pair) end procedure CDR(pair) return LLRest(pair) end procedure SET_CAR_BANG(pair,value) return LLFirst(pair) := value end procedure SET_CDR_BANG(pair,value) return LLRest(pair) := value end ## procedure ArgErr(fName,argList,msg,argNbr) ## /argNbr := 1 ## return Error(fName,"bad argument ",argNbr,": ", ## Print(LLElement(argList,argNbr))," -- " || \msg | "") ## end procedure CXXR(lst) local result,c result := lst every c := !reverse(FuncName[2:-1]) do { result := (if c == "A" then LLFirst else LLRest)(result) } return result end procedure NULL_P(x) return (LLIsNull(x),T) | F end procedure LIST_P(x) local beenThere beenThere := set() while LLIsPair(x) do { if member(beenThere,x) then break insert(beenThere,x) x := LLRest(x) } return (LLIsNull(x),T) | F end procedure LIST(x[]) return LList!x end procedure LENGTH(lst) return LLLength(lst) end procedure APPEND(lst[]) return LLAppend!lst end procedure REVERSE(lst) return LLReverse(lst) end procedure LIST_TAIL(lst,i) return LLTail(lst,i + 1) end procedure LIST_REF(lst,i) return LLElement(lst,i + 1) end invocable "===":2 procedure MEMQ(lst,x) static eq initial eq := proc("===",2) return Member(eq,lst,x) | F end procedure MEMV(lst,x) return Member(Eqv,lst,x) | F end procedure MEMBER(lst,x) return Member(Equal,lst,x) | F end procedure Member(test,obj,L) return if /L then fail else (test(obj,LLFirst(L)),L) | Member(test,obj,LLRest(L)) end invocable "===":2 procedure ASSQ(alst,x) static eq initial eq := proc("===",2) return Assoc(eq,alst,x) | F end procedure ASSV(alst,x) return Assoc(Eqv,alst,x) | F end procedure ASSOC(alst,x) return Assoc(Equal,alst,x) | F end procedure Assoc(test,obj,L) return if /L then fail else (test(obj,LLFirst(LLFirst(L))),LLFirst(L)) | Assoc(test,obj,LLRest(L)) end # # Vectors # procedure VECTOR_P(x) return (VectorP(x),T) | F end procedure MAKE_VECTOR(len,value[]) return list(len,value[1] | F) end procedure VECTOR(x[]) return x end procedure VECTOR_LENGTH(vec) return *vec end procedure VECTOR_REF(vec,i) return vec[i + 1] end procedure VECTOR_SET_BANG(vec,i,value) return vec[i + 1] := value end procedure VECTOR_2_LIST(vec) return LList!vec end procedure LIST_2_VECTOR(lst) return LLToList(lst) end procedure VECTOR_FILL_BANG(vec,value) every !vec := value return vec end icon-9.4.3/ipl/packs/skeem/skstring.icn0000664000175000017500000001504407140713043017336 0ustar chrishchrish############################################################################ # # Name: skstring.icn # # Title: Scheme in Icon # # Author: Bob Alexander # # Date: March 23, 1995 # # Description: see skeem.icn # ############################################################################ # # skeem -- Scheme in Icon # # String and character procedures # # # Initialize # # List entries are described in skfun.icn. # procedure InitString() DefFunction([ CHAR_2_INTEGER, CHAR_ALPHABETIC_P, CHAR_CI_EQ,"twoOrMore","CHAR-CI=?", CHAR_CI_GE,"twoOrMore","CHAR-CI>=?", CHAR_CI_GT,"twoOrMore","CHAR-CI>?", CHAR_CI_LE,"twoOrMore","CHAR-CI<=?", CHAR_CI_LT,"twoOrMore","CHAR-CI?", CHAR_DOWNCASE, CHAR_EQ,"twoOrMore","CHAR=?", CHAR_GE,"twoOrMore","CHAR>=?", CHAR_GT,"twoOrMore","CHAR>?", CHAR_LE,"twoOrMore","CHAR<=?", CHAR_LOWER_CASE_P, CHAR_LT,"twoOrMore","CHAR?", CHAR_NUMERIC_P, CHAR_P, CHAR_UPCASE, CHAR_UPPER_CASE_P, CHAR_WHITESPACE_P, INTEGER_2_CHAR, LIST_2_STRING, MAKE_STRING,1,2, STRING,&null, STRING_2_EXPRESSION, STRING_2_LIST, STRING_APPEND,&null, STRING_CI_EQ,"twoOrMore","STRING-CI=?", STRING_CI_GE,"twoOrMore","STRING-CI>=?", STRING_CI_GT,"twoOrMore","STRING-CI>?", STRING_CI_LE,"twoOrMore","STRING-CI<=?", STRING_CI_LT,"twoOrMore","STRING-CI?", STRING_COPY, STRING_EQ,"twoOrMore","STRING=?", STRING_FILL_BANG,2, STRING_GE,"twoOrMore","STRING>=?", STRING_GT,"twoOrMore","STRING>?", STRING_LE,"twoOrMore","STRING<=?", STRING_LENGTH, STRING_LT,"twoOrMore","STRING?", STRING_P, STRING_REF,2, STRING_SET_BANG,3, SUBSTRING,2,3, SUBSTRING_COPY_BANG,3]) return end # # Characters # procedure CHAR_P(x) return (CharP(x),T) | F end procedure CHAR_LT(c1,c2) return STRING_LT(c1,c2) end procedure CHAR_LE(c1,c2) return STRING_LE(c1,c2) end procedure CHAR_EQ(c1,c2) return STRING_EQ(c1,c2) end procedure CHAR_GE(c1,c2) return STRING_GE(c1,c2) end procedure CHAR_GT(c1,c2) return STRING_GT(c1,c2) end procedure CHAR_NE(c1,c2) return STRING_NE(c1,c2) end procedure CHAR_CI_LT(c1,c2) return STRING_CI_LT(c1,c2) end procedure CHAR_CI_LE(c1,c2) return STRING_CI_LE(c1,c2) end procedure CHAR_CI_EQ(c1,c2) return STRING_CI_EQ(c1,c2) end procedure CHAR_CI_GE(c1,c2) return STRING_CI_GE(c1,c2) end procedure CHAR_CI_GT(c1,c2) return STRING_CI_GT(c1,c2) end procedure CHAR_CI_NE(c1,c2) return STRING_CI_NE(c1,c2) end procedure CHAR_ALPHABETIC_P(c) return (any(&letters,c.value),T) | F end procedure CHAR_NUMERIC_P(c) return (any(&digits,c.value),T) | F end procedure CHAR_WHITESPACE_P(c) return (any(' \n\f\r\l',c.value),T) | F end procedure CHAR_UPPER_CASE_P(c) return (any(&ucase,c.value),T) | F end procedure CHAR_LOWER_CASE_P(c) return (any(&lcase,c.value),T) | F end procedure CHAR_2_INTEGER(c) return ord(c.value) end procedure INTEGER_2_CHAR(c) return Char(char(c)) end procedure CHAR_UPCASE(c) return Char(map(c.value,&lcase,&ucase)) end procedure CHAR_DOWNCASE(c) return Char(map(c.value,&ucase,&lcase)) end # # Strings # procedure STRING_P(x) return (StringP(x),T) | F end procedure MAKE_STRING(len,c) return String(repl((\c).value | "\0",len)) end procedure STRING(c[]) local result result := "" every result ||:= (!c).value return String(result) end procedure STRING_LENGTH(s) return *s.value end procedure STRING_REF(s,i) return Char(s.value[i + 1]) end procedure STRING_SET_BANG(s,i,c) s.value[i + 1] := c.value return s end invocable "<<":2 procedure STRING_LT(s[]) static op initial op := proc("<<",2) return StringPredicate(s,op) end invocable "<<=":2 procedure STRING_LE(s[]) static op initial op := proc("<<=",2) return StringPredicate(s,op) end invocable "==":2 procedure STRING_EQ(s[]) static op initial op := proc("==",2) return StringPredicate(s,op) end invocable ">>=":2 procedure STRING_GE(s[]) static op initial op := proc(">>=",2) return StringPredicate(s,op) end invocable ">>":2 procedure STRING_GT(s[]) static op initial op := proc(">>",2) return StringPredicate(s,op) end invocable "~==":2 procedure STRING_NE(s[]) static op initial op := proc("~==",2) return StringPredicate(s,op) end invocable "<<":2 procedure STRING_CI_LT(s[]) static op initial op := proc("<<",2) return StringPredicateCI(s,op) end invocable "<<=":2 procedure STRING_CI_LE(s[]) static op initial op := proc("<<=",2) return StringPredicateCI(s,op) end invocable "==":2 procedure STRING_CI_EQ(s[]) static op initial op := proc("==",2) return StringPredicateCI(s,op) end invocable ">>=":2 procedure STRING_CI_GE(s[]) static op initial op := proc(">>=",2) return StringPredicateCI(s,op) end invocable ">>":2 procedure STRING_CI_GT(s[]) static op initial op := proc(">>",2) return StringPredicateCI(s,op) end invocable "~==":2 procedure STRING_CI_NE(s[]) static op initial op := proc("~==",2) return StringPredicateCI(s,op) end procedure SUBSTRING(s,i,j) return String(s.value[i + 1:\j + 1 | 0]) | Error(SUBSTRING,"indices out of range") end procedure STRING_APPEND(s[]) local result result := get(s).value | "" every result ||:= (!s).value return String(result) end procedure STRING_2_LIST(s) local result result := LLNull every result := LLPair(Char(!s.value),result) return LLInvert(result) end procedure LIST_2_STRING(lst) return STRING!LLToList(lst) end procedure STRING_COPY(s) return copy(s) end procedure STRING_FILL_BANG(s,c) s.value := repl(c.value,*s.value) return s end procedure STRING_2_EXPRESSION(s) return StringToExpr(s.value) | F end procedure SUBSTRING_COPY_BANG(s1,k,s2) local s2v,copyLen s2v := s2.value copyLen := *s1.value - k copyLen >:= *s2v s1.value[k + 1+:copyLen] := s2v return s1 end procedure StringPredicate(sList,op) local result,x result := get(sList).value every x := (!sList).value do result := op(result,x) | (if &errornumber then fail else return F) return T end procedure StringPredicateCI(sList,op) local result,x result := map(get(sList).value) every x := map((!sList).value) do result := op(result,x) | (if &errornumber then fail else return F) return T end icon-9.4.3/ipl/packs/skeem/sknumber.icn0000664000175000017500000001646107140713043017324 0ustar chrishchrish############################################################################ # # Name: sknumber.icn # # Title: Scheme in Icon # # Author: Bob Alexander # # Date: March 23, 1995 # # Description: see skeem.icn # ############################################################################ # # skeem -- Scheme in Icon # # Number procedures # # # Initialize # # List entries are described in skfun.icn. # procedure InitNumber() DefFunction([ ABS, ACOS, ADD,&null,"+", ASIN, ATAN,1,2, CEILING, COMPLEX_P, COS, DIVIDE,"oneOrMore","/", EQ,"twoOrMore","=", EVEN_P, EXACT_2_INEXACT, EXACT_P, EXP, EXPT,2, FLOOR, GCD,&null, GE,"twoOrMore",">=", GT,"twoOrMore",">", INEXACT_2_EXACT, INEXACT_P, INTEGER_P, LCM,&null, LE,"twoOrMore","<=", LOG, LT,"twoOrMore","<", MAX,"oneOrMore", MIN,"oneOrMore", MODULO,2, MULTIPLY,&null,"*", NE,"twoOrMore","<>", NEGATIVE_P, NUMBER_2_STRING,1,2, NUMBER_P, ODD_P, POSITIVE_P, QUOTIENT,2, RATIONAL_P, REAL_P, REMAINDER,2, ROUND, SIN, SQRT, STRING_2_NUMBER,1,2, SUBTRACT,"oneOrMore","-", TAN, TRUNCATE, ZERO_P]) return end # # Numbers # procedure NUMBER_P(x) return REAL_P(x) end procedure COMPLEX_P(x) return REAL_P(x) end procedure REAL_P(x) return (type(x) == ("integer" | "real"),T) | F end procedure RATIONAL_P(x) return INTEGER_P(x) end procedure INTEGER_P(x) return (type(x) == "integer",T) | F end procedure EXACT_P(x) return (type(numeric(x)) == "real",F) | T end procedure INEXACT_P(x) return (type(numeric(x)) == "real",T) | F end invocable "<":2 procedure LT(n[]) static op initial op := proc("<",2) return NumericPredicate(n,op) end invocable "<=":2 procedure LE(n[]) static op initial op := proc("<=",2) return NumericPredicate(n,op) end invocable "=":2 procedure EQ(n[]) static op initial op := proc("=",2) return NumericPredicate(n,op) end invocable ">=":2 procedure GE(n[]) static op initial op := proc(">=",2) return NumericPredicate(n,op) end invocable ">":2 procedure GT(n[]) static op initial op := proc(">",2) return NumericPredicate(n,op) end invocable "~=":2 procedure NE(n[]) static op initial op := proc("~=",2) return NumericPredicate(n,op) end procedure ZERO_P(n) return (n = 0,T) | F end procedure POSITIVE_P(n) return (n > 0,T) | F end procedure NEGATIVE_P(n) return (n < 0,T) | F end procedure ODD_P(n) return (n % 2 ~= 0,T) | F end procedure EVEN_P(n) return (n % 2 = 0,T) | F end procedure MAX(n[]) local result,x result := get(n) every x := !n do { if type(x) == "real" then result := real(result) result <:= x } return result end procedure MIN(n[]) local result,x result := get(n) every x := !n do { if type(x) == "real" then result := real(result) result >:= x } return result end invocable "+":2,"+":1 procedure ADD(n[]) static op,op1 initial { op := proc("+",2) op1 := proc("+",1) } return Arithmetic(n,op,op1,0) end invocable "*":2,"+":1 procedure MULTIPLY(n[]) static op,op1 initial { op := proc("*",2) op1 := proc("+",1) } return Arithmetic(n,op,op1,1) end invocable "-":2,"-":1 procedure SUBTRACT(n[]) static op,op1 initial { op := proc("-",2) op1 := proc("-",1) } return Arithmetic(n,op,op1) end procedure DIVIDE(n[]) return Arithmetic(n,Divide,Reciprocal) end procedure Divide(n1,n2) return n1 / ZeroDivCheck(DIVIDE,n2) end procedure Reciprocal(n) return Divide(1.0,n) end procedure ZeroDivCheck(fName,n) return if n = 0 then Error(fName,"divide by zero") else n end procedure ABS(n) return abs(n) end procedure QUOTIENT(num,den) return integer(num) / ZeroDivCheck(QUOTIENT,integer(den)) end procedure REMAINDER(num,den) return num % ZeroDivCheck(REMAINDER,den) end procedure MODULO(num,den) local result result := num % ZeroDivCheck(REMAINDER,den) if result ~= 0 then result +:= if 0 > num then 0 <= den else 0 > den return result end procedure GCD(n[]) local min,i,areal,x min := 0 < abs(!n) if /min then return 0 every i := 1 to *n do { x := numeric(n[i]) areal := type(x) == "real" min >:= 0 < (n[i] := abs(x)) } x := ((every i := min to 2 by -1 do !n % i ~= 0 | break),i) | 1 return (\areal,real(x)) | x end procedure LCM(n[]) local max,i,areal,x max := 0 every i := 1 to *n do { x := numeric(n[i]) areal := type(x) == "real" max <:= n[i] := abs(x) } if max = 0 then return 1 x := ((every i := seq(max,max) do i % !n ~= 0 | break),i) return (\areal,real(x)) | x end procedure FLOOR(n) local intn if type(n) == "integer" then return n intn := integer(n) return real(if n < 0.0 & n ~= intn then intn - 1 else intn) end procedure CEILING(n) local intn if type(n) == "integer" then return n intn := integer(n) return real(if n > 0.0 & n ~= intn then intn + 1 else intn) end procedure TRUNCATE(n) return (type(n) == "integer",n) | real(integer(n)) end procedure ROUND(n) return ( if type(n) == "integer" then n else real(Round(n))) end procedure Round(n) local intn,diff intn := integer(n) diff := abs(n) - abs(intn) return ( if diff < 0.5 then intn else if diff > 0.5 then if n < 0.0 then intn - 1 else intn + 1 else if intn % 2 = 0 then intn else if n < 0.0 then intn - 1 else intn + 1) end procedure EXP(n) return exp(n) end procedure LOG(n) return log(n) end procedure SIN(n) return sin(n) end procedure COS(n) return cos(n) end procedure TAN(n) return tan(n) end procedure ASIN(n) return asin(n) end procedure ACOS(n) return acos(n) end procedure ATAN(num,den) return atan(num,den) end procedure SQRT(n) return sqrt(n) end procedure EXPT(n1,n2) return n1 ^ n2 end procedure EXACT_2_INEXACT(n) return real(n) end procedure INEXACT_2_EXACT(n) return Round(n) end # # Numerical input and output. # procedure STRING_2_NUMBER(s,rx) return StringToNumber(s.value,rx) | F end procedure NUMBER_2_STRING(n,rx) return String( if \rx ~= 10 then AsRadix(n,rx) else string(n) ) | Error(NUMBER_2_STRING,"can't convert") end # # Procedure to return print representation of a number in specified # radix (2 - 36). # procedure AsRadix(i,radix) local result,sign static digits initial digits := &digits || &lcase if radix <= 1 then runerr(205,radix) if i = 0 then return "0" sign := (i < 0,"-") | "" i := abs(i) result := "" until i = 0 do { result := (digits[i % radix + 1] | fail) || result i /:= radix } return sign || result end procedure Arithmetic(nList,op,op1,zeroArgValue) local result,x if not nList[1] then return \zeroArgValue if not nList[2] & \op1 then return op1(nList[1]) else { result := get(nList) every x := !nList do result := op(result,x) | fail return result } end procedure NumericPredicate(nList,op) local result,x result := get(nList) every x := !nList do result := op(result,x) | (if &errornumber then fail else return F) return T end icon-9.4.3/ipl/packs/skeem/skeem.icn0000664000175000017500000000760507140713043016602 0ustar chrishchrish############################################################################ # # Name: skeem.icn # # Title: Scheme in Icon # # Author: Bob Alexander # # Date: February 19, 1995 # # Description: R4RS Scheme, with the exception that continuations # are escape procedures only (i.e. do no have unlimited # extent) # ############################################################################ # # skeem -- Scheme in Icon # # Main program, initialization, and read/eval/print procedure # link llist,escapesq,options link skfun,skbasic,skcontrl,skio,sklist,skmisc,sknumber,skstring,skextra link skutil,skin,skout #link skdebug #link ximage global GlobalEnv,UserEnv,CurrentEnv, # environments T,F,NIL,Unbound,Failure, # universal constants InputPortStack, OutputPortStack, EscapeData,FailProc,Resume,BreakLevel,FuncName, EOFObject, Space global TraceSet, # set of currently traced functions FTrace # flag for tracing all functions global TraceReader,EchoReader,NoError record String(value) # used for string datatyepe record Char(value) # used for character datatyepe record Port(file,option) # used for port datatyepe record Symbol(string,value) record Promise(proc,ready,result) record UniqueObject(name) record Value(value) record Function(proc,name,minArgs,maxArgs,traced) record Lambda(proc,name,minArgs,maxArgs,env,traced) record Macro(proc,name,minArgs,maxArgs,env,traced) record Syntax(proc,name,minArgs,maxArgs,traced) # # main() -- Analyzes the arguments and invokes the read/eval/print loop. # procedure main(arg) local fn,f Initialize(arg) if *arg = 0 then arg := ["-"] if \TraceReader then &trace := -1 every fn := !arg do { f := if fn == "-" then &input else open(fn) | stop("Can't open ",fn) ReadEvalPrint(f,,"top") } end # # Initialize() - Set up global values # procedure Initialize(arg) Options(arg) Space := ' \t\n\r\l\v\f' T := UniqueObject("#t") F := UniqueObject("#f") Unbound := UniqueObject("unbound") Failure := UniqueObject("failure") EOFObject := UniqueObject("EOF object") NIL := &null BreakLevel := 0 InputPortStack := [Port(&input,"r")] OutputPortStack := [Port(&output,"w")] TraceSet := set() GlobalEnv := PushFrame() InitFunctions() UserEnv := PushFrame() ######### ## every x := !sort(LLFirst(GlobalEnv)) do { ## y := x[2] ## sname := if ProcName(y.proc) == y.name then "" else " " || y.name ## write(right(y.minArgs,2),right(\y.maxArgs,2) | " -"," ",image(y.proc)[11:0],sname) ## } ######### return end procedure Options(arg) local opt opt := options(arg,"tre") TraceReader := opt["t"] EchoReader := opt["r"] NoError := opt["e"] return opt end # # ReadEvalPrint() -- The R/E/P loop. # procedure ReadEvalPrint(f,quiet,top) local sexpr,value,saveEnv every sexpr := ReadAllExprs(f) do { if \EchoReader then write("Read: ",Print(sexpr)) saveEnv := CurrentEnv EscapeData := Resume := &null if /NoError then &error := 1 if value := Eval(sexpr) then (if /quiet then write(Print(value))) else { # # The expression failed -- why? # if \Resume then { if /top then { if Resume === "top" then fail # (top) return 1(.Resume.value,Resume := &null) # (resume x) } if Resume ~=== "top" then { Error("READ-EVAL-PRINT","Can't resume from top level") Resume := &null } } else { EscapeCheck() # escape that doesn't exist (any more) ErrorCheck() # run-time error } CurrentEnv := saveEnv } } return value end procedure ErrorCheck() if &errornumber then { Error(FailProc,"Icon run-time error: ",&errortext, ("\n offending value:_ \n skeem representation: " || Print(&errorvalue) || "_ \n Icon representation: " || image(&errorvalue) | "")\1) FailProc := &null errorclear() } else return end icon-9.4.3/ipl/packs/skeem/skextra.icn0000664000175000017500000000600507140713043017150 0ustar chrishchrish############################################################################ # # Name: skextra.icn # # Title: Scheme in Icon # # Author: Bob Alexander # # Date: March 23, 1995 # # Description: see skeem.icn # ############################################################################ # # skeem -- Scheme in Icon # # Some additional stuff not in the standard # # # Initialize # # List entries are described in skfun.icn. # procedure InitExtra() # # Functions # DefFunction([ ADD1, ATOM_P, BREAK,0, BREAK_LEVEL,0, EVAL,1,2, QUIT,0,1, READ_LINE,0,1, RESUME,0,1, SUB1, TOP,0, TRACE,&null, UNTRACE,&null]) # # Syntaxes # DefSyntax([ DEFINE_MACRO,"twoOrMore", ITRACE, ITRACEOFF,0, ITRACEON,0, REPEAT,"oneOrMore", TRACE_ALL,0, UNLESS,"oneOrMore", WHEN,"oneOrMore"]) return end procedure EVAL(ex,env) return Eval(ex,env) end procedure QUIT(exitCode) exit(exitCode) end procedure WHEN(test,body[]) return if F ~=== (Eval(test) | fail)\1 then EvalSeq(LList!body) | fail end procedure UNLESS(test,body[]) return if F === (Eval(test) | fail)\1 then EvalSeq(LList!body) | fail end procedure REPEAT(count,body[]) local result body := LList!body every 1 to count do result := EvalSeq(body) | fail return result end procedure ATOM_P(arg) return (LLIsNotPair(arg),T) | F end procedure BREAK() local result BreakLevel +:= 1 result := ReadEvalPrint((InputPortStack[1].file | &input)\1) | Failure BreakLevel -:= 1 return Failure ~=== result end procedure BREAK_LEVEL() return BreakLevel end procedure RESUME(value) Resume := Value(\value | F) fail end procedure TOP() Resume := "top" fail end procedure TRACE(funcs[]) local fn,result,element if *funcs = 0 then { result := LLNull every result := LLPair((!sort(TraceSet)).name,result) return LLInvert(result) } else every element := !funcs do { fn := Eval(element) | fail fn.traced := "true" insert(TraceSet,fn) return NIL } end procedure UNTRACE(funcs[]) local fn,element if *funcs = 0 then { FTrace := &null every (!TraceSet).traced := &null } else every element := !funcs do { fn := Eval(element) | fail fn.traced := &null delete(TraceSet,fn) } return NIL end procedure ITRACEON() return (&trace := -1,T) end procedure ITRACEOFF() return (&trace := 0,F) end procedure ITRACE(expr) local value &trace := -1 value := Eval(expr) | Failure &trace := 0 return Failure ~=== value end procedure TRACE_ALL() return FTrace := T end procedure DEFINE_MACRO(arg) local sym,value return Error(DEFINE_MACRO,"Not implemented for now") ## return DEFINE(arg,,Macro) end procedure ADD1(n) return n + 1 end procedure SUB1(n) return n - 1 end procedure READ_LINE(port) local f f := (\port | InputPortStack[1]).file return String(read(f)) | EOFObject end icon-9.4.3/ipl/packs/skeem/skcontrl.icn0000664000175000017500000000612007140713043017324 0ustar chrishchrish############################################################################ # # Name: skcontrl.icn # # Title: Scheme in Icon # # Author: Bob Alexander # # Date: March 23, 1995 # # Description: see skeem.icn # ############################################################################ # # skeem -- Scheme in Icon # # Control procedures # # # Initialize # # List entries are described in skfun.icn. # procedure InitControl() DefFunction([ APPLY,"oneOrMore", CALL_WITH_CURRENT_CONTINUATION, CALL_WITH_CURRENT_CONTINUATION,"CALL/CC", FOR_EACH,"oneOrMore", FORCE, MAP,"twoOrMore", PROCEDURE_P]) return end # # Control features # procedure PROCEDURE_P(x) return (type(x) == ("Lambda" | "Function" | "Syntax" | "Macro"),T) | F end procedure APPLY(fcn,arg[]) local last,argList last := pull(arg) argList := LList!arg LLRest(\argList) | argList := last return Apply(fcn,argList) end procedure MAP(fcn,lsts[]) local arg,result result := LLNull repeat { arg := MapArgs(lsts) | break result := LLPair(Apply(fcn,arg),result) | fail } return LLInvert(result) end procedure MapArgs(lsts) local arg,i,x arg := LLNull every i := 1 to *lsts do { x := lsts[i] if /x then fail arg := LLPair(LLFirst(x),arg) lsts[i] := LLRest(x) } return LLInvert(arg) end procedure FOR_EACH(fcn,lsts[]) local arg,result result := F repeat { arg := MapArgs(lsts) | break result := Apply(fcn,arg) | fail } return result end procedure FORCE(promise) return Force(promise) end procedure Force(promise) local x return { if \promise.ready then promise.result else { x := Apply(promise.proc,LLNull) | fail if \promise.ready then promise.result else { promise.ready := "true" .(promise.result := x) } } } end procedure CALL_WITH_CURRENT_CONTINUATION(func) local continuationProc,checkObj static invokeContinuation,continuationExpr initial { invokeContinuation := Function(InvokeContinuation,"InvokeContinuation",3,3) continuationExpr := [LList("VALUE"), LList("INVOKE-CONTINUATION","CONT-LEVEL","VALUE","CHECK-OBJ")] } PushFrame() DefVar("CONT-LEVEL",&level) DefVar("INVOKE-CONTINUATION",invokeContinuation) DefVar("CHECK-OBJ",checkObj := CurrentEnv) # # (define continuationProc # (lambda (value) (invoke-continuaton cont-level value check-obj))) # continuationProc := LAMBDA!continuationExpr # DiscardFrame() return Apply(func,LLPair(continuationProc)) | EscapeCheck(&level,checkObj) end procedure InvokeContinuation(data[]) EscapeData := data fail end procedure EscapeCheck(level,checkObj) local escapeData if \EscapeData & (/level | EscapeData[1] = level) then { escapeData := EscapeData EscapeData := &null if /level | checkObj ~=== escapeData[3] then return Error(CALL_WITH_CURRENT_CONTINUATION, "escape procedure no longer valid (expires when its call/cc returns)") FailProc := &null return escapeData[2] } end icon-9.4.3/ipl/packs/skeem/READ_ME0000664000175000017500000000315007314423462016017 0ustar chrishchrish############################################################################ # # Name: READ_ME # # Title: Scheme in Icon # # Author: Bob Alexander # # Date: February 19, 1995 # # Description: R4RS Scheme, with the exception that continuations # are escape procedures only (i.e. do no have unlimited # extent) # # Note: Running the standard Scheme test suite requires # enlarging the Icon stack by setting MSTKSIZE. # ############################################################################ To build, translate and link all .icn files in this directory: icont *.icn Files ~~~~~ llist.icn Operations on linked lists, Lisp-style skbasic.icn Miscellaneous basic syntaxes and procedures: Literal expressions Lambda expressions Conditionals Assignments Derived expression types Binding constructs Sequencing Iteration Delayed evaluation Quasiquotation Definitions skcontrl.icn Control procedures skdebug.icn Debugging utility procedures (not needed for "production" version) skeem.icn Main program, initialization, and read/eval/print procedure skextra.icn Some additional stuff not in the standard skfun.icn Function/syntax list format & definitions skin.icn Input utility procedures skio.icn Output procedures sklist.icn List and vector procedures skmisc.icn Various procedures: Booleans Equivalence predicates Symbols System interface sknumber.icn Number procedures skout.icn Output utility procedures skstring.icn String and character procedures skuser.icn Initialization list for user-defined functions skutil.icn Miscellaneous utility procedures test.scm Standard Scheme test suite icon-9.4.3/ipl/packs/skeem/skbasic.icn0000664000175000017500000001662107140713043017113 0ustar chrishchrish############################################################################ # # Name: skbasic.icn # # Title: Scheme in Icon # # Author: Bob Alexander # # Date: March 23, 1995 # # Description: see skeem.icn # ############################################################################ # # skeem -- Scheme in Icon # # Miscellaneous basic syntaxes and procedures: # # Literal expressions # Lambda expressions # Conditionals # Assignments # Derived expression types # Binding constructs # Sequencing # Iteration # Delayed evaluation # Quasiquotation # Definitions # # # Initialize # # List entries are described in skfun.icn. # procedure InitBasic() DefSyntax([ AND,&null, BEGIN,"oneOrMore", CASE,"twoOrMore", COND,1,&null, DEFINE,"twoOrMore", DELAY, DO,"twoOrMore", IF,2,3, LAMBDA,"oneOrMore", LET,"twoOrMore", LETREC,"twoOrMore", LET_STAR_,"twoOrMore","LET*", OR,&null, QUASIQUOTE, QUOTE, SET_BANG,2]) return end # # Literal expressions # procedure QUOTE(value) return value end # # Lambda expressions # procedure LAMBDA(argList,body[]) local argListMin,argListMax if LLIsList(argList) then { argListMin := LLLength(argList) argListMax := if LLIsNull(LLRest(LLLastPair(argList))) then argListMin } else argListMin := 0 return Lambda(LList!push(body,argList),,argListMin,argListMax,CurrentEnv) end # # Conditionals # procedure IF(test,clause[]) test := Eval(test) | fail return Eval( if F ~=== test then clause[1] else (clause[2] | (return F))\1) end # # Assignments # procedure SET_BANG(var,value) return SetVar(var,Eval(value)) end # # Derived expression types # procedure COND(body[]) local clause,test,second every clause := !body do { second := LLSecond(clause) | return Error(COND,"ill-formed clause") test := LLFirst(clause) if test === "ELSE" | (test := F ~=== (Eval(test) | fail)\1) then { return { if second === "=>" then Eval(LList(LLThird(clause),LList("QUOTE",test))) else EvalSeq(LLRest(clause)) } } } return F end procedure CASE(key,body[]) local clause,dataList,exprs key := Eval(key) | fail every clause := !body do { \(exprs := LLRest(clause)) | return Error(CASE,"ill-formed clause") dataList := LLFirst(clause) if dataList === "ELSE" | Eqv(key,LLElements(dataList)) then return EvalSeq(exprs) } return F end procedure AND(arg[]) local result,element result := T every element := !arg do { result := Eval(element) | fail if result === F then break } return result end procedure OR(arg[]) local result,element result := F every element := !arg do { result := Eval(element) | fail if result ~=== F then break } return result end # # Binding constructs # procedure LET(arg[]) local result result := EvalSeq(Let1(arg)) | fail DiscardFrame() return result end procedure Let1(arg) local assignList,init,var,argList,loop,body assignList := [] if SymbolP(arg[1]) then { var := get(arg) argList := LLNull every argList := LLPair(LLFirst(LLElements(arg[1])),argList) } every init := LLElements(get(arg)) do put(assignList,LLFirst(init),Eval(LLSecond(init))) | fail PushFrame() body := LList!arg if \var then { loop := LAMBDA!push(arg,LLInvert(argList)) | fail loop.name := var DefVar(var,loop) } while DefVar(get(assignList),get(assignList)) return body end procedure LET_STAR_(inits,body[]) local init,result PushFrame() every init := LLElements(inits) do DefVar(LLFirst(init),Eval(LLSecond(init))) | {DiscardFrame(); fail} result := EvalSeq(LList!body) | {DiscardFrame(); fail} DiscardFrame() return result end procedure LETREC(inits,body[]) local init,result PushFrame() every init := LLElements(inits) do DefVar(LLFirst(init),F) every init := LLElements(inits) do SetVar(LLFirst(init),Eval(LLSecond(init))) | {DiscardFrame(); fail} result := EvalSeq(LList!body) | {DiscardFrame(); fail} DiscardFrame() return result end # # Sequencing # procedure BEGIN(sequence[]) return EvalSeq(LList!sequence) end # # Iteration # procedure DO(inits,test,body[]) local testExpr,init,update,result,initList,initEnv,commandEnv testExpr := LLFirst(test) | return Error(DO,"missing test") initList := [] every init := LLElements(inits) do put(initList,LLFirst(init),Eval(LLSecond(init))) | fail PushFrame() while DefVar(get(initList),get(initList)) body := LList!body while F === (Eval(testExpr) | {DiscardFrame(); fail})\1 do { if \body then EvalSeq(body) | {DiscardFrame(); fail} every init := LLElements(inits) do if update := LLThird(init) then put(initList,LLFirst(init),Eval(update)) | {DiscardFrame(); fail} while SetVar(get(initList),get(initList)) } result := EvalSeq(LLRest(test)) | {DiscardFrame(); fail} DiscardFrame() return result end # # Delayed evaluation # procedure DELAY(expr) return Promise(Lambda(LList(LLNull,expr),,0,0,CurrentEnv)) end # # Quasiquotation # procedure QUASIQUOTE(L) return QuasiQuote(L,0) end invocable "!":1,"|||":2 procedure QuasiQuote(x,nest) static vecElementGen,vecElementConcat initial { vecElementGen := proc("!",1) vecElementConcat := proc("|||",2) } return { if LLIsList(x) then QQExpand(x,nest,LLNull,LLPairs,LLPut,LLAppend,1,LLFirst,LLRest) else if VectorP(x) then QQExpand(x,nest,[],vecElementGen,put,vecElementConcat,LLToList,1,Fail) else x } end procedure Fail() end procedure QQExpand(lst,nest,result,elementGen,elementPut,elementConcat, createFromLList,getElement,getDot) local elt,thunk,dot every thunk := elementGen(lst) do { elt := getElement(thunk) result := { if LLIsPair(elt) then case LLFirst(elt) of { "UNQUOTE": elementPut(result, if nest = 0 then Eval(LLSecond(elt)) | fail else LList("UNQUOTE",QuasiQuote(LLSecond(elt),nest - 1))) "UNQUOTE-SPLICING": if nest = 0 then elementConcat(result, createFromLList(Eval(LLSecond(elt)))) | fail else elementPut(result, LLPair("UNQUOTE-SPLICING", QuasiQuote(LLSecond(elt),nest - 1))) "QUASIQUOTE": elementPut(result,LList("QUASIQUOTE", QuasiQuote(LLSecond(elt),nest + 1))) default: elementPut(result,QuasiQuote(elt,nest)) } else if VectorP(elt) & elt[1] === "QUASIQUOTE" then elementPut(result,["QUASIQUOTE",QuasiQuote(elt[2],nest + 1)]) else if elt === "UNQUOTE" then { (LLRest(LLLastPair(result)) | result)\1 := if nest = 0 then Eval(LLFirst(LLRest(thunk))) | fail else LList("UNQUOTE",QuasiQuote(LLFirst(LLRest(thunk)),nest - 1)) return result } else elementPut(result,QuasiQuote(elt,nest)) } } if dot := \getDot(thunk) then LLRest(result) := QuasiQuote(dot,nest) return result end # # Definitions # procedure DEFINE(sym,body[]) local value if LLIsPair(sym) then { # (define (f x) ...) -> (define f (lambda (x) ...)) value := LAMBDA!push(body,LLRest(sym)) | fail sym := LLFirst(sym) } else value := Eval(body[1]) | fail if type(value) == ("Lambda" | "Macro") then /value.name := sym DefVar(sym,value) return sym end icon-9.4.3/ipl/packs/skeem/llist.icn0000664000175000017500000000556707140713043016632 0ustar chrishchrish############################################################################ # # Name: llist.icn # # Title: Linked-list utilities, Lisp-style # # Author: Bob Alexander # # Date: February 19, 1995 # ############################################################################ # # Procedure kit supporting operations on linked lists, Lisp-style. # global LLNull record LLPair(first,rest) # # Basic list operations. # procedure LLFirst(x) return (\x).first end procedure LLRest(x) return (\x).rest end # # Predicates -- the predicates fail if false, and return their arguments if # true. Note that the returned value for the true condition might be null. # procedure LLIsNull(x) return /x end procedure LLIsPair(x) return (type(x) == "LLPair",x) end procedure LLIsNotPair(x) return (type(x) ~== "LLPair",x) end procedure LLIsList(x) return (LLIsNull | LLIsPair)(x) end procedure LLIsNotList(x) return (not (LLIsNull | LLIsPair)(x),x) end # # More list operations. # procedure LList(x[]) local ll every ll := LLPair(!x,ll) return LLInvert(ll) end procedure LLToList(ll) local result result := [] every put(result,LLElements(ll)) return result end procedure LLAppend(ll[]) local result every result := LLPair(LLElements(ll[1 to *ll - 1]),result) return LLInvert(result,ll[-1] | &null) end procedure LLSplice(ll[]) local result,x,prev every x := !ll do { result := \x (\prev).rest := x prev := LLLastPair(x) } return result end procedure LLLastPair(ll) local result every result := LLPairs(ll) return \result end procedure LLPut(ll,x) return ((\LLLastPair(ll)).rest := LLPair(x),ll) | LLPair(x) end procedure LLInvert(ll,dot) local nxt while \ll do { nxt := ll.rest ll.rest := dot dot := ll ll := nxt } return dot end procedure LLReverse(ll) local new_list every new_list := LLPair(LLElements(ll),new_list) return new_list end procedure LLElements(ll) while LLIsPair(ll) do { suspend ll.first ll := ll.rest } end procedure LLPairs(ll) while LLIsPair(ll) do { suspend ll ll := ll.rest } end procedure LLSecond(ll) return (\(\ll).rest).first end procedure LLThird(ll) return LLElement(ll,3) end procedure LLElement(ll,i) return LLTail(ll,i).first end procedure LLTail(ll,i) return 1(LLPairs(ll),(i -:= 1) = 0) end procedure LLCopy(ll) return LLInvert(LLReverse(ll)) end procedure LLLength(ll) local result result := 0 every LLPairs(ll) do result +:= 1 return result end procedure LLImage(x) local result,pair return { if /x then "()" else if LLIsPair(x) then { result := "(" every pair := LLPairs(x) do result ||:= LLImage(pair.first) || " " if /pair.rest then result[1:-1] || ")" else result || ". " || LLImage(pair.rest) || ")" } else image(x) } end icon-9.4.3/ipl/packs/tcll1/0002775000175000017500000000000010336137160014711 5ustar chrishchrishicon-9.4.3/ipl/packs/tcll1/rptperr.icn0000664000175000017500000000033607140713043017101 0ustar chrishchrish# # this is a minimal version of the error reporting procedure # needed by the parser # procedure reportParseError(t) write(&errout,"error: unexpected input ",t.body, " at line ",t.line," column ",t.column) return end icon-9.4.3/ipl/packs/tcll1/Makefile0000664000175000017500000000030107142651136016346 0ustar chrishchrishtcll1: icont -s -c xcode escape ebcdic icont -s -c gramanal ll1 semstk readll1 parsell1 scangram semgram icont -s -fs tcll1 Iexe: tcll1 cp tcll1 ../../iexe/ Clean: rm -f *.u[12] tcll1 icon-9.4.3/ipl/packs/tcll1/c_nll1.grm0000664000175000017500000000024107140713044016563 0ustar chrishchrish# c-nll1 # not LL(1) start = s . s = e . s = i "=" e . e = e "+" t . e = e "-" t . e = t . t = f "*" t . t = f "/" t . t = f . f = i . f = n . f = "(" e ")" . icon-9.4.3/ipl/packs/tcll1/escape.icn0000664000175000017500000000377607140713043016656 0ustar chrishchrish############################################################################ # # File: escape.icn # # Subject: Procedures to interpret Icon literal escapes # # Authors: William H. Mitchell; modified by Ralph E. Griswold and # Alan Beale # # Date: April 16, 1993 # ############################################################################ # # The procedure escape(s) produces a string in which Icon quoted # literal escape conventions in s are replaced by the corresponding # characters. For example, escape("\\143\\141\\164") produces the # string "cat". # ############################################################################ # # Links: ebcdic # ############################################################################ link ebcdic procedure escape(s) local ns, c ns := "" s ? { while ns ||:= tab(upto('\\')) do { move(1) ns ||:= case map(c := move(1)) | fail of { # trailing \ illegal "b": "\b" "d": "\d" "e": "\e" "f": "\f" "l": "\n" "n": "\n" "r": "\r" "t": "\t" "v": "\v" "x": hexcode() "^": ctrlcode() !"01234567": octcode() default: c # takes care of ", ', and \ } } return ns || tab(0) } end procedure hexcode() local i, s s := tab(many('0123456789ABCDEFabcdef')) | "" # get hex digits if (i := *s) > 2 then { # if too many digits, back off s := s[1:3] move(*s - i) } return char("16r" || s) end procedure octcode() local i, s move(-1) # put back first octal digit s := tab(many('01234567')) | "" # get octal digits i := *s if (i := *s) > 3 then { # back off if too large s := s[1:4] move(*s - i) } if s > 377 then { # still could be too large s := s[1:3] move(-1) } return char("8r" || s) end procedure ctrlcode(s) return Control(move(1)) end icon-9.4.3/ipl/packs/tcll1/semgram.icn0000664000175000017500000000454707140713043017046 0ustar chrishchrish# Semantics routines called while parsing the input # grammar to TCLL1. # (written by Thomas W. Christopher) procedure FirstAlt() push(semanticsStack,[pop(semanticsStack)]) return end procedure NextAlt() local r r:=pop(semanticsStack) pop(semanticsStack) # | put(semanticsStack[1],r) return end procedure DeclAction() pop(semanticsStack) # ! declareAction(semanticsStack[1].body) return end #procedure edit_rhs(rhs) #local s #r:=[] #every s:=!rhs do put(r,s.body) #return #end global lhsymb procedure DeclProduction() local i,a,r pop(semanticsStack) # . a:=pop(semanticsStack) pop(semanticsStack) # = i:=pop(semanticsStack) every r := !a do declareProduction(i,r) return end procedure Group() local a,lp,lhs,r pop(semanticsStack) a:=pop(semanticsStack) lp:=pop(semanticsStack) lhs:=lhsymb||"_"||lp.line||"_"||lp.column every r := !a do declareProduction(lhs,r) push(semanticsStack,Token("ID",lhs,lp.line,lp.column)) return end procedure Option() local a,lp,lhs,r pop(semanticsStack) a:=pop(semanticsStack) lp:=pop(semanticsStack) lhs:=lhsymb||"_"||lp.line||"_"||lp.column every r := !a do declareProduction(lhs,r) declareProduction(lhs,[]) push(semanticsStack,Token("ID",lhs,lp.line,lp.column)) return end procedure Repeat() local a,lp,lhs,r pop(semanticsStack) a:=pop(semanticsStack) lp:=pop(semanticsStack) lhs:=lhsymb||"_"||lp.line||"_"||lp.column every r := !a do declareProduction(lhs,r|||[lhs]) declareProduction(lhs,[]) push(semanticsStack,Token("ID",lhs,lp.line,lp.column)) return end procedure StartRHS() push(semanticsStack,[]) return end procedure ExtendRHS() local s s:=pop(semanticsStack).body put(semanticsStack[1],s) return end procedure DeclLHS() lhsymb:=pop(semanticsStack).body push(semanticsStack,lhsymb) return end procedure DeclSymbols() local l,r,s pop(semanticsStack) # . r := pop(semanticsStack) pop(semanticsStack) # : l := pop(semanticsStack) map(l,&ucase,&lcase) ? if ="s" then { if not (="tart"&pos(0)) then warning(l,"--\"start\" assumed") declareStartSymbol(r[1]) } else if ="e" then { if not (="oi"&pos(0)) then warning(l,"--\"EOI\" assumed") declareEOI(r[1]) } else if ="f" then { if not (="iducial") then warning(l,"--\"fiducials\" assumed") every declareFiducial(!r) } else if ="a" then { if not (="ction") then warning(l,"--\"actions\" assumed") every declareAction(!r) } else error(l,"--unknown declaration") return end icon-9.4.3/ipl/packs/tcll1/e.grm0000664000175000017500000000012507140713044015640 0ustar chrishchrishstart = e . e = t { ("+" | "-") t } . t = f [ ("*" | "/") t ]. f = i | "(" e ")" . icon-9.4.3/ipl/packs/tcll1/NOTICE0000664000175000017500000000035307140713044015614 0ustar chrishchrishIn order to comply with the file-naming requirements for CD-ROM production, dashes in file names have been converted to underscores. You may find references to file names with dashes in the documentation; use the underscore versions. icon-9.4.3/ipl/packs/tcll1/scangram.icn0000664000175000017500000000332607140713043017200 0ustar chrishchrish# Scanner for the input language used by TCLL1, # an LL(1) parser generator). # (written by Dr. Thomas W. Christopher) # global inputFile global inputLine,inputLineNumber,inputColumn,eoiToken global tokenTypes procedure initScanner(filename) inputFile := open(filename,"r") | fail return end procedure scan() local t,c,b static whiteSpace,initIdChars,idChars initial { /inputFile:=&input inputLineNumber:=0 inputColumn:=1 inputLine:="" eoiToken:=&null whiteSpace:=&ascii[1:34] #control ++ blank initIdChars := &letters ++ '_' idChars := &letters ++ &digits ++ '_' tokenTypes := table() t := [ ".","DOT", ":","COLON", "=","EQ", "|","BAR", "(","LPAR", ")","RPAR", "[","LBRACK", "]","RBRACK", "{","LBRACE", "}","RBRACE", "!","BANG"] while tokenTypes[get(t)] := get(t) } if \eoiToken then return eoiToken repeat inputLine ? { tab(inputColumn) tab(many(whiteSpace)) c := &pos if any(initIdChars) then { t := Token("ID",tab(many(idChars)), inputLineNumber,c) inputColumn := &pos return t } else if b := tab(any('.:=()[]{}|!')) then { inputColumn := &pos return Token(tokenTypes[b],b,inputLineNumber,c) } else if ="#" | pos(0) then { inputColumn := 1 inputLineNumber +:= 1 if not (inputLine := read(inputFile)) then { eoiToken := Token("EOI","EOI", inputLineNumber,1) return eoiToken } } else if ="\"" then { if t := Token("ID",tab(find("\"")), inputLineNumber,c) then { move(1) } else { write("unterminated quote at ", inputLineNumber," ",c) t:=Token("ID",tab(many(~whiteSpace)), inputLineNumber,c) } inputColumn := &pos return t } else { write("unexpected character: ",move(1), " at ",inputLineNumber," ",c) inputColumn := &pos } } end icon-9.4.3/ipl/packs/tcll1/README0000664000175000017500000000550607142572462015606 0ustar chrishchrish TCLL1 The TCLL1 Parser Generator and Parser (TC: "Tools of Computing") BUILD1.BAT MS-DOS batch file to compile TCLL1. It should be able to execute as a shell script under UNIX. TCLL1.ICN main program for TCLL1 LL1.ICN LL(1) parser generation routines SCANGRAM.ICN scanner for input grammars SEMGRAM.ICN semantics routines for handling the input grammars TCLL1.GRM grammar for input grammars TCLL1.LL1 translated input grammar for input grammars GRAMANAL.ICN context-free grammar analysis module PARSELL1.ICN LL(1) parser READLL1.ICN input routine for translated grammars SEMSTK.ICN semantics routines called by PARSELL1.ICN to handle the semantics stack RPTPERR.ICN routine to report syntax errors SEMOUT.ICN semantics routines just to write out the tokens and action symbols (for early stages of debugging the grammar) Building the parser generator Before reading the rest of this description of TCLL1, you should compile it on your own system. That will allow you to try out the test grammars as they are discussed. If you do not have a copy of Icon, you can get it over the Internet: ftp it from cs.arizona.edu: ftp ftp.cs.arizona.edu name: anonymous password: your_e-mail_address cd icon Versions of Icon for several machines are in subdirectories of directory icon. You may also want to pick up the Icon Programming Library. If you have the Icon Programming Library (IPL) installed on a DOS/WINDOWS machine, you can execute the batch file mktcll1.bat to build the parser generator. The three files from the IPL that the parser generator uses are included with this distribution and can be compiled separately. To build the parser generator by hand, you may execute rem These are from the Icon Program Library: icont -c escape ebcdic xcode rem These form the parser generator proper icont -c gramanal ll1 semstk readll1 parsell1 scangram semgram icont -fs tcll1 The first icont line compiles the files from the IPL. You may omit the line if you have the IPL installed. The second icont line compiles modules used by the parser generator. The third line compiles the parser generator's main program. The flag -fs tells the translator that the parser generator calls some procedures by giving their names as strings. In Icon version 8, this flag is not needed; in version 9 it is. To use TCLL1 to build a parsing table, execute Under Icon version 8: iconx tcll1 grammar.grm Under Icon version 9: tcll1 grammar.grm where grammar.grm is the grammar file. The output of the parser generator will be encoded parse tables in file grammar.ll1 . If you would also like a listing of the grammar and diagnostic information, execute Under Icon version 8: iconx tcll1 -p grammar.grm Under Icon version 9: tcll1 -p grammar.grm Tlcll1 reads its own parsing table from file tcll1.ll1 which must be in the current directory. icon-9.4.3/ipl/packs/tcll1/e_notll1.grm0000664000175000017500000000020207140713044017125 0ustar chrishchrish# errors--not LL(1) start = e . e = e "+" t . e = e "-" t . e = t . t = f "*" t . t = f "/" t . t = f . f = i . f = "(" e ")" . icon-9.4.3/ipl/packs/tcll1/xcode.icn0000664000175000017500000002661507140713043016515 0ustar chrishchrish############################################################################ # # File: xcode.icn # # Subject: Procedures to save and restore Icon data # # Author: Bob Alexander # # Date: January 1, 1996 # ############################################################################ # # Contributor: Ralph E. Griswold # ############################################################################ # # Description # ----------- # # These procedures provide a way of storing Icon values in files # and retrieving them. The procedure xencode(x,f) stores x in file f # such that it can be converted back to x by xdecode(f). These # procedures handle several kinds of values, including structures of # arbitrary complexity and even loops. The following sequence will # output x and recreate it as y: # # f := open("xstore","w") # xencode(x,f) # close(f) # f := open("xstore") # y := xdecode(f) # close(f) # # For "scalar" types -- null, integer, real, cset, and string, the # above sequence will result in the relationship # # x === y # # For structured types -- list, set, table, and record types -- # y is, for course, not identical to x, but it has the same "shape" and # its elements bear the same relation to the original as if they were # encoded and decoded individually. # # Files, co-expressions, and windows cannot generally be restored in any # way that makes much sense. These objects are restored as empty lists so # that (1) they will be unique objects and (2) will likely generate # run-time errors if they are (probably erroneously) used in # computation. However, the special files &input, &output, and &errout are # restored. # # Not much can be done with functions and procedures, except to preserve # type and identification. # # The encoding of strings and csets handles all characters in a way # that it is safe to write the encoding to a file and read it back. # # xdecode() fails if given a file that is not in xcode format or it # the encoded file contains a record for which there is no declaration # in the program in which the decoding is done. Of course, if a record # is declared differently in the encoding and decoding programs, the # decoding may be bogus. # # xencoden() and xdecoden() perform the same operations, except # xencoden() and xdecoden() take the name of a file, not a file. # ############################################################################ # # Complete calling sequences # -------------------------- # # xencode(x, f, p) # returns f # # where # # x is the object to encode # # f is the file to write (default &output) # # p is a procedure that writes a line on f using the # same interface as write() (the first parameter is # always a the value passed as "file") (default: write) # # # xencode(f, p) # returns the restored object # # where # # f is the file to read (default &input) # # p is a procedure that reads a line from f using the # same interface as read() (the parameter is # always a the value passed as "file") (default: read) # # # The "p" parameter is not normally used for storage in text files, but # it provides the flexibility to store the data in other ways, such as # a string in memory. If "p" is provided, then "f" can be any # arbitrary data object -- it need not be a file. # # For example, to "write" x to an Icon string: # # record StringFile(s) # # procedure main() # ... # encodeString := xencode(x,StringFile(""),WriteString).s # ... # end # # procedure WriteString(f,s[]) # every f.s ||:= !s # f.s ||:= "\n" # return # end # ############################################################################ # # Notes on the encoding # --------------------- # # Values are encoded as a sequence of one or more lines written to # a plain text file. The first or only line of a value begins with a # single character that unambiguously indicates its type. The # remainder of the line, for some types, contains additional value # information. Then, for some types, additional lines follow # consisting of additional object encodings that further specify the # object. The null value is a special case consisting of an empty # line. # # Each object other than &null is assigned an integer tag as it is # encoded. The tag is not, however, written to the output file. On # input, tags are assigned in the same order as objects are decoded, so # each restored object is associated with the same integer tag as it # was when being written. In encoding, any recurrence of an object is # represented by the original object's tag. Tag references are # represented as integers, and are easily recognized since no object's # representation begins with a digit. # # Where a structure contains elements, the encodings of the # elements follow the structure's specification on following lines. # Note that the form of the encoding contains the information needed to # separate consecutive elements. # # Here are some examples of values and their encodings: # # x encode(x) # ------------------------------------------------------- # # 1 N1 # 2.0 N2.0 # &null # "\377" "\377" # '\376\377' '\376\377' # procedure main p # "main" # co-expression #1 (0) C # [] L # N0 # set() "S" # N0 # table("a") T # N0 # "a" # ["hi","there"] L # N2 # "hi" # "there" # # A loop is illustrated by # # L2 := [] # put(L2,L2) # # for which # # x encode(x) # ------------------------------------------------------- # # L2 L # N1 # 2 # # The "2" on the third line is a tag referring to the list L2. The tag # ordering specifies that an object is tagged *after* its describing # objects, thus the list L2 has the tag 2 (the integer 1 has tag 1). # # Of course, you don't have to know all this to use xencode and # xdecode. # ############################################################################ # # Links: escape # ############################################################################ # # See also: object.icn, codeobj.icn # ############################################################################ invocable all link escape record xcode_rec(file,ioProc,done,nextTag) procedure xencode(x,file,writeProc) #: write structure to file /file := &output return xencode_1( xcode_rec( file, (\writeProc | write) \ 1, table(), 0), x) end procedure xencode_1(data,x) local tp,wr,f,im wr := data.ioProc f := data.file # # Special case for &null. # if /x then { wr(f) return f } # # If this object has already been output, just write its tag. # if tp := \data.done[\x] then { wr(f,tp) return f } # # Check to see if it's a "distinguished" that is represented by # a keyword (special files and csets). If so, just use the keyword # in the output. # im := image(x) if match("integer(", im) then im := string(x) else if match("&",im) then { wr(f,im) data.done[x] := data.nextTag +:= 1 return f } # # Determine the type and handle accordingly. # tp := case type(x) of { "cset" | "string": "" "file" | "window": "f" "integer" | "real": "N" "co-expression": "C" "procedure": "p" "external": "E" "list": "L" "set": "S" "table": "T" default: "R" } case tp of { # # String, cset, or numeric outputs its string followed by its # image. # "" | "N": wr(f,tp,im) # # Procedure writes "p" followed (on subsequent line) by its name # as a string object. # "p": { wr(f,tp) im ? { while tab(find(" ") + 1) xencode_1(data,tab(0)) } } # # Co-expression, file, or external just outputs its letter. # !"CEf": wr(f,tp) # # Structured type outputs its letter followed (on subsequent # lines) by additional data. A record writes its type as a # string object; other type writes its size as an integer object. # Structure elements follow on subsequent lines (alternating keys # and values for tables). # default: { wr(f,tp) case tp of { !"LST": { im ? { tab(find("(") + 1) xencode_1(data,integer(tab(-1))) } if tp == "T" then xencode_1(data,x[[]]) } default: xencode_1(data,type(x)) } # # Create the tag. It's important that the tag is assigned # *after* other other objects that describe this object (e.g. # the length of a list) are output (and tagged), but *before* # the structure elements; otherwise decoding would be # difficult. # data.done[x] := data.nextTag +:= 1 # # Output the elements of the structure. # every xencode_1(data, !case tp of {"S": sort(x); "T": sort(x,3); default: x}) } } # # Tag the object if it's not already tagged. # /data.done[x] := data.nextTag +:= 1 return f end procedure xdecode(file,readProc) #: read structure from file /file := &input return xdecode_1( xcode_rec( file, (\readProc | read) \ 1, [])) end # This procedure fails if it encounters bad data procedure xdecode_1(data) local x,tp,sz, i data.ioProc(data.file) ? { if any(&digits) then { # # It's a tag -- return its value from the object table. # return data.done[tab(0)] } if tp := move(1) then { x := case tp of { "N": numeric(tab(0)) "\"": escape(tab(-1)) "'": cset(escape(tab(-1))) "p": proc(xdecode_1(data)) | fail "L": list(xdecode_1(data)) | fail "S": {sz := xdecode_1(data) | fail; set()} "T": {sz := xdecode_1(data) | fail; table(xdecode_1(data)) | fail} "R": proc(xdecode_1(data))() | fail "&": case tab(0) of { # # Special csets. # "cset": &cset "ascii": &ascii "digits": &digits "letters": &letters "lcase": &lcase "ucase": &ucase # # Special files. # "input": &input "output": &output "errout": &errout default: [] # so it won't crash if new keywords arise } "f" | "C": [] # unique object for things that can't # be restored. default: fail } put(data.done,x) case tp of { !"LR": every i := 1 to *x do x[i] := xdecode_1(data) | fail "T": every 1 to sz do insert(x,xdecode_1(data),xdecode_1(data)) | fail "S": every 1 to sz do insert(x,xdecode_1(data)) | fail } return x } else return } end procedure xencoden(x, name, opt) local output /opt := "w" output := open(name, opt) | stop("*** xencoden(): cannot open ", name) xencode(x, output) close(output) return end procedure xdecoden(name) local input, x input := open(name) | stop("*** xdecoden(): cannot open ", name) if x := xdecode(input) then { close(input) return x } else { close(input) fail } end icon-9.4.3/ipl/packs/tcll1/ea_nll1.grm0000664000175000017500000000024507140713044016732 0ustar chrishchrish# ea-nll1.grm # action symbols # not LL(1) start = e . e = e "+" t A!. e = e "-" t S!. e = t . t = f "*" t M!. t = f "/" t D!. t = f . f = i N!. f = "(" e ")" P!. icon-9.4.3/ipl/packs/tcll1/ll1.icn0000664000175000017500000001405407140713043016075 0ustar chrishchrish link gramanal link xcode global outFile global fiducials #set(Symbol) global selectionSet #table:Production->Set(Symbol) # set of symbols that choose this production # if lhs is atop the stack # # # procedure analyzeGrammar() findMinLeng() checkMinLeng() checkAccessibility() findFirstSets() findLastSets() checkLnRRecursive() findFollowSets() end procedure declareFiducial(s) local t /symbol[s] := Symbol(s) t := symbol[s] /t.kind := "Terminal" if t.kind ~== "Terminal" then { error(t.kind," ",s," being declared a fiducial") fail } insert(fiducials,t) return end procedure findSelectionSets() local p,r,s,t every p:=!!productions do { s:= set() every r := exposedLeft(p) do { if isNonterminal(r) then { s ++:= first[r] } else if isTerminal(r) then { insert(s,r) } } if p.minLeng=0 then s ++:= follow[p.lhs] every t := !s & not isTerminal(t) do delete(s,t) selectionSet[p] := s } return end procedure ll1(outFileName) local t,g analyzeGrammar() findSelectionSets() testLL1() if errorCount>0 then fail outFile := open(outFileName,"w") | {error( "unable to open output file ",outFileName) return} t:=genLL1() #g:=encode(t) #write(outFile,g) xencode(t,outFile) # close(outFile) return end procedure testLL1() local n, plist, p1, p2, px, py, m, i, s #check for left recursion every n := !nonterminals do if member(first[n],n) then error(n.name," is left recursive, the grammar is not LL(1)") #check for overlapping selection sets every n := !nonterminals do { plist := productions[n] m := *plist every p1 := plist[i:=1 to m-1] & p2 := plist[i+1 to m] do { if p1.minLeng = p2.minLeng = 0 then { error("productions\n1.\t", productionToString(p1),"\n2.\t", productionToString(p2), "\nboth derive the empty string" ) } else if *(s:=selectionSet[p1]**selectionSet[p2]) > 0 then { if (p1.minLeng = 0) | (p2.minLeng = 0) then { px:=p1; py:=p2; if px.minLeng=0 then px:=:py warning("overlapping selection sets for\n\t", productionToString(px), "\nand empty-deriving production\n\t", productionToString(py) ) } else { error("overlapping selection sets for\n1.\t", productionToString(p1),"\n2.\t", productionToString(p2) ) } showSymbolSet(" overlap: ",s) } } } return end procedure genLL1() local mapSymbol, rhsList, mapRHS, emptyRHS, sel, deflt, firstFiduc, fiducList, actionList, termList, minLengRHS local s,p,r,L,n,m,mr,ml,ms,nullrhs,t,i # build encapsulated symbols, [ name ], so that all references # to the symbol can share the same string mapSymbol := table() every s := !symbol do { mapSymbol[s] := [s.name] } # map productions into right hand side lists with encapsulated symbols emptyRHS:=list() mapRHS := table() every p := !!productions do { L:=list() every s:= !p.rhs do put(L,mapSymbol[s]) mapRHS[p] := if *L = 0 then emptyRHS else L } #make a list of all right hand sides # the list will be used after input to remove the symbols # from their encapsulating lists rhsList:=[] every L:=!mapRHS do put(rhsList,L) #create selection and default tables sel:=table() deflt:=table() every n:=!nonterminals do { # Build a list of productions for the nonterminal sorted by # cardinality of selection set. Reserve a production with an # empty-string-deriving RHS for special treatment. Put the # productions into the sel table, but reserve the empty-deriving # RHS or, if none, then the RHS with the largest selection set to # be the default. If there is an overlap in selection sets between # a non-empty-deriving and the empty-deriving RHS, then this will # give precedence to the non-empty-deriving RHS, as is required to # solve the "dangling else problem." nullrhs:=&null t:=table() #map productions into cardinality of selection set every p:=!productions[n] do if p.minLeng=0 then nullrhs:=p else t[p] := *selectionSet[p] L:=sort(t,2) put(L,[\nullrhs,*selectionSet[nullrhs]]) if *L = 1 then { deflt[mapSymbol[n]] := mapRHS[L[1][1]] } else { /sel[mapSymbol[n]] := table() # if there is an empty-deriving RHS then put all other # RHS's into sel table--the empty-deriving one will be # the default. Or, if the largest selection set # for any RHS is small enough, then put all RHS's into # selection table. Otherwise, reserve the RHS with the # largest selection set to be the default. m := if /nullrhs & L[*L][2] < 5 then *L else *L-1 every i := 1 to m & p := L[i][1] & mr := mapRHS[p] & ml := mapSymbol[p.lhs] & ms := mapSymbol[!selectionSet[p]] do { sel[ml][ms] := mr } # If not included already, handle the last. if m~=*L then deflt[mapSymbol[n]]:=mapRHS[L[*L][1]] } } termList := list() every s:=!terminals do put(termList,mapSymbol[s]) actionList := list() every put(actionList,mapSymbol[!actions]) fiducList := list() insert(fiducials,eoiSymbol) every put(fiducList,mapSymbol[!fiducials]) firstFiduc := table() every n:=!nonterminals & *(s:=first[n]**fiducials)>0 do { firstFiduc[mapSymbol[n]] := list() every put(firstFiduc[mapSymbol[n]], mapSymbol[!s]) } minLengRHS := table() every n := !nonterminals do { p := productions[n][1] every r := !productions[n] & p.minLeng > r.minLeng do p:=r minLengRHS[mapSymbol[n]] := mapRHS[p] } return [ rhsList, sel, deflt, termList, actionList, fiducList, firstFiduc, minLengRHS, mapSymbol[startSymbol], mapSymbol[eoiSymbol] ] end ####################################################################### # # printing the grammar # procedure printGrammar() local n,p,st,s write("start symbol:\t",startSymbol.name) write("EOI symbol:\t",eoiSymbol.name) write() showSymbolSet("terminal symbols: ",terminals) write() showSymbolSet("fiducial symbols: ",fiducials) write() showSymbolSet("action symbols: ",actions) write() write("nonterminal symbols:") st := set() every insert(st,(!nonterminals).name) st := sort(st) every n := !st do { s := symbol[n] write(" ",n,":") showSymbolSet(" first set: ",first[s]) showSymbolSet(" follow set: ",follow[s]) write() } write("productions:") every p := !productions[symbol[!st]] do { writeIndented(productionToString(p)) showSymbolSet(" : ",selectionSet[p]) } return end icon-9.4.3/ipl/packs/tcll1/semstk.icn0000664000175000017500000000142507140713043016711 0ustar chrishchrish# Semantics stack manipulation routines to be called by # parseLL1(...), the parser for the TCLL1 LL(1) parser # generator. # (written by Thomas W. Christopher) # invocable all global semanticsStack record ErrorToken(type,body,line,column) procedure initSemanticsStack() semanticsStack:=[] return end procedure outToken(tok) push(semanticsStack,tok) return end procedure outAction(a) a() return end procedure outError(t,l,c) push(semanticsStack,ErrorToken(t,t,\l|0,\c|0)) return end procedure isError(v) return type(v)=="ErrorToken" end procedure popSem(n) local V V:=[] every 1 to n do push(V,pop(semanticsStack)) return V end procedure pushSem(s) push(semanticsStack,s) return end procedure anyError(V) local v if v:=!V & type(v)=="ErrorToken" then { return v } fail end icon-9.4.3/ipl/packs/tcll1/c_ll1.grm0000664000175000017500000000034307140713044016410 0ustar chrishchrish# c-ll1 # LL(1) start = s . s = i ("=" e | ttail etail) . s = n ttail etail . s = "(" e ")" ttail etail . e = t etail. etail = { "+" t | "-" t } . t = f ttail . ttail = [ "*" t | f "/" t ]. f = i . f = n . f = "(" e ")" . icon-9.4.3/ipl/packs/tcll1/declacts.icn0000664000175000017500000000164007140713043017164 0ustar chrishchrishlink readLL1 record LL1(sel,deflt, terminals,actions, fiducials,firstFiducials, minLengRHS, start,eoi) procedure main(L) local filename,baseFilename,flags,outfile local ll1 flags := "" if L[1][1]=="-" then { flags := L[1] filename := L[2] } else { filename:=L[1] } if /filename then stop("usage: [iconx] tcll1 [flags] filename.ll1") baseFilename:=fileSuffix(filename)[1] if filename==(baseFilename||".inv") then stop("will not write output over input") ll1:=readLL1(baseFilename||".ll1") if *ll1.actions > 0 then { outfile:=open(baseFilename||".inv","r") every write("invocable \"",!ll1.actions,"\"") } end # From: filename.icn in Icon Program Library # Author: Robert J. Alexander, 5 Dec. 89 # Modified: Thomas Christopher, 12 Oct. 94 procedure fileSuffix(s,separator) local i /separator := "." i := *s + 1 every i := find(separator,s) return [s[1:i],s[(*s >= i) + 1:0] | &null] end icon-9.4.3/ipl/packs/tcll1/if_nll1.grm0000664000175000017500000000017607140713044016746 0ustar chrishchrish# if-nll1 # not LL(1) start = statement . statement = if e then statement | if e then statement else statement | i "=" e. icon-9.4.3/ipl/packs/tcll1/build1.bat0000664000175000017500000000031407140713044016555 0ustar chrishchrishrem These are from the Icon Program Library: icont -c xcode escape ebcdic rem These form the parser generator proper icont -c gramanal ll1 semstk readll1 parsell1 scangram semgram icont -fs tcll1 icon-9.4.3/ipl/packs/tcll1/fp.grm0000664000175000017500000000151107140713044016021 0ustar chrishchrishstart : fpProg. fpProg = { def | aplExp}. def = DEF ident "=" fnExp DEFN!. def = VAL ident "=" fnExp ":" obj VALU!. aplExp = fnExp ":" obj APPL!. fnExp = fnComp [ "->" fnComp ";" fnExp COND!] | while func fnExp WHILE! . fnComp = func { "." func COMP!}. func = ident FNID! | ( "+" | "-" | "*" | "=" | "~=" | "<" | ">" | ">=" "<=" ) FNID! | selector SEL! | bu func obj BU! | "/" func INSERT! | "@" func ALL! | "(" fnExp ")" PARENS! | "[" ( fnExpList | EMPTYCONS! ) "]" CONS! | literal . selector = signedInt. fnExpList = fnExp CONS1! { "," fnExp CONSNEXT! }. literal = "'" obj CONST! | string STRCONST! . obj = atom | "<" objList ">" OBJL! . objList = obj OBJ1! { "," obj OBJLNEXT! } | EMPTYOBJL! . atom = signedInt INTOBJ! | signedFloat FLOATOBJ! | string STRINGOBJ! | ident OBJID! . fiducials: ":" "->" ";" "]" ")" ">". icon-9.4.3/ipl/packs/tcll1/tcll1.grm0000664000175000017500000000062607140713043016440 0ustar chrishchrish# Grammar for tlcll1 parser generator start = grammar. grammar = { declaration }. declaration = ID DeclLHS! ( COLON rhs DOT DeclSymbols! | EQ alts DOT DeclProduction!). rhs = StartRHS! {elem ExtendRHS!}. alts = rhs FirstAlt! {BAR rhs NextAlt!}. elem = ID bangOpt | LPAR alts RPAR Group! | LBRACE alts RBRACE Repeat! | LBRACK alts RBRACK Option! . bangOpt = [BANG DeclAction!]. fiducials : DOT. icon-9.4.3/ipl/packs/tcll1/tcll1.icn0000664000175000017500000000404307140713043016421 0ustar chrishchrish# TCLL1 -- an LL(1) parser generator # Main program. # (written by Dr. Thomas W. Christopher) # link readll1,parsell1,scangram,semgram,semstk,gramanal,ll1 procedure main(L) local filename,baseFilename,flags,filenameParts,gf flags := "" if L[1][1]=="-" then { flags := L[1] filename := L[2] } else { filename:=L[1] } if /filename then stop("usage: [iconx] tcll1 [flags] filename.grm") filenameParts:=fileSuffix(filename) baseFilename:=filenameParts[1] if filename==(baseFilename||".ll1") then stop("would write output over input") initScanner( filename | (/filenameParts[2] & baseFilename||".grm")) | stop("unable to open input: ",filename) initGrammar() initSemanticsStack() gf:=findFileOnPATH("tcll1.ll1") | stop("unable to find parser's grammar file: tcll1.ll1") parseLL1(readLL1(gf)) | stop("unable to read parser's grammar file: tcll1.ll1") finishDeclarations() ll1(baseFilename||".ll1") if find("p",flags) then printGrammar() write(errorCount," error",(errorCount~=1&"s")|"", " and ",warningCount," warning",(warningCount~=1&"s")|"") end # From: filename.icn in Icon Program Library # Author: Robert J. Alexander, 5 Dec. 89 # Modified: Thomas Christopher, 12 Oct. 94 procedure fileSuffix(s,separator) local i /separator := "." i := *s + 1 every i := find(separator,s) return [s[1:i],s[(*s >= i) + 1:0] | &null] end procedure findFileOnPATH(s) #adapted from DOPEN.ICN local file, paths, path, filename if file := open(s) then { # look in current directory close(file) return s } paths := getenv("PATH") | fail paths := map(paths,"\\;","/ ") #convert DOS to UNIX-style s := "/" || s # platform-specific paths ? { while path := tab(upto(' ') | 0) do { if file := open(filename:=path || s) then { close(file) return filename } tab(many(' ')) | break } } fail end # # Error reporting required by parseLL1(): # procedure reportParseError(t) error("unexpected input ",t.body, " at line ",t.line," column ",t.column) return end icon-9.4.3/ipl/packs/tcll1/tcll1.ll10000664000175000017500000000175307140713043016345 0ustar chrishchrishL N10 L N20 L N4 L N1 "COLON" L 7 "rhs" L 7 "DOT" L 7 "DeclSymbols" L N3 10 L 7 "FirstAlt" L 7 "alts_7_22" L N2 L 7 "BANG" L 7 "DeclAction" L 22 L 7 "declaration" L 7 "grammar_3_12" L 22 L 7 "StartRHS" L 7 "rhs_6_17" L 16 L 7 "ID" L 7 "DeclLHS" L 7 "declaration_4_27" L 5 L 7 "LPAR" L 7 "alts" L 7 "RPAR" L 7 "Group" L 7 L 7 "bangOpt_12_11" L 7 31 L N0 L 7 L 7 "grammar" 59 L 5 L 7 "LBRACK" 48 L 7 "RBRACK" L 7 "Option" L 5 L 7 "EQ" 48 12 L 7 "DeclProduction" L 22 39 L 7 "bangOpt" 59 59 L 5 L 7 "BAR" 10 L 7 "NextAlt" 20 L 16 L 7 "elem" L 7 "ExtendRHS" 36 L 5 L 7 "LBRACE" 48 L 7 "RBRACE" L 7 "Repeat" T N6 43 T 22 71 70 8 6 20 T 7 79 78 84 T 5 46 45 64 63 39 75 89 88 31 T 7 39 28 36 T 5 46 83 64 83 39 83 89 83 55 T 7 24 23 T 1 20 59 61 57 29 38 L 7 "start" 60 10 33 48 17 31 59 36 59 55 59 76 54 L N13 71 8 79 91 24 39 46 12 66 L 7 "EOI" 89 64 50 L N11 68 26 14 18 93 86 41 52 73 34 81 L 22 12 108 T 58 T N12 43 6 20 59 61 57 84 75 29 38 104 60 10 33 48 17 31 59 36 59 55 59 76 54 104 108 icon-9.4.3/ipl/packs/tcll1/tcll1.pdf0000664000175000017500000063054707140713044016440 0ustar chrishchrish%PDF-1.1 % 2 0 obj << /Length 484 /Filter /LZWDecode >> stream P1B h h Df.DQ\0`<X 8A " ф|`3 pBؠC&"шP1 KBTn. DHhRaX0ơs*7V֜l@59>wH U:2e{=w]Xg g'hӍ7ZAr>M?1 ;wP?(7bkȴg;h1hehl@`(F Di,9!Fh(|ʴv*( \<ؠk`q̴r$p)1(5 ۳ a^sCqc;3tdܩV8 Bdae haBp?IZRv0\4j.`˂eSxz0|drMFC2PAj^}/|S'e8כ0oXD,X E82ZJCi/9!_F#cE8$r޼/mM#4uSuHs87WѺ85.rX*l0cH]L;1f2)ps٦3Vja)U"/V`}_ G I(%ִpö/LSݘôi$kmP c i;S %WooVak wʺ,e:JZ{ C)7џ[wl]@gpbv`(ˈmˆחp/N-tN)Sԝ"(-\ޯo endstream endobj 11 0 obj << /ProcSet [/PDF /Text ] /Font << /F3 6 0 R /F4 12 0 R >> /ExtGState << /GS1 7 0 R >> >> endobj 14 0 obj << /Length 1632 /Filter /LZWDecode >> stream P5 DC4b2 "0f6 b\1 HB,r(sKAART5A ШT28Ć400r7Bр`02y8E, sUĂ$Vd( FC@)梑ߔR6cƙCl(9b.) `6=q|-{pxNGs:\+8kavJشf.A24ƒP80M8ֆ-[S0s:@[.#҆M8@L* 4A{Ϋ1Fǎ{,7T*Kbտ D-օ;S0x6ů !4ؿdCSI NM2̔LL-2Lm;صQ3E3B4M#2QM,S/?Ӳ lRP5c"8 qYV iTq`PH`%/ *Jja3kO20eglC+f,b֯bϲ%j0O@k3/Ԋ@ˆKlZ@6Ǩtq 6xkiտ@Gxko\!x-c!mtWЌJ$h`RfKmR 5DBSS&]ۡ16V7MX@MMNOLkLl1DM{b3_lGیU~HWU;&k±535Q$˷{O)mͺ[乮Xo; (@/9?@Qes?s?R/ah]uro4Va?&-^i?kQކ/7?|`gf7۰H '$}FG_"irfk{~AGgP"!Bz)4@gTk1/ xa+ 8\QCJ\5dFOBjq&MJNƄ8!MMh؃ i 7Mlr=VZt {FgCG042KA <ņ׍r6,· $ėO "F2{ό:Yd=wrjT½L9  r  ^|"d̖QJi;CU1>6NY7ab Xf)- ZjLc_sڏr@0xKn]w+]8Llj5Z;4fc 1GWtINB;S[M,JdL&.{D)?Mb$$14y72KQCf QLԤVZKYޕgYO/aQda  wqIƃmB[ E^DqDq'ajb3]#[9gڄCi /> 28 BP}:(Hbk<,y4&A'[7B׬RS'n_;ʢ;{}c79ZKu`#  endstream endobj 15 0 obj << /ProcSet [/PDF /Text ] /Font << /F1 4 0 R /F3 6 0 R /F5 16 0 R >> /ExtGState << /GS1 7 0 R >> >> endobj 18 0 obj << /Length 2375 /Filter /LZWDecode >> stream P5 DC4b2 "0d.Dhg 6"Fx! p9@E,HPM" ¡!h.dJ$-F(Gx!lQGFPZ2#qAR4 gWqt2#1Aa6@b=C[ԍ|0tfO[f׵X[voe>T_C39xHJU|SkFʭ,|҄&;SUw0n.>G]ݥ 5DCQhԉ5E;V#Tu+t6<5ҵk/Biߒ=k "{|~/?`r "DJ@E/2@IJ)-Bi჆C LPb}z+Z6S)0FA`-e% O:+/WmhL;d4h.Q̣"~13#r6FcIq@Gd$6xT/5#"FvHiŒRAD"WꔉG?A-%S,>J{~} ʤP&,12仢`SZ058zL(tS(4)䜆rFD͙7$؛SjpI ܉o*aœ.?Gd+s\S]S@#ЦhFTBbO Ǘpi/2,@N9d蜱FR;G$蜔zHNK;iADSJ~Pji'Ԣ|R^\xSTQ dd \Js 1jW b̶qC ?F3S )d!@JJ *%V𻨪^! ȫJi%I-TN-D<+9 3 HQR\}! kٱ^yOrBaX mʡW/ۚ:@5UT3L%૱64AAB[rmnBT 5DpXCPY.5ƞ3eKJ~gIs*|Ο29ñy11*k98A,勱F-xP YgGjNmiL¬rt7z6fd xfL2rQ[;('T*M!h/& M 9Rm7!۷յV1) *H)])x4FP[Ef }f6 w}E_Biji?&^ Gf /OU=Zƍ `j0HZ5=41[F2Xd͗vvOlścMuU)"귾0*kC}%x&2c_ c=ằsnWsF#ĽYyf{k˫-B']'/{ f.S eqfz{ty 4C҄:3h>XAiZTG]?̛.Qtnڹ_JBj"涧{Ǽ#:*6ѯ+OOȵlp ` endstream endobj 19 0 obj << /ProcSet [/PDF /Text ] /Font << /F3 6 0 R /F5 16 0 R >> /ExtGState << /GS1 7 0 R >> >> endobj 21 0 obj << /Length 352 /Filter /LZWDecode >> stream P5 DC4b2 "0f0 !Cab3`#<X 8Q "$q@c 3IPH!P f6 =K*(j8 j,-'d4pZ1!vPh pTE1HPL] 4SriØfGpiMW5m_Fkۊw;m nQT%Hat"3P g7+Ӌa㥘s6er:/x/-@ #P{0Q 90' Pː4}1FÜ * endstream endobj 22 0 obj << /ProcSet [/PDF /Text ] /Font << /F3 6 0 R /F5 16 0 R >> /ExtGState << /GS1 7 0 R >> >> endobj 24 0 obj << /Length 1947 /Filter /LZWDecode >> stream P5 DC4b2 "0d.Dhg 6"Fx! p9@E,HPN’EAF#Cq\9Aȸn6 F#Apưr2!"/Dh5VAW !7GcgQS|B or6pNfrjV5o ;EcA ШT28w&L$¡[ "t`PF4ζT%l)67$ nk7r‘RA@!P:0@Z@% r n @ м% @QR /dHpG1LkXZtm4'$IQ#l(I\*JR*̹)r,L _8Q4d7F5NS\;ͳ=N3< 7Xj RR BĠE¤4 GlQB't~$U@1]+ҳUm4gMJ|0a0yX5Qe@3Q2˶lord;P>uev}A*PQ E򚅿f8c{HQ5#>" #h0:tǡ%64Y_e +Ye9}hZ.#CsI`N:^ͺvMiѫk:fd{l;&ǧڵ( &Jkj?4n@N*N`"U^/]lw@hbUnv0^EW o)1yrQaxkpp@KA:nsMk~w^/G}\ԇڲ>^9Q &?јtݏ AO?3Mboz 0 9pf Rh3I( WR ;Ʒn K!" bSCT !6Iè_1E~5`ؚZb=ő8cj89 ia7@ sF(9#z:J.Y*7[cy9G#Q* d;iFEY dD2:I %Z܏2aɩ;'!| Cy` H~"dM$CW*x!BVp YtzͲLŝ2rBLaLV*WKY&T5D?f ϜU,{5YY5ܹ'uKh:@qJH`rX.ҖU+\U!Z,/3cdsM]԰@Ԋ)Y9"h^0ŝ;j#4.*=FK&T%Q*T!uS QԖfQ PP j-pN@ˇJ(آ]iKIkMU IiڹaQPUsA9TjЯ*it-WTnǣ+c,iJ^/r%9xAJjey_Gu_&+r( :+jVLNNmT?gť:}뵈^[Dk r[r^}EqfǸ%(!\l)Fx#sfe:Ց]Wșdoዯv,Fc[i1PkCֲ60[I/..W6`532VUW)eMAM y?(zK0—IKԄ9c6?^F=ZHMS#x(ʿAo$CQk`ECJ SGJcJ洴^"yXr Zg}k 4uU-7a:F:`O퉳6KemM+9l  endstream endobj 25 0 obj << /ProcSet [/PDF /Text ] /Font << /F1 4 0 R /F3 6 0 R /F5 16 0 R >> /ExtGState << /GS1 7 0 R >> >> endobj 27 0 obj << /Length 2421 /Filter /LZWDecode >> stream P2 DC4c"0n7 p.Fʆ$D!9Ng9,`3A$)EC@LgCI~]*a& F1p][ Yll2 g9cU*NBфe*bh(7EAR2pXCPi 惦D@\ F8$sF@BMi)0Ct2l>4 *`·㣞AcI-~j)Jb0 zL;ª( @s.c>/+ؠaE#I,#^[d8X.@2 )dM&@ʠ×fV{ um 3T@8^xx #mŹT^2}IaۇQ}[x^쭦 W1 wcshᅅcfelTݸqzWCJ3*ֹX+tbI:.Hj"S.Sͼ+ cCmM2C~6H6v}Ҍˀ,1 #dXCt6UEm8qa@nťTZrL  7N٘uh:n"2bi;PdUE#[v՞#guW*װvNwn_-\ 6Y>s; Eh݅o9Ca+\sEw{m ?i~Q[6sN-^JM,Sޯ<݊LtRs3P`BAC?h,0&"^D Q5sb*46.ʢ|0ErN0A{\%0c,4Q]xԇ`:8b u(iC\<=Ādx͜V^s_ֱQ!fsz$<'H#+~qTʨa]a̸J_NPi6Y x[Eu،;5aVL`W<)(ɦϩ{ N$΋vJK#,iIc#/ N~bl@u|e\efd˗]"d `@E.^k\mF^ýCaI` 6je% [/Ie2[!)_YU`Ԝ]b6 9: &j"uxQ P3Ah`onO9IRrB 1v%'"ZE0}2A;U@k6sI,HZ![/%3lctZW ̲Ű^2fN~FjlWY Ju6M ;a6N0lYXbgK4Z Dʐe,MlUF .0:!|/f G:nADo{l# 3d?` v[{e()7`A5Y HyRt/TDdo(u4+QzN58_}gwI{Bi:{(J͘= L6t0n9H Xy@[Td5IYRLۘ1zRੋ]uAlȼw$ <=w 39w4gHt^AI-we EyhPb[E"yԀnykE~oFMu Դ9B -AP%kHFUdp\ ϑeOWluF6KV+,+w6Ma{GAt=5ܳ猖c%l`a> /ExtGState << /GS1 7 0 R >> >> endobj 31 0 obj << /Length 2936 /Filter /LZWDecode >> stream P2 DC4c"0d.bA`k 6"&x! p9@E,H,&p[#) QB1E#Aʆ7#AA #E#*R 1A]*h*" Fqpm "AaIPs#MnUsEEv2 E#9`1&`e< `Z3( ichuNcP3CQ #aud(Am0ֹ}_lAmBތw>.7o !r޸*%p@4",#A>Ɇh!pnC*0R.ˆA' &+Aܼ$hbrpt1)L` T5:aphHd&:|$A* 1hppȢs< t"*$ Rt3=:4*A88Mpd*a@`48@ѣ9tuTԷ+䂈2 jF98/ q9JE 35Oٵ+ѫڤ4*SC,LT+XZ}42OP1m>!P8H7]7]ڡ73}Fz7!X7넍$ n4:]8%[NR 3,7RӍ \θ6n*ZܸÔi@ 6 ;.Y7H-6z\3ʕ6aC)9xj/ m0ݽڌL|+Y\W/{)OBMp2 7o =u-m=M} h݉ègJ2?l7|Mۨ7*n0cZtͅAh7Q;AXJH[F"Ӛx4e3E E7+ࢱuXK7PaAPPs1 d!%ѬFd+ vXλ:7tʑABl|Tk7b&  kCRT\K@]V4 Wu JN0`-_5Di q2Յ ¿XŵY)1V>F3.) DaL+NP4Dž$  B&iS,Xf'`AOȹ2`3I=:&D yi( LL?fY$e/x&@ \RAy"( TV ↘.Xbt2Y9$=! Ԙ\IdħX.AKcR뜪7ݟ CsPNIHHuHb)I``(?FCm QK0֖4n9X hgtDɔ ]Ǧn7^ CPP>'[j:5-mrjH.Em)5RT@4C%=xMY˜/ '[㐏J+d LEp){g𕉨)a tPCkMֹ5͒XF 1VhbQ~6;b}ÊYW@UiOO=T\dipn٥ vDUH Oz >ۂJ| f-H1m7 <[KV`̌!7ܘht6qBY9?WB&n$Hr382GWhKe1fkQ^8-_9M9-u)JU1 KOrk{u0p-V1å7Cgvpt!T>b^usjUTBu[x0fvu-XQC̞2usG*aR+ϕPC%Uzsm/!F3JRkFq Yc%5#Ն)dLhmAE.3!Wڎ壃 a9v/EM&l Y;vP]͙t|6:8 ~bWZ]1[epL^EPuNC*5p0~aY *dd̛|Pqb s6=Y.޷,9G`@2֛R-ST|#(oĸ)"/0 NPb'9`oo@eƎ4j(+z]g°nd+Ϙb҉"fcFZx1bPVko 쩉~z 9 pQDk\CR@; &T` \ȠpЧ%ΰP,u `F@>|deMib07)/#KzLtxqlc?/4w, FQ(V x{ hȃvTG d}+_H3 Eeh\Fpqx։$kB  ("""j9!dIJ#C@҅|3)ҩGoV~! pNr,\GR#RD+HN^̊2TU %'%-Rm'{'E|"N҃r/ld(<8-I*X@B endstream endobj 32 0 obj << /ProcSet [/PDF /Text ] /Font << /F1 4 0 R /F2 5 0 R /F3 6 0 R /F4 12 0 R /F5 16 0 R /F6 29 0 R /F7 33 0 R >> /ExtGState << /GS1 7 0 R >> >> endobj 35 0 obj << /Length 1200 /Filter /LZWDecode >> stream P2 DC4c"0p5 "p. af$D!9Ng9,`4фT; bZ9E#!FHPdiڈY4eL{}4e9lJXrJ$q AB%B"щl2 Fr9£9F)C!kKu v A> /ExtGState << /GS1 7 0 R >> >> endobj 38 0 obj << /Length 2819 /Filter /LZWDecode >> stream P2 DC4c"0d.bA`k 6"&x! p9@E,H,&p[#) QB1E#Aʆ7#AA #E#*R 1A]*h*" Fqpm "AIPs#MnUsEEv2 E#9`1&`e< `Z3( ichuNcP3CQ #aud(Am0ֹ}_lAmBތw>.7o !r޸*%p@4",#A>Ɇh!pnC*0R.ˆA' &+Aܼ$hbrpt1)L` T5:aphHd&:|$A* 1hppȢs< t"*$ Rt DNlԨ :*  ԯ*(@f 5<h(2M#N*#hڡ H. "r2;jF8(O3k*:/E**Z#56-@٪Z5;iSj5MY 392H4i`&kF҆z*==@&`S| EP9HԈ@8UXQ+"R!c#x,k*(~`YbgjAn(6 @0̬*Y6j9 #p cxiZxhP3-Va34j[.ܺ ,_ $a)!l]OjC> >-@]Hk&㮲,2r۪Pbi{el"uko+չ8ZYA@#}4_dY inw#oڀ:gOˏQ,ͅrʏiT(F@*9h;UbhfŜ6yO}oèeE}NKm¯ bY}iyMOls,0HϊkkNҴmk׶uͻ i1()9[@( =ccXk܃`Ⴀ*qf9iG*ĸYbZ1ҽduqh7EȜn^5Hc 23knwa Pe|!8 iik|Ur7#/" `H79to*c:'3 ʠm.lo7H-:ܖenKBԶ605MZlCU\&\u9>69A$ W"[n8LY'%a{z!2PKbMgur%>Tꤴ~By|Rl})x ) ARAtvEZJL2X(cRu!@ةݣQC#7=gK.QJ >%XX%JJ&ZlU&;mʅ-jrdpWPjިGz)Ƹ{NU<l!*Eq@ވiJ};%*2R$/5kbt4-M1$&D,ȍF&uN5+PlaL:޶##^7 `_)_inof1qD1@!XL+x(\)eHlm|6[D\% !;Ez,*Ef%aih(@{حF#,oWv1|1u#`ë z&/cAxnR6T'lV7J jHim ݎm|Kfҭf񈂷T ̢~c^FHP֒ʨ0v dJH̚drM%T| ЎdlJNn/NT>@=mlUͨ`Xpt# N^> /ExtGState << /GS1 7 0 R >> >> endobj 42 0 obj << /Length 3309 /Filter /LZWDecode >> stream P2 DC4c"0b0 !Cq25`<X 8Q "$qc c w1HPo7 R1*}DeAmE#A). PH4 ØHArc|@6 #9 56*NS}@PR-PykySM?]F,4i֓ Ä,6S£(cZ +ylsU S`L`axg,L(Βf 55J6 L캬ШrMKiq^PX3gx* {c}h)i h4IҢ;Sİl%OC+7 "/V(Nmo8¢S 2m)w8Hݚ,' O0@zߢ:ТB?[9bbЮiqQ ec`j.!h uPugrؚPr(k?HUMNt2ZaQH{)WheNA6((d5Mں6ƆG!ItRm!!}7bd75MVPcKo5+MIEAN'y%̑ʊ[2esa y3K睰SSP N%a)陙 5A+3Y91VU.YFĞb4 wppP )2b;B.@-KߗF,XHzRW<ko*NpYܗ&}$DS|>C(;7Go/õOX޽".gMQ.P񼷌W0. =ܑ4Ĕ& ToDJCNrxo,PUPL/v`n"s=1l^=,'F4CBPE(S[P^CHPBhFP%N IjFB\*I  0GgD/W ^Q@ m /Dx0O*phCa  k N"OB ? py\RPyxf(aFa"z(o cP(O*Ojh'^#Vs^ܺesGQBXx\W ڪEzC*(IQR"RdRK\lhpjЏ!G+6KLT[0+̆ X й J8b bgJn42  ki% QBb>I"Ӑò:jL.cI>u"f1JpEQ1'dyv2f{Zk$"arr,G &1v&  }` `(/ʃB*F ۰7 0ءMJDH%,,$Ŏw(O5, XS \3jE Mh.SO>H88ZSb 9?9I @jsMCӁ @@39h8;.=|/-Fq~$XyJi0QCbx#h3i&CeVB!*+Æ*ph@."P<&!"" @ `" !"vC@h#!DB5+J@p!@ AJ"KjKLBXJ@t&@C4s&KIMtOJt@  endstream endobj 43 0 obj << /ProcSet [/PDF /Text ] /Font << /F1 4 0 R /F2 5 0 R /F3 6 0 R /F4 12 0 R /F5 16 0 R /F6 29 0 R /F7 33 0 R /F8 40 0 R >> /ExtGState << /GS1 7 0 R >> >> endobj 47 0 obj << /Length 3159 /Filter /LZWDecode >> stream P2 DC4c"0d.bA`k 6"&x! p9@E,H,&p[#) QB1E#Aʆ7#AA #E#*R 1A]*h*" Fqpm "^ pPb0 W24 _1T].1&C8 S* E:61V\45>PhZ{pd5𫐑r6XB_ oM kWv:޹*ێ{|j1бj޸ 2ҳh@HIv5l!mj2 0@0J 2Hn"F,"7Z@6D*\21,\S cF1>;CJ/tME043hT :cDsP6(s>*HDڨj`1H3*jG-q۸7D#BP6 ,K"¬<>(9'BL&ӵ@7` _SHRT lҵ*qSUuUrVS쨸J٫!La7[JLwvحLlb#IxU5U:A;EtWmvBaYP294߆Wr WC~';:Q+N:7&mh ֝42G`V2y_ y7$k21~D0Jf ըtn.D1*Ӯ-.oo36UG+1PZOwYtbM,j2LԪMS҂ZE(U#(:bќ,Yl'#Y5k4kg@7׶=9ޙ 5AL憽 h ۛ6`Ʌt@C+qn5ۗ"MEbQeA"l (hvV&\#5]z  E 4`AE>gbQS;+JRRQCC;'tUQ|6ǔ z PBwD(!XgIp0lR2, Y_W<0jY!02D"]Q"((B4Q6u7Ӱ ;/ d3B w?uZ<"m&8'[2菧4h%p 5UHˎbc$,"jC\ +|(wp%uVMxچ2T ^fIV H2@i̇ h\E,Y>Wc;wCY Α&v̗*_`P b*HtE?&6j(hd($y"5DhF|*ISdFTI/UMJ՚ sA5o];ćxVb.Rh1\aiafII2kT !m *0ATA9'RժW`uRZ%EjD ]GM|FO)v"HAB=R \VV= 4^a2/! k+Zxjvl*# &eEdT!gdt˚"VHI,utSU# mq;ҵDsw&;؛c)\?/.,"68|JVp1)b8.V (o[$pesҿ1Y`Um >gv K2SlN0Bd6LCgW)JgHҜDh<XH!09HD-MSLՑ[GF,fu莏CQ#O YF;ߨ)l,uR*q֢! a-^k2ZO#.CDŽ R!x" X JU6OJNԲo)de]dQy?_rPS0 $zahZg0p ;2cKXآൕgf\"mUz}fIv%M9rU/uתf<VY 4w[\G{{w]BKg-:I=CWIs(䢟}J*j_gb )Wa'{mWv7O,UiɝӦ4pJ*)c$RNE*N+Fw#+NbVV=M@tL}MX"^^f_Y>1=c8a˟^XNɝ|?kuFIBtt,W@uPhMfzMhmxDM)fx+63c*hkTFXdDX'B9fO8/صkϖf <~<+Tުh0f'@pn&0=MtOɱ(LwpQPth 4ZzFL©RWoXP ,c} +jJIYZi}mf Ò KVIM9Hmk" (jB!t7 hHp{ZEtHz ep JZ+@vuLihhd7X{qYmGBohhRtU"\,"lxN?A8t?`?@/>s?5AB4t@c#BS@3  endstream endobj 48 0 obj << /ProcSet [/PDF /Text ] /Font << /F1 4 0 R /F2 5 0 R /F3 6 0 R /F4 12 0 R /F5 16 0 R /F6 29 0 R /F7 33 0 R /F8 40 0 R >> /ExtGState << /GS1 7 0 R >> >> endobj 50 0 obj << /Length 3140 /Filter /LZWDecode >> stream P2 DC4c"0b0 !Cq25`<X 8Q "$qc c w1HPo7 R1*}DeAmE#A). PH4 ØHArcq|@6 #9 56*NS}@PR-PykySM?eH0,!RDŧalh[ R* OJ@!˪&>` Hc=+r0"r삄5j) ҳ @0Ak;A@1HP:+aP4<#2)J 4+|2XЬު-+\:3 }2!DpR. 2*0@7 6Cx$R@1j34M@*Qh1Qt {.錳8 *#ɲj-PZLJҫy6(T Ű0,0`LbyՁ\412!!;.%(d̍כYy2Z+bXj 4LVh\q#P$ X(B)Q-`xKƬ RK>K*)  C\ρ-1|*MC^e8+YKH:JHħaΐ@`:Rt+L+@Ab π@`@KSΡt=o<ܶ1<#(Eest/MqX;N-dP6E{TzU^Pߟ 0d@c3-ggc(EW&MijރX웃 /w@;,sKr, xiE)(h"@dE"̱ C]M+ޚŔQs ] I@/(  1> :PfܰČ#22:BUaAM#74r-.t4Xk=`HixUC:X_XqzKtjRT3y'ǨSP2fCr8E=w=tJ*OԳR6etȒ`f #c% Pc ,fgb+ 6_'EY]<;Ã*{</Eҩ/"l;ftRXHl_l.0(J ĘҔ.N(|%3 p)pqQBSU-&p%^.(WD(uEO5c*:@t BT:Fe: *ů1sVE:3Tg,jʸX6(ԈPM !DRPi ;ՔU VFpґoPVCofqȱ՚ <4H{DB5rjDzhOGĦKd) d@Ō\xgHw*-)%f̊9Mxv|,G >V<2*~߄D,\ (k&…fP Glρ"g+}feCpHP8ЈE{ĞGz%'N&(E"0xQMjKgugo T|o}X0il6,'h|,,x5QPTndOJľiE)xO^x؁.9Z!LTKOk &RxUXeh0<$ObRg%|wMFQ(`ތ@ƌI0M$'t$}4 1i"O3+X@SH P*0bMv ? #Qq J I\Ѷ"d@@yin0/ԲBZ:bErcD<@> /ExtGState << /GS1 7 0 R >> >> endobj 53 0 obj << /Length 2564 /Filter /LZWDecode >> stream P2 DC4c"0d.bA`k 6"&x! p9@E,H,&p[#) QB1E#Aʆ7#AA #E#*R 1A]*h*" Fqpm "^ pP)*di b($  #\b3Lq: UAFuIm8lci،j}ؠPj1!#(l. C2ͦ,v5]s-UT SzšLrɢh@b@*$ SPN9[XnŠ!ʰ -ڡ#b8 +@Ƒ\3JH6km섭. #40O,Ca`4в0Ư|23>(ܩ> بƪ+c%HvޗXh9VSɠh =Z@; t}Y[9eH(yISi!^Re2;PB,-]\+c֥!+ZQVQ6W.;7y7E[YFTB+nizN:t`>)}lU^^(拔shJm⢅RņѡaLU#1.ҤitžM8 e5ؚdž+ɗAI%(rR4-¥rURz&[4n#"d ؗFs}R3@PàÖ`DQmrdcHA`ƩiYAyht :3Wiՙ8XЯMofP׼P6 XRr\ku;cG@ӱN{w=˴ulD`S}FJUY+Mr +)v!fڥ̭+5jWf.R1|jj8 w#orįCY&sg^ 940l܊1V@I+kj2j T뛬s7dRک;},t(0}1*EޓT2z˿5K( k-܁fuG|cL#w|g>=*?R^Y#S;zti_ t<ztKi"09,!93 H2.U䔴J2 nʮ8ef(lDhf*(c>JT( F8$,bJ}gD (D`@aHj +jP$+g8oPLhf^H@Pl e C( B$Ajm "  @ ,3b*xDL}h3GO p/2C$+ C fx\B _ AD+ P2/pP"5C1 b endstream endobj 54 0 obj << /ProcSet [/PDF /Text ] /Font << /F1 4 0 R /F2 5 0 R /F3 6 0 R /F4 12 0 R /F5 16 0 R /F6 29 0 R /F7 33 0 R >> /ExtGState << /GS1 7 0 R >> >> endobj 56 0 obj << /Length 2966 /Filter /LZWDecode >> stream P2 DC4c"0b0 !Cq25`<X 8Q "$qc c w1HPo7 R1*}DeAmE#A). PH4 ØHArcq|@6 #9 56*NS}@PR-PykySM?eH0,!RDŧalh[ R* OJ@!˪&>` H Rhf$h@b-삄$PX;2AOP1+p1 (b3.,BH#b(HZҀ"H# 3,,L58; p@3qҼ⪓# +;0Ί4㬃C,x)0l@*rҵá0\g{\ c0!v2֡@<}ГU Ь6zJRcC#7Q2[ZVmL3\3pWN{|$VkO0 >"@#rJ6WJ jL)Wԩa*,x鼍X0ShJ 3O= [^>c`V?4Ꮅ0ӌA-NJ:SsL݁\6s䦮FcREFQë؍`8K&SAI X7[08>ܶl5 y~OC5#Q=Y`APTXs RjZJ=3LodPqܾwnc^V6th8lAIرGV$CQ$5yzXrD<5)k[T+w375v0knޛD 8dށ a²ԌHoOEʳfP12<ˑK(i }IA֙ Lr4hSxs'}TDM"`a%Jq2C2 *%m굠ZJa41 _UMyXZ ta:f9br(Sa5ȯ3E@cjB[)gJ &,+4Ţw !72:=?T sK1VTYT Q҉ Il DNhũy$V '@1.B˔D*!1TàSUID?,LMDY$f jh㩶;N :,5٫;$q+ )#33:$L#TLRWKi0-l9a,HfP0c&!; i怯峸b/ti$6f-QrIZ=?ILO~6UsL:["ښ>66 ,mwHJE=ZwIa*#)Q A Z͎# h`d|*+# &,)jr)j7J,2I$,HIHhzpm&H>GLk8p8kUl(Kt \l uh\,ߐЭHuGxL0Z\ RP5^oΠf/ch#άC:@ToXCPj'V  Q|qmbqqn#p$B]@n,0aN˱c0 1u1ho2 Q! hbCQ j)BNRb:g hѺ4G4TQ#`@PC'Q$%%B %_n#g&pu'1n!r TD$C#9*Oru+A%x.nl&.5R 'b-#0> /ExtGState << /GS1 7 0 R >> >> endobj 59 0 obj << /Length 3153 /Filter /LZWDecode >> stream P2 DC4c"0d.bA`k 6"&x! p9@E,H,&p[#) QB1E#Aʆ7#AA #E#*R 1A]*h*" Fqpm "^ pPb4 W24 _1T].1&C FRtGa,M Ihꅵp.2!tֈϫUlT<"S"((K<k>CIA@RĂ+#GqȃL$SPI%G cT3bOBkM e!0U'fZPdӣA\uDUW5eG!2,)4 x]Ϫu`R:QtmsGB'SqTNn 7%N 6׻+͎6; G%&bG ]q;|ʩ{AtH@7 p#h7 #gwqlN>OT`:]sby*Pna  hb ybV"/*daB8G3vl d .XV t`e6߹ _(M$g L:DPUXh@UYWhA9z *3qIn nFywIbaVz1CX!֕V]DM,حtn A8m[nڝI>l8 ܹnJlC J'x$+P1?V':jׅG'>w 9۪KRRa3FW)*ܘ$n6d>3I(_9/\K^And;RY2 m|J /.^usv/P|᳍H`d:9ic Sܵݸ6$D3 U;v);E_}_exqۼoa"M* #E hOxAkjRC5DCD\H! H IDJY:P}ND;ސ@d AQD.j DRY@oe öpxOOo|Ao"Ȱ#OM/EOOe/kD@Zj/|\`fh%i*^ lDPUY eY_X# c(T>Frp0bJ3cOg0MOp[ fc~ZPhHgzP@p/zk o%/C 0\l-H%}> @ *dkb3f*pDLNR%j0bGfEPЊ0SiDd0PcrWo`j~Yу"B:XP}Sra % C K! =%0Skh]e=$SrFD1<'%Q A& a)&D10#@f0I2@!T^ŦS2+Lg#PRPxI%^p_$%$#,-2 )'0-^_ 22(r( #/ы)Pe0,^TWrQpr502a'3Y E).j%2.E HF0r!5Zy5a5m6 b0@pe72H_M;1y8bqӍ 2tA'A(G:Q2(>)s)*@A37S+S<;;S'**3 endstream endobj 60 0 obj << /ProcSet [/PDF /Text ] /Font << /F1 4 0 R /F2 5 0 R /F3 6 0 R /F4 12 0 R /F5 16 0 R /F6 29 0 R /F8 40 0 R >> /ExtGState << /GS1 7 0 R >> >> endobj 62 0 obj << /Length 2585 /Filter /LZWDecode >> stream P2 DC4c"0b0 !Cq25`<X 8Q "$qc c w1HPo7 R1*}DeAmE#A). PH4 ØHArcq|@6 #9 56*NS}@PR-PykySM?eH0,!RDŧalh[ R* OJ@!˪&>` Hk+ԄohZ΄h@b-삄:-(bc.5Ь3 4cҤPEj5L h:-ҵa\3 } 10!@ c BEk$,Q,Paǃ,&tU*2 4m7 c-,r TP2451C>@T%>:h7W %4Uk]O;1 AS 46@)S"L"L= x=(RWO{zJuk(DM2 T Ű0ҼL4M\Ax"BՌJSHR33/\Ra!5:Ƴ#z8\} 5H7tELٌj@퐍9 R: ; >) ɭ*ޅb̡T{Hh50ZdV5m){qCʓP͎&.4*0i֖JU 7 0V7]8czvmSY2:OY5aGl,,(HA'IDT*\݈r\;7+] U5!6Rx-R*}$BxIT`g -MK0D=b0 K.(. wP70- H(J {ƦÒNV~#rmi WzZa-#<Äa_vEeNʚt7<#lVTY9,0x4aQM&Q8u2uj+ Jz< )5TxdQ{hNyK@¥uK3"M`n)הTl!ӣxc5GI \q R5,@$byФu_*"8Ģ P vR;CZn mx$wTZ*Ispr)k [*% fIZ1l.<r?vsѴ˩w0eF+<^V@+R]Z i$Hl@:6eRR 71k|Jŀ+ @A|t  [cMU)ž_fYB/JYW ,u tX\q@q 3>y^u a#1RY$&.0O_,iW7+nBl3 ;A Ϩ6 08.ݍ92[Hzz< 5IB];:5?@'>L@E Flw׎N٨X4K~ <~6eke)vk){j@LedZg:rl͵ϖ?M\B6XqPb>&CY6>BwL9qJVnÎK:V4m jŧn бtlbH7紨bcGVV+>wNǎ팪zrON̥h ܅>)JNZ#h@n Oxɠv Ĉy8s֌&| D$R@=/FM/Lg*@xLU/kвz`+oͬER  OL ` endstream endobj 63 0 obj << /ProcSet [/PDF /Text ] /Font << /F1 4 0 R /F2 5 0 R /F3 6 0 R /F4 12 0 R /F5 16 0 R /F6 29 0 R /F7 33 0 R >> /ExtGState << /GS1 7 0 R >> >> endobj 65 0 obj << /Length 2360 /Filter /LZWDecode >> stream P2 DC4c"0d.bA`k 6"&x! p9@E,H,&p[#) QB1E#Aʆ7#AA #E#*R 1A]*h*" Fqpm "^ pP)*di b($  #\b3Lq: UAFuIm8lci،j}ؠPj1!#(l. C2ͦ,v5]s-UT SzŴ rɢhCH#(4 Rr$&A~  H2@: qh@:Qh7 z> NO<à<(:DP4t`RA !QB2 [dA:Hjn: L p0PPCMhP8f*L/;c'ă$#j3b9H }F4׭13ԒűZ7+52*P6+3cem>O81hX-1Z㪕۷B@`P4KXEU:UʠAY1ʯep^ MH6Ԭnq\ˍ֭$EvE>7q(n7c`˔V4 #uM|P@bѐPѦ NQt[c6KNXsP:cK.07룤RUk0@;fxX 7AD3tZj Xnl{ADBC4$ b 2ۆ9 V 6nw2/:s/4K 7P, 4reM^ 1ha*CR=*ŻmbrjG 1x6O?O+٦״̓hʩ~4&Jxݩ(PNX7rQSpO@87 )FK8S~pK1t>a@ Jp-,w[j(ڹ<0{Û@)ޙfDM3R%e%$Rh ;&&8\hOD  lDJ:5@x J3Ó^"Q>&@|).f4ǩ.#iI@GDᅔRAEɪ-(qGhLA/0Gh%C$0tқS)&j{Ժ~RԵA̱sNB"x(aмdΉJL3`A`v *2u9 ;)wPջD075FVp': /@#),1er'aBmI( ƴ!u-lMsVy5FREHPI!8N9Qq9E a-x<l͉E%NvU*9uB.ϡEv;[ĹzVɆ[ڵ@eDU!7Ȫ%rzjo7gꚥYQX2d}ECG`RQSvg\b VZ+}oE mV1\;]VtTgOS>-J(,pVA2z~e/Xr`ohYٔPrIk8i$"CVm[H5lZRAǙMRHktIbϓ*KkB5p!*BTY"Z?+Ӥ lG 6c4m)u ʆyW!暭Tpw0XBVll4æc˅5vvz~q93mJ )رx+J?ј‘(qKŝj ^;N 6=-676im{XZb͂Ͽ2;&R.U!X>M?Fk ;I>pʈciKQv挠rߖ.XȠ1 !˒ZW `;M[Pd !oQ#LЅFJÃc {IW޽> /ExtGState << /GS1 7 0 R >> >> endobj 68 0 obj << /Length 3107 /Filter /LZWDecode >> stream P2 DC4c"0l8 "00ͰHB,r(sKHm 1 w`d2R1Hn(0ѩ#l(4GuPgJ$} AB%BcqfB6 #9`1' f?tUj0(9e,tT!1sf.ayɣfo6k=Tg+wO( s:}(usy|2z MF\!}gQml$R* O:B!˲&>60L H)aB*%p@4 rah黤0I2XE.hq}T L (.b`20(Ԅڅ<ڡ3h'6MfKLixWߜow^TFUW"n߯fM ^}WI(Ya6 2/e֠Tt q`KM90'|_R}dgz!PC`l,{2$ 3VYt>.ry/-)'..H' l}e#|䛬MEgzngCւ!c8T:N"=Ak…TYJYNZI+n=]K 5PIh{&j ~CI* 0?[ܔbOV)MR;e@nSPӉu uDLsZ"yf.i^V$ Bx-֐9Rh_yR -G m, WnʫG:6 ޺t睹SnZ7T`+"W*N,M11AĘ e a3eWWz5p ݬZV_KbdM RkpعJBVKq˫ ZVTFf8KE\_xN&0wj#h%@{refUh1QK*4)o HT# Nwa6 n[l-es)THv!%Q:H_yK3Š:?)w $dhgw""aCG9T)rżtݑ8lCpГn~d 8+PǣMilC}+].=ṯndRw8&_#ԜY\u˞Wα:=޼I`f.Xz6؏1r )\ht,(h5 T8rb:HgE~+"d{]"2 +hDf,ff*,èhvi 0,NC=^ ̤ BGpK O4ϥ^ό.ƭd~hlJ bɾiFL։M . -O̔zI zdʆ`H *MJ&a22~̸MZF̓,$(^# Id)>K6h Z 6g|g,2ꑀFE6|HjGą̢  x.*Lj/Bn*tuEXH./;(C&* nf-d4PH1fՉ֨G|wQdhx֑^32K2Hl ' )p$tPԂ.@z:¢+&,nh24GШd]&wv TFt0p/:ꋙ dN`*.@.0k, f>E\"Y@f"(.(ƠWp8/z0d@V*ef2l]*+MHqK(I\ҳDD B DB|e " N@`p>Cj8\Ks:L;S1e;Kb<@> /ExtGState << /GS1 7 0 R >> >> endobj 71 0 obj << /Length 4227 /Filter /LZWDecode >> stream P2 DC4c"0d.bA`k 6"&x! p9@E,H,&p[#) QB1E#Aʆ7#AA #E#*R 1A]*h*" Fqpm "^ pPb8 W24 _1T].1&C8 S* E:61V\45>PhZ{pd5𫐑r6XB_ oM kWv:޹*ێ{|j1бj޸ 2ҳh*05ꚺ@@nE@Dp,j36Jh#p:{틁LZ? ڨ6CxJ;QpEXZ팱z: K{-Ao#r ģt<>*HءIJk+ C@:MJBkb P"rI~je:8J8 *[@1*K2TJE3%d;2AoRJQ@:3g2VH9Xb #Q(ATWJa9!jL184Vm SF&ԛHScbP֪Pl{4bKj1aOU!T >2-4{`ij0{q3X);>;ch4M^dace?o⃖5a풋3gY.n6i;0:R)ғ 6>3-QIT`s|dִ`{24wɲ|߼_ڨo.ӎ?qbl4bf:3[VF@;Sh|CdNI>:i}xaHԴ ,C؋Qj-#޾ q3[W;_qԬ7L>-;Jd=} fama%,j^vCg}/%Hg['TVC0\*' Z-:%Q"5jJ ,\<{y!!Z x."Vv^C%(&"c \`f-ȅ: Y3`EX u(Λ :49H7)Њn=_+z,m@TJN8@[dt6pa =D%f-+j##*56GPdD{FKN.sH( TUJQNf*'/ cnDRǹP)+*:_AN/@"ZJv'ckAR)J)+GNfԦW8Yi9θX#9 $O'ßY e5FЀ HZcLbSL:GhCxuxZxiX6(!47Z\qˊ({pnS!T"Kʅye?,LӦ+YMb(ps@orV9{51r,*ͼ/"m_y+|N<\rۅq wf+&t&bYx}cfӹqo fhg3k3E%@-aYUBضXc@P`q #Cp~a NvnD'W!9i(b8XY:YqAd(i :|zQ $eC󪟺 M4D >vCq/GثP@:C6% /䅡 ?&PYπ(d|pd՞I[19o-FBp4pa:IO$,$$nr_@}c3Zssۍ.;&ҁ k?Dªf"izTA+@̊Z똴usoj(.tJw`qAB'ƜRgS(H6GPX`=ɈoaMUf&BY hiKJe2 Cjtsa ih>nޖnhmǜCbr!ATRKx!BFv.:vgklЄ:~ n}jfՋz(^;μd;\L_M]Iܓ« n;|>UW( D*B 1lծMg k,Gn8,'Ü5jN0fBɞlIƽ[M@[ G; ,E0ȗ իbB? ;ikIGLdO8)f̊rzLC;mO *F[P^D Pbu,E6*I΀|Hn*0߈ 'kԐ,RiMu eY ,0,Z ȶ O6Jh6EP`ń$m02 d&("vz1#p"tn FR0!\$ f;p1C#c!#V$fz( 0dD@DP@;2dy\zD()_)e)2(RE* 2'PnQ,REr[DH+5$4(n fZ@D_R2`\o*B).tB"l'Q@spL)ަ`k.K ЇΒ2*8epJM#{-%@sx hPxeF!#u,2u1h1#2 (`\u0R2-c#3 2!<^ H6B;k+ҩszDx>|>V`ʙA+69DTbLM d'0IZQ?#!UK1W2DomPTg%YfnefY3biFJM$xabG-d+eiNiNi!No>( ʦVfRLJLm%'D'j/EBQOp qiP챸-@POgj q oe>jq^SPt9-2CVX`qQ5XYZVFbig&rjpf &oUBgfb$cV7gB endstream endobj 72 0 obj << /ProcSet [/PDF /Text ] /Font << /F1 4 0 R /F2 5 0 R /F3 6 0 R /F4 12 0 R /F5 16 0 R /F6 29 0 R /F7 33 0 R /F8 40 0 R >> /ExtGState << /GS1 7 0 R >> >> endobj 74 0 obj << /Length 3110 /Filter /LZWDecode >> stream P2 DC4c"0l8 "00ͰHB,r(sKHm 1 w`d2R1Hn(0ѩ#l(4GuPgJ$} AB%BcqfB6 #9`1' f?tUj0(9e,tT!1sf.ayɣfo6k=Tg+wO( s:}(usy|2z MF\!}gQml$R* O:B!˲&>60L H)m[jX?<&بJV7hP#*,6)7R*l4H@1IϨP> Զ 0pH"CQ\.am˯Lɻ/fï0P<.+NhBs?0(AJ NJ@-ҺΛPiFS CqK#J4 },P+ cXXPGh7U 0P˛ 2ňſDfȅ1^ VM\V"o(UΩ 2.|JhRp6U/3P@0UmZ1jOgEj]1!yR{\TQr*˷e wS- 1j2PY[w$6/q1y]#|*UiuhuߓU kdA@b,v>e![ ~#P]_m@F+FZ[et (论J@@1w ##%4cE)Bó?.4 98G_ *7޾4 JĎxZN67,H2*l⋅C 1 jG &iZEz=&@7ωˮvMZ+R1|ʾX, ఠRti@>"fkY*c0(5 5K(C(r0R1,aQuqp& B'R)26txFR!-~&0 ,d&' #b M4*!$; ZWNXH"gPGM#d)^d5@ӗ,)XymP aIS1,q E /FTd0!׼v6!l֙tMI9$q:B\C6^t>TfC CH&Xϸy5KK= 6_I.aHxҁ*.:)< !~ 9p_>w:. 1WteuN]9;lf,6$PTS~KG)7~*fW ip4шD!ҊQ2z>iP P:px/c2 Xr$o. LX0diCiPqu7=V)eI} 1+V!ږ(Rʽ "OE<_V|,zZƳ +eVZ{K] HJC=DLVpy&Z2-/9>LJ ͘*-DV˕ -f)A Hpб˒,{Pզ9ȹ3ӟ^NVը~VqTP)R,{rUݲFOvIsl"DA`Wʸn_E虐˖zX(в!>z&FE*Y,/>sYT:;ΰiZ'4rh%>r{30!:T(J{AgRwsJF+V ii(gxQK!@%\T2Y=yn8ᖼ3FPat?fL셂yet%m[.6U;G&\gOolJ1~M_#dwl0ᕷ "۹ko  sGDWUڻ QeE*$ Z !6:zkxEdbў)\,f8::tjP0R2&CՅbƙpM5u% ɟ.]vjKڦ]m8:]eUXfi'R",e/\)%8~[]xVrJ߉%bTDpxǎ\&#*j6+TUD堥6A*?\ aFzwEH·zs*=G㖂Eb fF\l43ѫ-M:ƬX|xvmFԧ{ 'cjQB H6fK p g&ܥ t?Ih@TE|ꢪf0(kI@@_mlE2qB`D)PJ & `&AǛ41uAQ…ѲYC F<`Zql( DzqxY1D7ƽ#qD@Wnz8kkD(R(d2 'ѻ})2"Q+qC,E$P愚 '.QO1KH=c.%x6MEO&ndxF(B6t<,è3"`22(B|аF Z hV B B$]|TEx " @LC0n0i9@/s. #:39ӳ:S:dM";s;A;> b endstream endobj 75 0 obj << /ProcSet [/PDF /Text ] /Font << /F2 5 0 R /F3 6 0 R /F4 12 0 R /F5 16 0 R /F6 29 0 R /F7 33 0 R /F8 40 0 R >> /ExtGState << /GS1 7 0 R >> >> endobj 78 0 obj << /Length 3315 /Filter /LZWDecode >> stream P2 DC4c"0d.bA`k 6"&x! p9@E,H,&p[#) QB1E#Aʆ7#AA #E#*R 1A]*h*" Fqpm "^ pP)*di b($  #\b3Lq: UAFuIm8lci،j}ؠPj1!#(l. C2ͦ,v5]s-UT SzņJǢ&42B"-4(p@70@=BP,jX #R.P ~DP=HP48@9`1H7H( t_BU. AxD`Fkְc0LS$7KfF GÔ?q,O!EqlQsQ;CH#IT'JD3J|-Β<+4s\Gs [2[YOQBRz7 #!Z 2^9?-{Ab7wu>#z{}wJ*n~i\Š5V \#7S 0d ӡBkǼbZ\y*HOTxe͗P˝+3XdvkU_(pׁ1@ a)a5}  "?2Ŏ n𥾟J4p@K q0nE)LpJk!pȀPvKO9CFMN+ͩH-;'F r:|ׁ OĘuƱ]zS` ;%1X²F . ˚ w/4] 4d9I}̾J-x:}x2B׏X2ʧvV !3fڴ8p҇Rt HyqturׂQL'@КY*I52b}K[r?$*f;7q.XҰC iʅãCk@)%H%C-P7V kd46E&<7MEt؇]R݋ONlA5'@). -%R7 !`q&aAJb;} AM_ dζ I Yk2tmPA3j;tkql .Ur$A@-Sl[( {-.NtwZm'X#4WpQC\0X53rOC .QcV 1~W-.ViK& BRo:*:8ƊKm&5x?ẅAUCo'W`$mKKӾJݗҭF>m "_ ba'@]fq ޯnont{sb?$pRo2P( o$LbAcD /zttDF|p8Ϲ0ǧPÁaXw*(N-c>gM9Q6KBfڃt~bee,4lxf=t7ߗi{~4AIP^eB |)܍PQCV,ԒQ/yE*NpR|b)>a((ɅAXKg'އ*Ԣb 1z$fDso&N(7-(;G+ц6z8&ҔOhj 4bN)^qZӃ6ʻd 3G~7Bu'QPh>g(@M ȳ'f>r I\*%J┪UiCpporڗ0z@j; .^䎊mxõF]F>DĈDiD=PDpCq&s#GAMG1J$i++sڋR B endstream endobj 79 0 obj << /ProcSet [/PDF /Text ] /Font << /F1 4 0 R /F2 5 0 R /F3 6 0 R /F4 12 0 R /F5 16 0 R /F6 29 0 R /F7 33 0 R /F8 40 0 R >> /ExtGState << /GS1 7 0 R >> >> endobj 81 0 obj << /Length 3245 /Filter /LZWDecode >> stream P2 DC4c"0l8 "00ͰHB,r(sKHm 1 w`d2R1Hn(0ѩ#l(4GuPgJ$} AB%BcqfB6 #9`1' f?tUj0(9e,tT!1sf.ayɣfo6k=Tg+wO( s:}(usy|2z MF\!}gQml$R* O:B!˲&>60L H]<ahd!h&⠈?!{DQ*r!#ahBs C \H5\!A?lk*(RjGQ3 Je+<cLL @slԬ>A9<CNf'7(JT 6ВCl5G3M .#|T5ϡ\]C"Q%s5*TrXSchV}UClگ30 3EM#LGT]_6=;H+]UMW|>[Q״1|@7,`fiZE|2VWҒ<*`@S.P2'NG3\i / =f&?,ce-8]%꭭ M*{=־˾騆kjPqUnk%{g['>zn՝kY-&XDV|d0n֚5#\H(nE3ӟwAj {6Pie]7 c5[f>̄fà@9~a@ǜW iXO#2( hýwm"cBRfx카"ja5#@S@oʿ o 3B Ke a2X/: ih !2Ct!2j|zü0v6aKCC+40$HY9p{e8N`+2HS2H[ ԛ͐F8edHªU.~>*Α_G>vORaJ+:`D<9xGަQ)I:ZzIEG`f`Skj5ڨ3IU/v\R$'7@j @v&Sb\m_&٬$Nөַ8Vd]!J 7\5@-O "?EKjK= [nxQ乕0zpSL\fPJD MUJ~j+bu|$ ?V5~Z2X\ΕfI2WGg. ;4tVNW3g\8LVg ,Г#ڈ2PSB+C 3oP~/cz/@{ t Í;5F|`RlP4d,fOm-M6 ։-Γh q,H 4,n8&h-Is%Rbؖv~c*-zKк-*XD/rpmG%Z U"ɇ()NgO&/&nR4V`z\UThn|qFuEи4.tH-D.#|ZTr ` endstream endobj 82 0 obj << /ProcSet [/PDF /Text ] /Font << /F1 4 0 R /F2 5 0 R /F3 6 0 R /F4 12 0 R /F5 16 0 R /F6 29 0 R /F7 33 0 R >> /ExtGState << /GS1 7 0 R >> >> endobj 84 0 obj << /Length 2216 /Filter /LZWDecode >> stream P2 DC4c"0d.bA`k 6"&x! p9@E,H,&p[#) QB1E#Aʆ7#AA #E#*R 1A]*h*" Fqpm "^ pPd2 W24 _1T].1&C8 0* E:61V\45>PhZ{pd5𫐑r6XB_ oM kWv8~޹*ێ{|j1бj޸"pԣA4@R"b@3>(pCq<4,K TSt[1*P@ @D q^4,zpĨЩ5+Z *f ʛ0 : #|l-ps/,OM@3 ͒6 #: ҭ?J #c-+234hq7:,ZOcN}NN䂈Km1l&kr/%sW,0\q&@,V%j46Nf@+w0ԣ0\?JM*Jx27O-@1,Xd2.:R58%bb5@Leu>pj*sUԝ\r_֞k'@uNZS[fU-8ARQ-SM`䍶vgrs iS!i470`Mx0UaO> =94b\],ۃ)|]…׬<!y*&m6Ŵָགྷ-ce90i}↡pm\>['y`FmzxUʲik`u2W7#0FF<Ca !%"E  A~ k- >#[ A}EH4D4nыU~ u}pN˒ (5e[s87wPC1 ~ -1s*L2fL" uOɕ7pP 6KE%䢻ҫ`aP+4 o$8xË28yD bĬ&lF-ZC VGm%vcecT:bl6E2Z}h :wmmV`Q%a@22tؚÓ%1π$,ds(V,X@gsSs&CL""dZfCxWaaV9Ƽ;2rmspǔ*٘l6j(tq>9LW放FNߛŝRɰxڃZ(%Jv =3ENoC ~6EpPvOhVok(%G".-ĭp E)S*@<\Z6Aֿu1̑U+KjV*t@XEy$R%TVIV`DI$eP>If#5 MscQ j 56K|hsgL a /u|*Lpw-}Sc-]R>N2sb*D etO\V]&u݊Nfm&w -'e>mA4p\|&P(a:FQ\ŠB$qoUm^Blq;RʶܢÝx!rm+wl4׎|o0J)BS bw7RH@AGs\L1IOZ6:lPD8. fۿB_ "- 0›Kr S.I`xQ $$F9-;B8p毒ڌXq<;?R%R[MTHTOX-ma;Ѣ,H 4 YfԹi .Bq3\~QF7m;l`.n|)؛*s>sܤFZos : I 3ëՏ~%u@#tQƽDǩ R<Ef(2<&/CZԅv|*GڵUIa.A6V|g O!q:˓~D= 0LF(n!A endstream endobj 85 0 obj << /ProcSet [/PDF /Text ] /Font << /F2 5 0 R /F3 6 0 R /F4 12 0 R /F5 16 0 R /F6 29 0 R /F7 33 0 R >> /ExtGState << /GS1 7 0 R >> >> endobj 87 0 obj << /Length 2787 /Filter /LZWDecode >> stream P2 DC4c"0l8 "00ͰHB,r(sKHm 1 w`d2R1Hn(0ѩ#l(4GuPgJ$} AB%BcqfB6 #9`1' f?tUj0(9e,tT!1sf.ayɣfo6k=Tg+wO( s:}(usy|2z MF\!}gQml$R* O:B!˲&>60L Hg((([KBn*4q@.2!qG1{aDQ m'f. R T9ƣL}H!"q@7L2HAMDJ#,1B=12tHK&ƿبH@774P; P2!F*44;P)@ʬJ2xL7BckbzJD /<*pfR44ŨU#B,vP%?< !J(A7W,[T5]CpMKyML*er JV9uo ;C,cf}) SBiH0%8ڻYkoDYI?4a|ʘ/YH`z /cm֛{S㎷?FgPf38nT˦sz!whGo`%9я2{OI_CJyMvuwijkZTyhCC*jJrlfe٨mO~0lv/ 0w3k<Eޕ7-j8M{f*rTi!Q~L9CG7+pzv?y(Rf/U.ïHj `Kuq eZߦfF lWnJ *@TDimT y|il/dg$, n]+ibk|6 VNBU ^T !u R:wisr)P EB+ j*'VhK0:& k7R'K} xfbf pb,HX+" ¾c*Q J1| T+zFYǔW*Z+<,& g&5HQlT⾀gСQ ,UM,/Z4h~Xث0_lVCFy\NMXdf()NG(Pn{ GEvQQWhM {!K#"$Dl B endstream endobj 88 0 obj << /ProcSet [/PDF /Text ] /Font << /F1 4 0 R /F2 5 0 R /F3 6 0 R /F4 12 0 R /F5 16 0 R /F6 29 0 R /F7 33 0 R >> /ExtGState << /GS1 7 0 R >> >> endobj 90 0 obj << /Length 2889 /Filter /LZWDecode >> stream P2 DC4c"0d.bA`k 6"&x! p9@E,H,&p[#) QB1E#Aʆ7#AA #E#*R 1A]*h*" Fqpm "^ pPd4 W24 _1T].1&C8 S* E:61V\45>PhZ{pd5𫐑r6XB_ oM kWv:޹*ێ{|j1бj޸"pԣA4@R"[Zc: h7z !DD 3Bǧ ˧ ,`CIn:ر)!)#᫪C|;+ر>*+RԷ(j(@;#`;3 A174 LģH1Pb2} J σ24cL6AdCeF;Gk"I3R"4į.(@27(Xcfе@Zas<(ĉG0L"rRr34 W4$ؒjjƈv\U4 ԣ2+]#rSʰZ-@i;aEJڱ?8@n f DJ4 3@bt2 jRL׎My}b+#YP4H~,6X CFuW r#C&{KA ߬:z*SRH7DQ&o2N?dR@  H칂Q Kb.sQĹ_1;g8r/,7n=z$~T U# myT)<ޭA+yDՠg`ɋDŤ,J6C\Dx6 {1 K6nVYP؃FSo @|Gz( M+VU:[ /@L7UPdۨreI9"ÒMB@j|0dAMf(6"\}YC>-zhq2H$g(d UqZ*bDB<%ĤP9K|.a3 RKB*Ea;2[C}aiQEy8"&GF `ędh?3B 9-&DRLHy%kqKޜ9,͇v>%:xFitSL<*TM eQ H2(E@ҥ|f" lo1 Gcg@RQJ"\5쯂QLFP p%zFb> "#YϊAE~O1?bbqD'E*զoPQ Vp}-̿`Zv$Q=t. 6j=ȠÊe j-4UӚ,֓(e%҄C.i DU#f? X4Ed_Oj֊+<הrqܯ!0oT^%)Z>#̓.݂JF*qe"at5PI~\b~R MHa s9 y-5ua`h W;M5VսD`7 bÈ=E+{,P:=ͯ vX$?30$ wg:6Su՘;i9|YaQ8R9No;=hmgkLE" ؗʷvJe0٤F{ii, D3_LI$JIɨfA.46d9Psn2Gʋ@U&+XcW,:΁DL5@&cγ\vs{@20B2>#g$`+ D@&|ZƤq2Pkn[bCWAt fV^X w8rμ][(oh@wb^AiL3l5>Zvw/'6 ZoI }BD;h :ۇc.j6KiR6b6 ̗^iXշDެ<뛍2^IvB9*<OegY3ORKy?4z9TMk`dA|lj[~Nhk[ԝE>v_5HJFz,FՇ0IEOfMsTsx7 FK{bKDDan0rwTjol.5n`N#y+D͐QI^"IBy*΋ HX-E֕V[B f  pJÐvDž2LJLrZE2+Ǝ`/(ìW w T v D2B`r5P \mhF}j{EEhDȩ  #JQ#!ʔLex ~H K#Nb1 QQ"& &;+E:L""B%,!GZP8i +PA`ABj(#@j$-X ( M^*FJ8"J<$+ w@/kn:nr++9D0;M`y Ci:W¸qH DiҢ;؃a d2 C* B$jE " B"8j0`1n@w' ( u(Rx~ht#RRd *2' +Rs*#R`" (ky*  endstream endobj 91 0 obj << /ProcSet [/PDF /Text ] /Font << /F2 5 0 R /F3 6 0 R /F4 12 0 R /F5 16 0 R /F6 29 0 R /F7 33 0 R >> /ExtGState << /GS1 7 0 R >> >> endobj 93 0 obj << /Length 3548 /Filter /LZWDecode >> stream P2 DC4c"0l8 "00ͰHB,r(sKHm 1 w`d2R1Hn(0ѩ#l(4GuPgJ$} AB%BcqfB6 #9`1' f?tUj0(9e,tT!1sf.ayɣfo6k=Tg+wO( s:}(usy|2z MF\!}gQml$R* O:B!˲&>60L H dBahf$!h&⠈?(Bޅ!L@2 2!j7 #t #GCЪ@J-KdBAcK)C -QXpׇ*l6(P2 HR2 #ʊ.LHLaʺj1ljlP,@!24,:OCe)!!꒫Y;XZ3)H@4ʋ@8Y0c,7\6m #pXN,JC.F֒K2a|ȌT5QUUc0ָj[*LZ~J@4ظ&70ϻyVGB*2Ug) 󯖫9HQޒ A2"pÌץ|8X@SeJyΩhǠ2Fo {WT*c]^A[ Mכ, bCvaE#nX0ӎo*X?$:a:(DVK@-9NJzahS* Wd7pa"P;K$X?(Ts#bVѵt;6npTN) t(<j~t5{Pb5ĨTJH̭u`C[SDt 3=(DQqM$ &Pn)zb.`JPpuʆ*&u1JXOsc,pпJB3RʢL)J9(E<mZ]%' M_@*ȚHRFa; qV@+ @Y_R:]2T(In GQ˅e Aف);iڡSr3OfMjG]_&ARFS!c/9;dB5&R(^EC0Ӵ^(,4tB)A5U ^eYS$:F,HM'ښRV D7J"WfI0n&W\7L{U05åH7]t,tLbV4ʕ8DH*{nͽF3\(-ňJH&*X1*.87h4jkoyBDT0p/Uڧ6K1]Ȏw>C C9lĘoh ٠R /6m½ߤH:]v]5>F16Y(Alo\t6u:-0_lӴlQ&̃J@7iv~$辑4`f00TZiPfRr ,hr m .>`#w)4ُhl/M:E{:a3D#pd=]=@bjeʖT +Y ,tԷfY@%f6 [rӁF",jyَX7}=,F`4UX_eZm7#;AO8dzBp{Y޹ιg|bΗ{:i.1̏s*It9ȿjTLwBTev]3s65'Fiإ'KT|&dA"cCXh{4}6ȃY-| E4ܺ~3Pt"Ό< b Ӎb֌ҘV>Mzˀ 4̎1Ǭf z fˠ#9 Ep5#c#m0Ǫ7Gt$]£PV`)InXl) tfZn$tgW%e2l;bHj*X@+)+FVIv^()< $Ʒ^bR2.F.m O0S rb!m;0Q#i/r*D1 0s4N-3 Q!,Rr* 'M6A CXEk7PP2i518q#5QB#R w 3PU&ϒ 9b9ˡ: P6:xݒ@0/RGt 2B'OM$ɀP 3%3ňUEl]iŢZ\QfIhv3;?@#4b2#f}x45Gn0'6S"g41Ӂ rgԉGsgTirtv+@(NIGBnH(4pK!bG=!5޼pIIOIP@~ ]Jrk>064)H:0Pps 0 +ֵ,4$mNzTQ(`U'b`Ĕh v. }U(Ɠ(z'sH*[vs2Yʈ{'0ĬEwRbIZĭ`ƜÔapjh&ch bE^vȵ`Z:$tr*)LGL-6g ` endstream endobj 94 0 obj << /ProcSet [/PDF /Text ] /Font << /F1 4 0 R /F2 5 0 R /F3 6 0 R /F4 12 0 R /F5 16 0 R /F6 29 0 R /F7 33 0 R /F8 40 0 R >> /ExtGState << /GS1 7 0 R >> >> endobj 96 0 obj << /Length 3212 /Filter /LZWDecode >> stream P2 DC4c"0d.bA`k 6"&x! p9@E,H,&p[#) QB1E#Aʆ7#AA #E#*R 1A]*h*" Fqpm "^ pPd6 W24 _1T].1&C8 S* E:61V\45>PhZ{pd5𫐑r6XB_ oM kWv:޹*ێ{|j1бj޸ 2ҳh*RsP#?Jʩ>*H40aPݪ8,Q+|**Է6QR.H(Pr3̨s([ I0 Rl#ֵ c + 7 c(@66JѨc6N) k+ C'P5 q%JKI-HhC-pP;3(n@>.O0ةEdd1c\eW8 B %~P APb44DıtldʌK@*(bH tRv2$SZV͔ #u#A[P;cd~_ZL24u l?ш")=@` "A,03tfrFqQY셐ȹPAe[h0Z5d #AHm]j~!H#HViBN㳔;mpY1Xf͑';y2NL@uQT˹*[z6uc+I\WUy`u7?ArR.vpQ'n6)Ըv=b-#Xb+Mbc0A;5/W@8sØ*E|[y+54Qoc Xmc˕ k}A`ԙ҈ vi='Hk2f !Rn̂FBaG|BxR 68X^md 88C$(3=2T((ML8fԐSSnhF"bSeO.΄ @ be0Fo+%@L(-Bآdb1L@ A46d#@X: 0ífBOp5)O if DB/0YX(` gP1n"Ĉ)4ę%2$k1ɦz)8XʢD!<`eT ,pҞ_j? PJ*>[M3C FK #2Ps)!#|T"'ľY4- @BQAR(уr` m9<pF"  Pϙ\@6hO&N5܅)^B&)x]`vE_+Qk HCaC`c&JK'bTVp"j Ykf-c;&B^G텣Voj͍1c c'}[ӭۛ8_ eP.fj[lmSaBu9@ǯ6`:u~ g,ҲE `ܚEywNHP^DSȪ/$ V*b.vet HeO|V6pC:=/22yFAITVCy& b*)\Ry^rf u0ꯊJz+2as)2&ȽfcR dE%3'SA/= ;&:եLt7i]bl <7]yheG<.P1)Ѵn1c$å/uZiWr^ESPű[E'4xQ)G5Iju:hvUѯcG%z);,St,` 93pS`d{)$S7r޺X(Sh9)YUL/@CfMZԊqI00A 1սNbC!mZlIPB'"$g"V"%V9i}d Ԏ#gr+|jX3@ߢNs14t $*v}P.jΕEz82^dy|ǛsKۢ~t9ݖA(P} j(&#~P B2 gt MOO0d4hU )&,^?}.X^0|=<#.%"o0Ji`OFp.6p/PTTgTdI/&+"lVȬ`pꀛح` Ύzƒ0s.o*"upЀ ?T no0% Ol20z簽Klz.i / Т0..~`P.bЈPRNZ0#o0+ n'Pr%% ) .(b oy0(D JN8h@d0p:Q Mt[n1iyl1Dq;(/qa 5E0;pK` {ѿQŕ])Pؐ+JBH qC#K!r-$/3$V!%`/1QQTjrtumSJ J*(#*`P>_+d;rUs%r7"O)0%29i$2G' ji%*pN%p%/H/_2$ Ё2Y(pU*r(RQY 370[ ^Z*JfĢ d˃ -># 5R5u s %zC@أVrJB'D"nb$H!l#%>s<3=_?ĄJi1A;Ҡ>S@R;#&r!BыC|RKB1?-AGC2QB.RcCt*KODM8iD<p@/Gt;F endstream endobj 97 0 obj << /ProcSet [/PDF /Text ] /Font << /F1 4 0 R /F2 5 0 R /F3 6 0 R /F4 12 0 R /F5 16 0 R /F6 29 0 R /F7 33 0 R >> /ExtGState << /GS1 7 0 R >> >> endobj 99 0 obj << /Length 3768 /Filter /LZWDecode >> stream P2 DC4c"0l8 "00ͰHB,r(sKHm 1 w`d2R1Hn(0ѩ#l(4GuPgJ$} AB%BcqfB6 #9`1' f?tUj0(9e,tT!1sf.ayɣfo6k=Tg+wO( s:}(usy|2z MF\!}gQml$R* O:B!˲&>60L Ho(+ЄoXZj0I"'O?6*(R4Үp0Z|z1**!H4c@@84!j2c+07 2ԶDI!pfE0`Cp3D;o F:1lk@J@034ċz@o(C(ܻ=R/XbO˼ Ɣ2C822!*T |,uc[a64x< 㽍[4:A\Q3DUtBQ`JC-;RCڃj7HEc3S(|תHQ)l꬈8 7۰08|ɫ #&LX|: (A: #t5752K35wz2z0Ț[&SE@@2BudtkZéA,2$_mqygzT`VP*;=5&SÞusqqƠ$Vqbduk" 4㭶 _W#`HEJ+%|0<*`16<7@)hSӶ*<0jRJ2h>>q O2)ݭS*Ox c t:;y\͕)"`p ,q-Ђ*#Mh*vQF(DU:d dY"w&8t 9سFLgK032^1*\0 R|3Tz L[QgJdgcaUm4!Fv E30S$IÂkX~1OhR;.d+UΉGads &'7HHգFQRJ8){yNZAi`7q;̆Hp.m򈦺*YUv2gj*8A:Zx2KӾo;R_Γ`Ml oiCԥCw2#v,抺dL!&YvU6 WL:+,PCyAo5&Tƛ#}:FַsVQEQQ_#T9ԥ'1&.R56xuS@i:h 2_,Y`,b3YYZ,1ER U:e!5UV*3tY(JIRҥjd OI*e=uB)YhP,jm:8̖A$5I!LUHzW*; y|?8nL@=D xt.B[%%),1ޗb$i<(zXdMO*u7^kZ3$SƅY)idGjKEqm#0܅ntc+ae"gtӚFKw2 p$T蔈O a*f9Hea sx5Ğ `v7Cu+%Yh3*^QeK^%@Da.sY)ݫR*czC/nPnMZf ve/u j;HLwbSH~Eq\L:S"PDZy:lS4J/MĹ,K|fci Ϩ-y=0(וo3 lZI/K8A SQG)FκW(An6q<:`htFoY<o2AFXYB_;\ E3Z:ql[j^ QL*eK*C*\ ok=QёɎ/d)˲զWh &f-AwpG& 2, |JO~F :쀃>kUyt&Cb]:S˔ey["]9Yop0XBDcjx78n":Ǒ>n'#`]jp?ϟ?qVI\_yMupo` #C)J)M*Qg` ֿ&jfH *䒎pƦ `\=Ɇ-z xʞxȰ¥4_犫h:Kfdx L<#ST/|$V/`dpމ_Dz`4᪸`fH`'Bgzh쌃c hXwvHg/Nd@ J _WGjuhv xV画G* @'rmP>낄 Z @fPĹkҕ?', %hIJ1JyQTLv2&1@πwb TD# rdP l ^ nh֟Fg A1YÅt.H' eHfpg IGX1%"~'d7EpQLd:#*P ⺮-_#Da %; ¢jI& /#f:e) 4OUO4pG1J` ڊ21 REB-E21iH}ce(LUhrBtlnlc1re)N<.^%2m-&~2p#sF*M%5M(-(R? OS0ROt/OQL;IqJĨ0ff Ҍ+ xV](n|{&o1P/T\E*DŮN0PHHs L$ah,ʔ Tʊvp*2?*fnè{.Ibڹ30]`s,/)hݱgQx+B q=pASRL:UD\<4FӎTL4)'+4){N'EYG:M=Vc0>"tXH{NH_ {INZQe0ctjT`qyT6 T?>DHb*d\ةGj7@ yE{(4/>\*@H|d0x 0 nQTG-XZ+_K֗ U@ ."I'&W@ L " mN@?tC4Ew.df r7C#"7g#w(W6#B*WHCsq=spYuwOuIs&  endstream endobj 100 0 obj << /ProcSet [/PDF /Text ] /Font << /F2 5 0 R /F3 6 0 R /F4 12 0 R /F5 16 0 R /F6 29 0 R /F7 33 0 R /F9 101 0 R >> /ExtGState << /GS1 7 0 R >> >> endobj 103 0 obj << /Length 3422 /Filter /LZWDecode >> stream P2 DC4c"0d.bA`k 6"&x! p9@E,H,&p[#) QB1E#Aʆ7#AA #E#*R 1A]*h*" Fqpm "^ pPd8 W24 _1T].1&C8 S* E:61V\45>PhZ{pd5𫐑r6XB_ oM kWv:޹*ێ{|j1бj޸̢&42D5-"l#֨B(sV)#8:RJbDjZ U BI~?egW-Af?KU)jZUQ0GJńX-W*dK֎?>,x &'(Y{W+Gz)5R٬uG٪͝*JL̸M!6S:h!@6,JHXw|k&RN1[!@![&I0:?{5F5ɣ 2Ap N 6pPQqU7q k^Hl<@{ه!/ecvxQZsAC4+jt6lwE @ız Ԇ^j%`JΣXD톳ZfMe.d ,7#VY +-;zRa`+xd:(@:8Bf#@:)l,;N[fܛȮqd.lnF!^Ԑpd1n)wa&Z*"GF0&hW ۤn0 Zs @yR?ZqPe2xpA@Gzi (\/t{QۈK.  QH_hӺktj0rRCd TO-@^ fz^PJ9B2~0>K@i%A22ʞ·Vu> @A_:SZY9@vo$fwiP(FqX(!I߰kRW`qTE=ػI !pK A2>5ګ@VRZi%Ȣ|&>l*NMYXj2D%̍@8O 0F X:", jҔ ; 8RnCЅ)\sA`zyp?95|ٛsu.U)5&j_L9yvָ=F$-C)'e"ʛi\UԽXXV񉭑pmI!L" ^m fd{ [#z]i;83 uԠQO!:V<8~Ь?Q2tDfͩhwFȸ5:,ll"4qPZ:`= fw<٪ofj쟺C5[N1XBg;/b %zF'3J3"YM!gVZzydNCڤE82 UpD%+R;'2ld<ʜ~-AxCHưIW면֯i_1B%\{ʅˑ.-7f bGGXD\L+ZvoWZJq-ܭc[ٗ F`ڐ`jуC(_yj}M;qi}wCiq{fHg$< X??m i#Gx)0JW1}UeԅSvڝl x|֋K[=q/ .S tnFöPߩpPK ^Ke-C\ k`&No7 ~J*o܍"o&㤦 nhJ|v;oNNL0>~:"lo¶ϻ. B+0JzoQ䨕%$H\ƬdDy&~%r;d&dojCj>J̰^}bBi˒ye! Jzk*ѭ\LFkYeJL ?EL& R+`e) L2B)\U,z }`gE(&C.(M W">o"iT*\( &}yJ`PQyFK:Q$"- EȿLӦT*&ԃ%qyͫbó 1dNC(dn&o_,@ ɩ\Gbb` /n@ 1~9%xWBnj@TuhLĥS'$U'Ebr%R-,Q*Be\VK:yUʒhUO52Lfi,/B#L AU\\De` ` endstream endobj 104 0 obj << /ProcSet [/PDF /Text ] /Font << /F2 5 0 R /F4 12 0 R /F5 16 0 R /F6 29 0 R >> /ExtGState << /GS1 7 0 R >> >> endobj 106 0 obj << /Length 3417 /Filter /LZWDecode >> stream P2 DC4c"0r2 !Cq25`<X 8Q "$qc FHQP- h`(0F#AiE8QT*GJPJ &3hPo7gm(l(1͕T%A HL. ,&3c`c6*HS8N#(D(!҆z Pp-7EY ,P . .9#n]D4jm0bz LWŶG_ ֙a]4{/Il1s,`&M@S>r "<,c2H. PS *%p@4 rD!4h1A49 "80!zI tA<"LHD/⌾@@8at4hLMĝ2@hD)4^!P`0)1`Gf 0cBB:=jAġ5*B=P ʨ!aU{nPf+]n c.򂾫 RMq6$A3TA20x55ZV5+Ka k :;އk\S4P:(d @C~Z4I( %PTL4ZKֳ/"0Dٓ325PAM*(r(1b3(6Lkk& 鸨W5Le6S\ Q6' bhX`ͅ4cر ܴUա #f!O'ir1bb5XJ6V)X(0ݑxc 4>+a@4 =;M>l@4cWN;JՎb~w2hMy=`j8فkꙄu+!l)p p ,-&>AF  )̭8J(' [(hkhnK&AœE:㟁D*Ge&oY]kQ)5ʓkYp B0|N%HgߋU<;kr˺g8i*g[ G eE:)o `ѺnCa =`P),/11$u|b%|$X\[ ,&׈axn^2SF:*Ob*D/%2,ad %y@7ynP A: i)vu!x=SK,o `q4ʹl[ 2eݗ~kT360$_.qPgPlY!EG]e6h<irQEx+ &!l3@H\BTFv 'mJzEUc lMڐ:_{az0Mb*EΩm "s2%NT곺*R,m{}yŌƺi7&%ʐn@'k-+2K a|ĮN啓82C]fS*W9$[dEb/pCWPh=Ԧ*W̬mnyJy,R eW%[[2j^If?F˫BV1_R2m}VI ayf`<%:Һ4qtӏ7%a(qf3 7HM3E=l*0zQbݩ(*`351'ta /x 7tǫmWu%0gIB|/[a\t eZG^_f>7֌E: ۱kͽ-^Km{q!V5Hi3 `I{g X^}1[*%oF4׃2G=?L8HCȺ`3. P1L)>CA܋3Ji腄^hnm` ʵ?1`5RB,’?jB1P^'ׅ{ 7-Dé6M;Zm1z >u}1iǻdbq1LHʥ$*`AYi\h[`:]xPxwR1/|&laSgz!ɯGqJiא4-<♙BW[+CB<\v7)nɩeN-hx_Gy&=i =``Ll65*eVy .Z'y.cD6+7oA;"ò[2SISTTbeϤA+Ba*f=5"|4"3DkTMXEd'K/G%--iOz$c>fp FV4PI -f,J4n vˆ; 2}~p֊/J&T†$" ڵmzI.c20 ЅO[q T1"kV+~p&D,:'Љpάxj,`HW|^ ij5n)t u1"-^ (--,1I}dKL)L@f4.`g (_ \m \ $ y t Px() /"`u&X#;f=Q `X+ .@fnRO|]p@<f,.vshQBcl49 e&elB*Ot0p(@ԇwƟP:` a ^gɮv&F+hj3漷fT/$6> F~7#8ɭl$XxntF`^n-/Ԫdܭ1_:>* Ν5Uшxa)0o2Ƽ ,*kLjb&1-E,'ičdBBeZO4X.2MR8|꘩"_ g.HZ#q%QTiZ2:L(o 歂SnHk)BM)c ^, +R0 m=AS(3HQ<&Vʑ7/ 230׍*S'7jdS> C4h:s"dGhqL(]Cj <&<ԃH{n Ym~k;N*IeD,II `MʤN5t'FmrSq1TSȉR*,)#F..Y%/^m#vb^T)4a3Jb4d50,g70n&  :ea nn1\  endstream endobj 107 0 obj << /ProcSet [/PDF /Text ] /Font << /F1 4 0 R /F2 5 0 R /F3 6 0 R /F4 12 0 R /F5 16 0 R /F6 29 0 R /F7 33 0 R >> /ExtGState << /GS1 7 0 R >> >> endobj 110 0 obj << /Length 3747 /Filter /LZWDecode >> stream P2 DC4c"0d.bA`k 6"&x! p9@E,H,&p[#) QB1E#Aʆ7#AA #E#*R 1A]*h*" Fqpm "^ pPf0 W24 _1T].1&C8 S* E:61V\45>PhZ{pd5𫐑r6XB_ oM kWv:޹*ێ{|j1бj޸̢&42D')B!C΀P;j@1J¤p@:*hp^66QB Xb,Qø0 +LP7w#H4 Hګ1+|[6Qza$ o%$I('K L+k!*$[Os<  5+Z3 ;LjO P3(qDVb6MUC KdTJ[ cx7JCMS`˯K!@ηW264jqHRT0*0 SR&B0t4ՆhBĢn(TH-@w@-ORA%^6x>jޢMCU4R8JJw?+,58Z6& f7E"9̘D. 8nFT}"+p\вy \z}2ԑk3T^ B2 [c.\0 Kt"3PjSc#dIpe2Q|G!@2L\;zƪbc2P\E T7>UCo6f 1Tcƻ/<0.t1t12%4K5T*>ZȒ&?Yx@#oh4ԓʨ0_Cr.[D@3擯}_rnQI"93oCqzE5uQmQs23 6teA3 tCL#ŧƄC4'j)KP@ z 7'hRjEPX-G֑Ma6\My]:@XE0PHdMp(hC{i/%֢ۣ͈Uteu?\LY[p9-FYPz3\H95 34 \ Ce @Xz!( lG8#榒jI%p\vi hܮ0QB67'8gM@ :WG>4!5GJIs"(s/TtΛӥP.3MR j XL;>-Cuj?dl=24z~f_p љă\M!ѕ"< VmtH!SO8c-Y+09%pz)٨`+^-w{cݔQ7\ hN7\" |l0AxPRdrRY{Kﭘ4<ZJ~ey;S D +Wko='dB:5\iu8dB`.;g nwwB/a(hGNi? [Cdw~St|+!;"wG@V'~w>佷w_5sz[~s|} }Đ0y]F[|_DM,NoJΠ/9B믘nio PT"z,Gn.8PF# OZ+4 1j0fn\7= y+0qΫ jQ{ N7 ѾEn$RQ ~jЧ!1W-/QNW @.#@p'B/#VR~J!- C*"J5nYL~€b7(|Ô0]R<4>/"B)(](e&q꟮&0nt+vpЖ rA$R$2\t/cPHG,I(i)2I)- -*J#C.)Ơ& 8ArB/0RO Xڒ^v;A&44I-r.q3r0$ҝ0 *#1"od,5*,EcU!R/2,=03u0#0χ& 1D9’Y((P/Ӳ;ss-q;{0~1*":G: S2;$s0s4m'<3M75D,4aƧ=/(3ft#6-T-?r;*bCMFfj2u%DS2=FPY"E,QӬ &ӵBe4/C\a3BKTN_Q:ds,?>qKsw?R[?qLOL¥ Ģ/J P^a򳦾#t32;FyOt5C42vkD4"4u  D'=[RkNc4K8BӔ<5T4H"Jzpd:kܼkQ‘I"  0حТŹR>Ҫ!Ui> /ExtGState << /GS1 7 0 R >> >> endobj 113 0 obj << /Length 3945 /Filter /LZWDecode >> stream P2 DC4c"0r2 !Cq25`<X 8Q "$qc FHQP- h`(0F#AiE8QT*GJPJ &3hPo7gm(l(1͕T%A HL. ,&3c`c6*HS8N#(D(!҆z Pp-7EY ,P . .9#n]D4jm0bz LWŶG_ ֙a]4{/Il1s,`&M@S>r "<,c2H.S i@,"A) 3A`4 Kޢ*2J@J  H27k0ʊ2-M찮,7 c(X҆m,3s:+lƮ˪8+R= <^I)}%riTk8WjAH\2 Ytmp/P;RzuJN2%6~(d/ēb4:7AC.]pl`W(ظkR|pܤA\W;):8DUAȝge-J&`CYK)CL{6xy1-/L|-H4DJPȆrLq8Td{ 0ힺR&KJ j _AD Hh bRi ɰ7)``pN䒰3ɾB@ф"d"I kXFgF.@RSҶ3f|@0\ 1StPINz]#=mkY)DːPB+֮ʺM k^m@r*/o%f!C,}5B]%&}jgutwUeÒ Oj08(Jsm…B[KmS-pћU]W \[ UWJ QI *A+Hڽ#mĵRbbc ˌm+{[0}YX+<Q5%>XMI6v 59 g8A. xk,&'(bʻWcЙb"c1Һcq2 ȵk />&:e c6U7JOi֭ؑXNYcitNZstʝGLeVy V ua!xtm!5z$wϸ7#\n ۀ`_7&Y?t`t  :[3% @@ EhPc6:) @ nm4SHmP& @52 @RNzk0F+, ,> ")"n'f{XI"4g`GJs4¸pp"PIB-(6 h$|c?9KM|fTtX\5v&[9rB-DQhX<'lnHz IH9@Eb) 03ҮL,NX(Vi<}H}NftUBҨHZP8̴)lp |p`:+Gp(XvH)HĢT,uqMiIi@Sƭ/pjԒTIłNI-3ET `fb–o/b! K ,pN r-d֒5#VGKPIUx5r3KcnUBC #r?t)(5Y9TU P]FcH"6Г$5`SHElRHdI4TF@Pp'>3nxv P+!D4Žzt<}-r<4(SNB}H{hdkB厅 b-5@xl莊cGN: RkZ4qQI6*G6U Yd^CwV(DD,`'qޔg5* 6U8{E4c[O8^Nuawa)fז5a5x(I,SRBҁb[5~HbKE^ C Q!"" @ `" r2`2M.D"Έ$ ",zeXI߂2W#$CQwU87I@  endstream endobj 114 0 obj << /ProcSet [/PDF /Text ] /Font << /F2 5 0 R /F3 6 0 R /F4 12 0 R /F5 16 0 R /F6 29 0 R >> /ExtGState << /GS1 7 0 R >> >> endobj 116 0 obj << /Length 3327 /Filter /LZWDecode >> stream P2 DC4c"0d.bA`k 6"&x! p9@E,H,&p[#) QB1E#Aʆ7#AA #E#*R 1A]*h*" Fqpm "^ pPf2 W24 _1T].1&C8 S* E:61V\45>PhZ{pd5𫐑r6XB_ oM kWv:޹*ێ{|j1бj޸S2!sA:4@SR&Bvk8A` jz6a7-ac@;- : 3CH4')B HlÉP"!P;6QR*@91B Cx(1˸o/dЮ֢J14ʳE #4<02#t 8AF*7t8Rc @;#7MST*61\舩#+T:$X4u [ z ǵŤ6s(qlIܘF:N[ZM  Dv-pP칊*-hب}YC1s*}Zm (حc +aK>*+/M *6 03g$7F3Aaե[˼L &wQ4C(՞Z:ujRT$RkfNdXNuUtfZSK75D7m'%Yv hbΞ(/1i5j52R* iձ#Ƚq_,fFck>%I-e`ט8T6$PtNbG" wj„:R"* 3BY"nV@| TA ܿpbDuD"ܥ8, )t*?}XZ82ػ!AJE0CkpR)2G)RՃs@ur3"8peE DoyUotԬ r<\~$.|-R-v[Hk"բkɐC 8qRe x.I;[FǠ@ƥڒF;!'[u0?sOF*e\X}1lvR‰"[r՜kDrRPl7VJLgh4,ɞ(tZg5@ëT2T%Rx ԥ::*}.̪3lUU*UloT^}70 .5LrC߂NԢJ0HʸxPCoPrB@@Q,!ɨhf]pPrf7F4RdJ BA)@. $o$Z dWʹu .p."^KoAx@7M8ow\IsLdMp% \?ɺb A0˥lIBDJ‚S!9sii 'ZQzSP!@ ǿ9򫴡s%ApPI AwPkt/C_ nA':n/yƷW> !(KӑH0/فdG~QyU( a25̙qzW s>yni iqh6w@{ӘE .3Ajl$TnIV " ) /p E Pbꏿ .# MP6p-/ #7uoy . MP0m0pp ŭ .9QAJJ ;$'.fgZQБlРQ qŠhb;kZqqщQ}yNr qQuK,Q 1qi!10Y Qq 05R"R{pH q_Q$#%m %# CQR)Q%q9!C aMw&0r,"g)6= b B; roS qg*_ 2*)-2-o',*9$m/'2-.R12k ҺK?RC,'R$r 3%2g45S5s0a0oJ/"1S5rw$`eQ7,6q+OJl>kt# 6Zі q;2B; >"<*cC=S/:]>S3s>s;,_(@`]; ; *_@E@?!TA+CїC>;>T;AB >NOCRϴDBtABeEb>#T^"TAAyGFoFpGAIQ8tH4UB-TBF4GR1HI4 QK4oJsJiMQL!*KT2g/TM4NԼ@4{FD4TP4DӃPPT <2P endstream endobj 117 0 obj << /ProcSet [/PDF /Text ] /Font << /F1 4 0 R /F2 5 0 R /F3 6 0 R /F4 12 0 R /F5 16 0 R /F6 29 0 R /F7 33 0 R >> /ExtGState << /GS1 7 0 R >> >> endobj 119 0 obj << /Length 3288 /Filter /LZWDecode >> stream P2 DC4c"0r2 !Cq25`<X 8Q "$qc FHQP- h`(0F#AiE8QT*GJPJ &3hPo7gm(l(1͕T%A HL. ,&3c`c6*HS8N#(D(!҆z Pp-7EY ,P . .9#n]D4jm0bz LWŶG_ ֙a]4{/Il1s,`&M@S>r "<,c2H.f¯'-P@4*J2B )A+8̢4 x2A%ɪ$6 #t0$"k6*JxQ,@M*2*<7x[$KF8 :JdƣГҲ#0 HAk伲a\r̲!/`;<@nU?AjB,o-:(jOl&=`HcIűʗu6)fc j*0MZ6!c:n"CF2sk2ƈDG&%ҊgKR<1C1s mLe3D7oRNJ gI11(椋IJ ),xZE\R2)Y"a&ØLm šT"nAL`$o mBDŽL thwGlt U=E*+~#(d,})U1L͇ kGAj)A{/*0jf3v SQA3Vg@'P([LI֓YuYG]^E.Phlr3/{gSPOJf432W^e<5$!)L),c8axΛX uř$6m])0pbo/3; nѕKwE(Gf]T uPOVeK% Rrt[,<kYq)?([KfM̷Zt ^TIG{ iΆWNh2YJ;3FS|H QXIAHσP\+))!6R3n!]M)9r01)W_Ŵ+_/'SL]qy|oaZk)¸ dO;ԻOՌaQ"$n v>֖*#SPv*Ѕs؄1j*]c1*Da7.6n5YB3^-3qgM!|ٜOUYԚJI+9!BU-{qo$H_]8K(\&C:][ lM6^?\^9=LWaiR55[y9c70C9NQz5_%E?A<__UM5Hgm6i(ؘaKKhj~0"97]`3e2Qg(㛥* IIIu_~.0+* ;%ƺ ֩&x4ם_@AG;~ <* ;kx[ݲÅEK%K( $c[u*$N۰wS컾Sᾧ#jIgd3Xa3xQ >xR=&W~Xj(L  51Rr'\>F Cb&!8CFDK2bQzS @ fE,S&!|oe3>4`g4NjS5`5M2(?6rj1SxA.sQ/ E<33vD!3?Nbv556n#3Fg=%C2>.t@VD8BE1>s9s2/?S= R%7:3EKsI@Lj03T]ӼS_6tyArn#`A+D{D2 endstream endobj 120 0 obj << /ProcSet [/PDF /Text ] /Font << /F1 4 0 R /F2 5 0 R /F3 6 0 R /F4 12 0 R /F5 16 0 R /F6 29 0 R /F7 33 0 R >> /ExtGState << /GS1 7 0 R >> >> endobj 122 0 obj << /Length 3333 /Filter /LZWDecode >> stream P2 DC4c"0d.bA`k 6"&x! p9@E,H,&p[#) QB1E#Aʆ7#AA #E#*R 1A]*h*" Fqpm "^ pPf4 W24 _1T].1&C8 S* E:61V\45>PhZ{pd5𫐑r6XB_ oM kWv:޹*ێ{|j1б0 2ǡ̢&(\bBmԆ N\>!H)jc77C "˧k 5HzJŏ8*hpc1O66A0 Үɲz';7p:3e'-|ϋ8EsS -%5*<V:M@OS7(1#2+Kj8*MҪ o#dXE!KjlvXQ^\4MVn ҁ#4DYtTSM9 `;c>&6MPQn.9}fK[6̷;cMM87JP6Uz af#ȃ 47j{ ֤#FH[!:k al#N/ⰷ,f!+0k6 49CUAEfTWKr nځPC޾epVJq+JMlO2qd ӯw;d>r9#omʬwLꢭj&ޅdߔg}ɯO[o\aI7Wʝ 2~dж@GbԚr쎐 S g;.XVv9ًHYH "9-tDiiGo@?⏊dF#0&CxdXRaQC[7>]6Vk9RdPi"DˡB "oeCa !ur5ھY5e^Iv 0Aal9%4ʑD$jL9'@2P*uxDAP?;S\ִl+V%K EAD$[$ Bč"\GgA"=8mu+ewfݻ` p^;mn/EA&V20I[rvbi2X.Ky 5#3A@~M#'`;]L3`zpBa|s]sH"f<(Rualtܾ6i3TFȊBe =IbYk5x<”iD 'Tl<(JT'xu@R+` PHS(ikBEs0‘ $r4@U5APҫ^ "V4TH?DcQғ4C[cQuR|0s8bzPYyL,8ƼO+в7eRisTeTƗ Ek4yUzbv5qę E.;iN YT$%W8<P59P0줤ʁ;{vTl:D=b{ {0ҥp$n;ԑŃ ptZu~SzEb@ҫu;ly&m?P.ZcJ0>^rϤ:.iP~1enM4J`.RO-+MxԌ٪0S=Ȥf9Կ(pzx׹܂r;u CO8ŧyK]EsKf<^`kdÒA<^7N+J (`hgȅ` (bh$We~h O.F( '&DxP-/})iS0 DEx*o=hN⊘WB.||҆@Pꢪ>ppti4㪐*h~f(G# (;f9g:#< `ЦCj}`L! G***IFD@vJR} 0G4SF``&ʚ!M 5 1ȂF7 Ωivpd^1!\C^*fPCm`@N&5R>m#J4-$S (KPpiئEޠM%&Պ8 F EN ELҸRfnh_NI ޏ(ѠdʬVlrp鯧 l" i+oУҽ,Ō2cP]fD L%C&O =Q>O(ߎДj `ҎJe`Pö nph}nnD@wgSv3UkMSVCC<$8@Z7Hm32nC l rh "33C2#*s?pH7?P܄9]âb`8C4*ye:4(R,bӥ;gBMCB)܍cb9?dXT r,*ytTi^iQC|z" C* B$Ak9@ `" .:;A mL` MD#ڵM,A&j+NNTt!K/L5OqSO B55 "NAO  endstream endobj 123 0 obj << /ProcSet [/PDF /Text ] /Font << /F1 4 0 R /F2 5 0 R /F3 6 0 R /F4 12 0 R /F5 16 0 R /F6 29 0 R /F7 33 0 R >> /ExtGState << /GS1 7 0 R >> >> endobj 125 0 obj << /Length 3585 /Filter /LZWDecode >> stream P2 DC4c"0r2 !Cq25`<X 8Q "$qc FHQP- h`(0F#AiE8QT*GJPJ &3hPo7gm(l(1͕T%A HL. ,&3c`c6*HS8N#(D(!҆z Pp-7EY ,P . .9#n]D4jm0bz LWŶG_ ֙a]4{/Il1s,`&M@S>r "<,c2H.j¯ J0\0UFQb6o2hwJ WJ9rk87(m!  jSLڴJеKCXlCL"&0,@ Ps!0Jy$3AiHP$A־!l9J3@ޅbJ*J¤aB1֍eZRJ8pWP#@ @: ]#%R kS*mR3(uTQYnn: (HucY YaH:-- 2o(h*DB nX]QOTmJ8W82;_N'yAQ{[K$Ĵؙh겍"G8UM]35ۺ]ZCwbS8 T,{]r6 x46-UE[-7(`CO: E7Aw1+U3zf3)D0#\q:Rٟ֚^ .4͑6)RKJbTo꩙^PÝzPK\l(s/8f&`ƺd#5 WZ&Bܤϔ R ? b q̌$bN1ΑJE 4HH:(d9m BDDʖQPw\QI%IHHn L;P:.T U$ Q 6iy;{$ G)zh1I if%@5Ȱ\" 49xRc5.?;P(g)7&tT+?r#b(H5%gϊ 'G})0yX#,ȾhDQ!7|86ZZ$zRe8=(tOX f )I i)ɖc$8o=N&P[SCU:H{i KZ¥ʊR1-b)q{ |4AS[K"-*l..}h8ʲTaoɌvW1ia4vDQ2GoE8gK% 99, FJ%A)ei)ME4`Uܓ L[>z(za.y_BL>: JMT" }NU4J8Gɭ AOT1U,8 :uGpc()5=r6=3HIA{ʦxHtl*K:X)6xt;)U&Lh4Pe.*e Epg4ae07ԹcYX L@c&l_TVs{bd<8qc uN3Ѝm'37p.Tqʼn7.?6:Ƴ(! 7bHf&VT@ӎGBTtF_h^(laX ȏD7=UAIk % feҔbL16Z6RVz(=Bg#8f1Ed` _Аrt_.rұ ^1:,+HL܅Qg)'9(ߑ:fHTt.D19-Klf+ q6T^6Rd. 4bYR`@4'NUF'NoJg '^ZS]fKS+;r. gHiTg pϞH*IxL6.+,[#Liɦum3 q@ruIC> s'-"J.vNzǢ.% A0"NZ*˖ " @ *J#˞2G2Cb$z!@ +bkbBbib@cV9djsd3VdX6ad]f=dAf`  endstream endobj 126 0 obj << /ProcSet [/PDF /Text ] /Font << /F1 4 0 R /F2 5 0 R /F3 6 0 R /F4 12 0 R /F5 16 0 R /F6 29 0 R >> /ExtGState << /GS1 7 0 R >> >> endobj 128 0 obj << /Length 4112 /Filter /LZWDecode >> stream P2 DC4c"0d.bA`k 6"&x! p9@E,H,&p[#) QB1E#Aʆ7#AA #E#*R 1A]*h*" Fqpm "^ pPf6 W24 _1T].1&C8 S* E:61V\45>PhZ{pd5𫐑r6XB_ oM kWv:޹*ێ{|j1бj޸ 2ҳh*k 5Hz@1 #@7 6 #r Xb #x *!R*!Hf#v7ȫI!@侪3+:nܩ" tD: \:MTG9pZ (pC#S;$R  6 *M&:H62-#P2Rr,m ;qe6MѸ5փ3#pd˕[- ~03 S - 6T1,ü6s7SETr:Į wz3j=`W_i-2Q8J;FE*(Akz*RdN`:858ڢ6 APN4W@ aAjJ-bYGO6Yme*퍣ʊ.?(Q|X : 8 :ŊDKwN! ٨nZj.H\ #8>|p\R2 jcAP +Z(NUG F-ak24l5x~!Qmh͑́LO7[>2:OoPWԀR&AmfԎSZ\ϭ/Bڻd8ÙqfьUd 0WOD*ePYJm5tUW&}B\E'nuWArYvĘb lau]3CN j$tnUV#%6}h<V2xV5ۢ6T3ʮUQԪ*Vo`=D0! T8Xб [-2D'&FNtKrA YlxwqVy`XGʥ`ozH?mj40#j)-#9wsEd-ĤS)q"]VD$ZKKHrh,d޵Bυ캂 B8 c A.xK Ple׃b A5ؐHT< %;FwrE+ RUHӺ1gUBHAD$ 4 A3#r Ը"Cb$tpl%PC%<&QL6J)vzA@:יϐ4#%0)T#hN,0Rq>H> ҄ A. ,Ka0wzøhn}O,E2JBrVU[yT2\"axy_ qUŃ^ri7Xc<&W=?x= -s5 ڽ fЧrh%\Љ@ |Ȁ햒ƖbB~fdH(X|k ?)Tʑ)P ,f\r(F`ND̈`9--$̍z4x(6l#͸ :pU v~*v^dpذ@K e MmVPpf 4/0 - P  *J>0eМ>{@Odތ怦bh++x*NpN, '4LLJh&/8d .eTifdPpVN)D Ot.<:"Ѱkɾ # R .Nc)NNcH㲞 (~ad"ffPF}6dub@r/v"JcJ4̧jb.SB,>UFed˸f 5\x.XheJ[HVH({ sfˀ薵l=nkqd={pWU@qp\3JuĔs'.Qn&}hxzH4SsSIuX 5 s\MPV5U:t]J*J2$t;=P5z? {:AkNUؘ*8S# ˗sg8̘>w w}`LPHf(ZQ}i? 6Ϸqi0p I:L> /ExtGState << /GS1 7 0 R >> >> endobj 131 0 obj << /Length 3038 /Filter /LZWDecode >> stream P2 DC4c"0r2 !Cq25`<X 8Q "$qc FHQP- h`(0F#AiE8QT*GJPJ &3hPo7gm(l(1͕T%A HL. ,&3c`c6*HS8N#(D(!҆z Pp-7EY ,P . .9#n]D4jm0bz LWŶG_ ֙a]4{/Il1s,`&M@S>r "<,c2H. @S 2̆i@4*`A(A24 Ȋ*#(Фmh@4 4d jޮ4̪+ )sQ;5 0Ҫ, s3Lr)J<+r6 t85 58ao;n2M؁m TuuH: #k[klqYrL2k=#Gj2]xVqWqH`PddaZ,;\wwئ:#bw*8o61NԘ {6%UEC_Sap9cxxB)rݔl]#KXB l [N0@N:@ʴhZn2`dQRcHD=؆DbF/tӚA &7Ba7ENGQIko.gF)XiiqLOx.rW>ы;R*$?S:U_m@YjIICF]Vb-&Zh(-fѤFl*IZt;ixn$P?2ydQ'&S͜;ދ DXTG_mjFf!goSjKG"IP)d>X( +2 ćOĐ>W=(FGd]Ba5AM97Pڶ yYfe13J[nґ1SHcf)$زiN01Tfp1E)&%Ǧz`0X9I EZ~t;J@`24%ALӳ9f J70$%挫Z?8^B!AZ.X.$#A36fx(pt s ᶜPiVmUS┶ڳe8QUU:,Ai+g,/&U Xg /2*@j[Vʯpt+4ZT_Kh2 BlE~Vc0P+B×3c(c j)3pl:5J=vLc Bפr ..W8X+ S7Lչf6f m2+8e{{@P}GX_2Y7+Lz!h!psW Z3p\At'fj=3ezjWrGzĠ_r6TmA{(W_.y["{vvz|^<3:HU`|of}q闳ϹmZEmo_DhKm!abUI]}.qԳ07g-[#ArzR*r=#`<:OeWhQ|zZ)i (GF'}@V)B8ھj r?oGi.vi43i9JtIH)H ص-XzH4/viDk( .P{c2*FlE} jK`@!ƚD j>Cp#в~^ />\6iBj%j0'DWEv* zc@@ З J{v F+Ay "M (?!fF3 䦨VqNLA`D@DO Q)f# ) V "P p"=QBp cQF Zq 'h1c2pm $Pơq~"2FgAB@@_1^117gQl\Q ! yf(i E" 1IWP!L %q295r1@E"`^2R7йw %1jQ&%#"g["&ҝ&sr> /ExtGState << /GS1 7 0 R >> >> endobj 134 0 obj << /Length 4538 /Filter /LZWDecode >> stream P2 DC4c"0d.bA`k 6"&x! p9@E,H,&p[#) QB1E#Aʆ7#AA #E#*R 1A]*h*" Fqpm "^ pPf8 W24 _1T].1&C8 S* E:61V\45>PhZ{pd5𫐑r6XB_ oM kWv:޹*ێ{|j1бj޸*%p@4",mn$pa0C* Lbǡ̢&f"B$m@5 h1a pR {|ڱ!R.Q ب >ӵ@jSA&JK,7, 5CɠAi,!18hoѣE/$(`GRr5P)0Z9)#\95p AT랋)Am tLAQ%afԜcƱsQ5+CpRPR026UH5d?bx{?!Y]8JMy;taԪQt(E@Z1#dƟ kZne.\ πΆ M2VGmMKVEEJP!AD#jB bفtA`gӉ :B0]4ungs%LɥhvFiEjJ& p8:01핓*iJ%0ԬR>'X /yzTHi 1"gq%1(<(`|2F @PvB0P0S&+/ IS:[1əoʚ?o4n;3I|yFX`:i*x(5NC\kx+2O:ATn96QÉxk{'QW*J,E 4-G5Z3\2 u>3Kp@6-dvɭ.bpBΝOrK:k6mNZ*[:i$m_̳{O";q5O[׽r8d&Sw38RG5Y @:9y b`?F q3a+>@7N~)@qKN-x/hZqv>c0ktܵcqh챈S;J>KdB&I>ABvVʻjhj&|NӁvnO@s&|34DF0Oڬ:f  WނHؚbuSo2Ԥ2rׇt?&/v7@iY܇#Mcxt=s9O ֛4fx|іsiDA~|@}.gA\.&WWwQahs#~-3v,Y3i㝧3w'7P20ivښU< {ulW]βl)WT5W]]=.ůُ"\KPfND7^A`tXMPhoZ `#"oi^̂v./~τPѯzjM0dp0/KdnFL~8lo\xoP|k҆`fil>}B\f:Lx k?da дkQH5t&- e Ԍ-eX- M/N ԐO N6P/- 18xqX\/ E40歯GybP7 xw0JΩ@RH9#|nXx(hfn 1* Q:q?ةqFJȆ%px3nDgn : Or 2Zà1?J1@uR*4224QdKB["!E +ZT@#7*KQ1#N:9'FY$L"2p 7 /- d4qnnCT*Y%P-qR#EFe~nѬTΥ2 X1ο0fϐ쫋*d1Q7.22[S\5 3-2B-m-Y8Qm1Э3 I/?% a,8bc!Zpt3ޑm\~M1m5M/5a9pP6v1S;I<# ³F4g׊4T̀-R);MBL.nB[.@i1CCӣ$q02S:  SLrkBGv[Cmo߲>>CN1-?!4{93@Ct^4GL>ȃzKRP1a@mjgHBt 04JBѓ S@uN/k/e0SToGR_GOUH@5C|e((Z) ߋT;LgM+,q. O4 TB9&ɓD+jP_';3Q;Zw&+AYi;0S&&s*\$jaI)>뒛4k4SV\T\u@9]567ΐҖ25W2K6 l nwD%.V)ZP2F5F[u#["qK2"; ԏ]($IޮUkw_‹*cWf+TL6SA6a*B38vJb5}OETd/`29Nquleue%fG,1vlh3en 2ȢTœ--:p^#;b_PV\֞PvkaV~Vz Xpvl1C6e m_DOERlS dM\Gnwu8!7ktIq-/_W4pJ]agyNO(Le:}BoXtkՌx-e9TlΓSomHyR/~P4Qj)nWIy7x-~R`dCѠ4'zpB_ $))~ e-x!VltWIE~~e4 v4-wYnҿ`g~\m|(&A4n4n@V^1kz6Pt)_{Cd7J9*+ j/Еi_|x|E|IPk7݇~8aM.4' nbU]o"%ZG%}IoWS5}rB`u88`OZx vT4!(wM|9pr8kt8 `wєVTTi)*Pbt#3Kb>"tN$[%3(QH91ٷ#cc"!Y盹띇:;949E9e9ϛg;EʼOñy|'F07gyгL:UZKM:5z8HzA:"(pۧa:YZq:NyhZzxdoQsF/H_I:i ړqz*oxZ)5!Z2;ZVᯤsG{[ n; .qv7;'xg%i[!/yiO' endstream endobj 135 0 obj << /ProcSet [/PDF /Text ] /Font << /F2 5 0 R /F3 6 0 R /F4 12 0 R /F5 16 0 R >> /ExtGState << /GS1 7 0 R >> >> endobj 137 0 obj << /Length 4224 /Filter /LZWDecode >> stream P2 DC4c"0r2 !Cq25`<X 8Q "$qc FHQP- h`(0F#AiE8QT*GJPJ &3hPo7gm(l(1͕T%A HL. ,&3c`c6*HS8N#(D(!҆z Pp-7EY ,P . .9#n]D4jm0bz LWŶG_ ֙a]4{/Il1s,`&M@S>r "<,c2H.S T2̆a\hnΈaB jrS$ cR,㪔k()O {KPʶ Dʋ(ƺ:,rxP5 9B/(+꾡"1q( 2*2`R+KR*,'aE-OKox[$ ,J Q:NH+4CܢR47 Jak< .vY4yeU =dדJϐu \r1<|ѐ{>+'*Kq5J~Nj봰+M,9dSTf-jX*h2>8 +0P;+6AjVc)4՜x@9eÆ4>]3兙(P zѕ % U5,׊[RT5ڸ:)Jaܴ2JUJ7Zҥo44x2QǶ+iyԮ1Hݨ#UpnSWt. {R0j0x2<.y{XQ1ҋyԶdߪ~h|?]p@5ҘzfK mr7:4X{Twl8P [wkͰ(Li[0RXU - 7G8[ Z%x˜WQ^e:seWi;UHau\ Sakճ6CL13*1Y-1`¨t6Na=s?dP j`9'i(Q)"Z,:2yPtMƶFΒ=J1hMf2RhSxY'bu7a=l( *{l8DCcWf&M;֋6FI8lC%Εѷ+%VPe+3b[`7oc a+KnU4c\؈7J݆Y6xͽ5Ud0):^Fh,^2k { WnvʭÐVOdAꜧ-,AA!2iZ24҂h6AD(2I}\4"ADuUwX4Ջ &c[ SKPіU4)燮V||]<޸XeyfRl:}xX9z L2KE^e7G 8×;nYor]]Al_ k;a wi(<k{ըw յ(*`+RU (zW+O(ԯ^ 1Xt\\KpDVXX0qU]{VMPda7Թ3qXaU%̙RlmcJX.GڞE`5MmnrO6M'd25wKmTMKm+Ŝjվ,xd`Z61R@)P"*(\@'.K#h2&RHg&GS62%-{ @`m@#w*63:z@XKT"P5$BY!a#RBxrN*b%̇98+=&D&r4s s'_(SBG1GsCoE@{O =Q>&5Ksi31ses1=/O5?{C1?4DDaE- FZKt_'cFuOTo5L7@F"1H mQeQu"Ԏ;(dO%(CR&:-F3(UA(1-IQ!Mu.NNT4ՇK1`HpOG?gLm@P/]/EVNBu[Y3-U<қ2]1]tM((4W39St!K=5#pTT\TyY*#2D5#M_]IVS&tlWXMXRX!tC4uTM27]V=/ʫe5 j,_V+Mx kR7]d~GTKOBShY fMjz^5; ek҉b3_f_t96gD3]cVZgyd~A0)-l⢈7I91L`3FXmnP<t{w-l7L'Y?X1]x9>W>;ыuE%sPv}R=lD)2&3ruU fdцcv yk\XC1k2p?"A6'b;l!ı@0t!Xe5Vg t"Dg%^7X'xqQ  {6 ]Y &iyp]\Y-R!y7;ϔ5X1/WFO$ XmS9gf95}yugV({v{ًY/y9_XŘ\B endstream endobj 138 0 obj << /ProcSet [/PDF /Text ] /Font << /F1 4 0 R /F2 5 0 R /F3 6 0 R /F4 12 0 R /F5 16 0 R >> /ExtGState << /GS1 7 0 R >> >> endobj 141 0 obj << /Length 3185 /Filter /LZWDecode >> stream P2 DC4c"0d.bA`k 6"&x! p9@E,H,&p[#) QB1E#Aʆ7#AA #E#*R 1A]*h*" Fqpm "^ pPh0 W24 _1T].1&C8 S* E:61V\45>PhZ{pd5𫐑r6XB_ oM kWv:޹*ێ{|j1бj޸ 2ҳh*Rr.j4p ⤌>Do˶2@7C7@-#\6 x4LCM8|x2ˣC?;0*00v5fQj@㭋SрgD 2)$[`-kKNƪutY7-o8e>JHn)*TՏtގڵ=͒(j,CnRZ Ҕ+Q.3 !EXAIbBKAF"?u{Т Ģލ;8J.2(ue]ۊ(ק\^&i!GKN"zpg઒3*u|: W|1LZ\|5xi=&7z*qt6\X*Vɷ8K %fޫU\;& ڏ>/&@ܣz;jECk;)tt sIٻv? d%C @i}O)&RsYf<کUL%({0\7oqZK2Ei8$ߑeE;`}J=EXd6uէTOI܁%AcYX^6Cj-ᵪH(@I%< kq*)8 !@uat \d]YI| }PS RK'U44!C|= AK, Wl'ٚr`ʳ;Mo1pgCQ+i$7‹ܙ aAxo 1r-JUa , A#&$m{;Yp0Q1E9jA+g11$PyEqJ S'ĥKA΢mӱ+!t4RFIxڔ-@O YUۂlʷC%OTNTj쨔ʅ_j RlMK\4E9 l]j4> C)ٯ)+F贘"~Di^uf;LU$p![`5龠Q|{f?@,,Fli))Ye=T{;rq5^0XW#W5*alTr-@m/O[ :T`;Gks`vۡȡ\Yz -4?k_&ZK/͊ī =%;M$փG;'sX}thI (*@q+DZF&ܡm%Odb2zch}@0Iƹ.(rFlӢQe^V< E.枯@@ZeVW CojchBB45-2g d8FdbVH$^vKLMdF?zVvKL DfNƀdmcόL(̂e -R출RXg CH(.IƔ4 j8hjT}sth ;n{ d*H*g*1ɯ~p&e^Ą@*k qGJJ$ )Od‹Q J]BfE,;l7>تl j7 VnFOdI䪍$ȦK†øj+B@@jBM’ :pKFEȫgf 2H-1q%O 1d-O0v.4Jim)@IDhF jRil6d$_%F6ip>i'("(m0}Ġ&+0Gr@⇪cC*=IN4jvd*ITrXK2M#?d2$q')%/U!\ ꒪EM  PQ>Cf &>G 8@ mVfR0CZ+ }$ C'HD`D\Ȳ`d27>[>d f  V~=n6>U?2 k?>_AB  3%>DP`L@De s<@ ` endstream endobj 142 0 obj << /ProcSet [/PDF /Text ] /Font << /F2 5 0 R /F3 6 0 R /F4 12 0 R /F5 16 0 R /F7 33 0 R >> /ExtGState << /GS1 7 0 R >> >> endobj 144 0 obj << /Length 4118 /Filter /LZWDecode >> stream P2 DC4c"0r2 !Cq25`<X 8Q "$qc FHQP- h`(0F#AiE8QT*GJPJ &3hPo7gm(l(1͕T%A HL. ,&3c`c6*HS8N#(D(!҆z Pp-7EY ,P . .9#n]D4jm0bz LWŶG_ ֙a]4{/Il1s,`&M@S>r "<,c2H.y i@4*Jh3 J2´*82:I3ޣ hZ*"-<*+*CҨޱ.+F9 22*ӸQ=+ȣ Ƶ ' { cHK*;/uFPnaZFo0Rz3AA#u7"h:" *: pۍ[eD)M(6#ϖU1Im(oF67 hcq*-5Ȗֽ|VZEشo Ԫ, Օm zv3r)V|(4S>]Z>ZONض=rZH˔ضuœM-d rZ:PP$Mw|8n0S.(r#R"8P`atNɣ) ٪U!@ҭKF6 c<sێ45ˑ7F3D1 OPIj !iap[e(+2 0 ?AvT-Zm}b3PjAZфAcKhAkJ{>ofARe:¢<GU2|bPޛR{L  `s}ѼtFI. l03v;?$ "5xE-ոeekDߠtAѨ( O 9YLauĔ}Z Ȣ}'jP9ZYȇ~q}GI*u&*̝نź,"nQh\Zb,ax 6ʧaQp(2@VE`d1;OCq `*Z5Qҷhfy(' Tod~Q1 z1[-)dx(}o0d"̖O%$׆Bɪ4h>a$E XrP(AO3!AK 6".`r4L8#*q'r U(Og, %%pX#&&w'1tvŒҗ@B3&7*."*1 1Q2r ҈ŊK,r,.eI5rE/QG'+(* 02rS5 O&EP1'Q6qU*3-w4*43G4`BSӯS]92e+rQ+t TT6@Aҵ t6ɏDyQdEd悂!R(%sQ7A4r&?A'9oD_@B :CCa;ԴH#TN8EDSL>DGt62'ћ@IeNxG~:,-1xr_#AݪA4As$@LQC"F?63%B!S6LJRO05Y*G'u6kBQCRRGR#%CJ/ACXrEoVB5OORcU@o5:_MRyM(3m<;NO`}wWFՀ!5?U\ B xZ7K7‚08%5T/>]UdS3^!AV4Vpi]o4) =u=x kfVVQ_'M+guF3=#i=\֟b50#xT f iVikmMtDf5Vy&R'gN4)556m6*GH'bjw!ecn!V>/855JvFD#VO^eVqlT[;T{+5m<"vta5BOmj5 HWc!61HzrRF~!72uSAf 'x0:TUb6qVv qvd{S wWGW{z_SkYqr zRfT-w,f@W"[u/"q}.7sb~kwETPkNyaWaO%ET#O XJX^L?/*MT-7{5?q/$$m8g\ﳊXY/ABmXXJ͋UWءBK.]kӎˈxpֶYzXߏBX@qy3 endstream endobj 145 0 obj << /ProcSet [/PDF /Text ] /Font << /F2 5 0 R /F3 6 0 R /F4 12 0 R /F5 16 0 R /F7 33 0 R >> /ExtGState << /GS1 7 0 R >> >> endobj 147 0 obj << /Length 778 /Filter /LZWDecode >> stream P2 DC4c"0d.bA`k 6"&x! p9@E,H,&p[#) QB1E#Aʆ7#AA #E#*R 1A]*h*" Fqpm "^ pPh2 W24 _1T].1&C8 S* E:61V\45>PhZ{pd5𫐑r6XB_ oM kWv:޹*ێ{|j1бj޸*%p@4",mnB0pC* L`nl(h@n͇18n#B*$ RF0z`!BP,.2`,K@RH6\#s -Ct=D@TI,R2h@#+2sIv5 ?B  TH2Op4q FғL=Ƴ-Ҵ Jt,C 6ðE7T4P2)8lQEVօ0AFHR$'rl(Vr . INL?`MV7}WZ5T%ƈ[ZQth[G4ZL4gO/7C{ضK+;U5^U|TL )]Ha 7]dg0fgZ 0'AZDzeQYiLyƯHn6k]۝mvѹqUn߼ endstream endobj 148 0 obj << /ProcSet [/PDF /Text ] /Font << /F2 5 0 R /F3 6 0 R /F4 12 0 R /F5 16 0 R /F7 33 0 R >> /ExtGState << /GS1 7 0 R >> >> endobj 150 0 obj << /Length 3422 /Filter /LZWDecode >> stream P2 DC4c"0r8 b00ͰHB,r(sKAp`4фa*A@R1 &Hl(1 H`(2DSn(9e1*ƒp). PH4 ØJ9{ 㙬l2 ceI*z0 Tj2PTBh( i' QoX3ŠhLg4(apd5tYHJ(Щ ysŅ ΒWي8ݦw#j7CMh\npR4n aG\0C'lx`')":a* Kr > ;ű&fˆ Ir !n/a@ o7lL1pha\IPtA ȸ\"K܈ 0$@,@aL 6/p hDؾMӀBT3 'Js8/A|&20-3HA@2LA,ʽP)b鍵K@J~9,5_k>9#XYUZP셿Q4b52R2ɼ@Ԏ8bmJ8 *Zn֫EV@WjVÊX7F\߮E[:4 ⪫d2N^ >S H1 fHZ#Yf:*Cxˇ+1(XDP7 i;#n60O3N r: 3(Və 2c4UP5˛9HɧmM`ύFmlRt\]҈0SapUaJπ B>aku_Cvٺe ]}־S~qPf[9À_riNiOTMavpe = ),͞r73@q| +vvr Hh 6;*?. IҵEy6uΰ;H!`,<:Pt{|!LV*Ճ I&nCK(F0*p[A~V O|pF%Nhg>V{"52$dncB[ ϙtծ BTBj #ȓNw)M`m< A6(v /:t<D o lr 4hp\6VYAfdm HlG*>g .%nb9H2i/(LD ܞ;C 1volf^*bOq88ZL ݙT] _n0<ЉKc5426>[)O ,cEPB+P:RYSla󜂞{%4#U*I;>cU`P cMVcZKܓD&~GHeY16&ZcV GZ^8 23W׬'N<A+pGI$91L 8bi|oz%Cl]Lr` 8pfu~mjXPnD9K8ʓ&.XDZ)_>0#1rժbϊ9QlQY6E5QvKX)q= % Ż e淄qd,Ю+ ?n}5RPŋA W}ģ?.A *TN,-C ,{C}|]VMyi`)5v,LR 7-I Pw;)lF0KړX!a:tc9igQŶd1釵shECo`F@s UQ'[tvDoHY퍛VJn5^c }U v>u0!XT[ >L*NeaU=_Yae<2mT͖Ca o#oUg fG 6;bѴղ:uR.ɟ&Z t*ǘSĴ9VAfL} Pɩ Eã:"5ڙxAU:$N`.Հa l͈iµbK rBѺAv"hڅ o`Q 1Ib-(_ g`Ov)+TZ@\-XV]"#/Z۩k(=jeWM(8gfWq+5Μ/ ;Q6iUlM{k=̉;]!k!8Fmm Hj&re w D{PXK'McVG ghH^T:giv)f\EHcf+FMO{Gin"_hHF5ʲ' l<<r e& caPN4 - Fc^*t+d#h˔k9Ƅ*gJh}pkk6G2 mmf΀P hg.0Je&Ϫ}͛ =mvm0~  бNBJhfU *s0-b `xv18EPlFlq>^qQ._Bo⫂aE1쟍(Uhn4Exd"a㋏<+:3w-bhqnoP)1mBOF1pE ŌʎVT:m gj;抓\jÖRlŒp{B)*CDp7Ō2jǐ"-rvqLh# Ō`Le#ŀ,R%7+QtnC@2y8«^Nf<*҉hnmRn@غNOccR/F$#BQ цzu: 53$@3:[3#ªx<3RPg ViyfUfdMok3=4 f"-#z;Lv9"*n )SPz  )L'pU40pvh ƛP{@D`w_Ko-ƫ#EIA[Ak@CQ-1e X,V)U@T~HMMܔrb,1Ð3PN M P.59ME)T"fkmT$+qrt&gF⽊\flqhG0kh=#E endstream endobj 151 0 obj << /ProcSet [/PDF /Text ] /Font << /F1 4 0 R /F2 5 0 R /F3 6 0 R /F4 12 0 R /F5 16 0 R /F6 29 0 R >> /ExtGState << /GS1 7 0 R >> >> endobj 153 0 obj << /Length 4070 /Filter /LZWDecode >> stream P2 DC4c"0d.bA`k 6"&x! p9@E,H,&p[#) QB1E#Aʆ7#AA #E#*R 1A]*h*" Fqpm "^ pPh4 W24 _1T].1&C8 S* E:61V\45>PhZ{pd5𫐑r6XB_ oM kWv:޹*ێ{|j1бj޸ 2ҳh*iPA֨ z;c(@-# ZZ h1Zzֿc x2dO #2 \f QP:Ċ˅JΘ7!%2M2F8;ӏ.S<_8`+鍲Թ3 1DC\ތhR.@R"ШP&Դ)~ H: #>J>*KENZ+`@: Z\H bH8@ZA@1 c7J`P4642]6B\uitx5t*MU0z$ŗ2VP~Jܢ)#]_X8Q?X6mL|k^^]]mc[pc5ɵ-e4Z4T PӋA 4Ořa; ucUd\Q! ׎ΪgcD89 z\v PZlRMǼC@Ö]߹lu}[V;8myx3ZVa:4zOM&hLq}fkMrJ֕7lsX3bJ.I.?BڡՎywB8D~xwӀeC&w `5ܚid#ܫ Y7`j?-:RW\nȉ"gJ~gdm..O٩vP4ԃgl)d<3VZvђ, 4VLH1CUZHG07ʟx1+:3Q)El3X]ppd3"wq. )y+:H ayuOCjם_)|#w)*=${Ja(ΗI6>SQ[Lp@x GpN#ܷ?(Ȉq0 SNW`5"Zj0Px 1A ^OA78˘iNB?2^+VM?]-:˖CxgYA6k$Td̻C.iR2Y%U-,h6&X%znRa$ IHs;HTcQjic%maEdI8ʠ鹻Q9%)8sj*Pyl̩cC5Sv X.$\(c |D'X:jdd 3 }تSPiI>178fI@|0\ I#Zw9 "Dn!5wp@ A4H!$  osvD 2"d uйD[ 1waݻ 347k\\5Ur7^d .<7_bowsRF%/y`Ѝl˺VTv_i\ pR"YR6\)+I .Ѓ?R>6`Ƹ_2bw39-EZ(qM 8nQɅxNJ|7l fa*|6IU!h}6Fuf^_:YU2+;]fŢ\dWpIXE!-L zHH4ft޶<-=O YfeV S(V>?=6[6%Rђ9 1ѬhJI0Mr;jj #ڑ)RVj0VT؏ηeݾ2&{OPZnB*qvS ==7rw `o,٬fV-1aAw+BiY. QLE)`z}c)<:ifRV@vJ'g̮pA7U:61t;oM}l] -Ɋ{0ڸ[uIus t̤ppҠF|BALm. ), 2:ƿiǽYM4z/7Wܲl֛[ZveS 6*IV7?4} ] Tad [Oݎ΢j^f -*n*f v9"ͪz*ɼX*V P2 LTLmY@V]*p°*Bb&eF̢ƣFL| B \NZb<" 0أL -bοL gnteZis'Kԅa+ J&$)0䀂 p(g E_Fj+H(Y cr|\ IBxTSeMKEG #JRbU$MöQ~QƎi$MC:nWfDjOKN|HQ&F$QѴ ؞zJ]1 ;eJYѴbQшR`ov.bh+/irnj,YQ8b%訨fPGA < `-d/N$0`Pj;à LH腏\ɴG# lJM& Dɮ\p3 %Yl+ Q" [ S+Jn[F]/‘nέ݆2$dbt7 H=#PK3`IW:φ 9<08%tSa!`EN/V TRoPMN")-Tnk|0J[P~* 09E2ˆOUh*E⑲'TYh;5Lf. nX0h i, n\jm| L13,*^ɴJ8cP|9\N R8IWHGcmh"Zõæ Ŭf"l,EtF(-jg1R_'RF-(C-b fɺ׃;`VM_i[mx+Vt֘>g-זM@ B)6v; gphG~yr+f"+6ז )66B]cV R˶^׀茦 -+iSm#xFF%2S?%k<"tv?@j*ְE$PE|r# P\h<E t 0-+wNs)$tƏoq X&Jl@ qTuf(_0 =)*Ҡq_̴7}Y{eqҴ^ qӘUEjX>Vs6Fb.n |X ݀İՍv݉9+x8ER ,2$rdloҏtU1ӀV~h6>,IPW%O7,Dn~:M.js zQe2s^ ` endstream endobj 154 0 obj << /ProcSet [/PDF /Text ] /Font << /F2 5 0 R /F3 6 0 R /F4 12 0 R /F5 16 0 R /F6 29 0 R >> /ExtGState << /GS1 7 0 R >> >> endobj 156 0 obj << /Length 4025 /Filter /LZWDecode >> stream P2 DC4c"0d9 p. af$D!9Ng9,`3фT; bIo9 F#aA‘JNHPn3PPe 4Xe9LjcutPt7(څ4R--beVwE%ҡ* BapP\9DDj1! B$OFIRt HPPC .(7+cNK?e 4fߨˣ?!݃ܣ'ɶ3n+;=¾,0O  #kp̻ͣܲY[k+ H:<:S=g_N8A{w|XƩpA6j$V 0P'P1 cx97\^ˀ@&:G"PDJ?\ch\smNu4 >Yñ8XR韤~?'\a L.gM)$3X GPRo'(؜1qL46)Nu7 ` QJEz鞃8diu Fz#-62Pryte`RJt-R@[ny ?PkqM'R)/ЭNlh HC1yL)Lkt$waQ^(79dnn (Ȉ =xaȐaģXN`8R3-,R]@ co!wUT)GUC@y}.V5G! sك!`hA@jj喻jഓi>X(!nueZ~*|*jUUl^jpfIA ſ#SffIb*Xz[uTԙcB*o(\1gg_c=h^NZL%>XK}#{5ӭGonët\с@R]q p½MePTw3-_ 2Z 9\/ϽÛe-bX_[#UC?Xz/8ߖe*ێVVGL=',!Cs<煑BUw)6;j#w3fKhĪx{F|\;V{xwxi{ f-8ri˜)9n\x'tзT)[*l·SM`po SFZ\vfQccegt8L@ة8p/f)h=N!M\1Jnp2h ތcsqYh0,2l ͮ8V6U=Y;dal4JL[4v<3ݓsR+:Y՞\Y6f #0LaY07^k :iUb %bC$hY6BF6*{ϡ9 a=$SgP2ylǙr)"\c->}Aw>rR\v,fz_ksW*t32Ljx^5ӹ!3fGV{&('>GãOkRtrf9C  ~Z %rb PJӺkƥ('ϵ[) c-621ECxd`^Ig1QzGL@}D>4Ty^$@Ln43Sv zo!{ `*Z6DZl{o:JjL\d΀G" :hhp RBIol ;* ?`/#АjV&P<w\g mӫBp8-,m0O K.NC-퉆F(p,]xh06h`.@ ɤ\"GH8D@ xiZp"d>*#+l$%$]&4NB+r9d#d(Ql4c-!v '5lB5z)B/Z d6MtBe VK#R`&|tf|jBQndQ.'9;(|O@d&|sH`AF"*N"q#Hcgy}/Efg6H謢(b0 mR6L)JB )3rx4d3/3o4j*#b-y9J)`M+S=+lRjE?H_ \ M O=.*3/.UCqDzOވ5n4c\v 4QE겴 mf I`W3J%-Lxq*f` `y4gC3B׀L2Ж$ {+*oX0F'(l/(dதǝwf|^zvê|UvQZdδGDg$`QPy`5ˆU")dfv<t`w D2-DC8~7Se{.od/d]33`T4Eq̬(`;@"r¨+ѭ1MGW%o2wJ8l(,Jτ;shǚ~FP endstream endobj 157 0 obj << /ProcSet [/PDF /Text ] /Font << /F1 4 0 R /F2 5 0 R /F3 6 0 R /F4 12 0 R /F5 16 0 R /F6 29 0 R >> /ExtGState << /GS1 7 0 R >> >> endobj 159 0 obj << /Length 3704 /Filter /LZWDecode >> stream P2 DC4c"0d.bA`k 6"&x! p9@E,H,&p[#) QB1E#Aʆ7#AA #E#*R 1A]*h*" Fqpm "^ pPh6 W24 _1T].1&C8 S* E:61V\45>PhZ{pd5𫐑r6XB_ oM kWv:޹*ێ{|j1бj޸ 2#*ԵIP"~<: #>dPޭjHֶ;+䂱J>!r?¹{ vG̬Ѵ\[p"!|1I`Pfĝ! N'0ֵH Hر+G "Ѹr9J$@pҵ8-MG nLʹ<')N25)P;O*Z?x6T5;AY Dq-bLSb zMR| .#SDt\#5 _KO7 oh29p>jKWnAA1MF{,y!(k#UETsC(Xt0UF-|*PGUbwT\d6NZ=,JLB .*..81HQ6aE;T,67]sC\bX}!#-Uj-93`@g{\0 (RY!m<4Bo2ar /- $21Bc~:WY95mՈ9&MI:k!T\67ʼz(eq A ٫~-M72wXQ ͙Q6L 3+!6"a*1+ # i9nx( [""TFeN&dit JI Nm% DJ(yzХ.RQaW!!d)`$'i3v C&Y 5p*ƳD kE1ەF,R[ZzxBBꙖ=Mdʩ&j\dV!| Vgpu k6Pʬs "p6C,yH%&5w rFcAҜpHRyCllKZ{=aE 9nZ?>xX EQ6gֳiEOP#HM:K8nRV WD"זt*V?I\n iTznʥ :U)Xrhpa]mKSJSB]m񵪧i)@b0bLLLI'RcEB~.UyuܗCF 6贇{.EՆRFvO]%r ;+nʥ@2+'#I2Y ƙЙi{ J(+vh:Pv-4Dl8Pm64 g>*FGA9К"6w2rMԩ͊BՍpV洺yRTA\TZ.-;leX:5un[}R6k .NK;Jy|˻g '/똒=2_2z-CU@q( RBM#dBtjby=M-d6Q4LZxl +mt=WGruf<q;_|KW8nݞ+c0:ӲVpfCm]wKͼy ^w[VA^qV!#=.6 E |ukH\"5hD7*M?چv.ut>z8[ʗ'Ѩp*S5&2V`޴tic&rH5Nm__@́} f \bqDQ0+яYPɝkM_uvB_B-(-8Яt C!ʾ˸:t>JJ;tγ5/%><94 uI9vXH7apB2&z=o}p(/E.6P "S*R - jRUΌrG0 p=&BDJ"4Nl(*F6エ(+^g,_FF*;kKkT+z$ O H{iomLtpjobIlo`Om0kaP~ m <;.jUD&Bΐ>5PG JHP+ *R d]l (G.HN)  KFb )y)^j -Olz6d(m"fBC* '~-^g& \c|/# xC` +lpR(Nʺꀜ$C)d6>lt)bf+JqBҲnqXHQ>p0'IB)0*;$ I>/M!GAT*1”1ȟDLKRjK:~#(P6tQP߬kGE  0 {hoqNaGLzjnZy&C' )cH\Ա&H;2̈gh3df\Jfjbzpbu0^+b PLvB S4$Vˁ(+ ĊJLs",eM $`JE55 >r/JI*˲ +eq&;QнE*RPpph5721$QPT|ۮn¶JLǑ<"7F` Q+ Bċ[+`pX`ް9&u@Rr/:7hEr7;2@2P( <c&dk y Q!9RbDAI"vw2Bhmgrh;rEnT-t+jat0Q N!P7 Jh;ED6oE(50E(bR F.RLϳQ Έ lb p@k8- ȥ2 ДtU8rы #0b$ 8%:.vH pX7**Цxr,ƹb:/:N^n*a=18styS ->t5J)HPl-2Q#ACҋ'uB #If ]k (rS3b*\lUJcQ,E€ Kbu`! @^$FhCi;> $i|BYPϵ&PQ(1%b4K NaT_ϴu@CYu/o'Hͺ rkPO3kf@y d@R+1+f~g Q? ҍ3jHb;oP'|O{ov ` endstream endobj 160 0 obj << /ProcSet [/PDF /Text ] /Font << /F1 4 0 R /F2 5 0 R /F3 6 0 R /F4 12 0 R /F5 16 0 R /F6 29 0 R >> /ExtGState << /GS1 7 0 R >> >> endobj 162 0 obj << /Length 3827 /Filter /LZWDecode >> stream P2 DC4c"0d9 p. af$D!9Ng9,`3фT; bIo9 F#aA‘JNHPn3PPe 4Xe9LjcutPt7(څ4R--beVwE%ҡ* BapP\9DDj1! B$OFIRt HPPC .( Jr4KJ <)K|Ī4s"S8NBK3.`A7Q*ƿSs\KQH=c64O(b AU+s:)J@X// 43AC($ cN# @Xq \A\D1P!UzR6l9L*`:cT!E:WW$ $:#a@-Rz[D4=o7r \(\2V{C 5 .LB\74P7UZJʣ0UHzW + $: 5@E,.jR%&:d#q7 a&֒vd*+N+W /o:Õ//W{jW6X"~k6 >/ v5C2r/TWmI˲>4.~(6'־b"7I9W_* NC`*ܬéS 2'6jbw*劳tJBBq16tkqpdйD`嵊'v~KI1RQNE%䪘_lM"3hyI<(a41`}hU lWJ.\[@ZOd1E$2:_pa} Zd1v$jIy8M6*(RRPAR1#h{ 2ĕHBEб7gR]ʱm^YIL`G ,=PcFDEYt`zh)ԉbE =἗j^=W'/א]q}™,Kr%3aAyERcuEG@7 W[a-&?G&rMW4 EP1icTbVī{ OY=Zd8i髽2$),mr~4DL3N䱥p8+"IJwp$m49֘X{gMeĊ6} /)V@qhLN|0)e,U;[Ql4'qn1hddcLaӐ@<`W[$rr<{m6K8̶V,2e ;zFQGnʻ $- -ľo~qTch>Gvh4xc.]K"6-J}k:/VbvT=/ͥk *Ϸ3_Cf8RYCܟ!L<9jƂ9nChjbcy.A6"a~W 1*bm't,w6-\eM>*Oh=IbZ0M:hŞqݻuR~O6.uWˣ4y2JG`ojաb/<˙#P(i^?qz3[36370뇺0 \Jx߰ ;UAجTi2eJ<7tE_\x/%:@^6yoHγ?{P)WF(=Wgؑ%#+[| 2Y) ˖eh=KGXW9(9 gMG}+ަ[Jҭj7\/QmosbMrT6D`K*=g/<@M?q[)0vFږ/Kd .&Љ[,*Ld0E< ++$)RH(ohBﰐ Dl) uN [X-0. 1:3"d/^9tX"M@&>NS*0hİ itkTOиԀ(z,0,) 0+X&< ʫj*n  "B+斪? D,X/c "Jd0.$< Ơ&bEZfPK0ig ;V Ȏnap  n$?2u,ڋ)Y|ZZ@ȎE/(& Hh$F)i@vQKӊSoB6{M#ӱ/I!>^ 5?PμmI|>,ҎٴVZrtfh.4)IUN( ? ip2ER 's ,imtK>6Ilj2.tEDc (l6bunF aK i#K>k$Jk3Q1 s )npm>F2vԯjꦫ &Tz7RxR/ ii`UR:嶉/vuT>> /ExtGState << /GS1 7 0 R >> >> endobj 165 0 obj << /Length 2256 /Filter /LZWDecode >> stream P2 DC4c"0d.bA`k 6"&x! p9@E,H,&p[#) QB1E#Aʆ7#AA #E#*R 1A]*h*" Fqpm "^ pP8)*di b($  #\b3Lq: UAFuIm8lci،j}ؠPj1!#(l. C2ͦ,v5]s-UT SzŴ rɢhCH#(4 Rr$&A~ ҭ R: #;A^@1qZaD ģs ġ+N #|;#ģx,$l<78; 0k.;r|!JH D!mb6f #<8 8c3=,A84X[M f6+j<)2R]8UaB#U8N54mF-mdJSn1bC51û|(qoN*QV;xjEmr7 cKlP#F 7i2W#RF*.*'cXu7#VԔn܃ .Mc1 *^R3$b:`IJc"hW4%)rZXYU.P%t@H :? U%004 N6e-i 8N%^a 0ٕE6 aR cSD3Dhl7k JXg)\b(<"Y9i\/UPLF c?*#³eBiU1\Q0TWAkH% wG6cݏ*`4G`iP!Qv2,94|% bW(e>u0K~O@B_JXKRpPu\0e.lJHuʱRs(UyPUJ:OFzD6NͣI7  [ƶgRFF id Ԩkcrۮfח`SVNZI8g_N9PpJB^tPXy8+ wD'DHj\neJwq# Qb35 EuJR{.ߜc PyaW󕛃 ڮH9ĪOg*2|_oC)$鎍ccMPí>IJlk0=h(Uvcc19U3C4@@ ltyuDpnbHDґd^8z4n*|M=Ei>N]5σ8;B~ʀl;Cj_od ɦ vA5wٱ .yd*Ϝr ̶[J0P* 솠)D endstream endobj 166 0 obj << /ProcSet [/PDF /Text ] /Font << /F2 5 0 R /F3 6 0 R /F4 12 0 R /F5 16 0 R /F6 29 0 R >> /ExtGState << /GS1 7 0 R >> >> endobj 168 0 obj << /Length 2831 /Filter /LZWDecode >> stream P2 DC4c"0d9 p. af$D!9Ng9,`3фT; bIo9 F#aA‘JNHPn3PPe 4Xe9LjcutPt7(څ4R--beVwE%ҡ* BapP\9DDj1! B$OFIRt HPPC .(8C0#T->R+jYrV!0#"38 y-N3xlpl\.4-?hL̸ܦ x@ReoЃk[[j;K&=I <{†bʰ[/.U`T b㪶)/곸TRe]ÄP\cAr=;)߸?Eg-I:Se/?/2*wںx3E} wLm_=3 ZZ/ pk1p/NRpC{~)Spw%ȿBfVKa aJ?y=Ҙ O·[= \$DƀWF]/X P0ӸUh;mxd B9$"rK@KbJ#(^2RDlg5/E$nl J:A7u \w6TB{R5ce9NCCe.Fڐi{o8n_)y& r;σŒ\ 538PFpGMIz vY cJzߔJ*POǾpndn5>ȍu +<%tst 8DD۴(J^zKFVUX7G&#n߳\eb /=`%Ȝ3=&O [ q=x5W!&vTz˦Y)̿b͋:ʰV\I+plBbkôlj `0o a?udJ> a:x>,acJ0;)>6bw,5m>7b#`AC eBM[kլ2pN* ' &4IB~+pe6)-6Ib ,_6aOD w(N*+mbz"n'FԂ&T gp3P6oڈ/oeD~Lˌ)JR%! `P7@٭V,/ ZmOK#dKFI苂MIo.LMpq?簎 ΁Ǡ1>lOXd҈myb"VEEUjf`E `VF(c%hZTDbQenV -bej$*Y6Q咲$ F̈́)NZ5QD'b/n%do8Qp}/(0CjT?bhSBbkf( PQo֢ώncr\17#/% W0p(XYdRBY D?eqW/m ` endstream endobj 169 0 obj << /ProcSet [/PDF /Text ] /Font << /F2 5 0 R /F3 6 0 R /F4 12 0 R /F5 16 0 R /F6 29 0 R >> /ExtGState << /GS1 7 0 R >> >> endobj 172 0 obj << /Length 3269 /Filter /LZWDecode >> stream P2 DC4c"0d.bA`k 6"&x! p9@E,H,&p[#) QB1E#Aʆ7#AA #E#*R 1A]*h*" Fqpm "^ pPj0 W24 _1T].1&C8 S* E:61V\45>PhZ{pd5𫐑r6XB_ oM kWv:޹*ێ{|j1бj޸ 2ҳh*ԵI~ 7jB":M!R.H(S6/舨If07"+*}#?}@Jar,I G-Kx7Z4*j78 JU&Eф/ 4 ѫ0`Ч7KL᫣(@4f 3ƪ cx: #HK  d>t"Vn\:L+aKzΎ\ӭu< LTTT,rR˔7Ԍ;3tO2u͆qH#Kވ5 g2mB䬍R-uܪH6*ꋏC(ZY":CuT3ҪM}J*#|Ks~W^U`شEm>ҔP4C۬G"=5\ 4iZak}Č4.$?YX퉪3N ԥ]Y_dS˼Cz5Wv>4y8bّ~m\: uȫk6(JZmK̩HشO<(pڌſ #Hwh-O;{߬x5^{1aS}!Mo|BR.FiB2^[C#, [BAކ a] Tm 7P_d$iqCT"D! $Z2;nGP ;eJ;ۑ@춄s_eԹLCb!#A3OC'}?rW&"( @ْD.o<Lc#V(Ajn(ln)oA.g̡J1A9d[@(. REjrW l͹eh2J'P脑pS6R-o8XV]6 *jXÀS R]G2bJqXT~CATqWj<a:0N]Pp}ry9KdUjOiu@tŪ2j T^(}gY%n`µH(}HyR,H9% *E$9Y-dUA'29(2O<grhRcUzܢ=mgy k#2g{r?M(UraZp! )rJi 2aX6;RWk1Pae SD bm'M8RVF"a&b}a$r#mOrTb->)' >3A?H˴mؠ*@%f e܉/^T3Wa6*,I6Fh%oS=5 X[lb;@Pí0ت_^i9˿Jg\+l;aۋ] ;[9 |ÕEv>ڷH>*W"p+ds]T85P!E aB΍ViBiT)ZH~jP@E:eA %+xXΘh{Zt\.Ef4Bfz$z;;g;A8Zf;jb >| js@R*99qs2;; P ;>EsEs;i=H^,53CUg{84p& >.40TC ` ` endstream endobj 173 0 obj << /ProcSet [/PDF /Text ] /Font << /F1 4 0 R /F2 5 0 R /F3 6 0 R /F4 12 0 R /F5 16 0 R /F6 29 0 R /F7 33 0 R >> /ExtGState << /GS1 7 0 R >> >> endobj 175 0 obj << /Length 2973 /Filter /LZWDecode >> stream P2 DC4c"0d9 p. af$D!9Ng9,`3фT; bIo9 F#aA‘JNHPn3PPe 4Xe9LjcutPt7(څ4R--beVwE%ҡ* BapP\9DDj1! B$OFIRt HPPC .(J :MϮ5R/5U@GeKV0@3*t3#j E^WMk 7sX6í0TX-0 XH Y6k`V-@2̪LeEcmBUE;+ 58rWJ@X3P6a5x[55QO-mbH]{(Xbc c x 1ᗨ3ihE5t4-SXNlKAKCN-j-Yzd.{An1Rҹ?+n=5Wy-',٬a- noaޅa[tao$b3kF3qPsb٣2ݴqyUs5o/{Mx 2SX{Z{Yw9oF6dѪZǬu2SoknQ'X]}(SXo 3s L4Z :@HSXL17wkkTh/@Jq㟳/Mh9Ht3?/<cX9Tb#ZAL:CHxbB 5~l2GZ_%\HL+;3(PU \:/P$6q>33d k 5H:IWɢ<'w:ؓMk4-_3< 2Z˵Ak釯D9%bdK>T`ZP;lXjyuDKS$Ĵ )/~F4t1:glVDn`9peSf/&$I;4ArJ|XULI>G]f)YhoDkJf l$<uYSl19%a %c Yf:)+j opʶ%\r+"P1 .Ebi|>ȋkr٪EeV&ǵQ_!W~8#]'cT+Qrcz5^SdR5#V3ۑ hMƢmT; |5*c\AKk-ԆCIj/vm}gɐPnl ^m)QO]BÕF.d3bT64%~xN0JMK@W3YѠRSc>b b&Oq2˩i=1zh; 13|z~MaK L2:-$K9ԙNoDWfmPh5{x$p:ZeJ`͢xQk[U*HYʭp I5@Vfm+ 0`6 B iͳq+IjlQnVҕFJY=hB@C BSY:w+"li0 SFς샦bZ9nB7w-cЋJmM+8ITSTMxI:p:fwzqOZౘ^-鯁T\:oz?[20ҲZL]"X9hQX.U :o3~%?C{ӎDޝw2SwhfM;M  eg=-Jls k7Pwk5ɏ02h75`{OCӝ߷SWnʮ|M,Χ=EdBN\.෉X=@LLmP).A^,qb @cD!")c6E@A.'*I~4P GFFV$Ep2n\񢆦fN4e)NV!f@Z.pf$\L~[): ЊJ ` Ζ-6 CK@f~ %+ Б *h p|/M&㦬)(lb\&N[ d?[j ;b;Ї  /0 b |Uf./mBzF,fD851]tKo)+C".(~0}肔W 0=p :?0Zn=p*͆TBE/& z+/мfj)1$y'&^0 (b8P M,!ZqHVqQ&N.0l> [!I$\9n @Qg.sd,!C ¦ q? ^$fMK&`   $'bj : p )PzqqWQH*i/ýr.'r#fFO1Vde#/`r+ 2U%]"*r >b6Rs's?c (2,P 0 cc{")- B endstream endobj 176 0 obj << /ProcSet [/PDF /Text ] /Font << /F2 5 0 R /F3 6 0 R /F4 12 0 R /F5 16 0 R /F7 33 0 R >> /ExtGState << /GS1 7 0 R >> >> endobj 178 0 obj << /Length 3602 /Filter /LZWDecode >> stream P2 DC4c"0d.bA`k 6"&x! p9@E,H,&p[#) QB1E#Aʆ7#AA #E#*R 1A]*h*" Fqpm "^ pPj2 W24 _1T].1&C8 S* E:61V\45>PhZ{pd5𫐑r6XB_ oM kWv:޹*ێ{|j1бj޸ 2"*kԸh[Z!j)JaBhBƪ*hp#"aV?b(&DQ !Q0űzO-#1 ,f7 0d̎r6Q{.@R"mLCADvDM+=.͡@f5BL68M h&*5PL3l$;<%g7P5 O-PQeC, @Te`ÄE2+Lb0.J%,VoA2ږP$n+xShY]54E6TԠYUq1DFT5Nt꼆(!;ס 7}@JPdM17u#F.Hh@2fMc0-q8T (19&zs cM68sjƯII>.类rS,N2"iHc!5>5@j njׅ; #%0 KhQY5;~DDhO5.`S2:e 3oq;4n} .V*2| c.k;M֢4!,J.9] R 7 Fvr/ajS aw°WiSse uCih,44_1KmwY)/yb-*05*:0U Wkrб2r˃4_8v9V77\+v%Fx 7AЦqf*)ǒfac%َ=|!8@H |(p~(DR _CҠhAdZRP\0\h_/B&1cR;.UG|WIN= p2乔챃(s-켙|d/T VIk1R Gٍ4lS*,UتmͷjeS BXUPSWU s23zr,9|&(ՓUꛚ(20:JH!+CpHaZ(ObhwZh3s70ʹ5J*0=)-DȬAZ&g%5ꢪ֠lKaBP֠O Wdeܳ2N\go@S3FTߢjYg\+HZ'.1T:u>/0ބ[beEr* 1(tL4W)$[lCop̮>RX,n_5&dVO!@V Ӵb)A'PXʀs c-ٚrf?2z]*٥wg@b-⼔̢Tv͊E:ЦU$iSK4dȖk^#3C xe`yG4 X I)JglyҸ3$-̪C `T)cl=vڻ/X06a'l`sMPݳLalfٴ6m9$TޥbUs myC]'t(iyg?HsFctEJCӱT>+_!p`LMfƁO>M!&PF1&`(? l@m< 0\Iz 2$#X`fHm' rX^RL%Q| qPU2r6Gl@(M !l& & Y"K#E35B{`kH%m2tQԬhÂ*(,"@ G/h |p)dN10U'غ# 1^qsc.r /t/+Ro0:@3?o74s7@Q.3TMsN-R͆й3R0$SP>t]>ST` M YT l Դ@4JT KM4 `1M0` ԱL` H7F3w'tIM•4K5 + RQ@ 4MRJ+Q )͆ L Qg*QPURO@U V5aS 7TO QOH:ZPZU[o\@P Um<8-uxU~ B]L`Vl@`Z P ^ՍJ@N6 Q@Q@^[[EAUiUt^S5Y^anLa1L5 e@P ԣal i X=dv ` endstream endobj 179 0 obj << /ProcSet [/PDF /Text ] /Font << /F1 4 0 R /F2 5 0 R /F3 6 0 R /F4 12 0 R /F5 16 0 R /F6 29 0 R /F7 33 0 R >> /ExtGState << /GS1 7 0 R >> >> endobj 181 0 obj << /Length 2831 /Filter /LZWDecode >> stream P2 DC4c"0d9 p. af$D!9Ng9,`3фT; bIo9 F#aA‘JNHPn3PPe 4Xe9LjcutPt7(څ4R--beVwE%ҡ* BapP\9DDj1! B$OFIRt HPPC .( #!EDFR.n+ K4!"5Ҡ[+K.736ӜK? H` 2͜P⤾P\FPlKFOm>OêPԒOM%?  &W JO.PkF-8C6sQJfju+P=,4scQ'ME?S DmK2G9ǧ뱐 ]k?4 fKy  A0NC K $Mfr9 +n |3[RDAb(}/g$sz }A8l]Y:'R~0{ w}j .Љ`bdfnobn %Bs /|oȉpC9K4> /ExtGState << /GS1 7 0 R >> >> endobj 184 0 obj << /Length 2928 /Filter /LZWDecode >> stream P2 DC4c"0d.bA`k 6"&x! p9@E,H,&p[#) QB1E#Aʆ7#AA #E#*R 1A]*h*" Fqpm "^ pPj4 W24 _1T].1&C8 S* E:61V\45>PhZ{pd5𫐑r6XB_ oM kWv:޹*ێ{|j1бj޸p2"*20IfR"J`er(eD6j7GPG!@ȣDe"aԂqc.P*000զD 5xcŐ4];@29Q`@=29.Aa0H1:H2\_?Eilq$X.60 *M1*C3BMt@>2#>Lܻ3:1b"ҡZORq?0B0Ue<:*H! 4(:#"e"'HQ(0 ՋRD(Lh5J  ZrsdD|w~ 3]rvԡnR(NH# ̬9xG ӂA"b"T#M ܂x`SQDX*ұ *b5.^H]kr5[ׅ ܴm]Zw^Eza7vƪKVά[*K_7d`Ŕ܄YlH6ݺ&H6'ptŀ*(X1X%KXD{V~Eȸ+ϳ*3ؔYnVӑ Y7V`aRP`KMG=Ja:8e 5>EM[ctqJy<K4jٜsr*F# (ܰ,:H}G$KM*`{b{*J43Q7QԶATA_m{_A@,Ѕ?&C(NH!֬8cUVڌ *@(PvcG*Z|hW ["M[LƶuGodB^ea-r^"[_aM.ZFhlEU&0RpQ-$] R+^.|nԶ[*c}JUkqX!S8 >+EbcBcq"d ҙ2 ZX(Y J"a N T2Ob&C|n 1EplbHt %Hw(7THU\ \c pQ45%V{", *n!KbbLYݿ%e,RgIPhڇ@ /R+"6 @ HLDO2#a' @`Pb@{ w *g\X"%Ej >6g ZB)$⮎UBGn J/(iB ܷU07F&oB4H.^Fp^g (H8G(c9A B6O >c FTP(5B*/ )8",BZ2/f)Pp)1(}/YpE¤) ܑ+.:CPd L0 "8cqq?1< P(P><w 8t` dXK PPPS0D \@N1TB /#2/1C13c=L; ?)`ҸCV !DsP9@PTOF{*(`@ t(qtPJp X0nN"h&? p 1!;E~ r@ނ R-hҨR$Pў-t/ [" 19R;#;EB endstream endobj 185 0 obj << /ProcSet [/PDF /Text ] /Font << /F2 5 0 R /F3 6 0 R /F4 12 0 R /F5 16 0 R /F6 29 0 R /F7 33 0 R >> /ExtGState << /GS1 7 0 R >> >> endobj 187 0 obj << /Length 2913 /Filter /LZWDecode >> stream P2 DC4c"0d9 p. af$D!9Ng9,`3фT; bIo9 F#aA‘JNHPn3PPe 4Xe9LjcutPt7(څ4R--beVwE%ҡ* BapP\9DDj1! B$OFIRt HPPC .(0#sʂ)7+Vr23 fN*(.#%(,Rk3Ms5 4,(KQI<Ӌc5N˜鰌3P\r;P4p~Eh˸jхb(*m7,D4P@0$XX2ڤ C(0\/P USUE`@7u G7nL#+)/ ?q]Wq^m<-%5ø~VnVA@R4Tf ('1?";(hiٜL }/TXAw+ztFr(VD5Zo4%UrQj1TpAZWvU󝦆ȚiPhN^ɮZs-km=3ꌕ42|:.%y^V~kQeqbhe&UH7&UydqLd۵/8%@_ w TMUy1U^|kW3lS,]iцw"VGGM=T<=yĶSkkQj{l5b#pdUmr-qnuJʊ ERFCSOEU`WdM:R])pt:hy]/2j1 kfMmW$/raef(q[fmɥӖUg117f)S8 1_  a$h Di3~,jH.J0rΟNN3Ǭ&'\]  NܾyѶx Q/"Y)*G2‹QZ>tY.0R\%g%Iz*TE/I(oQ~kWg3ypmk8+lל@1,4 kzY~?GF8WcARՈqSzPjOAzC-KpPP tWo\^K^f@&-JDnJ٫JP_f@ i&,J_L˦KȺ긎VJ4Tqh/% T+ z"'4CpڲD O*гmzIVXJ~m/ZN~ kfC+"ܝhʴw  , jp̺>=xR$(ļ*Mɘb4ƪraFMttB6RaT,krɯڱda/zJ`JR٦TaPqN Prok ~y&:r΢Npm-:ipXJq[dMүM;oH hObG4Jgr`'jE8‹D+18ϑ'DH-le浪 Ƥ'Ja,N ev T\RV\괻Lp&IB endstream endobj 188 0 obj << /ProcSet [/PDF /Text ] /Font << /F2 5 0 R /F3 6 0 R /F4 12 0 R /F5 16 0 R /F6 29 0 R >> /ExtGState << /GS1 7 0 R >> >> endobj 190 0 obj << /Length 2849 /Filter /LZWDecode >> stream P2 DC4c"0d.bA`k 6"&x! p9@E,H,&p[#) QB1E#Aʆ7#AA #E#*R 1A]*h*" Fqpm "^ pPj6 W24 _1T].1&C8 S* E:61V\45>PhZ{pd5𫐑r6XB_ oM kWv:޹*ێ{|j1бj޸*%p@4","#.hk@9 # 8Ⱥ2¡&ͦ+Aܼ$b!rpt11L s7hkI (:t hD2JKS '6hn2PMKT0Mj 7 H𧻂 *AСkj]( #u 6я$ j"P n  d,Nҭ?NPʥKJ*OTREP t%K*5(*Z;kzcdNP].eSD+XBXо,x(]9Q%L6KM T=Tc! 1: #x ᫶Nf9mgY`@$@I9DPЗAv>{#`kBSUG c(2ŁBT;][x{C`Uao\kH"޺ks&6ʪPSЋ{Ӵ1u`aL&u=NĵTfNSJ-گ}cq` +xS2_Դ -^]A&E,`;&laNp>e@V@n{qf*Z_* 4ӂ Jd # B]3'mKt <8RC|RqBH>U ꄈPNBP8 {   c Z _j]`!v y7豕6J.xg 3ݻp_#z?To@rə'xM)NcQ 2At?XCqf8E`l9C"n -x1Q9JS Hmrq9\ e2p T"[BNZC*0XtPaVj+JiFC]k@*׍ E0=I(Oc P滬* D/VքCfZh4dF&nHvK J>+h1JWI:@PD՗zb-~4#0yեƦ]%HUN !CQC,< PvWb(Kt(E1^]O'í:oliܠElSʒO6:95;ЬlALE4RZyEf(34ҀFBP X>;r*6N Rn܄&DYyiIĺN%qot RK7 EՉoڎ 1W+QMʃQQO\Txljm||fC;XCڃ4R 8k";6Fp@b/bgY)&tM%kO6Qv2ci6A~Iw RVqLK]("lTyOmUSBE;W9ZIԎHIW\W/%*;^W1ML 0:  p&J݁ 9I#Qp\*A%W2F[aX v1c^*>M,^Q97DUoGd$LjHkM ZYC:}se}7ef-8uWU6ӬL<0"36GhK[c-lU:iV/J6X_mMYbEV.y]?H9 ~)U%aql! 쾍 SU:O`9N2 'yExb~J/)Lu^T89[;Y]8ujG?hm}s(yL}7y#Cҵ@ £竢ZC(tAΖT2y(Hp w,ަܝܦ : '),TEnfT'L CF L/Rtf"N԰NϘ-,0=F;oB(kT,EYl+1V fL>`ސl.^v+l+NbaCJ8I|dC g;j* ϫ q[ KÒ# `)lB )ZS (9'+*Qƒ. L m0m P dd7@- pJ 'L7^_~w&"obQ.n`i-@QPY; [pRROR@ t^O_$q DtM?EQ ΐ`H U#h(U ̜’ʗ^ґg@ endstream endobj 191 0 obj << /ProcSet [/PDF /Text ] /Font << /F1 4 0 R /F2 5 0 R /F4 12 0 R /F5 16 0 R /F6 29 0 R /F7 33 0 R >> /ExtGState << /GS1 7 0 R >> >> endobj 193 0 obj << /Length 753 /Filter /LZWDecode >> stream P4 DC4n. pj  ,"^G)Œ1(aCZ0EC(!gBxZ1#!ȠNCAAU3@2kHUu: T 3ys@dn](RcSˑ KBT %C ")B*?!JpT:0B砨 e%CVACَ#I&pQ/a}!h΁$|}@ 5<=J:δ/+HP K+AB TBp3BK* #p jn1ʀ LDϩPF `2A)8@8x27 c`3$+rF@72L#2\`R2ʺ Hb9MJ[޿z+='O?/0?- J4j H4MMa:^IOT « +5xHe> /ExtGState << /GS1 7 0 R >> >> endobj 196 0 obj << /Length 3407 /Filter /LZWDecode >> stream P2 DC4c"0d.bA`k 6"&x! p9@E,H,&p[#) QB1E#Aʆ7#AA #E#*R 1A]*h*" Fqpm "^ pPj8 W24 _1T].1&C8 S* E:61V\45>PhZ{pd5𫐑r6XB_ oM kWv:޹*ێ{|j1бj޸*%p@4","#.hk@9 # 8Ⱥ2¡&ͦ+Aܼ$b!rpt11L s7hkI (:t hD2JKS '6hn2PMKT0Mj 7 H𧻂 7PkP7u*7сRZެNP1 R.H(pC(P aC; 5.?(**(@1 aO ƪqB6d*v*j \j:Y !Үn7`jʀg\`7 k"[qt>RW̊ $ң4m:[6eЃ!.?Xces-7~,ھ>ڷT־62[Ӏᴭ>6xې*+QW*ӡV MgI>r4SO #h{mM~P66T øPʦKqzE7X8@7[cO˙7kHnCX;:(26aXSGcspP5xe1K!NQN_z9J,/ e\4ӾVJ\_Ȍ s+ T#>`U\ x,S|=mvCxc|1$AwV&(fd& f+50dd_Lpiʹx\(OIfo9]UPC38&Ͱ6Z*u2V':#lTE0. H,6=h\x0r.L0\Xa I-.)0i 1U+%reiu/%[Pb H$7@T͘a9=H\&$5jlٙ_t@Avכ"ؙ\7q6`P{(`26>oOTYʙ*Q I]oPc qw_Ehc\Z #Ecr= 8gԐre̎<i%d%r5r6\)chةcr`R-K7誎Ia4NM|zJyPOzGGiyP*Tߖ@Vb6$lra$PkYՔAUu0Wg !#W";rd aĂ+ V-| ,x)7)eC$!Ϋ:j؈ ZIHnTʹWW#W%se2ubi([Eh!GXgt6޵Mȉ{ Uf}fՉK%3\8t]b^p2MVJv-PFWvUJ=, ZW*pq{"ճXUm5k.?lLoX9= ][:<1183`h6;h"[-=vV{s}r_!#`OC:%X\3wLL^e|o4ѧcڄ QNp9h+f B+ y 9Ԟ)\9LR[qYO2eǭ[UN.;U!vn]kפ\z@?  _oj3Qj95Զ>es |7 -7Oƶ0-Rn KU\J7 ۫쪬I]x[ vKp: i4)Kxl)sBm|I .QJ?n |6qIR;nJv֒/PZ êsΘlEBۧVFt"D9"ϊL+:{Ϟe/4VPnN<+):\Gk*G}`C 0 l:kgsg<ɗ5^Cױ+JK}_Gn nߛow@g73XU 3ȷMy '1#ex~` /(DnP(C B6Č n" p[l20@w ؼ֊4 .f+Vؽlī@C.ţ bdv;KΨ-h@`gK搃- tgeI{L 6b+jBӀ@.{/vlZ^vb\p澠Lk.JOQcmpWʀJr5,~-ΣH-(zm'dmZ pFɜ j*rP+yi诎;xdf yh>Ea% .lJf LwˈnS膧z[ զܸQoTXOaN.O+P7XQ;x4kpn ~(SYckLr%C*po)#($S㴨O`*$J;T&Gl[v(>lh2pqF 萄2CI0vΘʊ"npW$zuj/O(8K/.8L`yc7NP Czc% Bo6S$‡GlO>̰l(䢡 +k ǖ29wʉ("j6BYˌ &Gt?#޸+o&)&>\gE8je)3S`zpX@P]!s&{}e~Ѓ,P0f,̶+@Pm"N,/2.rhf':[z+BJ^v@܇MC^Վv;hHx`~֧\gӨh&xbj vbbU,,AܒFCDF(tj>R% QSl&!|qc*\cT4dnhe7-X^\io.ͬXS ԗ%\B'T"=ҋ5#h\q+/ĿA0 8j~Q)0 |(=2On> BUP6- ?&-%8ٯ7 Pb@ endstream endobj 197 0 obj << /ProcSet [/PDF /Text ] /Font << /F1 4 0 R /F2 5 0 R /F3 6 0 R /F4 12 0 R /F5 16 0 R /F6 29 0 R /F7 33 0 R >> /ExtGState << /GS1 7 0 R >> >> endobj 199 0 obj << /Length 1889 /Filter /LZWDecode >> stream P2 DC4c"0r8 !Cq``5`<X 8Q "$qc FHQP-bn:E#Ƞ)EIy : FU#A@L&R鰣o FAItJA\47b!c2\1$@jTQ"}@RƔjHZsРi3+4@2sH@(6m Su"x-P9F8]4pꌩ^OnAHi8b>e;a0؉ ɺFSZH5."2@&>r0;Ţ,rh",Ȳh-#p@8΀PA@1 b },ڲ!l;HD+I T֎z983<*/H .I@HTzM2إCH3Β`̥D;H*ԧPA@Z\^1<(#Шm$7Dq3$Vт5VC^83 /,6- 3F2ڊ4#c_=Q*pqVõ|;V0#0 2 ֌*1 ;& ](18;6H;WnZ\u}*W‘>lzdjm&<-&Kj{H.FЅ8%Ot\յXaV5hމo{YDɪ mr2c$;`U'`l+ⳬ9CZ*6#;&ls2G &4ZZ:{.kZt>K(|kjC7%®#'+JW:UHYIQyp\M6M`Aw]^jRg2ʃJ{!ƴCe*+**(_aK\o1TC՚=4JKuxүWAUdWUѨ6B]fʜz%n&PȖi(@-Cc l@7T Jx$߁jc(b*,gcL-ia-%6b&!3%r ©14b5VNEEY;ej(j .cbY f N5`G J0Q$.˴&Dkbڢa 1R"DJcI>W\I xnQ.;I2Ur ْ+bc.K m: #Bsq,4PbCmb GlKgӭSʮYN &3_9Rfһ Iͷo*3 -$ֶⷡS x6Bhmo( j rK7B{ū`5AssyJMkňd&P)4< [zi$F!z=z2ŧ8T }\ CINmGQhZGY+3aXp n46>ףHe%}1 t.R endstream endobj 200 0 obj << /ProcSet [/PDF /Text ] /Font << /F2 5 0 R /F3 6 0 R /F4 12 0 R /F5 16 0 R /F10 201 0 R >> /ExtGState << /GS1 7 0 R >> >> endobj 203 0 obj << /Type /Halftone /HalftoneType 1 /HalftoneName (Default) /Frequency 60 /Angle 45 /SpotFunction /Round >> endobj 7 0 obj << /Type /ExtGState /SA false /OP false /HT /Default >> endobj 4 0 obj << /Type /Font /Subtype /Type1 /Name /F1 /BaseFont /Helvetica-Bold >> endobj 5 0 obj << /Type /Font /Subtype /Type1 /Name /F2 /BaseFont /Helvetica >> endobj 6 0 obj << /Type /Font /Subtype /Type1 /Name /F3 /BaseFont /Times-Roman >> endobj 12 0 obj << /Type /Font /Subtype /Type1 /Name /F4 /Encoding 204 0 R /BaseFont /Times-Roman >> endobj 16 0 obj << /Type /Font /Subtype /Type1 /Name /F5 /BaseFont /Times-Bold >> endobj 29 0 obj << /Type /Font /Subtype /Type1 /Name /F6 /BaseFont /Times-Italic >> endobj 33 0 obj << /Type /Font /Subtype /Type1 /Name /F7 /BaseFont /Courier >> endobj 40 0 obj << /Type /Font /Subtype /Type1 /Name /F8 /BaseFont /Symbol >> endobj 101 0 obj << /Type /Font /Subtype /Type1 /Name /F9 /BaseFont /Courier-Bold >> endobj 201 0 obj << /Type /Font /Subtype /Type1 /Name /F10 /Encoding 204 0 R /BaseFont /Times-Italic >> endobj 204 0 obj << /Type /Encoding /Differences [ 0/grave/acute/circumflex/tilde/macron/breve/dotaccent/dieresis /ring/cedilla/hungarumlaut/ogonek/caron/dotlessi/fi/fl /Lslash/lslash/Zcaron/zcaron/minus 39/quotesingle 96/grave 130/quotesinglbase /florin/quotedblbase/ellipsis/dagger/daggerdbl/circumflex/perthousand/Scaron /guilsinglleft/OE 145/quoteleft/quoteright/quotedblleft/quotedblright/bullet/endash /emdash/tilde/trademark/scaron/guilsinglright/oe 159/Ydieresis 164/currency 166/brokenbar 168/dieresis/copyright/ordfeminine 172/logicalnot/hyphen/registered/macron /degree/plusminus/twosuperior/threesuperior/acute/mu 183/periodcentered/cedilla /onesuperior/ordmasculine 188/onequarter/onehalf/threequarters 192/Agrave/Aacute/Acircumflex /Atilde/Adieresis/Aring/AE/Ccedilla/Egrave/Eacute/Ecircumflex /Edieresis/Igrave/Iacute/Icircumflex/Idieresis/Eth/Ntilde/Ograve /Oacute/Ocircumflex/Otilde/Odieresis/multiply/Oslash/Ugrave/Uacute /Ucircumflex/Udieresis/Yacute/Thorn/germandbls/agrave/aacute/acircumflex /atilde/adieresis/aring/ae/ccedilla/egrave/eacute/ecircumflex /edieresis/igrave/iacute/icircumflex/idieresis/eth/ntilde/ograve /oacute/ocircumflex/otilde/odieresis/divide/oslash/ugrave/uacute /ucircumflex/udieresis/yacute/thorn/ydieresis ] >> endobj 1 0 obj << /Type /Page /Parent 8 0 R /Resources 3 0 R /Contents 2 0 R >> endobj 9 0 obj << /Type /Page /Parent 8 0 R /Resources 11 0 R /Contents 10 0 R >> endobj 13 0 obj << /Type /Page /Parent 8 0 R /Resources 15 0 R /Contents 14 0 R >> endobj 17 0 obj << /Type /Page /Parent 8 0 R /Resources 19 0 R /Contents 18 0 R >> endobj 20 0 obj << /Type /Page /Parent 8 0 R /Resources 22 0 R /Contents 21 0 R >> endobj 23 0 obj << /Type /Page /Parent 8 0 R /Resources 25 0 R /Contents 24 0 R >> endobj 26 0 obj << /Type /Page /Parent 8 0 R /Resources 28 0 R /Contents 27 0 R >> endobj 30 0 obj << /Type /Page /Parent 8 0 R /Resources 32 0 R /Contents 31 0 R >> endobj 34 0 obj << /Type /Page /Parent 8 0 R /Resources 36 0 R /Contents 35 0 R >> endobj 37 0 obj << /Type /Page /Parent 8 0 R /Resources 39 0 R /Contents 38 0 R >> endobj 41 0 obj << /Type /Page /Parent 45 0 R /Resources 43 0 R /Contents 42 0 R >> endobj 46 0 obj << /Type /Page /Parent 45 0 R /Resources 48 0 R /Contents 47 0 R >> endobj 49 0 obj << /Type /Page /Parent 45 0 R /Resources 51 0 R /Contents 50 0 R >> endobj 52 0 obj << /Type /Page /Parent 45 0 R /Resources 54 0 R /Contents 53 0 R >> endobj 55 0 obj << /Type /Page /Parent 45 0 R /Resources 57 0 R /Contents 56 0 R >> endobj 58 0 obj << /Type /Page /Parent 45 0 R /Resources 60 0 R /Contents 59 0 R >> endobj 61 0 obj << /Type /Page /Parent 45 0 R /Resources 63 0 R /Contents 62 0 R >> endobj 64 0 obj << /Type /Page /Parent 45 0 R /Resources 66 0 R /Contents 65 0 R >> endobj 67 0 obj << /Type /Page /Parent 45 0 R /Resources 69 0 R /Contents 68 0 R >> endobj 70 0 obj << /Type /Page /Parent 45 0 R /Resources 72 0 R /Contents 71 0 R >> endobj 73 0 obj << /Type /Page /Parent 76 0 R /Resources 75 0 R /Contents 74 0 R >> endobj 77 0 obj << /Type /Page /Parent 76 0 R /Resources 79 0 R /Contents 78 0 R >> endobj 80 0 obj << /Type /Page /Parent 76 0 R /Resources 82 0 R /Contents 81 0 R >> endobj 83 0 obj << /Type /Page /Parent 76 0 R /Resources 85 0 R /Contents 84 0 R >> endobj 86 0 obj << /Type /Page /Parent 76 0 R /Resources 88 0 R /Contents 87 0 R >> endobj 89 0 obj << /Type /Page /Parent 76 0 R /Resources 91 0 R /Contents 90 0 R >> endobj 92 0 obj << /Type /Page /Parent 76 0 R /Resources 94 0 R /Contents 93 0 R >> endobj 95 0 obj << /Type /Page /Parent 76 0 R /Resources 97 0 R /Contents 96 0 R >> endobj 98 0 obj << /Type /Page /Parent 76 0 R /Resources 100 0 R /Contents 99 0 R >> endobj 102 0 obj << /Type /Page /Parent 76 0 R /Resources 104 0 R /Contents 103 0 R >> endobj 105 0 obj << /Type /Page /Parent 108 0 R /Resources 107 0 R /Contents 106 0 R >> endobj 109 0 obj << /Type /Page /Parent 108 0 R /Resources 111 0 R /Contents 110 0 R >> endobj 112 0 obj << /Type /Page /Parent 108 0 R /Resources 114 0 R /Contents 113 0 R >> endobj 115 0 obj << /Type /Page /Parent 108 0 R /Resources 117 0 R /Contents 116 0 R >> endobj 118 0 obj << /Type /Page /Parent 108 0 R /Resources 120 0 R /Contents 119 0 R >> endobj 121 0 obj << /Type /Page /Parent 108 0 R /Resources 123 0 R /Contents 122 0 R >> endobj 124 0 obj << /Type /Page /Parent 108 0 R /Resources 126 0 R /Contents 125 0 R >> endobj 127 0 obj << /Type /Page /Parent 108 0 R /Resources 129 0 R /Contents 128 0 R >> endobj 130 0 obj << /Type /Page /Parent 108 0 R /Resources 132 0 R /Contents 131 0 R >> endobj 133 0 obj << /Type /Page /Parent 108 0 R /Resources 135 0 R /Contents 134 0 R >> endobj 136 0 obj << /Type /Page /Parent 139 0 R /Resources 138 0 R /Contents 137 0 R >> endobj 140 0 obj << /Type /Page /Parent 139 0 R /Resources 142 0 R /Contents 141 0 R >> endobj 143 0 obj << /Type /Page /Parent 139 0 R /Resources 145 0 R /Contents 144 0 R >> endobj 146 0 obj << /Type /Page /Parent 139 0 R /Resources 148 0 R /Contents 147 0 R >> endobj 149 0 obj << /Type /Page /Parent 139 0 R /Resources 151 0 R /Contents 150 0 R >> endobj 152 0 obj << /Type /Page /Parent 139 0 R /Resources 154 0 R /Contents 153 0 R >> endobj 155 0 obj << /Type /Page /Parent 139 0 R /Resources 157 0 R /Contents 156 0 R >> endobj 158 0 obj << /Type /Page /Parent 139 0 R /Resources 160 0 R /Contents 159 0 R >> endobj 161 0 obj << /Type /Page /Parent 139 0 R /Resources 163 0 R /Contents 162 0 R >> endobj 164 0 obj << /Type /Page /Parent 139 0 R /Resources 166 0 R /Contents 165 0 R >> endobj 167 0 obj << /Type /Page /Parent 170 0 R /Resources 169 0 R /Contents 168 0 R >> endobj 171 0 obj << /Type /Page /Parent 170 0 R /Resources 173 0 R /Contents 172 0 R >> endobj 174 0 obj << /Type /Page /Parent 170 0 R /Resources 176 0 R /Contents 175 0 R >> endobj 177 0 obj << /Type /Page /Parent 170 0 R /Resources 179 0 R /Contents 178 0 R >> endobj 180 0 obj << /Type /Page /Parent 170 0 R /Resources 182 0 R /Contents 181 0 R >> endobj 183 0 obj << /Type /Page /Parent 170 0 R /Resources 185 0 R /Contents 184 0 R >> endobj 186 0 obj << /Type /Page /Parent 170 0 R /Resources 188 0 R /Contents 187 0 R >> endobj 189 0 obj << /Type /Page /Parent 170 0 R /Resources 191 0 R /Contents 190 0 R >> endobj 192 0 obj << /Type /Page /Parent 170 0 R /Resources 194 0 R /Contents 193 0 R >> endobj 195 0 obj << /Type /Page /Parent 170 0 R /Resources 197 0 R /Contents 196 0 R >> endobj 198 0 obj << /Type /Page /Parent 202 0 R /Resources 200 0 R /Contents 199 0 R >> endobj 8 0 obj << /Type /Pages /Kids [1 0 R 9 0 R 13 0 R 17 0 R 20 0 R 23 0 R 26 0 R 30 0 R 34 0 R 37 0 R] /Count 10 /Parent 44 0 R >> endobj 45 0 obj << /Type /Pages /Kids [41 0 R 46 0 R 49 0 R 52 0 R 55 0 R 58 0 R 61 0 R 64 0 R 67 0 R 70 0 R] /Count 10 /Parent 44 0 R >> endobj 76 0 obj << /Type /Pages /Kids [73 0 R 77 0 R 80 0 R 83 0 R 86 0 R 89 0 R 92 0 R 95 0 R 98 0 R 102 0 R] /Count 10 /Parent 44 0 R >> endobj 108 0 obj << /Type /Pages /Kids [105 0 R 109 0 R 112 0 R 115 0 R 118 0 R 121 0 R 124 0 R 127 0 R 130 0 R 133 0 R] /Count 10 /Parent 44 0 R >> endobj 139 0 obj << /Type /Pages /Kids [136 0 R 140 0 R 143 0 R 146 0 R 149 0 R 152 0 R 155 0 R 158 0 R 161 0 R 164 0 R] /Count 10 /Parent 44 0 R >> endobj 170 0 obj << /Type /Pages /Kids [167 0 R 171 0 R 174 0 R 177 0 R 180 0 R 183 0 R 186 0 R 189 0 R 192 0 R 195 0 R] /Count 10 /Parent 44 0 R >> endobj 202 0 obj << /Type /Pages /Kids [198 0 R] /Count 1 /Parent 44 0 R >> endobj 44 0 obj << /Type /Pages /Kids [8 0 R 45 0 R 76 0 R 108 0 R 139 0 R 170 0 R 202 0 R ] /Count 61 /MediaBox [0 0 612 792] >> endobj 205 0 obj << /Type /Catalog /Pages 44 0 R >> endobj 206 0 obj << /CreationDate (D:19970202193639) /Producer (Acrobat Distiller 3.0 for Windows) >> endobj xref 0 207 0000000000 65535 f 0000197921 00000 n 0000000017 00000 n 0000000578 00000 n 0000195699 00000 n 0000195792 00000 n 0000195880 00000 n 0000195620 00000 n 0000203647 00000 n 0000198009 00000 n 0000000705 00000 n 0000003033 00000 n 0000195970 00000 n 0000198099 00000 n 0000003151 00000 n 0000004862 00000 n 0000196080 00000 n 0000198190 00000 n 0000004991 00000 n 0000007445 00000 n 0000198281 00000 n 0000007563 00000 n 0000007993 00000 n 0000198372 00000 n 0000008111 00000 n 0000010137 00000 n 0000198463 00000 n 0000010266 00000 n 0000012766 00000 n 0000196170 00000 n 0000198554 00000 n 0000012930 00000 n 0000015945 00000 n 0000196262 00000 n 0000198645 00000 n 0000016121 00000 n 0000017400 00000 n 0000198736 00000 n 0000017565 00000 n 0000020463 00000 n 0000196349 00000 n 0000198827 00000 n 0000020639 00000 n 0000024027 00000 n 0000204638 00000 n 0000203790 00000 n 0000198919 00000 n 0000024215 00000 n 0000027453 00000 n 0000199011 00000 n 0000027641 00000 n 0000030860 00000 n 0000199103 00000 n 0000031036 00000 n 0000033679 00000 n 0000199195 00000 n 0000033855 00000 n 0000036900 00000 n 0000199287 00000 n 0000037077 00000 n 0000040309 00000 n 0000199379 00000 n 0000040485 00000 n 0000043149 00000 n 0000199471 00000 n 0000043325 00000 n 0000045764 00000 n 0000199563 00000 n 0000045929 00000 n 0000049115 00000 n 0000199655 00000 n 0000049279 00000 n 0000053585 00000 n 0000199747 00000 n 0000053773 00000 n 0000056962 00000 n 0000203936 00000 n 0000199839 00000 n 0000057139 00000 n 0000060533 00000 n 0000199931 00000 n 0000060721 00000 n 0000064045 00000 n 0000200023 00000 n 0000064221 00000 n 0000066516 00000 n 0000200115 00000 n 0000066681 00000 n 0000069547 00000 n 0000200207 00000 n 0000069723 00000 n 0000072691 00000 n 0000200299 00000 n 0000072856 00000 n 0000076483 00000 n 0000200391 00000 n 0000076671 00000 n 0000079962 00000 n 0000200483 00000 n 0000080138 00000 n 0000083985 00000 n 0000196435 00000 n 0000200576 00000 n 0000084164 00000 n 0000087666 00000 n 0000200671 00000 n 0000087809 00000 n 0000091306 00000 n 0000204083 00000 n 0000200767 00000 n 0000091483 00000 n 0000095310 00000 n 0000200863 00000 n 0000095465 00000 n 0000099490 00000 n 0000200959 00000 n 0000099644 00000 n 0000103051 00000 n 0000201055 00000 n 0000103228 00000 n 0000106596 00000 n 0000201151 00000 n 0000106773 00000 n 0000110186 00000 n 0000201247 00000 n 0000110363 00000 n 0000114028 00000 n 0000201343 00000 n 0000114193 00000 n 0000118385 00000 n 0000201439 00000 n 0000118550 00000 n 0000121668 00000 n 0000201535 00000 n 0000121845 00000 n 0000126463 00000 n 0000201631 00000 n 0000126605 00000 n 0000130909 00000 n 0000204240 00000 n 0000201727 00000 n 0000131062 00000 n 0000134327 00000 n 0000201823 00000 n 0000134481 00000 n 0000138679 00000 n 0000201919 00000 n 0000138833 00000 n 0000139690 00000 n 0000202015 00000 n 0000139844 00000 n 0000143346 00000 n 0000202111 00000 n 0000143511 00000 n 0000147661 00000 n 0000202207 00000 n 0000147815 00000 n 0000151920 00000 n 0000202303 00000 n 0000152085 00000 n 0000155869 00000 n 0000202399 00000 n 0000156034 00000 n 0000159941 00000 n 0000202495 00000 n 0000160106 00000 n 0000162442 00000 n 0000202591 00000 n 0000162596 00000 n 0000165507 00000 n 0000204397 00000 n 0000202687 00000 n 0000165661 00000 n 0000169010 00000 n 0000202783 00000 n 0000169187 00000 n 0000172240 00000 n 0000202879 00000 n 0000172394 00000 n 0000176076 00000 n 0000202975 00000 n 0000176253 00000 n 0000179164 00000 n 0000203071 00000 n 0000179318 00000 n 0000182326 00000 n 0000203167 00000 n 0000182492 00000 n 0000185485 00000 n 0000203263 00000 n 0000185639 00000 n 0000188568 00000 n 0000203359 00000 n 0000188734 00000 n 0000189566 00000 n 0000203455 00000 n 0000189697 00000 n 0000193184 00000 n 0000203551 00000 n 0000193361 00000 n 0000195330 00000 n 0000196528 00000 n 0000204554 00000 n 0000195486 00000 n 0000196641 00000 n 0000204776 00000 n 0000204834 00000 n trailer << /Size 207 /Root 205 0 R /Info 206 0 R /ID [<774ead81d3374104d384833029c407cb><774ead81d3374104d384833029c407cb>] >> startxref 204942 %%EOF icon-9.4.3/ipl/packs/tcll1/gramanal.icn0000664000175000017500000002531407140713043017170 0ustar chrishchrish# GRAMANAL.ICN # # LL(1)/LL(k) parser generator in Icon # written by Dr. Thomas W. Christopher # # generally useful grammar analysis routines # symbId is a string record Symbol( name, # symbId kind, # string in # { "Nonterminal","Terminal","ActionSymbol"} minLeng)# integer, length of shortest terminal string # that can be derived from this nonterminal record Production( lhs, # Symbol, left hand side rhs, # [ Symbol, ... ], right hand side minLeng) # minimum length of terminal string derivable from # lhs using this production global symbol #table:symbId->Symbol global first #table:Symbol->set(Symbol) global last #table:Symbol->set(Symbol) global follow #table:Symbol->set(Symbol) global productions #table:Symbol->[Production,...] global selectionSet #table:Production->Set(Symbol) # set of symbols that choose this production # if lhs is atop the stack global nonterminals #set(Symbol) global terminals #set(Symbol) global actions #set(Symbol) global startSymbol #Symbol global eoiSymbol #Symbol, end of input global errorFile #file global errorCount #integer global warningCount #integer global tooLong #integer, too long for a sentence global defaultStartName #string, default name of start symbol ####################################################################### # # calls to create grammars # procedure initGrammar(out) symbol := table() first := table() last := table() follow := table() productions := table() selectionSet := table() nonterminals := set() terminals := set() actions := set() fiducials := set() startSymbol := &null eoiSymbol := Symbol("EOI","Terminal") symbol["EOI"] := eoiSymbol errorFile := \out | &output errorCount := warningCount := 0 tooLong := 10000 defaultStartName := "start" return end procedure error(e[]) errorCount +:= 1 writes(errorFile,"Error: ") every writes(!e) write() end procedure warning(e[]) warningCount +:= 1 writes(errorFile,"Warning: ") every writes(!e) write() end procedure declareProduction(lhs,rhs) # lhs: symbId # rhs: [symbId,...] local n, #Symbol, the left hand side r, #[Symbol,...], the right hand side s #symbId, name of rhs element if /symbol[lhs] then { n := symbol[lhs] := Symbol(lhs,"Nonterminal") insert(nonterminals,n) } else { n := symbol[lhs] /n.kind := "Nonterminal" if n.kind ~==="Nonterminal" then { error(lhs||" is both nonterminal and "||n.kind) fail } } r := [] every s := !rhs do { /symbol[s] := Symbol(s) put(r,symbol[s]) } /productions[n] := [] put(productions[n],Production(n,r)) return end procedure declareAction(s) local t /symbol[s] := Symbol(s) t := symbol[s] /t.kind := "ActionSymbol" if t.kind ~== "ActionSymbol" then { error(t.kind||" "||s||" being declared an ActionSymbol") fail } insert(actions,t) return end procedure declareStartSymbol(s) local n if \startSymbol then { error( "attempt to redeclare start symbol from "|| startSymbol.name|| " to "|| s) fail } if n := \symbol[s] then { /n.kind := "Nonterminal" if n.kind ~== "Nonterminal" then { error( "attempt to declare " || n.kind || " " || s || " as start symbol") fail } startSymbol := n return } startSymbol := Symbol(s,"Nonterminal") symbol[s] := startSymbol insert(nonterminals,startSymbol) /productions[startSymbol] := [] return end procedure declareEOI(s) local eoi if eoiSymbol.name == s then return if \symbol[s] then { error( "attempt to redeclare "|| symbol[s].kind||" "|| s||" as EOI symbol") fail } remove(symbol,eoiSymbol.name) eoiSymbol.name := s symbol[s] := eoiSymbol return end procedure finishDeclarations() local s #Symbol insert(terminals,eoiSymbol) #what if no start symbol specified? Create one. if /startSymbol then { declareStartSymbol(defaultStartName) } every s := !symbol do case s.kind of { &null : { s.kind := "Terminal" insert(terminals,s) s.minLeng := 1 } "Terminal": { s.minLeng := 1 insert(terminals,s) } "ActionSymbol": { s.minLeng := 0 insert(actions,s) } "Nonterminal": { s.minLeng := tooLong insert(nonterminals,s) } } return end ####################################################################### # # local utility procedures # # succeed returning s if s is a null-deriving symbol # (only valid after execution of findMinLeng() ) # procedure isNullDeriving(s) if s.minLeng <= 0 then return s else fail end # succeed returning symbol s only if s is the specified type of symbol procedure isNonterminal(s) return member(nonterminals,s) #returning s end procedure isTerminal(s) return member(terminals,s) #returning s end procedure isActionSymbol(s) return member(actions,s) #returning s end ####################################################################### # #debugging & output routines # procedure writeIndented(s,i,l,b) # write string s, indenting by i positions any overflow lines, # breaking after characters in set b (if practical), with overall # line length l # local j,k,r,h /l := 72 #default line length /i := 8 #default indent if /b := ' \t' #default break set--white space then l+:=1 r := l - i #remaining length after indent if r <= 1 then fail #cut off initial i chars (or all of string if it's short): s ?:= (h := tab(i+1 | 0) & tab(0)) repeat { # find a position j at which to cut the line: j := -1 if *s>r then {s ? every k := upto(b) & k <= r & j := k} write(h,s[1:j+1]) s := s[j+1:0] if *s = 0 then break h := repl(" ",i) } return end procedure symbolToString(s) static nonIdChars initial nonIdChars:=~(&letters++&digits++'_') return if upto(nonIdChars,s) then "\"" || s || "\"" else s end procedure productionToString(p) local s s := symbolToString(p.lhs.name) || " =" every s ||:= " " || symbolToString((!p.rhs).name) return s||"." end procedure showProductions() local p,S,n,i write() write("Productions:") write("start:",startSymbol.name,", EOI:",eoiSymbol.name) S:=table() every n:=!nonterminals do S[n.name]:=n S:=sort(S,1) every i:=1 to *S do S[i]:=S[i][2] every p := !productions[!S] do { writeIndented(productionToString(p)) } return end procedure showSymbol(s) write(s.name,": ",\s.kind|"Type undefined", ", minLeng=",\s.minLeng|"Undefined") return end procedure showSymbols() local s write() write("Symbols:") every s := !symbol do { showSymbol(s) } return end procedure showSymbolSet(prefix,s) local t, i, L t:=set() every insert(t,(!s).name) L:=sort(t) prefix ||:= "{" every i := 1 to *L-1 do prefix ||:= symbolToString(L[i]) || ", " prefix ||:= symbolToString(L[-1]) prefix ||:= "}" writeIndented(prefix) return end procedure showSelectionSets() local p,s,L write() write("selection sets:") L := sort(selectionSet,3) while p:=get(L) & s:=get(L) do { showSymbolSet("selection[ "||productionToString(p)||" ] = ",s) } return end procedure showSymbolSets(setName,s) local n,st,L L := sort(s,3) write() write(setName," sets:") while n := get(L) & st := get(L) do { showSymbolSet(n.name||"=",st) } return end procedure showFirstSets() showSymbolSets("first",first) return end procedure showLastSets() showSymbolSets("last",last) return end procedure showFollowSets() showSymbolSets("follow",follow) return end ####################################################################### # # Grammar analysis # # compute the min lengths of terminal strings that can be derived # from nonterminals and starting from particular productions. # procedure findMinLeng() local n, ns, p, s, changes, leng every ns:=!symbol do case ns.kind of { "Nonterminal": ns.minLeng := tooLong "Terminal": ns.minLeng := 1 "ActionSymbol": ns.minLeng := 0 } every p := !!productions do p.minLeng := tooLong ### showSymbols() #### changes := 1 while \changes do { changes := &null every n := !nonterminals do { every p := !productions[n] do { leng := 0 every s := !p.rhs do { leng +:= s.minLeng } p.minLeng := leng ### showSymbol(n) ### if n.minLeng > leng then { changes := 1 n.minLeng := leng } } } } return end procedure checkMinLeng() local n every n := !nonterminals & n.minLeng >= tooLong do { error(n.name," does not appear to derive a terminal string") } return end # # compute transitive closure of a relation # procedure transitiveClosure(s) local n,r,i,k every k := key(s) & i := key(s) & member(s[i],k) do { s[i] ++:= s[k] } return end # # generate exposed symbols on rhs or in string # "exposed" means preceded (Left) or followed (Right) # by nullable nonterminal or action symbols # includes all symbols, nonterminal, terminal and action # procedure exposedLeft(p) local s case type(p) of { "Symbol": p:=[p] "Production": p:=p.rhs } every s := !p do { suspend s if not isNullDeriving(s) then fail } fail end procedure exposedRight(p) local s case type(p) of { "Symbol": p:=[p] "Production": p:=p.rhs } every s := p[*p to 1 by -1] do { suspend s if not isNullDeriving(s) then fail } fail end # # Compute Accessible Sets # procedure buildInitialAccessibleSets() local p, r, s s:=table() every s[!nonterminals] := set() every p := !!productions do { every r := !p.rhs do { insert(s[p.lhs],r) } } return s end procedure findAccessibleSets() local s s := buildInitialAccessibleSets() transitiveClosure(s) return s end procedure findAccessibleSymbols() local st,a a := findAccessibleSets() st := a[startSymbol] insert(st,startSymbol) insert(st,eoiSymbol) return st end procedure checkAccessibility() local s,st st := findAccessibleSymbols() every s := !(nonterminals|terminals|actions) do { if not member(st,s) then error(s.name, " cannot appear in a sentential form") } return end # # Compute First Sets # procedure initFirstSets() local p, r first := table() every first[!nonterminals] := set() every p := !!productions do { every r := exposedLeft(p) do { insert(first[p.lhs],r) } } return end procedure findFirstSets() initFirstSets() transitiveClosure(first) return end # # Compute last sets # procedure initLastSets() local p, r last:=table() every last[!nonterminals] := set() every p := !!productions do { every r := exposedRight(p) do { insert(last[p.lhs],r) } } return end procedure findLastSets() initLastSets() transitiveClosure(last) return end procedure checkLnRRecursive() local n every n:= !nonterminals do { if member(first[n],n) & member(last[n],n) then { error(n.name," is both left and right recursive,", " the grammar is ambiguous") } } return end procedure findFollowSets() local n, p, rhs, x, y, i, j follow := table() every n := !nonterminals do follow[n] := set() every p := !productions[!nonterminals] & rhs := p.rhs & *rhs>1 do { every x := rhs[i:=1 to *rhs-1] & isNonterminal(x) do { every y := rhs[j:=i+1 to *rhs] do { every insert( follow[x|isNonterminal(!last[x])], isTerminal(y|!\first[y]) ) if not isNullDeriving(y) then break #back to "every x" loop } } } every insert( follow[isNonterminal(startSymbol|!last[startSymbol])], eoiSymbol ) return end icon-9.4.3/ipl/packs/tcll1/if_ll1.grm0000664000175000017500000000025407140713044016565 0ustar chrishchrish# if-ll1 # still not really LL(1), but as close as we can get start = statement . statement = if e then statement else_option | i "=" e. else_option = [ else statement ]. icon-9.4.3/ipl/packs/tcll1/parsell1.icn0000664000175000017500000000331007140713043017121 0ustar chrishchrish# parse using tables produced by tcLL1 # (written by Dr. Thomas W. Christopher) # record Token(type,body,line,column) link readll1 procedure parseLL1(ll1) local predictionStack local x,y,z,top,cur,errLine,errColumn predictionStack:=[ll1.start,ll1.eoi] cur := &null repeat { if not(top := pop(predictionStack)) then return while member(ll1.actions,top) do { outAction(top) if not(top := pop(predictionStack)) then return } /cur := scan() if top == cur.type then { outToken(cur) cur:=&null if top == ll1.eoi then break } else if x:=\ll1.sel[top] & y:=\x[cur.type] then { every z:=y[*y to 1 by -1] do push(predictionStack,z) } else if y:=\ll1.deflt[top] then { every z:=y[*y to 1 by -1] do push(predictionStack,z) } else { #panic mode error recovery reportParseError(cur) errLine:=cur.line errColumn:=cur.column push(predictionStack,top) repeat { while not member(ll1.fiducials,cur.type) & cur.type~==ll1.eoi do { #write("scanning past ",cur.body) cur := scan() } if x:=!predictionStack & (x==cur.type) | member(\ll1.firstFiducials[x], cur.type) then break else cur := scan() } repeat { top := pop(predictionStack) | stop("system error in panic mode") #write("pruning stack ",top) if top==cur.type then { push(predictionStack,top) break } if member(ll1.actions,top) then { outAction(top) } else if member(ll1.terminals,top) then { outError(top,errLine,errColumn) } else if member(\ll1.firstFiducials[top],cur.type) then { push(predictionStack,top) break } else { predictionStack := ll1.minLengRHS[top] ||| predictionStack } } } } return end icon-9.4.3/ipl/packs/tcll1/ebcdic.icn0000664000175000017500000001442507140713043016620 0ustar chrishchrish############################################################################ # # File: ebcdic.icn # # Subject: Procedures to convert between ASCII and EBCDIC # # Author: Alan Beale # # Date: March 31, 1990 # ############################################################################ # # These procedures assist in use of the ASCII and EBCDIC character sets, # regardless of the native character set of the host: # # Ascii128() Returns a 128-byte string of ASCII characters in # numerical order. Ascii128() should be used in # preference to &ascii for applications which might # run on an EBCDIC host. # # Ascii256() Returns a 256-byte string representing the 256- # character ASCII character set. On an EBCDIC host, # the order of the second 128 characters is essentially # arbitrary. # # Ebcdic() Returns a 256-byte string of EBCDIC characters in # numerical order. # # AsciiChar(i) Returns the character whose ASCII representation is i. # # AsciiOrd(c) Returns the position of the character c in the ASCII # collating sequence. # # EbcdicChar(i) Returns the character whose EBCDIC representation is i. # # EbcdicOrd(c) Returns the position of the character c in the EBCDIC # collating sequence. # # MapEtoA(s) Maps a string of EBCDIC characters to the equivalent # ASCII string, according to a plausible mapping. # # MapAtoE(s) Maps a string of ASCII characters to the equivalent # EBCDIC string, according to a plausible mapping. # # Control(c) Returns the "control character" associated with the # character c. On an EBCDIC host, with $ representing # an EBCDIC character with no 7-bit ASCII equivalent, # Control("$") may not be identical to "\^$", as # translated by ICONT (and neither result is particularly # meaningful). # ############################################################################ # # Notes: # # There is no universally accepted mapping between ASCII and EBCDIC. # See the SHARE Inc. publication "ASCII and EBCDIC Character Set and # Code Issues in Systems Application Architecture" for more information # than you would ever want to have on this subject. # # The mapping of the first 128 characters defined below by Ascii128() # is the most commonly accepted mapping, even though it probably # is not exactly like the mapping used by your favorite PC to mainframe # file transfer utility. The mapping of the second 128 characters # is quite arbitrary, except that where an alternate translation of # ASCII char(n) is popular, this translation is assigned to # Ascii256()[n+129]. # # The behavior of all functions in this package is controlled solely # by the string literals in the _Eascii() procedure. Therefore you # may modify these strings to taste, and still obtain consistent # results, provided that each character appears exactly once in the # result of _Eascii(). # # Yes, it's really true that the EBCDIC "\n" (NL, char(16r15)) is not # the same as "\l" (LF, char(16r25)). How can that be? "Don't blame # me, man, I didn't do it." # ############################################################################ procedure _Eascii() static EinAorder initial EinAorder := # NUL SOH STX ETX EOT ENQ ACK BEL BS HT NL VT FF CR SO SI "\x00\x01\x02\x03\x37\x2d\x2e\x2f\x16\x05\x15\x0b\x0c\x0d\x0e\x0f"|| # DLE DC1 DC2 DC3 DC4 NAK SYN ETB CAN EM SUB ESC FS GS RS US "\x10\x11\x12\x13\x3c\x3d\x32\x26\x18\x19\x3f\x27\x1c\x1d\x1e\x1f"|| # sp ! " # $ % & ' ( ) * + , - . / "\x40\x5a\x7f\x7b\x5b\x6c\x50\x7d\x4d\x5d\x5c\x4e\x6b\x60\x4b\x61"|| # 0 1 2 3 4 5 6 7 8 9 : ; < = > ? "\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\x7a\x5e\x4c\x7e\x6e\x6f"|| # @ A B C D E F G H I J K L M N O "\x7c\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xd1\xd2\xd3\xd4\xd5\xd6"|| # P Q R S T U V W X Y Z $< \ $> ^ _ "\xd7\xd8\xd9\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xad\xe0\xbd\x5f\x6d"|| # ` a b c d e f g h i j k l m n o "\x79\x81\x82\x83\x84\x85\x86\x87\x88\x89\x91\x92\x93\x94\x95\x96"|| # p q r s t u v w x y z $( | $) ~ DEL "\x97\x98\x99\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xc0\x4f\xd0\xa1\x07"|| "\x04\x06\x08\x09\x0a\x14\x17\x1a\x1b\x20\x25\x21\x22\x23\x24\x28_ \x29\x2a\x2b\x2c\x30\x31\x33\x34\x35\x36\x38\x39\x3a\x3b\x3e\xff_ \x41\x42\x43\x44\x4a\x45\x46\x47\x48\x49\x51\x52\x53\x54\x55\x56_ \x57\x58\x59\x62\x63\x64\x65\x66\x67\x68\x69\x70\x71\x72\x73\x74_ \x75\x76\x77\x78\x80\x8a\x8c\x8d\x8e\x8f\x90\x9a\x9c\x9d\x9e\x9f_ \xa0\xaa\xab\xac\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9_ \xba\xbb\xbc\xbe\xbf\xca\xcb\xcc\xcd\xce\xcf\xda\xdb\xdc\xdd\xde_ \xdf\xe1\xea\xeb\xec\xed\xee\xef\xfa\xfb\xfc\x8b\x6a\x9b\xfd\xfe" return EinAorder end procedure Ascii128() if "\l" == "\n" then return string(&ascii) return _Eascii()[1+:128] end procedure Ascii256() if "\l" == "\n" then return string(&cset) return _Eascii() end procedure Ebcdic() if "\l" ~== "\n" then return &cset return map(&cset, _Eascii(), &cset) end procedure AsciiChar(i) if "\l" == "\n" then return char(i) return _Eascii()[0 < i+1] | runerr(205,i) end procedure AsciiOrd(c) if "\l" == "\n" then return ord(c) return ord(MapEtoA(c)) end procedure EbcdicChar(i) if "\l" ~== "\n" then return char(i) return map(char(i), _Eascii(), &cset) end procedure EbcdicOrd(c) if "\l" ~== "\n" then return ord(c) return ord(MapAtoE(c)) end procedure MapEtoA(s) return map(s, _Eascii(), &cset) end procedure MapAtoE(s) return map(s, &cset, _Eascii()) end procedure Control(c) return AsciiChar(iand(AsciiOrd(c),16r1f)) end icon-9.4.3/ipl/packs/tcll1/bugs.grm0000664000175000017500000000014407140713044016355 0ustar chrishchrishstart = e. e = e "+" t . e = e "-" t . t = t "*" t . t = t "/" t . t = f . p = i . p = "(" e ")" . icon-9.4.3/ipl/packs/tcll1/semout.icn0000664000175000017500000000070207140713043016714 0ustar chrishchrish# Routines to test grammars passed through the TCLL1 # parser generator. # Link this with parseLL1 and it will write out the tokens # and action symbols recognized by the parser. # (written by Dr. Thomas W. Christopher) # procedure outToken(tok) write(tok.type," ",tok.line," ",tok.column," ",tok.body) return end procedure outAction(a) write(a) return end procedure outError(t) write("ERROR: ",t) return end procedure initSemantics() return end icon-9.4.3/ipl/packs/tcll1/euler.grm0000664000175000017500000000523207307530776016552 0ustar chrishchrishstart : program . program = block ENDPROG!. vardecl = new id NEWDECL! . fordecl = formal id FORMALDECL! . labdecl = label id LABELDECL! . var = id VARID! { "[" expr "]" SUBSCR! | "." DOT! } . logval = true LOGVALTRUE! . logval = false LOGVALFALSE! . number = realN | integerN. reference = "@" var REFERENCE! . # listhead -> "(" LISTHD1! # listhead -> listhead expr "," LISTHD2! # listN -> listhead ")" LISTN1! # listN -> listhead expr ")" LISTN2! listN = "(" LISTHD1! ( ")" LISTN1! | expr listTl ) . listTl = ")" LISTN2! | "," LISTHD2! ( expr listTl | ")" LISTN1! ) . prochead = "'" PROCHD! { fordecl ";" PROCFORDECL! } . procdef = prochead expr "'" PROCDEF! . primary = var ( listN CALL! | VALUE!) | primary1 . primary1 = logval LOADLOGVAL! | number LOADNUM! | symbol LOADSYMB!| reference | listN | tail primary UOP! | procdef | undef LOADUNDEF! | "[" expr "]" PARENS! | in INPUT! | isb var UOP! | isn var UOP! | isr var UOP! | isl var UOP! | isli var UOP! | isy var UOP! | isp var UOP! | isu var UOP! | abs primary UOP! | length var UOP! | integer primary UOP! | real primary UOP! | logical primary UOP! | list primary UOP! . factor = primary factortail. factortail = { "**" primary BOP! } . term = factor termtail. termtail = { "*" factor BOP! | "/" factor BOP! | div factor BOP! | mod factor BOP! } . sum = ("+" term UPLUS! | "-" term NEG! | term) sumtail. sumtail = { "+" term BOP! | "-" term BOP! } . choice = sum choicetail. choicetail = { min sum BOP! | max sum BOP! } . relation = choice relationtail. relationtail = [ "=" choice BOP! | "~=" choice BOP! | "<" choice BOP! | "<=" choice BOP! | ">" choice BOP! | ">=" choice BOP! ] . negation = "~" relation UOP! | relation . conj = negation conjtail. conjtail = [ and CONJHD! conj CONJ! ]. disj = conj disjtail. disjtail = [ or DISJHD! disj DISJ! ] . catenatail = { "&" primary BOP! }. truepart = expr else TRUEPT! . ifclause = if expr then IFCLSE! . expr = var exprtail | expr1. exprtail = "<-" expr BOP! | ( listN CALL! | VALUE!) factortail termtail sumtail choicetail relationtail conjtail disjtail catenatail . expr1 = block . expr1 = ifclause truepart expr IFEXPR! . expr1 = goto primary UOP! . expr1 = out expr UOP! . expr1 = primary1 factortail termtail sumtail choicetail relationtail conjtail disjtail catenatail . expr1 = ( "+" term UPLUS! | "-" term NEG! ) sumtail choicetail relationtail conjtail disjtail catenatail . expr1 = "~" relation UOP! conjtail disjtail catenatail . stat = expr1 | id ( ":" LABDEF! stat LABSTMT! | VARID! { "[" expr "]" SUBSCR! | "." DOT! } exprtail ) . block = begin BEGIN! { vardecl ";" BLKHD! | labdecl ";" BLKHD!} stat { ";" BLKBODY! stat } end BLK! . icon-9.4.3/ipl/packs/tcll1/ea_ll1.grm0000664000175000017500000000021207140713044016546 0ustar chrishchrish# ea-ll1.grm # action symbols # LL(1) start = e . e = t { "+" t A! | "-" t S!} . t = f [ "*" t M! | "/" t D!]. f = i N! | "(" e ")" P!. icon-9.4.3/ipl/packs/tcll1/ls_ll1.grm0000664000175000017500000000100207140713044016575 0ustar chrishchrish# ls-ll1 # LL(1) start = labeled_statement . #labeled_statement = label statement . #label = i ":" label | . #statement = i "=" e. #labeled_statement = i ":" label statement . #labeled_statement = statement . #label = i ":" label | . #statement = i "=" e. #labeled_statement = i ":" label statement . #labeled_statement = i "=" e . #label = i ":" label | . #statement = i "=" e. labeled_statement = i labeled_statement_tail . labeled_statement_tail = "=" e . labeled_statement_tail = ":" labeled_statement . icon-9.4.3/ipl/packs/tcll1/readll1.icn0000664000175000017500000000534007140713043016727 0ustar chrishchrish# Read in parse tables produced by TCLL1 # (written by Thomas W. Christopher) # link xcode #xcode is provided by the Icon Programming Library invocable all record LL1(sel,deflt, terminals,actions, fiducials,firstFiducials, minLengRHS, start,eoi) procedure readLL1(filename) local g,s,f f:=open(filename) | fail s:=xdecode(f) | fail g:=unpackLL1(s) close(f) return g end procedure unpackLL1(h) local startSymbol, eoiSymbol, rhsList, selIn, defltIn, termList, actionList, fiducList, firstFiduc, minLengRhs local r,i,n,t,s, actionSet,terminalSet, defaultTable,selTable, fiducialSet,firstFiducials, minLengRHS # the following must be in the same order they were listed in # return statement of genLL1() in module "ll1.icn". With the # exception of rhsList, they are in the same order as in record # LL1. rhsList := get(h) selIn := get(h) defltIn := get(h) termList:= get(h) actionList:=get(h) fiducList:=get(h) firstFiduc:=get(h) minLengRhs:=get(h) startSymbol := get(h)[1] eoiSymbol := get(h)[1] every r:= !rhsList & i := 1 to *r do r[i]:=r[i][1] actionSet:=set() every insert(actionSet,(!actionList)[1]) terminalSet:=set() every insert(terminalSet,(!termList)[1]) defaultTable:=table() every n:=key(defltIn) do defaultTable[n[1]]:=defltIn[n] selTable:=table() every n:=key(selIn) do { /selTable[n[1]] := t := table() every s:= key(selIn[n]) do { t[s[1]] := selIn[n][s] } } fiducialSet:=set() every insert(fiducialSet,(!fiducList)[1]) firstFiducials:=table() every n:=key(firstFiduc) & s:=firstFiduc[n] do { firstFiducials[n[1]]:=set() every insert(firstFiducials[n[1]],(!s)[1]) } minLengRHS:=table() every n:=key(minLengRhs) do minLengRHS[n[1]]:=minLengRhs[n] return LL1(selTable,defaultTable, terminalSet,actionSet, fiducialSet,firstFiducials, minLengRHS, startSymbol,eoiSymbol) end procedure showStructure(h, indent) local t,i /indent:="" i := indent||" " case type(h) of { "string": write(indent,"\"",h,"\"") "list": {write(indent,"[") every showStructure(!h,i) write(indent,"]") } "table":{write(indent,"table") t := sort(h,3) while showStructure(get(t),i) do { write(indent,"->") showStructure(get(t),i) write(indent,"---") } write(indent,"end table") } "set": {write(indent,"{") every showStructure(!h,i) write(indent,"}") } } return end procedure showLL1(g) write("start symbol") showStructure( g.start) write("eoi symbol") showStructure( g.eoi) write("action set") showStructure( g.actions) write("terminal set") showStructure( g.terminals) write("default table") showStructure( g.deflt) write("selection table") showStructure( g.sel) write("fiducial set") showStructure( g.fiducials) write("first fiducials") showStructure( g.firstFiducials) write("minimum length RHSs") showStructure( g.minLengRHS) return end icon-9.4.3/ipl/packs/tcll1/ls_nll1.grm0000664000175000017500000000020207140713044016754 0ustar chrishchrish# ls-nll1 # not LL(1) start = labeled_statement . labeled_statement = label statement . label = { i ":" }. statement = i "=" e. icon-9.4.3/ipl/packs/README0000664000175000017500000000042407140713042014546 0ustar chrishchrish euler Euler compiler and interpreter ibpag2 LR-based parser generator idol Idol; object-oriented Icon written in Icon itweak interactive debugger loadfunc C functions loaded dynamically skeem Scheme language, implemented in Icon tcll1 parser-generator and parser icon-9.4.3/ipl/packs/ibpag2/0002775000175000017500000000000010336137160015036 5ustar chrishchrishicon-9.4.3/ipl/packs/ibpag2/ibpag2.icn0000664000175000017500000002617407140713043016704 0ustar chrishchrish############################################################################ # # Name: ibpag2.icn # # Title: Icon-based parser generator (version 2) # # Author: Richard L. Goerwitz # # Version: 1.22 # ############################################################################ # # The Basics # # Ibpag2 is a simple tool for generating parsers from grammar # specifications. This may sound pretty arcane to those who have # never used a parser generator. In fact, though, this kind of tool # forms the basis of most programming language implementations. # Parser generators are also used in preprocessors, transducers, # compilers, interpreters, calculators and in fact for just about any # situation where some form of structured input needs to be read into # an internal data structure and/or converted into some form of # structured output. This might include something as mundane as # reading in recepts or mailing addresses from a file, or turning # dates of one type (e.g. "September 3, 1993") into another # ("9/3/93"). For more information on how to use it, see the README # file included with the Ibpag2 distribution. # ############################################################################ # # Running Ibpag2: # # Invoking Ibpag2 is very, very simple. There are quite a few # command-line switches, but all are optional: # # ibpag2 [-f infile] [-m module] [-o outfile] [-p iiparse.lib dir] # [-a] [-c] [-v] [-y] # # Where infile is the Ibpag2 source file (default &input), outfile is # the output file (default &output), module is an optional string # appended to all global variables and all procedure calls (to allow # multiple running parsers), and where -v instructs Ibpag2 to write a # summary of its operations to ibpag2.output. Normally all of these # arguments can be ignored. Ibpag2 can usually be run using simple # shell redirection symbols (if your OS supports them). See the next # paragraph for an explanation of the -p option. The -c option is # for compressed tables, and -a is for non-LR or ambiguous grammars. # See the advanced sections of README file. -y directs Ibpag2 to # resolve reduce/reduce conflicts by their order of occurrence in the # grammar, and to resolve shift/reduce conflicts in favor of shift - # just like YACC. Invoking Ibpag with -h causes it to abort with a # brief help message. # # Make sure that the iiparse.lib and iiglrpar.lib files are in # some path listed in your LPATH directory, or else in a data # directory adjacent to some IPL "procs" directory in your LPATH. # Basically, LPATH is just a space-separated list of places where # .icn library source files reside. If your system does not support # environment variables, then there are two ways to tell Ibpag2 where # the .lib files are without using LPATH. The first is to move into # the directory that contains these files. The second is to supply # the files' location using Ibpag's -p option (e.g. ibpag2 -p # /usr/local/lib/icon/data). # ############################################################################ # # More Technical Details # # Technically speaking, Ibpag2 is a preprocessor that accepts a # YACC-like source file containing grammar productions and actions, # then 1) converts these into parse tables and associated code, 2) # adds to them an LR parser, and a few debugging tools, and 3) writes # the combination to the standard output, along with the necessary # action and goto table construction code. The user must $include, # or hard-code into the Ibpag2 source file, a lexical analyzer that # returns integers via symbolic $defines generated by %token, %right, # etc. declarations in the Ibpag2 source file. # # Cycles and epsilon moves are handled correctly (to my # knowledge). Shift-reduce conflicts are handled in the normal way # (i.e. pick the rule with the highest priority, and, in cases where # the priority is the same, check the associativities) I decided to # flag reduce/reduce conflicts as errors by default, since these # often conceal deeper precedence problems. They are easily enough # handled, if need be, via dummy precedences. The -y command-line # switch turns off this behavior, causing Ibpag2 to resolve # reduce/reduce conflicts in a YACCish manner (i.e. favoring the rule # that occurs first in the grammar). Ibpag2 normally aborts on # shift/reduce conflicts. The -y switch makes Ibpag resolve these in # favor of shift, and to keep on processing - again, just like YACC. # # For more information, see the README file. # ############################################################################ # # Links: ibreader, ibwriter, slrtbls, ibutil, version, options # ############################################################################ # link ibreader, ibwriter, slrtbls, ibutil, version, options link options global DEBUG procedure main(a) local infile, outfile, verbosefile, atbl, gtbl, grammar, opttbl, module, abort_on_conflict, paths, path, parser_name, iiparse_file # Get command-line options. opttbl := options(a, "f:o:vdm:p:hcay", bad_arg) # Abort with help message if -h is supplied. if \opttbl["h"] then { write(&errout, ib_version()) return ib_help_() } # If an input file was specified, open it. Otherwise use stdin. # if \opttbl["f"] then infile := open(opttbl["f"], "r") | bad_arg("can't open " || opttbl["f"]) else infile := &input # If an output file was specified, use it. Otherwise use stdout. # if \opttbl["o"] then outfile := open(opttbl["o"], "w") | bad_arg("can't open " || opttbl["o"]) else outfile := &output # If a module name was specified (-m), then use it. # module := opttbl["m"] | "" # If the debug option was specified, set all verbose output to go # to errout. # if \opttbl["d"] then { verbosefile := &errout DEBUG := 1 } # If the verbose option was specified, send all verbose output to # "ibpag2.output" (a bit like YACC's yacc.output file). # else if \opttbl["v"] then verbosefile := open("ibpag2.output", "w") | bad_arg("can't open " || opttbl["v"]) # Output defines for YACC-like macros. Output iiisolate and # iiprune if -a option is specified. Sorry for the ugly code. # write_defines(opttbl, outfile, module) # Whew! Now fetch the grammar from the input file. # # Emit line directives keyed to actual line numbers in the # original file. Pass its name as arg4. If obttbl["f"] is # null (and the input file is &input), ibreader will default # to something else. # grammar := ibreader(infile, outfile, module, opttbl["f"]) if \verbosefile then # grammar contains start symbol, rules, and terminal token table print_grammar(grammar, verbosefile) # Fill in parse tables, atbl and gtbl. Abort if there is a # conflict caused by an ambiguity in the grammar or by some # precedence/associativity problem, unless the -a option is # supplied (telling Ibpag2 that ambiguous tables are okay). # if /opttbl["a"] then abort_on_conflict := "yes" atbl := table(); gtbl := table() make_slr_tables(grammar, atbl, gtbl, abort_on_conflict, opttbl["y"]) if \verbosefile then # grammar.tbl maps integer terminal symbols to human-readable strings print_action_goto_tables(atbl, gtbl, grammar.tbl, verbosefile) # If -c was specified on the command line, compress the action and # goto tables. # if \opttbl["c"] then { write(outfile, "\n$define COMPRESSED_TABLES\n") if \verbosefile then write(verbosefile, "\nNote: parse tables are compressed") shrink_tables(grammar, atbl, gtbl) } # Try to find the .lib file using LPATH. # parser_name := { if \opttbl["a"] then "iiglrpar.lib" else "iiparse.lib" } paths := [] put(paths, trim(\opttbl["p"], '/') || "/") put(paths, "") (\getenv)("LPATH") ? { while path := trim(tab(find(" ") | 0), '/') || "/" do { tab(many(' ')) if find("procs", path) then put(paths, ibreplace(path, "procs", "data")) put(paths, path) pos(0) & break } } iiparse_file := open(!paths || parser_name, "r") | iohno(2) # Write .lib file (contains the iiparse() parser routine), along # with the start symbol, action table, goto table, and a list of # productions. # # grammar contains start symbol, rules, and terminal token table # ibwriter(iiparse_file, outfile, grammar, atbl, gtbl, module) return exit(0) end # # write_defines # procedure write_defines(opttbl, outfile, module) # Output defines for YACC-like macros. Output iiisolate and # iiprune if -a option is specified. Sorry for the ugly code. # if \opttbl["a"] then { write(outfile, "$define iiisolate (iidirective", module, " ||:= \"isolate\")") write(outfile, "$define iiprune (iidirective", module, " ||:= \"prune\")") write(outfile, "$define iierrok (iidirective", module, " ||:= \"errok\")") } else { write(outfile, "$define iierrok (recover_shifts", module, " := &null &", " discards", module, " := 0)") } write(outfile, "$define iiclearin (iidirective", module, " ||:= \"clearin\")") write(outfile, "$define IIERROR (iidirective", module, " ||:= \"error\")") write(outfile, "$define IIACCEPT (iidirective", module, " ||:= \"accept\")") end # # bad_arg # # Simple routine called if command-line arguments are bad. # procedure bad_arg(s) write(&errout, "ibpag2: ",s) write(&errout, "usage: ibpag2 [-f inf] [-m str ] [-o outf] _ [-p dir] [-a] [-c] [-v] [-y]") write(&errout, " for help, type \"ibpag2 -h\"") stop() end # # ib_help_ # procedure ib_help_() write(&errout, "") write(&errout, "usage: ibpag2 [-f inf] [-m str] [-o outf] [-p dir] _ [-a] [-c] [-v] [-y]") write(&errout, "") write(&errout, " -f inf........where inf = Ibpag2's input file (default") write(&errout, " &input)") write(&errout, " -m str........where str = a string to be appended to") write(&errout, " global identifiers and procedures") write(&errout, " -o outf.......where outf = Ibpag2's output file (default") write(&errout, " &output)") write(&errout, " -p dir........where dir = directory in which the") write(&errout, " iiparse.lib file resides (mainly for") write(&errout, " systems lacking LPATH support)") write(&errout, " -a............permits ambiguous grammars and multiple") write(&errout, " parses (makes iiparse() a generator).") write(&errout, " -c............compresses action/goto tables (obstructs") write(&errout, " debugging somewhat).") write(&errout, " -v............sends debugging info to ibpag2.output") write(&errout, " -y............tells Ibpag2 to resolve reduce/reduce") write(&errout, " conflicts by order of occurrence in") write(&errout, " the grammar, and to resolve shift/") write(&errout, " reduce conflicts in favor of shift") stop("") end icon-9.4.3/ipl/packs/ibpag2/Makefile0000664000175000017500000000560407302337403016502 0ustar chrishchrish########################################################################## # PROGNAME = ibpag2 # ########################################################################## # # User-modifiable section. Read carefully! You will almost # certainly have to change some settings here. # # # Destination directory for binaries files. Owner and group for # public executables. Leave the trailing slash off of directory # names. # OWNER = richard # root GROUP = group # root DESTDIR = /usr/local/bin # Put this path into your LPATH variable (on which, see the Icon # documentation). Make sure that the directory exists. LIBDIR = /usr/local/lib/icon/data # # Name of your icon compiler and compiler flags. # ICONC = icont IFLAGS = -u -s #-Sc 400 -Sg 400 -Si 2000 -Sn 4000 -SF 40 SHAR = /usr/local/bin/shar COMPRESS = /usr/bin/compress # COMPRESS = /usr/local/bin/gzip ########################################################################### # # Don't change anything below this line unless you're really sure of # what you're doing. # AUX = slshupto.icn rewrap.icn outbits.icn sortff.icn itokens.icn SRC = $(PROGNAME).icn $(AUX) slrtbls.icn slritems.icn follow.icn \ ibutil.icn iohno.icn ibreader.icn ibwriter.icn shrnktbl.icn \ version.icn PARSER = iiparse.lib GLRPARSER = iiglrpar.lib SHARFILES = $(SRC) $(PARSER) $(GLRPARSER) sample.ibp beta2ref.ibp \ iacc.ibp Makefile.dist README all: $(PROGNAME) $(PROGNAME): $(SRC) $(ICONC) $(IFLAGS) -o $(PROGNAME) $(SRC) ########################################################################## # # Pseudo-target names (shar, install, clean, clobber) # # # Assumes you have a shar program like mine. # shar: $(SHARFILES) @echo "" @echo "Removing any old shars in this directory." @echo "" -rm -f $(PROGNAME).[0-9][0-9].Z @echo "" $(SHAR) -fVc -o$(PROGNAME) -L32 $(SHARFILES) $(COMPRESS) -f $(PROGNAME).[0-9][0-9] @echo "" @echo "Shell archive finished." @echo "" # Pessimistic assumptions regarding the environment (in particular, # I don't assume you have the BSD "install" shell script). install: all @echo "" -test -d $(DESTDIR) || mkdir $(DESTDIR) && chmod 755 $(DESTDIR) cp $(PROGNAME) $(DESTDIR)/$(PROGNAME) -chgrp $(GROUP) $(DESTDIR)/$(PROGNAME) -chown $(OWNER) $(DESTDIR)/$(PROGNAME) -chmod 755 $(DESTDIR)/$(PROGNAME) -test -d $(LIBDIR) || mkdir $(LIBDIR) && chmod 755 $(LIBDIR) cp $(PARSER) $(LIBDIR)/$(PARSER) cp $(GLRPARSER) $(LIBDIR)/$(GLRPARSER) -chgrp $(GROUP) $(LIBDIR)/$(PARSER) -chown $(OWNER) $(LIBDIR)/$(PARSER) -chgrp $(GROUP) $(LIBDIR)/$(GLRPARSER) -chown $(OWNER) $(LIBDIR)/$(GLRPARSER) -chmod 644 $(LIBDIR)/$(PARSER) -chmod 644 $(LIBDIR)/$(GLRPARSER) @echo "" @echo "Done installing." @echo "" # Build executable and copy to ../../iexe. # Nothing done in this case because the executable doesn't stand alone. Iexe: # # Cleanup # clean: -rm -f *~ #*# core *.u[12] $(PROGNAME).output Clean clobber: clean -rm -f $(PROGNAME) icon-9.4.3/ipl/packs/ibpag2/README0000664000175000017500000014706607140713043015731 0ustar chrishchrish A User's Manual for Ibpag2 (Icon-Based Parser Generation System 2) Version 1.2 - or - How to Use an LR-based Parser Generator Richard L. Goerwitz, III University of Chicago 1.__What_is_Ibpag2? Ibpag2 is a so-called "parser generator," i.e. a tool for automating the process of generating a recognizer and/or parser from abstract structural descriptions of an input language. Put in more practical terms, Ibpag2 is a piece of software that a) reads a source file containing a grammar that defines an input language, and then b) outputs an automaton that recognizes that language. The user may, at his or her option, specify actions this automaton should take when it sees various substructures within its input language. By default, however, the parser simply recognizes a given sequence as belonging, or not, to that language. Ibpag2 utilizes so-called "LR" table generation and parsing algorithms. These algorithms facilitate construction of reasonably fast deterministic pushdown automata that are powerful enough to handle most commonly used programming language constructs. LR-based systems come in three main flavors: SLR(1), LALR(1), and LR(1). The LR(1) flavor is fairly easy to implement, but uses too many resources to be practical. LALR(1) algorithms are harder to implement, but much faster, and the parse tables they construct use considerably less memory than do those of their LR(1) counterparts. SLR(1) algorithms are the easiest to implement, compile the fastest, and use about as much memory as LALR(1)s. SLR(1) is the least powerful of the three, though, so there is a tradeoff. Ibpag2 is an "enhanced" SLR(1) parser generator. It is enhanced in the sense that it can operate both in its native SLR(1) mode, and in a more powerful "quasi-GLR" mode (on which, see section 5 below). As its full title ("Icon-Based Parser Generator 2") implies, Ibpag2 is written in Icon [2,3], as are the automata it creates. Ibpag2 has been tested with Icon version 8.10. So far I have only run it on an i386 box running Xenix 2.3.3, and on a Sun 4 running some version of SunOS. I have many reports, though, of it running under other UNIX variants. It will probably also run under other operating systems, though modifications will in some instances be required. Using Ibpag2 under MS-DOS may not be possible, on account of the way it manages memory. The Ibpag2 distribution adheres to de facto UNIX installation standards: Just set the appropriate variables in the makefile, and then "make install." For those who are using a non-UNIX system, or who have not installed such a package before, there is a section at the end entitled "Installing Ibpag2" that details the installation procedure (section 6). Aside from the above-mentioned installation section (6), the remainder of this document aims to provide the reader a) with a simple, practical explanation of what LR-family parser generators are and how they work (section 2), and b) with a set of directions specifically on how to use Ibpag2 (section 3). There is also an advanced section on debugging (4), and one on using Ibpag2 with non-LR and/or ambiguous languages (5). The discussion is geared for those that have little or no experience in parsing or automaton theory. For very advanced reading, consult the bibliography. For a brief summary of Ibpag's command-line options, see the main Ibpag2 source file, ibpag2.icn, or invoke ibpag2 with the -h (help) option. In general, be warned that Ibpag2 works best with small or medium-sized grammars. Its parse tables have to be reconstructed at run-time, and the code for doing this can become a bit cumbersome for grammars with more than 100 rules and fifty or so terminal symbols. I myself have processed grammars with as many as 300 terminals and 400 rules. Although the resulting automata run well enough, the output files are over 300k, and Ibpag2 takes a long time to create them. If you must use Ibpag2 with a very large grammar symbols, try the -c command-line option (which produces compressed parse tables). This option is discussed below, in section 4. Compiling (rather than interpreting) Ibpag2 may result in much faster processing, as will resetting your BLOCKSIZE and STRSIZE environment variables. See the installation section (6) below on using the Icon compiler to create the Ibpag2 executable. Good starting values for BLOCKSIZE and STRSIZE are triple their default values (i.e. 3 x 65000). These variables are discussed in the Icon manual page. My ultimate aim in writing this document has been to make accessible to the non-CS portion of the Icon community what for them might seem an inaccessible branch of applied parsing and automaton theory. I am a philologist myself, and feel that there is a great deal that can and ought to be done to make advanced tools accessible to people with other interests than twiddling bits or pondering the true meaning of epsilon closures :-). Any comments on the Ibpag2 system itself or its documentation will be gratefully received. Write to me at the address appended to the final section (6). 2.__What_is_an_LR_Parser_Generator? Back in the late 50s and 60s, linguists, mathematicians, and software engineers all became intensely interested in the formal properties of languages: Can they be described as a series of logical structures and relations? Can computers recognize and manipulate these structures efficiently? Linguists, in particular, quickly realized that the amount of structural complexity, ambiguity, and pure noise in natural language would render it computationally intractable, especially given the limited memory/throughput of then available CPUs. Mathematicians and engineers, however, found that many of the formalized notations they dealt with could, in fact, be (re)designed in such a way that efficient computer processing could - at least in principle - be achieved. Principle, in this case, did not squarely meet reality until viable parser generation tools came into being. Parser generation tools map an abstract structural description of a formal notation or "language" to working computer code. Ideally, the designer simply makes assertions like: an expression is composed of either 1) a term (e.g. 10), or 2) an expression, a "+" or "-", and another expression Parser generator systems translate these assertions (the "grammar") into a machine, i.e. automaton, that can recognize and/or manipulate input streams that conform to the "language" so described. Let me dwell, for a moment, on the toy expression grammar offered above. Note that it describes a set of simple mathematical constructs like: 9 9 + 3 9 + 3 - 8 According to the specifications given above, the nine, three, and eight alone constitute terms - which are also expressions (via rule 1). Because these terms are also expressions, "9 + 3" can be reduced to a larger expression by rule 2. The same is true for "9 + 3 - 8," except that there rule 2 must apply twice - once for "9 + 3," and then again for that and the remainder of the line - in effect grouping the expressions as ( ( (9) + (3) ) - (8) ). It is also possible to group the expression ( (9) + ( (3) - (8) ) ), although for the discussion that immediately follows this second grouping will be ignored (see below on the terms "precedence" and "associativity"). If we add actions to the above grammar specification, we can create a calculator-like automaton. Traditionally, LR-family automata (like the ones Ibpag2 creates) contain a parser, one or more stacks, and a set of action tables. The parser reads from an input stream segmented into "tokens" (e.g. TERM, '+', '-'), and then manipulates its stacks according to directives contained in so-called "action" and "goto" tables. As it reads the input stream, the parser matches rules with action code specified by the programmer, e.g. rule 2 above might be matched with code that added/subtracted the expressions on either side of the '+'/'-' operator, and produced (in calculator style) the result. Alternatively, it might be matched with code that generated an equivalent construct in another language. In the case of our toy expression grammar above, the corresponding LR automaton operates as follows. Omitting and/or simplifying some of the inner details, it first looks at the input stream to see what the next token is. If the next token is an operator or end-of-input, it checks the top of its stack. If the top of the stack has a term on it, that term is popped off, and pushed back on, this time renamed as an expression (rule 1 above). The input token is then shifted from the input stream onto the stack, unless it is the end-of-input token, in which case the parser returns with a result. If the top of the stack has an expression on it (rather than a term), the parser pops the top three elements off of the stack, and then either subtracts the third element from the first or adds the two together, depending on whether the second element down was the addition or subtraction operator, and the result is pushed onto the stack as yet another expression. Even in this much-simplified form, the automaton's structure is complex. Let us look briefly, therefore, at a practical example of its actual workings. If we were to feed it "9 + 3 + 8," our calculator would take the following actions: 1) read the 9, and push it onto the stack as a term 2) see a plus sign on the input stream 3) pop the term (9) off of the stack and push it back on again (this time calling it an expression) 4) push the plus sign onto the stack 5) read the 3, and push it onto the stack as a term 6) see a minus sign on the input stream 7) pop the 3 off of the stack and push it back on again (this time calling it an expression) 8) see a minus sign still waiting on the input stream 9) pop 9, +, and 3 off of the stack, apply the plus operator to 9 and 3, then push the result onto the stack again a single expression (the stack now has 12 on top) 10) read the minus sign, and push it onto the stack 11) read the 8, and push it onto the stack as a term 12) see the end of input coming up on the input stream 13) pop the 8 off of the stack and push it back on again as an expression 14) see the end-of-input token still sitting on the input stream 15) pop 12, -, and 8 off of the stack, apply the minus operator to 12 and 8, then push the result onto the stack again (the stack now has 4 on top) 16) return the "answer" (i.e. 4) This series of actions is hard to describe, and even more so to model as part of a hand-written computer program. And, even if such a program were written by hand, this program would have to be modified, at times radically, every time the grammar it assumes was augmented or changed. What I am leading up to is that, with a parser generator, the hand compilation stage can be eliminated by allowing the programmer simply to declare his/her tokens and language specs, then have the appropriate automaton constructed with little, or no, human intervention. This is why parser generation tools were critical to the development of not just theoretically feasible, but truly *practical*, LR-based computer language design systems. 3.__Using_Ibpag2 To recode the above toy expression grammar in Ibpag2-compatible format is relatively simple, especially if we omit the actions initially, and concentrate on simple recognition. We need only a set of token declarations and three rules. Certain modifications will have to be made to the token declarations later on. For general illustration's sake, however, the following will suffice: %token TERM, '+', '-' %% expression : TERM expression : expression, '+', expression expression : expression, '-', expression TERM, and the addition and subtraction operators, are the tokens (i.e. the terminals symbols out of which the grammar is constructed - the things that the input stream is segmented into). Note the %token keyword used to declare them. The colon means "is composed of." The double percent sign separates token declarations from the grammar proper. Adding in our actions - which above were keyed to a complex set of decisions based on input tokens and stack conditions - requires just a few extra lines of Ibpag2 action code, set off in curly braces: %token TERM, '+', '-' %% expression : TERM { return arg1 } expression : expression, '+', expression { return arg1 + arg3 } expression : expression, '-', expression { return arg1 - arg3 } Using a "|" shorthand for repeated left-hand sides of rules, we may reformat this as: %token TERM, '+', '-' %% expression : TERM { return arg1 } | expression, '+', expression { return arg1 + arg3 } | expression, '-', expression { return arg1 - arg3 } ArgX above refers to the Xth element of the right-hand side of the preceding rule. So, for example, arg1 in "{ return arg1 }" above refers to TERM - the only right-hand side element of the first rule. The action "{ return arg1 }" means, "once you find a TERM and have renamed it as an expression, use the value of TERM as the value for that expression." By way of contrast, the action "{ return arg1 + arg3 }" means, in conjunction with the rule it follows: "When you find an expression consisting of a sub-expression, a plus operator, and another sub-expression, use the value of sub-expression 1 + the value of sub-expression 2 as the value for the expression as a whole." Technically, the action "{ return arg1 }" for expression : TERM is not necessary, since the Ibpag2 parser, by default, pushes the value of the last RHS arg onto the stack. For epsilon productions (to be discussed below), it pushes &null. One serious problem with this set of specifications is that the operators '-' and '+' are left associative. We humans take this for granted, because correct algebraic grouping is something our high-school math teachers burned into us. The computer, though, has to be told, pedantically, how to group addition and subtraction expressions. It has to be explicitly instructed, in other words, to group expressions like "9 + 32 - 4" as (9 + 32) - 4. Without instructions of this kind, the parser does not know, after it has read "9 + 32" and is looking at a minus sign, whether to shift the minus sign onto the stack, and eventually try to group as 9 + (32 - 4), or to reduce "9 + 32" to an expression and group as (9 + 32) - 4. Although in this case the grouping may not seem to matter, it sometimes does. Some operators group right to left. The unary minus sign, for example, is one such operator (--4 groups as (- (- 4))). To include the unary minus sign in our grammar, we might append yet another rule: %token TERM %left '+', '-' %right '-' %% expression : TERM { return arg1 } | expression, '+', expression { return arg1 + arg3 } | expression, '-', expression { return arg1 - arg3 } | '-', expression { return - arg2 } The trouble with this arrangement is that the minus sign was already declared as left associative. To get around the conflict we use a "dummy" token declaration, and a %prec declaration in the applicable rule: %token TERM %left '+', '-' %right UMINUS %% expression : TERM { return arg1 } | expression, '+', expression { return arg1 + arg3 } | expression, '-', expression { return arg1 - arg3 } | '-', expression %prec UMINUS { return - arg2 } The %prec declaration simply tells the parser that, even though the rule contains a '-' operator, the rule should be handled as if the operator were UMINUS. UMINUS is not actually used as a symbol in the right-hand side of any rule (hence the designation "dummy"). It is there simply to make the last rule behave as if the minus sign in the last rule were different than in the second-to-last rule. Let us now add in multiplication and division operators to our calculator specifications, and see what happens. Let me reiterate here that the action "{ return arg1 }" for rule 1 (expression : TERM) is not strictly necessary, since the default is to push the last RHS arg onto the value stack: %token TERM %left '+', '-' %left '*', '/' %right UMINUS %% expression : TERM { return arg1 } | expression, '+', expression { return arg1 + arg3 } | expression, '-', expression { return arg1 - arg3 } | expression, '*', expression { return arg1 * arg3 } | expression, '/', expression { return arg1 / arg3 } | '-', expression %prec UMINUS { return - arg2 } Note that the multiplication and division operators were defined *after* the addition and subtraction operators. The reason for this is that, technically speaking, the grammar itself is ambiguous. If we treat all operators identically, the parser will not be able to tell whether "9 + 1 * 3" should be parsed as (9 + 1) * 3 or as 9 + (1 * 3). As we all know from our high-school algebra, multiplication has a higher precedence than addition. You do the multiplications before the additions, in other words, no matter where they occur. To tell the parser to behave in this same manner, we declare '*' after '+'. Note that, despite their higher priority, the '*' and '/' operators are still left associative. Hence, given "3 / 4 * 7," the parser will group its input as (3 / 4) * 7. As a brain teaser, try to figure out how the parser might group the input "9 + 3 / 4 * 7." Remember that higher-precedence rules get done first, but that same-precedence rules get done according to associativity. The only fundamental problem remaining with the above grammar is that it assumes that the end of the input coincides with the end of the line. Is it possible to redefine the language described as consisting of arbitrary many lines? The answer to this question is "yes." One can simply add another set of productions to the grammar that state, essentially, that the input language consists of lines made up of an expression and a carriage return or of nothing. Nothing is indicated by the keyword epsilon. Note that only the first rule has an action field: lines : lines, expression, '\n' { write(arg2) } | lines, '\n' | epsilon This rule-series may seem rather abstruse, but it becomes a bit clearer when you think about what happens on actual input. If there is no input (epsilon), nothing gets printed, because lines : epsilon has no action field. If the parser sees an expression and a newline, the parser takes this as an instance of epsilon, plus an expression, plus a newline. This, then, becomes the first component of rule 1 if another expression + newline follows, or of rule two if just a newline occurs. Every time an instance of rule 1 occurs, the action "{ write(arg2) }" is executed, i.e. the value of the expression gets printed. If this still seems hard to fathom, try walking through step-by-step. Even experienced hands may find these sorts of rules difficult to construct and debug. Note that "lines" is now the so-called "start symbol" of our grammar. It is, in other words, the goal of every parse. By default the left-hand side symbol of the first rule is the start symbol. This may be overridden with a %start declaration in the tokens section (on which, see the sample Ibpag2 input file below). With our new, multi-line start symbol in place, the only piece that needs to be added, in order to make our calculator specification a full working input to Ibpag2, is a tokenizer. A tokenizer is a routine that reads input from a file or from some other stream (e.g. the user's console), and then segments this input into tokens that its parser can understand. In some cases, the tokens must be accompanied by a literal value. For example, if we encounter a TERM, we return TERM, just as it is listed in the %token declaration. But what is the literal value of a TERM token? It could be, for example, 9, or 5, or 700. The tokenizer returns the symbol TERM, in this case, but then records that TERM's actual value by setting some global variable. In Ibpag2's parser, this variable is assumed to be "iilval." In the tokenizer, therefore, one might write iilval := (literal value) suspend TERM For literal operators like '+' and '*', there is no need to set iilval, since their literal value is irrelevant. One simply returns these as integers (usually via "suspend ord(c)"). The tokenizer routine is normally appended to the grammar after another double percent sign. Everything after this second double percent sign is copied literally to the output file. Alternatively, the tokenizer can be $included via Icon's preprocessor. Ibpag2 demands that the tokenizer be called iilex, and that it take a single file argument, that it be a generator, and that it fail when it reaches end-of-input. Combined with our "lines" productions, the addition of an iilex routine to our calculator grammar yields the following Ibpag2 input file: %token TERM %left '+', '-' %left '*', '/' %right UMINUS %start lines %% expression : TERM { return arg1 } | expression, '+', expression { return arg1 + arg3 } | expression, '-', expression { return arg1 - arg3 } | expression, '*', expression { return arg1 * arg3 } | expression, '/', expression { return arg1 / arg3 } | '-', expression %prec UMINUS { return - arg2 } lines : lines, expression, '\n' { write(arg2) } | lines, '\n' | epsilon %% procedure iilex(infile) local nextchar, c, num nextchar := create !(!infile || "\n" || "\n") c := @nextchar | fail repeat { if any(&digits, c) then { if not (\num ||:= c) then num := c } else { if iilval := \num then { suspend TERM num := &null } if any('+-*/()\n', c) then { iilval := c suspend ord(c) } else { if not any(' \t', c) then { # deliberate error - will be handled later suspend &null } } } c := @nextchar | break } if iilval := \num then { return TERM num := &null } end procedure main() return iiparse(&input, 1) end As noted above, the tokenizer (iilex) must be a generator. It must suspend integers either directly (e.g. ord(c)), or else via symbolic defines like TERM, created by Ibpag2 on the basis of %token, %right, %left, and %nonassoc declarations. The tokenizer must fail on end of input. If you like, cut the above code out, place it in a temporary file, tmp.ibp, and then feed this file to Ibpag2 by typing "ibpag2 -f tmp.ibp -o tmp.icn." If your system supports input and output redirection, type: "ibpag2 < tmp.ibp > tmp.icn." Ibpag2 will turn your grammar specifications and actions into a routine called iiparse. If you look above, you will see that I appended a main procedure that, in fact, calls iiparse(). Iiparse() takes two arguments: 1) an input stream, and 2) a switch that, if nonnull, tells the parser to fail rather than abort on unrecoverable errors. When Ibpag2 is finished creating its output file (tmp.icn above), compile that file the way you would compile any other Icon program (e.g. "icont tmp"). Finally, run the executable. You should be able to type in various simple arithmetic expressions and have the program spit back answers each time you hit a return. The only problem you might encounter is that the parser aborts on erroneous input. The issue of erroneous input brings up yet another point of general Ibpag2 usage. Normally, if one is processing input, one does not want to abort on errors, but rather just emit an error message, and to continue processing - if this is at all possible. To do this, Ibpag2 provides a simple but fairly effective mechanism: A reserved "error" token. When Ibpag2 encounters an error, it will remove symbols from its stack until it has backtracked to a point where the error token is legal. It then shifts the error token onto the stack, and tries to re-start the token stream at the point where it left off, discarding tokens if necessary in order to get itself resynchronized. The parser considers itself resynchronized when it has successfully read and shifted three tokens after shifting the error token. Until then it remains in an error state, and will not output additional error messages as it discards tokens. This explanation may sound a bit abstruse, but in practice it is turns out to be quite simple. To implement error handling for our calculator, we really have to add only one production to the end of the "lines" section: lines : lines, expression, '\n' { write(arg2) } | lines, '\n' | epsilon | error, '\n' { write("syntax error; try again:") iierrok } Given the above grammar, the parser will handle errors as follows: If an error occurs (say it has an expression then an operator on its stack and sees a newline on the input stream) the parser will throw out the operator, then check if the error token would be OK in this state (which it would not). Then it would throw out the expression. At this point, the stack is in the ready-to-read-a-lines state - the state it was in before it read the last expression. Since "lines" may consist of error and '\n,' the error token is legal here, and so the parser pushes error onto the stack, then looks back at the input stream (where a newline is still waiting). Since the newline now completes the rule lines : error, '\n', the parser pushes the newline onto its stack, then executes the action associated with this production, i.e. it writes "syntax error; try again:" to the console, prompting the user for additional input. The keyword "iierrok" in the above error production's action field is there for a subtle, but important, reason: It tells the parser to consider itself resynchronized, even if three tokens have not yet been shifted. If iierrok were not in the action code for this rule, and the user were to supply more bad input after the prompt, then the parser would simply discard those tokens, without emitting another error message. Why? Because, as you will recall, the parser discards tokens after an error, in efforts to resynchronize itself. Until it reads and shifts three tokens successfully, it considers itself in an error state, and will not emit additional error messages. The three-token resync rule is there to prevent a cascade of irrelevant error messages touched off by a single error. In our calculator's case above, though, we are smarter than the parser. We know that it is resynchronized as soon as it reduces error, '\n' to lines. So if a syntax error occurs on the next token, it should be reported. Adding "iierrok" to the action insures that the parser will do just this. In addition to iierrok, there are several other directives Ibpag2 accepts as part of the action code segments. These are as follows: iiclearin clear the current input token IIERROR perform error recovery IIACCEPT simulate an accept action There are several other directives (all implemented as macros) that Ibpag2 accepts in GLR mode. For a discussion of GLR mode, see below, section 5. IIERROR in particular, and error recovery in general, work a bit differently in that mode than they do in Ibpag2's normal (i.e. LR) mode. There are admittedly many other topics that might be covered here. This treatment, however, is intended as a general nontechnical introduction, and not as a complete textbook on parser generation use. If you want to learn more about this topic, consult the bibliography. Also, check the UNIX manual pages on the YACC utility (Yet Another Compiler Compiler). Ibpag's input format is fairly close (too close, perhaps) to YACC's. In fact, most of what is said about YACC in UNIX documentation can be carried directly over to Ibpag2. Several salient differences, though, should be kept in mind: 1) YACC's "$$ = x" constructs are replaced by "return x" (e.g. "$$ = $1 + $3" -> "return $1 + $3" [$1 is a synonym for "arg1", $3 for "arg3", etc.]) 2) all variables within a given action are, by default, local to that action; i.e. they cannot be accessed by other actions unless you declare them global elsewhere (e.g. in the pass-through part of the declarations section %{ ... %}) 3) the %union and %type declarations/tags are not needed by Ibpag2 (both for better and for worse) 4) tokens and symbols are separated from each other by a comma in Ibpag2 files (e.g. %token '+', '-' and S : NP, VP) 5) epsilon is indicated by the keyword "epsilon" (e.g. REL : epsilon), and not by an empty RHS 6) both epsilon and error *may* be declared as %tokens for reasons of precedence, although they retain hard-coded internal values (-2 and -1, respectively) 7) all actions must follow the last RHS symbol of the rule they apply to (preceded by an optional %prec directive); to achieve S : NP { action1 }, VP { action2 }, insert a dummy rule: S : NP, dummy, VP { action2 }; dummy : epsilon { action1 } ; 8) YYERROR, YYACCEPT, yyclearin, and yyerrok are the same, except they are written IIERROR, IIACCEPT, iiclearin, and iierrok (i.e. "ii" replaces "yy") 9) Ibpag2's input files are tokenized as modified Icon files, and, as a consequence, Icon's reserved words must not be used as symbols (e.g. "if : if, then" is no go) I myself find YACC to be ugly. As a result, Ibpag2 is not an exact YACC clone. I would like to underscore the fact that I have no intention to move in this direction, either. It's as YACC-like as it's going to get! Both YACC and non-YACC users should note number 9 in the above list. Don't use things like "while," "every," "do," etc. as symbols in your grammar! Just use the same rules for Ibpag2 nonterminals as for Icon variables, and you'll be OK. For those that just can't bear using anything but a strictly YACC-conformant system, I've included a preprocessor with the Ibpag2 distribution called (at one user's recommendation) "iacc." Iacc reads &input - assumed to be a YACCish grammar - and sends to &output an Ibpag2-conformant file. I have not tested this file extensively, and there are likely to be bugs in the way I've handled the necessary 2 token lookaheads and value stack references. Give it a whirl, though, if you are feeling adventurous. The only reason I personally use Iacc is that some YACCs (e.g. BSD YACC) have particularly nice debugging messages and help. If my grammar is particularly complex, I just run it through YACC without action code first, then use Iacc to convert it to Ibpag2 format. Iacc's output, as I noted, is not meant to be pretty, so I invariably end up doing a little editing - usually just respacing a few rules, and re-inserting any comments that I might have put in the original YACC file. In general, Ibpag2 (like YACC) handles epsilon moves and indirect cycles. LR-mode shift-reduce conflicts are also handled in the normal way (i.e. pick the rule with the highest priority, and, in cases where the priority is the same, check the associativities). In contrast to YACC, Ibpag2 flags reduce/reduce conflicts as errors (since these often conceal deeper precedence problems and just plain kludges). Reduce/reduce conflict errors are easily enough remedied, if need be, via (dummy) precedences. One can convert these errors to warnings by specifying -y on the command line. With the -y option, reduce/reduce conflicts are resolved in favor of the rule that occurs first in the grammar. The -y switch also prevents Ibpag2 from aborting on shift/reduce conflicts, telling it instead to resolve in favor of shift. Basically, -y is a partial YACC compatibility switch. Normally (i.e. in SLR mode) Ibpag2 is much more finicky than YACC about conflicts in its grammars. Also in contrast to YACC, Ibpag2 supports multiple simultaneous parsers. Ibpag2 normally names its main parser routine iiparse(). By using the -m command-line option, however, you can override this default behavior, and force Ibpag2 to augment this name in some uniquely identifiable fashion. For example, "ibpag2 -m _1 < tmp.ibp > tmp.icn" will force Ibpag2 to write a parser called "iiparse_1" to tmp.icn. Note that, instead of calling iilex, this iiparse_1() routine will now call iilex_1, and all necessary global variables will have _1 appended to them (e.g. errors will become errors_1). I don't expect that many people will have occasion to use this feature. It is there, though, for those that want it. 4.__Debugging Constructing and debugging LR(1) family parsers can sometimes be hair raising, even with a parser generator. Several precautions can be taken, however, to minimize the agony. The first is to declare all tokens initially as part of a single %token declaration, i.e. with no precedences, and with the same associativities. Also, leave out action code until the grammar seems to be working. In this stage, you can even run the grammar through (BSD)YACC or GNU Bison. All you would need to do is remove the commas between tokens and symbols, and place a semicolon at the end of every rule. During this and all debugging stages, supply Ibpag2 with a -v command-line switch. This will cause Ibpag2 to write a summary of rules, tokens, and its two state tables to "ibpag2.output" (a bit like GNU Bison, but with a hard-coded name). If you get messages about conflicts in your parse tables (e.g. "unresolvable reduce/reduce conflict, state 5, token 257, rules 4,5"). This file will tell you what rules these are, and what token number 257 is. Use precedences and associativities to clear these problems up as they arise. If you are comfortable having reduce/reduce errors resolved by the order in which the conflicting rules occur, then use the -y command-line switch. With -y on the command line, Ibpag2 will always resolve in favor of the earlier rule. This option will also cause it to resolve all shift/reduce conflicts in favor of shift. There are certain languages that are not ambiguous that SLR(1) parsers like Ibpag2 will fail to produce an unambiguous parse table for. The classic example is expr : lval, '=', rval | rval lval : '*', rval | ID rval : lval C programmers will recognize this as a toy expression grammar with code for identifiers, assignments, and pointers. The problem is that if we feed this grammar to Ibpag2, it will claim that there is a conflict on lookahead '='. In truth, there is no ambiguity. The SLR parser simply doesn't remember the pathway the parser used to get to the state it is in when it sees '=' on the input stream. Whether the parser gets into this state by seeing '*' plus and ID, or by seeing just an ID, it knows to turn the ID into an lval. Then it knows to turn lval into rval. At this point, though, it doesn't know whether to shift the = sign via rule 1, or to turn rval and the preceding '*' into an lval. The parser has "forgotten" that the '*' is there waiting on level down on the stack! The solution to this problem is actually quite simple (at least in concept). Just provide a unique pathway in the grammar for the conflicting rules. In this case, they are rules 1 and 5 (the first and last): expr : lval, '=', rval | rval lval : '*', pval | ID pval : lval rval : lval Now when the parser sees '*,' it can only have a pval after it. Never mind that pval is composed of precisely the same things as rval. The point is that the parser generator follows a different route after seeing '*' than if it starts with ID and no preceding '*'. Hence it "remembers" that that the '*' is back on the stack, waiting for the "lval : '*', pval" rule to apply. There is no more conflict. Go ahead and run these grammars through Ibpag2 if you aren't sure what is going on. Remember to declare ID as a token, and to place "%%" in the appropriate spot! If you get your parser up and running, but find that it is not functioning quite the way you expect, add the following line somewhere near the start of Ibpag2's output file: $define IIDEBUG If you like, you can add it to the beginning of your Ibpag2 input file. Place it in the declarations section (before the first double percent sign), and surround it by %{ and %}, e.g.: %{ $define IIDEBUG %} This tells Ibpag2 to send $define IIDEBUG straight through to the output file. What defining IIDEBUG does is tell iiparse, once compiled, to emit profuse debugging messages about the parser's actions, and about the state of its stacks. This display will not make a whole lot of sense to anyone who doesn't understand LR-family parsers, so those who want to access this feature should perhaps go through a standard reference like Aho, Sethi, and Ullman [1]. If, after you are finished debugging your grammar, you find that Ibpag2's output files are rather large, you may try saving space by compressing the action and goto tables. This is accomplished by invoking Ibpag2 with the -c (compress) option. Using this option makes debugging difficult, and makes the parser run a bit more slowly. It also only works for rather large grammars with long nonterminal symbol names. Don't even consider it until the grammar is thoroughly debugged and you have determined that the output file's size is just too great for practical use. Even then, compression may or may not help, depending on how long your nonterminal names are. In general, Ibpag2 is best as a teaching tool, or as a production system for medium or small grammars. 5.__Using_Ibpag2_with_Non-LR_Grammars There may be times when you *want* to parse languages that no LR-based algorithm can handle. There may be times, that is, when the grammar you want to use contains conflicts or ambiguities that are there by design, and not by oversight. For example, you may want to parse a natural language. Full-blown natural languages involve many highly ambiguous constructs, and are not LR-parsable. By invoking it with the -a option, Ibpag2 can parse or recognize certain natural languages, or, more practically speaking, certain NL subsets. The letter "a" in -a is supposed to stand for "ambiguous," although what this option really does is put Ibpag2 into a quasi-GLR mode - i.e. into a kind of "generalized" LR mode in which it can accept non-LR grammars [4,5]. User-visible changes to Ibpag2's operation in quasi-GLR mode (i.e. with the -a option) are as follows: 1) iiparse() is now a generator 2) action code can use suspend as well as return 3) IIERROR places the current thread in an error state (i.e. it doesn't *necessarily* trigger error recovery; see below) 4) there are two new action-code directives (iiprune and iiisolate) and a general define (AUTO_PRUNE) 5) conflicts due to ambiguities in the grammar no longer result in aborted processing (so, e.g., if you do not specify the -y option on a grammar with reduce/reduce conflicts, Ibpag2 will simply generate a parser capable of producing multiple parses for the same input) In quasi-GLR mode, iiparse() should be invoked in a way that will render multiple results usable, if they are available (e.g. "every result := iiparse(&input) do...". Action code is also allowed to produce more than one value (i.e. to use suspend). When it does so, iiparse() creates separate parse threads for each value. So, for instance, if your action code for some production suspends both of the following lists, ["noun", "will", "gloss: desire"] ["noun", "will", "gloss: legal document mandating how _ one's possessions are to be disposed _ of after one's death"], iiparse() would create two separate parse threads - one for each result. Note that in this case, the syntactic structure of each thread is the same. It is their semantics (i.e. the stuff on the value stack) that differs. If you use the iierrok and iiclearin macros in your action code before suspending any result, their affect persists through all subseqent suspensions and resulting parse threads. If you use these macros after suspending one or more times, however, they are valid only for the parse thread generated by the next suspension. By way of contrast, the IIERROR macro *always* flags only the next parse thread as erroneous. Likewise, IIACCEPT always simulates an accept action on the next suspension only. IIERROR and IIACCEPT, in other words, never have any effect on subsequent suspensions and parse threads other than the one that immediately follows them. This is true of iierrok and iiclearin only when used after the first suspension. In quasi-GLR mode, IIERROR (number three in the difference list above) becomes a mechanism for placing the current parse thread in error mode. This is similar to, but not quite identical to, how IIERROR functions in straight LR mode. In quasi-GLR mode, if other threads can carry on the parse without error the erroneous parse thread is quietly clobbered. Full-blown error recovery only occurs if all of the other parsers halt as well. This makes sense if you think about it. Why keep erroneous threads around when there are threads still continuing a valid parse? For some large interactive systems, it might be necessary to keep bogus threads around longer, and weed them out only after a lengthy grading process. If you are constructing a system such as this, you'll have to modify Ibpag2's iiglrpar.lib file. In particular, you'll need to change the segment in iiparse() that takes out the trash, so to speak, in such a way that it does so only if the error count in a given parser either rises above a specific threshhold or else exceeds the number of errors in the "most correct" parser by a certain amount. This is not that hard to do. I just don't expect that most parsers people generate with Ibpag2 will use IIERROR or error recovery in general in so involved a fashion. Iiprune and iiisolate (number 4 above) are used to control the growth of the parallel parser array. In order to give straightforward (read "implementationally trivial") support for action code, Ibpag2 cannot create a parse "forest" in the sense that a standard GLR parser does. Instead, it simply duplicates the current parser environment whenever it encounters a conflict in its action table. Even if the conflict turns out to reflect only a local ambiguity, the parsers, by default, remain separate. Put differently, Ibpag2's quasi-GLR parser, by default, makes no direct effort to reduce the size of its parser arrays or to alter the essentially linear structure of their value and state stacks. Size reduction, where necessary and/or desirable, is up to the programmer. What the iiprune macro is there to do is to give the programmer a way of pruning a given thread out of the active parser list. Iiisolate allows him or her to prune out every thread *but* the current one. AUTO_PRUNE makes the parser behave more like a standard GLR parser, instructing it to prune parse threads that are essentially duplicating another parse thread's efforts. The parser, though, does not build a parse tree per se, the way most GLR parsers typically do, but rather manipulates its value stack like a traditional LR-family parser. Iiprune is useful when, for example, the semantics (i.e. your "action" code segments) determine that a given parse thread is no longer viable, and you want to signal the syntactic analyzer not to continue pursuing it. The difference between iiprune and IIERROR is that iiprune clobbers the current parser immediately. IIERROR only puts it into an error state. If all active parsers end up in an error state, and none can shift additional input symbols, then the IIERROR macro induces error recovery. Iiprune does not. NB: iiprune, if used in action code that suspends multiple results, cancels the current and remaining results (i.e. it does not clobber parsers already spun off by previous suspensions by invocation of that same code; it merely cuts the result sequence). Iiprune essentially stands in for "fail" in this situation. Fail itself can be used in the code, but be warned that iiparse() will still push *at least one* value onto its value stack, even if a given action code segment fails. This keeps the value stack in sync with the syntax. To avoid confusion, I recommend not using "fail" in any action code. Iiisolate is useful if, during error recovery, you prompt the user interactively, or do something else that cannot be elegantly done in parallel for two or more distinct parse threads. Iiisolate allows you to preserve only the the current parse thread, and to clobber the rest. Iiisolate can also be useful as a way of making sure that only one thread carries on the parse in non-error situations. Suppose that we have a series of productions: sentences : sentences sentence '\n' { print_parse(arg2) } | sentences '\n' | error '\n' | epsilon If we get a sentence with more than one parse, all of the underlying threads that produced these parses will be active for the next sentence as well. In many situations this will not be what we want. If our desire it to have only one active parse thread at the start of each sentence, we simply tell our lexical analyzer to suspend two newlines every time it sees a newline on the input stream. This insures that the second rule will always apply right after the first. We then insert iiisolate directives for both it and the one error production: sentences : sentences sentence '\n' { print_parse(arg2) } | sentences '\n' { iiisolate } | error '\n' { iiisolate; iierrok } | epsilon The effect here is to allow multiple parsers to be generated only while parsing "sentence". The iiisolate directive, in other words, sees to it that no sentence parse will ever begin with multiple active parsers. As with LR mode, iierrok clears the error flag for the (current) parser. Note that if you use iiisolate in action code that suspends multiple results, iiisolate will clobber all parsers but the one generated by the next suspension. If there is no need for close control over the details of the parser array, and you wish only to clobber parsers that end up doing the same thing as some other parser (and hence returning identical values), then just make sure you add "$define AUTO_PRUNE" to the pass-through code section at the top of the file. Put differently, defining AUTO_PRUNE instructs the quasi-GLR parser to weed out parsers that are in the same state, and which have identical value stacks. AUTO_PRUNE can often be used in place of iiisolate in situations like the one discussed just above. Its only drawback is that it slows the parser a bit. Other than these deviations (action code and iiparse becoming generators, IIERROR's altered behavior, and the addition of iiprune, iiisolate, and AUTO_PRUNE), Ibpag2's quasi-GLR mode - at least on the surface - works pretty much like its straight LR mode. In fact, if you take one of your SLR(1) grammars, and run it through Ibpag2 using the -a option, you probably won't notice any difference in the resulting automaton unless you do some debugging or perform some timing tests (the GLR parser is slower, though for straight SLR(1) grammars not by much). Even with non-SLR(1) grammars, the quasi-GLR parser will clip along merrily, using all the same sorts of rules, action code, and macros that you would typically use in LR mode! 6.__Installing_Ibpag If you are a UNIX user, or have a generic "make" utility, you are in luck. Just edit Makefile.dist according to the directions given in that file, rename it as "makefile," then execute "make." Ibpag2 should be created automatically. If everything goes smoothly, then "make install" (su-ing root, if both possible and necessary for correct installation of the iiparse.icn file). Check with your system administrator if you are on a public system, and aren't sure what to do. Please be sure to read the directions in the makefile carefully, and set DESTDIR and LIBDIR to the directory where you want the executable and parser file to reside. Also, make sure the paths you specify are correct for your Icon executables. Although Ibpag2 will apparently compile using iconc, I would recommend using the interpreter, icont, first, unless you are planning on working with a large grammar. If you are using some other system - one that lacks "make" - then shame on your manufacturer :-). You'll be a bit inconvenienced. Try typing: icont -o ibpag2 follow.icn ibpag2.icn ibreader.icn \ ibtokens.icn ibutil.icn ibwriter.icn iohno.icn \ outbits.icn slritems.icn slrtbls.icn shrnktbl.icn \ version.icn slshupto.icn The backslashes merely indicate that the next line is a continuation. The whole thing should, in other words, be on a single line. As noted above, you may compile rather than interpret - if your OS supports the Icon compiler. Just replace "icont" above with "iconc." The resulting executable will run considerably faster than with "icont," although the time required to compile it may be large, and the (still somewhat experimental) compiler may not work smoothly in all environments. If your operating system support environment variables, and you have set up your LPATH according to the specifications in the Icon distribution (see below), then you may copy iiparse.lib and iiglrpar.lib to some file in your LPATH. If you do not do this, or if your OS does not support environment variables, then you must be in the directory where you keep your Ibpag2 files when you use it, or else invoke Ibpag2 with the -p dirname option (where dirname is the directory that holds the iiparse.lib and iiglrpar.lib files that come with the Ibpag2 distribution). The .lib files contain template parsers that are critical to Ibpag2's operation. Ibpag2 will abort if it cannot find them. If your operating system permits the creation of macros or batch files, it might be useful to create one that changes automatically to the Ibpag2 source directory, and runs the executable. This has the side-benefit of making it easier for Ibapg2 to find the parser library files, iiparse.lib and iiglrpar.lib. Under DOS, for instance, one might create a batch file that says: c: cd c:\ibpag2 iconx ibpag2 %1 %2 %3 %4 %5 %6 %7 %8 %9 DOS, it turns out, has to execute Icon files indirectly through iconx, so this technique has yet another advantage in that it hides the second level of indirection - although it prevents you from using input and output redirection. Naturally, the above example assumes that Ibpag2 is in c:\ibpag2. Ibpag2 assumes the existence on your system, not only of an Icon interpreter or compiler, but also of an up-to-date Icon Program Library. There are several routines included in the IPL that Bibleref uses. Make sure you (or the local system administrators) have put the IPL online, and have translated the appropriate object modules. Set your IPATH environment variable to point to the place where the object modules reside. Set LPATH to point to the modules' source files. Both IPATH and LPATH are documented in doc directory of the Icon source tree (ipd224.doc). If your system does not support environment variables, copy ximage.icn, options.icn, ebcdic.icn, and escape.icn from the IPL into the Ibpag2 source directory, and compile them in with the rest of the Ibpag2 source files, either by adding them to the SRC variable in the makefile, or by adding them manually to the "icont -o ..." command line given above. If you have any problems installing or using Ibpag2, please feel free to drop me, Richard Goerwitz, an e-mail message at goer@midway.uchicago.edu, or (via the post) at: 5410 S. Ridgewood Ct., 2E Chicago, IL 60615 6.__Bibliography 1. Aho, Alfred V., Sethi, Ravi, and Ullman, Jeffrey D. Compilers. Addison-Wesley: Reading, Massachusetts, second printing, 1988. 2. Griswold, Ralph E. and Griswold, Madge T. The Icon Programming Language. Prentice-Hall, Inc.: Englewood Cliffs, New Jersey, USA, second edition, 1990. 3. Griswold, Ralph E., Jeffery, Clinton L., and Townsend, Gregg M. Version 8.10 of the Icon Programming Language. Univ. of Arizona Icon Project Document 212, 1993. (obtain via anonymous FTP from cs.arizona.edu ~ftp/icon/docs/ipd212.doc) 4. Tomita, Masaru. Efficient Parsing for Natural Language. Boston: Kluwer Academic Publishers, c. 1985. 5. Tomita, Masaru editor. Generalized LR Parsing. Boston: Kluwer Academic Publishers, 1991. icon-9.4.3/ipl/packs/ibpag2/iiparse.lib0000664000175000017500000002742007140713043017164 0ustar chrishchrish############################################################################ # # Name: iiparse.lib # # Title: LR parser code # # Author: Richard L. Goerwitz # # Version: 1.31 # ############################################################################ # # LR parser code for use by Ibpag2-generated files. Entry point is # iiparse(infile, fail_on_error). Infile is the stream from which # input is to be taken. Infile is passed as argument 1 to the # user-supplied lexical analyzer, iilex_module() (where _module is # the string supplied with the -m option to Ibpag2). If # fail_on_error is nonnull, the parser, iiparse, will fail on errors, # rather than abort. Iiparse() returns the top element on its value # stack on a successful parse (which can be handy). # # Iilex_module() must suspend integers for tokens and may also set # iilval_module to the actual string values. Tokens -2, -1, and 0 # are reserved. -2 is epsilon, and -1 is error. 0 is EOF, and is # automatically appended to the token stream when iilex_module, the # tokenizer, fails. These values should not normally be returned by # the analyzer. In general, it is a good idea to $include # iilex_module from your Ibpag2 source files, so that it can use the # symbolic %token names declared in the original Ibpag2 source file. # As implied above ("suspend"), iilex_module must be a generator, # failing on EOF. # # If desired, the user may include his or her own error-handling # routine. It must be called iiparse_module (where _module is once # again the module name supplied to ibpag2 via the -m option). The # global variable line_number_module is automatically defined below, # so a typical arrangement would be for the lexical analyzer to # initialize line_number_module to 0, and increment by 1 for each # line read. The error handler, iierror_module() can then display # this variable. Note that the error handler should accept a single # string argument (set by iiparse to describe the error just # encountered). # ############################################################################ # # See also: ibpag2.icn # ############################################################################ $$line 50 "iiparse.lib" # These defines are output by Ibpag2 ahead of time (with the module # name appended, if need be): # # $define iierrok recover_shifts := &null; # $define IIERROR iidirective ||:= "error"; # $define IIACCEPT iidirective ||:= "accept"; # $define iiclearin iidirective ||:= "clearin"; # Warning! If you change the name of the value stack, change it also # in ibreader.icn, procedure write_action_as_procedure(). # global $iilval, $errors, $line_number, $state_stack, $value_stack, $iidirective, $recover_shifts, $discards # # iiparse: file x anything -> ? # (stream, fail_on_error) -> ? # # Where stream is an open file, where fail_on_error is a switch # that (if nonnull) tells the iiparse to fail, rather than abort, # on error, and where ? represents the user-defined result of a # completed parse of file, from the current location up to the # point where the parser executes an "accept" action. # procedure $iiparse(stream, fail_on_error) local token, next_token, act, ruleno, newsym, rhsize, arglist, result, tmp, func static atbl, gtbl, ttbl initial { $iidirective := "" atbl := $atbl_insertion_point gtbl := $gtbl_insertion_point ttbl := $ttbl_insertion_point $$line 86 "iiparse.lib" \$iilex | stop("no iilex tokenizer defined") } $$ifndef IIDEBUG $iidebug := 1 $$endif # not IIDEBUG $state_stack := [1] $value_stack := [] $errors := 0 # errors is global next_token := create $iilex(stream, fail_on_error) | 0 token := @next_token repeat { # # Begin cycle by checking whether there is a valid action # for state $state_stack[1] and lookahead token. Atbl and # gtbl here have a "backwards" structure: t[token][state] # (usually they go t[state][token]). # if act := \ (\atbl[token])[$state_stack[1]] then { $$ifdef COMPRESSED_TABLES act := $uncompress_action(act) $$endif #COMPRESSED TABLES act ? { # There's a valid action: Perform it. case move(1) of { "s": { # # Shift action format, e.g. s2.1 = shift and # go to state 2 by rule 1. # push($state_stack, integer(tab(find(".")))) push($value_stack, $iilval) ="."; ruleno := integer(tab(many(&digits))) pos(0) | stop("malformed action: ", act) # # If, while recovering, we can manage to # shift 3 tokens, then we consider ourselves # resynchronized. Don't count error (-1). # if token ~= -1 then { if \$recover_shifts +:= 1 then { # 3 shifts = successful recovery if $recover_shifts > 4 then { $recover_shifts := &null $discards := 0 } } } $iidebug("s", ttbl, token, ruleno) token := @next_token | break } "r": { # # Reduce action format, e.g. r12 = reduce # by rule 1 (LHS = S, RHS length = 2). # ruleno := integer(1(tab(find("<")), move(1))) newsym := 1(tab(find(">")), move(1)) rhsize := integer(tab(many(&digits))) arglist := [] every 1 to rhsize do { pop($state_stack) push(arglist, pop($value_stack)) } # on the structure of gtbl, see above on atbl push($state_stack, gtbl[newsym][$state_stack[1]]) # # The actions are in procedures having the same # name as the number of their rule, bracketed # by underscores followed by the current module. # if func := proc("_" || ruleno || "_" || $module) then { result := func!arglist | arglist[-1] | &null tmp := $iidirective $iidirective := "" # # IIERROR, IIACCEPT, iierrok, and iiclearin # are implemented using a search through a global # iidirective variable; see the $defines # above # if *tmp > 0 then { if find("clearin", tmp) then token := @next_token if find("error", tmp) then { # restore stacks & fake an error pop($state_stack) every 1 to rhsize do push($value_stack, !arglist) $errors +:= 1 next_token := create (token | (|@next_token)) token := -1 next } if find("accept", tmp) then { $iidebug("a", ttbl, token, ruleno) return result } } } # If there is no action code for this rule... else { # ...push the value of the last RHS arg. # For 0-length e-productions, push &null. result := arglist[-1] | &null } push($value_stack, result) $iidebug("r", ttbl, token, ruleno) } # We're done. Return the last-generated value. "a": { $iidebug("a", ttbl, token, ruleno) return $value_stack[1] } } } } # # ...but if there is *no* action for atbl[token][$state_stack[1]], # then we have an error. # else { if \$recover_shifts := 0 then { # # If we're already in an error state, discard the # current token, and increment the number of discards # we have made. 500 is too many; abort. # if ($discards +:= 1) > 500 then { if \$iierror then $iierror("fatal error: can't resynchronize") else write(&errout, "fatal error: can't resynchronize") if \fail_on_error then fail else stop() } $iidebug("e", ttbl, token) # # We were in the process of recovering, and the late # token didn't help; discard it and try again. # token := @next_token | break } else { $errors +:= 1 # global error count $discards := $recover_shifts := 0 if \$iierror then $iierror(image(\ttbl[token]) | image(token)) else write(&errout, "parse error") # # If error appears in a RHS, pop states until we get to # a spot where error (-1) is a valid lookahead token: # if \ttbl[-1] then { until *$state_stack = 0 do { if \atbl[-1][$state_stack[1]] then { $iidebug("e", ttbl, token) next_token := create (token | (|@next_token)) token := -1 break next } else pop($state_stack) & pop($value_stack) } # If we get past here, the stack is now empty. Abort. } if \fail_on_error then fail else stop() } } } # # If we get to here without hitting a final state, then we aren't # going to get a valid parse. Abort. # if \$iierror then $iierror("unexpected EOF") else write(&errout, "unexpected EOF") if \fail_on_error then fail else stop() end $$ifdef IIDEBUG record production(LHS, RHS, POS, LOOK, no, prec, assoc) # # iidebug # procedure $iidebug(action, ttbl, token, ruleno) local p, t, state static rule_list initial { rule_list := $rule_list_insertion_point $$line 279 "iiparse.lib" } case action of { "a" : writes(&errout, "accepting ") & state := $state_stack[1] "e" : writes(&errout, "***ERROR***\n") & writes(&errout, "recovery shifts = ", $recover_shifts,"\n") & writes(&errout, "discarded tokens = ", $discards, "\n") & writes(&errout, "total error count = ", $errors, "\n") & writes(&errout, "error action ") & state := $state_stack[1] "r" : writes(&errout, "reducing ") & state := $state_stack[2] "s" : writes(&errout, "shifting ") & state := $state_stack[2] default : stop("malformed action argument to iidebug") } t := image(token) || (" (" || (\ttbl[token] | "unknown") || ")") writes(&errout, "on lookahead ", t, ", in state ", state) if \ruleno then { (p := !rule_list).no = ruleno | stop("no rule number ", tbl[symbol][state]) write(&errout, "; rule ", $production_2_string(p, ttbl)) } # for errors, ruleno is null else write(&errout) write(&errout, " state stack now: ") every write(&errout, "\t", image(!$state_stack)) write(&errout, " value stack now: ") if *$value_stack > 0 then every write(&errout, "\t", image(!$value_stack)) else write(&errout, "\t(empty)") return end # # production_2_string: production record -> string # p -> s # # Stringizes an image of the LHS and RHS of production p in # human-readable form. # procedure $production_2_string(p, ibtoktbl) local s, m, t s := image(p.LHS) || " -> " every m := !p.RHS do { if t := \ (\ibtoktbl)[m] then s ||:= t || " " else s ||:= image(m) || " " } # if the POS field is nonnull, print it s ||:= "(POS = " || image(\p.POS) || ") " # if the LOOK field is nonnull, print it, too s ||:= "lookahead = " || image(\p.LOOK) return trim(s) end $$endif # IIDEBUG $$ifdef COMPRESSED_TABLES # # uncompress_action # procedure $uncompress_action(action) local next_chunk, full_action next_chunk := create ord(!action) case $in_ib_bits(next_chunk, 2) of { 0: { full_action := "s" full_action ||:= $in_ib_bits(next_chunk, 11) full_action ||:= "." full_action ||:= $in_ib_bits(next_chunk, 11) } 1: { full_action := "r" full_action ||:= $in_ib_bits(next_chunk, 11) full_action ||:= "<" full_action ||:= $in_ib_bits(next_chunk, 11) full_action ||:= ">" full_action ||:= $in_ib_bits(next_chunk, 8) } 2: { full_action := "a" } } return full_action end # # in_ib_bits: like inbits (IPL), but with coexpression for file # procedure $in_ib_bits(next_chunk, len) local i, byte, old_byte_mask static old_byte, old_len, byte_length initial { old_byte := old_len := 0 byte_length := 8 } old_byte_mask := (0 < 2^old_len - 1) | 0 old_byte := iand(old_byte, old_byte_mask) i := ishift(old_byte, len-old_len) len -:= (len > old_len) | { old_len -:= len return i } while byte := @next_chunk do { i := ior(i, ishift(byte, len-byte_length)) len -:= (len > byte_length) | { old_len := byte_length-len old_byte := byte return i } } end $$endif # COMPRESSED_TABLES icon-9.4.3/ipl/packs/ibpag2/ibwriter.icn0000664000175000017500000000700107140713043017353 0ustar chrishchrish############################################################################ # # Name: ibwriter.icn # # Title: Ibpag2 parser/library writer # # Author: Richard L. Goerwitz # # Version: 1.7 # ############################################################################ # # Given a grammar, an action table, a goto table, an open output # file, an open iiparser file, and a module name, sends to the output # file a fully loaded LR parser with run-time constructible action # and goto tables. The iiparser file contains the base LR parser # that the output file uses. # ############################################################################ # # Links: itokens, ximage # # See also: iiparse.icn # ############################################################################ #link itokens, ximage link ximage # defined in itokens.icn # record ib_TOK(sym, str) procedure ibwriter(iiparse_file, outfile, grammar, atbl, gtbl, module) local token, next_token, start_symbol, rule_list, ttbl /module := "" start_symbol := grammar.start rule_list := grammar.rules ttbl := grammar.tbl next_token := create itokens(iiparse_file, 1) # # Copy tokens in iiparse_file to outfile. Whenever we find a $ # (RHSARG), process: If we find $$, output $; If we find $module, # output image(module); and other such stuff. Note that # copy_iiparse_tokens suspends tokens before writing them. It # also blocks writing of any token whose sym field matches the # string given as arg 3. # every token := copy_iiparse_tokens(next_token, outfile, "RHSARG") do { if token.sym == "RHSARG" then { if (token := @next_token).sym == "RHSARG" then { writes(outfile, token.str) next } token.sym == "IDENT" | iohno(60, "line "|| line_number) writes(outfile, " ") case token.str of { # copy $module name over as a literal "module" : writes(outfile, image(module)) # use ximage to copy over action, goto, and token tables, # as well as the production list (used only for debugging) "atbl_insertion_point": writes(outfile, ximage(atbl)) "gtbl_insertion_point": writes(outfile, ximage(gtbl)) "ttbl_insertion_point": writes(outfile, ximage(ttbl)) "rule_list_insertion_point" : writes(outfile, ximage(rule_list)) # use image to copy the start symbol into the output file "start_symbol_insertion_point" : writes(outfile, image(start_symbol)) # add the module name to anything else beginning with $ default : writes(outfile, token.str, module, " ") } } } return end # # copy_iiparse_tokens: coexpression x file x string -> ib_TOK records # (next_token, out, except) -> token records # # Copy Icon code to output stream, also suspending as we go. # Insert separators between tokens where needed. Do not output # any token whose sym field matches except. The point in # suspending tokens as we go is to enable the calling procedure to # look for signal tokens that indicate insertion or termination # points. Fail on EOF. # procedure copy_iiparse_tokens(next_token, out, except) local separator, T separator := "" while T := @next_token do { if \T.sym then suspend T if \T.sym == \except then next if any(&digits ++ &letters ++ '_.', \T.str, 1, 2) & \T.sym ~== "DOT" then writes(out, separator) writes(out, T.str) if any(&digits ++ &letters ++ '_.', \T.str, -1, 0) & \T.sym ~== "DOT" then separator := " " else separator := "" } end icon-9.4.3/ipl/packs/ibpag2/outbits.icn0000664000175000017500000000577307140713043017233 0ustar chrishchrish############################################################################ # # Name: outbits.icn # # Title: output variable-length characters in byte-size chunks # # Author: Richard L. Goerwitz # # Version: 1.5 # ############################################################################ # # In any number of instances (e.g. when outputting variable-length # characters or fixed-length encoded strings), the programmer must # fit variable and/or non-byte-sized blocks into standard 8-bit # bytes. Outbits() performs this task. # # Pass to outbits(i, len) an integer i, and a length parameter (len), # and outbits will suspend byte-sized chunks of i converted to # characters (most significant bits first) until there is not enough # left of i to fill up an 8-bit character. The remaining portion is # stored in a buffer until outbits() is called again, at which point # the buffer is combined with the new i and then output in the same # manner as before. The buffer is flushed by calling outbits() with # a null i argument. Note that len gives the number of bits there # are in i (or at least the number of bits you want preserved; those # that are discarded are the most significant ones). # # A trivial example of how outbits() might be used: # # outtext := open("some.file.name","w") # l := [1,2,3,4] # every writes(outtext, outbits(!l,3)) # writes(outtext, outbits(&null,3)) # flush buffer # # List l may be reconstructed with inbits() (see inbits.icn): # # intext := open("some.file.name") # l := [] # while put(l, inbits(intext, 3)) # # Note that outbits() is a generator, while inbits() is not. # ############################################################################ # # Links: none # See also: inbits.icn # ############################################################################ procedure outbits(i, len) local old_part, new_part, window, old_byte_mask static old_i, old_len, byte_length, byte_mask initial { old_i := old_len := 0 byte_length := 8 byte_mask := (2^byte_length)-1 } old_byte_mask := (0 < 2^old_len - 1) | 0 window := byte_length - old_len old_part := ishift(iand(old_i, old_byte_mask), window) # If we have a no-arg invocation, then flush buffer (old_i). if /i then { if old_len > 0 then { old_i := old_len := 0 return char(old_part) } else { old_i := old_len := 0 fail } } else { new_part := ishift(i, window-len) len -:= (len >= window) | { old_len +:= len old_i := ior(ishift(old_part, len-window), i) fail } # For debugging purposes. # write("old_byte_mask = ", old_byte_mask) # write("window = ", image(window)) # write("old_part = ", image(old_part)) # write("new_part = ", image(new_part)) # write("outputting ", image(ior(old_part, new_part))) suspend char(ior(old_part, new_part)) } until len < byte_length do { suspend char(iand(ishift(i, byte_length-len), byte_mask)) len -:= byte_length } old_len := len old_i := i fail end icon-9.4.3/ipl/packs/ibpag2/version.icn0000664000175000017500000000066707140713043017224 0ustar chrishchrish############################################################################ # # Name: version.icn # # Title: return Ibpag2 version number # # Author: Richard L. Goerwitz # # Version: 1.13 # ############################################################################ # # See also: ibpag2.icn # ############################################################################ procedure ib_version() return "Ibpag2, version 1.3.7" end icon-9.4.3/ipl/packs/ibpag2/slshupto.icn0000664000175000017500000000430707140713043017413 0ustar chrishchrish############################################################################ # # Name: slshupto.icn # # Title: slshupto (upto with backslash escaping) # # Author: Richard L. Goerwitz # # Version: 1.4 # ############################################################################ # # Slshupto works just like upto, except that it ignores backslash # escaped characters. I can't even begin to express how often I've # run into problems applying Icon's string scanning facilities to # to input that uses backslash escaping. Normally, I tokenize first, # and then work with lists. With slshupto() I can now postpone or # even eliminate the traditional tokenizing step, and let Icon's # string scanning facilities to more of the work. # # If you're confused: # # Typically UNIX utilities (and probably others) use backslashes to # "escape" (i.e. remove the special meaning of) metacharacters. For # instance, UNIX shells normally accept "*" as a shorthand for "any # series of zero or more characters. You can make the "*" a literal # "*," with no special meaning, by prepending a backslash. The rou- # tine slshupto() understands these backslashing conventions. You # can use it to find the "*" and other special characters because it # will ignore "escaped" characters. # ############################################################################ # # Links: none # # See also: slashbal.icn # ############################################################################ # for compatibility with the original name # procedure slashupto(c, s, i, j) suspend slshupto(c, s, i, j) end # # slshupto: cset x string x integer x integer -> integers # (c, s, i, j) -> Is (a generator) # where Is are the integer positions in s[i:j] before characters # in c that is not preceded by a backslash escape # procedure slshupto(c, s, i, j) local c2 if /s := &subject then /i := &pos else /i := 1 /j := *s + 1 /c := &cset c2 := '\\' ++ c s[1:j] ? { tab(i) while tab(upto(c2)) do { if ="\\" then { move(1) | { if find("\\", c) then return &pos - 1 } next } suspend .&pos move(1) } } end icon-9.4.3/ipl/packs/ibpag2/slritems.icn0000664000175000017500000002004407140713043017370 0ustar chrishchrish############################################################################ # # Name: slritems.icn # # Title: compute item sets for a grammar # # Author: Richard L. Goerwitz # # Version: 1.10 # ############################################################################ # # Contains make_slr_item_sets(start_symbol, st), slr_goto(l, symbol, # st), slr_closure(l, st). The user need only worry about # make_slr_item_sets() initially. The slr_goto() routine may be # useful later when constructing action and goto tables. # # Slr_closure(l, st) accepts a list of items as its first argument, a # list or set of the productions in the grammar as its second, and # returns the closure of item list l, in the form of another item # list. # # Note also that the production record structure (LHS, RHS, POS, # LOOK...) has a POS field, and therefore can serve also as an item. # In fact, any structure can be used, as long as its first three # fields are LHS, RHS, and POS. # # See the "Dragon Book" (cited in first.icn) p. 222 ff. # # Slr_goto(l, symbol, st) accepts a list as its first argument, a # string or integer as its second (string = nonterminal, integer = # terminal), and a list or set for its third, returning another list. # Arg 1 must be an item list, as generated either by another call to # slr_goto() or by closure of the start production of the augmented # grammar. Arg 2, symbol, is some terminal or nonterminal symbol. # Arg 3 is the list or set of all productions in the current grammar. # The return value is the closure of the set of all items [A -> aX.b] # such that [A -> a.Xb] is in l (arg 1). # # make_slr_item_sets(start_sym, st) takes a string, start_sym, as its # first argument, and a list or set of productions as its second. # Returns a list of canonical LR(0) item sets or states. It returns, # in other words, a list of lists of items. Items can be any record # type that has LHS, RHS, and POS as its first three fields. # # See the "Dragon Book," example 4.35 (p. 224). # ############################################################################ # # Links: ibutil # ############################################################################ # link ibutil # # slr_closure: list x list/set -> list # (l2, st) -> l2 # # Where l is a list of items, where st is a list/set of all # productions in the grammar from which l was derived, and where # l(2) is the SLR closure of l, as constructed using the standard # SLR closure operation. # # Ignore the third to fifth arguments, len to added. They are # used internally by recursive calls to slr_closure(). # procedure slr_closure(l, st, len, LHS_tbl, added) local p, i, new_p, symbol static LHS_tbl_tbl initial LHS_tbl_tbl := table() if /LHS_tbl then { if /LHS_tbl_tbl[st] := table() then { # makes looking up all rules with a given LHS easier every p := !st do { /LHS_tbl_tbl[st][p.LHS] := list() put(LHS_tbl_tbl[st][p.LHS], p) } } LHS_tbl := LHS_tbl_tbl[st] } /len := 0 /added := set() # Len tells us where the elements in l start that we haven't yet # tried to generate more items from. These elements are basically # the items added on the last recursive call (or the "core," if # there has not yet been a recursive call). # every i := len+1 to *l do { /l[i].POS := 1 # Fails if dot (i.e. l[i].POS) is at the end of the RHS; # also fails if the current symbol (i.e. l[i].RHS[l[i].POS]) # is a nonterminal. symbol := l[i].RHS[l[i].POS] # No need to add productions having symbol as their LHS if # we've already done so for this particular l. member(added, symbol) & next every p := !\LHS_tbl[symbol] do { # Make a copy of p, but with dot set to position 1. new_p := copy(p) # Set POS to 1 for non-epsilon productions; otherwise to 2. if *new_p.RHS = 1 & new_p.RHS[1] === -2 then new_p.POS := 2 else new_p.POS := 1 # if new_p isn't in l, add it to the end of l if not equivalent_items(new_p, !l) then put(l, new_p) } insert(added, symbol) } return { # If nothing new has been added, sort the result and return... if *l = i then sortff(l, 1, 2, 3) # ...otherwise, try to add more items to l. else slr_closure(l, st, i, LHS_tbl, added) } end # # slr_goto: list x string|integer x list|set -> list # (l, symbol, st) -> l2 # # Where l is an item set previously returned by slr_goto or (for # the start symbol of the augmented grammar) by slr_closure(), # where symbol is a string (nonterminal) or integer (terminal), # where st is a list or set of all productions in the current # grammar, and where l2 is the SLR closure of the set of all items # [A -> aX.b] such that [A -> a.Xb] is in l. # # The idea is just to move the dots for all productions where the # dots precede "symbol," creating a new item list for the "moved" # items, and then performing a slr_closure() on that new item list. # Note that items can be represented by any structure where fields # 1, 2, and 3 are LHS, RHS, and POS. # # Note that slr_goto(l, symbol, st) may yield a result that's # structurally equivalent to one already in the sets of items thus # far generated. This won't normally happen, because slr_goto() # saves old results, never re-calcing for the same l x symbol # combination. Still, a duplicate result could theoretically # happen. # procedure slr_goto(l, symbol, st) local item, item2, l2, iteml_symbol_table static iteml_symbol_table_table initial iteml_symbol_table_table := table() # Keep old results for this grammar (st) in a table of tables of # tables! # /iteml_symbol_table_table[st] := table() iteml_symbol_table := iteml_symbol_table_table[st] # See if we've already performed this same calculation. # if l2 := \(\iteml_symbol_table[l])[symbol] then return l2 l2 := list() every item := !l do { # Subscripting operation fails if the dot's at end. if item.RHS[item.POS] === symbol then { item2 := copy(item) # copy is nonrecursive item2.POS +:= 1 put(l2, item2) } } if *l2 = 0 then fail else l2 := slr_closure(l2, st) # # Keep track of item lists and symbols we've already seen. # /iteml_symbol_table[l] := table() /iteml_symbol_table[l][symbol] := l2 if *l2 > 0 then return l2 else fail end # # make_slr_item_sets: string x list|set -> list # (start_sym, st) -> l # # Where start_sym is the start symbol for the grammar defined by # the productions contained in st, and where l is the list of item # lists generated by the standard LR(0) set-of-items construction # algorithm. # # Ignore the third and fourth arguments. They are used internally # by recursive calls. # procedure make_slr_item_sets(start_sym, st, C, len) local i, next_items, item_list, new_list, item, symbol # # First extend the old start symbol and use the result as the new # start symbol for the augmented grammar to which the set-of-items # construction will be applied. # # &trace := -1 /C := [slr_closure( [production("`_" || start_sym || "_'", [start_sym], 1)],st)] /len := 0 # Iterate through C (the list of item-lists), doing gotos, and adding # new states, until no more states can be added to C. # every item_list := C[i := len+1 to *C] do { if \DEBUG then print_item_list(C, i) # collect all symbols after the dot for the the items in C[i]... next_items := set() every item := !item_list do insert(next_items, item.RHS[item.POS]) # ...now, try to do a slr_goto() for every collected symbol. every symbol := !next_items do { new_list := slr_goto(item_list, symbol, st) | next if not equivalent_item_lists(new_list, !C) then put(C, new_list) } } # If nothing has been inserted, return C and quit; otherwise, call # recursively and try again. # return { if i = *C then C else make_slr_item_sets(&null, st, C, i) } end icon-9.4.3/ipl/packs/ibpag2/sample.ibp0000664000175000017500000000447407140713043017021 0ustar chrishchrish# # Sample Ibpag2 grammar file. # # # The code between %{ and %} gets copied directly. Note the Iconish # comment syntax. # %{ # Note: If IIDEBUG is defined in the output file, debugging messages # about the stacks and actions get displayed. # $define IIDEBUG 1 %} # # Here we declare the tokens returned by the lexical analyzer. # Precedences increase as we go on. Note how (unlike YACC), tokens # are separated by commas. Note also how UMINUS is used only for its # %prec later. # %token NUMBER %left '+', '-' %left '*', '/' %right UMINUS %% # # After this point, and up to the next %%, we have the grammar itself. # By default, the start symbol is the left-hand side of the first # rule. # lines : lines, expr, '\n' { write($2) } | lines, '\n' | epsilon # Note use of epsilon/error tokens. | error, '\n' { write("syntax error; try again:") # like YACC's yyerrok macro iierrok } ; expr : expr, '+', expr { return $1 + $3 } | expr, '-', expr { return $1 - $3 } | expr, '*', expr { return $1 * $3 } | expr, '/', expr { return $1 / $3 } | '(', expr, ')' { return $2 } | '-', expr %prec UMINUS { return -$2 } | NUMBER { return $1 } ; %% # # From here on, code gets copied directly to the output file. We are # no longer in the grammar proper. # # # The lexical analyzer must be called iilex, with the module name # appended (if there is one). It must take one argument, infile (an # input stream). It must be a generator, and fail on EOF (not return # something <= 0, as is the case for YACC + Lex). Iilval holds the # literal string value of the token just suspended by iilex(). # procedure iilex(infile) local nextchar, c, num initial { # Here's where you'd initialize any %{ globals %} declared # above. } nextchar := create !(!infile || "\n" || "\n") c := @nextchar | fail repeat { if any(&digits, c) then { if not (\num ||:= c) then num := c } else { if iilval := \num then { suspend NUMBER num := &null } if any('+-*/()\n', c) then { iilval := c suspend ord(c) } else { if not any(' \t', c) then { # deliberate error - will be handled later suspend &null } } } c := @nextchar | break } if iilval := \num then { return NUMBER num := &null } end procedure main() return iiparse(&input, 1) end icon-9.4.3/ipl/packs/ibpag2/slrtbls.icn0000664000175000017500000002732007140713043017217 0ustar chrishchrish############################################################################ # # Name: slrtbls.icn # # Title: slr table generation routines # # Author: Richard L. Goerwitz # # Version: 1.20 # ############################################################################ # # Contains make_slr_tables(grammar, atbl, gtbl, noconflict, # like_yacc), where grammar is an ib_grammar record (as returned by # ibreader), where atbl and gtbl are initialized (default &null) hash # tables, and where noconflict is a switch that, if nonnull, directs # the resolver to abort on unresolvable conflicts. Returns &null if # successful in filling out atbl and gtbl. If likeyacc is nonnull, # make_slr_tables will resolve reduce/reduce conflicts by order of # occurrence in the grammar, just like YACC. Shift/reduce conflicts # will be resolved in favor of shift. # # The reason for the noconflict switch is that there are parsers that # can accept tables with multiple action entries, i.e. parsers that # can use tables generated by ambiguous grammars. # # In this routine's case, success is identified with creating a # standard SLR action and goto table. Note that both tables end up # as tables of tables, with symbols being the primary or first key, # and state numbers being the second. This is the reverse of the # usual arrangement, but turns out to save a lot of space. Atbl # values are of the form "s2.3", "r410", "a", etc. The string # "s2.3" means "shift the current lookahead token, and enter state 2 # via rule 3." By way of contrast, "r410" means "reduce by rule # number 4, which has A as its LHS symbol and 10 RHS symbols." A # single "a" means "accept." # Atbl entries may contain more than one action. The actions are # simply concatenated: "s2.3r410a". Conflicts may be resolved # later by associativity or precedence, if available. Unresolvable # conflicts only cause error termination if the 5th and final # argument is nonnull (see above on "noconflict"). # # Gtbl entries are simpler than atble entries, consisting of a single # integer. # ############################################################################ # # Links: follow, slritems, iohno # ############################################################################ # declared in ibreader.icn # record ib_grammar(start, rules, tbl) #link follow, slritems, iohno#, ximage # # make_slr_tables # procedure make_slr_tables(grammar, atbl, gtbl, noconflict, like_yacc) local start_symbol, st, C, i, augmented_start_symbol, item, symbol, new_item_list, j, action # Initialize start symbol and rule list/set (either is okay). start_symbol := grammar.start st := grammar.rules # Number the rules, and then construct the canonical LR(0) item sets. every i := 1 to *st do st[i].no := i C := make_slr_item_sets(start_symbol, st) # Now, go through each item in each item set in C filling out the # action (atbl) and goto table (gtbl) as we go. # augmented_start_symbol := "`_" || start_symbol || "_'" every i := 1 to *C do { every item := !C[i] do { # if the dot's *not* at the end of the production... if symbol := item.RHS[item.POS] then { # if were looking at a terminal, enter a shift action if type(symbol) == "integer" then { if symbol = -2 then next # Never shift epsilon! new_item_list := slr_goto(C[i], symbol, st) every j := 1 to *C do { if equivalent_item_lists(new_item_list, C[j]) then { action := "s" || j || "." || item.no resolve(st, atbl, symbol, i, action, noconflict, like_yacc) break next } } # if we're looking at a nonterminal, add action to gtbl } else { new_item_list := slr_goto(C[i], symbol, st) every j := 1 to *C do { if equivalent_item_lists(new_item_list, C[j]) then { /gtbl[symbol] := table() /gtbl[symbol][i] := j | gtbl[symbol][i] =:= j | iohno(80, image(symbol), ".", image(i), ":", j) break next } } } # ...else if the dot *is* at the end of the production } else { if item.LHS == augmented_start_symbol then { action := "a" # 0 = EOF resolve(st, atbl, 0, i, action, noconflict, like_yacc) } else { # add a reduce for every symbol in FOLLOW(item.LHS) every symbol := !FOLLOW(start_symbol, st, item.LHS) do { # RHS size is 0 for epsilon. if item.RHS[1] === -2 then { action := "r" || item.no || "<" || item.LHS || ">0" } else action := "r" || item.no || "<" || item.LHS || ">" || *item.RHS resolve(st, atbl, symbol, i, action, noconflict, like_yacc) } } } } } return end # # resolve: list|set x table x string|integer, integer, anything, anything # -> string # (st, tbl, symbol, state, action, noconflict, like_yacc) # -> new_action_list # # Add action to action table, resolving conflicts by precedence # and associativity, if need be. If noconflict is nonnull, abort # on unresolvable conflicts. Fails on shift/shift "conflicts," or # if an identical action is already present in the table entry to # be modified. If like_yacc is nonnull, resolve reduce/reduce # conflicts by their order of occurrence in the grammar; resolve # shift/reduce conflicts in favor of shift. # procedure resolve(st, tbl, symbol, state, action, noconflict, like_yacc) local actions, chr, a, ruleno, p, newp /tbl[symbol] := table() /tbl[symbol][state] := "" # If this action is already present, then don't re-enter it. Just # fail. # tbl[symbol][state] ? { while a := tab(any('sra')) do { a ||:= tab(upto('.<')) a ||:= { (="<" || tab(find(">")+1)) | ="." } a ||:= tab(many(&digits)) if a == action then fail } } # Get rule number for the new action specified as arg 5, and # fetch its source production. action ? { case move(1) of { "s": ruleno := (tab(find(".")+1), tab(many(&digits))) "r": ruleno := 1(tab(find("<")), move(1)) "a": return tbl[symbol][state] := action || tbl[symbol][state] } | iohno(70, tbl[symbol][state]) (newp := !st).no = ruleno | iohno(72, tbl[symbol][state]) } # Resolve any conflicts that might be present. # actions := "" tbl[symbol][state] ? { while a := tab(any('sra')) do { # Snip out the old action, and put it into a. a ||:= tab(upto('.<')) a ||:= { (="<" || tab(find(">")+1)) | ="." } a ||:= tab(many(&digits)) # # Get the old action's rule number, and use it to fetch # the full production that it is keyed to. # a ? { case move(1) of { "s": ruleno := (tab(find(".")+1), tab(many(&digits))) "r": ruleno := 1(tab(find("<")), move(1)) "a": return tbl[symbol][state] := a || actions || action } | iohno(70, tbl[symbol][state]) # Go through rule list; find the one whose number is ruleno. (p := !st).no = ruleno | iohno(71, tbl[symbol][state]) } # Check precedences to see if we can resolve the conflict # this way. # if \newp.prec > \p.prec then # discard the old action, a return tbl[symbol][state] := actions || action || tab(0) else if \newp.prec < \p.prec then # discard the new action, action return tbl[symbol][state] := actions || a || tab(0) else { # # If, however, both precedences are the same (i.e. # newp.prec === p.prec), then we must check the # associativities. Right implies shift; left, reduce. # If there is no associativity, then we have a # conflict. Nonassociative ("n") implies error. # case action[1] of { default: iohno(70, tbl[symbol][state]) # case "a" is handled above; look for "s" & "r" "s" : { if a[1] == "s" then fail # no shift/shift "conflict" else if a[1] == "r" then { newp.assoc === p.assoc | { iohno(40, "state " || state || "; token " || symbol || "; rules " || newp.no || "," || p.no) } case newp.assoc of { "n" : iohno(41, production_2_string(newp)) &null: { # no associativity given if \noconflict & /like_yacc then iohno(46, "state " || state || "; token " || symbol || "; rules " || newp.no || "," || p.no) else { write(&errout, "warning: shift/reduce", " conflict in state " || state || "; token " || symbol || "; rules " || newp.no || "," || p.no) if \like_yacc then { write(&errout, "resolving in _ favor of shift.") return tbl[symbol][state] := actions || action || tab(0) } else { write(&errout, "creating multi-_ action table entry") return tbl[symbol][state] := actions || action || a || tab(0) } } } "l" : { # left associative # discard new action, action return tbl[symbol][state] := actions || a || tab(0) } "r" : { # right associative # remove old action, a return tbl[symbol][state] := actions || action || tab(0) } } } } "r" : { if a[1] == "r" then { # # If conflicts in general, and reduce-reduce # conflicts in specific are not okay... # if \noconflict & /like_yacc then { # ...abort, otherwise... iohno(42, "state " || state || "; token " || symbol || "; " || "; rules " || newp.no || "," || p.no) } else { # # ...flag reduce-reduce conficts, and # then resolve them by their order of # occurrence in the grammar. # write(&errout, "warning: reduce/reduce", " conflict in state ", state, "; token ", symbol, "; rules ", newp.no, ",", p.no) if \like_yacc then { write(&errout, "resolving by order of _ occurrence in the grammar") if newp.no > p.no # discard later production (newp) then return return tbl[symbol][state] := actions || a || tab(0) # discard later production (old p) else return tbl[symbol][state] := actions || action || tab(0) } else { # # If conflicts ok, but we aren't supposed # to resolve reduce-reduce conflicts by # order of rule occurrence: # write(&errout, "creating multi-action _ table entry") return tbl[symbol][state] := actions || action || a || tab(0) } } } else { # associativities must be the same for both rules: newp.assoc === p.assoc | { iohno(40, "state " || state || "; token " || symbol || "; rules " || newp.no || "," || p.no) } case newp.assoc of { "n" : iohno(41, production_2_string(newp)) &null: { if \noconflict & /like_yacc then iohno(46, "state " || state || "; token " || symbol || "; rules " || newp.no || "," || p.no) else { write(&errout, "warning: shift/reduce", " conflict in state " || state || "; token " || symbol || "; rules " || newp.no || "," || p.no) if \like_yacc then { write(&errout, "resolving in _ favor of shift.") return tbl[symbol][state] := actions || a || tab(0) } else { write(&errout, "creating multi-_ action table entry") return tbl[symbol][state] := actions || action || a || tab(0) } } } "r" : { # discard new action, action return tbl[symbol][state] := actions || a || tab(0) } "l" : { # remove old action, a return tbl[symbol][state] := actions || action || tab(0) } } } } } } } } return tbl[symbol][state] ||:= action end icon-9.4.3/ipl/packs/ibpag2/itokens.icn0000664000175000017500000007300607140713043017210 0ustar chrishchrish############################################################################ # # Name: itokens.icn # # Title: itokens (Icon source-file tokenizer) # # Author: Richard L. Goerwitz # # Version: 1.11 # ############################################################################ # # This file contains itokens() - a utility for breaking Icon source # files up into individual tokens. This is the sort of routine one # needs to have around when implementing things like pretty printers, # preprocessors, code obfuscators, etc. It would also be useful for # implementing cut-down implementations of Icon written in Icon - the # sort of thing one might use in an interactive tutorial. # # Itokens(f, x) takes, as its first argument, f, an open file, and # suspends successive TOK records. TOK records contain two fields. # The first field, sym, contains a string that represents the name of # the next token (e.g. "CSET", "STRING", etc.). The second field, # str, gives that token's literal value. E.g. the TOK for a literal # semicolon is TOK("SEMICOL", ";"). For a mandatory newline, itokens # would suspend TOK("SEMICOL", "\n"). # # Unlike Icon's own tokenizer, itokens() does not return an EOFX # token on end-of-file, but rather simply fails. It also can be # instructed to return syntactically meaningless newlines by passing # it a nonnull second argument (e.g. itokens(infile, 1)). These # meaningless newlines are returned as TOK records with a null sym # field (i.e. TOK(&null, "\n")). # # NOTE WELL: If new reserved words or operators are added to a given # implementation, the tables below will have to be altered. Note # also that &keywords should be implemented on the syntactic level - # not on the lexical one. As a result, a keyword like &features will # be suspended as TOK("CONJUNC", "&") and TOK("IDENT", "features"). # ############################################################################ # # Links: slshupto # # Requires: coexpressions # ############################################################################ #link ximage, slshupto link slshupto #make sure you have version 1.2 or above global next_c, line_number record TOK(sym, str) # # main: an Icon source code uglifier # # Stub main for testing; uncomment & compile. The resulting # executable will act as an Icon file compressor, taking the # standard input and outputting Icon code stripped of all # unnecessary whitespace. Guaranteed to make the code a visual # mess :-). # #procedure main() # # local separator, T # separator := "" # every T := itokens(&input) do { # if any(&digits ++ &letters ++ '_.', \T.str, 1, 2) & \T.sym ~== "DOT" # then writes(separator) # if T.sym == "SEMICOL" then writes(";") else writes(T.str) # if any(&digits ++ &letters ++ '_.', \T.str, -1, 0) & \T.sym ~== "DOT" # then separator := " " else separator := "" # } # #end # # itokens: file x anything -> TOK records (a generator) # (stream, nostrip) -> Rs # # Where stream is an open file, anything is any object (it only # matters whether it is null or not), and Rs are TOK records. # Note that itokens strips out useless newlines. If the second # argument is nonnull, itokens does not strip out superfluous # newlines. It may be useful to keep them when the original line # structure of the input file must be maintained. # procedure itokens(stream, nostrip) local T, last_token # initialize to some meaningless value last_token := TOK() every T := \iparse_tokens(stream) do { if \T.sym then { if T.sym == "EOFX" then fail else { # # If the last token was a semicolon, then interpret # all ambiguously unary/binary sequences like "**" as # beginners (** could be two unary stars or the [c]set # intersection operator). # if \last_token.sym == "SEMICOL" then suspend last_token := expand_fake_beginner(T) else suspend last_token := T } } else { if \nostrip then suspend last_token := T } } end # # expand_fake_beginner: TOK record -> TOK records # # Some "beginner" tokens aren't really beginners. They are token # sequences that could be either a single binary operator or a # series of unary operators. The tokenizer's job is just to snap # up as many characters as could logically constitute an operator. # Here is where we decide whether to break the sequence up into # more than one op or not. # procedure expand_fake_beginner(next_token) static exptbl initial { exptbl := table() insert(exptbl, "CONCAT", [TOK("BAR", "|"), TOK("BAR", "|")]) insert(exptbl, "DIFF", [TOK("MINUS", "-"), TOK("MINUS", "-")]) insert(exptbl, "EQUIV", [TOK("NUMEQ", "="), TOK("NUMEQ", "="), TOK("NUMEQ", "=")]) insert(exptbl, "INTER", [TOK("STAR", "*"), TOK("STAR", "*")]) insert(exptbl, "LCONCAT", [TOK("BAR", "|"), TOK("BAR", "|"), TOK("BAR", "|")]) insert(exptbl, "LEXEQ", [TOK("NUMEQ", "="), TOK("NUMEQ", "=")]) insert(exptbl, "LEXNE", [TOK("TILDE", "~"), TOK("NUMEQ", "="), TOK("NUMEQ", "=")]) insert(exptbl, "NOTEQUIV",[TOK("TILDE", "~"), TOK("NUMEQ","="), TOK("NUMEQ", "="), TOK("NUMEQ", "=")]) insert(exptbl, "NUMNE", [TOK("TILDE", "~"), TOK("NUMEQ","=")]) insert(exptbl, "UNION", [TOK("PLUS", "+"), TOK("PLUS", "+")]) } if \exptbl[next_token.sym] then suspend !exptbl[next_token.sym] else return next_token end # # iparse_tokens: file -> TOK records (a generator) # (stream) -> tokens # # Where file is an open input stream, and tokens are TOK records # holding both the token type and actual token text. # # TOK records contain two parts, a preterminal symbol (the first # "sym" field), and the actual text of the token ("str"). The # parser only pays attention to the sym field, although the # strings themselves get pushed onto the value stack. # # Note the following kludge: Unlike real Icon tokenizers, this # procedure returns syntactially meaningless newlines as TOK # records with a null sym field. Normally they would be ignored. # I wanted to return them so they could be printed on the output # stream, thus preserving the line structure of the original # file, and making later diagnostic messages more usable. # procedure iparse_tokens(stream, getchar) local elem, whitespace, token, last_token, primitives, reserveds static be_tbl, reserved_tbl, operators initial { # Primitive Tokens # primitives := [ ["identifier", "IDENT", "be"], ["integer-literal", "INTLIT", "be"], ["real-literal", "REALLIT", "be"], ["string-literal", "STRINGLIT", "be"], ["cset-literal", "CSETLIT", "be"], ["end-of-file", "EOFX", "" ]] # Reserved Words # reserveds := [ ["break", "BREAK", "be"], ["by", "BY", "" ], ["case", "CASE", "b" ], ["create", "CREATE", "b" ], ["default", "DEFAULT", "b" ], ["do", "DO", "" ], ["else", "ELSE", "" ], ["end", "END", "b" ], ["every", "EVERY", "b" ], ["fail", "FAIL", "be"], ["global", "GLOBAL", "" ], ["if", "IF", "b" ], ["initial", "INITIAL", "b" ], ["invocable", "INVOCABLE", "" ], ["link", "LINK", "" ], ["local", "LOCAL", "b" ], ["next", "NEXT", "be"], ["not", "NOT", "b" ], ["of", "OF", "" ], ["procedure", "PROCEDURE", "" ], ["record", "RECORD", "" ], ["repeat", "REPEAT", "b" ], ["return", "RETURN", "be"], ["static", "STATIC", "b" ], ["suspend", "SUSPEND", "be"], ["then", "THEN", "" ], ["to", "TO", "" ], ["until", "UNTIL", "b" ], ["while", "WHILE", "b" ]] # Operators # operators := [ [":=", "ASSIGN", "" ], ["@", "AT", "b" ], ["@:=", "AUGACT", "" ], ["&:=", "AUGAND", "" ], ["=:=", "AUGEQ", "" ], ["===:=", "AUGEQV", "" ], [">=:=", "AUGGE", "" ], [">:=", "AUGGT", "" ], ["<=:=", "AUGLE", "" ], ["<:=", "AUGLT", "" ], ["~=:=", "AUGNE", "" ], ["~===:=", "AUGNEQV", "" ], ["==:=", "AUGSEQ", "" ], [">>=:=", "AUGSGE", "" ], [">>:=", "AUGSGT", "" ], ["<<=:=", "AUGSLE", "" ], ["<<:=", "AUGSLT", "" ], ["~==:=", "AUGSNE", "" ], ["\\", "BACKSLASH", "b" ], ["!", "BANG", "b" ], ["|", "BAR", "b" ], ["^", "CARET", "b" ], ["^:=", "CARETASGN", "b" ], [":", "COLON", "" ], [",", "COMMA", "" ], ["||", "CONCAT", "b" ], ["||:=", "CONCATASGN","" ], ["&", "CONJUNC", "b" ], [".", "DOT", "b" ], ["--", "DIFF", "b" ], ["--:=", "DIFFASGN", "" ], ["===", "EQUIV", "b" ], ["**", "INTER", "b" ], ["**:=", "INTERASGN", "" ], ["{", "LBRACE", "b" ], ["[", "LBRACK", "b" ], ["|||", "LCONCAT", "b" ], ["|||:=", "LCONCATASGN","" ], ["==", "LEXEQ", "b" ], [">>=", "LEXGE", "" ], [">>", "LEXGT", "" ], ["<<=", "LEXLE", "" ], ["<<", "LEXLT", "" ], ["~==", "LEXNE", "b" ], ["(", "LPAREN", "b" ], ["-:", "MCOLON", "" ], ["-", "MINUS", "b" ], ["-:=", "MINUSASGN", "" ], ["%", "MOD", "" ], ["%:=", "MODASGN", "" ], ["~===", "NOTEQUIV", "b" ], ["=", "NUMEQ", "b" ], [">=", "NUMGE", "" ], [">", "NUMGT", "" ], ["<=", "NUMLE", "" ], ["<", "NUMLT", "" ], ["~=", "NUMNE", "b" ], ["+:", "PCOLON", "" ], ["+", "PLUS", "b" ], ["+:=", "PLUSASGN", "" ], ["?", "QMARK", "b" ], ["<-", "REVASSIGN", "" ], ["<->", "REVSWAP", "" ], ["}", "RBRACE", "e" ], ["]", "RBRACK", "e" ], [")", "RPAREN", "e" ], [";", "SEMICOL", "" ], ["?:=", "SCANASGN", "" ], ["/", "SLASH", "b" ], ["/:=", "SLASHASGN", "" ], ["*", "STAR", "b" ], ["*:=", "STARASGN", "" ], [":=:", "SWAP", "" ], ["~", "TILDE", "b" ], ["++", "UNION", "b" ], ["++:=", "UNIONASGN", "" ], ["$(", "LBRACE", "b" ], ["$)", "RBRACE", "e" ], ["$<", "LBRACK", "b" ], ["$>", "RBRACK", "e" ], ["$", "RHSARG", "b" ], ["%$(", "BEGGLOB", "b" ], ["%$)", "ENDGLOB", "e" ], ["%{", "BEGGLOB", "b" ], ["%}", "ENDGLOB", "e" ], ["%%", "NEWSECT", "be"]] # static be_tbl, reserved_tbl reserved_tbl := table() every elem := !reserveds do insert(reserved_tbl, elem[1], elem[2]) be_tbl := table() every elem := !primitives | !reserveds | !operators do { insert(be_tbl, elem[2], elem[3]) } } /getchar := create { line_number := 0 ! ( 1(!stream, line_number +:=1) || "\n" ) } whitespace := ' \t' /next_c := @getchar | { if \stream then return TOK("EOFX") else fail } repeat { case next_c of { "." : { # Could be a real literal *or* a dot operator. Check # following character to see if it's a digit. If so, # it's a real literal. We can only get away with # doing the dot here because it is not a substring of # any longer identifier. If this gets changed, we'll # have to move this code into do_operator(). # last_token := do_dot(getchar) suspend last_token # write(&errout, "next_c == ", image(next_c)) next } "\n" : { # If do_newline fails, it means we're at the end of # the input stream, and we should break out of the # repeat loop. # every last_token := do_newline(getchar, last_token, be_tbl) do suspend last_token if next_c === &null then break next } "\#" : { # Just a comment. Strip it by reading every character # up to the next newline. The global var next_c # should *always* == "\n" when this is done. # do_number_sign(getchar) # write(&errout, "next_c == ", image(next_c)) next } "\"" : { # Suspend as STRINGLIT everything from here up to the # next non-backslashed quotation mark, inclusive # (accounting for the _ line-continuation convention). # last_token := do_quotation_mark(getchar) suspend last_token # write(&errout, "next_c == ", image(next_c)) next } "'" : { # Suspend as CSETLIT everything from here up to the # next non-backslashed apostrophe, inclusive. # last_token := do_apostrophe(getchar) suspend last_token # write(&errout, "next_c == ", image(next_c)) next } &null : stop("iparse_tokens (lexer): unexpected EOF") default : { # If we get to here, we have either whitespace, an # integer or real literal, an identifier or reserved # word (both get handled by do_identifier), or an # operator. The question of which we have can be # determined by checking the first character. # if any(whitespace, next_c) then { # Like all of the TOK forming procedures, # do_whitespace resets next_c. do_whitespace(getchar, whitespace) # don't suspend any tokens next } if any(&digits, next_c) then { last_token := do_digits(getchar) suspend last_token next } if any(&letters ++ '_', next_c) then { last_token := do_identifier(getchar, reserved_tbl) suspend last_token next } # write(&errout, "it's an operator") last_token := do_operator(getchar, operators) suspend last_token next } } } # If stream argument is nonnull, then we are in the top-level # iparse_tokens(). If not, then we are in a recursive call, and # we should not emit all this end-of-file crap. # if \stream then { return TOK("EOFX") } else fail end # # do_dot: coexpression -> TOK record # getchar -> t # # Where getchar is the coexpression that produces the next # character from the input stream and t is a token record whose # sym field contains either "REALLIT" or "DOT". Essentially, # do_dot checks the next char on the input stream to see if it's # an integer. Since the preceding char was a dot, an integer # tips us off that we have a real literal. Otherwise, it's just # a dot operator. Note that do_dot resets next_c for the next # cycle through the main case loop in the calling procedure. # procedure do_dot(getchar) local token # global next_c # write(&errout, "it's a dot") # If dot's followed by a digit, then we have a real literal. # if any(&digits, next_c := @getchar) then { # write(&errout, "dot -> it's a real literal") token := "." || next_c while any(&digits, next_c := @getchar) do token ||:= next_c if token ||:= (next_c == ("e"|"E")) then { while (next_c := @getchar) == "0" while any(&digits, next_c) do { token ||:= next_c next_c = @getchar } } return TOK("REALLIT", token) } # Dot not followed by an integer; so we just have a dot operator, # and not a real literal. # # write(&errout, "dot -> just a plain dot") return TOK("DOT", ".") end # # do_newline: coexpression x TOK record x table -> TOK records # (getchar, last_token, be_tbl) -> Ts (a generator) # # Where getchar is the coexpression that returns the next # character from the input stream, last_token is the last TOK # record suspended by the calling procedure, be_tbl is a table of # tokens and their "beginner/ender" status, and Ts are TOK # records. Note that do_newline resets next_c. Do_newline is a # mess. What it does is check the last token suspended by the # calling procedure to see if it was a beginner or ender. It # then gets the next token by calling iparse_tokens again. If # the next token is a beginner and the last token is an ender, # then we have to suspend a SEMICOL token. In either event, both # the last and next token are suspended. # procedure do_newline(getchar, last_token, be_tbl) local next_token # global next_c # write(&errout, "it's a newline") # Go past any additional newlines. # while next_c == "\n" do { # NL can be the last char in the getchar stream; if it *is*, # then signal that it's time to break out of the repeat loop # in the calling procedure. # next_c := @getchar | { next_c := &null fail } suspend TOK(&null, next_c == "\n") } # If there was a last token (i.e. if a newline wasn't the first # character of significance in the input stream), then check to # see if it was an ender. If so, then check to see if the next # token is a beginner. If so, then suspend a TOK("SEMICOL") # record before suspending the next token. # if find("e", be_tbl[(\last_token).sym]) then { # write(&errout, "calling iparse_tokens via do_newline") # &trace := -1 # First arg to iparse_tokens can be null here. \ (next_token := iparse_tokens(&null, getchar)).sym if \next_token then { # write(&errout, "call of iparse_tokens via do_newline yields ", # ximage(next_token)) if find("b", be_tbl[next_token.sym]) then suspend TOK("SEMICOL", "\n") # # See below. If this were like the real Icon parser, # the following line would be commented out. # else suspend TOK(&null, "\n") return next_token } else { # # If this were a *real* Icon tokenizer, it would not emit # any record here, but would simply fail. Instead, we'll # emit a dummy record with a null sym field. # return TOK(&null, "\n") # &trace := 0 # fail } } # See above. Again, if this were like Icon's own tokenizer, we # would just fail here, and not return any TOK record. # # &trace := 0 return TOK(&null, "\n") # fail end # # do_number_sign: coexpression -> &null # getchar -> # # Where getchar is the coexpression that pops characters off the # main input stream. Sets the global variable next_c. This # procedure simply reads characters until it gets a newline, then # returns with next_c == "\n". Since the starting character was # a number sign, this has the effect of stripping comments. # procedure do_number_sign(getchar) # global next_c # write(&errout, "it's a number sign") while next_c ~== "\n" do { next_c := @getchar } # Return to calling procedure to cycle around again with the new # next_c already set. Next_c should always be "\n" at this point. return end # # do_quotation_mark: coexpression -> TOK record # getchar -> t # # Where getchar is the coexpression that yields another character # from the input stream, and t is a TOK record with "STRINGLIT" # as its sym field. Puts everything upto and including the next # non-backslashed quotation mark into the str field. Handles the # underscore continuation convention. # procedure do_quotation_mark(getchar) local token # global next_c # write(&errout, "it's a string literal") token := "\"" next_c := @getchar repeat { if next_c == "\n" & token[-1] == "_" then { token := token[1:-1] while any('\t ', next_c := @getchar) next } else { if slshupto('"', token ||:= next_c, 2) then { next_c := @getchar # resume outermost (repeat) loop in calling procedure, # with the new (here explicitly set) next_c return TOK("STRINGLIT", token) } next_c := @getchar } } end # # do_apostrophe: coexpression -> TOK record # getchar -> t # # Where getchar is the coexpression that yields another character # from the input stream, and t is a TOK record with "CSETLIT" # as its sym field. Puts everything upto and including the next # non-backslashed apostrope into the str field. # procedure do_apostrophe(getchar) local token # global next_c # write(&errout, "it's a cset literal") token := "'" next_c := @getchar repeat { if next_c == "\n" & token[-1] == "_" then { token := token[1:-1] while any('\t ', next_c := @getchar) next } else { if slshupto("'", token ||:= next_c, 2) then { next_c := @getchar # Return & resume outermost containing loop in calling # procedure w/ new next_c. return TOK("CSETLIT", token) } next_c := @getchar } } end # # do_digits: coexpression -> TOK record # getchar -> t # # Where getchar is the coexpression that produces the next char # on the input stream, and where t is a TOK record containing # either "REALLIT" or "INTLIT" in its sym field, and the text of # the numeric literal in its str field. # procedure do_digits(getchar) local token, tok_record, extras, digits, over # global next_c # For bases > 16 extras := "AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz" # Assume integer literal until proven otherwise.... tok_record := TOK("INTLIT") # write(&errout, "it's an integer or real literal") token := ("0" ~== next_c) | "" while any(&digits, next_c := @getchar) do token ||:= next_c if token ||:= (next_c == ("R"|"r")) then { digits := &digits if over := ((10 < token[1:-1]) - 10) * 2 then digits ++:= extras[1:over+1] | extras next_c := @getchar if next_c == "-" then { token ||:= next_c next_c := @getchar } while any(digits, next_c) do { token ||:= next_c next_c := @getchar } } else { if token ||:= (next_c == ".") then { while any(&digits, next_c := @getchar) do token ||:= next_c tok_record := TOK("REALLIT") } if token ||:= (next_c == ("e"|"E")) then { next_c := @getchar if next_c == "-" then { token ||:= next_c next_c := @getchar } while any(&digits, next_c) do { token ||:= next_c next_c := @getchar } tok_record := TOK("REALLIT") } } tok_record.str := ("" ~== token) | "0" return tok_record end # # do_whitespace: coexpression x cset -> &null # getchar x whitespace -> &null # # Where getchar is the coexpression producing the next char on # the input stream. Do_whitespace just repeats until it finds a # non-whitespace character, whitespace being defined as # membership of a given character in the whitespace argument (a # cset). # procedure do_whitespace(getchar, whitespace) # write(&errout, "it's junk") while any(whitespace, next_c) do next_c := @getchar return end # # do_identifier: coexpression x table -> TOK record # (getchar, reserved_tbl) -> t # # Where getchar is the coexpression that pops off characters from # the input stream, reserved_tbl is a table of reserved words # (keys = the string values, values = the names qua symbols in # the grammar), and t is a TOK record containing all subsequent # letters, digits, or underscores after next_c (which must be a # letter or underscore). Note that next_c is global and gets # reset by do_identifier. # procedure do_identifier(getchar, reserved_tbl) local token # global next_c # write(&errout, "it's an indentifier") token := next_c while any(&letters ++ &digits ++ '_', next_c := @getchar) do token ||:= next_c return TOK(\reserved_tbl[token], token) | TOK("IDENT", token) end # # do_operator: coexpression x list -> TOK record # (getchar, operators) -> t # # Where getchar is the coexpression that produces the next # character on the input stream, operators is the operator list, # and where t is a TOK record describing the operator just # scanned. Calls recognop, which creates a DFSA to recognize # valid Icon operators. Arg2 (operators) is the list of lists # containing valid Icon operator string values and names (see # above). # procedure do_operator(getchar, operators) local token, elem token := next_c # Go until recognop fails. while elem := recognop(operators, token, 1) do token ||:= (next_c := @getchar) # write(&errout, ximage(elem)) if *\elem = 1 then return TOK(elem[1][2], elem[1][1]) else fail end record dfstn_state(b, e, tbl) record start_state(b, e, tbl, master_list) # # recognop: list x string x integer -> list # (l, s, i) -> l2 # # Where l is the list of lists created by the calling procedure # (each element contains a token string value, name, and # beginner/ender string), where s is a string possibly # corresponding to a token in the list, where i is the position in # the elements of l where the operator string values are recorded, # and where l2 is a list of elements from l that contain operators # for which string s is an exact match. Fails if there are no # operators that s is a prefix of, but returns an empty list if # there just aren't any that happen to match exactly. # # What this does is let the calling procedure just keep adding # characters to s until recognop fails, then check the last list # it returned to see if it is of length 1. If it is, then it # contains list with the vital stats for the operator last # recognized. If it is of length 0, then string s did not # contain any recognizable operator. # procedure recognop(l, s, i) local current_state, master_list, c, result, j static dfstn_table initial dfstn_table := table() /i := 1 # See if we've created an automaton for l already. /dfstn_table[l] := start_state(1, *l, &null, &null) & { dfstn_table[l].master_list := sortf(l, i) } current_state := dfstn_table[l] # Save master_list, as current_state will change later on. master_list := current_state.master_list s ? { while c := move(1) do { # Null means that this part of the automaton isn't # complete. # if /current_state.tbl then create_arcs(master_list, i, current_state, &pos) # If the table has been clobbered, then there are no arcs # leading out of the current state. Fail. # if current_state.tbl === 0 then fail # write(&errout, "c = ", image(c)) # write(&errout, "table for current state = ", # ximage(current_state.tbl)) # If we get to here, the current state has arcs leading # out of it. See if c is one of them. If so, make the # node to which arc c is connected the current state. # Otherwise fail. # current_state := \current_state.tbl[c] | fail } } # Return possible completions. # result := list() every j := current_state.b to current_state.e do { if *master_list[j][i] = *s then put(result, master_list[j]) } # return empty list if nothing the right length is found return result end # # create_arcs: fill out a table of arcs leading out of the current # state, and place that table in the tbl field for # current_state # procedure create_arcs(master_list, field, current_state, POS) local elem, i, first_char, old_first_char current_state.tbl := table() old_first_char := "" every elem := master_list[i := current_state.b to current_state.e][field] do { # Get the first character for the current position (note that # we're one character behind the calling routine; hence # POS-1). # first_char := elem[POS-1] | next # If we have a new first character, create a new arc out of # the current state. # if first_char ~== old_first_char then { # Store the start position for the current character. current_state.tbl[first_char] := dfstn_state(i) # Store the end position for the old character. (\current_state.tbl[old_first_char]).e := i-1 old_first_char := first_char } } (\current_state.tbl[old_first_char]).e := i # Clobber table with 0 if no arcs were added. current_state.tbl := (*current_state.tbl = 0) return current_state end icon-9.4.3/ipl/packs/ibpag2/ibreader.icn0000664000175000017500000004111107140713043017301 0ustar chrishchrish############################################################################ # # Name: ibreader.icn # # Title: reader for Ibpag2 source files # # Author: Richard L. Goerwitz # # Version: 1.29 # ############################################################################ # # This file contains a collection of procedures that 1) read in an # Ibpag2 source file, 2) output token defines, 3) emit action code, # and finally 4) pass a start symbol, list of productions, and token # table back to the calling procedure. Described formally: # # ibreader: file x file x string -> ib_grammar record # (in, out, module) -> grammar # # In is the input stream; out is the output stream; module is an # optional string that distinguishes this grammar from others that # might also be running simultaneously. Grammar is an ib_grammar # record containing the start symbol in its first field and the # production list in its second. Its third field contains a table # used to map integers to actual token names or character literals, # i.e. its keys are things like -1, 0, etc. and its values are things # like "error," "EOF," etc. # # Note that if a module argument is supplied to ibreader(), one must # also be supplied to ibwriter(). See ibwriter.icn. # # The format of the input file is highly reminiscent of YACC. It # consists of three basic sections, the first two of which are # followed by %%. See the main documentation to Ibpag2 for # specifics. Major differences between Ibpag2 and YACC input format # include: # # 1) "$$ = x" constructs are replaced by "return x" (e.g. "$$ = # $1 + $3" -> "return $1 + $3") # # 2) all variables within a given action are, by default, local # to that action; i.e. they cannot be accessed by other # actions unless you declare them global elsewhere (e.g. in # the pass-through part of the declarations section %{ ... %}) # # 3) the %union declaration is not needed by Ibpag # # 4) tokens and symbols are separated from each other by a comma # (e.g. %token '+', '-' and S : NP, VP) # # 5) epsilon is indicated by the keyword "epsilon" (e.g. REL : # epsilon) # # 6) both epsilon and error *may* be declared as %tokens for # reasons of precedence, although they retain hard-coded # internal values (-2 and -1, respectively) # # 7) all actions must follow the last RHS symbol of the rule they # apply to (preceded by an optional %prec directive); to # achieve S : NP { action1 }, VP { action2 }, insert a dummy # rule: S : NP, dummy, VP { action2 }; dummy : epsilon { # action1 } ; # # 8) YYERROR, YYACCEPT, yyclearin, and yyerrok are the same, # except they are written IIERROR, IIACCEPT, iiclearin, and # iierrok (i.e. "ii" replaces "yy") # # 9) Ibpag2's input files are tokenized like modified Icon files, # and, as a consequence, Icon's reserved words must not be # used as symbols (e.g. "if : if, then" is no go) # ############################################################################ # # Links: itokens, escape # # See also: ibwriter # ############################################################################ #link itokens, escape link escape record ib_grammar(start, rules, tbl) record tokstats(str, no, prec, assoc) # Declared in itokens.icn: # global line_number # # ibreader: file x file x string x string -> ib_grammar record # (in, out, module, source_fname) -> grammar # # Where in is an input stream, out is an output stream, module is # some string uniquely identifying this module (optional), and # where grammar is an ib_grammar record containing the start # symbol in its first field and a list of production records in # its second. Source_fname is the string name of Ibpag2's input # grammar file. Defaults to "source file." # procedure ibreader(in, out, module, source_fname) local tmp, grammar, toktbl, next_token, next_token_no_nl, token, LHS, t /source_fname := "source file" grammar := ib_grammar(&null, list(), table()) toktbl := table() next_token := create itokens(in, 1) next_token_no_nl := create 1(tmp := |@next_token, \tmp.sym) token := @next_token_no_nl | iohno(4) # Do the %{ $} and %token stuff, i.e. everything up to %% # (NEWSECT). # until token.sym == "NEWSECT" do { case token.sym of { default : { iohno(48, "token "||image(token.str) ||"; line "|| line_number) } "SEMICOL" : { # Skip semicolon. Get another token while we're at it. token := @next_token_no_nl | iohno(47, "line "||line_number) } "BEGGLOB" : { write(out, "\n$line ", line_number, " ", image(source_fname)) # Copy token values to out until we reach "%}" (ENDGLOB). (token := copy_icon_stuff(next_token, out)).sym == "ENDGLOB" token := @next_token_no_nl } "MOD" : { (token := @next_token_no_nl).sym == "IDENT" | iohno(30, "line " || line_number) # # Read in token declarations, set associativity and # precedences, and enter the tokens into toktbl. # token := { case token.str of { default : iohno(30, "line " || line_number) "token" : read_decl(next_token_no_nl, toktbl, &null) "right" : read_decl(next_token_no_nl, toktbl, "r") "left" : read_decl(next_token_no_nl, toktbl, "l") "nonassoc": read_decl(next_token_no_nl, toktbl, "n") "union" : iohno(45, "line "|| line_number) "start" : { (token := @next_token_no_nl).sym == "IDENT" | iohno(31, "line " || line_number) /grammar.start := token.str | iohno(32, "line " || line_number) @next_token_no_nl | iohno(4) } } } } } } # Skip past %% (NEWSECT) and semicolon (if present). token := @next_token_no_nl | iohno(47, "line "|| line_number) (token := token | @next_token_no_nl | iohno(4)).sym ~== "SEMICOL" token.sym == "NEWSECT" & iohno(47, "line "|| line_number) # # Fetch start symbol if it wasn't defined above via %start; by # default the start symbol is the LHS of rule 1. # /grammar.start := token.str # Having reached the end of the declarations section, we can now # copy out a define for each token number, not counting character # literals (which are stored as integers). While we're at it, # create a table that maps token numbers back to character # literals and strings (for use in later verbose and debugging # displays). # write(out, "\n") every t := !toktbl do { if type(t.str) == "integer" then insert(grammar.tbl, t.no, image(char(t.str))) else { insert(grammar.tbl, t.no, t.str) write(out, "$define ", t.str, "\t", t.no) } } # Now, finally, read in rules up until we reach EOF or %% (i.e. # NEWSECT). EOF is signaled below by failure of read_RHS(). # until token.sym == "NEWSECT" do { token.sym == "IDENT" | iohno(33, token.str ||" line "|| line_number) LHS := token.str token := @next_token_no_nl | iohno(4) token.sym == "COLON" | iohno(34, token.str ||" line "|| line_number) # # Read in RHS, then the action (if any) then the prec (if # any). If we see a BAR, then repeat, re-using the same # left-hand side symbol. # while token := read_RHS(next_token, next_token_no_nl, out, toktbl, LHS, grammar, module, source_fname) | # if read_RHS fails, we're at EOF break break do token.sym == "BAR" | break } # Copy the remainder of the file to out as Icon code. write(out, "\n$line ", line_number, " ", image(source_fname)) every copy_icon_stuff(next_token, out, "EOFX") # Do final setup on the reverse token table. This table will be # used later to map integers to their original names in verbose or # debugging displays. # insert(grammar.tbl, 0, "$") return grammar end # # copy_icon_stuff: coexpression x file x string -> ib_TOK records # (next_token, out, except) -> token records # # Copy Icon code to output stream, also suspending as we go. # Insert separators between tokens where needed. Do not output # any token whose sym field matches except. The point in # suspending tokens as we go is to enable the calling procedure to # look for signal tokens that indicate insertion or termination # points. # procedure copy_icon_stuff(next_token, out, except) local separator, T separator := "" while T := @next_token do { if \T.sym then suspend T if \T.sym == \except then next if any(&digits ++ &letters ++ '_.', \T.str, 1, 2) & \T.sym ~== "DOT" then writes(out, separator) writes(out, T.str) if any(&digits ++ &letters ++ '_.', \T.str, -1, 0) & \T.sym ~== "DOT" then separator := " " else separator := "" } # unexpected EOF error (except === "EOFX") | iohno(4) end # # read_decl: coexpression x table x string -> ib_TOK # (next_token_no_nl, toktbl, assoc) -> token # # Read in token declarations, assigning them the correct # precedence and associativity. Number the tokens for later # $define preprocessor directives. When done, return the last # token processed. Toktbl is the table that holds the stats for # each declared token. # procedure read_decl(next_token_no_nl, toktbl, assoc) local token, c static token_no, prec initial { token_no := 256 prec := 0 } # All tokens in this list have the same prec and assoc. # Precedence is determined by order. Associativity is determined # by keyword in the calling procedure, and is passed as arg 3. # prec +:= 1 assoc === ("n"|"r"|"l"|&null) | iohno(5, image(assoc)) # As long as we find commas and token names, keep on adding tokens # to the token table. Return the unused token when done. If we # reach EOF, there's been an error. # repeat { token := @next_token_no_nl | iohno(4) case token.sym of { default : iohno(31, token.str ||" line "|| line_number) "CSETLIT" | "STRING": { # Enter character literals as integers. *escape(token.str[2:-1]) = 1 | iohno(49, token.str) c := ord(escape(token.str[2:-1])) toktbl[c] := tokstats(c, c, prec, assoc) } "IDENT" : { case token.str of { "error" : toktbl[token.str] := tokstats("error", -1, prec, assoc) "epsilon": toktbl[token.str] := tokstats("epsilon",-2,prec, assoc) default : { # Enter TOKENs as string-keyed records in toktbl. token_no +:= 1 toktbl[token.str] := tokstats(token.str, token_no, prec, assoc) } } } } # As long as we're seeing commas, go back for more tokens. token := @next_token_no_nl | iohno(4) token.sym == "COMMA" | break } # Skip past semicolon, if present (as set up now, it shouldn't be). (token := token | @next_token_no_nl | iohno(4)).sym ~== "SEMICOL" return token end # # read_RHS: coexpression x coexpression x file x table x # string x ib_grammar record x string x string -> token # # Read_RHS goes through the RHS of rule definitions, inserting the # resulting productions into a master rule list. At the same # time, it outputs the actions corresponding to those productions # as procedures that are given names corresponding to the numbers # of the productions. I.e. production 1, if endowed with an { # action }, will correspond to procedure _1_. Prec and assoc are # automatically set to that of the last RHS nonterminal, but this # may be changed explicitly by the %prec keyword, as in YACC. # Source_fname is the name of the source grammar file we're pro- # cessing (caller will give us some reasonable default if we're # reading &input). # # Fails on EOF. # procedure read_RHS(next_token, next_token_no_nl, out, toktbl, LHS, grammar, module, source_fname) local token, rule, c static rule_no initial rule_no := 0 rule_no +:= 1 # LHS RHS POS LOOK no prec assoc rule := production(LHS, list(), &null, &null, rule_no, &null, &null) put(grammar.rules, rule) # Read in RHS symbols. # repeat { token := @next_token_no_nl | iohno(4) case token.sym of { default : iohno(35, "token "|| image(token.str)||"; line "|| line_number) "CSETLIT" | "STRING": { *escape(token.str[2:-1]) = 1 | iohno(49, token.str) c := ord(escape(token.str[2:-1])) if \toktbl[c] then { rule.prec := toktbl[c].prec rule.assoc := toktbl[c].assoc } # literals not declared earlier will get caught here else insert(grammar.tbl, c, image(char(c))) put(rule.RHS, c) } "IDENT" : { # If it's a terminal (i.e. a declared token), assign # this rule its precedence and associativity. If it's # not in toktbl, then it's not a declared token.... if \toktbl[token.str] then { rule.prec := toktbl[token.str].prec rule.assoc := toktbl[token.str].assoc put(rule.RHS, toktbl[token.str].no) if toktbl[token.str].no = -2 then { *rule.RHS > 1 & iohno(44, "line ", line_number) rule.POS := 2 } } # ...undeclared stuff. Could be a nonterminal. If # error and/or epsilon weren't declared as tokens, # they will get caught here, too. else { case token.str of { &null : stop("What is going on here?") default : put(rule.RHS, token.str) "error" : { put(rule.RHS, -1) insert(grammar.tbl, -1, "error") } "epsilon" : { if *put(rule.RHS, -2) > 1 then iohno(44, "line ", line_number) else rule.POS := 2 insert(grammar.tbl, -2, "epsilon") } } } } } # Comma means: Go back for another RHS symbol. token := @next_token_no_nl | fail token.sym == "COMMA" | break } # Skip semicolon token, if present. (token := token | @next_token_no_nl | fail).sym ~== "SEMICOL" # Read and set (optional) precedence. # if token.sym == "MOD" then { token := @next_token_no_nl | iohno(4) (token.sym == "IDENT" & token.str == "prec") | iohno(43, token.str || " line " || line_number) token := @next_token_no_nl | iohno(4) case token.sym of { "CSETLIT" | "STRING" : { *escape(token.str[2:-1]) = 1 | iohno(49, token.str) c := ord(escape(token.str[2:-1])) & rule.prec := toktbl[c].prec & rule.assoc := toktbl[c].assoc } "IDENT" : { \toktbl[token.str] | iohno(43, token.str || " line " || line_number) rule.prec := toktbl[token.str].prec & rule.assoc := toktbl[token.str].assoc } default : 1 = 4 # deliberate failure } | iohno(43, "line ", line_number) token := @next_token_no_nl | fail } # Skip semicolon token, if present. (token := token | @next_token_no_nl | fail).sym ~== "SEMICOL" # Read in (optional) action. # if token.sym == "LBRACE" then { write_action_as_procedure(next_token, out, rule, module, source_fname) token := @next_token_no_nl | fail } # Skip semicolon token, if present. (token := token | @next_token_no_nl | fail).sym ~== "SEMICOL" return token end # # write_action_as_procedure # procedure write_action_as_procedure(next_token, out, rule, module, source_fname) local argstr, bracelevel, token, i, neg /module := "" argstr := "" # # Decide the number of arguments based on the length of the RHS of # rule. Exception: Epsilon productions are empty, and pop nothing # off the stack, so take zero args. # if rule.RHS[1] ~=== -2 then { every argstr ||:= "arg" || (1 to *rule.RHS) || "," argstr := trim(argstr, ',') } write(out, "procedure _", rule.no, "_", module, "(", argstr, ")") write(out, "\n$line ", line_number, " ", image(source_fname)) bracelevel := 1 until bracelevel = 0 do { every token := copy_icon_stuff(next_token, out, "RHSARG") do { case token.sym of { default : next "LBRACE" : bracelevel +:= 1 "RBRACE" : bracelevel -:= 1 "RHSARG" : { until \ (token := @next_token).sym do writes(out, token.str) if neg := (token.sym == "MINUS") then until \ (token := @next_token).sym do writes(out, token.str) else neg := &null token.sym == "INTLIT" | iohno(37, "$"||token.str) if /neg & token.str ~== "0" then { token.str <= *rule.RHS | iohno(38, "$"||token.str) writes(out, " arg", token.str, " ") } else { # Code for $0, $-1, etc. # # Warning! If the name of the stack is changed # in iiparse.lib, it has to be changed here, too. # i := abs(token.str)+1 writes(out, " value_stack", module, "[", i, "] ") } } } if bracelevel = 0 then { write(out, "\nend\n") return token } } } iohno(39, "line "|| line_number) end icon-9.4.3/ipl/packs/ibpag2/rewrap.icn0000664000175000017500000001033207140713043017025 0ustar chrishchrish############################################################################ # # Name: rewrap.icn # # Title: advanced line rewrap utility # # Author: Richard L. Goerwitz # # Version: 1.4 # ############################################################################ # # The procedure rewrap(s,i), included in this file, reformats text # fed to it into strings < i in length. Rewrap utilizes a static # buffer, so it can be called repeatedly with different s arguments, # and still produce homogenous output. This buffer is flushed by # calling rewrap with a null first argument. The default for # argument 2 (i) is 70. # # Here's a simple example of how rewrap could be used. The following # program reads the standard input, producing fully rewrapped output. # # procedure main() # every write(rewrap(!&input)) # write(rewrap()) # end # # Naturally, in practice you would want to do things like check for in- # dentation or blank lines in order to wrap only on a paragraph-by para- # graph basis, as in # # procedure main() # while line := read(&input) do { # if line == "" then { # write("" ~== rewrap()) # write(line) # } else { # if match("\t", line) then { # write(rewrap()) # write(rewrap(line)) # } else { # write(rewrap(line)) # } # } # } # end # # Fill-prefixes can be implemented simply by prepending them to the # output of rewrap: # # i := 70; fill_prefix := " > " # while line := read(input_file) do { # line ?:= (f_bit := tab(many('> ')) | "", tab(0)) # write(fill_prefix || f_bit || rewrap(line, i - *fill_prefix)) # etc. # # Obviously, these examples are fairly simplistic. Putting them to # actual use would certainly require a few environment-specific # modifications and/or extensions. Still, I hope they offer some # indication of the kinds of applications rewrap might be used in. # # Note: If you want leading and trailing tabs removed, map them to # spaces first. Rewrap only fools with spaces, leaving tabs intact. # This can be changed easily enough, by running its input through the # Icon detab() function. # ############################################################################ # # See also: wrap.icn # ############################################################################ procedure rewrap(s,i) local extra_bit, line static old_line initial old_line := "" # Default column to wrap on is 70. /i := 70 # Flush buffer on null first argument. if /s then { extra_bit := old_line old_line := "" return "" ~== extra_bit } # Prepend to s anything that is in the buffer (leftovers from the last s). s ?:= { tab(many(' ')); old_line || trim(tab(0)) } # If the line isn't long enough, just add everything to old_line. if *s < i then old_line := s || " " & fail s ? { # While it is possible to find places to break s, do so. while any(' -',line := EndToFront(i),-1) do { # Clean up and suspend the last piece of s tabbed over. line ?:= (tab(many(' ')), trim(tab(0))) if *&subject - &pos + *line > i then suspend line else { old_line := "" return line || tab(0) } } # Keep the extra section of s in a buffer. old_line := tab(0) # If the reason the remaining section of s was unrewrapable was # that it was too long, and couldn't be broken up, then just return # the thing as-is. if *old_line > i then { old_line ? { if extra_bit := tab(upto(' -')+1) || (tab(many(' ')) | "") then old_line := tab(0) else extra_bit := old_line & old_line := "" return trim(extra_bit) } } # Otherwise, clean up the buffer for prepending to the next s. else { # If old_line is blank, then don't mess with it. Otherwise, # add whatever is needed in order to link it with the next s. if old_line ~== "" then { # If old_line ends in a dash, then there's no need to add a # space to it. if old_line[-1] ~== "-" then old_line ||:= " " } } } end procedure EndToFront(i) # Goes with rewrap(s,i) *&subject+1 - &pos >= i | fail suspend &subject[.&pos:&pos <- &pos+i to &pos by -1] end icon-9.4.3/ipl/packs/ibpag2/iiglrpar.lib0000664000175000017500000006707607140713043017354 0ustar chrishchrish############################################################################ # # Name: iiglrpar.lib # # Title: Quasi-GLR parser code # # Author: Richard L. Goerwitz # # Version: 1.20 # ############################################################################ # # This file contains quasi-GLR parser code for use by Ibpag2's # output. See below on what I mean by "quasi-GLR." Entry point is # iiparse(infile, fail_on_error). Infile is the stream from which # input is to be taken. Infile is passed as argument 1 to the # user-supplied lexical analyzer, iilex_module() (where _module is # the string supplied with the -m option to Ibpag2). If # fail_on_error is nonnull, the parser, iiparse, will fail on errors, # rather than abort. Iiparse() returns the top element on its value # stack on a successful parse (which can be handy). # # Iilex_module() must suspend integers for tokens and may also set # iilval_module to the actual string values. Tokens -2, -1, and 0 # are reserved. -2 is epsilon, and -1 is error. 0 is EOF, and is # automatically appended to the token stream when iilex_module, the # tokenizer, fails. These values should not normally be returned by # the analyzer. In general, it is a good idea to $include # iilex_module from your Ibpag2 source files, so that it can use the # symbolic %token names declared in the original Ibpag2 source file. # As implied above ("suspend"), iilex_module must be a generator, # failing on EOF. # # If desired, you may include your own error-handling routine. It # must be called iiparse_module (where _module is once again the # module name supplied to ibpag2 via the -m option). The global # variable line_number_module is automatically defined below, so a # typical arrangement would be for the lexical analyzer to initialize # line_number_module to 0, and increment by 1 for each line read. # The error handler, iierror_module() can then display this variable. # Note that the error handler should accept a single string argument # (set by iiparse to describe the token on the input stream when the # error was encountered). # # I label this parser "GLR" because it does support multiple parallel # parsers (like GLR parsers are supposed to). I use the qualifier # "quasi," though, because it does not use a graph-structured stack. # Instead it copies both value and state stacks (in fact, the whole # parser environment) when creating new automata to handle # alternative parse paths. Slower, yes. But it enables the user to # use almost precisely the action and input format that is used for # the standard parser. # # Note that iiparse(), as implemented here, may suspend multiple # results. So be sure to call it in some context where multiple # results can be used (e.g. every parse := iiparse(&input, 1), or the # like). Note also that when new parser "edges" get created, a # rather cumbersome recursive copy routine is used. Sorry, but it's # necessary to prevent unintended side-effects. # ############################################################################ # # The algorithm: # # A = list of active parsers needing action lookup # S = list of parsers to be shifted # R = list of parsers to be reduced # B = list of parsers that "choked" # # for every token on the input stream # begin # until length of R = 0 and length of A = 0 # begin # - pop successive parsers off of A, and placing them in S, # R, or B, depending on parse table directives; suspend a # result for each parser that has reached an accepting # state # - pop successive parsers off of R, reducing them, and # placing them back in A; perform the action code # associated with each reduction # end # - pop successive parsers off of S, shifting them, and placing # them back in A; mark recovering parsers as recovered when # they have successfully shifted three tokens # if length of A = 0 and token not = EOF # then # - initiate error recovery on the parsers in B, i.e. for # each parser in B that is not already recovering, pop its # stack until error (-1) can legally be shifted, then shift # error, mark the parser as recovering from an error, and # place it back in A; if the parser is already recovering, # discard the current token # else # - clobber the parsers in B # end # end # # Note that when a given active parser in A is being classified # as needing a reduction, shift, suspension, or entry into the error # list (B), more than one action may apply due to ambiguity in the # grammar. At such points, the parser environment is duplicated, # once for each alternative pathway, and each of the new parsers is # then entered into the appropriate list (R or S; if accept is an # alternative, the classification routine suspends). # # Note also that when performing the action code associated with # reductions, parsers may be reclassified as erroneous, accepting, # etc. via "semantic" directives like IIERROR and IIACCEPT. See the # README file. Multiple-result action code will cause new parser # threads to be created, just as ambiguities in the grammar do within # the classification routine above. # ############################################################################# # # See also: ibpag2.icn, iiparse.icn # ############################################################################ $$line 119 "iiglrpar.lib" $$ifndef IIDEBUG $$define $iidebug 1 $$define show_new_forest 1 $$endif # not IIDEBUG # These defines are output by Ibpag2 ahead of time (with the module # name appended, if need be): # # IIERROR # IIACCEPT # iiprune - GLR mode only # iiisolate - GLR mode only # iierrok # iiclearin # Parser environment + lookahead and pending action field. # record $ib_pe(state_stack, value_stack, action, errors, recover_shifts, discards, clearin) # Warning! If you change the name of the value stack, change it also # in ibreader.icn, procedure write_action_as_procedure(). # global $iilval, $line_number, $state_stack, $value_stack, $iidirective, $ttbl, $errors, $discard_token # # iiparse: file x anything -> ?s (a generator) # (stream, fail_on_error) -> ? # # Where stream is an open file, where fail_on_error is a switch # that (if nonnull) tells the iiparse to fail, rather than abort, # on error, and where ?s represent the user-defined results of a # completed parse of file, from the current location up to the # point where the parser executes an "accept" action. Note that # iiparse, as implemented here, is a generator. # procedure $iiparse(stream, fail_on_error) local token, next_token, actives, reducers, shifters, barfers #global ttbl, errors static atbl initial { $iidirective := "" atbl := $atbl_insertion_point $ttbl := $ttbl_insertion_point $$line 166 "iiglrpar.lib" \$iilex | stop("no iilex tokenizer defined") } actives := [ $ib_pe([1], [], &null, 0) ] $state_stack := actives[1].state_stack $value_stack := actives[1].value_stack $errors := actives[1].errors reducers := list() shifters := list() # I get tired of bland error code. We'll call the list of # parsers in an error state "barfers" :-). barfers := list() next_token := create $iilex(stream, fail_on_error) | 0 token := @next_token # # After this ^, new tokens are read in near the end of the repeat # loop. None is read in on an error, since then we will try again # on the token that caused the error. # repeat { until *actives = *reducers = 0 do { # Prune out parsers that are doing the same thing as some # other parser. # $$ifdef AUTO_PRUNE auto_prune(actives) $$endif # Suspends $value_stack[1] on accept actions. Otherwise, # puts parsers that need shifting into the shifters list, # parsers that need reducing into the reducers list, and # error-state parsers into the barfers list. Creates new # parser environments as needed. # suspend $ib_action(atbl, token, actives, shifters, reducers, barfers) # Perform reductions. If instructed via the iiaccept # macro, simulate an accept action, and suspend with a # result. # suspend $perform_reductions(token, actives, shifters, reducers, barfers) } # Shift token for every parser in the shifters list. This # will create a bunch of new active parsers. # $perform_shifts(token, actives, shifters) # # If we get to here and have no actives, and we're not at the # end of the input stream, then we are at an error impasse. # Do formal error recovery. # if *actives = 0 & token ~=== 0 then { suspend $perform_barfs(atbl, token, actives, barfers,fail_on_error) # # Perform_barfs sets discard_token if recovery was # unsuccessful on the last token, and it needs discarding. # if \$discard_token := &null then token := @next_token | break # # If there *still* aren't any active parsers, we've # reached an impasse (or there are no error productions). # Abort. # if *actives = 0 then { if \fail_on_error then fail else stop() } } else { # # Parsers in an error state should be weeded out, since if # we get to here, we have some valid parsers still going. # I.e. only use them if there are *no* actives (see above). # $$ifdef IIDEBUG write(&errout, "+++ pruning ", *barfers, " erroneous parsers") while parser := pop(barfers) do $iidebug("p", token, &null, parser) $$else while pop(barfers) $$endif #IIDEBUG # # Get the next token. Only do this if we have active # parsers not recovering from an error, i.e., if we're here. # token := @next_token | break } } end # # ib_action # procedure $ib_action(atbl, token, actives, shifters, reducers, barfers) local a, act, num, parser, new_parser # While there is an active parser, take it off the actives list, # and... while parser := pop(actives) do { # ...check for a valid action (if none, then there is an # error; put it into the barfers list). # if a := \ (\atbl[token])[parser.state_stack[1]] then { a ? { # Keep track of how many actions we've seen. num := 0 # Snip off successive actions. If there's no # ambiguity, there will be only one action, & no # additional parser environments will be created. # while { $$ifdef COMPRESSED_TABLES # "\x80" is the accept action; uncompress_action # does its own move()ing act := $uncompress_action() $$else act := ="a" | { tab(any('sr')) || tab(upto('.<')) || ((="<" || tab(find(">")+1)) | =".") || tab(many(&digits)) } $$endif #COMPRESSED TABLES } do { # New parser environment only needed for num > 1. # if (num +:= 1) > 1 then { new_parser := $fullcopy(parser) show_new_forest("=== table conflict; new parser", actives, shifters, reducers, barfers, new_parser) } else new_parser := parser new_parser.action := act # Classify the action as s, r, or a, and place i # the appropriate list (or suspend a result if a). # case act[1] of { "s" : put(shifters, new_parser) "r" : put(reducers, new_parser) "a" : { $iidebug("a", token, ruleno, parser) suspend parser.value_stack[1] } } } } } else { # # Error. Parser will get garbage collected before another # token is read from iilex, unless the parsers all fail - # in which case, error recovery will be tried. # $iidebug("e", token, &null, parser) put(barfers, parser) } } end # # perform_reductions # procedure $perform_reductions(token, actives, shifters, reducers, barfers) local parser, ruleno, newsym, rhsize, arglist, result, num, new_parser, tmp, p static gtbl initial { gtbl := $gtbl_insertion_point $$line 336 "iiglrpar.lib" } while parser := get(reducers) do { # Set up global state and value stacks, so that the action # code can access them. # $state_stack := parser.state_stack $value_stack := parser.value_stack $errors := parser.errors # Finally, perform the given action: # parser.action ? { # # Reduce action format, e.g. r12 = reduce by rule 1 # (LHS = S, RHS length = 2). # move(1) ruleno := integer(1(tab(find("<")), move(1))) newsym := 1(tab(find(">")), move(1)) rhsize := integer(tab(many(&digits))) arglist := [] every 1 to rhsize do { pop($state_stack) push(arglist, pop($value_stack)) } # Gtbl is "backwards," i.e. token first, state second. # The value produced is the "goto" state. # push($state_stack, gtbl[newsym][$state_stack[1]]) # # The actions are in procedures having the same name as # the number of their rule, bracketed by underscores, & # followed by the current module name. If there is such a # procedure associated with the current reduce action, # call it. # if func := proc("_" || ruleno || "_" || $module) then { num := 0 # # For every valid result from the action code for the # current reduction, create a new parser if need be # (i.e. if num > 1), and check iidirective. Push the # result onto the stack of the new parser & put the # new parser into the actives list. # every result := func!arglist do { # For all but the first result, create a new parser. if (num +:= 1) > 1 then { new_parser := $fullcopy(parser) pop(new_parser.value_stack) # take off pushed result show_new_forest("=== multi-result action; new parser", actives, shifters, reducers, barfers, new_parser) } else new_parser := parser # # IIERROR, IIACCEPT, iierrok, iiisolate, and iiprune # are all implemented using a search through a global # iidirective variable; see the $defines described # above. # tmp := $iidirective $iidirective := "" if *tmp > 0 then { if find("clearin", tmp) then { # see perform_shifts() below new_parser.clearin := 1 } if find("error", tmp) then { $iidebug("e", token, ruleno, new_parser) put(barfers, new_parser) next } if find("errok", tmp) then { new_parser.recover_shifts := &null new_parser.discards := 0 } if find("prune", tmp) then { # Garden path. $iidebug("p", token, ruleno, new_parser) break next } if find("isolate", tmp) then { # Prune all but the current parser. $$ifdef IIDEBUG write(&errout, "+++ isolating by pruning") while p := pop(actives) do $iidebug("p", token, ruleno, p) while p := pop(reducers) do $iidebug("p", token, ruleno, p) while p := pop(shifters) do $iidebug("p", token, ruleno, p) while p := pop(barfers) do $iidebug("p", token, ruleno, p) $$else while pop(actives) while pop(reducers) while pop(shifters) while pop(barfers) $$endif #IIDEBUG push(new_parser.value_stack, result) $iidebug("r", token, ruleno, new_parser) put(actives, new_parser) break next } if find("accept", tmp) then { $iidebug("a", token, ruleno, new_parser) suspend result next } } # # Push result onto the new parser thread's value # stack. # push(new_parser.value_stack, result) $iidebug("r", token, ruleno, new_parser) put(actives, new_parser) # # Action code must have the stack in its original # form. So restore the stack's old form before # going back to the action code. # if num = 1 then $value_stack := parser.value_stack[2:0] } # # If the action code for this rule failed, push &null. # But first check $iidirective. # if num = 0 then { # # Same $iidirective code as above repeated # (inelegantly) because it accesses too many # variables to be easily isolated. # tmp := $iidirective $iidirective := "" if *tmp > 0 then { if find("clearin", tmp) then { # see perform_shifts() below parser.clearin := 1 } if find("error", tmp) then { $iidebug("e", token, ruleno, parser) put(barfers, parser) next } if find("errok", tmp) then { parser.recover_shifts := &null parser.discards := 0 } if find("prune", tmp) then { # Garden path. $iidebug("p", token, ruleno, parser) next # go back to enclosing while pop... } if find("isolate", tmp) then { # Prune all but the current parser. $$ifdef IIDEBUG write(&errout, "+++ isolating by pruning") while p := pop(actives) do $iidebug("p", token, ruleno, p) while p := pop(reducers) do $iidebug("p", token, ruleno, p) while p := pop(shifters) do $iidebug("p", token, ruleno, p) while p := pop(barfers) do $iidebug("p", token, ruleno, p) $$else while pop(actives) while pop(reducers) while pop(shifters) while pop(barfers) $$endif #IIDEBUG } if find("accept", tmp) then { $iidebug("a", token, ruleno, parser) suspend arglist[-1] | &null next } } # Finally, push the result! result := arglist[-1] | &null push(parser.value_stack, result) $iidebug("r", token, ruleno, parser) put(actives, parser) } } # If there is no action code for this rule... else { # ...push the value of the last RHS arg. # For 0-length e-productions, push &null. result := arglist[-1] | &null push(parser.value_stack, result) $iidebug("r", token, ruleno, parser) put(actives, parser) } } } end # # perform_shifts # procedure $perform_shifts(token, actives, shifters) local parser, ruleno *shifters = 0 & fail while parser := pop(shifters) do { # # One of the iidirectives is iiclearin, i.e. clear the input # token and try again on the next token. # \parser.clearin := &null & { put(actives, parser) next } parser.action ? { # # Shift action format, e.g. s2.1 = shift and go to state 2 # by rule 1. # move(1) push(parser.state_stack, integer(tab(find(".")))) push(parser.value_stack, $iilval) ="."; ruleno := integer(tab(many(&digits))) pos(0) | stop("malformed action: ", act) # # If, while recovering, we can manage to shift 3 tokens, # then we consider ourselves resynchronized. Don't count # the error token (-1). # if token ~= -1 then { if \parser.recover_shifts +:= 1 then { # 3 shifts make a successful recovery if parser.recover_shifts > 4 then { parser.recover_shifts := &null parser.discards := 0 } } } $iidebug("s", token, ruleno, parser) } put(actives, parser) } return end # # perform_barfs # procedure $perform_barfs(atbl, token, actives, barfers, fail_on_error) # # Note how this procedure has its own local reducers and shifters # list. These are *not* passed from the parent environment! # local parser, count, reducers, shifters, recoverers # To hold the list of parsers that need to shift error (-1). recoverers := list() count := 0 while parser := pop(barfers) do { count +:= 1 if \parser.recover_shifts := 0 then { # # If we're already in an error state, discard the # current token, and increment the number of discards # we have made. 500 is too many; abort. # if (parser.discards +:= 1) > 500 then { if proc($iierror) then $iierror("fatal error: can't resynchronize") else write(&errout, "fatal error: can't resynchronize") if \fail_on_error then fail else stop() } # try again on this one with the next token put(actives, parser) } else { parser.errors +:= 1 # error count for this parser parser.discards := parser.recover_shifts := 0 # If this is our first erroneous parser, print a message. if count = 1 then { if proc($iierror) then $iierror(image(\$ttbl[token]) | image(token)) else write(&errout, "parse error") } # # If error appears in a RHS, pop states until we get to a # spot where error (-1) is a valid lookahead token: # if \$ttbl[-1] then { until *parser.state_stack = 0 do { if \atbl[-1][parser.state_stack[1]] then { put(recoverers, parser) break next } else pop(parser.state_stack) & pop(parser.value_stack) } } # If we get past here, the stack is now empty or there # are no error productions. Abandon this parser. $iidebug("p", token, &null, parser) } } # Parsers still recovering are in the actives list; those that # need to shift error (-1) are in the recoverers list. The # following turns recoverers into actives: # if *recoverers > 0 then { reducers := list() # a scratch list shifters := list() # ditto until *recoverers = *reducers = 0 do { $$ifdef AUTO_PRUNE auto_prune(actives) $$endif suspend $ib_action(atbl, -1, recoverers, shifters, reducers, barfers) suspend $perform_reductions(-1, recoverers, shifters, reducers, barfers) } $perform_shifts(-1, recoverers, shifters) every put(actives, !recoverers) } # # If there were no recoverers, we've already shifted the error # token, and are discarding tokens from the input stream. Note # that if one parser was recovering, they *all* should be # recovering, since if one was not recovering, it the erroneous # parsers should all have been discarded by the calling proc. # else $discard_token := 1 end $$ifdef IIDEBUG record production(LHS, RHS, POS, LOOK, no, prec, assoc) # # iidebug # procedure $iidebug(action, token, ruleno, parser) local p, t, state static rule_list initial { rule_list := $rule_list_insertion_point $$line 693 "iiglrpar.lib" } write(&errout, "--- In parser ", image(parser), ":") case action of { "a" : writes(&errout, "accepting ") & state := parser.state_stack[1] "e" : writes(&errout, "***ERROR***\n") & write(&errout, "recover shifts = ", parser.recover_shifts) & write(&errout, "discarded tokens = ", parser.discards) & writes(&errout, "error action ") & state := parser.state_stack[1] "p" : writes(&errout, "***PRUNING***\n") & writes(&errout, "prune action ") & state := parser.state_stack[1] "r" : writes(&errout, "reducing ") & state := parser.state_stack[2] "s" : writes(&errout, "shifting ") & state := parser.state_stack[2] default : stop("malformed action argument to iidebug") } t := image(token) || (" (" || (\$ttbl[token] | "unknown") || ")") writes(&errout, "on lookahead ", t, ", in state ", state) if \ruleno then { (p := !rule_list).no === ruleno & write(&errout, "; rule ", $production_2_string(p, $ttbl)) } # for errors, ruleno is null else write(&errout) write(&errout, " state stack now: ") every write(&errout, "\t", image(!parser.state_stack)) write(&errout, " value stack now: ") if *parser.value_stack > 0 then every write(&errout, "\t", image(!parser.value_stack)) else write(&errout, "\t(empty)") return end # # production_2_string: production record -> string # p -> s # # Stringizes an image of the LHS and RHS of production p in # human-readable form. # procedure $production_2_string(p, ibtoktbl) local s, m, t s := image(p.LHS) || " -> " every m := !p.RHS do { if t := \ (\ibtoktbl)[m] then s ||:= t || " " else s ||:= image(m) || " " } # if the POS field is nonnull, print it s ||:= "(POS = " || image(\p.POS) || ") " # if the LOOK field is nonnull, print it, too s ||:= "lookahead = " || image(\p.LOOK) return trim(s) end # # show_new_forest # procedure show_new_forest(msg, actives, shifters, reducers, barfers, parser) write(&errout, msg) write(&errout, " List of active parsers:") every write(&errout, "\t", image(!actives)) every write(&errout, "\t", image(!shifters)) every write(&errout, "\t", image(!reducers)) every write(&errout, "\t", image(!barfers), " (error)") write(&errout, "\tnew -> ", image(parser)) end $$endif # IIDEBUG $$ifdef COMPRESSED_TABLES # # uncompress_action # procedure $uncompress_action() local next_chunk, full_action next_chunk := create ord(!&subject[&pos:0]) case $in_ib_bits(next_chunk, 2) of { 0: { full_action := "s" full_action ||:= $in_ib_bits(next_chunk, 11) full_action ||:= "." full_action ||:= $in_ib_bits(next_chunk, 11) move(3) } 1: { full_action := "r" full_action ||:= $in_ib_bits(next_chunk, 11) full_action ||:= "<" full_action ||:= $in_ib_bits(next_chunk, 11) full_action ||:= ">" full_action ||:= $in_ib_bits(next_chunk, 8) move(4) } 2: { full_action := "a" move(1) } } | fail return full_action end # # in_ib_bits: like inbits (IPL), but with coexpression for file # procedure $in_ib_bits(next_chunk, len) local i, byte, old_byte_mask static old_byte, old_len, byte_length initial { old_byte := old_len := 0 byte_length := 8 } old_byte_mask := (0 < 2^old_len - 1) | 0 old_byte := iand(old_byte, old_byte_mask) i := ishift(old_byte, len-old_len) len -:= (len > old_len) | { old_len -:= len return i } while byte := @next_chunk do { i := ior(i, ishift(byte, len-byte_length)) len -:= (len > byte_length) | { old_len := byte_length-len old_byte := byte return i } } end $$endif # COMPRESSED_TABLES # # fullcopy: make full recursive copy of object obj # procedure $fullcopy(obj) local retval, i, k case type(obj) of { "co-expression" : return obj "cset" : return obj "file" : return obj "integer" : return obj "list" : { retval := list(*obj) every i := 1 to *obj do retval[i] := $fullcopy(obj[i]) return retval } "null" : return &null "procedure" : return obj "real" : return obj "set" : { retval := set() every insert(retval, $fullcopy(!obj)) return retval } "string" : return obj "table" : { retval := table(obj[[]]) every k := key(obj) do insert(retval, $fullcopy(k), $fullcopy(obj[k])) return retval } # probably a record; if not, we're dealing with a new # version of Icon or a nonstandard implementation, and # we're screwed default : { retval := copy(obj) every i := 1 to *obj do retval[i] := $fullcopy(obj[i]) return retval } } end $$ifdef AUTO_PRUNE procedure auto_prune(actives) new_actives := [] while parser1 := pop(actives) do { every parser2 := actives[j := 1 to *actives] do { parser1.state_stack[1] = parser2.state_stack[1] | next *parser1.value_stack = *parser2.value_stack | next every i := 1 to *parser1.value_stack do { parser1.value_stack[i] === parser2.value_stack[i] | break next } if parser1.errors < parser2.errors then actives[j] := parser1 break next } put(new_actives, parser1) } every put(actives, !new_actives) return &null end $$endif # AUTO_PRUNE icon-9.4.3/ipl/packs/ibpag2/beta2ref.ibp0000664000175000017500000000461107140713043017223 0ustar chrishchrish# # Ibpag2 source file for OT betacode-to-English converter. # # "Betacode" is the name used for the markers that the Thesaurus # Linguae Graecae uses to segment texts into works, books, chapters, # verses, etc. The Michigan-Claremont scan of the Hebrew OT (BHS) # uses a subset of the betacode "language." This file contains a # parser for that language that converts it into human readable form. # # Reads the standard input. Sends the original text, with betacode # markers converted to human-readable form, to the standard output. # %{ # These need to be global, because all of the actions modify them. # Remember that the default scope for a variable used in an action is # that action. # global betavals, blev %} %token INTVAL, STRVAL, LINE %% betalines : betalines, betaline | epsilon ; betaline : '~', cvalue, xvalue, yvalue, '\n' { if integer(betavals[2]) then { write(betavals[1], " ", betavals[2], ":", betavals[3]) } blev := 4 # global } | LINE, '\n' { write($1) } ; cvalue : 'a', value, 'b', value, 'c', value { betavals[blev := 1] := $6 } | 'c', value { betavals[blev := 1] := $2 } | epsilon ; xvalue : 'x', value { betavals[blev := 2] := $2 } | 'x' { if integer(betavals[2]) then betavals[blev := 2] +:= 1 else betavals[blev := 2] := 1 } | epsilon { if blev < 2 then betavals[2] := 1 } ; yvalue : 'y', value { betavals[blev := 3] := $2 } | 'y' { betavals[blev := 3] +:= 1 } | epsilon { if blev < 3 then betavals[3] := 1 } ; value : INTVAL { return $1 } | STRVAL { return $1 } ; %% procedure iilex(infile) local line # betavals is global initial betavals := ["", 0, 0] while line := read(infile) do { line ? { if ="~" then { suspend ord("~") until pos(0) do { case move(1) of { "a" : suspend ord("a") "b" : suspend ord("b") "c" : suspend ord("c") "x" : suspend ord("x") "y" : suspend ord("y") default : stop("betacode error: ", line) } if ="\"" then { iilval := tab(find("\"")) suspend STRVAL move(1) } else { if iilval := integer(tab(many(&digits))) then suspend INTVAL } } suspend ord("\n") } else { iilval := line suspend LINE suspend ord("\n") } } } end procedure main() return iiparse(&input) end icon-9.4.3/ipl/packs/ibpag2/ibutil.icn0000664000175000017500000001617607140713043017031 0ustar chrishchrish############################################################################ # # Name: ibutil.icn # # Title: utilities for Ibpag2 # # Author: Richard L. Goerwitz # # Version: 1.21 # ############################################################################ # # Contains: # # production_2_string(p) makes production or item p human- # readable # # print_item_list(C, i) returns human-readable version of # item list C # # print_grammar(grammar, f) sends to file f (default &output) # a human-readable printout of a grammar, # as recorded in an ib_grammar structure # # print_action_goto_tables(atbl, gtbl, ibtoktbl, f) # sends to file f (default (&output) # a human-readable printout of action # table atbl and goto table gtbl # # print_follow_sets(FOLLOW_table) # returns a human-readable version # of a FOLLOW table (table of sets) # # print_first_sets(FIRST_table) # returns a human-readable version # of a FIRST table (a table of sets) # # ibreplace(s1, s2, s3) replaces s2 with s3 in s1 # # equivalent_items(i1, i2) succeeds if item i1 is structurally # identical to item i2 # # equivalent_item_lists(l1,l2) same as equivalent_items, but for # lists of items, not individual items # ############################################################################ # # Links: none # ############################################################################ record production(LHS, RHS, POS, LOOK, no, prec, assoc) # # production_2_string: production record -> string # p -> s # # Stringizes an image of the LHS and RHS of production p in # human-readable form. # procedure production_2_string(p, ibtoktbl) local s, m, t s := image(p.LHS) || " -> " every m := !p.RHS do { if t := \ (\ibtoktbl)[m] then s ||:= t || " " else s ||:= image(m) || " " } # if the POS field is nonnull, print it s ||:= "(POS = " || image(\p.POS) || ") " # if the LOOK field is nonnull, print it, too s ||:= "lookahead = " || image(\p.LOOK) return trim(s) end # # print_item_list: makes item list human readable # procedure print_item_list(C, i) write(&errout, "Productions for item list ", i, ":") every write(&errout, "\t", production_2_string(!C[i])) write(&errout) return end # # print_grammar: makes entire grammar human readable # procedure print_grammar(grammar, f) local p, i, sl /f := &errout write(f, "Start symbol:") write(f, "\t", grammar.start) write(f) write(f, "Rules:") every p := !grammar.rules do { writes(f, "\tRule ", right(p.no, 3, " "), " ") write(f, production_2_string(p, grammar.tbl)) } write(f) write(f, "Tokens:") sl := sort(grammar.tbl, 3) every i := 1 to *sl-1 by 2 do write(f, "\t", left(sl[i], 5, "."), right(sl[i+1], 20, ".")) write(f) return end # # print_action_goto_tables # # Makes action & goto tables human readable. If a table mapping # integer (i.e. char) literals to token names is supplied, the # token names themselves are printed. # procedure print_action_goto_tables(atbl, gtbl, ibtoktbl, f) local TAB, tbl, key_set, size, i, column, k /f := &errout TAB := "\t" every tbl := atbl|gtbl do { key_set := set(); every insert(key_set, key(tbl)) writes(f, TAB) every k := !key_set do writes(f, \(\ibtoktbl)[k] | k, TAB) write(f) size := 0; every size <:= key(!tbl) every i := 1 to size do { writes(f, i, TAB) every column := tbl[!key_set] do { # action lists may have more than one element if /column[i] then writes(f, " ", TAB) & next \column[i] ? { if any('asr') then { while any('asr') do { writes(f, ="a") & next writes(f, tab(upto('.<'))) if ="<" then tab(find(">")+1) else ="." tab(many(&digits)) } writes(f, TAB) } else writes(f, tab(many(&digits)), TAB) } } write(f) } write(f) } return end # # print_follow_sets: make FOLLOW table human readable # procedure print_follow_sets(FOLLOW_table) local FOLLOW_sets, i FOLLOW_sets := sort(FOLLOW_table, 3) write(&errout, "FOLLOW sets are as follows:") every i := 1 to *FOLLOW_sets-1 by 2 do { writes(&errout, "\tFOLLOW(", image(FOLLOW_sets[i]), ") = ") every writes(&errout, image(! FOLLOW_sets[i+1]), " ") write(&errout) } write(&errout) return end # # print_first_sets: make FIRST table human readable # procedure print_first_sets(FIRST_table) local FIRST_sets, i FIRST_sets := sort(FIRST_table, 3) write(&errout, "FIRST sets are as follows:") every i := 1 to *FIRST_sets-1 by 2 do { writes(&errout, "\tFIRST(", image(FIRST_sets[i]), ") = ") every writes(&errout, image(! FIRST_sets[i+1]), " ") write(&errout) } write(&errout) return end # # ibreplace: string x string x string -> string # (s1, s2, s3) -> s4 # # Where s4 is s1, with every instance of s2 stripped out and # replaced by s3. E.g. replace("hello there; hello", "hello", # "hi") yields "hi there; hi". Taken straight from the IPL. # procedure ibreplace(s1,s2,s3) local result, i result := "" i := *s2 s1 ? { while result ||:= tab(find(s2)) do { result ||:= s3 move(i) } return result || tab(0) } end # # equivalent_items: record x record -> record or failure # (item1, item2) -> item1 or failure # # Where item1 and item2 are records having LHS, RHS, POS, & LOOK # fields (and possibly others, though they aren't used). Returns # item1 if item1 and item2 are structurally identical as far as # their LHS, RHS, LOOK, and POS fields are concerned. For SLR # table generators, LOOK will always be null. # procedure equivalent_items(item1, item2) local i item1 === item2 & (return item1) if item1.LHS == item2.LHS & item1.POS = item2.POS & # # This comparison doesn't have to be recursive, since I take # care never to alter RHS structures. Identical RHSs should # always be *the same underlying structure*. # item1.RHS === item2.RHS & item1.LOOK === item2.LOOK then return item1 end # # equivalent_item_lists: list x list -> list or fail # (il1, il2) -> il1 # # Where il1 is one sorted list-of-items (as returned by goto() or # by closure()), where il2 is another such list. Returns the # first list if the LHS, RHS, and POS fields of the constituent # items are all structurally identical, i.e. if the two lists # contain the structurally identical items. # procedure equivalent_item_lists(il1, il2) local i il1 === il2 & (return il1) if *il1 = *il2 then { every i := 1 to *il1 do equivalent_items(il1[i], il2[i]) | fail } else fail return il1 end icon-9.4.3/ipl/packs/ibpag2/shrnktbl.icn0000664000175000017500000000672207142571000017361 0ustar chrishchrish############################################################################ # # Name: shrnktbl.icn # # Title: table shrinker # # Author: Richard L. Goerwitz # # Version: 1.4 (later modified 4-Aug-2000/gmt) # ############################################################################ # # Action/goto table shrinking routine. # # Entry point: shrink_tables(start_symbol, st, atbl, gtbl), where # start_symbol is the start symbol for the grammar whose productions # are contained in the list/set st, and where atbl and gtbl are the # action and goto tables, respectively. Returns &null, for lack of # anything better. # # Basically, this routine merges duplicate structures in atbl and # gtbl (if there are any), replaces the nonterminal symbols in the # action table with integers (including the start symbol), then # resets the goto table so that its keys point to these integers, # instead of to the original nonterminal symbol strings. # ############################################################################ # # Links: equiv, lists, sets, tables, outbits # ############################################################################ # # See also: ibpag2, slrtbls # ############################################################################ # structs has equiv; outbits is for outputting variable-width integers # as 8-bit characters # link equiv link lists link sets link tables link outbits # # shrink_tables # procedure shrink_tables(grammar, atbl, gtbl) local t, k, seen, nontermtbl, r, a, action, state, by_rule, rule_len, LHS, keys # Create a table mapping nonterminal symbols to integers. nontermtbl := table() every r := !grammar.rules do # r is a production; production records have LHS, RHS,...no # fields, where the no field contains the rule number; we can # use this as an arbitrary representation for that rule's LHS # nonterminal insert(nontermtbl, r.LHS, r.no) # Replace old start symbol. grammar.start := nontermtbl[grammar.start] # Re-form the goto table to use the new integer values for # nonterminals. keys := set() every insert(keys, key(gtbl)) every k := !keys do { # first create a column for the new integer-valued nonterminal insert(gtbl, string(nontermtbl[k]), gtbl[k]) # then clobber the old column with a string-valued nonterminal gtbl[k] := &null } # Rewrite actions using a fixed field-width format. every t := !atbl do { every k := key(t) do { a := "" t[k] ? { while action := tab(any('sra')) do { case action of { "s": { outbits(0, 2) state := integer(tab(find("."))) every a ||:= outbits(state, 11) move(1) by_rule := integer(tab(many(&digits))) every a ||:= outbits(by_rule, 11) outbits() } "r": { outbits(1, 2) state := integer(tab(find("<"))) every a ||:= outbits(state, 11) move(1) LHS := nontermtbl[tab(find(">"))] every a ||:= outbits(LHS, 11) move(1) rule_len := integer(tab(many(&digits))) every a ||:= outbits(rule_len, 8) outbits() } "a": { outbits(2, 2) a ||:= outbits() } } } } t[k] := a } } # # Turn pointers to identical structures into pointers to the same # structure. # seen := set() every t := atbl | gtbl do { every k := key(t) do { if t[k] := equiv(t[k], !seen) then next else insert(seen, t[k]) } } # signal success return &null end icon-9.4.3/ipl/packs/ibpag2/iohno.icn0000664000175000017500000000553407140713043016651 0ustar chrishchrish############################################################################ # # Name: iohno.icn # # Title: iohno (error handler, with hard-coded messages) # # Author: Richard L. Goerwitz # # Version: 1.20 # ############################################################################ # # This file contains iohno(n, s) - an error handler taking two # arguments: 1) an integer and 2) a string. The string (2) is an # optional error message. The integer (1) is one of several # hard-coded error numbers (see below). # ############################################################################ # # Links: rewrap # ############################################################################ # # iohno: print error message s to stderr; abort with exit status n # procedure iohno(n, s) local i, msg static errlist initial { errlist := [[100, "unspecified failure"], [2, "can't find iiparse.lib file"], [4, "unexpected EOF"], [5, "unknown associativity value"], [11, "malformed right-hand side"], [12, "unexpected RHS symbol type"], [21, "malformed left-hand side"], [30, "unknown or unimplemented % declaration"], [31, "malformed token declaration"], [32, "start symbol redefined"], [33, "LHS symbol expected"], [34, "colon missing"], [35, "malformed RHS in rule declaration"], [36, "undeclared character literal"], [37, "illegal $integer reference"], [38, "out-of-range $reference"], [39, "unterminated brace { in action"], [43, "bogus precedence"], [44, "superfluous epsilon"], [45, "superfluous %union declaration"], [47, "empty or missing rules section"], [48, "garbled declarations section"], [49, "multiple characters within quotes"], [40, "same prec, different (or perhaps lacking) assoc"], [41, "conflict between nonassociative rules"], [42, "reduce -- reduce conflict"], [46, "unresolvable shift/reduce conflict"], [50, "illegal conflict for nonassociative rules"], [51, "reduce/reduce conflict"], [52, "nonterminal useless and/or declared as a terminal"], [60, "malformed $insertion point in iiparse file"], [70, "bad action format"], [71, "nonexistent rule number specified in old action"], [72, "nonexistent rule number specified in new action"], [80, "conflict in goto table"], [90, "RHS nonterminal appears in no LHS"], [91, "useless nonterminal"] ] } /n := 0 every i := 1 to *errlist do if errlist[i][1] = n then msg := errlist[i][2] writes(&errout, "error ", n, " (", msg, ")") if \s then { write(&errout, ": ") every write(&errout, "\t", rewrap(s) | rewrap()) } else write(&errout) exit(n) end icon-9.4.3/ipl/packs/ibpag2/iacc.ibp0000664000175000017500000002737207140713043016441 0ustar chrishchrish############################################################################ # # Name: iacc.ibp # # Title: YACC-like front-end for Ibpag2 (experimental) # # Author: Richard L. Goerwitz # # Version: 1.6 # ############################################################################ # # Summary: # # Iacc is a YACC-like Ibpag2 preprocessor (very experimental). # Iacc simply reads &input (assumed to be a YACC file, but with Icon # code in the action fields), and writes an Ibpag2 file to &output. # ############################################################################ # # Installation: # # This file is not an Icon file, but rather an Ibpag2 file. You # must have Ibpag2 installed in order to run it. To create the iacc # executable, first create iacc.icn by typing "ibpag2 -f iacc.ibp -o # iacc.icn," then compile iacc.icn as you would any other Icon file # to create iacc (or on systems without direct execution, iacc.icx). # Put more simply, iacc.ibp not only outputs Ibpag2 files, but is # itself generated using Ibpag2 + icon{t,c}. # ############################################################################ # # Implementation notes: # # Iacc uses an YACC grammar that is actually LR(2), and not # LR(1), as Ipbag2 would normally require in standard mode. Iacc # obtains the additional token lookahead via the lexical analyzer. # The place it uses that lookahead is when it sees an identifier. If # the next token is a colon, then it is the LHS of a rule (C_IDENT # below); otherwise it's an IDENT in the RHS of some rule. Crafting # the lexical analyzer in this fashion makes semicolons totally # superfluous (good riddance!), but it makes it necessary for the # lexical analyzer to suspend some dummy tokens whose only purpose is # to make sure that it doesn't eat up C or Icon action code while # trying to satisfy the grammar's two-token lookahead requirements # (see how RCURL and '}' are used below in the cdef and act # productions). # # Iacc does its work by making six basic changes to the input # stream: 1) puts commas between tokens and symbols in rules, 2) # removes superfluous union and type declarations/tags, 3) inserts # "epsilon" into the RHS of empty rules, 4) turns "$$ = x" into # "return x", 5) rewrites rules so that all actions appear at the end # of a production, and 6) strips all comments. # # Although Iacc is really meant for grammars with Icon action # code, Iacc can, in fact, accept straight YACC files, with C action # code. There isn't much point to using it this way, though, since # its output is not meant to be human readable. Rather, it is to be # passed directly to Ibpag2 for processing. Iacc is simply a YACCish # front end. Its output can be piped directly to Ibpag2 in most # cases: iacc < infile.iac | ibpag2 > infile.icn. # ############################################################################ # # Links: longstr, strings # See also: ibpag2 # ############################################################################ %{ link strings, longstr global newrules, lval, symbol_no %} # basic entities %token C_IDENT, IDENT # identifiers and literals %token NUMBER # [0-9]+ # reserved words: %type -> TYPE, %left -> LEFT, etc. %token LEFT, RIGHT, NONASSOC, TOKEN, PREC, TYPE, START, UNION # miscellaneous %token MARK # %% %token LCURL # %{ %token RCURL # dummy token used to start processing of C code %start yaccf %% yaccf : front, back front : defs, MARK { write(arg2) } back : rules, tail { every write(!\newrules) if write(\arg2) then every write(!&input) } tail : epsilon { return &null } | MARK { return arg1 } defs : epsilon | defs, def { write(\arg2) } | defs, cdef { write(\arg2) } def : START, IDENT { return arg1 || " " || arg2 } | rword, tag, nlist { if arg1 == "%type" then return &null else return arg1 || " " || arg3 } cdef : stuff, RCURL, RCURL { return arg1 } stuff : UNION { get_icon_code("%}"); return &null } | LCURL { return "%{ " || get_icon_code("%}") } rword : TOKEN | LEFT | RIGHT | NONASSOC | TYPE tag : epsilon { return &null } | '<', IDENT, '>' { return "<" || arg2 || ">" } nlist : nmno { return arg1 } | nlist, nmno { return arg1 || ", " || arg2 } | nlist, ',', nmno { return arg1 || ", " || arg3 } nmno : IDENT { return arg1 } | IDENT, NUMBER { return arg1 } rules : LHS, ':', RHS { write(arg1, "\t: ", arg3) } | rules, rule { write(arg2) } RHS : rbody, prec { return arg1 || " " || arg2 } rule : LHS, '|', RHS { return "\t| " || arg3 } | LHS, ':', RHS { return arg1 || "\t: " || arg3 } LHS : C_IDENT { symbol_no := 0 ; return arg1 } | epsilon { symbol_no := 0 } rbody : IDENT { symbol_no +:= 1; return arg1 } | act { return "epsilon " || arg1 } | middle, IDENT { return arg1 || ", " || arg2 } | middle, act { return arg1 || " " || arg2 } | middle, ',', IDENT { return arg1 || ", " || arg3 } | epsilon { return "epsilon" } middle : IDENT { symbol_no +:= 1; return arg1 } | act { symbol_no +:= 1; return arg1 } | middle, IDENT { symbol_no +:= 1; return arg1 || ", "||arg2 } | middle, ',', IDENT { symbol_no +:= 1; return arg1 || ", "||arg3 } | middle, act { local i, l1, l2 static actno initial { actno := 0; newrules := [] } actno +:= 1 l1 := []; l2 := [] every i := 1 to symbol_no do { every put(l1, ("arg"|"$") || i) if symbol_no-i = 0 then i := "0" else i := "-" || symbol_no - i every put(l2, ("$"|"$") || i) } put(newrules, "ACT_"|| actno || "\t: epsilon "|| mapargs(arg2, l1, l2)) symbol_no +:= 1 return arg1 || ", " || "ACT_" || actno } act : '{', cstuff, '}', '}' { return "{" || arg2 } cstuff : epsilon { return get_icon_code("}") } prec : epsilon { return "" } | PREC, IDENT { return arg1 || arg2 } | PREC, IDENT, act { return arg1 || arg2 || arg3 } %% procedure iilex() local t static last_token, last_lval, colon initial colon := ord(":") every t := next_token() do { iilval := last_lval if \last_token then { if t = colon then { if last_token = IDENT then suspend C_IDENT else suspend last_token } else suspend last_token } last_token := t last_lval := lval } iilval := last_lval suspend \last_token end procedure next_token() local reserveds, UNreserveds, c, idchars, marks reserveds := ["break","by","case","create","default","do", "else","end","every","fail","global","if", "initial","invocable","link","local","next", "not","of","procedure","record","repeat", "return","static","suspend","then","to","until", "while"] UNreserveds := ["break_","by_","case_","create_","default_","do_", "else_","end_","every_","fail_","global_","if_", "initial_","invocable_","link_","local_","next_", "not_","of_","procedure_","record_","repeat_", "return_","static_","suspend_","then_","to_", "until_","while_"] idchars := &letters ++ '._' marks := 0 c := reads() repeat { lval := &null case c of { "#" : { do_icon_comment(); c := reads() | break } "<" : { suspend ord(c); c := reads() | break } ">" : { suspend ord(c); c := reads() | break } ":" : { suspend ord(c); c := reads() | break } "|" : { suspend ord(c); c := reads() | break } "," : { suspend ord(c); c := reads() | break } "{" : { suspend ord(c | "}" | "}"); c := reads() } "/" : { reads() == "*" | stop("unknown YACC operator, \"/\"") do_c_comment() c := reads() | break } "'" : { lval := "'" while lval ||:= (c := reads()) do { if c == "\\" then lval ||:= reads() else if c == "'" then { suspend IDENT break } } c := reads() | break } "%" : { lval := "%" while any(&letters, c := reads()) do lval ||:= c if *lval = 1 then { if c == "%" then { lval := "%%" suspend MARK if (marks +:= 1) > 1 then fail } else { if c == "{" then { lval := "%{" suspend LCURL | RCURL | RCURL } else stop("malformed %declaration") } c := reads() | break } else { case lval of { "%prec" : suspend PREC "%left" : suspend LEFT "%token" : suspend TOKEN "%right" : suspend RIGHT "%type" : suspend TYPE "%start" : suspend START "%union" : suspend UNION | RCURL | RCURL "%nonassoc" : suspend NONASSOC default : stop("unknown % code in def section") } } } default : { if any(&digits, c) then { lval := c while any(&digits, c := reads()) do lval ||:= c suspend NUMBER } else { if any(idchars, c) then { lval := c while any(&digits ++ idchars, c := reads()) do lval ||:= c lval := mapargs(lval, reserveds, UNreserveds) suspend IDENT } else { # whitespace c := reads() | break } } } } } end procedure get_icon_code(endmark, comment) local yaccwords, ibpagwords, count, c, c2, s yaccwords := ["YYDEBUG", "YYACCEPT", "YYERROR", "yyclearin", "yyerrok"] ibpagwords := ["IIDEBUG", "IIACCEPT", "IIERROR", "iiclearin", "iierrok"] s := "" count := 1 c := reads() repeat { case c of { "\"" : s ||:= c || do_string() "'" : s ||:= c || do_charlit() "$" : { c2 := reads() | break if c2 == "$" then { until (c := reads()) == "=" s ||:= "return " } else { s ||:= c c := c2 next } } "#" : { if s[-1] == "\n" then s[-1] := "" do_icon_comment() } "/" : { c := reads() | break if c == "*" then do_c_comment() else { s ||:= c next } } "{" : { s ||:= c if endmark == "}" then count +:= 1 } "}" : { s ||:= c if endmark == "}" then { count -:= 1 count = 0 & (return mapargs(s, yaccwords, ibpagwords)) } } "%" : { s ||:= c if endmark == "%}" then { if (c := reads()) == "}" then return mapargs(s || c, yaccwords, ibpagwords) else next } } default : s ||:= c } c := reads() | break } # if there is no endmark, just go to EOF if \endmark then stop("input file has mis-braced { code }") else return mapargs(s, yaccwords, ibpagwords) end procedure do_string() local c, s s := "" while c := reads() do { case c of { "\\" : s ||:= c || reads() "\"" : return s || c || reads() default : s ||:= c } } stop("malformed string literal") end procedure do_charlit() local c, s s := "" while c := reads() do { case c of { "\\" : s ||:= c || reads() "'" : return s || c || reads() default : s ||:= c } } stop("malformed character literal") end procedure do_c_comment() local c, s s := c := reads() | stop("malformed C-style /* comment */") repeat { if c == "*" then { s ||:= (c := reads() | break) if c == "/" then return s } else s ||:= (c := reads() | break) } return s # EOF okay end procedure do_icon_comment() local c, s s := "" while c := reads() do { case c of { "\\" : s ||:= c || (reads() | break) "\n" : return s default : s ||:= c } } return s # EOF okay end procedure mapargs(s, l1, l2) local i, s2 static cs, tbl, last_l1, last_l2 if /l1 | *l1 = 0 then return s if not (last_l1 === l1, last_l2 === l2) then { cs := '' every cs ++:= (!l1)[1] tbl := table() every i := 1 to *l1 do insert(tbl, l1[i], (\l2)[i] | "") } s2 := "" s ? { while s2 ||:= tab(upto(cs)) do { (s2 <- (s2 || tbl[tab(longstr(l1))]), not any(&letters++&digits++'_')) | (s2 ||:= move(1)) } s2 ||:= tab(0) } return s2 end procedure main() iiparse() end icon-9.4.3/ipl/packs/ibpag2/follow.icn0000664000175000017500000002566607140713043017047 0ustar chrishchrish############################################################################ # # Name: follow.icn # # Title: compute follow sets for grammar # # Author: Richard L. Goerwitz # # Version: 1.15 # ############################################################################ # # This file contains FIRST(st, symbol...) and FOLLOW(start_symbol, # st, symbol). For FIRST(), arg1 is a list of productions. Arg 2 is # a string (nonterminal) or an integer (terminal). FIRST may take # more than one symbol argument. FOLLOW takes a string as its first # argument, a list of productions as its second, and a symbol as its # third. There is never any need to call FOLLOW with any more than # one symbol. The return values for FIRST() and FOLLOW() may be # described as follows: # # FIRST returns the set of all terminal symbols that begin valid # prefixes of the first symbol argument, or, if this contains # epsilon, of the first symbol -- ++ the set of terminals # beginning valid prefixes of the second symbol, etc.... The first # argument, st, contains the production list over which FIRST is to # be computed. # # FOLLOW is similar, except that it accepts only one symbol argument, # and returns the set of nonterminals that begin valid prefixes of # symbols that may follow symbol in the grammar defined by the # productions in st. # # Both FIRST() and FOLLOW() are optimized. When called for the first # time with a specific production list (st), both FIRST() and # FOLLOW() create the necessary data structures to calculate their # respective return values. Once created, these data structures are # saved, and re-used for subsequent calls with the same st argument. # The implications for the user are two: 1) The first call to FOLLOW # or FIRST for a given production list will take a while to return, # but 2) subsequent calls will return much faster. Naturally, you # can call both FIRST() and FOLLOW() with various st arguments # throughout the life of a given program. # ############################################################################ # # Links: none # ############################################################################ # # FIRST: list|set x string|integer... -> set # (st, symbols...) -> FIRST_set # # Where symbols are strings or integers (nonterminal or terminal # symbols in a production in the list or set of productions, st), # and where FIRST_set is a set of integers corresponding to # terminal symbols that begin valid prefixes of symbols[1], or if # that derives epsilon, of symbols[1] -- epsilon ++ symbols[2], # unless that derives epsilon, etc... # procedure FIRST(st, symbols[]) local i, result, FIRST_tbl static FIRST_tbl_tbl initial FIRST_tbl_tbl := table() /FIRST_tbl_tbl[st] := make_FIRST_sets(st) FIRST_tbl := FIRST_tbl_tbl[st] result := set() i := 0 while *symbols >= (i +:= 1) do { /FIRST_tbl[symbols[i]] & iohno(90, image(symbols[i])) if not member(FIRST_tbl[symbols[i]], -2) then { # We're done if no epsilons. result ++:= FIRST_tbl[symbols[i]] break } else { # Remove the epsilon & try the next symbol in p.RHS. result ++:= FIRST_tbl[symbols[i]] -- FIRST_tbl[-2] } } # If we get to here without finding a symbol that doesn't derive # epsilon, then give up and insert into result. if i > *symbols then result ++:= FIRST_tbl[-2] return result end # # FOLLOW: list|set x string|integer -> set # (st, symbol) -> FOLLOW_set # procedure FOLLOW(start_symbol, st, symbol) static FOLLOW_tbl_tbl initial FOLLOW_tbl_tbl := table() /FOLLOW_tbl_tbl[st] := make_slr_FOLLOW_sets(start_symbol, st) return FOLLOW_tbl_tbl[st][symbol] end # # Below is the procedure make_slr_FOLLOW_sets(start_symbol, st), # which accepts a string, a set, and a table as its arguments and # returns another table. The first argument must contain the start # symbol for the set (or list) of productions contained in the second # argument. Returns a table of FOLLOW sets, where keys = symbols and # values = follow sets for those symbols. # # The algorithm - somewhat inefficiently implemented here - works out # as follows: # # 1. Place $ (internal 0) in FOLLOW_tbl[start_symbol]. # 2. Initialize FOLLOW_tbl[symbol] to { } for every other symbol. # 3. For each production A -> aBb do FOLLOW_tbl[B] ++:= FIRST(b) -- # FIRST(). # 4. For each production A -> aBb where FIRST(b) contains # and for each production A -> aB, do FOLLOW_tbl[B] ++:= # FOLLOW_tbl[A]. # # Repeat steps 3 and 4 until no FOLLOW set can be expanded, at which # point return the FOLLOW table. # # Note that is represented internally by -2. # # # make_slr_FOLLOW_sets: string x set/list -> table # (start_symbol, st) -> FOLLOW_tbl # # Where start_symbol is the start symbol for the grammar defined # by the set/list of productions in st, and where FOLLOW_tbl is a # table of follow sets (keys = symbols, values = follow sets for # the symbols). # procedure make_slr_FOLLOW_sets(start_symbol, st) local FOLLOW_tbl, k, size, old_size, p, i, j FOLLOW_tbl := table() # step 1 above; note that 0 = EOF FOLLOW_tbl[start_symbol] := set([0]) # step 2 every k := (!st).LHS do /FOLLOW_tbl[k] := set() # steps 3 and 4 size := 0 # # When the old size of the FOLLOW sets equals the new size, we are # done because nothing was added to the FOLLOW sets on the last # pass. # while old_size ~===:= size do { size := 0 every p := !st do { every i := 1 to *p.RHS-1 do { type(p.RHS[i]) == "string" | next /FOLLOW_tbl[p.RHS[i]] & iohno(90, image(p.RHS[i])) # Go through every RHS symbol until we get a FIRST set # without an epsilon move. every j := i+1 to *p.RHS do { if member(FIRST(st, p.RHS[j]), -2) then { FOLLOW_tbl[p.RHS[i]] ++:= FIRST(st, p.RHS[j]) -- FIRST(st, -2) } else { FOLLOW_tbl[p.RHS[i]] ++:= FIRST(st, p.RHS[j]) size +:= *FOLLOW_tbl[p.RHS[i]] break next } } # If we get past "break next" then b in A -> aBb =>* # ; add FOLLOW_tbl[A] to FOLLOW_tbl[B]. FOLLOW_tbl[p.RHS[i]] ++:= FOLLOW_tbl[p.LHS] size +:= *FOLLOW_tbl[p.RHS[i]] } # Add FOLLOW_tbl[A] to FOLLOW_tbl[B] for the last symbol in the # RHS of every rule. type(p.RHS[*p.RHS]) == "string" | next /FOLLOW_tbl[p.RHS[*p.RHS]] & iohno(90, image(p.RHS[*p.RHS])) FOLLOW_tbl[p.RHS[*p.RHS]] ++:= FOLLOW_tbl[p.LHS] size +:= *FOLLOW_tbl[p.RHS[*p.RHS]] } } # Print human-readable version of FOLLOW_tbl if instructed to do so. if \DEBUG then print_follow_sets(FOLLOW_tbl) # check for useless nonterminal symbols every k := (!st).LHS do *FOLLOW_tbl[k] = 0 & iohno(91, k) return FOLLOW_tbl end # # Below is the routine make_FIRST_sets(st), which accepts as its one # argument a list or set of production records, and which returns a # table t, where t's keys are symbols from the grammar defined by the # productions in st, and where the values assocated with each of # these keys is the FIRST set for that key. # # Production records are structures where the first two fields, LHS # and RHS, contain the left-hand and right-hand side of each rule in # a given grammar. The right-hand side is a linked list of integers # (used for terminals) and strings (used for nonterminals). LHS must # contain a string. Terminals below 1 are reserved. Currently three # are actually used: # # 0 EOF # -1 error # -2 epsilon # # For a description of the FIRST() construction algorithm, see Alfred # Aho, Ravi Sethi, and Jeffrey D. Ullman _Compilers_ (Reading, # Massachusetts: Addison & Wesley, 1986), section 4.4, page 189. # Their algorithm is not strictly suitable, as is, for use here. I # thank Dave Schaumann of the University of Arizona at Tuscon for # explaining to me the iterative construction algorithm that in fact # *is* suitable. # # FIRST is computed on an iterative basis as follows: # # 1. For every terminal symbol a, FIRST(a) = { a } # 2. For every non-terminal symbol A, initialize FIRST(A) = { } # 3. For every production A -> , add to FIRST(A) # 4. For each production of the grammar having the form X -> Y1 # Y2 ... Yn, perform the following procedure: # i := 1 # while i <= number-of-RHS-symbols do { # if is not in FIRST(Y[i]) then { # FIRST(X) ++:= FIRST(Y[i]) # break # } else { # FIRST(X) ++:= FIRST(Y[i]) -- FIRST[] # i +:= 1 # } # } # if i > number-of-RHS-symbols then # # is in FIRST(Y[i]) # FIRST(X) ++:= FIRST[epsilon] # 5. Repeat step 3 until no new symbols or can be added # to any FIRST set # # # make_FIRST_sets: set/list -> table # st -> t # # Where st is a set or list of production records, and t is a # table of FIRST sets, where the keys = terminal or nonterminal # symbols and the values = sets of terminal symbols. # # Epsilon move is -2; terminals are positive integers; # nonterminals are strings. Error is -1; EOF is 0. # procedure make_FIRST_sets(st) local FIRST_tbl, symbol, p, old_size, size, i FIRST_tbl := table() FIRST_tbl[0] := set([0]) # steps 1, 2, and 3 above every p := !st do { # check for empty RHS (an error) *p.RHS = 0 & iohno(11, production_2_string(p)) # step 1 every symbol := !p.RHS do { if type(symbol) == "integer" then FIRST_tbl[symbol] := set([symbol]) } # step 2 /FIRST_tbl[p.LHS] := set() & # step 3 if *p.RHS = 1 then { if p.RHS[1] === -2 # -2 is epsilon then insert(FIRST_tbl[p.LHS], -2) } } # steps 4 and 5 above size := 0 # # When the old size of the FIRST sets equals the new size, we are # done. As long as they're unequal, set old_size to size and try # to add to the FIRST sets. # while old_size ~===:= size do { size := 0 every p := !st do { every i := 1 to *p.RHS do { \FIRST_tbl[p.RHS[i]] | iohno(90, image(p.RHS[i])) if not member(FIRST_tbl[p.RHS[i]], -2) then { # We're done with this pass if no epsilons. FIRST_tbl[p.LHS] ++:= FIRST_tbl[p.RHS[i]] size +:= *FIRST_tbl[p.LHS] break next } else { # Remove the epsilon & try the next symbol in p.RHS. FIRST_tbl[p.LHS] ++:= FIRST_tbl[p.RHS[i]] -- FIRST_tbl[-2] } } # If we get past the every...do structure without # break+next-ing, then we are still finding epsilons. In # this case, add epsilon to FIRST_tbl[p.LHS]. FIRST_tbl[p.LHS] ++:= FIRST_tbl[-2] size +:= *FIRST_tbl[p.LHS] } } # Print human-readable version of FIRST_tbl if instructed to do so. if \DEBUG then print_first_sets(FIRST_tbl) return FIRST_tbl end icon-9.4.3/ipl/packs/ibpag2/sortff.icn0000664000175000017500000000504707140713043017037 0ustar chrishchrish############################################################################ # # Name: sortff.icn # # Title: sortf with multiple field arguments # # Author: Bob Alexander and Richard L. Goerwitz # # Date: July 14, 1993 # ############################################################################ # # Sortff is like sortf(), except takes an unlimited number of field # arguments. E.g. if you want to sort a list of structures on field # 5, and (for those objects that have the same field 5) do a sub-sort # on field 2, you would use "sortff(list_of_objects, 5, 2)." # ############################################################################ # # sortff: structure [x integer [x integer...]] -> structure # (L, [fields ...]) -> new_L # # Where L is any subscriptable structure, and fields are any # number of integer subscripts in any desired order. Returns # a copy of structure L with its elements sorted on field 1, # and, for those elements having an identical field 1, sub- # sorted on field 2, etc. # procedure sortff(L, fields[]) *L <= 1 & { return copy(L) } return sortff_1(L, fields, 1, []) end procedure sortff_1(L, fields, k, uniqueObject) local sortField, cachedKeyValue, i, startOfRun, thisKey sortField := fields[k] L := sortf(L, sortField) # initial sort using fields[k] # # If more than one sort field is given, use each field successively # as the current key, and, where members in L have the same value for # this key, do a subsort using fields[k+1]. # if fields[k +:= 1] then { # # Set the equal-key-run pointer to the start of the list and # save the value of the first key in the run. # startOfRun := 1 cachedKeyValue := L[startOfRun][sortField] | uniqueObject every i := 2 to *L do { thisKey := L[i][sortField] | uniqueObject if not (thisKey === cachedKeyValue) then { # # We have an element with a sort key different from the # previous. If there's a run of more than one equal keys, # sort the sublist. # if i - startOfRun > 1 then { L := L[1:startOfRun] ||| sortff_1(L[startOfRun:i], fields, k, uniqueObject) ||| L[i:0] } # Reset the equal-key-run pointer to this key and cache. startOfRun := i cachedKeyValue := L[startOfRun][sortField] | uniqueObject } } # # Sort a final run if it exists. # if i - startOfRun > 1 then { L := L[1:startOfRun] ||| sortff_1(L[startOfRun:0], fields, k, uniqueObject) } } return L end icon-9.4.3/ipl/packs/itweak/0002775000175000017500000000000010336137160015156 5ustar chrishchrishicon-9.4.3/ipl/packs/itweak/Makefile0000664000175000017500000001030307307533224016616 0ustar chrishchrish############################################################################ # # Unix Makefile for installing itweak and running a sample debugging session. # # $Id: Makefile,v 2.21 1996/10/04 03:45:37 hs Rel $ # updated 4-aug-2000/gmt # # 'make' or 'make install' # does the necessary compilations to get the itweak package ready to use. # Note, however, that it leaves the resulting files in the current directory. # You must move or copy them yourself if you want them any other place. # (See the documentation.) # # 'make sample-debug' # compiles, tweaks, and links a sample program to make it ready for a # debugging session. # Assumes the 'dbg_run.u?' files are on your IPATH or in the current directory # which is the case if you haven't moved things around since 'make install'. # # The sample executable is named 'sample'. # The program is, however, identical 'ipxref' copied from the Icon Library. # It also requires 'options.icn' (included), so the program is built from two # source files. # # 'make demo' # runs a debugging session with the sample program. # It is uncommon to run debugging sessions from a Makefile. # This is only for demo purposes. # # This makefile is in itself an example of how to construct makefiles. # It provides a simple way to switch between a clean (untweaked) version # and a tweaked version of the sample program without duplicating a lot of # makefile code. # Use 'make sample-clean' to force compilation of a clean (untweaked) copy of # 'sample'. # ############################################################################ # # Copyright (c) 1994 Hakan Soderstrom and # Soderstrom Programvaruverkstad AB, Sweden # # Permission to use, copy, modify, distribute, and sell this software # and its documentation for any purpose is hereby granted without fee, # provided that the above copyright notice and this permission notice # appear in all copies of the software and related documentation. # # THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, # EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY # WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. # # IN NO EVENT SHALL HAKAN SODERSTROM OR SODERSTROM PROGRAMVARUVERKSTAD # AB BE LIABLE FOR ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL # DAMAGES OF ANY KIND, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS # OF USE, DATA OR PROFITS, WHETHER OR NOT ADVISED OF THE POSSIBILITY # OF DAMAGE, AND ON ANY THEORY OF LIABILITY, ARISING OUT OF OR IN # CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # ############################################################################ ICONT=icont -s ITWEAK=itweak MAKEFILE=Makefile SAMPLE_INIT=samp_ini.icn CMD=demo.cmd ##### 'install' targets install : itweak dbg_run.u1 itweak : itweak.icn $(ICONT) itweak.icn dbg_run.u1 : dbg_run.icn $(ICONT) -c dbg_run.icn ##### 'sample' targets: first the plain ones ##### The program is built from source files 'ipxref.icn' and 'options.icn'. ##### The name of the resulting program is 'sample'. sample : ipxref.u1 options.u1 $(DEBUG) $(ICONT) -u -o sample ipxref.u1 options.u1 ipxref.u1 : ipxref.icn $(ICONT) -cu ipxref.icn options.u1 : options.icn $(ICONT) -cu options.icn ##### 'sample' targets: the debugging stuff sample-debug : $(MAKE) -f $(MAKEFILE) sample DEBUG=$(SAMPLE_INIT) $(SAMPLE_INIT) : ipxref.u1 options.u1 @echo '*** This is how the program files are tweaked...' $(ITWEAK) -o $(SAMPLE_INIT) ipxref options @echo '*** ... and don't forget to compile the generated file.' $(ICONT) -cu $(SAMPLE_INIT) sample-clean : rm -f ipxref.u? options.u? $(MAKE) -f $(MAKEFILE) sample ##### demo session demo : sample-debug @echo 'We will now start a sample debugging session.' @echo 'Debugging commands will be taken from the file $(CMD).' @echo 'Please open an editor on this file -- the commands will' @echo 'not appear in the debugger output.' @echo '-------------- session start --------------------------' @(DBG_INPUT=$(CMD); export DBG_INPUT; sample ipxref.icn) @echo '-------------- session end ----------------------------' ##### build executable and copy to ../../iexe ##### (nothing done in this case because the executable doesn't stand alone) Iexe : ##### cleanup Clean : rm -f $(ITWEAK) *.u[12] icon-9.4.3/ipl/packs/itweak/itweak.icn0000664000175000017500000006314107140713043017137 0ustar chrishchrish############################################################################ # # File: itweak.icn # # Subject: Icon interactive debugging. # Tweaks a ucode file ('.u1') to invoke a debugging procedure. # # Author: Hakan Soderstrom # # Revision: $Revision: 2.21 $ # ########################################################################### # # Copyright (c) 1994 Hakan Soderstrom and # Soderstrom Programvaruverkstad AB, Sweden # # Permission to use, copy, modify, distribute, and sell this software # and its documentation for any purpose is hereby granted without fee, # provided that the above copyright notice and this permission notice # appear in all copies of the software and related documentation. # # THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, # EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY # WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. # # IN NO EVENT SHALL HAKAN SODERSTROM OR SODERSTROM PROGRAMVARUVERKSTAD # AB BE LIABLE FOR ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL # DAMAGES OF ANY KIND, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS # OF USE, DATA OR PROFITS, WHETHER OR NOT ADVISED OF THE POSSIBILITY # OF DAMAGE, AND ON ANY THEORY OF LIABILITY, ARISING OUT OF OR IN # CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # ########################################################################### # #-------- Record types -------- # record l_decl (d_type, d_serial, d_code, d_name, d_displ, ld_cserial, ld_dbg) # Holds a 'local' declaration. # 'd_type' must be the declaration type (integer), in this case, $define D_LOCAL 1 # 'd_serial' must be the serial number of the declaration (integer). # 'd_code' must be the bitfield that further characterizes the declaration. # It is stored as the integer obtained by interpreting the octal coded # bitfield as a decimal number. # 'd_name' must be the source name of the declared entity. # 'd_displ' must be non-null to indicate that this declaration is to be # passed to the debug procedure. # 'ld_cserial' may be a constant serial number (integer), or null. # If integer then the name of this local exists as a constant in the current # procedure, which means we include it among the visible variables. # 'ld_dbg' is non-null if the declaration has been added by this program. record c_decl (d_type, d_serial, d_code, d_name, d_displ) # Holds a constant declaration added by the program. # Like 'l_decl', except 'd_type' must be $define D_CONST 2 record fmap (fm_ucode, fm_source) # Holds the mapping between an ucode file name and a source file name. # 'fm_ucode' must be the root of an ucode file name (string). # I.e. the file name without the trailing '.u?'. # 'fm_source' must be the name of the source file from which the ucode # file originates (string). global file_map # Set containing mapping between ucode and source files (set of record fmap). global file_root, uin, uout, ulno # The current root file name (i.e. file name without '.u?'). # The current ucode input file. # The current ucode output file. # The current line number in the current ucode input file. global init_file # Output file name: init file. global msgout # Message output file. global proc_hil # Table containing the "high label" of each procedure in a ucode file. # Entry key is a procedure name (string). # Entry value is the numeric part of the highest existing label before # debugification (integer). global white # This program's definition of white space. # #-------- Constants -------- # # Version of this program, variable for holding it. $define PROGRAM_VERSION "$Revision: 2.21 $" $define PROG_VERSION_VAR "__dbg_itweak_ver" # DEBUGGING IDENTIFIERS. # List holding breakpoints for one source file; two parts. # The root file name should be spliced in between. $define DBG_BRKP1 "__dbg_file_" $define DBG_BRKP2 "_brkp" # Global variable holding source/ucode file map. # Note: any change affects 'dbg.icn' as well. $define DBG_FILE_MAP "__dbg_file_map" # Procedure for initializing debugging globals. $define DBG_INIT "__dbg_init" # Local variable: trapped line number. $define DBG_LINE "__dbg_line" # List containing names of interesting local variables. $define DBG_NAME "__dbg_name" # Procedure to call on break. $define DBG_PROC "__dbg_proc" # Procedure deciding on break. $define DBG_TEST "__dbg_test" # Name of variable whose presence is taken as assurance that an ucode # file has been tweaked. $define DBG_SENTINEL DBG_LINE # Default file name for writing the debug initialization code. $define DBG_INIT_FILE "dbg_init.icn" # File name for the debugging run-time. $define DBG_RUN_TIME "dbg_run.u1" # Ucode 'codes' (bitfields) for local declarations. # The values are the octal coded bitfield interpreted as decimal. $define LD_GLOBAL 0 $define LD_LOCAL 20 $define LD_PARM 1000 $define LD_STATIC 40 # Ucode 'codes' (bitfields) for constant declarations. $define CD_INT 2000 $define CD_STRING 10000 # Various ucode op-codes. $define OP_CONST "con" $define OP_DEND "declend" $define OP_END "end" $define OP_FILEN "filen" $define OP_LABEL "lab" $define OP_LINE "line" $define OP_LOCAL "local" $define OP_PROC "proc" # Op-codes in the '.u2' file. $define OP_VERSION "version" $define OP_LINK "link" $define OP_GLOBAL "global" # Icon versions for which the program has been tested. $define ICON_VER_LO "U8.10.00" $define ICON_VER_HI "U9.0.00" # Prefix used for labels. $define ULAB_PREF "L" $define NALN -1 # Not A Line Number. $define PROGNAME "itweak" # The name by which the user knows this program. $define U1 ".u1" $define U2 ".u2" # Standard ucode file name suffix. $define U1TMP ".uA" $define U2TMP ".uB" # Suffix of temporary ucode file. $define U1OLD ".u1~" $define U2OLD ".u2~" # Suffix of renamed, original ucode file. # #-------- Main -------- # procedure main (argv) local file_names, iout, u2count # Initialize globals. file_map := set () msgout := &errout white := '\t ' # Process command line options; leave a list of file names. if argv[1] == "-o" then { get (argv) (init_file := get (argv)) | confl ("'-o' requires a file name") } else init_file := DBG_INIT_FILE file_names := copy (argv) # The number of tweaked '.u2' files. u2count := 0 # Do two passes on each file. every file_root := !file_names do { # Allow for 'file.u1' and 'file.u'. file_root := if file_root[-3:0] == ".u1" then file_root[1:-3] else if file_root[-2:0] == ".u" then file_root[1:-2] # Pass 1. (uin := open (file_root || U1, "r")) | confl ("Cannot open '%1%2' for input.", file_root, U1) uout := &null if pass1 () then { close (uin) # Tweak at most one '.u2' file. if u2count = 0 then { (uin := open (file_root || U2, "r")) | confl ("Cannot open '%1%2' for input.", file_root, U2) (uout := open (file_root || U2TMP, "w")) | confl ("Cannot open '%1%2' for output.", file_root, U2TMP) u2tweak () close (uin) close (uout) u2count +:= 1 # Make way for the following rename. remove (file_root || U2OLD) rename (file_root || U2, file_root || U2OLD) | confl ("Cannot rename '%1%2' to '%1%3'.", file_root, U2, U2OLD) rename (file_root || U2TMP, file_root || U2) | confl ("Cannot rename '%1%2' to '%1%3'.", file_root, U2TMP, U2) } # Pass 2. (uin := open (file_root || U1, "r")) | confl ("Cannot open '%1%2' for input.", file_root, U1) (uout := open (file_root || U1TMP, "w")) | confl ("Cannot open '%1%2' for output.", file_root, U1TMP) pass2 () close (uin) close (uout) # Make way for the following rename. remove (file_root || U1OLD) rename (file_root || U1, file_root || U1OLD) | confl ("Cannot rename '%1%2' to '%1%3'.", file_root, U1, U1OLD) rename (file_root || U1TMP, file_root || U1) | confl ("Cannot rename '%1%2' to '%1%3'.", file_root, U1TMP, U1) } else { close (uin) note ("'%1%2' seems to be tweaked already; left untouched.", file_root, U1) } } # Write initialization code. (iout := open (init_file, "w")) | confl ("Cannot open '%1' for output.", init_file) cre_init (iout) note ("Initialization code written to '%1'.", init_file) end # #-------- Pass 1 procedures -------- # procedure pass1 () # Performs a first pass over a ucode file, collecting label statistics. # RETURNS null normally. # FAILS if the first procedure has a local declaration containing the sentinel # variable. # This is taken to imply that the ucode file is already tweaked. # SIDE EFFECT: Updates glocal 'proc_hil' (max labels per proc). # Updates 'file_map' (source file name ~ ucode file name). local cur_high, cur_proc, labint, line, loc, op, proc_no static fn_instr, lc_decl initial { fn_instr := [OP_FILEN, OP_LINE, OP_LABEL] lc_decl := [OP_LOCAL, OP_CONST, OP_DEND] } proc_hil := table () loc := table () proc_no := 0 while op := p1_proclab () do if op[1] == "proc" then { if \cur_proc then { (/proc_hil[cur_proc] := cur_high) | confl ("%1: occurs twice; confusing.", cur_proc) } cur_proc := op[2] cur_high := -1 # Special treatment of the first procedure in every file. if (proc_no +:= 1) = 1 then { # Borrow some pass 2 code to collect the local declarations. while (op := p2_upto (lc_decl))[1] == OP_LOCAL do p2_getlocal (loc, op[2]) # Look for source file name. repeat if (op := p2_upto (fn_instr))[1] == OP_FILEN then { insert (file_map, fmap (file_root, op[2])) break } else if op[1] == OP_LABEL then cur_high <:= integer (op[2][2:0]) # Flush buffers. p2_upto () # Fail if the sentinel is present. if \loc[DBG_SENTINEL] then fail } } else if op[1] == "lab" then { # ASSUME the label consists of one character followed by an integer. (labint := integer (op[2][2:0])) | intern ("pass1: Problem parsing label %1.", image (op[2])) cur_high <:= labint } if \cur_proc then { (/proc_hil[cur_proc] := cur_high) | confl ("%1: occurs twice; confusing.", cur_proc) } else intern ("pass1: No proc found.") return &null end procedure p1_proclab () # Returns the next ucode line containing a "proc" or "lab" instruction. # If a matching line is found, RETURNS a two-component list. # The first element contains the instruction found (string). # The second element contains the second word on the line. # FAILS on end-of-file. local line, opcode, tail static opchar initial opchar := &lcase while line := read (uin) do line ? { if (opcode := tab (many (opchar))) == ("proc" | "lab") then { tab (many (white)) tail := tab (upto (white) | 0) break } } return [opcode, \tail] end # #-------- Pass 2 procedures -------- # procedure pass2 () # Performs a second pass over the ucode file, doing the actual tweaking. # Writes the new ucode to 'uout'. local counter, op counter := 0 while op := p2_upto ([OP_PROC]) do p2_proc (trim (op[2]), counter +:= 1) end procedure p2_addbrkp (line, last_lab, dbg_brkp, dbg_label, dbg_line, dbg_test) # Adds code for breakpoint testing. # 'line' should be the line number associated with the current ucode 'line' # instruction. # 'ltab' must be a table containing declarations of the current procedure. # 'last_lab' must be the previous highest label serial (integer). # RETURNS the new highest label serial. write (uout, "\tmark\t", ULAB_PREF, last_lab +:= 1, "\n\tpnull", "\n\tvar\t", dbg_line, "\n\tvar\t", dbg_test, "\n\tvar\t", dbg_brkp, "\n\tkeywd\tline\n\tinvoke\t2\n\tasgn\n\tgoto\t", dbg_label, "\n\tunmark\nlab ", ULAB_PREF, last_lab) return last_lab end procedure p2_addcall (ltab, dbg_label, init_label, end_label, dbg_line, dbg_name, dbg_proc, pname_decl) # Adds code for invoking the debug procedure. local decl, pname_var, vlist # Make vlist an alphabetically sorted list of identifiers: the names of # the variables which should be passed to the debugging procedure. vlist := [] every \(decl := !ltab).d_displ do put (vlist, decl.d_name) vlist := sort (vlist) # Begin writing the code. write (uout, "\tgoto\t", end_label, "\nlab ", dbg_label, "\n\tinit\t", init_label, "\n\tmark\t", init_label, "\n\tpnull\n\tvar\t", dbg_name, "\n\tpnull") every write (uout, "\tstr\t", (ltab[!vlist]).ld_cserial) pname_var := if pname_decl.d_type = D_LOCAL then pname_decl.ld_cserial else pname_decl.d_serial write (uout, "\tllist\t", *vlist, "\n\tasgn\n\tunmark\nlab ", init_label, "\n\tmark0\n\tvar\t", dbg_proc, "\n\tkeywd\tfile\n\tvar\t", dbg_line, "\n\tstr\t", pname_var, "\n\tvar\t", dbg_name) every write (uout, "\tvar\t", (ltab[!vlist]).d_serial) write (uout, "\tinvoke\t", 4 + *vlist, "\n\tunmark\nlab ", end_label, "\n\tpfail") end procedure p2_addconst (decl, last_ser) # Adds a string constant declaration containing the name of a local or constant # declaration. # 'decl' must be the declaration (record l_decl or c_decl). # 'last_ser' must be the previous highest constant serial in this procedure. # RETURNS the serial of the new constant. # SIDE EFFECT: Updates 'decl'. # Writes the new constant to the ucode output file. # NOTE: This version does not add the name if the declaration is a global and # is known to be a procedure. local serial # Omit variables which have been added by this program. (decl.d_type = D_CONST) | (/decl.ld_dbg & decl.d_code ~= LD_GLOBAL) | fail (decl.d_type = D_CONST) | (decl.d_displ := 1) serial := last_ser + 1 if decl.d_type = D_LOCAL then decl.ld_cserial := serial else decl.d_serial := serial writes (uout, "\tcon\t", serial, ",", right (CD_STRING, 6, "0"), ",", *decl.d_name) every writes (uout, ",", octal (ord (!decl.d_name))) write (uout) return serial end procedure p2_addinit (ltab, init_label) write (uout, "\tinit\t", init_label, "\n\tmark\t", init_label, "\n\tvar\t", ltab[DBG_INIT].d_serial, "\n\tinvoke\t0\n\tunmark\nlab ", init_label) end procedure p2_addlocal (pname, ltab, serial, code, name, dbg) # Adds a local declaration to a table. # 'pname' must be the current procedure name. # 'ltab' must be the table where the new declaration is stored. # See 'p2_getlocal' for details. # 'serial' must be the serial to assign to the new declaration. # 'code' must be the code, # 'name' must be the name of the new declaration. # 'dbg' may be non-null to indicate something different from a normal variable # declaration. # RETURNS the new declaration (record l_decl). # SIDE EFFECT: Writes code for the new declaration to the ucode output file. # Creates a new entry in 'ltab'. local decl, old_d # Check if the declaration already is there. if old_d := \ltab[name] then { # Check that the existing declaration is equivalent to the new. (old_d.d_code = code) | confl ("%1: conflicting declarations in procedure %2.", name, pname) return old_d } decl := l_decl (D_LOCAL) decl.d_serial := serial decl.d_code := code decl.ld_dbg := 1 ltab[decl.d_name := name] := decl write (uout, "\tlocal\t", serial, ",", right (code, 6, "0"), ",", name) return decl end procedure p2_brkp () # Scans the ucode input file for the next breakpoint location. # Ucode 'line' instructions are considered suitable breakpoint locations. # If there are several 'line' instructions with the same line number only the # last one is considered suitable. # If a location is found, RETURNS the line number of the current location. # FAILS if no suitable location is found. # This means that an 'end' instruction has been reached # When the procedure returns the 'line' instruction has been copied to the ucode # output file. # When the procedure encounters an 'end' instruction this instruction is not # copied to the ucode output file. local last_lno, line, opcode static cur_lno, opchar initial { cur_lno := NALN opchar := &lcase ++ '01' } repeat { # Read and copy until the next 'line' or 'end' instruction is found. repeat { (line := read (uin)) | intern ("p2_brkp: unexpected end of file.") line ? if tab (many (white)) & (opcode := tab (many (opchar))) then { (opcode ~== OP_END) | { last_lno := NALN break } write (uout, line) (opcode ~== OP_LINE) | { last_lno := integer (tab (0)) break } } else write (uout, line) } if last_lno = NALN then break else case cur_lno of { # Still the same line, try another one. last_lno: next # a little unstructured ... # First line found. NALN: cur_lno := last_lno # OK, this is it, stop here. default: break } } if last_lno = NALN then fail else return cur_lno :=: last_lno end procedure p2_getlocal (ltab, dstring) # Gets a local declaration from ucode representation; adds it to a table. # 'ltab' must be a table storing declarations. # Entry key is the variable name. # Entry value is an 'l_decl' record. # 'dstring' must be the ucode string defining the local. # RETURNS the serial number of the new declaration. # SIDE EFFECT: Adds an entry to 'ltab'. local decl decl := l_decl (D_LOCAL) dstring ? { decl.d_serial := integer (tab (many (&digits))) ="," decl.d_code := integer (tab (many (&digits))) ="," decl.d_name := tab (upto (white) | 0) } ltab[decl.d_name] := decl return decl.d_serial end procedure p2_newlocals (pname, ltab, last_ser, main_flag) # Adds debugging local declarations to a procedure. # 'pname' must be the procedure name (string). # 'ltab' must be a table holding local declarations; see 'p2_getlocal'. # 'last_ser' must be the last (highest) serial previously assigned. # 'main_flag' must be non-null if the current procedure is 'main'. # This will add the DBG_INIT procedure. # RETURNS the last local declaration serial. # SIDE EFFECT: Writes the new declarations to the ucode output file. # Adds the new declarations to 'ltab'. # Add the debugging init procedure if this is 'main'. /main_flag | p2_addlocal (pname, ltab, last_ser +:= 1, LD_GLOBAL, DBG_INIT) p2_addlocal (pname, ltab, last_ser +:= 1, LD_LOCAL, DBG_LINE) p2_addlocal (pname, ltab, last_ser +:= 1, LD_STATIC, DBG_NAME) p2_addlocal (pname, ltab, last_ser +:= 1, LD_GLOBAL, DBG_PROC) p2_addlocal (pname, ltab, last_ser +:= 1, LD_GLOBAL, DBG_TEST) p2_addlocal (pname, ltab, last_ser +:= 1, LD_GLOBAL, make_brkp_idf (file_root)) return last_ser end procedure p2_proc (pname) # Tweaks the ucode of a single procedure. # 'pname' must be the name of the procedure. # SIDE EFFECT: Writes tweaked ucode to the ucode output file. local dbg_brkp, dbg_label, dbg_line, dbg_name, dbg_proc, dbg_test local init_label, end_label, pname_decl local loc, first_new_const, last_conser, last_label, last_locser, line local main_flag, op static con_decl, lc_decl initial { # This is just a piece of hand optimization. con_decl := [OP_CONST, OP_DEND] lc_decl := [OP_LOCAL, OP_CONST, OP_DEND] } main_flag := pname == "main" # Go through local declarations; add some new. # See 'p2_getlocal' for documentation of the 'loc' table. loc := table () last_locser := -1 while (op := p2_upto (lc_decl))[1] == OP_LOCAL do { last_locser <:= p2_getlocal (loc, op[2]) } # Add our own locals, write them to the ucode output file. last_locser := p2_newlocals (pname, loc, last_locser, main_flag) # Go through constant declarations in order to find the maximum serial. last_conser := -1 repeat { if op[1] == OP_CONST then last_conser <:= (op[2] ? integer (tab (many (&digits)))) else break (op := p2_upto (con_decl)) | break } # Declare a constant for the procedure name. # Note that the procedure name may be hidden by a local! /loc[pname] := c_decl (D_CONST, , CD_STRING, pname) # Add new constant declarations to the ucode file. first_new_const := last_conser + 1 every last_conser := p2_addconst (!loc, last_conser) # We will soon need a new label. last_label := proc_hil[pname] # Flush the 'p2_upto' buffer, normally the 'declend' instruction. p2_upto () # If this is the 'main' procedure insert code for invoking the # initialization procedure. if \main_flag then p2_addinit (loc, ULAB_PREF || (last_label +:= 1)) # Insert breakpoint testing code. dbg_brkp := loc[make_brkp_idf (file_root)].d_serial dbg_label := ULAB_PREF || (last_label +:= 1) dbg_line := loc[DBG_LINE].d_serial dbg_test := loc[DBG_TEST].d_serial while last_label := p2_addbrkp (p2_brkp (), last_label, dbg_brkp, dbg_label, dbg_line, dbg_test) # Write the debug invocation code. init_label := ULAB_PREF || (last_label +:= 1) end_label := ULAB_PREF || (last_label +:= 1) dbg_name := loc[DBG_NAME].d_serial dbg_proc := loc[DBG_PROC].d_serial pname_decl := loc[pname] p2_addcall (loc, dbg_label, init_label, end_label, dbg_line, dbg_name, dbg_proc, pname_decl) # Add an 'end' instruction swallowed by 'p2_brkp'. write (uout, "\t", OP_END) end procedure p2_upto (op) # Scans the ucode file, looking for the next line containing an interesting # op-code. # Copies non-matching lines to the new ucode file (if non-null) # 'op' must be a list of the interesting op-code(s), or null. # If a matching line is found, RETURNS a list of two elements. # The first element contains the op-code, the second element the tail of the # instruction (excluding any leading white space). # FAILS on end-of-file. # FLUSHING THE BUFFER: # If the procedure is invoked with null 'op' any uncopied lines are written to # the ucode output file; the procedure fails. # NOTE: The procedure is used occasionally in pass 1, where there is no 'uout' # file. # This is the reason 'uout' is checked for existence (otherwise ucode will # appear on standard output). local opcode, tail static new_line, opchar, old_line initial opchar := &lcase ++ '01' write (\uout, \new_line) new_line := &null \op | fail repeat { old_line := new_line (new_line := read (uin)) | fail new_line ? { tab (many (white)) if (opcode := tab (many (opchar))) == !op then { tab (many (white)) tail := tab (0) break } else write (\uout, new_line) } } return [opcode, tail] end # #-------- '.u2' tweaking ----------- # procedure u2tweak () # Tweaks a '.u2' file, which means: # Check the Icon version number; # insert 'link' commands to the debugging run-time and to the init procedure. local hitcount, op (op := p2_upto ([OP_VERSION])) | { note ("Surprising absence of 'version' in .u2 file...") fail } (ICON_VER_LO <<= op[2] <<= ICON_VER_HI) | note ("WARNING: %1 is tested only for Icon versions '%2'-'%3', found '%4'.", PROGNAME, ICON_VER_LO, ICON_VER_HI, op[2]) hitcount := 0 while (op := p2_upto ([OP_LINK, OP_GLOBAL]))[1] == OP_LINK do if op[2] == DBG_RUN_TIME then hitcount +:= 1 if hitcount = 0 then { write (uout, OP_LINK, "\t", DBG_RUN_TIME) write (uout, OP_LINK, "\t", init_file) } p2_upto () while write (uout, read (uin)) end # #-------- General message handling and other utilities -------- # procedure confl (msg, parm[]) # Writes a conflict message and stops the program with nonzero exit code. message ("[CONFLICT] ", subst (msg, parm)) message ("*** ", PROGNAME, " stops with failure.") stop () end procedure cre_init (f) # Creates initialization code. # 'f' must be a file open for output. local map, version version := (PROGRAM_VERSION ? (tab (upto (&digits)), tab (many (&digits++'.')))) every write (f, "global ", (PROG_VERSION_VAR | DBG_TEST | DBG_FILE_MAP)) every write (f, "global ", make_brkp_idf ((!file_map).fm_ucode)) write (f, "\nprocedure ", DBG_INIT, " ()\n\t", PROG_VERSION_VAR, " := \"", version, "\"\n\t", DBG_TEST, " := member") every write (f, "\t", make_brkp_idf ((!file_map).fm_ucode), " := set ()") write (f, "\t", DBG_FILE_MAP, " := table ()") every map := !file_map do write (f, "\t", DBG_FILE_MAP, "[\"", map.fm_source, "\"] := ", make_brkp_idf (map.fm_ucode)) write (f, "\t", DBG_PROC, " ()\nend") end procedure fld_adj (str) # Part of 'subst' format string parsing. # 'str' must be a parameter string identified by the beginning part of a # placeholder ('%n'). # This procedure checks if the placeholder contains a fixed field width # specifier. # A fixed field specifier begins with '<' or '<' and continues with the field # width expressed as a decimal literal. # RETURNS 'str' possibly inserted in a fixed width field. local just, init_p, res, wid static fwf initial fwf := '<>' init_p := &pos if (just := if ="<" then left else if =">" then right) & (wid := integer (tab (many (&digits)))) then res := just (str, wid) else { res := str &pos := init_p } return res end procedure intern (msg, parm[]) # Writes an internal conflict message and stops the program with nonzero exit # code. message ("*** INTERNAL: ", subst (msg, parm)) message ("*** ", PROGNAME, " stops with failure.") stop () end procedure make_brkp_idf (ucode_root) # RETURNS an identifier which should be used to hold the breakpoints of an # ucode file whose root name is 'ucode_root'. return DBG_BRKP1 || ucode_root || DBG_BRKP2 end procedure message (parm[]) # Writes any number of strings to the message file. every writes (msgout, !parm) write (msgout) end procedure note (msg, parm[]) # Writes a note message. message ("[NOTE] ", subst (msg, parm)) end procedure octal (i) # RETURNS the 'i' integer in the form of an octal literal. static digits local s, d initial digits := string (&digits) if i = 0 then return "0" s := "" while i > 0 do { d := i % 8 if d > 9 then d := digits[d + 1] s := d || s i /:= 8 } return s end procedure subst (msg, parm) # Substitutes parameters in a message template. # 'msg' must be a message template (string). # 'parm' must be a list of parameters (list of string-convertible), or null. # It may also be a string. local esc, res, sub static p_digit initial p_digit := '123456789' \parm | return msg parm := [string (parm)] res := "" msg ? until pos (0) do { res ||:= tab (upto ('%\\') | 0) if ="%" then res ||:= { if any (p_digit) then { sub := (\parm[integer (move (1))] | "") fld_adj (sub) } else if any ('%') then move (1) else "" } else if ="\\" then res ||:= case esc := move (1) of { "n": "\n" "t": "\t" default: esc } } return res end icon-9.4.3/ipl/packs/itweak/itweak.htm0000664000175000017500000006732707140713043017170 0ustar chrishchrish Itweak: Interactive Icon Debugging

itweak
An Interactive Debugging Utility for the
Icon Programming Language

Release 2.21

Håkan Söderström (hs@soderstrom.se)

Söderström Programvaruverkstad AB
Bandhagsvägen 51
S-122 42 Enskede, Sweden

Contents

  1. Introduction, Acknowledgements and Non-Warranty
  2. Prerequisites
  3. Installing itweak
  4. Debugging Samples
  5. Preparing for a Debugging Session
  6. The Debugging Session
  7. Performance Considerations
  8. Implementation Notes (The Hidden Art of Tweaking)
Copyright © 1994-1996 Hakan Soderstrom and Soderstrom Programvaruverkstad AB, Sweden. Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted without fee, provided that the above copyright notice and this permission notice appear in all copies of the software and related documentation.

1. Introduction, Acknowledgements and Non-Warranty

itweak is an Icon interactive debugging utility. The idea is that you compile your Icon program to ucode files (.u1, .u2). itweak then tweaks the ucode, inserting potential breakpoints. The resulting ucode files are linked with a debugging run-time and off you go.

The itweak system provides you with many of the facilities you would expect from an interactive debugger, including the ability to evaluate a wide range of Icon expressions. Personally I wouldn't like to be without this tool, but I may be biased. It can be used both for finding bugs and to convince oneself that an Icon program indeed works the intended way.

itweak owes a lot to the pioneering debugify system by Charles A. Shartsis. This heritage is gratefully acknowledged. What itweak offers over debugify is radically improved performance (in time as well as space) and a more fully-fledged run-time system.

The author believes the software is useful but wouldn't imagine it is free from bugs. The software is provided "as-is" and without warranty of any kind. Please send bug reports, change requests, and other comments to the address above.

2. Prerequisites

itweak has been tested with Icon 8.10 and 9.0 under Unix (SunOS 4.1.4) and DOS. The software is completely written in Icon, and should be as portable as Icon itself.

3. Installing itweak

Installation is straightforward. For Unix there is a makefile that does most of the job.

Unix

Under Unix, type make in the installation directory. The following files are generated.

itweak
an Icon 'executable'. Copy it to a commonly accessible directory and include it in your PATH.
dbg_run.u1, dbg_run.u2
These files constitute the debugging run-time system which will be linked with your tweaked programs. Make the debugging run-time available to the Icon linker by including its directory in the IPATH environment variable. Or, alternatively, make sure that the dbg_run.u files are present in the same directory as the program you are going to debug.

Other Platforms, or Platforms Without Make

itweak comes with two Icon source files, itweak.icn and dbg_run.icn. Run the following command to produce the itweak program,

icont itweak.icn

Put itweak (the resulting file) in a commonly accessible directory and include it in your PATH. (If you can, you should of course use the Icon compiler to produce itweak.) Now run the following command,

icont -c dbg_run.icn

The resulting files (dbg_run.u1, dbg_run.u2) constitute the debugging run-time system which will be linked with your tweaked programs.

Make the debugging run-time available to the Icon linker by including its directory in the IPATH environment variable. Or, alternatively, make sure that the dbg_run.u files are present in the same directory as the program you are going to debug.

4. Debugging Samples

There are at least two ways you may examine itweak without committing yourself too heavily to it.

Canned Debugging Session

The itweak distribution comes with a demo. Under Unix, type make demo to make it happen.

On other platforms, or on platforms without make: do the following commands.

icont -c ipxref.icn
icont -c options.icn
itweak -o samp_ini.icn ipxref options
icont -c samp_ini.icn
icont -o sample ipxref.u1 options.u1
setenv DBG_INPUT demo.cmd
sample ipxref.icn

The commands compile and tweak a sample program. The source files are ipxref.icn and options.icn. The resulting 'executable' is called sample. The last command runs a canned debugging session.

Debugging commands for the demo are taken from the file demo.cmd. To make the demo more meaningful you should open an editor on demo.cmd and compare it to the output of the debugging session. The commands are annotated.

Sample Debugging Commands

Read this to get a first impression of what kinds of debugging commands itweak offer. For reading convenience all commands are spelled out fully. (Commands may be abbreviated as long as the abbreviation is unambiguous.)

Set a breakpoint on a source code line and then let the program run to its first break.

break 88 goon

In the following examples we omit the goon command which makes the program continue until the next break (or until it exits).

Print the current value of a simple variable (word).

print word

Attach a macro which automatically prints word every time we hit this breakpoint.

do .
print word
end

Attach a condition to the breakpoint which causes a break only if word contains the string buffer.

cond . word == "buffer"

The dot means the current breakpoint.

Now some more advanced printing: Print every value generated by an expression. This is useful if the variable contains a list, for example.

eprint !resword

You may use subscripting and record field references when printing an expression:

print prec[1].pname

The printing commands actually accept almost all Icon expressions. You may invoke procedures or Icon functions, for instance.

You may use the info command to get information about a breakpoint, source files, local or global variables, among other things:

info break .
info files
info local
info global

These are not all commands. Please refer to the special section on debugging commands. The itweak on-line help contains details about all available commands.

5. Preparing for a Debugging Session

In order to debug an Icon program you will need to go through the following major steps. These steps assume you have installed itweak as described above.

  1. Compile the Icon source files (usually icont -c).
  2. Tweak some or all of the program's ucode files.
  3. Compile the Icon source file generated by itweak.
  4. Link the tweaked files.
  5. Run an interactive debugging session.

The demo described in the previous section provides an example. The next few sections go more into detail.

Tweaking and Linking an Icon Program

Let us assume you have a program built from source files named alpha.icn, beta.icn, and gamma.icn. Compile all source files, but do not link them yet. A suitable command is

icont -c alpha.icn beta.icn gamma.icn

This will produce .u1 and .u2 (i.e. ucode) files for each of the source files.

It is not necessary to tweak all files. However, you will be able to set breakpoints only in tweaked files. In order to illuminate this point, let us assume you decide to tweak only files alpha and gamma. Do this the following way. Note that the itweak command takes base file names, omitting the file name extension (.u1, for example).

itweak alpha gamma

The above command will tweak alpha.u1 and gamma.u1 and one of the .u2 files. It is important to tweak the files in a single itweak command. For reasons described in the quirks section the general recommendation is that you include the file containing the main procedure in the set of tweaked files.

Whenever a ucode file is tweaked the original file is saved under a different name. A .u1 file will have its extension changed to .u1~. A tweaked .u2 file will have its extension changed to .u2~.

Later, when running the program, reference will only be made to source files, not to ucode files.

The itweak command produces an additional Icon file. Its default name is dbg_init.icn. You may change the name of this file by using the -o command line option. For instance, the following is a possible command,

itweak -o proginit.icn alpha gamma

This command will generate a file named proginit.icn, but otherwise perform the same function as the itweak command above. You must compile the generated Icon file. The following command does this (now assuming the default name has been used).

icont -c dbg_init.icn

Finally link the program as you would normally do it. Like this, for instance,

icont alpha.u beta.u gamma.u

The itweak command tweaks one of the .u2 files involved. It inserts the equivalent of link statements. This will, in effect, add dbg_init.icn and dbg_run.u to the link list. The dbg_init.u files will usually be present in the current directory. Of course the dbg_run.u files may also reside in the current directory. However, it is often more useful to have the run-time files in a separate directory which is included in the IPATH environment variable. If the linkage is successful, the result is an executable program alpha (under Unix).

Note on Re-Tweaking Files

Usually you would develop a program in an edit-compile-debug cycle. itweak notices if a file is already tweaked and does not tweak it a second time. Thus you may run the same itweak command after you have modified and compiled just one of the source files. This means the itweak command is suited for inclusion in a Makefile.

itweak Quirks and Limitations

itweak and the debugging run-time introduce numerous global names for its own use. A common prefix is used on all such names to minimize the risk of name clashes with your program. The prefix is '__dbg_' (beginning with a double underscore). It is, of course, possible for the target program to interfere with the debugging run-time, possibly causing it to crash.

itweak detects the main Icon procedure of your program. It inserts code for executing a parameterless procedure named __dbg_init before anything else. This procedure initializes the run-time environment. (The procedure is generated by itweak as part of the dbg_init.icn file.)

If you omit the file containing main from the set of tweaked files you must modify your program to invoke __dbg_init before execution reaches a tweaked file. Otherwise the program will terminate with a run-time error.

This is one reason why tweaked ucode files are not suited for shared libraries. Tweaking a file in a way marks it for a particular program. You (or somebody else) may attempt to tweak the same file in order to use it in a different program, but itweak will not touch it, because it has been tweaked already. There will probably be a conflict at linkage time, however: __dbg_init: inconsistent redeclaration. What you have to do in this case is erase the ucode files and recompile and tweak from scratch.

For each tweaked file itweak creates a global variable holding a set of active breakpoints. The name of this variable contains the base name of the file. This limits file names to the syntax accepted as Icon identifiers.

6. The Debugging Session

This section describes what a debugging session looks like.

Starting a Debugging Session

After having tweaked and linked your program according to the description above you should be able to start it as usual. It will behave slightly different, however. After starting up a '$' prompt will appear (on standard error). The prompt means you are expected to enter a debugging command (on standard input).

Detailed command descriptions are available on-line through the help command. Type help to see a list of available commands. Type help command to get a description of a particular command.

Run-Time Environment Variables

Environment variables may be used to re-direct debugging input and output.

DBG_INPUT
if set to a file name will cause debugging commands to be read from the file. If end-of-file is encountered remaining commands will be taken from standard input.
DBG_OUTPUT
if set to a file name will cause debugging output to be written to the file.

Debugging Commands: Overview

The debugging commands will enable you to control and monitor the execution of your program. This section contains general information and some examples. Detailed descriptions are available on-line through the help command.

Keyword Abbreviations

All debugging command keywords may be abbreviated as long as the abbreviation is unambiguous. For instance, goon nobreak may usually be written g no.

The reason we say usually is that you may define new commands by means of the macro command. Macro names are subject to the same abbreviation rules as built-in commands.

Breakpoints

Setting and Clearing a Breakpoint

The break command defines a breakpoint on a source line or on a number of consecutive source lines. The break will take effect after the expression on the source line has been evaluated. (This is a difference from most other debuggers where breaks occur before the source line is executed.)

In some cases the break occurs in a slightly different place from where you would expect it. This is the reason the break command optionally covers more than one source line. By setting breakpoints on a few lines around the interesting spot you may make sure that there really is a break.

A source line cannot have more than one breakpoint. Each break command silently supersedes any previous breakpoints it happens to overlap. The clear breakpoint removes a breakpoint.

Identifying Breakpoints

A breakpoint is identified by a small integer, the breakpoint number. The break command prints the breakpoint number of the breakpoint it creates. The breakpoint number can be used in other debugging commands.

You may identify a breakpoint by its literal breakpoint number, or by the special symbols '.' (dot) and '$' (dollar). Dot means the current breakpoint, i.e. the breakpoint that caused the current break. Dollar means the last breakpoint defined by a break command.

Use the info breakpoint command to see the definition of a breakpoint (or all breakpoints).

Tailoring a Breakpoint

A plain breakpoint as created by break is unconditional. There are several ways you may modify its behavior to suit your needs.

  • The ignore command sets an ignore counter on a breakpoint. A breakpoint having a non-zero ignore counter does not cause a break when execution runs into it. Instead of causing a break the ignore counter is decremented by one. Setting an ignore counter to a negative value effectively disables the breakpoint.
  • The condition command defines a condition for a breakpoint. The condition will be evaluated each time execution reaches the breakpoint. If the condition fails the breakpoint does not cause a break.
  • The do command attaches an anonymous macro (one or more debugging commands) to a breakpoint. The macro is executed whenever the breakpoint causes a break.

When a plain break occurs a special macro called the prelude is executed. The standard prelude prints the breakpoint number and the location of the breakpoint. In a similar way a special macro called the postlude is executed just before execution is resumed after a break. The standard postlude is empty.

The prelude and postlude are ordinary macros which you may redefine by means of the set command.

Note that the prelude is not executed if a break is caused by a breakpoint with a do macro.

Breakpoint 0 (Zero)

Breakpoint zero is special. The next debugging command causes a break to occur after the next source line has been executed (or after a specified number of lines). A break caused by a next command is treated as if defined by breakpoint number zero. (This is the case even if there is an ordinary breakpoint on the same source line.) Breakpoint number zero may be assigned a condition, a do macro, or an ignore count, just like other breakpoints. It may not be cleared, however.

Expressions

Expressions may be included in the various print commands and in breakpoint conditions. Expressions may be formed from

  • a large subset of Icon operators, including subscripting and record field references,
  • integer, string, list literals,
  • locals from the current procedure,
  • globals,
  • procedure and function invocations,
  • a subset of the Icon keywords.

A few keywords have been added or altered:

&bp, &breakpoint
The breakpoint number of the current breakpoint (integer).
&file
The source file name of the current breakpoint (string).
&line
The source line number of the current breakpoint (integer).
&proc
The name of the procedure where the current breakpoint occurred (string).

Expression evaluation is guarded by error conversion. An Icon error during evaluation should cause a conflict message, but not terminate the program.

Commands for Printing

There are several debugging commands for evaluating and printing expressions.

The print command takes any number of expressions separated by semicolon. The command evaluates and prints the image of the first value returned by each expression. This is a common way to inspect variables, for instance.

The eprint command (e as in every) takes a single expression and prints the image of every value it generates. The following example shows a simple way of printing the contents of a list,

eprint !mylist

The fprint command (f as in format) expects a format string followed by any number of expressions. The format string can be any expression returning a string-convertible value. The expressions must be separated by semicolon. The format string may contain placeholders. The remaining expressions are expected to return values to insert into the format string, replacing the placeholders. In this case the actual value is used, not the image. A conflict is generated if any of the values is not string-convertible, so you may have to use the image function, or some other explicit conversion.

The fprint command is useful when you care about the appearance of the output.

The fprint command does not print a newline unless it is explicitly included in the output. Usually it can be inserted at the end of the format string.

A format string placeholder is basically a percent (%) character followed by a digit 1-9. Thus there can be up to nine different placeholders. A particular placeholder ('%1' for example) may occur any number of times. Each occurrence of '%1' will be replaced by the value of the first expression after the format string. Each occurrence of '%2' will be replaced by the value of the second expression after the format string, and so on.

A plain placeholder represents a variable-length field. It is possible to specify a fixed-length field. Add '<' for a left-justified, or '>' for a right-justified field. Also add the length of the field. For instance, '%1<20' defines a left-justified field with a fixed length of 20 characters.

To print a percent character, double the character in the format string (%%). Backslash (\) can also be used to quote other characters.

A placeholder for which there is no value is silently replaced by its placeholder number.

Run-Time Quirks, Limitations

The itweak algorithm for deciding source line limits is rather simple-minded. This is the reason breaks do not always occur exactly where you expect.

The implementation of the alternation (|) control structure is naive; works only in simple cases. (See The Icon Analyst, Number 23, April 1994.)

It is currently not possible to list macro definitions (including do macros).

A few commands use the display file: frame, info globals, where. The display file is simply the output from the display Icon function. Writing the display file requires write permission in the current directory.

It should be possible to negate a breakpoint condition, but this is not implemented yet.

It is possible to invoke a target program procedure in an expression. This can be useful for side effects. The run-time is not fully re-entrant, however, so if there is a breakpoint in the procedure the run-time may get confused when it returns. (No fatal error should occur.)

Escaping characters in fprint format strings do not always work. Beware of the following format string. It generates a long, long output. "foo/year=%1<20\1994\n"

7. Performance Considerations

My main dissatisfaction with the debugify package was performance. Thus a lot of effort has gone into finding ways to minimize the debugging overhead. The following performance measurements were made on a Sun SPARCstation IPC under SunOS 4.1.3 with 24 Mb of memory.

A tweaked ucode file will be less than 2 times the size of the untweaked file (debugify: 5 times). A tweaked program without any breakpoints (goon nobreak) runs approximately 4 times slower than an untweaked program (debugify: 200 times; this easily becomes unbearable). The itweak program itself runs at over 3 times the speed of debugify.

The increased performance carries a certain cost: Only a single potential breakpoint is created per source line. No provision is made for setting variables. The code is not executable unless certain global variables (created by itweak) have been initialized.

Debugging commands are compiled to an internal representation as they are entered. This is especially important for expressions. Expressions are parsed with simple string matching, backtracking and all. They are immediately unwound and converted to a postfix notation. This means that breakpoint conditions and macros can be evaluated efficiently.

8. Implementation Notes (The Hidden Art of Tweaking)

The Icon source code generated by itweak mainly creates and initializes a number of global variables. An Icon set is created for each tweaked source file. The sets are used to hold breakpoint line numbers.

itweak creates a potential breakpoint on every source line it finds in the ucode file. A potential breakpoint consists of code testing the current line number against the set of breakpoint line numbers for the current source file.

If the test says 'yes' then a jump is made to code added at the end of the current procedure. This code collects the values and names of all locals and calls the debugging run-time. The same code is used for all potential breakpoints in one procedure. This means that besides potential breakpoints a chunk of code is added at the end of every procedure.

A global variable named __dbg_test is used to test for breakpoints. It may be set to different Icon functions to achieve various effects. The function will be called with two parameters: a set of breakpoint line numbers and an integer line number. The following values are currently used,

member
This is the initial value. The effect is to check if there is a breakpoint on the current line.
integer
Always fails (since a set cannot be converted to an integer). Used to implement the goon nobreak command.
2
(integer 2) The effect is to cause the second parameter to be returned. Hence always succeeds. Used to implement the next command which causes a break on every potential breakpoint.

The debugging run-time is a procedure. It must fail in order not to disturb the logic of the current procedure.

It surprises me that it is possible to do this amount of tweaking to an Icon program. I have debugged fairly complex programs without noticing any unexpected weirdness (like tweaked program logic). However, itweak as a whole is a case of reverse engineering. Someone with greater theoretical insight may be able to detect cracks in the tweaking scheme. Please tell me in such case. icon-9.4.3/ipl/packs/itweak/options.icn0000664000175000017500000001366607140713043017355 0ustar chrishchrish############################################################################ # # File: options.icn # # Subject: Procedure to get command-line options # # Authors: Robert J. Alexander and Gregg M. Townsend # # Date: February 27, 1992 # ############################################################################ # # options(arg,optstring,errproc) -- Get command line options. # # This procedure separates and interprets command options included in # the main program argument list. Option names and values are removed # from the argument list and returned in a table. # # On the command line, options are introduced by a "-" character. An # option name is either a single printable character, as in "-n" or "-?", # or a string of letters, as in "-geometry". Valueless single-character # options may appear in combination, for example as "-qtv". # # Some options require values. Generally, the option name is one # argument and the value appears as the next argument, for example # "-F file.txt". However, with a single-character argument name # (as in that example), the value may be concatenated: "-Ffile.txt" # is accepted as equivalent. # # Options may be freely interspersed with non-option arguments. # An argument of "-" is treated as a non-option. The special argument # "--" terminates option processing. Non-option arguments are returned # in the original argument list for interpretation by the caller. # # An argument of the form @filename (a "@" immediately followed # by a file name) causes options() to replace that argument with # arguments retrieved from the file "filename". Each line of the file # is taken as a separate argument, exactly as it appears in the file. # Arguments beginning with - are processed as options, and those # starting with @ are processed as nested argument files. An argument # of "--" causes all remaining arguments IN THAT FILE ONLY to be # treated as non-options (including @filename arguments). # # The parameters of options(arg,optstring,errproc) are: # # arg the argument list as passed to the main procedure. # # optstring a string specifying the allowable options. This is # a concatenation, with optional spaces between, of # one or more option specs of the form # -name% # where # - introduces the option # name is either a string of letters # or any single printable character # % is one of the following flag characters: # ! No value is required or allowed # : A string value is required # + An integer value is required # . A real value is required # # The leading "-" may be omitted for a single-character # option. The "!" flag may be omitted except when # needed to terminate a multi-character name. # Thus, the following optstrings are equivalent: # "-n+ -t -v -q -F: -geometry: -silent" # "n+tvqF:-geometry:-silent" # "-silent!n+tvqF:-geometry:" # # If "optstring" is omitted any single letter is # assumed to be valid and require no data. # # errproc a procedure which will be called if an error is # is detected in the command line options. The # procedure is called with one argument: a string # describing the error that occurred. After errproc() # is called, options() immediately returns the outcome # of errproc(), without processing further arguments. # Already processed arguments will have been removed # from "arg". If "errproc" is omitted, stop() is # called if an error is detected. # # A table is returned containing the options that were specified. # The keys are the specified option names. The assigned values are the # data values following the options converted to the specified type. # A value of 1 is stored for options that accept no values. # The table's default value is &null. # # Upon return, the option arguments are removed from arg, leaving # only the non-option arguments. # ############################################################################ procedure options(arg,optstring,errproc) local f,fList,fileArg,fn,ignore,optname,opttable,opttype,p,x,option # # Initialize. # /optstring := string(&letters) /errproc := stop option := table() fList := [] opttable := table() # # Scan the option specification string. # optstring ? { while optname := move(1) do { if optname == " " then next if optname == "-" then optname := tab(many(&letters)) | move(1) | break opttype := tab(any('!:+.')) | "!" opttable[optname] := opttype } } # # Iterate over program invocation argument words. # while x := get(arg) do { if /x then ignore := &null # if end of args from file, stop ignoring else x ? { if ="-" & not pos(0) & /ignore then { if ="-" & pos(0) then ignore := 1 # ignore following args if -- else { tab(0) ? until pos(0) do { if opttype := \opttable[ optname := ((pos(1),tab(0)) | move(1))] then { option[optname] := if any(':+.',opttype) then { p := "" ~== tab(0) | get(arg) | return errproc( "No parameter following -" || optname) case opttype of { ":": p "+": integer(p) | return errproc("-" || optname || " needs numeric parameter") ".": real(p) | return errproc("-" || optname || " needs numeric parameter") } } else 1 } else return errproc("Unrecognized option: -" || optname) } } } # # If the argument begins with the character "@", fetch option # words from lines of a text file. # else if ="@" & not pos(0) & /ignore then { f := open(fn := tab(0)) | return errproc("Can't open " || fn) fileArg := [] while put(fileArg,read(f)) close(f) push(arg) # push null to signal end of args from file while push(arg,pull(fileArg)) } else put(fList,x) } } while push(arg,pull(fList)) return option end icon-9.4.3/ipl/packs/itweak/README0000664000175000017500000000246007140713043016035 0ustar chrishchrishWHAT IS ITWEAK? 'itweak' is an interactive debugging utility for the Icon programming language. The idea is that you compile your Icon program to ucode files (.u1, .u2). 'itweak' then tweaks the ucode, inserting potential breakpoints. The resulting ucode files are linked with a debugging run-time and off you go. The 'itweak' system provides you with most of the facilities you would expect from an interactive debugger, including the ability to evaluate a wide range of Icon expressions. PREREQUISITES 'itweak' requires Icon 8.10 or higher. It is completely written in Icon, and thus as portable as Icon itself. INSTANT ITWEAK -- UNIX Assuming you have the itweak distribution in the form of a file named 'itweak-.tar.gz' (where is a version designator): uncompress and untar the file. This can be done in a single step, gunzip < itweak-.tar.gz | tar xvf - This will create an installation directory in the current directory. The name of the installation directory will be 'itweak-'. To install itweak, type 'make' in the installation directory. Run a demo session by typing 'make demo'. OTHER SYSTEMS -- NOT SO INSTANT For systems other than Unix, and for more information, please refer to the documentation. DOCUMENTATION There is a description in the form of an HTML file. icon-9.4.3/ipl/packs/itweak/ipxref.icn0000664000175000017500000001564607140713043017157 0ustar chrishchrish############################################################################ # # File: ipxref.icn # # Subject: Program to cross reference Icon program # # Author: Allan J. Anderson # # Date: June 10, 1988 # ############################################################################ # # This program cross-references Icon programs. It lists the # occurrences of each variable by line number. Variables are listed # by procedure or separately as globals. The options specify the # formatting of the output and whether or not to cross-reference # quoted strings and non-alphanumerics. Variables that are followed # by a left parenthesis are listed with an asterisk following the # name. If a file is not specified, then standard input is cross- # referenced. # # Options: The following options change the format defaults: # # -c n The column width per line number. The default is 4 # columns wide. # # -l n The starting column (i.e. left margin) of the line # numbers. The default is column 40. # # -w n The column width of the whole output line. The default # is 80 columns wide. # # Normally only alphanumerics are cross-referenced. These # options expand what is considered: # # -q Include quoted strings. # # -x Include all non-alphanumerics. # # Note: This program assumes the subject file is a valid Icon pro- # gram. For example, quotes are expected to be matched. # ############################################################################ # # Bugs: # # In some situations, the output is not properly formatted. # ############################################################################ # # Links: options # ############################################################################ link options global resword, linenum, letters, alphas, var, buffer, qflag, infile, xflag global inmaxcol, inlmarg, inchunk, localvar, lin record procrec(pname,begline,lastline) procedure main(args) local word, w2, p, prec, i, L, ln, switches, nfile resword := ["break","by","case","default","do","dynamic","else","end", "every","fail","global","if","initial","link", "local","next","not", "of","procedure", "record","repeat","return","static","suspend","then", "to","until","while"] linenum := 0 var := table() # var[variable[proc]] is list of line numbers prec := [] # list of procedure records localvar := [] # list of local variables of current routine buffer := [] # a put-back buffer for getword proc := "global" letters := &letters ++ '_' alphas := letters ++ &digits switches := options(args,"qxw+l+c+") if \switches["q"] then qflag := 1 if \switches["x"] then xflag := 1 inmaxcol := \switches["w"] inlmarg := \switches["l"] inchunk := \switches["c"] infile := open(args[1],"r") # could use some checking while word := getword() do if word == "link" then { buffer := [] lin := "" next } else if word == "procedure" then { put(prec,procrec("",linenum,0)) proc := getword() | break p := pull(prec) p.pname := proc put(prec,p) } else if word == ("global" | "link" | "record") then { word := getword() | break addword(word,"global",linenum) while (w2 := getword()) == "," do { if word == !resword then break word := getword() | break addword(word,"global",linenum) } put(buffer,w2) } else if word == ("local" | "dynamic" | "static") then { word := getword() | break put(localvar,word) addword(word,proc,linenum) while (w2 := getword()) == "," do { if word == !resword then break word := getword() | break put(localvar,word) addword(word,proc,linenum) } put(buffer,w2) } else if word == "end" then { proc := "global" localvar := [] p := pull(prec) p.lastline := linenum put(prec,p) } else if word == !resword then next else { ln := linenum if (w2 := getword()) == "(" then word ||:= " *" # special mark for procedures else put(buffer,w2) # put back w2 addword(word,proc,ln) } every write(!format(var)) write("\n\nprocedures:\tlines:\n") L := [] every p := !prec do put(L,left(p.pname,16," ") || p.begline || "-" || p.lastline) every write(!sort(L)) end procedure addword(word,proc,lineno) if any(letters,word) | \xflag then { /var[word] := table() if /var[word]["global"] | (word == !\localvar) then { /(var[word])[proc] := [word,proc] put((var[word])[proc],lineno) } else { /var[word]["global"] := [word,"global"] put((var[word])["global"],lineno) } } end procedure getword() local j, c static i, nonwhite initial nonwhite := ~' \t\n' repeat { if *buffer > 0 then return get(buffer) if /lin | i = *lin + 1 then if lin := read(infile) then { i := 1 linenum +:= 1 } else fail if i := upto(nonwhite,lin,i) then { # skip white space j := i if lin[i] == ("'" | "\"") then { # don't xref quoted words if /qflag then { c := lin[i] i +:= 1 repeat if i := upto(c ++ '\\',lin,i) + 1 then if lin[i - 1] == c then break else i +:= 1 else { i := 1 linenum +:= 1 lin := read(infile) | fail } } else i +:= 1 } else if lin[i] == "#" then { # don't xref comments; get next line i := *lin + 1 } else if i := many(alphas,lin,i) then return lin[j:i] else { i +:= 1 return lin[i - 1] } } else i := *lin + 1 } # repeat end procedure format(T) local V, block, n, L, lin, maxcol, lmargin, chunk, col initial { maxcol := \inmaxcol | 80 lmargin := \inlmarg | 40 chunk := \inchunk | 4 } L := [] col := lmargin every V := !T do every block := !V do { lin := left(block[1],16," ") || left(block[2],lmargin - 16," ") every lin ||:= center(block[3 to *block],chunk," ") do { col +:= chunk if col >= maxcol - chunk then { lin ||:= "\n\t\t\t\t\t" col := lmargin } } if col = lmargin then lin := lin[1:-6] # came out exactly even put(L,lin) col := lmargin } L := sort(L) push(L,"variable\tprocedure\t\tline numbers\n") return L end icon-9.4.3/ipl/packs/itweak/dbg_run.icn0000664000175000017500000020356507140713043017301 0ustar chrishchrish############################################################################ # # File: dbg_run.icn # # Subject: Icon interactive debugging. # Contains an interactive debugging run-time system. # # Author: Hakan Soderstrom # # Revision: $Revision: 2.21 $ # ########################################################################### # # Copyright (c) 1994 Hakan Soderstrom and # Soderstrom Programvaruverkstad AB, Sweden # # Permission to use, copy, modify, distribute, and sell this software # and its documentation for any purpose is hereby granted without fee, # provided that the above copyright notice and this permission notice # appear in all copies of the software and related documentation. # # THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, # EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY # WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. # # IN NO EVENT SHALL HAKAN SODERSTROM OR SODERSTROM PROGRAMVARUVERKSTAD # AB BE LIABLE FOR ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL # DAMAGES OF ANY KIND, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS # OF USE, DATA OR PROFITS, WHETHER OR NOT ADVISED OF THE POSSIBILITY # OF DAMAGE, AND ON ANY THEORY OF LIABILITY, ARISING OUT OF OR IN # CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # ########################################################################### # # General note: all names are prefixed in an elaborate way in order to # avoid name collisions with the debugged program. # The default prefix for all globally visible names is '__dbg_'. # # This is the reason why lists are frequently used instead of records # (whose field names clutter the global name space). # ########################################################################### # #-------- Constants -------- # # Versions (this program and 'itweak'). $define PROGRAM_VERSION "$Revision: 2.21 $" # Components of a breakpoint descriptor (list). # Breakpoint id (integer). $define BRKP_ID 1 # Source file (string). $define BRKP_FILE 2 # File index. $define BRKP_FIDX 3 # First line number. $define BRKP_LINE1 4 # Second line number. $define BRKP_LINE2 5 # Ignore counter (integer). $define BRKP_IGNORE 6 # Condition for breaking. $define BRKP_COND 7 # Commands to perform on break. $define BRKP_DO 8 # Constants for 'the current breakpoint' and 'the last breakpoint'. $define BRKP_CURRENT -1 $define BRKP_LAST -2 # Keywords for the 'clear' command. # Definitions must match list in compilation procedure. $define CLEAR_BREAKPOINT 1 $define CLEAR_COND 2 $define CLEAR_DO 3 $define CLEAR_ECHO 4 $define CLEAR_MACRO 5 # Keywords for the 'info' command. # Definitions must match list in compilation procedure. $define INFO_BREAKPOINT 1 $define INFO_ECHO 2 $define INFO_FILES 3 $define INFO_GLOBALS 4 $define INFO_LOCALS 5 $define INFO_MACROS 6 $define INFO_TRACE 7 $define INFO_VERSION 8 # Keywords for the 'set' command. # Definitions must match list in compilation procedure. $define SET_ECHO 1 $define SET_PRELUDE 2 $define SET_POSTLUDE 3 # Components of a command definition (list). # Used for built-in commands as well as user-defined macros. # Unabbreviated command/macro name (string). $define CMD_NAME 1 # Command code (an integer corresponding to the name). $define CMD_CODE 2 # Help text (list of string). $define CMD_HELP 3 # Compilation procedure; null if macro. $define CMD_COMPILE 4 # Macro definition (list of command instances, list of list). # Null if built-in command. $define CMD_MACRO 5 # Executing procedure, if built-in. Null otherwise. $define CMD_EXEC 6 # Command codes. $define BREAK_CMD 1 $define CLEAR_CMD 2 $define COMMENT_CMD 3 $define CONDITION_CMD 4 $define DO_CMD 5 $define END_CMD 6 $define EPRINT_CMD 7 $define FAIL_CMD 8 $define FPRINT_CMD 9 $define FRAME_CMD 10 $define GOON_CMD 11 $define HELP_CMD 12 $define INFO_CMD 13 $define IGNORE_CMD 14 $define MACRO_CMD 15 $define NEXT_CMD 16 $define PRINT_CMD 17 $define SET_CMD 18 $define SOURCE_CMD 19 $define STOP_CMD 20 $define TRACE_CMD 21 $define WHERE_CMD 22 $define USERDEF_CMD 23 # Environment variable for defining the input file (must be a string value). $define DBG_INPUT_ENV "DBG_INPUT" # Environment variable for defining the primary output file # (must be a string value). $define DBG_OUTPUT_ENV "DBG_OUTPUT" # Prefix for debugging run-time global names. $define DBG_PREFIX "__dbg_" # Maximum source nesting levels. $define MAX_SOURCE_NESTING 12 # File index is obtained by shifting a small integer left a number of # positions. $define FIDX_SHIFT 10 # Prompt string to use in initialization mode. $define INIT_PROMPT "debug init $ " # Execution return status. # Normal return. $define OK_STATUS 0 # Break the command loop, resume execution. $define RESUME_STATUS 1 # Break the command loop, terminate the session. $define STOP_STATUS 2 # Break the command loop, make the current procedure fail. $define FAIL_STATUS 3 # Index into '__dbg_g_where'. $define WHERE_FILE 1 $define WHERE_LINE 2 $define WHERE_PROC 3 $define WHERE_BRKP 4 $define WHERE_PRELUDE 5 $define WHERE_POSTLUDE 6 # #-------- Record types -------- # # #-------- Globals -------- # global __dbg_default_prelude, __dbg_default_postlude # The source text for the default pre/postlude (single command assumed). global __dbg_g_automacro # The 'prelude' and 'postlude' macros. # List of two components: # (1) prelude commands, # (2) postlude commands. # Both are lists of compiled commands, not complete macros. global __dbg_g_brkpcnt # Counter incremented each break. # Used to identify the file written by 'display' which is used by several # commands. # In this way we can check if we have to write the file anew. global __dbg_g_brkpdef # Lookup table for breakpoints. # Entry key is a breakpoint id (integer). # Entry value is a breakpoint descriptor (list). global __dbg_g_brlookup # Lookup table for breakpoints. # Entry key is a file index or'ed with a line number (integer). # Entry value is a breakpoint descriptor (list). global __dbg_g_brkpid # Id of the latest breakpoint created (integer). global __dbg_g_cmd # Table of command and macro definitions. # Entry key is an unabbreviated command/macro name. # Entry value is a command descriptor (list). global __dbg_g_display # Name of temporary file used by '__dbg_x_opendisplay' and others. global __dbg_g_fileidx # Table mapping source file names on (large) integers. # Entry key is a source file name (string). # Entry value is a file index (integer). global __dbg_g_in # The file through which debugging input is taken. global __dbg_g_level # Value of &level for the interrupted procedure. # Calculated as &level for the breakpoint procedure - 1. global __dbg_g_local # Table containing local variables. # Entry key is variable name (string). # Entry value is the value of the variable (any type). global __dbg_g_out1 # Primary file for debugging output. global __dbg_g_out2, __dbg_g_out2name # Secondary file for debugging output; used for 'set echo'. # Null when no echoing is not active. # The name of this file. global __dbg_g_src # Stack of input files used by the 'source' command (list of file). # Empty list when no 'source' command is active. global __dbg_g_trace # Current trace level (passed to &trace when resuming execution). global __dbg_g_where # A list with data about the current breakpoint. # Contents (symbolic names below): # (1) Source file name (string). # (2) Source line number (integer). # (3) Procedure name (string). # (4) The breakpoint causing this break (breakpoint descriptor, a list). global __dbg_g_white # This program's definition of white space. # A note on the use of global '__dbg_test' (defined in 'dbg_init.icn'). # The runtime system assigns this variable one of the following values. # ** Function 'member' for ordinary testing against the breakpoint sets. # ** Function 'integer' (which is guaranteed to always fail, given a # set as its first parameter) in the 'nobreak' mode; execution continues # without break until the program completes. # ** Integer '2' which causes a break at every intercept point. # (Returns the second parameter which is the line number.) # #-------- Globals for Icon functions used by the debuggin runtime -------- # In an excruciating effort to avoid being hit by bad manners from the # program under test we use our own variables for Icon functions. global __dbg_fany, __dbg_fclose, __dbg_fdelete, __dbg_fexit, __dbg_ffind global __dbg_fgetenv, __dbg_fimage, __dbg_finsert, __dbg_finteger, __dbg_fior global __dbg_fishift, __dbg_fkey, __dbg_fmany, __dbg_fmatch global __dbg_fmove, __dbg_fpop, __dbg_fpos, __dbg_fproc, __dbg_fpush global __dbg_fput, __dbg_fread, __dbg_fremove, __dbg_freverse, __dbg_fright global __dbg_fsort, __dbg_fstring, __dbg_ftab, __dbg_ftable, __dbg_ftrim global __dbg_ftype, __dbg_fupto, __dbg_fwrite, __dbg_fwrites # #-------------- Expression management globals ----------- # global __dbg_ge_message # Holds message if there is a conflict in expression compilation or # evaluation global __dbg_ge_singular # Value used as default for the local variable table. # Must be initialized to an empty list (or other suitable value). # #-------- Main -------- # procedure __dbg_proc (file, line, proc_name, var_name, var_val[]) # This procedure is invoked a first time during initialization with parameters # all null. # Then it is called every time we hit a breakpoint during a debugging session. # The parameters define the breakpoint, as follows, # 'file': source file name (string). # 'line': source line number (integer). # 'proc_name': name of the current procedure (string). # 'var_name': names of variables local to the current procedure # (list of string). # The list is sorted alphabetically. # 'Local' variables include parameters and static variables. # 'var_val': The current values of the local variables (list). # The values occur in the same order as the names in 'var_name'. # NOTE: In order not to affect the logic of the debugged program this # procedure MUST FAIL. # If it returns anything the current procedure will fail immediately. local bdescr, cond, cmd, idx, tfname # Save trace level; turn tracing off. __dbg_g_trace := &trace &trace := 0 if \file then { # Not the first-time invocation from "dbg_init". # Increment the global breakpoint counter. __dbg_g_brkpcnt +:= 1 # Compute the procedure nesting level. __dbg_g_level := &level - 1 # Begin setting up the 'where' structure. __dbg_g_where := [file, line, proc_name, &null] # We get here either because of a 'next', or because we hit a # breakpoint. # If we break because of a 'next' we should not treat this as # a breakpoint, even if there is one on this source line. if __dbg_test === member then { # This is a breakpoint; get it. if bdescr := __dbg_g_brlookup[__dbg_fior (__dbg_g_fileidx[file], line)] then { # Check ignore count. ((bdescr[BRKP_IGNORE] -:= 1) = -1) | fail bdescr[BRKP_IGNORE] := 0 } else __dbg_io_cfl ("Mysterious break: %1 (%2:%3).", proc_name, file, line) } else { # Break caused by 'next'. # By convention treated as breakpoint number 0. bdescr := __dbg_g_brkpdef[0] # Check ignore count. ((bdescr[BRKP_IGNORE] -:= 1) = -1) | fail bdescr[BRKP_IGNORE] := 0 } __dbg_g_where[WHERE_BRKP] := bdescr # Create table of locals. __dbg_g_local := __dbg_ftable (__dbg_ge_singular) every idx := 1 to *var_name do __dbg_g_local[var_name[idx]] := var_val[idx] # Evaluate the condition of the breakpoint, if any. if cond := \(bdescr)[BRKP_COND] then { idx := 0 __dbg_e_eval (cond[1]) & (idx +:= 1) # Check for conflict. # Make sure we don't resume in such case. __dbg_io_cfl ("[%1] condition '%2'\n %3", bdescr[BRKP_ID], cond[2], \__dbg_ge_message) & (idx +:= 1) (idx > 0) | fail } # Reset the test procedure (effective if this is a 'next' break). __dbg_test := member # The first command to execute is the macro attached to the # breakpoint, if any; otherwise the prelude. cmd := (\(\bdescr)[BRKP_DO] | __dbg_g_automacro[1]) } else { # Initialize global variables for Icon functions. __dbg_func_init () # Initialize breakpoint globals. __dbg_g_brkpcnt := 0 __dbg_g_brkpdef := __dbg_ftable () __dbg_g_brlookup := __dbg_ftable () __dbg_g_brkpid := 0 # Compute the procedure nesting level. __dbg_g_level := &level - 2 # Create breakpoint number 0, used for 'next' breaks. __dbg_g_brkpdef[0] := [0, "*any*", 0, 0, 0, 0, , ] # Display file name. __dbg_g_display := "_DBG" || &clock[4:6] || &clock[7:0] || ".tmp" # More globals. __dbg_g_src := [] __dbg_g_white := ' \t' __dbg_ge_singular := [] # Create file index table. idx := -1 __dbg_g_fileidx := __dbg_ftable () every __dbg_g_fileidx[key(__dbg_file_map)] := __dbg_fishift ((idx +:= 1), FIDX_SHIFT) # Open input and output files. if tfname := __dbg_fgetenv (DBG_INPUT_ENV) then __dbg_g_in := __dbg_x_openfile (tfname) (/__dbg_g_in := &input) | __dbg_fpush (__dbg_g_src, &input) if tfname := __dbg_fgetenv (DBG_OUTPUT_ENV) then __dbg_g_out1 := __dbg_x_openfile (tfname, 1) /__dbg_g_out1 := &errout # Initialize command definitions. __dbg_cmd_init () # Set up the breakpoint data structure. # This is not a breakpoint; the following keeps some commands from # crashing. __dbg_g_local := __dbg_ftable () __dbg_g_where := [&null, 0, "main", &null] __dbg_default_prelude := "fprint \"[%1] %2 (%3:%4)\\n\";&bp;&proc;&file;&line" __dbg_default_postlude := "" __dbg_g_automacro := [[__dbg_c_compile (__dbg_default_prelude)], []] cmd := [] } # Command processing. repeat { case __dbg_c_interp (cmd) of { RESUME_STATUS: break STOP_STATUS: { __dbg_fremove (__dbg_g_display) __dbg_io_note ("Debug session terminates.") __dbg_fexit (0) } } # Get input until it compiles OK. repeat { (*__dbg_g_src > 0) | __dbg_fwrites ("$ ") if cmd := [__dbg_c_compile (__dbg_io_getline ())] then break } } # Run the postlude, if any; status discarded. __dbg_c_interp (__dbg_g_automacro[2]) &trace := __dbg_g_trace end # #-------- Command processing procedures -------- # procedure __dbg_c_compile (str, macro_def) # Compiles a command. # 'str' must be a command to compile (string). # 'macro_def' must be non-null to indicate a macro is being defined. # RETURNS a command instance (list), or # FAILS on conflict. local cmd, keywd str ? { __dbg_ftab (__dbg_fmany (__dbg_g_white)) keywd := __dbg_ftab (__dbg_fupto (__dbg_g_white) | 0) if *keywd = 0 then # empty line treated as comment return [__dbg_cx_NOOP, COMMENT_CMD] __dbg_ftab (__dbg_fmany (__dbg_g_white)) (cmd := __dbg_c_findcmd (keywd)) | fail return cmd[CMD_COMPILE] (cmd, macro_def) } end procedure __dbg_c_brkpt (not_zero) # Extracts a breakpoint id from a command. # A breakpoint id is either an integer, or one of the special forms # '.' (current), '$' (last defined). # 'not_zero' may be non-null to indicate that breakpoint number zero # is not accepted. # RETURNS a breakpoint identifier (integer) on success; # FAILS with a suitable conflict message otherwise. local id, res __dbg_ftab (__dbg_fmany (__dbg_g_white)) (res := (__dbg_finteger (__dbg_ftab (__dbg_fmany (&digits))) | 2(id := =".", BRKP_CURRENT) | 2(id := ="$", BRKP_LAST))) | { __dbg_io_cfl ("Breakpoint id (integer, '.', '$') expected.") fail } (res > 0) | /not_zero | { __dbg_io_cfl ("Breakpoint number 0 not accepted here.") fail } return res end procedure __dbg_c_interp (clist) # Command interpreter. # 'clist' must be a list of command instances. # The interpreter may call itself indirectly through commands. # RETURNS a status code, or # FAILS on conflict, abandoning its command list. local cmd, code every cmd := !clist do { (code := cmd[1]!cmd) | fail (code = OK_STATUS) | return code } return OK_STATUS end procedure __dbg_c_findcmd (keywd) # Finds a command descriptor given a keyword. # 'keywd' must be a command keyword candidate, possibly abbreviated (string). # RETURNS a command definition, or # FAILS with a message on conflict. local count, cmd, mstr, sep, try count := 0 sep := mstr := "" every __dbg_fmatch (keywd, (try := !__dbg_g_cmd)[CMD_NAME], 1, 0) do { cmd := try count +:= 1 mstr ||:= sep || cmd[CMD_NAME] sep := ", " } case count of { 0: { __dbg_io_cfl ("%1: unrecognized command.", keywd) fail } 1: return cmd default : { __dbg_io_cfl ("'%1': ambiguous (matches %2).", keywd, mstr) fail } } end procedure __dbg_c_findkey (keywd, keylist) # Finds a command descriptor given a keyword. # 'keywd' must be a keyword candidate, possibly abbreviated (string). # 'keylist' must be a list of available keywords. # RETURNS an integer index into 'keylist', or # FAILS with a message on conflict. local count, cmd, idx, mstr, sep count := 0 sep := mstr := "" every __dbg_fmatch (keywd, keylist[idx := 1 to *keylist], 1, 0) do { count +:= 1 mstr ||:= sep || keylist[cmd := idx] sep := ", " } case count of { 0: { __dbg_io_cfl ("%1: unrecognized keyword.", keywd) fail } 1: return cmd default : { __dbg_io_cfl ("'%1': ambiguous (matches %2).", keywd, mstr) fail } } end procedure __dbg_c_mcompile (fname) # Compiles a macro. # 'fname' must contain a file name (string) if the macro definition should # be read from a file; otherwise null. # If 'fname' is defined and can be opened, a null value is pushed on the file # stack before the file, as a mark. # RETURNS a macro, i.e. a list of compiled commands -- on success. # FAILS if a conflict arises during the macro definition. local cfl_count, cmd, f, line, macro cfl_count := 0 macro := [] if \fname then { if f := __dbg_x_openfile (fname) then { __dbg_fpush (__dbg_g_src, __dbg_g_in) __dbg_fpush (__dbg_g_src, &null) __dbg_g_in := f } else fail } repeat { (*__dbg_g_src > 0) | __dbg_fwrites ("> ") (line := __dbg_io_getline ()) | break if cmd := __dbg_c_compile (line, 1) then { if cmd[CMD_CODE] = END_CMD then break else __dbg_fput (macro, cmd) } else cfl_count +:= 1 (cfl_count < 30) | break } /__dbg_g_in := __dbg_fpop (__dbg_g_src) if cfl_count = 0 then return macro else { __dbg_io_note ("The definition did not take effect.") fail } end procedure __dbg_c_msource () # Checks if the source of a macro is a file. # RETURNS a file name if there is a '<' followed by a file name. # RETURNS null if there is nothing but white space. # FAILS with a message on conflict. local fname __dbg_ftab (__dbg_fmany (__dbg_g_white)) if ="<" then { __dbg_ftab (__dbg_fmany (__dbg_g_white)) if __dbg_fpos (0) then { __dbg_io_cfl ("File name expected.") fail } fname := __dbg_ftrim (__dbg_ftab (0)) } return fname end procedure __dbg_x_brkpt (id) # RETURNS a breakpoint descriptor, given a breakpoint id ('id', integer). # FAILS with a diagnostic message on conflict. local bdescr bdescr := case id of { BRKP_CURRENT: \__dbg_g_where[WHERE_BRKP] | (__dbg_io_cfl ("No current breakpoint."), &null) BRKP_LAST: \__dbg_g_brkpdef[__dbg_g_brkpid] | (__dbg_io_cfl ("Breakpoint [%1] undefined.", __dbg_g_brkpid), &null) default: \__dbg_g_brkpdef[id] | (__dbg_io_cfl ("Breakpoint [%1] undefined.", id), &null) } return \bdescr end procedure __dbg_x_dispglob (f, pat) # Essentially performs the 'info globals' command. # 'f' must be a display file open for input. # 'pat' must be a substring that variable names must contain. local fchanged, line, word static func initial { func := set () # A set containing all function names. every insert (func, function ()) } fchanged := [] until __dbg_fread (f) == "global identifiers:" repeat { (line := __dbg_fread (f)) | break word := [] line ? repeat { __dbg_ftab (__dbg_fmany (__dbg_g_white)) if __dbg_fpos (0) then break __dbg_fput (word, __dbg_ftab (__dbg_fupto (__dbg_g_white) | 0)) } __dbg_fmatch (DBG_PREFIX, word[1]) | (word[1] == word[-1]) | if __dbg_ffind (pat, word[1]) then __dbg_io_info ("%1", word[1]) # Check if function name has been used for other things. if member (func, word[1]) then { (word[-2] == "function" & word[-1] == word[1]) | put (fchanged, word[1]) } } if *fchanged > 0 then { __dbg_io_note ("The following global(s) no longer hold their usual Icon functions:") every __dbg_io_wrline (" " || !fchanged) } end procedure __dbg_x_dispinit (f) # Reads the display file, skipping over lines caused by the debugger. # 'f' must be the display file, open for input. # RETURNS the first 'significant' line. # NOTE that you must take care of the 'co-expression' line before calling # this procedure. local line until __dbg_fmatch (DBG_PREFIX, line := __dbg_fread (f)) while line[1] == " " | __dbg_fmatch (DBG_PREFIX, line) do line := __dbg_fread (f) return line end procedure __dbg_x_lbreak (bdescr) # Lists the nominal definition of a breakpoint. # 'bdescr' may be a breakpoint descriptor, or null. # If null all breakpoints are listed. local bd, blist, cond, dodef, tmplist (blist := [\bdescr]) | { tmplist := __dbg_fsort (__dbg_g_brkpdef) blist := [] every __dbg_fput (blist, (!tmplist)[2]) } every bd := !blist do { dodef := if \bd[BRKP_DO] then " DO defined" else "" __dbg_io_info ("[%1] %2 %3:%4%5", bd[BRKP_ID], bd[BRKP_FILE], bd[BRKP_LINE1], bd[BRKP_LINE2], dodef) if cond := \bd[BRKP_COND] then __dbg_io_info (" CONDITION: %1", cond[2]) } end procedure __dbg_x_openfile (fname, output, quiet) # Opens a file. # 'fname' must be the name of the file to open. # 'output' must be non-null if the file is to be opened for output. # 'quiet' must be non-null to prevent a conflict from generating a message. # RETURNS an open file on success; # FAILS with a message otherwise, unless 'quiet' is set. # FAILS silently if 'quiet' is set. local f, mode, modestr if \output then { mode := "w" modestr := "output" } else { mode := "r" modestr := "input" } (f := open (fname, mode)) | (\quiet & fail) | __dbg_io_cfl ("Cannot open '%1' for %2.", fname, modestr) return \f end procedure __dbg_x_opendisplay () # Opens the display file for reading; writes it first, if necessary. # RETURNS a file open for input on success. # FAILS with a message on conflict. local f, res if f := __dbg_x_openfile (__dbg_g_display,, 1) then { if __dbg_finteger (__dbg_fread (f)) = __dbg_g_brkpcnt then res := f else __dbg_fclose (f) } \res | { (f := __dbg_x_openfile (__dbg_g_display, 1)) | fail __dbg_fwrite (f, __dbg_g_brkpcnt) display (, f) __dbg_fclose (f) (f := __dbg_x_openfile (__dbg_g_display)) | fail __dbg_fread (f) # Throw away breakpoint counter. res := f } return res end #-------- Command compilation procedures -------- # 'macro_def' must be non-null to indicate that a macro is being defined. # The command compilation procedures must return a list representing the # compiled command, or fail on conflict. # When they are invoked the keyword and any following white space has been # parsed. procedure __dbg_cc_break (cmd, macro_def) local fidx, fname, line1, line2 __dbg_fany (&digits) | (fname := __dbg_ftab (__dbg_fupto (__dbg_g_white))) | { __dbg_io_cfl ("File name and/or line number expected.") fail } # Get file name. if \fname then { (fidx := \__dbg_g_fileidx[fname]) | { __dbg_io_cfl ("File name '%1' not recognized.", fname) fail } } else if fname := \__dbg_g_where[WHERE_FILE] then fidx := __dbg_g_fileidx[fname] else { # init mode __dbg_io_cfl ("File name required.") fail } # Get line number(s). __dbg_ftab (__dbg_fmany (__dbg_g_white)) (line1 := __dbg_finteger (__dbg_ftab (__dbg_fmany (&digits)))) | { __dbg_io_cfl ("Line number expected.") fail } __dbg_ftab (__dbg_fmany (__dbg_g_white)) if =":" then { __dbg_ftab (__dbg_fmany (__dbg_g_white)) (line2 := __dbg_finteger (__dbg_ftab (__dbg_fmany (&digits)))) | { __dbg_io_cfl ("Line number expected.") fail } } else line2 := line1 (line1 <= line2 < 1000000) | { __dbg_io_cfl ("Weird line number.") fail } # Create an almost finished breakpoint descriptor (id is missing). return [cmd[CMD_EXEC], cmd[CMD_CODE], [ , fname, fidx, line1, line2, 0, ,]] end procedure __dbg_cc_clear (cmd, macro_def) # A compound command. local keyidx, parm static ckey initial ckey := ["breakpoint", "condition", "do", "echo", "macro"] (keyidx := __dbg_c_findkey (__dbg_ftab (__dbg_fupto (__dbg_g_white) | 0), ckey)) | fail __dbg_ftab (__dbg_fmany (__dbg_g_white)) case keyidx of { CLEAR_BREAKPOINT: (parm := __dbg_c_brkpt (1)) | fail (CLEAR_COND | CLEAR_DO): (parm := __dbg_c_brkpt ()) | fail CLEAR_MACRO: (parm := __dbg_e_idf ()) | { __dbg_io_cfl ("Macro name expected.") fail } } return [cmd[CMD_EXEC], cmd[CMD_CODE], ckey, keyidx, parm] end procedure __dbg_cc_condition (cmd, macro_def) local brkpt, expr (brkpt := __dbg_c_brkpt ()) | fail # This makes the expression cleaner, but not necessary. __dbg_ftab (__dbg_fmany (__dbg_g_white)) (expr := __dbg_e_compile (__dbg_ftab (0))) | { __dbg_io_cfl (__dbg_ge_message) fail } (*expr = 1) | __dbg_io_note ("Last %1 expressions ignored.", *expr - 1) return [cmd[CMD_EXEC], cmd[CMD_CODE], brkpt, expr[1]] end procedure __dbg_cc_do (cmd, macro_def) local brkpt, fname /macro_def | { __dbg_io_cfl ("Sorry, nested macros not accepted.") fail } (brkpt := __dbg_c_brkpt ()) | fail (fname := __dbg_c_msource ()) | fail return [cmd[CMD_EXEC], cmd[CMD_CODE], brkpt, fname] end procedure __dbg_cc_end (cmd, macro_def) \macro_def | { __dbg_io_cfl ("'end' out of context.") fail } return [cmd[CMD_EXEC], cmd[CMD_CODE]] end procedure __dbg_cc_eprint (cmd, macro_def) local expr (expr := __dbg_e_compile (__dbg_ftab (0))) | { __dbg_io_cfl (__dbg_ge_message) fail } (*expr = 1) | __dbg_io_note ("Last %1 expressions ignored.", *expr - 1) return [cmd[CMD_EXEC], cmd[CMD_CODE], expr[1]] end procedure __dbg_cc_frame (cmd, macro_def) local frame_no __dbg_fpos (0) | (frame_no := __dbg_finteger (__dbg_ftab (__dbg_fmany (&digits ++ '-')))) | { __dbg_io_cfl ("Frame number expected.") fail } return [cmd[CMD_EXEC], cmd[CMD_CODE], frame_no] end procedure __dbg_cc_goon (cmd, macro_def) local opt __dbg_fpos (0) | __dbg_fmatch (opt := __dbg_ftab (__dbg_fmany (&lcase)), "nobreak", 1, 0) | { __dbg_io_cfl ("Expected 'nobreak', found '%1'.", opt) fail } return [cmd[CMD_EXEC], cmd[CMD_CODE], opt] end procedure __dbg_cc_help (cmd, macro_def) local keywd __dbg_fpos (0) | (keywd := __dbg_ftab (__dbg_fmany (&lcase))) | { __dbg_io_cfl ("Command keyword expected.") fail } return [cmd[CMD_EXEC], cmd[CMD_CODE], keywd] end procedure __dbg_cc_ignore (cmd, macro_def) local brkpt, count (brkpt := __dbg_c_brkpt ()) | fail __dbg_ftab (__dbg_fmany (__dbg_g_white)) (count := __dbg_finteger (__dbg_ftab (__dbg_fmany (&digits ++ '+-')))) | { __dbg_io_cfl ("Integer ignore count expected.") fail } return [cmd[CMD_EXEC], cmd[CMD_CODE], brkpt, count] end procedure __dbg_cc_info (cmd, macro_def) # A compound command. local keyidx, parm static ckey initial ckey := ["breakpoint", "echo", "files", "globals", "locals", "macros", "trace", "version"] (keyidx := __dbg_c_findkey (__dbg_ftab (__dbg_fupto (__dbg_g_white) | 0), ckey)) | fail __dbg_ftab (__dbg_fmany (__dbg_g_white)) if keyidx = INFO_BREAKPOINT then __dbg_fpos (0) | (parm := __dbg_c_brkpt ()) | fail else if keyidx = INFO_GLOBALS then __dbg_fpos (0) | (parm := __dbg_ftab (__dbg_fupto (__dbg_g_white) | 0)) return [cmd[CMD_EXEC], cmd[CMD_CODE], ckey, keyidx, parm] end procedure __dbg_cc_macro (cmd, macro_def) local fname, idf /macro_def | { __dbg_io_cfl ("Sorry, nested macros not accepted.") fail } (idf := __dbg_ftab (__dbg_fmany (&lcase))) | { __dbg_io_cfl ("Macro name expected.") fail } (fname := __dbg_c_msource ()) | fail return [cmd[CMD_EXEC], cmd[CMD_CODE], idf, fname] end procedure __dbg_cc_next (cmd, macro_def) local count __dbg_ftab (__dbg_fmany (__dbg_g_white)) __dbg_fpos (0) | (count := __dbg_finteger (__dbg_ftab (__dbg_fmany (&digits ++ '+-')))) | { __dbg_io_cfl ("Integer ignore count expected.") fail } return [cmd[CMD_EXEC], cmd[CMD_CODE], count] end procedure __dbg_cc_print (cmd, macro_def) # Used to compile 'fprint' and 'print'. local expr (expr := __dbg_e_compile (__dbg_ftab (0))) | { __dbg_io_cfl (__dbg_ge_message) fail } return [cmd[CMD_EXEC], cmd[CMD_CODE], expr] end procedure __dbg_cc_set (cmd, macro_def) # A compound command. local keyidx, parm static ckey initial ckey := ["echo", "prelude", "postlude"] (keyidx := __dbg_c_findkey (__dbg_ftab (__dbg_fupto (__dbg_g_white) | 0), ckey)) | fail __dbg_ftab (__dbg_fmany (__dbg_g_white)) case keyidx of { SET_ECHO: { parm := __dbg_ftrim (__dbg_ftab (__dbg_fupto (__dbg_g_white) | 0)) (*parm > 0) | { __dbg_io_cfl ("File name expected.") fail } } (SET_PRELUDE | SET_POSTLUDE): (parm := __dbg_c_msource ()) | fail } return [cmd[CMD_EXEC], cmd[CMD_CODE], ckey, keyidx, parm] end procedure __dbg_cc_source (cmd, macro_def) # The 'source' command is different from other commands, because it is not # really compiled; it takes effect immediately. # In contrast to macro compilation, no null marker is pushed on the file stack. # RETURNS a dummy 'source' command. local f, fname, res __dbg_ftab (__dbg_fmany (__dbg_g_white)) if __dbg_fpos (0) then __dbg_io_cfl ("File name expected.") else { fname := __dbg_ftrim (__dbg_ftab (0)) if *__dbg_g_src >= MAX_SOURCE_NESTING then __dbg_io_cfl ("%1: Too deeply nested 'source' file.", fname) else if f := __dbg_x_openfile (fname) then { __dbg_fpush (__dbg_g_src, __dbg_g_in) __dbg_g_in := f res := [cmd[CMD_EXEC], cmd[CMD_CODE], fname] } } return \res end procedure __dbg_cc_trace (cmd, macro_def) local tlevel (tlevel := __dbg_finteger (__dbg_ftab (__dbg_fmany (&digits ++ '+-')))) | { __dbg_io_cfl ("Integer value expected.") fail } return [cmd[CMD_EXEC], cmd[CMD_CODE], \tlevel] end procedure __dbg_cc_SIMPLE (cmd, macro_def) # Used to compile all keyword-only commands, including macros. return [cmd[CMD_EXEC], cmd[CMD_CODE], cmd[CMD_MACRO]] end #-------- Command executing procedures -------- # The first parameter of these procedures is the procedure itself. # (Not a very interesting parameter.) # The command executing procedures must return a return code on success. # Return codes are defined among the symbolic constants. # The procedures must fail on conflict. procedure __dbg_cx_break (proced, ccode, brkp) local id, bpset, fidx, line1, line2 # Add the breakpoint id to the descriptor. brkp[BRKP_ID] := id := (__dbg_g_brkpid +:= 1) __dbg_io_wrline ("[" || id || "]") # Make sure we can find the breakpint descriptor, given its id. __dbg_g_brkpdef[id] := brkp # Install the breakpoint lines in the lookup table. fidx := brkp[BRKP_FIDX] line1 := brkp[BRKP_LINE1] line2 := brkp[BRKP_LINE2] every __dbg_g_brlookup[__dbg_fior (fidx, line1 to line2)] := brkp # Add the line numbers to the breakpoint set. bpset := __dbg_file_map[brkp[BRKP_FILE]] every __dbg_finsert (bpset, line1 to line2) return OK_STATUS end procedure __dbg_cx_clear (proced, ccode, ckey, keyidx, parm) # 'ckey' will be a list containing all the possible keywords to 'clear'. # 'keyidx' is an index into that list, indicating a subcommand. local bdescr, bpset, cmd, fidx, lcode, line, line1, line2 if keyidx = (CLEAR_BREAKPOINT | CLEAR_COND | CLEAR_DO) then (bdescr := __dbg_x_brkpt (parm)) | fail else if keyidx = CLEAR_MACRO then (cmd := __dbg_c_findcmd (parm)) | fail case keyidx of { CLEAR_BREAKPOINT: { __dbg_fdelete (__dbg_g_brkpdef, bdescr[BRKP_ID]) fidx := bdescr[BRKP_FIDX] line1 := bdescr[BRKP_LINE1] line2 := bdescr[BRKP_LINE2] bpset := __dbg_file_map[bdescr[BRKP_FILE]] # The range of lines once defined for the breakpoint might # have been overwritten by later breakpoints. every lcode := __dbg_fior (fidx, line := line1 to line2) do { if __dbg_g_brlookup[lcode] === bdescr then { __dbg_fdelete (__dbg_g_brlookup, lcode) __dbg_fdelete (bpset, line) } } } CLEAR_COND: bdescr[BRKP_COND] := &null CLEAR_DO: bdescr[BRKP_DO] := &null CLEAR_ECHO: { __dbg_fclose (\__dbg_g_out2) __dbg_g_out2 := &null } CLEAR_MACRO: { (cmd := __dbg_c_findcmd (parm)) | fail __dbg_fdelete (__dbg_g_cmd, cmd[CMD_NAME]) } } return OK_STATUS end procedure __dbg_cx_condition (proced, ccode, brkpt, expr) local bdescr (bdescr := __dbg_x_brkpt (brkpt)) | fail bdescr[BRKP_COND] := expr return OK_STATUS end procedure __dbg_cx_do (proced, ccode, brkpt, fname) local bdescr (bdescr := __dbg_x_brkpt (brkpt)) | fail (bdescr[BRKP_DO] := __dbg_c_mcompile (fname)) | fail return OK_STATUS end procedure __dbg_cx_eprint (proced, ccode, expr) local count, val __dbg_io_wrline ("{" || expr[2] || "}") count := 0 every val := __dbg_fimage (__dbg_e_eval (expr[1])) do { if __dbg_io_cfl (\__dbg_ge_message) then fail else __dbg_io_wrline ("" || __dbg_fright ((count +:= 1), 3) || ": " || val) } return OK_STATUS end procedure __dbg_cx_fprint (proced, ccode, elist) # 'elist' must be a list on the format returned by '__dbg_e_compile'. local expr, fmt, idx, sval, val val := [] every expr := !elist do { __dbg_fput (val, __dbg_e_eval (expr[1]) | "&fail") if __dbg_io_cfl (\__dbg_ge_message) then fail } (fmt := __dbg_fstring (val[1])) | { __dbg_io_cfl ("Expected format string; got '%1'.", __dbg_fimage (val[1])) fail } sval := [] every idx := 2 to *val do { __dbg_fput (sval, __dbg_fstring (val[idx])) | { __dbg_io_cfl ("Expression not string-convertible: {%1} %2", elist[idx][2], __dbg_fimage (val[idx])) fail } } __dbg_io_wrstr (__dbg_x_subst (fmt, sval)) return OK_STATUS end procedure __dbg_cx_frame (proced, ccode, frame_spec) local f, frame_no, idx, line frame_no := if \frame_spec then { if frame_spec < 0 then __dbg_g_level + frame_spec else frame_spec } else __dbg_g_level (1 <= frame_no <= __dbg_g_level) | { __dbg_io_cfl ("Invalid frame number.") fail } (f := __dbg_x_opendisplay ()) | fail line := __dbg_x_dispinit (f) idx := __dbg_g_level while idx > frame_no do { repeat if (line := __dbg_fread (f))[1] ~== " " then break idx -:= 1 } __dbg_io_info ("(%1) %2", frame_no, line) repeat { if (line := __dbg_fread (f))[1] ~== " " then break line ? { __dbg_ftab (__dbg_fmany (__dbg_g_white)) =DBG_PREFIX | __dbg_io_info ("%1", line, *line > 0) } } __dbg_fclose (f) return OK_STATUS end procedure __dbg_cx_goon (proced, ccode, nobreak) if \nobreak then { __dbg_test := integer __dbg_fremove (__dbg_g_display) } return RESUME_STATUS end procedure __dbg_cx_help (proced, ccode, keywd) # 'keywd' will be an identifier if the command had a keyword. local cmd, hstr if cmd := __dbg_c_findcmd (\keywd) then { if hstr := \cmd[CMD_HELP] then __dbg_io_wrline (hstr) else __dbg_io_note ("No help available for '%1'.", cmd[CMD_NAME]) } else __dbg_io_wrline ("Available commands: (all keywords may be abbreviated)\n_ break (set breakpoint)\n_ clear (clear breakpoint or debugger parameter)\n_ condition (attach condition to breakpoint)\n_ do (attach macro to breakpoint)\n_ end (terminate macro definition)\n_ eprint (print every value from expression)\n_ fprint (formatted print)\n_ frame (inspect procedure call chain)\n_ goon (resume execution)\n_ help (print explanatory text)\n_ ignore (set ignore counter on breakpoint)\n_ info (print information about breakpoint or debugger parameter)\n_ macro (define new command)\n_ next (resume execution, break on every line)\n_ print (print expressions)\n_ set (set a debugger parameter)\n_ source (read debugging commands from file)\n_ stop (terminate program and debugging session)\n_ trace (set value of Icon &trace)\n_ where (print procedure call chain)\n\n_ An expression may be formed from a large subset of Icon operators; integer,\n_ string, list literals; locals from the current procedure, and globals.\n_ Procedure/function invocation, subscripting, record field reference is\n_ supported. Several keywords are also included.\n\n_ New/altered keywords,\n_ \ &bp, &breakpoint current breakpoint id (integer)\n_ \ &file current breakpoint source file name (string)\n_ \ &line current breakpoint line number (integer)\n_ \ &proc current breakpoint procedure name (string)") return OK_STATUS end procedure __dbg_cx_ignore (proced, ccode, brkpt, count) local bdescr (bdescr := __dbg_x_brkpt (brkpt)) | fail bdescr[BRKP_IGNORE] := count return OK_STATUS end procedure __dbg_cx_info (proced, ccode, ckey, keyidx, parm) # 'ckey' will be a list containing all the possible keywords to 'info'. # 'keyidx' is an index into that list, indicating a subcommand. local cmd, bdescr, f, nlist, version case keyidx of { INFO_BREAKPOINT: if \parm then { (bdescr := __dbg_x_brkpt (parm)) | fail __dbg_x_lbreak (bdescr) } else __dbg_x_lbreak () INFO_ECHO: if \__dbg_g_out2 then __dbg_io_info ("Echo file: %1.", __dbg_g_out2name) else __dbg_io_info ("No echo file.") INFO_FILES: { nlist := [] every __dbg_fput (nlist, __dbg_fkey (__dbg_file_map)) nlist := __dbg_fsort (nlist) __dbg_io_info ("Tweaked source files in this program:") every __dbg_io_info (" %1", !nlist) } INFO_GLOBALS: { (f := __dbg_x_opendisplay ()) | fail if \parm then __dbg_x_dispglob (f, parm) else __dbg_x_dispglob (f, "") __dbg_fclose (f) } INFO_LOCALS: { nlist := [] every __dbg_fput (nlist, __dbg_fkey (__dbg_g_local)) nlist := __dbg_fsort (nlist) __dbg_io_info ("Local identifiers in the current procedure:", *nlist > 0) every __dbg_io_info (" %1", !nlist) } INFO_MACROS: { nlist := [] every \(cmd := !__dbg_g_cmd)[CMD_MACRO] do __dbg_fput (nlist, cmd[CMD_NAME]) nlist := __dbg_fsort (nlist) __dbg_io_info ("Currently defined macros:", *nlist > 0) every __dbg_io_info (" %1", !nlist) } INFO_TRACE: __dbg_io_info ("Current trace level: %1.", __dbg_g_trace) INFO_VERSION: { version := (PROGRAM_VERSION ? (__dbg_ftab (__dbg_fupto (&digits)), __dbg_ftab (__dbg_fmany (&digits++'.')))) __dbg_io_info ("Program tweaked by itweak version %1.\n_ This is runtime version %2.", __dbg_itweak_ver, version) } } return OK_STATUS end procedure __dbg_cx_macro (proced, ccode, idf, fname) # Executes a 'macro' statement (not the resulting macro). # 'fname' contains a file name (string) if the macro definition should be # read from a file; otherwise null. # SIDE EFFECT: Adds a command definition to '__dbg_g_cmd' on success. local count, macro, mstr, sep, try count := 0 mlist := [] # Macro name must not be an abbreviation of an existing command. every __dbg_fmatch (idf, try := (!__dbg_g_cmd)[CMD_NAME], 1, 0) do { count +:= 1 __dbg_fput (mlist, try) } # Check that no existing command is an abbreviation of macro name. every __dbg_fmatch (try := (!__dbg_g_cmd)[CMD_NAME], idf, 1, 0) do { count +:= 1 (try == !mlist) | __dbg_fput (mlist, try) } (count = 0) | { mstr := sep := "" every mstr ||:= sep || !mlist do sep := ", " __dbg_io_cfl ("'%1' clashes with existing command (%2).", idf, mstr) fail } (macro := __dbg_c_mcompile (fname)) | fail __dbg_g_cmd[idf] := [idf, USERDEF_CMD, , __dbg_cc_SIMPLE, macro, __dbg_cx_userdef] return OK_STATUS end procedure __dbg_cx_next (proced, ccode, count) # 'count' may be an ignore count. __dbg_g_brkpdef[0][BRKP_IGNORE] := \count __dbg_test := 2 return RESUME_STATUS end procedure __dbg_cx_print (proced, ccode, elist) # 'elist' must be a list on the format returned by '__dbg_e_compile'. local expr, val every expr := !elist do { val := (__dbg_fimage (__dbg_e_eval (expr[1])) | "&fail") if __dbg_io_cfl (\__dbg_ge_message) then fail else __dbg_io_wrline ("{" || expr[2] || "} " || val) } return OK_STATUS end procedure __dbg_cx_set (proced, ccode, ckey, keyidx, parm) # 'ckey' will be a list containing all the possible keywords to 'set'. # 'keyidx' is an index into that list, indicating a subcommand. case keyidx of { SET_ECHO: { (__dbg_g_out2 := __dbg_x_openfile (parm, 1)) | fail __dbg_g_out2name := parm } SET_PRELUDE: (__dbg_g_automacro[1] := __dbg_c_mcompile (parm)) | fail SET_POSTLUDE: (__dbg_g_automacro[2] := __dbg_c_mcompile (parm)) | fail } return OK_STATUS end procedure __dbg_cx_stop (proced, ccode) return STOP_STATUS end procedure __dbg_cx_trace (proced, ccode, tlevel) __dbg_g_trace := tlevel return OK_STATUS end procedure __dbg_cx_where (proced, ccode) local f, idf, idx, line (f := __dbg_x_opendisplay ()) | fail __dbg_io_info ("Current call stack in %1:", __dbg_fread (f)) idx := __dbg_g_level line := __dbg_x_dispinit (f) repeat { idf := (line ? __dbg_ftab (__dbg_fupto (__dbg_g_white))) if idf == "global" then break if *idf > 0 then { __dbg_io_info ("(%1) %2", idx, idf) idx -:= 1 } (line := __dbg_fread (f)) | break # Sanity. } __dbg_fclose (f) return OK_STATUS end procedure __dbg_cx_userdef (proced, ccode, macro) return __dbg_c_interp (macro) end procedure __dbg_cx_NOOP (proced, ccode) return OK_STATUS end # #-------- General-purpose procedures -------- # procedure __dbg_x_fld_adj (str) # Part of 'subst' format string parsing. # 'str' must be a parameter string identified by the beginning part of a # placeholder ('%n'). # This procedure checks if the placeholder contains a fixed field width # specifier. # A fixed field specifier begins with '<' or '>' and continues with the field # width expressed as a decimal literal. # RETURNS 'str' possibly inserted in a fixed width field. local just, init_p, res, wid static fwf initial fwf := '<>' init_p := &pos if (just := if ="<" then left else if =">" then right) & (wid := __dbg_finteger (__dbg_ftab (__dbg_fmany (&digits)))) then res := just (str, wid) else { res := str &pos := init_p } return res end procedure __dbg_x_subst (msg, parm) # Substitutes parameters in a message template. # 'msg' must be a message template (string). # 'parm' must be a list of parameters (list of string-convertible), or null. # It may also be a string. local esc, res, sub static p_digit initial p_digit := '123456789' \parm | return msg parm := [__dbg_fstring (parm)] res := "" msg ? until __dbg_fpos (0) do { res ||:= __dbg_ftab (__dbg_fupto ('%\\') | 0) if ="%" then res ||:= { if __dbg_fany (p_digit) then { sub := (\parm[__dbg_finteger (__dbg_fmove (1))] | "") __dbg_x_fld_adj (sub) } else if __dbg_fany ('%') then __dbg_fmove (1) else "" } else if ="\\" then res ||:= case esc := __dbg_fmove (1) of { "n": "\n" "t": "\t" default: esc } } return res end # #-------- Input/Output procedures -------- # procedure __dbg_io_cfl (format, parm[]) # Writes a conflict message to debugging output. # 'format' must be a format string. # 'parm' must be string-convertibles to insert into placeholders in the # format string, if any. # RETURNS 1 (i.e. always succeeds). __dbg_io_wrline ("[debug CONFLICT] " || __dbg_x_subst (format, parm)) return 1 end procedure __dbg_io_getline () # RETURNS the next line from debugging input, or # FAILS on end of file. local line (line := __dbg_fread (__dbg_g_in)) | { __dbg_fclose (__dbg_g_in) # Check for a macro definition marker. \(__dbg_g_in := __dbg_fpop (__dbg_g_src)) | fail if *__dbg_g_src > 0 then return __dbg_io_getline () } __dbg_fwrite (\__dbg_g_out2, "$ ", \line) return \line end procedure __dbg_io_info (format, parm[]) # Writes an info message to debugging output. # 'format' must be a format string. # 'parm' must be string-convertibles to insert into placeholders in the # format string, if any. __dbg_io_wrline (__dbg_x_subst (format, parm)) end procedure __dbg_io_note (format, parm[]) # Writes a note to debugging output. # 'format' must be a format string. # 'parm' must be string-convertibles to insert into placeholders in the # format string, if any. __dbg_io_wrline ("[debug NOTE] " || __dbg_x_subst (format, parm)) end procedure __dbg_io_wrline (line) # Writes a string and a newline to debugging output. # 'line' must be the string to write. # It may contains additional newlines. __dbg_fwrite (__dbg_g_out1, line) __dbg_fwrite (\__dbg_g_out2, line) end procedure __dbg_io_wrstr (line) # Writes a string without a newline to debugging output. # 'line' must be the string to write. # It may contains additional newlines. __dbg_fwrites (__dbg_g_out1, line) __dbg_fwrites (\__dbg_g_out2, line) end # #-------- Function initialization --------- # procedure __dbg_func_init () __dbg_fany := any __dbg_fclose := close __dbg_fdelete := delete __dbg_fexit := exit __dbg_ffind := find __dbg_fgetenv := getenv __dbg_fimage := image __dbg_finsert := insert __dbg_finteger := integer __dbg_fior := ior __dbg_fishift := ishift __dbg_fkey := key __dbg_fmany := many __dbg_fmatch := match __dbg_fmove := move __dbg_fpop := pop __dbg_fpos := pos __dbg_fproc := proc __dbg_fpush := push __dbg_fput := put __dbg_fread := read __dbg_fremove := remove __dbg_freverse := reverse __dbg_fright := right __dbg_fsort := sort __dbg_fstring := string __dbg_ftab := tab __dbg_ftable := table __dbg_ftrim := trim __dbg_ftype := type __dbg_fupto := upto __dbg_fwrite := write __dbg_fwrites := writes end # #-------- Command initialization --------- # procedure __dbg_cmd_init () # Initialize command definitions. __dbg_g_cmd := __dbg_ftable () ### break __dbg_g_cmd["break"] := ["break", BREAK_CMD, " break [file] [line [: line]]\n_ Sets a breakpoint on a line or a range of lines. The file name (if present)\n_ must be one of the tweaked files (cf. the 'info files' command). If omitted\n_ the file of the current breakpoint is assumed. The identity of the new\n_ breakpoint (an integer) is displayed. It may be used in other commands.\n_ Besides an integer there are two other ways to identify a breakpoint,\n_ \ . (dot) the current breakpoint,\n_ \ $ (dollar) the last breakpoint defined by a 'break' command.\n_ Breakpoint 0 (zero) is special; see the 'next' command.\n\n_ As a rule a breakpoint takes effect AFTER the breakpointed line has been\n_ executed. If two breakpoints are defined on the same line, only the latest\n_ is in effect.", __dbg_cc_break, , __dbg_cx_break] ### clear __dbg_g_cmd["clear"] := ["clear", CLEAR_CMD, " clear breakpoint brkpt\n_ Deletes breakpoint identified by 'brkpt'.\n_ \ clear condition brkpt\n_ Removes condition from breakpoint 'brkpt'. The breakpoint becomes\n_ unconditional.\n_ \ clear do brkpt\n_ Removes commands associated with breakpoint 'brkpt'.\n_ \ clear echo\n_ Stops output to echo file.\n_ \ clear macro name\n_ Removes macro identified by 'name'.", __dbg_cc_clear, , __dbg_cx_clear] ### comment __dbg_g_cmd["#"] := ["#", COMMENT_CMD, " # comment text\n_ A line beginning with '#' is ignored.", __dbg_cc_SIMPLE, , __dbg_cx_NOOP] ### condition __dbg_g_cmd["condition"] := ["condition", CONDITION_CMD, " condition brkpt expr\n_ Attaches a condition to breakpoint 'brkpt'. The expression 'expr' must\n_ succeed for a break to occur.", __dbg_cc_condition, , __dbg_cx_condition] ### do __dbg_g_cmd["do"] := ["do", DO_CMD, " do brkpt [="] := NGE_OP optab[">"] := NGT_OP optab["<<"] := LLT_OP optab["<<="] := LLE_OP optab["=="] := LEQ_OP optab["~=="] := LNE_OP optab[">>="] := LGE_OP optab[">>"] := LGT_OP optab["==="] := EQ_OP optab["~==="] := NE_OP optab["+"] := ADD_OP optab["-"] := SUBTR_OP optab["++"] := UNION_OP optab["--"] := DIFF_OP optab["||"] := CAT_OP optab["|||"] := LCAT_OP optab["*"] := MUL_OP optab["/"] := DIV_OP optab["%"] := REM_OP optab["**"] := ISCT_OP optab["^"] := EXP_OP } __dbg_ftab (__dbg_fmany (' \t')) suspend \optab[__dbg_fmove (3)] | \optab[__dbg_fmove (2)] | \optab[__dbg_fmove (1)] | \optab[=("~===")] end procedure __dbg_e_ws() # Removes optional white space. # The point is that it always succeeds. __dbg_ftab (__dbg_fmany (' \t')) return 1 end #-------------- Linearization ---------------------- procedure __dbg_e_ecode (ex, res) # 'Evaluates' the list resulting from pattern matching. # Produces a single list with everything in postfix order. # 'ex' must be an expression in the form that '__dbg_e_compile' generates. # 'res' must be an (empty) list where the expression elements are to # be inserted. # Always FAILS. # SIDE EFFECT: Adds elements to 'res'. # Assigns a message string to '__dbg_ge_message' on conflict. local opnd, oprt, op_stack if *ex = 1 then __dbg_e_tcode (ex[1], res) else { op_stack := [] opnd := create !ex __dbg_e_tcode (@opnd, res) while oprt := @opnd do { while (op_stack[1]/100) <= (oprt/100) do __dbg_fput (res, __dbg_e_proc ([BINOP_T, __dbg_fpop (op_stack),])) __dbg_fpush (op_stack, oprt) __dbg_e_tcode (@opnd, res) } while __dbg_fput (res, __dbg_e_proc ([BINOP_T, __dbg_fpop (op_stack),])) } end procedure __dbg_e_tcode (tm, res) # Disentangles a term. local comp, unary static special, unop initial { special := __dbg_ftable () # The 'normal' keywords. special["clock"] := CLOCK_SP special["current"] := CURRENT_SP special["date"] := DATE_SP special["dateline"] := DATELINE_SP special["pos"] := POS_SP special["regions"] := REGIONS_SP special["source"] := SOURCE_SP special["storage"] := STORAGE_SP special["subject"] := SUBJECT_SP special["trace"] := TRACE_SP special["version"] := VERSION_SP # The special keywords. special["bp"] :=BREAK_SP special["breakpoint"] :=BREAK_SP special["file"] := FILE_SP special["level"] := LEVEL_SP special["line"] := LINE_SP special["proc"] := PROC_SP unop := __dbg_ftable () unop["\\"] := NOTN_OP unop["/"] := ISN_OP unop["*"] := SIZ_OP unop["!"] := BNG_OP unop["-"] := NEG_OP } every comp := !tm do case comp[1] of { UNOP_T: unary := comp # Save for later. INTEGER_T: { comp[2] := __dbg_finteger (comp[2]) __dbg_fput (res, comp) } SPECIAL_T: { if comp[2] := \special[comp[2]] then __dbg_fput (res, comp) else __dbg_ge_message := "'" || comp[2] || "': unrecognized special identifier." } EXPR_T: __dbg_e_ecode (comp[2], res) LIST_T: { every __dbg_e_ecode (!comp[2], res) __dbg_fput (res, [LIST_T, *comp[2]]) } (FLD_OP | SSC_OP | INVOKE_OP | PART_OP) : __dbg_e_fcode (comp, res) default: __dbg_fput (res, comp) # This includes: IDENT_T, STRING_T } every __dbg_fput (res, __dbg_e_proc ([UNOP_T, unop[!__dbg_freverse ((\unary)[2])],])) end procedure __dbg_e_fcode (fm, res) # Disentangles a form. # The operators have the same precedence; stack not needed. local comp, opnd, oprt comp := create !fm while oprt := @comp do { opnd := @comp # There is at least one operand. case oprt of { FLD_OP: { __dbg_fput (res, opnd) __dbg_fput (res, [BINOP_T, oprt, __dbg_e_field]) } SSC_OP: { __dbg_e_ecode (opnd, res) __dbg_fput (res, [BINOP_T, oprt, __dbg_fproc ("[]", 2)]) } INVOKE_OP: { every __dbg_e_ecode (!opnd, res) __dbg_fput (res, [INVOKE_T, *opnd]) } PART_OP: { __dbg_e_ecode (opnd, res) __dbg_e_ecode (@comp, res) __dbg_fput (res, [TEROP_T, oprt, __dbg_fproc ("[:]", 3)]) } default: __dbg_ge_message := __dbg_fimage (oprt) || ": weird operator." } } end procedure __dbg_e_proc (op_d) # 'op_d' must be an operator descriptor (list(3)). # RETURNS the descriptor with the 3rd component filled in by a # procedure/function. static opt initial { opt := __dbg_ftable () opt[NOTN_OP] := __dbg_fproc ("\\", 1) opt[ISN_OP] := __dbg_fproc ("/", 1) opt[SIZ_OP] := __dbg_fproc ("*", 1) opt[BNG_OP] := __dbg_fproc ("!", 1) opt[NEG_OP] := __dbg_fproc ("-", 1) opt[ALT_OP] := __dbg_e_alt opt[CNJ_OP] := __dbg_e_cnj opt[NEQ_OP] := __dbg_fproc ("=", 2) opt[NNE_OP] := __dbg_fproc ("~=", 2) opt[NLE_OP] := __dbg_fproc ("<=", 2) opt[NLT_OP] := __dbg_fproc ("<", 2) opt[NGE_OP] := __dbg_fproc (">=", 2) opt[NGT_OP] := __dbg_fproc (">", 2) opt[LLT_OP] := __dbg_fproc ("<<", 2) opt[LLE_OP] := __dbg_fproc ("<<=", 2) opt[LEQ_OP] := __dbg_fproc ("==", 2) opt[LNE_OP] := __dbg_fproc ("~==", 2) opt[LGE_OP] := __dbg_fproc (">>=", 2) opt[LGT_OP] := __dbg_fproc (">>", 2) opt[EQ_OP] := __dbg_fproc ("===", 2) opt[NE_OP] := __dbg_fproc ("~===", 2) opt[ADD_OP] := __dbg_fproc ("+", 2) opt[SUBTR_OP] := __dbg_fproc ("-", 2) opt[UNION_OP] := __dbg_fproc ("++", 2) opt[DIFF_OP] := __dbg_fproc ("--", 2) opt[CAT_OP] := __dbg_fproc ("||", 2) opt[LCAT_OP] := __dbg_fproc ("|||", 2) opt[MUL_OP] := __dbg_fproc ("*", 2) opt[DIV_OP] := __dbg_fproc ("/", 2) opt[REM_OP] := __dbg_fproc ("%", 2) opt[ISCT_OP] := __dbg_fproc ("**", 2) opt[EXP_OP] := __dbg_fproc ("^", 2) opt[SSC_OP] := __dbg_fproc ("[]", 2) opt[PART_OP] := __dbg_fproc ("[:]", 2) opt[FLD_OP] := __dbg_e_field } op_d[3] := opt[op_d[2]] return op_d end #-------------- Evaluation ---------------------- procedure __dbg_e_eval (expr) # Evaluates a compiled expression. # 'expr' must be an expression using the representation created by # '__dbg_e_compile' (list). # GENERATES all expression values. # SIDE EFFECT: Assigns a message (string) to '__dbg_ge_message' on conflict; # assigns &null otherwise. local val __dbg_ge_message := &null &error := -1 every val := __dbg_e_eval1 (expr, []) do { &error := 0 suspend val __dbg_ge_message := &null &error := -1 } if &error < -1 then __dbg_ge_message := "Error number " || &errornumber || ": " || &errortext || "." || (("\nOffending value: " || __dbg_fimage (\&errorvalue) || ".") | "") &error := 0 end procedure __dbg_e_alt (opnd1, opnd2) # Our version of alternation. suspend (opnd1 | opnd2) end procedure __dbg_e_cnj (opnd1, opnd2) # Our version of conjunction. suspend (opnd1 & opnd2) end procedure __dbg_e_field (opnd1, opnd2) # Record field access. # Any better way to determine if a value is a record of any type? static builtin initial { builtin := __dbg_ftable () builtin["co-expression"] := 1 builtin["cset"] := 1 builtin["file"] := 1 builtin["integer"] := 1 builtin["list"] := 1 builtin["null"] := 1 builtin["procedure"] := 1 builtin["real"] := 1 builtin["set"] := 1 builtin["string"] := 1 builtin["table"] := 1 } if \builtin[__dbg_ftype (opnd1)] then { __dbg_ge_message := "Record expected; found " || __dbg_fimage (opnd1) fail } suspend opnd1[opnd2] end procedure __dbg_e_ident (idf) # Evaluates an identifier. local val (val := ((__dbg_ge_singular ~=== __dbg_g_local[idf]) | variable (idf))) | { __dbg_ge_message := "Identifier '" || idf || "' not visible." fail } suspend val end procedure __dbg_e_special (sp_code) # Evaluates a special identifier. suspend case sp_code of { # Regular Icon keyword variables. CLOCK_SP: &clock CURRENT_SP: ¤t DATE_SP: &date DATELINE_SP: &dateline POS_SP: &pos REGIONS_SP: ®ions SOURCE_SP: &source STORAGE_SP: &storage SUBJECT_SP: &subject VERSION_SP: &version # Special keywords. BREAK_SP: (\__dbg_g_where[WHERE_BRKP])[BRKP_ID] FILE_SP: __dbg_g_where[WHERE_FILE] LEVEL_SP: __dbg_g_level LINE_SP: __dbg_g_where[WHERE_LINE] PROC_SP: __dbg_g_where[WHERE_PROC] TRACE_SP: __dbg_g_trace default: { __dbg_ge_message := __dbg_fimage (sp_code) || ": weird special identifier code." fail } } end procedure __dbg_e_eval1 (expr, stack) # Evaluates an expression. # 'stack' must be the current evaluation stack (list). # The procedure is recursive; the initial invocation must supply an # empty list. local comp (comp := expr[1]) | while suspend __dbg_fpop (stack) | fail suspend __dbg_e_eval1 (expr[2:0], case comp[1] of { IDENT_T: stack ||| [__dbg_e_ident (comp[2])] SPECIAL_T: stack ||| [__dbg_e_special (comp[2])] LIST_T: stack[1:-comp[2]] ||| [stack[-comp[2]:0]] UNOP_T: stack[1:-1] ||| [comp[3](stack[-1])] BINOP_T: stack[1:-2] ||| [comp[3]!stack[-2:0]] TEROP_T: stack[1:-3] ||| [comp[3]!stack[-3:0]] INVOKE_T: stack[1:-(comp[2]+1)] ||| [stack[-(comp[2]+1)]!stack[-comp[2]:0]] default: stack ||| [comp[2]] }) end icon-9.4.3/ipl/packs/itweak/demo.cmd0000664000175000017500000000702507140713043016570 0ustar chrishchrish# Annotated debugging commands for the demo debugging session. # $Id: demo.cmd,v 2.21 1996/10/04 03:45:37 hs Rel $ # # After seeing the 'automatic' debugging session you may want to repeat # some of the commands manually in a new interactive session. # # The following commands use a liberal amount of 'fprint' to make the output # more readable. # The first few commands are spelled out fully. Then we start using # abbreviations. # # When you get the first prompt you are somewhere in anonymous initialization # code. Enter 'next' to step into a real source file. This is not necessary, # but may allow you to omit the file name in 'breakpoint' commands. next # What source files do we have? info files # Let's find out what globals the program contains... fprint "--- Globals:\n" info global # ...and the locals of the current procedure: fprint "--- Locals in %1:\n"; &proc info locals # Set a breakpoint in the main loop. break 88 goon # Got the first break. print word goon # Next break. pr word # Boring to 'print word' every time. Add this command to the # breakpoint. Note that when a breakpoint has commands the usual # prelude is not printed when a breakpoint is reached. Thus add some # extra printing. Note that 'fprint' does not automatically output a # newline. do . fprint "--- Break in %1 line %2: "; &proc; &line print word end go go go # Attach a condition to the breakpoint. This time we use the explicit # breakpoint id (1). cond 1 word == "buffer" go # Let's examine a compound variable. fprint "--- Examining 'resword'.\n" pr resword # It's a list. Try 'eprint' to see all elements. eprint !resword # 'eprint' prints 'every' value generated by an expression. # Try another one. pr prec # A list again. Prints its elements, epr !prec # Only one element which is a record. pr prec[1].pname epr !prec[1] # We may even invoke one of the target program's procedures. # Here we invoke 'addword' to add a bogus entry in the cross reference. # We use global 'linenum' to provide the line number. pr addword("ZORRO", "nowhere", linenum) # Examine globals again. fprint "--- Globals one more time:\n" inf gl fprint "--- WHAT??!!! The program has modified 'proc' -- bad manners!\n" # It's good to have a robust debugger. Let's examine the new value. pr proc; type(proc) # Examine the current breakpoint. fprint "--- The current breakpoint:\n" info br . # Let's set a breakpoint i procedure 'addword'... br 150 # ...and delete the first breakpoint. clear br 1 go # This is the way to find out where we are (the procedure call chain): where # It is possible to examine any of the frames in the call chain. frame 1 # Let the program work along for a while. # Ignore the 280 next breaks. fprint "--- Ignoring the next 280 breaks...\n" ign . 280 go # Find out about the word "word": pr var["word"] # It's a table. Examine its keys and entries. epr key(var["word"]) epr !var["word"] # The entries are lists. Let's look at the "addword" entry. epr !var["word"]["addword"] # That's a lot of typing. Let's try a macro. mac var eprint !var["word"]["addword"] fprint "That was %1 items.\n"; *var["word"]["addword"] end # Try the macro (which has now become a new command): var # Now we've tried the most common commands. # Let the program run to completion undisturbed. The following is an # abbreviation of 'goon nobreak'. fpr "--- Now let the program produce its normal output...\n\n" go no # We will se the normal output of the program: a cross reference listing # (in this case applied to its own source code). # Note the bogus 'ZORRO' variable we entered by calling 'addword'. icon-9.4.3/ipl/packs/loadfunc/0002775000175000017500000000000010336137160015465 5ustar chrishchrishicon-9.4.3/ipl/packs/loadfunc/ddump.c0000664000175000017500000000074007140713042016737 0ustar chrishchrish/* * ddump(a1, ...) -- descriptor dump * * The arguments are dumped in hexadecimal on standard output. * * This function requires neither an ANSI C compiler nor "icall.h". */ #include typedef struct { long dword; long vword; } descriptor; int ddump(argc, argv) int argc; descriptor *argv; { int i, n; n = 2 * sizeof(long); for (i = 1; i <= argc; i++) printf("%d. %0*lX %0*lX\n", i, n, argv[i].dword, n, argv[i].vword); return 0; } icon-9.4.3/ipl/packs/loadfunc/Makefile0000664000175000017500000000152407310604574017133 0ustar chrishchrish# Makefile for programs illustrating dynamic loading of C functions from Icon # # It is assumed that the standard C functions will be found by iconx. include ../../../Makedefs CFLAGS = -O $(CFDYN) -I../../cfuncs ICONT = icont IFLAGS = -us .SUFFIXES: .icn .icn: ; $(ICONT) $(IFLAGS) $< MKLIB = ../../cfuncs/mklib.sh PROGS = btest ddtest dldemo cspace tnet newsgrp FUNCS = argdump.o cspgen.o ddump.o FUNCLIB = libdemo.so default: $(PROGS) $(FUNCLIB) $(PROGS): libnames.icn libnames.icn: Makefile echo '$$define FUNCLIB "./$(FUNCLIB)"' >libnames.icn $(FUNCLIB): $(FUNCS) CC="$(CC)" CFLAGS="$(CFLAGS)" sh $(MKLIB) $(FUNCLIB) $(FUNCS) # Copy progs to ../../iexe: # nothing done here because these executables require libraries # and don't stand alone Iexe: clean Clean: rm -f $(PROGS) $(FUNCLIB) *.o *.so *.u[12] libnames.icn icon-9.4.3/ipl/packs/loadfunc/cspgen.c0000664000175000017500000000523507140713042017111 0ustar chrishchrish/* * cspgen(image, cycle) - calculate next "cyclic space" generation * * The image is considered a torus, with top and bottom connected directly * and with sides connected using a shift of one row. */ /* * internal buffer layout: * * image header * copy of last row * original array * copy of first row * * new array is stored atop old array, but directly after the header. */ #include #include #include "icall.h" int cspgen(int argc, descriptor *argv) { int ulength, period, i; char *ustring, *udata, *cycle; char *old, *new; char o, x; int w, h, n; /* width, height, total pixels */ char hbuf[20]; /* image header buffer */ int hlen; /* header length */ static char *ibuf; /* image buffer */ static int ilen; /* buffer length */ int ineed; /* buffer length needed */ static char map[256]; /* mapping from one char to next */ /* * Get the parameters. */ ArgString(1); /* validate types */ ArgString(2); ustring = StringAddr(argv[1]); /* universe string and length */ ulength = StringLen(argv[1]); cycle = StringAddr(argv[2]); /* cycle and length */ period = StringLen(argv[2]); sscanf(ustring, "%d", &w); /* row width */ /* * Build the generation mapping table. */ map[cycle[period-1] & 0xFF] = cycle[0]; /* last maps to first */ for (i = 1; i < period; i++) map[cycle[i-1] & 0xFF] = cycle[i]; /* * Copy the image header (through the second comma) to hbuf. */ old = ustring; new = hbuf; while ((*new++ = *old++) != ',') ; while ((*new++ = *old++) != ',') ; udata = old; hlen = udata - ustring; /* header length */ /* * Allocate the image buffer. */ n = ulength - hlen; /* number of pixels */ if (n % w != 0) Error(205); h = n / w; /* image height */ ineed = hlen + n + 2 * w; /* buffer size needed */ if (ilen < ineed) if (!(ibuf = realloc(ibuf, ilen = ineed))) Error(305); /* * Copy the image into the buffer. Allow for the possibility that * the image already be *in* the buffer. */ new = ibuf + hlen; old = new + w; memmove(old, udata, n); /* main image, leaving room */ memcpy(old - w, old + n - w, w); /* dup last row first first */ memcpy(old + n, old, w); /* dup first row beyond last */ /* * Create the new image. */ memcpy(ibuf, hbuf, hlen); for (i = 0; i < n; i++) { o = *old; x = map[o & 0xFF]; if (old[-1] == x || old[1] == x || old[-w] == x || old[w] == x) o = x; *new++ = o; old++; } /* * Return the result. */ RetConstStringN(ibuf, ulength); } icon-9.4.3/ipl/packs/loadfunc/ddtest.icn0000664000175000017500000000040607142627051017451 0ustar chrishchrish# ddtest.icn -- test ddump # # Calls a simple C function that prints out its arguments. $include "libnames.icn" global ddump procedure main() ddump := loadfunc(FUNCLIB, "ddump") ddump(-1, 51, 11213) write() ddump(&null, 1, "a", 3.4, 'cset') end icon-9.4.3/ipl/packs/loadfunc/README0000664000175000017500000000151207152770027016351 0ustar chrishchrishThis directory contains some demonstrations of loadfunc(). Some more generally useful C functions are provided in the ipl/cfuncs directory, and some of these test drivers depend on them. Set IPATH and FPATH, then type "make" to build everything. The C functions are as follows: argdump print arguments on standard output cspgen cellular automata ager for "cspace" (below) ddump dump descriptor in hexadecimal The Icon programs are as follows: btest simple demo using bitcount() from cfuncs library cspace cellular automata demonstration; opens a graphics window ddtest simple demo using ddump() dldemo simple demo using argdump() newsgrp connect to news server and print subjects from a newsgroup tnet very simple telnet client Further information is contained in the comments in the individual files. icon-9.4.3/ipl/packs/loadfunc/newsgrp.icn0000664000175000017500000000522407142627051017652 0ustar chrishchrish############################################################################ # # File: newsgrp.icn # # Subject: Program to get news files from NNTP server # # Author: Gregg M. Townsend # # Date: August 4, 2000 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # Usage: newsgrp newsgroup.name # # This program connects to an NNTP server and prints the subject lines # of the articles in the specified newsgroup. # ############################################################################ link cfunc # link standard C functions transparently $include "libnames.icn" $define SERVER "news" # default host name for server $define PORT 119 # NNTP port global verbose global socket, smode global host, group procedure main(args) local s, n, l, h, i group := args[1] | "comp.lang.icon" host := getenv("NNTPSERVER") | SERVER socket := tconnect(host, PORT) | stop("can't connect to port ", PORT, " of host ", host) expect("20") # read greeting line swrite("group ", group) # send newsgroup request expect("211") ? { ="211" n := integer(tab(many(' ')) & tab(upto(' '))) # number of articles l := integer(tab(many(' ')) & tab(upto(' '))) # low number h := integer(tab(many(' ')) & tab(upto(' '))) # high number } every i := l to h do { swrite("head ", i) # request article header s := sread() # read response if not (s ? ="221") then next # if not available while (s := sread()) ~== "." do # read through end-of-header flag if map(s) ? ="subject: " then write(i, ". ", s[10:0]) # output subject line } swrite("quit") end # expect(prefix) -- read line from socket and check prefix procedure expect(prefix) local s s := sread() if s ? =prefix then return s stop("expected ", prefix, ", read ", s) end # sread() -- read line from socket procedure sread() local s if \smode := &null then seek(socket) # switch file mode from output to input s := trim(read(socket), '\n\r') | stop("EOF") if \verbose then # if "verbose" mode set write("< ", s) # trace input line return s end # swrite(s, ...) -- write line to socket procedure swrite(s[]) push(s, "> ") if \verbose then # if "verbose" mode set write ! s # trace output s[1] := socket if /smode := 1 then { seek(socket) # switch file mode from input to output flush(socket) # workaround for Dec Alpha bug } return write ! s # write strings to port end icon-9.4.3/ipl/packs/loadfunc/cspace.icn0000664000175000017500000000500607142627051017421 0ustar chrishchrish############################################################################ # # File: cspace.icn # # Subject: Program to demonstrate a cellular automata # # Author: Gregg M. Townsend # # Date: August 4, 2000 # ############################################################################ # # Usage: cspace [-W width] [-H height] # # This program demonstrates a two-dimensional cellular automata designed # by David Griffeath of the University of Wisconsin. A. K. Dewdney # calls this "Cyclic Space". # # The window is seeded randomly and successive generations are displayed. # Press the space bar to single step, G to run free, R to reseed, or # Q to quit. # # See A.K.Dewdney, Computer Recreations, Scientific American, Aug. 1989. # (Reprinted in Dewdney, The Magic Machine, W.H.Freeman, 1990.) # ############################################################################ $include "libnames.icn" $define SIZE "size=600,401" # default window size $define PALETTE "c1" # color palette to use $define CYCLE "MAOBPCQDSFUHIVYL" # colors (and cycle length) #some other possibilities: #light $define CYCLE "aBPCcdefgh 0) | \stopped do case Event() of { " ": { stopped := 1; break } !"\n\rgG": { stopped := &null; break } !"rR": { u := seed(w, h); break } QuitEvents(): { log(w, h, g); exit() } &resize: { w:=WAttrib("width"); h:=WAttrib("height")-1; break } } DrawImage(,,u) # display current generation u := cspgen(u, CYCLE) # create next generation g +:= 1 if g % 100 = 0 then log(w, h, g) # log statistics every 100th gen } end procedure log(w, h, g) write(w, " x ", h, ":", right(g, 6), " generations in ", &time / 1000.0, " seconds") return end procedure seed(w, h) local u, n u := w || "," || PALETTE || "," n := w * h every 1 to n do u ||:= ?CYCLE return u end icon-9.4.3/ipl/packs/loadfunc/tnet.icn0000664000175000017500000000333207142627051017135 0ustar chrishchrish############################################################################ # # File: tnet.icn # # Subject: Program to talk to telnet port # # Author: Gregg M. Townsend # # Date: August 4, 2000 # ############################################################################ # # Usage: tnet hostname portnumber # # This is a VERY simple telnet client. It connects to a remote port # and exchanges data between the port and the terminal. The port is # read and echoed to the terminal until the port is quiet for 200 msec; # then one line from the terminal is sent to the port. This process # repeats until an EOF is read from either source. # # Some interesting port numbers can usually be found in /etc/services. # For example, network news is read from a news server using port 119. # # This program does not work under Irix because poll(2) always returns 1. # ############################################################################ link cfunc # link standard C functions transparently procedure main(args) local h, p, f, s h := args[1] | &host # default is current host p := integer(args[2]) | 13 # default is port 13 (time of day) f := tconnect(h, p) | stop("can't connect to port ", p, " of ", h) fpoll(f, 2000) # wait up to 2 sec for initial response repeat { while fpoll(f, 200) do # read characters from port until timeout writes(reads(f)) | { write("EOF"); break break } writes("\n> ") # issue prompt s := read() | break # read line from terminal seek(f) # enable switch from input to output flush(f) # workaround for Dec Alpha bug write(f, s) # write terminal input to port seek(f) # enable switch from output to input } end icon-9.4.3/ipl/packs/loadfunc/btest.icn0000664000175000017500000000032007142627051017276 0ustar chrishchrish# Simple demonstration of standard "bitcount" function link cfunc # link standard C functions transparently procedure main() local i every i := 500 to 520 do write(i, " ", bitcount(i)) end icon-9.4.3/ipl/packs/loadfunc/dldemo.icn0000664000175000017500000000111507140713042017416 0ustar chrishchrish# dldemo.icn -- dynamic loading demo # # Calls a simple C function that prints out its arguments. $include "libnames.icn" global argdump procedure main() argdump := loadfunc(FUNCLIB,"argdump") write("loadfunc result: ", image(argdump)) xcall(1, "a") xcall() xcall(&null) xcall(1, 2, 3) xcall("abc", "abcde"[2+:2], 123, 4.56, 'quick brown fox') xcall(&input, &output, &errout) xcall(main, argdump, [], &main, ) end procedure xcall(args[]) writes("\nargs:") every writes(" ", image(!args) | "\n") write("--- ", image(argdump ! args) | "failed") end icon-9.4.3/ipl/packs/loadfunc/argdump.c0000664000175000017500000000232407140713042017265 0ustar chrishchrish/* * Simple test of dynamic loading from Icon. * Just prints its arguments, then returns pi. */ #include "icall.h" int argdump(int argc, descriptor *argv) { int i, j, w, c; char *s, *t; descriptor *d; for (i = 1; i <= argc; i++) { printf("%2d. [%c] ", i, IconType(argv[i])); d = argv + i; switch (IconType(*d)) { case 'n': printf("&null"); break; case 'i': printf("%ld", IntegerVal(*d)); break; case 'r': printf("%g", RealVal(*d)); break; case 's': printf("%s", StringVal(*d)); break; case 'c': s = (char *)d->vword; s += 2 * sizeof(long); /* skip title & size */ t = s + 256 / 8; c = 0; while (s < t) { w = *(int *)s; for (j = 0; j < 8 * sizeof(int); j++) { if (w & 1) putchar(c); c++; w >>= 1; } s += sizeof(int); } break; case 'f': printf("fd=%d (", fileno(FileVal(*d))); if (FileStat(*d) & Fs_Read) putchar('r'); if (FileStat(*d) & Fs_Write) putchar('w'); putchar(')'); break; default: printf("??"); break; } putchar('\n'); } RetReal(3.1415926535); } icon-9.4.3/ipl/procs/0002775000175000017500000000000010336137162013721 5ustar chrishchrishicon-9.4.3/ipl/procs/vhttp.icn0000664000175000017500000001517307470574572015605 0ustar chrishchrish############################################################################ # # File: vhttp.icn # # Subject: Procedure for validating an HTTP URL # # Author: Gregg M. Townsend # # Date: May 15, 2002 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # vhttp(url) validates a URL (a World Wide Web link) of HTTP: form # by sending a request to the specified Web server. It returns a # string containing a status code and message. If the URL is not # in the proper form, or if it does not specify the HTTP: protocol, # vhttp fails. # ############################################################################ # # vhttp(url) makes a TCP connection to the Web server specified by the # URL and sends a HEAD request for the specified file. A HEAD request # asks the server to check the validity of a request without sending # the file itself. # # The response code from the remote server is returned. This is # a line containing a status code followed by a message. Here are # some typical responses: # # 200 OK # 200 Document follows # 301 Moved Permanently # 404 File Not Found # # See the HTTP protocol spec for more details. If a response cannot # be obtained, vhttp() returns one of these invented codes: # # 551 Connection Failed # 558 No Response # 559 Empty Response # ############################################################################ # # The request sent to the Web server can be parameterized by setting # two global variables. # # The global variable vhttp_agent is passed to the Web server as the # "User-agent:" field of the HEAD request; the default value is # "vhttp.icn". # # The global variable vhttp_from is passed as the "From:" field of the # HEAD request, if set; there is no default value. # ############################################################################ # # vhttp() contains deliberate bottlenecks to prevent a naive program # from causing annoyance or disruption to Web servers. No remote # host is connected more than once a second, and no individual file # is actually requested more than once a day. # # The request rate is limited to one per second by keeping a table # of contacted hosts and delaying if necessary so that no host is # contacted more than once in any particular wall-clock second. # # Duplicate requests are prevented by using a very simple cache. # The file $HOME/.urlhist is used to record responses, and these # responses are reused throughout a single calendar day. When the # date changes, the cache is invalidated. # # These mechanisms are crude, but they are effective good enough to # avoid overloading remote Web servers. In particular, a program # that uses vhttp() can be run repeatedly with the same data without # any effect after the first time on the Web servers referenced. # # The cache file, of course, can be defeated by deleting or editing. # The most likely reason for this would be to retry connections that # failed to complete on the first attempt. # ############################################################################ # # Links: cfunc # ############################################################################ # # Requires: Unix, dynamic loading # ############################################################################ # To Do: # # Distinguish timeout on connect from other failures (check &clock?) link cfunc global vhttp_agent # User_agent: global vhttp_from # From: $define HIST_FILE ".urlhist" # history file in $HOME $define AGENT_NAME "vhttp.icn" # default agent name $define MAX_WAIT 60 # maximum wait after connect (seconds) $define HTTP_PORT 80 # standard HTTP: port procedure vhttp(url) #: validate HTTP: URL local protocol, host, port, path, result initial vhttp_inithist() /vhttp_agent := AGENT_NAME url ? { protocol := map(tab(upto(':'))) | fail protocol == "http" | fail ="://" | fail host := map(tab(upto('/:') | 0)) | fail if =":" then port := tab(many(&digits)) | fail else port := HTTP_PORT if pos(0) then path := "/" else path := tab(0) } if result := vhttp_histval(url) then return result result := vhttp_contact(host, port, path) vhttp_addhist(url, result) return result end # vhttp_contact(host, port, path) -- internal procedure for contacting server procedure vhttp_contact(host, port, path) local f, line, hostport static deadhosts initial deadhosts := set() hostport := host || ":" || port if member(deadhosts, hostport) then return "551 Connection Failed" vhttp_waitclock(host) if not (f := tconnect(host, port)) then { insert(deadhosts, hostport) return "551 Connection Failed" } writes(f, "HEAD ", path, " HTTP/1.0\r\n") writes(f, "User-agent: ", \vhttp_agent, "\r\n") writes(f, "From: ", \vhttp_from, "\r\n") writes(f, "Host: ", host, "\r\n") writes(f, "\r\n") flush(f) seek(f, 1) if not fpoll(f, MAX_WAIT * 1000) then { close(f) return "558 No Response" } if not (line := read(f)) then { close(f) return "559 Empty Response" } close(f) line ? { tab(many(' ')) if ="HTTP/" then tab(many('12345.67890')) tab(many(' ')) return trim(tab(0), ' \t\r\n\v\f') } end # vhttp_waitclock(host) -- internal throttling procedure procedure vhttp_waitclock(host) static hclock, curclock initial { hclock := table() curclock := &clock } if hclock[host] === curclock then { curclock := &clock if hclock[host] === curclock then { delay(1000) curclock := &clock } } hclock[host] := curclock return end # internal history data and procedures global vhttp_htable, vhttp_hfile procedure vhttp_inithist() local fname, line, key, val vhttp_htable := table() fname := (getenv("HOME") | "?noHOME?") || "/" || HIST_FILE if (vhttp_hfile := open(fname, "b")) & (read(vhttp_hfile) == &date) then { while line := read(vhttp_hfile) do line ? { key := tab(upto(' ')) | next move(1) val := tab(0) vhttp_htable[key] := val } seek(vhttp_hfile, 0) # to allow switch to writing } else { close(\vhttp_hfile) vhttp_hfile := open(fname, "w") | stop("can't open " || fname) write(vhttp_hfile, &date) } return end procedure vhttp_histval(key) return \vhttp_htable[key] end procedure vhttp_addhist(key, val) vhttp_htable[key] := val write(vhttp_hfile, key, " ", val) return val end icon-9.4.3/ipl/procs/weavgenr.icn0000664000175000017500000000177107142355347016246 0ustar chrishchrish############################################################################ # # File: weavgenr.icn # # Subject: Links to procedures related to sequence drafting # # Author: Ralph E. Griswold # # Date: August 3, 2000 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # AD HOC # ############################################################################ # # Links: random # ############################################################################ link random procedure shaftmap(s) #: produce shaft map for characters local j, map_table map_table := table() j := 0 every /map_table[!s] := (j +:= 1) return map_table end procedure genshafts(s, tbl) #: generate shafts for string mapping suspend tbl[!s] end procedure genmapshafts(s1, s2) #: map string and generate shafts suspend genshafts(s1, shaftmap(s2)) end icon-9.4.3/ipl/procs/xforms.icn0000664000175000017500000000403607450115327015735 0ustar chrishchrish############################################################################ # # File: xforms.icn # # Subject: Procedures to do matrix transformations # # Author: Stephen W. Wampler and Ralph E. Griswold # # Date: March 25, 2002 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # These procedures produce matrices for affine transformation in two # dimensions and transform point lists. # # A point list is a list of Point() records. See gobject.icn. # ############################################################################ # # Links: matrix # ############################################################################ link matrix procedure transform(p, M) #: transform point list by matrix local pl, i # convert p to a matrix for matrix multiply... every put((pl := [[]])[1], (!p)|1.0) # the 1.0 makes it homogeneous # do the conversion... pl := mult_matrix(pl, M) # convert list back to a point list... p := copy(p) every i := 1 to *p do p[i] := pl[1][i] return p end procedure transform_points(pl,M) #: transform point list local xformed every put(xformed := [], !transform(!pl,M)) return xformed end procedure set_scale(x, y) #: matrix for scaling local M M := identity_matrix(3,3) M[1][1] := x M[2][2] := y return M end procedure set_trans(x, y) #: matrix for translation local M M := identity_matrix(3,3) M[*M][1] := x M[*M][2] := y return M end procedure set_xshear(x) #: matrix for x shear local M M := identity_matrix(3,3) M[1][2] := x return M end procedure set_yshear(y) #: matrix for y shear local M M := identity_matrix(3,3) M[2][1] := y return M end procedure set_rotate(x) #: matrix for rotation local M M := identity_matrix(3,3) M[1][1] := cos(x) M[2][2] := M[1][1] M[1][2] := sin(x) M[2][1] := -M[1][2] return M end icon-9.4.3/ipl/procs/ptutils.icn0000664000175000017500000000265607450115327016131 0ustar chrishchrish############################################################################ # # File: ptutils.icn # # Subject: Procedures relating to objects in 3-space # # Author: Ralph E. Griswold # # Date: March 25, 2002 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # These procedures provide various operations on 3-dimensional objects # in 3-space. # ############################################################################ # # Links: gobject # ############################################################################ link gobject procedure pt2coord(p) #: convert point to coordinate return p.x || " " || p.y || " " || p.z end procedure coord2pt(c) #: convert coordinate to path local p p := Point() c ? { p.x := tab(upto(' ')) move(1) p.y := tab(upto(' ')) move(1) p.z := tab(0) } return p end procedure negpt(p) #: negative of point return Point(-p.x, -p.y, -p.z) end procedure pteq(p1, p2) #: test point equality if p1.x = p2.x & p1.y = p2.y & p1.z = p2.z then return p2 else fail end procedure getpts(s) #: make point list from coordinate file local input, pts input := open(s) | stop("*** cannot open ", image(s)) pts := [] while put(pts, coord2pt(read(input))) return pts end icon-9.4.3/ipl/procs/tuple.icn0000664000175000017500000000456507140713037015555 0ustar chrishchrish############################################################################ # # File: tuple.icn # # Subject: Procedure to process n-tuples # # Author: William H. Mitchell # # Date: June 10, 1988 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # This procedure implements a "tuple" feature that produces the effect # of multiple keys. A tuple is created by an expression of the # form # # tuple([exrp1, expr2, ..., exprn]) # # The result can be used in a case expression or as a table subscript. # Lookup is successful provided the values of expr1, expr2, ..., exprn # are the same (even if the lists containing them are not). For example, # consider selecting an operation based on the types of two operands. The # expression # # case [type(op1), type(op2)] of { # ["integer", "integer"]: op1 + op2 # ["string", "integer"] : op1 || "+" || op2 # ["integer", "string"] : op1 || "+" || op2 # ["string", "string"] : op1 || "+" || op2 # } # # does not work, because the comparison in the case clauses compares lists # values, which cannot be the same as control expression, because the lists # are different, even though their contents are the same. With tuples, # however, the comparison succeeds, as in # # case tuple([type(op1), type(op2)]) of { # tuple(["integer", "integer"]): op1 + op2 # tuple(["string", "integer"]) : op1 || "+" || op2 # tuple(["integer", "string"]) : op1 || "+" || op2 # tuple(["string", "string"]) : op1 || "+" || op2 # } # ############################################################################ procedure tuple(tl) local tb, i, e, le static tuptab initial tuptab := table() # create the root node /tuptab[*tl] := table() # if there is no table for this size, make one tb := tuptab[*tl] # go to tuple for size of table i := 0 # assign default value to i every i := 1 to *tl - 1 do { # iterate though all but last value e := tl[i] # ith value in tuple /tb[e] := table() # if it is not in the table, make a new one tb := tb[e] # go to table for that value } le := tl[i + 1] # last value in tuple /tb[le] := copy(tl) # if it is new, entr a copy of the list return tb[le] # return the copy; it is unique end icon-9.4.3/ipl/procs/tokgen.icn0000664000175000017500000001675107140713037015713 0ustar chrishchrish############################################################################ # # File: tokgen.icn # # Subject: Procedures for token counting # # Author: Ralph E. Griswold # # Date: May 23, 1996 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # These procedures are for use with code produced by a meta-translator. # The result of linking these procedures with a program # translated by standard the meta-translator and executing the # result is a tabulation of the tokens in the program. # ############################################################################ # # Bug: The invocable declaration is not handled properly. "invocable all" # will get by, but some other forms produce syntax errors. The # problem is in the meta-translator itself, not in this # program. # ############################################################################ # # Links: showtbl # ############################################################################ link showtbl global binops, unops, vars, controls, procs, others, keys global clits, ilits, rlits, slits global summary, globals, locals, statics, declarations, fields, files, parms global fldref global all # kludge -- invocable is not handled properly procedure main() local names, tables, i, total, count total := 0 # total number of tokens # Build a list of tables for the different types of tokens. The order # of the tables determines the order of output. tables := [] every put(tables, (unops | binops | others | controls | keys | clits | ilits | rlits | slits | vars | fldref | declarations | globals | locals | statics | parms | fields | files) := table(0)) # Create a list of names for the different types of tokens. The order # of the names must correspond to the order of the tables above. names := ["Unary operators", "Binary operators", "Other operations", "Control structures", "Keywords", "Cset literals", "Integer literals", "Real literals", "String literals", "Variable references", "Field references", "Declarations", "Globals", "Locals", "Statics", "Procedure parameters", "Record fields", "Included files"] # Call the procedure corresponding to the target program. # It adds the token counts to the tables. Mp() every i := 1 to *names do { count := showtbl(names[i],tables[i])[1] total +:= count write("\n", right(count, 8), " total") } write("\nTotal tokens: ", total) end procedure Alt(e1, e2) # e1 | e2 controls["e1 | e2"] +:= 1 return end procedure Apply(e1, e2) # e1 ! e2 binops["e1 ! e2"] +:= 1 return end procedure Arg(s) return s end procedure Asgnop(op, e1, e2) # e1 op e2 binops["e1 " || op || " e2"] +:= 1 return end procedure Augscan(e1, e2) # e1 ?:= e2 controls["e1 ?:= e2"] +:= 1 return end procedure Bamper(e1, e2) # e1 & e2 binops["e1 & e2"] +:= 1 return end procedure Binop(s) binops["e1 " || s || " e2"] +:= 1 return end procedure Body(s[]) # procedure body return end procedure Break(e) # break e controls["break e"] +:= 1 return end procedure Case(e, clist) # case e of { caselist } controls["case"] +:= 1 return end procedure Cclause(e1, e2) # e1 : e2 controls["case selector"] +:= 1 return end procedure Clist(e1, e2) # e1 ; e2 in case list return end procedure Clit(s) clits[image(s)] +:= 1 return end procedure Compound(es[]) # { e1; e2; ... } every controls["{...}"] +:= 1 return end procedure Create(e) # create e controls["create e"] +:= 1 return end procedure Default(e) # default: e controls["default"] +:= 1 return end procedure End() # end return end procedure Every(e) # every e controls["every e"] +:= 1 return end procedure EveryDo(e1, e2) # every e1 do e2 controls["every e1 do e2"] +:= 1 return end procedure Fail() # fail controls["fail"] +:= 1 return end procedure Field(e1, e2) # e . f binops["e1 . e2"] +:= 1 fldref[e2] +:= 1 return end procedure Global(vs[]) # global v1, v2, ... every globals[!vs] +:= 1 declarations["global"] +:= *vs # each name counts as a declaration return end procedure If(e1, e2) # if e1 then e2 controls["if e1 then e2"] +:= 1 return end procedure IfElse(e1, e2, e3) # if e1 then e2 else e3 controls["if e1 then e2 else e3"] +:= 1 return end procedure Ilit(s) ilits[s] +:= 1 return end procedure Initial(s) # initial e controls["initial"] +:= 1 return end procedure Invocable(es[]) # invocable ... (problem) declarations["invocable"] +:= 1 return end procedure Invoke(e0, es[]) # e0(e1, e2, ...) others["e(...)"] +:= 1 return end procedure Key(s) keys["&" || s] +:= 1 return end procedure Limit(e1, e2) # e1 \ e2 controls["e1 \\ e2"] +:= 1 return end procedure Link(vs[]) # link "v1, v2, ..." every files[!vs] +:= 1 declarations["link"] +:= *vs # each file counts as a declaration return end procedure List(es[]) # [e1, e2, ... ] others["[...]"] +:= 1 return end procedure Local(vs[]) # local v1, v2, ... every locals[!vs] +:= 1 declarations["local"] +:= *vs # each name counts as a declaration return end procedure Next() # next controls["next"] +:= 1 return end procedure Not(e) # not e controls["not e"] +:= 1 return end procedure Null() # &null return end procedure Paren(es[]) # (e1, e2, ... ) if *es > 1 then others["(...)"] +:= 1 return end procedure Pdco(e0, es[]) # e0{e1, e2, ... } others["e{...}"] +:= 1 return end procedure Proc(s, es[]) # procedure s(v1, v2, ...) local p every parms[\!es] +:= 1 do declarations["procedure"] +:= 1 return end procedure Record(s, es[]) # record s(v1, v2, ...) every fields[\!es] +:= 1 declarations["record"] +:= 1 return end procedure Repeat(e) # repeat e controls["repeat e"] +:= 1 return end procedure Return(e) # return e controls["return e"] +:= 1 return end procedure Rlit(s) rlits[s] +:= 1 return end procedure Scan(e1, e2) # e1 ? e2 controls["e1 ? e2"] +:= 1 return end procedure Section(op, e1, e2, e3) # e1[e2 op e3] others["e1[e2" || op || "e3]"] +:= 1 return end procedure Slit(s) slits[image(s)] +:= 1 return end procedure Static(ev[]) # static v1, v2, .. every statics[!ev] +:= 1 declarations["static"] +:= *ev # each name counts as a declaration return end procedure Subscript(e1, e2) # e1[e2] binops["e1[e2]"] +:= 1 return end procedure Suspend(e) # suspend e controls["suspend e"] +:= 1 return end procedure SuspendDo(e1, e2) # suspend e1 do e2 controls["suspend e1 do e2"] +:= 1 return end procedure To(e1, e2) # e1 to e2 others["e1 to e2"] +:= 1 return end procedure ToBy(e1, e2, e3) # e1 to e2 by e3 others["e1 to e2 by e3"] +:= 1 return end procedure Repalt(e) # |e controls["|e"] +:= 1 return end procedure Unop(s) # op e (op may be compound) every unops[!s || "e"] +:= 1 return end procedure Until(e) # until e controls["until e"] +:= 1 return end procedure UntilDo(e1, e2) # until e1 do e2 controls["until e1 do e2"] +:= 1 return end procedure Var(s) vars[s] +:= 1 return end procedure While(e) # while e controls["while e"] +:= 1 return end procedure WhileDo(e1, e2) # while e1 do e2 controls["while e1 do e2"] +:= 1 return end icon-9.4.3/ipl/procs/seqimage.icn0000664000175000017500000000360207140713037016206 0ustar chrishchrish############################################################################ # # File: seqimage.icn # # Subject: Procedures to produce string image of Icon result sequence # # Author: Ralph E. Griswold # # Date: June 20, 1997 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # The procedure Seqimage{e,i,j} produces a string image of the # result sequence for the expression e. The first i results are # printed. If i is omitted, there is no limit. If there are more # than i results for e, ellipses are provided in the image after # the first i. If j is specified, at most j results from the end # of the sequence are printed after the ellipses. If j is omitted, # only the first i results are produced. # # For example, the expressions # # Seqimage{1 to 12} # Seqimage{1 to 12,10} # Seqimage{1 to 12,6,3} # # produce, respectively, # # {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12} # {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, ...} # {1, 2, 3, 4, 5, 6, ..., 10, 11, 12} # # # Warning: If j is not omitted and e has an infinite result sequence, # Seqimage{} does not terminate. # ############################################################################ procedure Seqimage(L) local seq, result, i, j, resid seq := "" i := @L[2] j := @L[3] while result := image(@L[1]) do if *L[1] > \i then { if /j then { seq ||:= ", ..." break } else { resid := [", " || result] every put(resid,", " || image(|@L[1])) if *resid > j then seq ||:= ", ..." every seq ||:= resid[*resid -j + 1 to *resid] } } else seq ||:= ", " || result return "{" || seq[3:0] || "}" | "{}" end icon-9.4.3/ipl/procs/recurmap.icn0000664000175000017500000000243607140713040016227 0ustar chrishchrish############################################################################ # # File: recurmap.icn # # Subject: Procedure to map recurrence declarations to procedures # # Author: Ralph E. Griswold # # Date: February 17, 1995 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # This procedure maps a recurrence declaration of the form # # f(i): # if expr11 then expr12 # if expr21 then expr22 # ... # else expr # # The declaration if passed to recurmap() in the form of a list. # The result is returned as a string constituting an Icon procedure # declaration. # # into an Icon procedure that compute corresponding values. # # At present there is no error checking and the most naive form of # code is generated. # ############################################################################ procedure recurmap(recur) local line, proto, result result := "" every line := !recur do { line ? { if proto := tab(upto(":")) & pos(-1) then { result ||:= "procedure " || proto || "\nreturn {\n" } else result ||:= || tab(0) || "\n" } } return result || "}\nend" end icon-9.4.3/ipl/procs/readtbl.icn0000664000175000017500000000420707274062401016032 0ustar chrishchrish############################################################################ # # File: readtbl.icn # # Subject: Procedures to read user-created stripsgml table # # Author: Richard L. Goerwitz # # Date: May 2, 2001 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # Version: 1.1 # ############################################################################ # # This file is part of the strpsgml package. It does the job of read- # ing option user-created mapping information from a file. The purpose # of this file is to specify how each code in a given input text should # be translated. Each line has the form: # # SGML-designator start_code end_code # # where the SGML designator is something like "quote" (without the quota- # tion marks), and the start and end codes are the way in which you want # the beginning and end of a ...<\quote> sequence to be transla- # ted. Presumably, in this instance, your codes would indicate some set # level of indentation, and perhaps a font change. If you don't have an # end code for a particular SGML designator, just leave it blank. # ############################################################################ # # Links: stripunb # ############################################################################ link stripunb procedure readtbl(f) local t, line, k, on_sequence, off_sequence /f & stop("readtbl: Arg must be a valid open file.") t := table() every line := trim(!f,'\t ') do { line ? { k := tabslashupto('\t:') & tab(many('\t:')) & on_sequence := tabslashupto('\t:') | tab(0) tab(many('\t:')) off_sequence := tab(0) } | stop("readtbl: Bad map file format.") insert(t, k, outstr(on_sequence, off_sequence)) } return t end procedure tabslashupto(c,s) local POS POS := &pos while tab(upto('\\' ++ c)) do { if ="\\" then { move(1) next } else { if any(c) then { suspend &subject[POS:.&pos] } } } &pos := POS fail end icon-9.4.3/ipl/procs/everycat.icn0000664000175000017500000000235707140713036016242 0ustar chrishchrish############################################################################ # # File: everycat.icn # # Subject: Procedure for generating all concatenations # # Author: Ralph E. Griswold # # Date: April 25, 1992 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # everycat(x1, x2, ...) generates the concatenation of every string # from !x1, !x2, ... . # # For example, if # # first := ["Mary", "Joe", "Sandra"] # last := ["Smith", "Roberts"] # # then # # every write(everycat(first, " ", last)) # # writes # # Mary Smith # Mary Roberts # Joe Smith # Joe Roberts # Sandra Smith # Sandra Roberts # # Note that x1, x2, ... can be any values for which !x1, !x2, ... produce # strings or values convertible to strings. In particular, in the example # above, the second argument is a one-character string " ", so that !" " # generates a single blank. # ############################################################################ procedure everycat(args[]) local arg arg := get(args) | fail if *args = 0 then suspend !arg else suspend !arg || everycat ! args end icon-9.4.3/ipl/procs/weighted.icn0000664000175000017500000000720607140713037016217 0ustar chrishchrish############################################################################ # # File: weighted.icn # # Subject: Procedure to shuffle list with randomness # # Author: Erik Eid # # Date: May 23, 1994 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # WeightedShuffle returns the list "sample" with only a portion of the # elements switched. Examples: # # L := WeightedShuffle (X, 100) - returns a fully shuffled list # L := WeightedShuffle (X, 50) - every other element is eligible to # be switched # L := WeightedShuffle (X, 25) - every fourth element is shuffled # L := WeightedShuffle (X, 0) - nothing is changed # # The procedure will fail if the given percentage is not between 0 and # 100, inclusive, or if it is not a numeric value. # ############################################################################ procedure WeightedShuffle (sample, percentage) local lcv, pairs, weight, size, newlist, legal, illegal numeric(percentage) | fail (0 <= percentage <= 100) | fail newlist := copy(sample) # Start with a copy of the # original list. size := *newlist legal := list() # This list will hold which # indices are valid choices for # the shuffle, amounting to the # selected percentage of all # elements. # There are two very similar methods used here. I found that using only the # first one created some odd values for 50 < percentage < 100, so I mirrored # the technique to create a list of "bad" indices instead of a list of # "good" indices that the random switch can choose from. if ((percentage <= 50) | (percentage = 100)) then { pairs := integer (size * percentage / 100) # Number of pairs to be switched. if pairs > 0 then { # Makes sure to avoid division by # zero- occurs when there is no # need to shuffle. weight := integer ((real(size) / pairs) + 0.5) # Holds increment used in # selective shuffling, rounded up. lcv := 1 until lcv > size do { put (legal, lcv) # These indices may be used in # the shuffle. lcv +:= weight } } } else { # percentage > 50 pairs := integer (size * (100 - percentage) / 100) # Avoid switching this many pairs. if pairs > 0 then { weight := integer (size / pairs) # Increment, rounded down. illegal := set ([]) # Which indices can't be used? lcv := 1 until lcv > size do { illegal ++:= set([lcv]) # Compile the list of invaild # indices. lcv +:= weight } every lcv := 1 to size do # Whatever isn't bad is good. if not member (illegal, lcv) then put (legal, lcv) } } every newlist[!legal] :=: newlist[?legal] # Shuffle elements only from # legal indices. return newlist end icon-9.4.3/ipl/procs/indices.icn0000664000175000017500000000355107140713037016034 0ustar chrishchrish############################################################################ # # File: indices.icn # # Subject: Procedure to produce indices # # Author: Ralph E. Griswold # # Date: June 2, 1998 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # indices(spec, last) # produces a list of the integers given by the # specification spec, which is a common separated list # of either positive integers or integer spans, as in # # "1,3-10, ..." # # If last is specified, it it used for a span of # the form "10-". # # In an integer span, the low and high values need not # be in order. For example, "1-10" and "10-1" # are equivalent. Similarly, indices need not be # in order, as in "3-10, 1, ..." # # And empty value, as in "10,,12" is ignored. # # indices() fails if the specification is syntactically # erroneous or if it contains a value less than 1. # ############################################################################ procedure indices(spec, last) #: generate indices local item, hi, lo, result if \last then last := (0 < integer(last)) | fail result := set() spec ? { while item := tab(upto(',') | 0) do { if item := integer(item) then ((insert(result, 0 < item)) | fail) else if *item = 0 then { move(1) | break next } else item ? { (lo := (0 < integer(tab(upto('-')))) | fail) move(1) hi := (if pos(0) then last else ((0 < integer(tab(0)) | fail))) /hi := lo if lo > hi then lo :=: hi every insert(result, lo to hi) } move(1) | break } } return sort(result) end icon-9.4.3/ipl/procs/itlibdos.icn0000664000175000017500000003606407140713036016233 0ustar chrishchrish############################################################################ # # File: itlibdos.icn # # Subject: Procedures for MS-DOS termlib-type tools # # Author: Richard L. Goerwitz # # Date: August 14, 1996 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # Version: 1.15 # ############################################################################ # # The following library represents a series of rough functional # equivalents to the standard UNIX low-level termcap routines. They # are not meant as exact termlib clones. Nor are they enhanced to # take care of magic cookie terminals, terminals that use \D in their # termcap entries, or, in short, anything I felt would not affect my # normal, day-to-day work with ANSI and vt100 terminals. At this # point I'd recommend trying iolib.icn instead of itlibdos.icn. Iolib # is largely DOS-UNIX interchangeable, and it does pretty much every- # thing itlibdos.icn does. # ############################################################################ # # Requires: An MS-DOS platform & co-expressions. The MS-DOS version # is a port of the UNIX version. Software you write for this library # can be made to run under UNIX simply by substituting the UNIX ver- # sion of this library. See below for additional notes on how to use # this MS-DOS port. # # setname(term) # Use only if you wish to initialize itermlib for a terminal # other than what your current environment specifies. "Term" is the # name of the termcap entry to use. Normally this initialization is # done automatically, and need not concern the user. # # getval(id) # Works something like tgetnum, tgetflag, and tgetstr. In the # spirit of Icon, all three have been collapsed into one routine. # Integer valued caps are returned as integers, strings as strings, # and flags as records (if a flag is set, then type(flag) will return # "true"). Absence of a given capability is signalled by procedure # failure. # # igoto(cm,destcol,destline) - NB: default 1 offset (*not* zero)! # Analogous to tgoto. "Cm" is the cursor movement command for # the current terminal, as obtained via getval("cm"). Igoto() # returns a string which, when output via iputs, will cause the # cursor to move to column "destcol" and line "destline." Column and # line are always calculated using a *one* offset. This is far more # Iconish than the normal zero offset used by tgoto. If you want to # go to the first square on your screen, then include in your program # "iputs(igoto(getval("cm"),1,1))." # # iputs(cp,affcnt) # Equivalent to tputs. "Cp" is a string obtained via getval(), # or, in the case of "cm," via igoto(getval("cm"),x,y). Affcnt is a # count of affected lines. It is only relevant for terminals which # specify proportional (starred) delays in their termcap entries. # ############################################################################ # # Notes on the MS-DOS version: # There are two basic reasons for using the I/O routines # contained in this package. First, by using a set of generalized # routines, your code will become much more readable. Secondly, by # using a high level interface, you can avoid the cardinal # programming error of hard coding things like screen length and # escape codes into your programs. # To use this collection of programs, you must do two things. # First, you must add the line "device=ansi.sys" (or the name of some # other driver, like zansi.sys, nansi.sys, or nnansi.sys [=new # nansi.sys]) to your config.sys file. Secondly, you must add two # lines to your autoexec.bat file: 1) "set TERM=ansi-mono" and 2) # "set TERMCAP=\location\termcap." The purpose of setting the TERM # variable is to tell this program what driver you are using. If you # have a color system, use "ansi-color" instead of "ansi-mono," and # if you are using nansi or zansi instead of vanilla ansi, use one of # these names instead of the "ansi" (e.g. "zansi-mono"). The purpose # of setting TERMCAP is to make it possible to determine where the # termcap file is located. The termcap file (which should have been # packed with this library as termcap.dos) is a short database of all # the escape sequences used by the various terminal drivers. Set # TERMCAP so that it reflects the location of this file (which should # be renamed as termcap, for the sake of consistency with the UNIX # version). Naturally, you must change "\location\" above to reflect # the correct path on your system. With some distributions, a second # termcap file may be included (termcap2.dos). Certain games work a # lot better using this alternate file. To try it out, rename it to # termcap, and set TERMCAP to its location. # Although I make no pretense here of providing here a complete # introduction to the format of the termcap database file, it will be # useful, I think, to explain a few basic facts about how to use this # program in conjunction with it. If, say, you want to clear the # screen, add the line, # # iputs(getval("cl")) # # to your program. The function iputs() outputs screen control # sequences. Getval retrieves a specific sequence from the termcap # file. The string "cl" is the symbol used in the termcap file to # mark the code used to clear the screen. By executing the # expression "iputs(getval("cl"))," you are 1) looking up the "cl" # (clear) code in the termcap database entry for your terminal, and # the 2) outputting that sequence to the screen. # Some other useful termcap symbols are "ce" (clear to end of # line), "ho" (go to the top left square on the screen), "so" (begin # standout mode), and "se" (end standout mode). To output a # boldfaced string, str, to the screen, you would write - # # iputs(getval("so")) # writes(str) # iputs(getval("se")) # # You could write "writes(getval("so") || str || getval("se")), but # this would only work for DOS. Some UNIX terminals require padding, # and iputs() handles them specially. Normally you should not worry # about UNIX quirks under DOS. It is in general wise, though, to # separate out screen control sequences, and output them via iputs(). # It is also heartily to be recommended that MS-DOS programmers # try not to assume that everyone will be using a 25-line screen. # Some terminals are 24-line. Some 43. Some have variable window # sizes. If you want to put a status line on, say, the 2nd-to-last # line of the screen, then determine what that line is by executing # "getval("li")." The termcap database holds not only string-valued # sequences, but numeric ones as well. The value of "li" tells you # how many lines the terminal has (compare "co," which will tell you # how many columns). To go to the beginning of the second-to-last # line on the screen, type in: # # iputs(igoto(getval("cm"), 1, getval("li")-1)) # # The "cm" capability is a special capability, and needs to be output # via igoto(cm,x,y), where cm is the sequence telling your computer # to move the cursor to a specified spot, x is the column, and y is # the row. The expression "getval("li")-1" will return the number of # the second-to-last line on your screen. # ############################################################################ # # Requires: MS-DOS, coexpressions # ############################################################################ # # See also: iscreen.icn, iolib.icn, itlib.icn # ############################################################################ global tc_table record true() procedure check_features() local in_params, line initial { find("ms-dos",map(&features)) | er("check_features","MS-DOS system required",1) find("o-expres",&features) | er("check_features","co-expressions not implemented - &$#!",1) } return end procedure setname(name) # Sets current terminal type to "name" and builds a new termcap # capability database (residing in tc_table). Fails if unable to # find a termcap entry for terminal type "name." If you want it # to terminate with an error message under these circumstances, # comment out "| fail" below, and uncomment the er() line. #tc_table is global check_features() tc_table := maketc_table(getentry(name)) | fail # er("setname","no termcap entry found for "||name,3) return end procedure getname() # Getname() first checks to be sure we're running under DOS, and, # if so, tries to figure out what the current terminal type is, # checking the value of the environment variable TERM, and if this # is unsuccessful, defaulting to "mono." local term, tset_output check_features() term := getenv("TERM") | "mono" return \term | er("getname","can't seem to determine your terminal type",1) end procedure er(func,msg,errnum) # short error processing utility write(&errout,func,": ",msg) exit(errnum) end procedure getentry(name, termcap_string) # "Name" designates the current terminal type. Getentry() scans # the current environment for the variable TERMCAP. If the # TERMCAP string represents a termcap entry for a terminal of type # "name," then getentry() returns the TERMCAP string. Otherwise, # getentry() will check to see if TERMCAP is a file name. If so, # getentry() will scan that file for an entry corresponding to # "name." If the TERMCAP string does not designate a filename, # getentry() will look through ./termcap for the correct entry. # Whatever the input file, if an entry for terminal "name" is # found, getentry() returns that entry. Otherwise, getentry() # fails. local f, getline, line, nm, ent1, ent2, entry /termcap_string := getenv("TERMCAP") if \termcap_string ? (not match("\\"), pos(1) | tab(find("|")+1), =name) then return termcap_string else { # The logic here probably isn't clear. The idea is to try to use # the termcap environment variable successively as 1) a termcap en- # try and then 2) as a termcap file. If neither works, 3) go to # the ./termcap file. The else clause here does 2 and, if ne- # cessary, 3. The "\termcap_string ? (not match..." expression # handles 1. if find("\\",\termcap_string) then f := open(termcap_string) /f := open("termcap") | er("getentry","I can't access your termcap file",1) getline := create read_file(f) while line := @getline do { if line ? (pos(1) | tab(find("|")+1), =name, any(':|')) then { entry := "" while (\line | @getline) ? { if entry ||:= 1(tab(find(":")+1), pos(0)) then { close(f) # if entry ends in tc= then add in the named tc entry entry ?:= tab(find("tc=")) || # recursively fetch the new termcap entry (move(3), getentry(tab(find(":"))) ? # remove the name field from the new entry (tab(find(":")+1), tab(0))) return entry } else { \line := &null # must precede the next line entry ||:= trim(trim(tab(0),'\\'),':') } } } } } close(f) er("getentry","can't find and/or process your termcap entry",3) end procedure read_file(f) # Suspends all non #-initial lines in the file f. # Removes leading tabs and spaces from lines before suspending # them. local line \f | er("read_tcap_file","no valid termcap file found",3) while line := read(f) do { match("#",line) & next line ?:= (tab(many('\t ')) | &null, tab(0)) suspend line } fail end procedure maketc_table(entry) # Maketc_table(s) (where s is a valid termcap entry for some # terminal-type): Returns a table in which the keys are termcap # capability designators, and the values are the entries in # "entry" for those designators. local k, v /entry & er("maketc_table","no entry given",8) if entry[-1] ~== ":" then entry ||:= ":" tc_table := table() entry ? { tab(find(":")+1) # tab past initial (name) field while tab((find(":")+1) \ 1) ? { &subject == "" & next if k := 1(move(2), ="=") then tc_table[k] := Decode(tab(find(":"))) else if k := 1(move(2), ="#") then tc_table[k] := integer(tab(find(":"))) else if k := 1(tab(find(":")), pos(-1)) then tc_table[k] := true() else er("maketc_table", "your termcap file has a bad entry",3) } } return tc_table end procedure getval(id) /tc_table := maketc_table(getentry(getname())) | er("getval","can't make a table for your terminal",4) return \tc_table[id] | fail # er("getval","the current terminal doesn't support "||id,7) end procedure Decode(s) local new_s, chr, chr2 # Does things like turn ^ plus a letter into a genuine control # character. new_s := "" s ? { while new_s ||:= tab(upto('\\^')) do { chr := move(1) if chr == "\\" then { new_s ||:= { case chr2 := move(1) of { "\\" : "\\" "^" : "^" "E" : "\e" "b" : "\b" "f" : "\f" "n" : "\n" "r" : "\r" "t" : "\t" default : { if any(&digits,chr2) then { char(integer("8r"||chr2||move(2 to 0 by -1))) | er("Decode","bad termcap entry",3) } else chr2 } } } } else new_s ||:= char(ord(map(move(1),&lcase,&ucase)) - 64) } new_s ||:= tab(0) } return new_s end procedure igoto(cm,col,line) local colline, range, increment, padding, str, outstr, chr, x, y if col > (tc_table["co"]) | line > (tc_table["li"]) then { colline := string(\col) || "," || string(\line) | string(\col|line) range := "(" || tc_table["co"]-1 || "," || tc_table["li"]-1 || ")" er("igoto",colline || " out of range " || (\range|""),9) } # Use the Iconish 1;1 upper left corner & not the C-ish 0 offsets increment := -1 outstr := "" cm ? { while outstr ||:= tab(find("%")) do { tab(match("%")) if padding := integer(tab(any('23'))) then chr := (="d" | "d") else chr := move(1) if case \chr of { "." : outstr ||:= char(line + increment) "+" : outstr ||:= char(line + ord(move(1)) + increment) "d" : { str := string(line + increment) outstr ||:= right(str, \padding, "0") | str } } then line :=: col else { case chr of { "n" : line := ixor(line,96) & col := ixor(col,96) "i" : increment := 0 "r" : line :=: col "%" : outstr ||:= "%" "B" : line := ior(ishift(line / 10, 4), line % 10) ">" : { x := move(1); y := move(1) line > ord(x) & line +:= ord(y) &null } } | er("goto","bad termcap entry",5) } } return outstr || tab(0) } end procedure iputs(cp, affcnt) # Writes cp to the screen. Use this instead of writes() for # compatibility with the UNIX version (which will need to send # null padding in some cases). Iputs() also does a useful type # check. static num_chars initial num_chars := &digits ++ '.' type(cp) == "string" | er("iputs","you can't iputs() a non-string value!",10) cp ? { if tab(many(num_chars)) & ="*" then stop("iputs: MS-DOS termcap files shouldn't specify padding.") writes(tab(0)) } return end icon-9.4.3/ipl/procs/str2toks.icn0000664000175000017500000000442507140713037016212 0ustar chrishchrish############################################################################ # # File: str2toks.icn # # Subject: Procedures to convert string to tokens # # Author: Richard L. Goerwitz # # Date: March 3, 1996 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # Version: 1.2 # ############################################################################ # # str2toks: cset x string x integer x integer -> strings # (c, s, i, j) -> s1, s2, ... # # Suspends portions of s[i:j] delimited by characters in c. The # usual defaults for s, i, and j apply, although str2toks is not # meant as a primitive scanning function (note that it suspends # strings, and not integer positions). # # Defaults: # # c ~(&letters ++ &digits) # s &subject # i &pos if s is defaulted, otherwise 1 # j 0 # # Basically, this file is just a very simple piece of code wrapped up # with some sensible defaults, and isolated in its own procedure. # ############################################################################ # # Example: # # "hello, how are ya?" ? every write(str2toks()) # # The above expression would write to &output, on successive lines, # the words "hello", "how", "are", and finally "ya" (skipping the # punctuation). Naturally, the beginning and end of the line count # as delimiters. # # Note that if i > 1 or j < *s+1 some tokens may end up appearing # truncated. Normally, one should simply use the defaults for i and # j - and for s as well when inside a scanning expression. # ############################################################################ procedure str2toks(c, s, i, j) local token, default_val /c := ~(&letters ++ &digits) if /s := &subject then default_val := &pos else default_val := 1 if \i then { if i < 1 then i := *s + (i+1) } else i := default_val if \j then { if j < 1 then j := *s + (j+1) } else j := *s+1 s[i:j] ? { tab(many(c)) while token := tab(upto(c)) do { suspend token tab(many(c)) } suspend "" ~== tab(0) } end icon-9.4.3/ipl/procs/feval.icn0000664000175000017500000000243307140713037015511 0ustar chrishchrish############################################################################ # # File: feval.icn # # Subject: Procedure to evaluate string as function call # # Author: Ralph E. Griswold # # Date: June 8, 1994 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # This procedure analyzes a string representing an Icon function or # procedure call and evaluates the result. # # It assumes the string is well-formed. The arguments can only be # Icon literals. Escapes, commas, and parentheses in strings literals # are not handled. # ############################################################################ # # Links: ivalue # ############################################################################ invocable all link ivalue procedure feval(s) local fnc, argl s ? { fnc := tab(upto('(')) | { write(&errout, "*** syntax error") fail } fnc := proc(fnc, 3 to 1 by -1) | { write(&errout, "*** invalid function or operation") fail } move(1) argl := [] while put(argl, ivalue(tab(upto(',)')))) do move(1) suspend fnc ! argl } end icon-9.4.3/ipl/procs/boolops.icn0000664000175000017500000000565207631301744016102 0ustar chrishchrish############################################################################ # # File: boolops.icn # # Subject: Procedure to perform Boolean operations on row patterns # # Author: Ralph E. Griswold # # Date: June 26, 2002 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # Limitation: Assumes square patterns. # ############################################################################ # # Links: convert # ############################################################################ link convert procedure b0000(n, m) local blank blank := [] every 1 to n do put(blank, repl("0", m)) return blank end procedure b0001(rows1, rows2) return b01(b1110(rows1, rows2)) end procedure b0010(rows1, rows2) return b01(b1101(rows1, rows2)) end procedure b0011(rows1, rows2) return b01(b1100(rows1, rows2)) end procedure b01(rows) #: complement pattern local new_rows, i new_rows := copy(rows) every i := 1 to *rows do new_rows[i] := map(rows[i], "01", "10") return new_rows end procedure b0100(rows1, rows2) return b01(b1011(rows1, rows2)) end procedure b0101(rows1, rows2) return b01(b1010(rows1, rows2)) end procedure b0110(rows1, rows2) #: "xor" of two patterns local pixels1, pixels2 pixels1 := inbase10(rows2pixels(rows1), 2) pixels2 := inbase10(rows2pixels(rows2), 2) return pixels2rows(right(exbase10(ixor(pixels1, pixels2), 2), *rows1 ^ 2, "0"), *rows1) end procedure b0111(rows1, rows2) return b01(b1000(rows1, rows2)) end procedure b1000(rows1, rows2) #: "and" of two patterns local pixels1, pixels2 pixels1 := inbase10(rows2pixels(rows1), 2) pixels2 := inbase10(rows2pixels(rows2), 2) return pixels2rows(right(exbase10(iand(pixels1, pixels2), 2), *rows1 ^ 2, "0"), *rows1) end procedure b1001(rows1, rows2) return b01(b0110(rows1, rows2)) end procedure b1010(rows1, rows2) return copy(rows2) end procedure b1011(rows1, rows2) return b1110(b01(rows1), rows2) end procedure b1100(rows1, rows2) return copy(rows1) end procedure b1101(rows1, rows2) return b1110(rows1, b01(rows2)) end procedure b1110(rows1, rows2) #: "or" of two patterns local pixels1, pixels2 pixels1 := inbase10(rows2pixels(rows1), 2) pixels2 := inbase10(rows2pixels(rows2), 2) return pixels2rows(right(exbase10(ior(pixels1, pixels2), 2), *rows1 ^ 2, "0"), *rows1) end procedure b1111(n, m) static all initial { all := [] every 1 to n do put(all, repl("1", m)) } return all end procedure pixels2rows(pixels, n) local rows rows := [] pixels ? { while put(rows, move(n)) } return rows end procedure rows2pixels(rows) local pixels pixels := "" every pixels ||:= !rows return pixels end icon-9.4.3/ipl/procs/random.icn0000664000175000017500000001030007505730322015665 0ustar chrishchrish############################################################################ # # File: random.icn # # Subject: Procedures related to random numbers # # Authors: Ralph E. Griswold and Gregg M. Townsend # # Date: June 24, 2002 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # This file contains procedures related to pseudo-random numbers. # # rand_num() is a linear congruential pseudo-random number # generator. Each time it is called, it produces # another number in the sequence and also assigns it # to the global variable random. With no arguments, # rand_num() produces the same sequence(s) as Icon's # built-in random-number generator. Arguments can be # used to get different sequences. # # The global variable random serves the same role that # &random does for Icon's built-in random number # generator. # # rand_int(i) produces a randomly selected integer in the range 1 # to i. It models ?i for positive i. # # randomize() sets &random to a "random" value, using /dev/urandom # if available, otherwise based on the date and time. # # randrange(min, max) # produces random number in the range min <= i <= max. # # randrangeseq(i, j) # generates the integers from i to j in random order. # # # randseq(seed) generates the values of &random, starting at seed, # that occur as the result of using ?x. # # rng(a, c, m, x) generates a sequence of numbers using the linear # congruence method. With appropriate parameters, the # result is a pseudo-random sequence. The default # values produce the sequence used in Icon. # # shuffle(x) shuffles the elements of x # ############################################################################ # # Links: factors # ############################################################################ link factors global random procedure rand_num(a_, c_, m_) #: random number generator static random_last, a, c, m initial { /random := 0 a := \a_ | 1103515245 c := \c_ | 453816694 m := (\m_ | 2 ^ 31) } return random := (a * random + c) % m end procedure rand_int(i) #: model ?i static scale initial scale := 1.0 / (2 ^ 31 - 1) (i := (0 < integer(i))) | runerr(205, i) return integer(i * rand_num() * scale) + 1 end procedure randomize() #: randomize local f, s static ncalls initial ncalls := 0 ncalls +:= 1 if f := open("/dev/urandom", "ru") then { s := reads(f, 3) close(f) if *\s > 0 then { &random := ncalls % 113 every &random := 256 * &random + ord(!s) return } } &random := map("sSmMhH", "Hh:Mm:Ss", &clock) + map("YyXxMmDd", "YyXx/Mm/Dd", &date) + &time + 1009 * ncalls return end procedure randrange(min, max) #: random number in range return min - 1 + ?(max - min + 1) end procedure randrangeseq(i, j) #: random sequence in range local x, m, a, c, n n := j - i + 1 if n < 0 then fail x := 1 m := nxtprime(n) a := m + 1 c := nxtprime(m) every 1 to m do { x := (a * x + c) % m if x < n then { # discard out-of-range values suspend x + i } } end procedure randseq(seed) #: generate &random suspend &random := seed suspend |?1 & &random end procedure rng(a, c, m, x) #: random number generator /a := 1103515245 # multiplicative constant /c := 453816694 # additive constant /m := 2 ^ 31 - 1 # modulus /x := 0 # initial value suspend x suspend x := iand(a * |x + c, m) end # The procedure shuffle(x) shuffles a string, list, or record. # In the case that x is a string, a corresponding string with the # characters randomly rearranged is produced. In the case that x is # list or records the elements are randomly rearranged. procedure shuffle(x) #: shuffle local i x := string(x) # may fail every i := *x to 2 by -1 do x[?i] :=: x[i] return x end # Note: the following procedure is simpler, but does not produce # as good a shuffle: # #procedure shuffle(x) # x := string(x) # every !x :=: ?x # return x #end icon-9.4.3/ipl/procs/cartog.icn0000664000175000017500000003343007624775101015703 0ustar chrishchrish############################################################################ # # File: cartog.icn # # Subject: Procedures for cartographic projection # # Authors: Gregg M. Townsend and William S. Evans # # Date: February 19, 2003 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # These procedures project geographic coordinates. # # rectp(x1, y1, x2, y2, xm, ym) defines a rectangular projection. # pptrans(L1, L2) defines a planar projective transformation. # utm(a, f) defines a latitude/longitude to UTM projection. # # project(p, L) projects a list of coordinates. # invp(p) returns the inverse of projection p. # compose(p1, p2, ...) creates a composite projection. # ############################################################################ # # rectp(x1, y1, x2, y2, xm, ym) returns a rectangular projection # in which the point (x1, y1) maps to (x2, y2). If xm is specified, # distances in the projected coordinate system are scaled by xm. If # ym is also specified, xm scales x values while ym scales y values. # ############################################################################ # # pptrans(L1, L2) returns a planar projective transform that maps # the four points in L1 to the four points in L2. Each of the two # lists contains 8 coordinates: [x1, y1, x2, y2, x3, y3, x4, y4]. # ############################################################################ # # utm(a, f) returns a projection from latitude and longitude to # Universal Transverse Mercator (UTM) representation. The reference # ellipsoid is specified by a, the equatorial radius in metres, and f, # the flattening. Alternatively, f can be omitted with a specifying # a string, such as "Clarke66"; if a is also omitted, "WGS84" is used. # See ellipsoid() in geodat.icn for the list of possible strings. # # The input list contains signed numeric values: longitude and # latitude, in degrees, in that order (x before y). The output list # contains triples: an integer zone number followed by real-valued # UTM x and y distances in metres. No "false easting" is applied. # # UTM conversions are valid between latitudes 72S and 84N, except # for those portions of Norway where the UTM grid is irregular. # ############################################################################ # # project(p, L) applies a projection, reading a list of coordinates # and returning a new list of transformed coordinates. # ############################################################################ # # invp(p) returns the inverse of projection p, or fails if no # inverse projection is available. # ############################################################################ # # compose(p1, p2, ..., pn) returns the projection that is the # composition of the projections p1, p2, ..., pn. The composition # applies pn first. # ############################################################################ # # sbsize(p, x, y, u, maxl) calculates a scale bar size for use with # projection p at input coordinates (x, y). Given u, the size of # an unprojected convenient unit (meter, foot, mile, etc.) at (x, y), # sbsize() returns the maximum "round number" N such that # -- N is of the form i * 10 ^ k for i in {1,2,3,4,5} # -- the projected length of the segment (x, y, x + N * u, y) # does not exceed maxl # ############################################################################ # # UTM conversion algorithms are based on: # # Map Projections: A Working Manual # John P. Snyder # U.S. Geological Survey Professional Paper 1395 # Washington: Superintendent of Documents, 1987 # # Planar projective transformation calculations come from: # # Computing Plane Projective Transformations (Method 1) # Andrew Zisserman, Robotics Research Group, Oxford # in CVOnline (R. Fisher, ed.), found 22 February 2000 at: # http://www.dai.ed.ac.uk/CVonline/LOCAL_COPIES/EPSRC_SSAZ/node11.html # ############################################################################ # # Links: geodat, io, lu, numbers, strings # ############################################################################ link geodat link io link lu link numbers link strings # Procedures and globals named with a "ctg_" prefix are # not intended for access outside this file. global ctg_eps_ptab # table of [axis, flatng], keyed by eps name #################### General Projection Support #################### # project(p, L) projects a list of coordinates, returning a new list. procedure project(p, L) #: project a list of coordinates return p.proj(p, L) end # invp(p) returns the inverse of projection p. procedure invp(p) #: return inversion of projection return (\p.inv)(p) end # sbsize(p, x, y, u, maxl) -- calculate scalebar size procedure sbsize(p, x, y, u, maxl) #: calculate scalebar size local d, i, m, r m := 1 repeat { r := project(p, [x, y, x + m * u, y]) d := r[3] - r[1] if d > maxl then m := m / 10.0 else if d * 10 >= maxl then break else m := m * 10 } if maxl >= d * (i := 5 | 4 | 3 | 2) then m *:= i return m end #################### Rectangular Projection #################### record ctg_rect( # rectangular projection record proj, # projection procedure inv, # inversion procedure xmul, # x multiplier ymul, # y multiplier xadd, # x additive factor yadd # y additive factor ) # rectp(x1, y1, x2, y2, xm, ym) -- define rectangular projection procedure rectp(x1, y1, x2, y2, xm, ym) #: define rectangular projection local p /xm := 1.0 /ym := xm p := ctg_rect() p.proj := ctg_rect_proj p.inv := ctg_rect_inv p.xmul := real(xm) p.ymul := real(ym) p.xadd := x2 - x1 * xm p.yadd := y2 - y1 * ym return p end # ctg_rect_proj(p, L) -- project using rectangular projection procedure ctg_rect_proj(p, L) local i, a, xmul, ymul, xadd, yadd a := list() xmul := p.xmul ymul := p.ymul xadd := p.xadd yadd := p.yadd every i := 1 to *L by 2 do { put(a, xmul * L[i] + xadd) put(a, ymul * L[i+1] + yadd) } return a end # ctg_rect_inv(p) -- invert rectangular projection procedure ctg_rect_inv(p) local q q := copy(p) q.xmul := 1.0 / p.xmul q.ymul := 1.0 / p.ymul q.xadd := -p.xadd / p.xmul q.yadd := -p.yadd / p.ymul return q end ################ Planar Projective Transformation ############### record ctg_ppt( # planar projective transformation record proj, # projection procedure inv, # inversion procedure org, # origin points tgt, # target points h11, h12, h13, # transformation matrix: (x' y' 1) = H (x y 1) h21, h22, h23, h31, h32, h33 ) # pptrans(L1, L2) -- define planar projective transformation procedure pptrans(L1, L2) #: define planar projective transformation local p, M, I, B local x1, x2, x3, x4, y1, y2, y3, y4 local x1p, x2p, x3p, x4p, y1p, y2p, y3p, y4p *L1 = 8 | runerr(205, L1) *L2 = 8 | runerr(205, L2) p := ctg_ppt() p.proj := ctg_ppt_proj p.inv := ctg_ppt_inv p.org := copy(L1) p.tgt := copy(L2) B := copy(L1) every (x1 | y1 | x2 | y2 | x3 | y3 | x4 | y4) := get(B) B := copy(L2) every (x1p | y1p | x2p | y2p | x3p | y3p | x4p | y4p) := get(B) M := [ [ x1, y1, 1., 0., 0., 0., -x1p * x1, -x1p * y1], [ 0., 0., 0., x1, y1, 1., -y1p * x1, -y1p * y1], [ x2, y2, 1., 0., 0., 0., -x2p * x2, -x2p * y2], [ 0., 0., 0., x2, y2, 1., -y2p * x2, -y2p * y2], [ x3, y3, 1., 0., 0., 0., -x3p * x3, -x3p * y3], [ 0., 0., 0., x3, y3, 1., -y3p * x3, -y3p * y3], [ x4, y4, 1., 0., 0., 0., -x4p * x4, -x4p * y4], [ 0., 0., 0., x4, y4, 1., -y4p * x4, -y4p * y4] ] I := list(8) B := copy(L2) lu_decomp(M, I) | fail # if singular, fail lu_back_sub(M, I, B) every (p.h11 | p.h12 | p.h13 | p.h21 | p.h22 | p.h23 | p.h31 | p.h32) := get(B) p.h33 := 1.0 return p end # ctg_ppt_proj(p, L) -- project using planar projective transformation procedure ctg_ppt_proj(p, L) local a, i, x, y, d, h11, h12, h13, h21, h22, h23, h31, h32, h33 h11 := p.h11 h12 := p.h12 h13 := p.h13 h21 := p.h21 h22 := p.h22 h23 := p.h23 h31 := p.h31 h32 := p.h32 h33 := p.h33 a := list() every i := 1 to *L by 2 do { x := L[i] y := L[i+1] d := h31 * x + h32 * y + h33 put(a, (h11 * x + h12 * y + h13) / d, (h21 * x + h22 * y + h23) / d) } return a end # ctg_ppt_inv(p, L) -- invert planar projective transformation procedure ctg_ppt_inv(p) return pptrans(p.tgt, p.org) end ############### Universal Transverse Mercator Projection ############### # UTM conversion parameters $define k0 0.9996 # central meridian scaling factor for UTM $define M0 0.0 # M0 = 0 because y origin is at phi=0 record ctg_utm( # UTM projection record proj, # projection procedure inv, # inversion procedure a, # polar radius f, # flattening e, # eccentricity esq, # eccentricity squared epsq, # e prime squared c0, c2, c4, c6, c8 # other conversion constants ) # utm(a, f) -- define UTM projection procedure utm(a, f) #: define UTM projection local p, e, af p := ctg_utm() p.proj := ctg_utm_proj p.inv := ctg_utm_inv if /f then { af := ellipsoid(a) | fail a := af[1] f := af[2] } p.a := a # p.a = equatorial radius p.f := f # p.f = flattening p.esq := 2 * f - f ^ 2 # p.esq = eccentricity squared p.epsq := p.esq / (1 - p.esq) p.e := sqrt(p.esq) # p.e = eccentricity p.c0 := p.a * (1 - (p.e^2) / 4 - 3 * (p.e^4) / 64 - 5 * (p.e^6) / 256) p.c2 := p.a * (3 * (p.e^2) / 8 + 3 * (p.e^4) / 32 + 45 * (p.e^6) / 1024) p.c4 := p.a * (15 * (p.e^4) / 256 + 45 * (p.e^6) / 1024) p.c6 := p.a * (35 * (p.e^6) / 3072) return p end # ctg_utm_proj(p, L) -- project using UTM projection (Snyder, p61) procedure ctg_utm_proj(p, L) local ulist, epsq, lat, lon, zone, phi, lambda, lamzero, cosphi local i, N, T, C, A, M, x, u, y ulist := list() epsq := p.epsq every i := 1 to *L by 2 do { lon := numeric(L[i]) lat := numeric(L[i+1]) zone := (185 + integer(lon)) / 6 phi := dtor(lat) # latitude in radians lambda := dtor(lon) # longitude in radians lamzero := dtor(-183 + 6 * zone) # central meridian of zone N := p.a / sqrt(1 - p.esq * sin(phi) ^ 2) # (8-12) T := tan(phi) ^ 2 # (4-20) cosphi := cos(phi) C := epsq * cosphi ^ 2 # (8-13) A := (lambda - lamzero) * cosphi # (8-15) M := p.c0*phi - p.c2*sin(2.*phi) + p.c4*sin(4.*phi) - p.c6*sin(6.*phi) x := k0 * N * (A + (1 - T + C) * A^3 / 6. + (5. - 18. * T + T^2 + 72. * C - 58. * epsq) * A^5 / 120.) u := A^2 / 2 + (5 - T + 9 * C + 4 * C^2) * A^4 / 24 + (61. - 58. * T + T^2 + 600. * C - 330. * epsq) * A^6 / 720. y := k0 * (M - M0 + N * tan(phi) * u) put(ulist, zone, x, y) } return ulist end # ctg_utm_inv(p) -- invert UTM projection procedure ctg_utm_inv(p) local q, e, e1 q := copy(p) q.proj := ctg_iutm_proj q.inv := ctg_iutm_inv e := q.e e1 := (1 - sqrt(1 - e^2)) / (1 + sqrt(1 - e^2)) q.c0 := q.a * (1 - e^2 / 4. - 3. * e^4 / 64. - 5. * e^6 / 256.) q.c2 := 3. * e1 / 2. - 27. * e1^3 / 32. q.c4 := 21. * e1^2 / 16. - 55. * e1^4 / 32. q.c6 := 151. * e1^3 / 96. q.c8 := 1097. * e1^4 / 512. return q end # ctg_iutm_proj(p, L) -- project using inverse UTM projection (Snyder, p63) procedure ctg_iutm_proj(p, L) local a, esq, epsq local lllist, i, x, y, zone local lam0, mu, phi1, sin1, cos1, tan1, phi, lam, t1, t2, C1, T1, N1, R1, D a := p.a esq := p.esq epsq := p.epsq lllist := list() every i := 1 to *L by 3 do { zone := L[i] x := L[i + 1] y := L[i + 2] lam0 := dtor(-183 + 6 * zone) # central meridian of zone mu := y / (k0 * p.c0) phi1 := mu + p.c2 * sin(2. * mu) + p.c4 * sin(4. * mu) + p.c6 * sin(6. * mu) + p.c8 * sin(8. * mu) sin1 := sin(phi1) cos1 := cos(phi1) tan1 := tan(phi1) t1 := 1 - esq * sin1^2 t2 := sqrt(t1) C1 := epsq * cos1^2 T1 := tan1^2 N1 := a / t2 R1 := a * (1 - esq) / (t1 * t2) D := x / (N1 * k0) phi := phi1 - (N1 * tan1 / R1) * (D^2 / 2. - (5. + 3.*T1 + 10.*C1 - 4.*C1*C1 - 9.*epsq) * D^4 / 24. + (61. + 90.*T1 + 298.*C1 + 45.*T1*T1 - 252.*epsq - 3. * C1*C1) * D^6 / 720.) lam := lam0 + (D - (1 + 2 * T1 + C1) * D^3 / 6. + (5. - 2. * C1 + 28. * T1 - 3. * C1 * C1 + 8. * epsq + 24. * T1 * T1) * D^5 / 120.) / cos1 put(lllist, rtod(lam), rtod(phi)) } return lllist end # ctg_iutm_inv(p, L) -- invert inverse UTM projection procedure ctg_iutm_inv(p) return utm(p.a, p.f) end ################## Composing projections ############################# record ctg_comp( # composition of two projections proj, # projection procedure (always ctg_comp_proj) inv, # inverse (always ctg_comp_inv) projList # list of projections in composition, # first is applied first, etc. ) # compose -- produce a projection that applies the LAST projection # in a[] first, etc. procedure compose(a[]) #: define composite projection local q, r q := ctg_comp() q.proj := ctg_comp_proj q.inv := ctg_comp_inv q.projList := [] every r := !a do push(q.projList, r) return q end procedure ctg_comp_proj(p, L) local r every r := !(p.projList) do L := project(r, L) return L end procedure ctg_comp_inv(p) local q, r q := ctg_comp() q.proj := ctg_comp_proj q.inv := ctg_comp_inv q.projList := [] every r := !(p.projList) do push(q.projList, invp(r)) return q end icon-9.4.3/ipl/procs/intstr.icn0000664000175000017500000000176107140713036015741 0ustar chrishchrish############################################################################ # # File: intstr.icn # # Subject: Procedure to create string from bits # # Author: Robert J. Alexander # # Date: April 2, 1990 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # intstr() -- Creates a string consisting of the raw bits in the low # order "size" bytes of integer i. # # This procedure is normally used for processing of binary data # to be written to a file. # # Note that if large integers are supported, this procedure still # will not work for integers larger than the implementation defined # word size due to the shifting in of zero-bits from the left in the # right shift operation. # procedure intstr(i,size) local s s := "" every 1 to size do { s := char(iand(i,16rFF)) || s i := ishift(i,-8) } return s end icon-9.4.3/ipl/procs/lterps.icn0000664000175000017500000000157307424067416015741 0ustar chrishchrish############################################################################ # # File: lterps.icn # # Subject: Procedure to interpret L-system output # # Author: Ralph E. Griswold # # Date: September 30, 2001 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # Links: numbers # ############################################################################ link numbers procedure seqterp(s) #: interpret L-system output local c static incr, pos initial { incr := 1 pos := 0 } every c := !s do case c of { "F" : { pos +:= incr suspend pos } "f" : pos +:= incr "+" : incr := 1 "-" : incr := -1 } end icon-9.4.3/ipl/procs/escape.icn0000664000175000017500000000427707140713036015663 0ustar chrishchrish############################################################################ # # File: escape.icn # # Subject: Procedures to interpret Icon literal escapes # # Authors: William H. Mitchell # # Date: April 16, 1993 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # Contributors: Ralph E. Griswold and Alan Beale # ############################################################################ # # The procedure escape(s) produces a string in which Icon quoted # literal escape conventions in s are replaced by the corresponding # characters. For example, escape("\\143\\141\\164") produces the # string "cat". # ############################################################################ # # Links: ebcdic # ############################################################################ link ebcdic procedure escape(s) local ns, c ns := "" s ? { while ns ||:= tab(upto('\\')) do { move(1) ns ||:= case map(c := move(1)) | fail of { # trailing \ illegal "b": "\b" "d": "\d" "e": "\e" "f": "\f" "l": "\n" "n": "\n" "r": "\r" "t": "\t" "v": "\v" "x": hexcode() "^": ctrlcode() !"01234567": octcode() default: c # takes care of ", ', and \ } } return ns || tab(0) } end procedure hexcode() local i, s s := tab(many('0123456789ABCDEFabcdef')) | "" # get hex digits if (i := *s) > 2 then { # if too many digits, back off s := s[1:3] move(*s - i) } return char("16r" || s) end procedure octcode() local i, s move(-1) # put back first octal digit s := tab(many('01234567')) | "" # get octal digits i := *s if (i := *s) > 3 then { # back off if too large s := s[1:4] move(*s - i) } if s > 377 then { # still could be too large s := s[1:3] move(-1) } return char("8r" || s) end procedure ctrlcode(s) return Control(move(1)) end icon-9.4.3/ipl/procs/progary.icn0000664000175000017500000000140007140713037016070 0ustar chrishchrish############################################################################ # # File: progary.icn # # Subject: Procedure to place program in a array # # Author: Ralph E. Griswold # # Date: April 30, 1993 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # This procedure creates an array with one element for each program token. # The program is read from file. The initial value of each element is value. # ############################################################################ procedure progary(file, value) local A A := [] while put(A, list(*read(file), value)) return A end icon-9.4.3/ipl/procs/dif.icn0000664000175000017500000001632007140713036015155 0ustar chrishchrish############################################################################ # # File: dif.icn # # Subject: Procedure to check for differences # # Author: Robert J. Alexander # # Date: August 14, 1996 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # dif(stream, compare, eof, group) # generates a sequence of differences between an arbitrary # number of input streams. Each result is returned as a list # of diff_recs, one for each input stream, with each diff_rec # containing a list of items that differ and their position # in the input stream. # # The diff_rec type is declared as: # # record diff_rec(pos,diffs) # # dif() fails if there are no differences, i.e. it produces an empty # result sequence. # ############################################################################ # # For example, if two input streams are: # # a b c d e f g h # a b d e f i j # # the output sequence would be: # # [diff_rec(3,[c]),diff_rec(3,[])] # [diff_rec(7,[g,h]),diff_rec(6,[i,j]) # # The arguments to dif(stream,compare,eof,group) are: # # stream A list of data objects that represent input streams # from which dif will extract its input "records". # The elements can be of several different types which # result in different actions, as follows: # # Type Action # =========== ============================= # file file is "read" to get records # # co-expression co-expression is activated to # get records # # list records are "gotten" (get()) from # the list # # diff_proc a record type defined in "dif" to # allow a procedure (or procedures) # suppled by dif's caller to be called # to get records. Diff_proc has two # fields, the procedure to call and the # argument to call it with. Its # definition looks like this: # # record diff_proc(proc,arg) # # # Optional arguments: # # compare Item comparison procedure -- succeeds if # "equal", otherwise fails (default is the # identity "===" comparison). The comparison # must allow for the fact that the eof object # (see next) might be an argument, and a pair of # eofs must compare equal. # # eof An object that is distinguishable from other # objects in the stream. Default is &null. # # group A procedure that is called with the current number # of unmatched items as its argument. It must # return the number of matching items required # for file synchronization to occur. Default is # the formula Trunc((2.0 * Log(M)) + 2.0) where # M is the number of unmatched items. # ############################################################################ invocable all record diff_rec(pos,diffs) record diff_proc(proc,arg) record diff_file(stream,queue) procedure dif(stream,compare,eof,group) local f,linenbr,line,difflist,gf,i,j,k,l,m,n,x,test, result,synclist,nsyncs,syncpoint # # Provide default arguments and initialize data. # /compare := proc("===",2) /group := groupfactor f := [] every put(f,diff_file(!stream,[])) linenbr := list(*stream,0) line := list(*stream) test := list(*stream) difflist := list(*stream) every !difflist := [] # # Loop to process all records of all input streams. # repeat { # # This is the "idle loop" where we spin until we find a discrepancy # among the data streams. A line is read from each stream, with a # check for eof on all streams. Then the line from the first # stream is compared to the lines from all the others. # repeat { every i := 1 to *stream do line[i] := diffread(f[i]) | eof if not (every x := !line do (x === eof) | break) then break break every !linenbr +:= 1 if (every x := !line[2:0] do compare(x,line[1]) | break) then break } # # Aha! We have found a difference. Create a difference list, # one entry per stream, primed with the differing line we just found. # every i := 1 to *stream do difflist[i] := [line[i]] repeat { # # Add a new input line from each stream to the difference list. # Then build lists of the subset of different lines we need to # actually compare. # every i := 1 to *stream do put(difflist[i],diffread(f[i]) | eof) gf := group(*difflist[1]) every i := 1 to *stream do test[i] := difflist[i][-gf:0] # # Create a "synchronization matrix", with a row and column for # each input stream. The entries will be initially &null, then # will be set to the synchronization position if sync is # achieved between the two streams. Another list is created to # keep track of how many syncs have been achieved for each stream. # j := *difflist[1] - gf + 1 synclist := list(*stream) every !synclist := list(*stream) every k := 1 to *stream do synclist[k][k] := j nsyncs := list(*stream,1) # # Loop through positions to start comparing lines. This set of # nested loops will be exited when a stream achieves sync with # all other streams. # every i := 1 to j do { # # Loop through all streams. # every k := 1 to *stream do { # # Loop through all streams. # every l := 1 to *stream do { if /synclist[k][l] then { # avoid unnecessary comparisons # # Compare items of the test list to the differences list # at all possible positions. If they compare, store the # current position in the sync matrix and bump the count # of streams sync'd to this stream. If all streams are in # sync, exit all loops but the outer one. # m := i - 1 if not every n := 1 to gf do { if not compare(test[k][n],difflist[l][m +:= 1]) then break } then { synclist[k][l] := i # store current position if (nsyncs[k] +:= 1) = *stream then break break break break } } } } } } # # Prepare an output set. Since we have read the input streams past # the point of synchronization, we must queue those lines before their # input streams. # synclist := synclist[k] result := list(*stream) every i := 1 to *stream do { j := synclist[i] while difflist[i][j -:= 1] === eof # trim past eof result[i] := diff_rec(linenbr[i],difflist[i][1:j + 1]) f[i].queue := difflist[i][synclist[i] + gf:0] ||| f[i].queue linenbr[i] +:= synclist[i] + gf - 2 difflist[i] := [] } suspend result } end # # diffread() -- Read a line from an input stream. # procedure diffread(f) local x return get(f.queue) | case type(x := f.stream) of { "file" | "window": read(x) "co-expression": @x "diff_proc": x.proc(x.arg) "list": get(x) } end # # groupfactor() -- Determine how many like lines we need to close # off a group of differences. This is the default routine -- the # caller may provide his own. # procedure groupfactor(m) # Compute: Trunc((2.0 * Log(m)) + 2.0) m := string(m) return 2 * *m + if m <<= "316227766"[1+:*m] then 0 else 1 end icon-9.4.3/ipl/procs/options.icn0000664000175000017500000001460407140717301016110 0ustar chrishchrish############################################################################ # # File: options.icn # # Subject: Procedure to get command-line options # # Authors: Robert J. Alexander and Gregg M. Townsend # # Date: May 5, 2000 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # options(arg, optstring,errproc) removes command options from the # argument list of an Icon main procedure, returning a table of # option values. # ############################################################################ # # options(arg,optstring,errproc) -- Get command line options. # # This procedure separates and interprets command options included in # the main program argument list. Option names and values are removed # from the argument list and returned in a table. # # On the command line, options are introduced by a "-" character. An # option name is either a single printable character, as in "-n" or "-?", # or a string of letters, numbers, and underscores, as in "-geometry". # Valueless single-character options may appear in combination, for # example as "-qtv". # # Some options require values. Generally, the option name is one # argument and the value appears as the next argument, for example # "-F file.txt". However, with a single-character argument name # (as in that example), the value may be concatenated: "-Ffile.txt" # is accepted as equivalent. # # Options may be freely interspersed with non-option arguments. # An argument of "-" is treated as a non-option. The special argument # "--" terminates option processing. Non-option arguments are returned # in the original argument list for interpretation by the caller. # # An argument of the form @filename (a "@" immediately followed # by a file name) causes options() to replace that argument with # arguments retrieved from the file "filename". Each line of the file # is taken as a separate argument, exactly as it appears in the file. # Arguments beginning with - are processed as options, and those # starting with @ are processed as nested argument files. An argument # of "--" causes all remaining arguments IN THAT FILE ONLY to be # treated as non-options (including @filename arguments). # # The parameters of options(arg,optstring,errproc) are: # # arg the argument list as passed to the main procedure. # # optstring a string specifying the allowable options. This is # a concatenation, with optional spaces between, of # one or more option specs of the form # -name% # where # - introduces the option # name is either a string of alphanumerics # (any of a-z, A-Z, 0-9, and _) # or any single printable character # % is one of the following flag characters: # ! No value is required or allowed # : A string value is required # + An integer value is required # . A real value is required # # The leading "-" may be omitted for a single-character # option. The "!" flag may be omitted except when # needed to terminate a multi-character name. # Thus, the following optstrings are equivalent: # "-n+ -t -v -q -F: -geometry: -silent" # "n+tvqF:-geometry:-silent" # "-silent!n+tvqF:-geometry:" # # If "optstring" is omitted any single letter is # assumed to be valid and require no data. # # errproc a procedure which will be called if an error is # is detected in the command line options. The # procedure is called with one argument: a string # describing the error that occurred. After errproc() # is called, options() immediately returns the outcome # of errproc(), without processing further arguments. # Already processed arguments will have been removed # from "arg". If "errproc" is omitted, stop() is # called if an error is detected. # # A table is returned containing the options that were specified. # The keys are the specified option names. The assigned values are the # data values following the options converted to the specified type. # A value of 1 is stored for options that accept no values. # The table's default value is &null. # # Upon return, the option arguments are removed from arg, leaving # only the non-option arguments. # ############################################################################ procedure options(arg,optstring,errproc) local f,fList,fileArg,fn,ignore,optname,opttable,opttype,p,x,option,optcs # # Initialize. # /optstring := string(&letters) /errproc := stop option := table() fList := [] opttable := table() optcs := &lcase ++ &ucase ++ &digits ++ '_' # # Scan the option specification string. # optstring ? { while optname := move(1) do { if optname == " " then next if optname == "-" then optname := tab(many(optcs)) | move(1) | break opttype := tab(any('!:+.')) | "!" opttable[optname] := opttype } } # # Iterate over program invocation argument words. # while x := get(arg) do { if /x then ignore := &null # if end of args from file, stop ignoring else x ? { if ="-" & not pos(0) & /ignore then { if ="-" & pos(0) then ignore := 1 # ignore following args if -- else { tab(0) ? until pos(0) do { if opttype := \opttable[ optname := ((pos(1),tab(0)) | move(1))] then { option[optname] := if any(':+.',opttype) then { p := "" ~== tab(0) | get(arg) | return errproc( "No parameter following -" || optname) case opttype of { ":": p "+": integer(p) | return errproc("-" || optname || " needs numeric parameter") ".": real(p) | return errproc("-" || optname || " needs numeric parameter") } } else 1 } else return errproc("Unrecognized option: -" || optname) } } } # # If the argument begins with the character "@", fetch option # words from lines of a text file. # else if ="@" & not pos(0) & /ignore then { f := open(fn := tab(0)) | return errproc("Can't open " || fn) fileArg := [] while put(fileArg,read(f)) close(f) push(arg) # push null to signal end of args from file while push(arg,pull(fileArg)) } else put(fList,x) } } while push(arg,pull(fList)) return option end icon-9.4.3/ipl/procs/seqops.icn0000664000175000017500000007217307631301746015743 0ustar chrishchrish############################################################################ # # File: seqops.icn # # Subject: Procedures to manipulate T-sequences # # Author: Ralph E. Griswold # # Date: March 4, 2003 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # These procedures perform operations related to T-Sequences and to # analyze T-Sequences. # ############################################################################ # # Requires: Courage. # ############################################################################ # # copyl(xargs[]) copy list of lists # eval_tree(n) evaluate expression tree # expression_tree(n) create expression tree # fragment(s, i, p, arg) # get_analysis(s) analyze sequence # get_scollate(s) analyze for collation # get_splace(s) analyze for motif along a path # get_srepeat(s) analyze for repeat # get_srun(s) analyze for run # get_sruns(s) analyze for simple runs # is_scompact(x) test sequence for compactness # pimage(x) # remod(s, p) # sanalout() output analysis # sanalysis(x) over-all analysis # sbefriend(x, p) befriend sequence # sbinop(op, xargs[]) binary operation on terms # sbound(xargs[]) compute sequence upper bound FIX! # scollate(xargs[]) sequence collation # scompress(xargs[]) compact sequence # sconcat(xargs[]) concatenate sequences # sconcatp(xargs[]) concatenate sequences, pattern style # scpal(xargs[]) closed sequence palindrome # sdecimate(xargs[]) decimate sequence # sdecollate(order, x) decollate sequence # sdelta(x) get delta sequence # sdirection(x) "direction" of delta(x) # sequiv(x1, x2) test sequence equivalence # sextend(xargs[]) extend sequence # sflatten(x) flatten nested sequence # sground(s, i) ground sequence to i # shaft_period(x1, x2) shaft period # simage(x, limit) string image of sequence # sinit() initialize sequence operations # sintermix(xargs[]) intermix sequences # slayer(xargs[]) layer sequences # slength(x) compute sequence length # slocate(xargs[]) sequences of first positions of terms # smap(xargs[]) map terms in sequence # smin(xargs[]) compute sequence lower bound FIX # smissing(x) missing terms in sequence BOGUS?? # smod(xargs[]) modular reduction # smutate(xargs[]) mutation # snormal(x) normalize sequence # sopal(xargs[]) create open sequence palindrome # sorder(x) positions of first occurrence # sparity(xargs[]) adjust parity # speriod(s, i) sequence period # splace(xargs[]) place motif along a path # splaceg(xargs[]) generalized motifs along a path # splacep(xargs[]) place motif along a path # ssplitdupl(xargs[]) split duplicate adjacent terms # spositions(x1, x2) shaft positions # spromote(x) promote term to sequence # srandom(x) random selection # sreflecth(xargs[]) reflect sequence horizontally # sreflectr(xargs[]) # sreflectv(xargs[]) reflect sequence vertically # sremdupl(xargs[]) remove duplicate adjacent terms # srepeat(xargs[]) repeat sequence # srepl(xargs[]) replicate sequence terms # srotatev(xargs[]) rotate sequence vertically # srun(xargs[]) create connected run # sruns(xargs[]) create simple runs # sscale(xargs[]) scale terms in sequence # sscollate(xargs[]) collate entire sequences # sselect(xargs[]) select terms from sequence # sshift(x, i) shift terms sequence # sundulate(x) make undulating sequence # sunmod(x) modular expansion # sunop(op, xargs[]) unary operation on terms # walk_tree(n, tree_list, tree_ptrs, depth) # walk expression tree # ############################################################################ # # Links: factors, numbers # ############################################################################ link factors link numbers global expressions global node_gen global saltparity global scompact global sfliph global sflipv global sflipr global sflipl record node(name, seqlist) $define MaxTerms 300 procedure copyl(xargs[]) #: copy list of lists local new_xargs new_xargs := [] every put(new_xargs, copy(spromote(!xargs))) return new_xargs end procedure eval_tree(n) local i n := integer(n) if type(n) ~== "node" then return n every i := 1 to *n.seqlist do n.seqlist[i] := eval_tree(n.seqlist[i]) return n.name ! n.seqlist end procedure expression_tree(n) local result n := integer(n) case type(n) of { "list" | "integer" : return "[" || simage(n, MaxTerms) || "]" "string" : return n } result := n.name || "(" every result ||:= expression_tree(!n.seqlist) || "," return result[1:-1] || ")" end procedure fragment(s, i, p, arg) local results, j, k if *s <= i then return s /p := 1 results := list(i) every !results := [] k := 0 every j := 1 to i do every 1 to *s / i do put(results[j], s[k +:= 1]) | break break every j := 1 to i do results[j] := p(results[j], arg) every j := 1 to i do results[j] := fragment(results[j], i, p, arg) return results end $define MinLength 5 # minimum length for attempting analysis procedure get_analysis(seq) local expression if *seq < MinLength then return simageb(seq) expression := ( get_scollate(seq) | get_srepeat(seq) | remod(seq, get_srun) | # before sruns(), which would subsume it remod(seq, get_sruns) | get_splace(seq) | # would subsume some runs simageb(seq) ) return expression end procedure get_scollate(seq) #: find collation in sequence local bound, deltas, i, j, poses, positions, oper, seqs local results, result, k, count, oseq, m, nonperiod, facts, period bound := (sbound ! seq) speriod(seq) | fail # only handle periodic case deltas := table() positions := table() every i := 1 to bound do { poses := spositions(seq, i) positions[i] := poses j := sconstant(sdelta(poses)) | fail # CONTRADICTION /deltas[j] := [] put(deltas[j], i) } oseq := list(*seq, 1) # decollation order sequence count := 0 every k := key(deltas) do { count +:= 1 every j := !deltas[k] do every m := !positions[j] do oseq[m] := count } if *set(oseq) < 2 then fail # not enough sequences # oseq := srun([1, get(facts)]) | fail seqs := sdecollate(oseq, seq) | fail oper := "scollate(" || (simageb(oseq[1+:speriod(oseq)]) | get_analysis(oseq)) every oper ||:= ", " || get_analysis(!seqs) return oper || ")" end procedure get_splace(seq) #: find motif along a path in sequence local i, j, motif, seq2, path if i := sconstant(seq) then return "srepeat(" || i || "," || *seq || ")" every i := divisors(*seq) do { motif := seq[1+:i] every j := i + 1 to *seq by i do if not sequiv(motif, sground(seq[j+:i], seq[1])) then break next path := [] every put(path, seq[1 to *seq by i]) return "splace(" || get_analysis(motif) || ", " || get_analysis(path) || ")" } fail end procedure get_srepeat(seq) #: find repeat in sequence local i i := speriod(seq) | fail return "srepeat(" || get_analysis(seq[1+:i]) || ", " || (*seq / i) || ")" end procedure get_srun(seq) local i, j, new_seq, dir seq := copy(seq) i := get(seq) j := get(seq) if j = i - 1 then dir := -1 # down going else if j = i + 1 then dir := 1 # upgoing else fail new_seq := [i] while i := get(seq) do { if i = j + 1 then { if dir = -1 then put(new_seq, j) dir := 1 } else if i = j - 1 then { if dir = 1 then put(new_seq, j) dir := -1 } else { put(new_seq, j) push(seq, i) # put back non-continuing value break } j := i } if *seq ~= 0 then fail put(new_seq, j) return "srun(" || get_analysis(new_seq) || ")" end procedure get_sruns(seq) local i, j, seq1, seq2, dir seq1 := [] seq2 := [] repeat { i := get(seq) | { put(seq2, j) break # end of road } j := get(seq) | fail # isolated end point if j = i - 1 then dir := -1 # down going else if j = i + 1 then dir := 1 # up going else fail put(seq1, i) # beginning point while i := get(seq) do { if i = j + dir then { j := i next } else { push(seq, i) # put back next value put(seq2, j) break } } } return "sruns(" || get_analysis(seq1) || ", " || get_analysis(seq2) || ")" end procedure is_scompact(x) #: test sequence for compactness local bound x := spromote(x) bound := sbound ! x if bound = *set(x) then return bound else fail end procedure pimage(s) # DOES THIS BELONG HERE? local result, x result := "" every x := !s do { if integer(x) then result ||:= x else result ||:= pimage(x) result ||:= "," } return "[" || result[1:-1] || "]" end procedure remod(seq, p) #: handle modulus local nseq, bound nseq := sunmod(seq) if (sbound ! nseq) > (bound := sbound ! seq) then return "smod(" || p(nseq) || ", " || bound || ")" else return p(copy(seq)) end procedure sanalout() local expression, var write("link seqops") write("procedure main()") expressions := sort(expressions, 4) while expression := get(expressions) do write(var := get(expressions), " := ", expression) write("every write(!", var, ")") write("end") expressions := table() return end procedure sanalysis(x) # sanalyze(x) sanalout() return end procedure sbinop(op, xargs[]) #: binary operation on terms local lseq, i, x1, x2 x1 := spromote(xargs[1]) x2 := spromote(xargs[2]) op := proc(op, 2) | fail lseq := [] every i := 1 to smin(*x1, *x2) do put(lseq, op(x1[i], x2[i])) return lseq end procedure sbound(xargs[]) #: compute sequence upper bound FIX! return sort(xargs)[-1] end procedure scollate(xargs[]) #: sequence term collation local lseq, i, order if \node_gen then return node("scollate", xargs) order := get(xargs) /order := srun(1, *xargs) xargs := copyl ! xargs lseq := [] while i := get(order) do { put(order, i) put(lseq, get(xargs[i])) | break } put(lseq, get(xargs[get(order)])) # ????? return lseq end procedure scompress(xargs[]) #: compact sequence local unique, target, x if \node_gen then return node("compress", xargs) x := spromote(xargs[1]) unique := set(x) target := [] every put(target, 1 to *unique) return smap(x, sort(unique), target) end procedure sconcat(xargs[]) #: concatenate sequences local lseq if \node_gen then return node("sconcat", xargs) lseq := [] every lseq |||:= spromote(!xargs) return lseq end procedure sconcatp(xargs[]) #: concatenate sequences as pattern local lseq, nseq if \node_gen then return node("sconcat", xargs) lseq := [] every nseq := spromote(!xargs) do { if nseq[1] === lseq[-1] then get(nseq) lseq |||:= nseq } return lseq end procedure sconstant(seq) #: test for constant sequence if *set(seq) = 1 then return !seq else fail end procedure scpal(xargs[]) #: closed sequence palindrome local lseq, x1, x2, i if \node_gen then return node("scpal", xargs) x1 := spromote(xargs[1]) x2 := spromote(xargs[2]) | [1] i := 0 every i +:= !x2 lseq := srepeat(sopal(x1), i) put(lseq, lseq[1]) return lseq end procedure sdecimate(xargs[]) #: decimate sequence local lseq, j, k, x1, x2 x1 := spromote(xargs[1]) x2 := sort(spromote(xargs[2])) lseq := [] k := 1 while j := get(x2) do { every put(lseq, x1[k to j - 1]) k := j + 1 } every put(lseq, x1[j + 1 to *x1]) return lseq end procedure sdecollate(order, x) #: sequence decollation local lseq, i, j x := spromote(x) if *x = 0 then fail order := copy(order) lseq := list(sbound ! order) # list of lists to return every !lseq := [] # initially empty every j := !x do { i := get(order) | fail put(order, i) put(lseq[i], j) } return lseq end procedure sdelta(seq) #: sequence delta local i, lseq, j if *seq < 2 then fail seq := copy(seq) i := get(seq) lseq := [] while j := get(seq) do { put(lseq, j - i) i := j } return lseq end procedure sdirection(x) #: sequence delta "direction" local lseq, i x := sdelta(spromote(x)) | fail lseq := [] while i := get(x) do put(lseq, if i > 0 then 3 else if i = 0 then 2 else 1 ) return lseq end procedure sdistrib(x) local lseq, i x := copy(spromote(x)) lseq := list(sbound ! x, 0) while i := get(x) do lseq[i] +:= 1 return lseq end procedure sequiv(x1, x2) # test for sequence equivalence local i x1 := spromote(x1) x2 := spromote(x2) if *x1 ~= *x2 then fail every i := 1 to *x1 do if x1[i] ~= x2[i] then fail return x2 end procedure sextend(xargs[]) #: extend sequence local lseq, part, i, x1, x2 if \node_gen then return node("sextend", xargs) x1 := spromote(xargs[1]) lseq := [] every i := !spromote(xargs[2]) do { part := [] until *part >= i do part |||:= x1 lseq |||:= part[1+:i] } return lseq end procedure sflatten(s) # flatten packet sequence BELONGS HERE? local lseq, x lseq := [] every x := !s do if type(x) == "list" then lseq |||:= sflatten(x) else put(lseq, x) return lseq end procedure sground(seq, i) #: ground sequence to i local j /i := 1 j := smin ! seq every !seq -:= (j - i) return seq end procedure shaft_period(x1, x2) #: shaft period local results x1 := spromote(x1) x2 := spromote(x2) return sconstant(sdelta(spositions(x1, x2))) end procedure simage(x, limit) #: string image of sequence local str x := spromote(x) if *x = 0 then return "[]" /limit := 2 ^ 16 # good enough str:= "" every str ||:= (!x \ limit) || ", " if *x > limit then str ||:= "... " return str[1:-2] end procedure simageb(seq) #: bracketed sequence image if *seq = 1 then return seq[1] return "sconcat(" || simage(seq) || ")" end procedure sinit() #: initialize sequence operations saltparity := sparity scompact := scompress sfliph := sreflecth sflipv := sreflectv sflipr := sreflectr # sflipl := sreflectl return end procedure sintermix(xargs[]) #: sequence intermixing local lseq, i, order if \node_gen then return node("sintermix", xargs) order := get(xargs) /order := srun(1, *xargs) xargs := copyl ! xargs lseq := [] while i := get(order) do { put(order, i) lseq |||:= xargs[i] } return lseq end procedure slayer(xargs[]) #: layer sequences local new_xargs, i, shift if \node_gen then return node("slayer", xargs) new_xargs := [xargs[1], xargs[2]] | fail if not integer(xargs[2][1]) then return scollate ! xargs shift := sbound ! xargs[2] every i := 3 to *xargs do { put(new_xargs, sshift(xargs[i], shift)) shift +:= sbound ! xargs[i] } return scollate ! new_xargs end procedure slength(x) #: compute sequence length return *spromote(x) end procedure slocate(xargs[]) #: sequences of first positions of terms local count, i, lseq, x1, x2 if \node_gen then return node("slocate", xargs) x1 := copy(spromote(xargs[1])) x2 := set(spromote(xargs[2])) lseq := [] count := 0 while i := get(x1) do { count +:= 1 if member(x2, integer(i)) then return count } fail end procedure smap(xargs[]) #: map terms in sequence local i, smaptbl, x1, x2, x3 static tdefault initial tdefault := [] x1 := copy(spromote(xargs[1])) x2 := spromote(xargs[2]) x3 := spromote(xargs[3]) if *x2 ~= *x3 then fail smaptbl := table(tdefault) # mapping table every i := 1 to *x2 do # build the map smaptbl[x2[i]] := x3[i] every i := 1 to *x1 do # map the values x1[i] := (tdefault ~=== smaptbl[x1[i]]) return x1 end procedure smin(xargs[]) #: compute sequence lower bound FIX return sort(xargs)[1] end procedure smissing(x) #: missing terms in sequence BOGUS?? local lseq, i, result x := spromote(x) lseq := sorder(x) result := [] every i := 1 to *lseq do if lseq[i] = 0 then put(result, i) return result end procedure smod(xargs[]) #: modular reduction local lseq, i, x1, x2 if \node_gen then return node("smod", xargs) x1 := spromote(xargs[1]) x2 := spromote(xargs[2]) lseq := [] every i := !x2 do every put(lseq, residue(!x1, i, 1)) return lseq end procedure smutate(xargs[]) #: mutation local lseq, x1, x2 if \node_gen then return node("smutate", xargs) x1 := spromote(xargs[1]) x2 := spromote(xargs[2]) lseq := [] every put(lseq, x1[!x2]) return lseq end procedure snormal(x) #: normalize sequence local lseq, i, target, count # maps shafts so they are numbered in order # first appearance x := spromote(x) lseq := [] count := 0 target := table() every i := !x do { /target[i] := (count +:= 1) put(lseq, target[i]) } return lseq end procedure sopal(xargs[]) #: create open sequence palindrome local x if \node_gen then return node("sopal", xargs) x := spromote(xargs[1]) return x ||| sreflecth(x)[2:-1] end procedure sorder(x) #: positions of first occurrence local lseq, i, done # of terms in *compact* sequence x := copy(spromote(x)) lseq := [] done := set() while i := integer(get(x)) do { if member(done, i) then next else { put(lseq, i) insert(done, i) } } return lseq end procedure sparity(xargs[]) #: adjust parity local lseq, i, j, k, x1, x2 if \node_gen then return node("sparity", xargs) x1 := spromote(xargs[1]) x2 := spromote(xargs[2]) lseq := [] every i := 1 to *x1 do { j := x1[i] k := x2[i] if (j % 2) = (k % 2) then put(lseq, j) else put(lseq, j + 1, j) } return lseq end procedure speriod(seq, k) #: period of sequence local i, segment if /k then { # assume full repeats every i := 1 | divisors(*seq) do { # if repeats came out even segment := seq[1+:i] if sequiv(sextend(segment, *seq), seq) then return i } fail } else { # assume partial repeat at edge every i := 1 to *seq do { segment := seq[1+:i] if sequiv(sextend(segment, *seq), seq) then return i } fail # should not happen } end procedure splace(xargs[]) #: place motif along a path local lseq, i, x1, x2 if \node_gen then return node("splace", xargs) x1 := copy(spromote(xargs[1])) x2:= spromote(xargs[2]) lseq := [] every i := !x2 do every put(lseq, !x1 + i - 1) return lseq end procedure splacep(xargs[]) #: place motif along a path local lseq, i, x1, x2, j if \node_gen then return node("splace", xargs) x1 := copy(spromote(xargs[1])) x2:= spromote(xargs[2]) lseq := [] every i := !x2 do { j := x1[1] if j ~= lseq[-1] then put(lseq, j) every put(lseq, x1[2 to * x1] + i - 1) } return lseq end procedure splaceg(xargs[]) #: generalized motifs along a path local lseq, i, path, motif if \node_gen then return node("splaceg", xargs) path := copy(get(xargs)) xargs := copyl ! xargs lseq := [] while i := get(path) do { motif := get(xargs) put(xargs, motif) every put(lseq, !motif + i - 1) } return lseq end procedure spositions(x1, x2) #: positions of values in sequence local lseq, count, i x1 := copy(spromote(x1)) x2 := set(spromote(x2)) lseq := [] count := 0 while i := get(x1) do { count +:= 1 if member(x2, integer(i)) then put(lseq, count) } return lseq end procedure spromote(x) #: promote term to sequence if type(x) ~== "list" then x := [x] return x end procedure srandom(x) #: random selection return ?spromote(x) end procedure sreflecth(xargs[]) #: reflect sequence horizontally local lseq, x if \node_gen then return node("sreflecth", xargs) lseq := [] every push(lseq, !spromote(xargs[1])) return lseq end procedure sreflectr(xargs[]) local lseq, i, bound, x if \node_gen then return node("sreflectr", xargs) x := spromote(xargs[1]) bound := sbound ! x lseq := [] every i := !x do push(lseq, bound - i + 1) return lseq end procedure sreflectv(xargs[]) #: reflect sequence vertically local lseq, m, x if \node_gen then return node("sreflectv", xargs) x := spromote(xargs[1]) if not integer(x[1]) then return x m := sbound ! x lseq := [] every put(lseq, m - !x + 1) return lseq end procedure sremdupl(xargs[]) #: remove duplicate adjacent terms local lseq, i, x if \node_gen then return node("sremdupl", xargs) x := copy(spromote(xargs[1])) lseq := [get(x)] | return [] while i := get(x) do if lseq[-1] ~= i then put(lseq, i) return lseq end procedure ssplitdupl(xargs[]) #: split duplicate adjacent terms local lseq, i, x if \node_gen then return node("sremdupl", xargs) x := copy(spromote(xargs[1])) lseq := [get(x)] | return [] while i := get(x) do if lseq[-1] ~= i then put(lseq, i) else put(lseq, i + 1, i) return lseq end procedure srepeat(xargs[]) #: repeat sequence local lseq, count, x1, x2 if \node_gen then return node("srepeat", xargs) x1 := spromote(xargs[1]) count := 0 every count +:= !spromote(xargs[2]) lseq := copy(x1) every 2 to count do lseq |||:= x1 return lseq end procedure srepl(xargs[]) # replicate sequence terms local lseq, i, j, x1, x2 if \node_gen then return node("srepl", xargs) x1 := spromote(xargs[1]) x2 := spromote(xargs[2]) lseq := [] every i := !x2 do every j := !x1 do every 1 to i do put(lseq, j) return lseq end procedure srotatev(xargs[]) #: rotate sequence vertically local lseq, m, x if \node_gen then return node("srotatev", xargs) x := spromote(xargs[1]) if not integer(x[1]) then return x m := sbound ! x lseq := [] every put(lseq, residue(!x + 1, m, 1)) return lseq end procedure srun(xargs[]) #: create connected runs local lseq, i, j, x if \node_gen then return node("srun", xargs) x := copy(spromote(xargs[1])) lseq := [] i := get(x) | return lseq while j := get(x) do { lseq |||:= sruns(i, j, 1) pull(lseq) i := j } put(lseq, i) return lseq end procedure sruns(xargs[]) # disconnected runs local lseq, i, j, k, limit, x1, x2, x3 if \node_gen then return node("sruns", xargs) x1 := copy(spromote(xargs[1])) x2 := copy(spromote(xargs[2])) x3 := copy(spromote(xargs[3])) | [1] lseq := [] repeat { i := get(x1) | break j := get(x2) | break k := get(x3) | break put(x3, k) # cycle if integer(j) < integer(i) then k := -k every put(lseq, i to j by k) } return lseq end procedure sscale(xargs[]) #: scale terms in sequence local lseq, j, i, x1, x2 if \node_gen then return node("sscale", xargs) x1 := spromote(xargs[1]) lseq := [] every i := !spromote(xargs[2]) do every j := 1 to *x1 do put(lseq, (x1[j] - 1) * i + 1) return lseq end procedure sscollate(xargs[]) #: entire sequence collation local lseq, i, order if \node_gen then return node("sscollate", xargs) order := get(xargs) /order := srun(1, *xargs) xargs := copyl ! xargs lseq := [] while i := get(order) do lseq |||:= xargs[i] return lseq end procedure sselect(xargs[]) #: select terms from sequence local lseq, i, x1, x2 if \node_gen then return node("sselect", xargs) x1 := spromote(xargs[1]) x2 := copy(spromote(xargs[2])) lseq := [] while i := get(x2) do put(lseq, x1[i]) # may fail return lseq end procedure sshift(x, i) #: shift terms sequence local lseq lseq := [] every put(lseq, !spromote(x) + i) return lseq end procedure sundulate(x) #: make undulating sequence local lseq, i, dir x := copy(spromote(x)) lseq := [get(x)] | fail while i := get(x) | return lseq do { if i > lseq[-1] then { dir := -1 break } else if i < lseq[-1] then { dir := 1 break } } put(lseq, i) while i := get(x) do { if i < lseq[-1] then { if dir = -1 then { put(lseq, i) dir := 1 } else lseq[-1] := i } if i > lseq[-1] then { if dir = 1 then { put(lseq, i) dir := -1 } else lseq[-1] := i } } return lseq end procedure sunmod(x) #: modular expansion local base, bound, i, lseq, k x := copy(spromote(x)) if not integer(x[1]) then return x base := 0 bound := sbound ! x lseq := [get(x)] | fail while i := get(x) do { if (i = 1) & (lseq[-1] = base + bound) then base +:= bound else if (i = bound) & (lseq[-1] = base + 1) then base -:= bound put(lseq, base + i) } while (k := (smin ! lseq)) < 1 do every !lseq +:= bound return lseq end procedure sunop(op, xargs[]) #: unary operation on terms local lseq, i, x if \node_gen then return node("sunop", xargs) x := spromote(xargs[1]) op := proc(op, 1) | fail lseq := [] every i := 1 to *x do put(lseq, op(x[i])) return lseq end procedure walk_tree(n, tree_list, tree_ptrs, depth) local indent /tree_list := [] /tree_ptrs := [] /depth := 0 indent := repl(" ", 3 * depth) n := integer(n) case type(n) of { "integer" | "list" : { put(tree_list, indent || "[" || simage(n, MaxTerms) || "]") put(tree_ptrs, n) return [tree_list, tree_ptrs] } "string" : { put(tree_list, indent || n) put(tree_ptrs, n) return [tree_list, tree_ptrs] } } put(tree_list, indent || n.name) put(tree_ptrs, n) every walk_tree(!n.seqlist, tree_list, tree_ptrs, depth + 1) return [tree_list, tree_ptrs] end procedure sbefriend(x, way) #: make a sequence friendly local lseq, i, tail /way := connect x := copy(spromote(x)) put(x, x[1]) # for first-last friendliness lseq := [get(x)] | return [] while i := get(x) do lseq |||:= way(lseq[-1], i) pull(lseq) # remove added term return lseq end procedure connect(j, i) #: connect friends local k, result result := [] k := i - j if abs(k) = 1 then put(result, i) else if k = 0 then put(result, i + ?[1, -1], i) else if k > 0 then every put(result, j + 1 to i) else every put(result, j - 1 to i by -1) return result end procedure wander(j, i) #: friendly meander local result, k, incr result := [j] repeat { k := i - result[-1] if abs(k) = 1 then { put(result, i) break } incr := [1, -1] if k < 0 then every 1 to -k do put(incr, -1) else every put(incr, 1) put(result, result[-1] + ?incr) if result[-1] == i then break } if *result > 1 then get(result) return result end procedure sxplot(x) # plot sequence local plot, i, bound x := spromote(x) bound := sbound ! x plot := list(bound, repl(" ", *x)) every i := 1 to *x do plot[x[i]][ i] := "x" while write(pull(plot)) return end procedure sundelta(x) # get undulant from delta sequence local i x := spromote(x) every i := 2 to *x by 2 do # change sign of even-numbered terms x[i] := -x[i] return sredelta(x) end procedure sredelta(x) # reconstruct sequence from delta sequence local lseq x := spromote(x) lseq := [1] # nominal base while put(lseq, lseq[-1] + get(x)) return sground(lseq) # may have gone negative ... end procedure sreplp(x1, x2) local lseq, i x1 := spromote(x1) x2 := spromote(x2) lseq := [] while i := get(x1) do every 1 to get(x2) do put(lseq, i) return lseq end procedure sundulant(x, sw) # get undulant local lseq, i, dir, cdir x := spromote(x) lseq := [x[1]] | fail i := 2 repeat { dir := sign(x[i] - x[i - 1]) | fail if dir ~= 0 then break else i +:= 1 } every i := 2 to *x do { cdir := sign(x[i] - x[i - 1]) if cdir = 0 then next if dir ~= cdir then { put(lseq, x[i - 1]) dir := cdir } } if \sw & lseq[1] = lseq[-1] then pull(lseq) # repeating undulant if *lseq < 3 then fail # too short return lseq end icon-9.4.3/ipl/procs/stripunb.icn0000664000175000017500000000670107274062402016265 0ustar chrishchrish############################################################################ # # File: stripunb.icn # # Subject: Procedures to strip unbalanced material # # Author: Richard L. Goerwitz # # Date: May 2, 2001 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # Version: 1.7 # ############################################################################ # # This routine strips material from a line which is unbalanced with # respect to the characters defined in arguments 1 and 2 (unbalanced # being defined as bal() defines it, except that characters preceded # by a backslash are counted as regular characters, and are not taken # into account by the balancing algorithm). # # One little bit of weirdness I added in is a table argument. Put # simply, if you call stripunb() as follows, # # stripunb('<','>',s,&null,&null,t) # # and if t is a table having the form, # # key: "bold" value: outstr("\e[2m", "\e1m") # key: "underline" value: outstr("\e[4m", "\e1m") # etc. # # then every instance of "" in string s will be mapped to # "\e2m," and every instance of "" will be mapped to "\e[1m." # Values in table t must be records of type output(on, off). When # "" is encountered, stripunb will output the .off value for the # preceding .on string encountered. # ############################################################################ # # Links: scan # ############################################################################ link scan global last_k record outstr(on, off) procedure stripunb(c1,c2,s,i,j,t) # NB: Stripunb() returns a string - not an integer (like find, # upto). local lookinfor, bothcs, s2, k, new_s, c, compl #global last_k initial last_k := list() /c1 := '<' /c2 := '>' bothcs := c1 ++ c2 lookinfor := c1 ++ '\\' c := &cset -- c1 -- c2 /s := &subject if \i then { if i < 1 then i := *s + (i+1) } else i := \&pos | 1 if \j then { if j < 1 then j := *s + (j+1) } else j := *s + 1 s2 := "" s ? { while s2 ||:= tab(upto(lookinfor)) do { if ="\\" then { if not any(bothcs) then s2 ||:= "\\" &pos+1 > j & (return s2) s2 ||:= move(1) next } else { &pos > j & (return s2) any(c1) | stop("stripunb: Unbalanced string, pos(",&pos,").\n",s) if not (k := tab(&pos <= slashbal(c,c1,c2,&subject))) then { # If the last char on the line is the right-delim... if (.&subject[&pos:0]||" ") ? slashbal(c,c1,c2) # ...then, naturally, the rest of the line is the tag. then k := tab(0) else { # BUT, if it's not the right-delim, then we have a # tag split by a line break. Blasted things. return stripunb(c1,c2,&subject||read(&input), *.&subject,,t) | # Can't find the right delimiter. Parsing error. stop("stripunb: Incomplete tag\n",s[1:80] | s) } } # T is the maptable. if \t then { k ?:= 2(tab(any(c1)), tab(upto(c2)), move(1), pos(0)) if k ?:= (="/", tab(0)) then { compl:= pop(last_k) | stop("Incomplete tag, ",&subject) if k == "" then k := compl else k == compl | stop("Incorrectly paired tag,/tag.") s2 ||:= \(\t[k]).off } else { s2 ||:= \(\t[k]).on push(last_k, k) } } } } s2 ||:= tab(0) } return s2 end icon-9.4.3/ipl/procs/expander.icn0000664000175000017500000002130607274062401016222 0ustar chrishchrish############################################################################ # # File: expander.icn # # Subject: Procedures to convert character pattern expressions # # Author: Ralph E. Griswold # # Date: May 2, 2001 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # pfl2str(pattern) expands pattern-form expressions, which have the form # # [] # # to the corresponding string. # # The value of determines the operation to be performed. # # pfl2gxp(pattern) expands pattern-form expressions into generators # that, when compiled and evaluated, produce the corresponding # string. # # pfl2pwl(pattern) converts pattern-form expressions to Painter's # weaving language. # ###########################################################################n # # Links: strings, weaving # ############################################################################ link strings link weaving procedure pfl2str(pattern) #: pattern-form to plain string local result, expr1, expr2, op static operator, optbl initial { operator := '*-!|+,/~:?%<>#`' optbl := table() optbl["*"] := repl optbl["<"] := Upto optbl[">"] := Downto optbl["-"] := UpDown optbl["|"] := Palindrome # optbl["!"] := Palindroid optbl["+"] := Block optbl["~"] := Interleave optbl["->"] := Extend optbl[":"] := Template optbl["?"] := Permute optbl["%"] := Pbox optbl["<>"] := UpDown optbl["><"] := DownUp optbl["#"] := rotate optbl["`"] := reverse optbl[","] := proc("||", 2) } result := "" pattern ? { while result ||:= tab(upto('[')) do { move(1) # expr1 := pfl2str(tab(bal(operator, '[', ']'))) | return error("1", pattern) expr1 := pfl2str(tab(bal(operator, '[', ']'))) | { result ||:= pfl2str(tab(bal(']', '[', ']'))) move(1) next } op := tab(many(operator)) | return error("2", pattern) expr2 := pfl2str(tab(bal(']', '[', ']'))) | return error("3", pattern) result ||:= \optbl[op](expr1, expr2) | return error("4", pattern) move(1) } if not pos(0) then result ||:= tab(0) } return result end procedure pfl2pwl(pattern) #: pattern form to Painter expression local result, i, j, slist, s, expr1, expr2, op, head static operator, optbl initial { operator := '*-!|+,;/~:?%<>#`' optbl := table() optbl["*"] := "*" optbl["<"] := "<" optbl[">"] := ">" optbl["-"] := "-" optbl["|"] := "|" optbl["!"] := "!" # not supported in PWL optbl["+"] := "[]" optbl["->"] := "->" optbl["~"] := "~" optbl[":"] := ":" optbl["?"] := " perm " optbl["%"] := " pbox " optbl["<>"] := "<>" optbl["><"] := "><" optbl["#"] := "#" optbl["`"] := "`" optbl[","] := "," } result := "" pattern ? { while head := tab(upto('[')) do { if *head > 0 then result ||:= "," || head move(1) expr1 := pfl2pwl(tab(bal(operator, '[', ']'))) | return error() op := tab(many(operator)) | return error() expr2 := pfl2pwl(tab(bal(']', '[', ']'))) | return error() result ||:= "," || "(" || expr1 || \optbl[op] || expr2 || ")" | return error() move(1) } if not pos(0) then result ||:= "," || tab(0) } return result[2:0] end procedure error(expr1, expr2) write(&errout, "*** error ", expr1, " ", expr2) fail end procedure pfl2gxp(pattern, arg) #: pattern form to generating expression local result, i, j, slist, s, expr1, expr2, op static operator, optbl, argtbl initial { operator := ',.*-!|+;/~:?%<>#`' optbl := table() optbl["*"] := "Repl{" optbl["<"] := "Upto{" optbl[">"] := "Downto{" optbl["-"] := "UpDownto{" optbl["|"] := "TileMirror{" optbl["!"] := "Palin{" optbl["+"] := "Valrpt{" optbl["~"] := "Inter{" optbl["->"] := "ExtendSeq{" optbl["~"] := "Parallel{" optbl[":"] := "Template{" optbl["?"] := "Permut{" optbl["%"] := "Pbox{" optbl["<>"] := "UpDown{" optbl["><"] := "DownUp{" optbl["#"] := "Rotate{" optbl["`"] := "Reverse{" optbl["*"] := repl } /arg := str # Handling of literal arguments argtbl := table(str) argtbl["*"] := 1 argtbl["#"] := 1 argtbl["->"] := 1 if /pattern | (*pattern = 0) then return image("") result := "" pattern ? { while result ||:= arg(tab(upto('['))) do { move(1) expr1 := pfl2gxp(tab(bal(operator, '[', ']')), arg) | { result ||:= tab(bal(']', '[', ']')) || " | " # no operator move(1) next } if ="." then result ||:= tab(bal(']', '[', ']')) || " | " else { op := tab(many(operator)) | return error() expr2 := pfl2gxp(tab(bal(']', '[', ']')), argtbl[op]) | return error() result ||:= \optbl[op] || expr1 || "," || expr2 || ") | " | return error() } move(1) } if not pos(0) then result ||:= arg(tab(0)) } return trim(result, '| ') end procedure lit(s) return "!" || image(s) end procedure str(s) return lit(s) || " | " end procedure galt(s) return "Galt{" || collate(s, repl(",", *s - 1)) || "}" end procedure pwl2pfl(wexpr) #: Painter expression to pattern form return pwlcvt(prepare(wexpr)) end procedure prepare(wexpr) # preprocess pwl local inter, result static names, names1 initial { names := [ "", # expression placeholder " block ", "[]", " repeat ", "*", " rep ", "*", " extend ", "==", " ext ", "==", " concat ", ",", " interleave ", "~", " int ", "~", " upto ", ">", " downto ", "<", " template ", ":", " temp ", ":", " palindrome ", "|", " pal ", "|", " pal", "|", " permute ", "?", " perm ", "?", " pbox ", "%", " updown ", "<>", " downup ", "><", " rotate ", "#", " rot ", "#", " reverse ", "`", " rev ", "`", " rev", "`", ] names1 := [ "", # expression placeholder "pal", "|", "rev", "`" ] } result := "" wexpr ? { while result ||:= tab(upto('[')) do { move(1) inter := tab(bal(']')) if *inter > 0 then result ||:= spray(inter) else result ||:= "[]" move(1) } result ||:= tab(0) } if upto(result, ' ') then { if upto(result, &letters) then { names[1] := result result := (replacem ! names) } } if upto(result, &letters) then { names1[1] := result result := (replacem ! names1) } return deletec(map(result, "[]", "=="), ' ') end procedure pwlcvt(wexpr) local result, inter wexpr ?:= { 2(="(", tab(bal(')')), pos(-1)) } result := "" wexpr ? { while result ||:= form1(pwlcvt(tab(bal('|`', '([', ']('))), move(1)) result ||:= tab(0) } wexpr := result result := "" wexpr ? { while result ||:= form2(pwlcvt(tab(bal('->:#*=~', '([', ')]'))), =("#" | "*" | "->" | "~" | ":" | "=="), pwlcvt(tab(0))) result ||:= tab(0) } wexpr := result result := "" wexpr ? { while result ||:= form2(pwlcvt(tab(bal('<>', '([', ')]'))), =("><" | "<>"), pwlcvt(tab(0))) result ||:= tab(0) } wexpr := result result := "" wexpr ? { while result ||:= form2(pwlcvt(tab(bal('<->,', '([', ')]'))), =(">" | "<" | "-" | ","), pwlcvt(tab(0))) result ||:= tab(0) } return result end procedure form1(wexpr, op) return "[" || wexpr || op || "]" end procedure form2(wexpr1, op, wexpr2) return "[" || wexpr1 || op || wexpr2 || "]" end procedure spray(inter) local count, s1, s2, s3, colors s1 := s2 := s3 := "" inter ?:= { # only palindome and reflection allowed, it seems 1(tab(upto('|`') | 0), s3 := tab(0)) } inter ? { while s1 ||:= colors := tab(upto(' ')) do { tab(many(' ')) count := tab(upto(' ') | 0) if *count = 1 then s2 ||:= repl(count, *colors) else s2 ||:= repl("{" || count || "}", *colors) move(1) | break } } return "((" || s1 || s3 || ")" || "[]" || s2 || ")" end icon-9.4.3/ipl/procs/empgsup.icn0000664000175000017500000000155507140713037016100 0ustar chrishchrish############################################################################ # # File: empgsup.icn # # Subject: Procedure to support empg # # Author: Ralph E. Griswold # # Date: May 30, 1993 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # This procedure is called by timing programs produced by empg. It # a "delta" timing value used to adjust timings. # ############################################################################ procedure _Initialize(limit) local itime, t1, t3 itime := &time every 1 to limit do { &null } t1 := (&time - itime) itime := &time every 1 to limit do { &null & &null } t3 := (&time - itime) return (t1 + t3) / 2 end icon-9.4.3/ipl/procs/allof.icn0000664000175000017500000000700707140713036015512 0ustar chrishchrish############################################################################ # # File: allof.icn # # Subject: Procedure for conjunction control operation # # Author: Robert J. Alexander # # Date: April 28, 1990 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # allof{expr1,expr2} -- Control operation that performs iterative # conjunction. # # Iterative conjunction permits a conjunction expression to be built # at run time which supports full backtracking among the created terms # of the expression. The computed expression can be of arbitrary # length, and is built via an iterative loop in which one term is # appended to the expression (as if connected with a "&" operator) per # iteration. # # Expr1 works like the control expression of "every-do"; it controls # iteration by being resumed to produce all of its possible results. # The allof{} expression produces the outcome of conjunction of all of # the resulting instances of expr2. # # For example: # # global c # ... # pattern := "ab*" # "abcdef" ? { # allof { c := !pattern , # if c == "*" then move(0 to *&subject - &pos + 1) else =c # } & pos(0) # } # # This example will perform a wild card match on "abcdef" against # pattern "ab*", where "*" in a pattern matches 0 or more characters. # Since pos(0) will fail the first time it is evaluated, the allof{} # expression will be resumed just as a conjunction expression would, # and backtracking will propagate through all of the instances of # expr2; the expression will ultimately succeed (as its conjunctive # equivalent would). # # Note that, due to the scope of variables in co-expressions, # variables shared between expr1 and expr2 must have global scope, # hence c in the above example must be global. # # The allof{} procedure models Icon's expression evaluation # mechanism in that it explicitly performs backtracking. The author of # this procedure knows of no way to invoke Icon's built-in goal # directed evaluation to perform conjunction of a arbitrary number of # computed expressions (suggestions welcome). # ############################################################################ # # Requires: co-expressions # ############################################################################ procedure allof(expr) local elist,i,x,v # # Initialize # elist := [] # expression list i := 1 # expression list index # # Loop until backtracking over all expr[2]s has failed. # while i > 0 do { if not (x := elist[i]) then # # If we're at the end of the list of expressions, attempt an # iteration to produce another expression. # if @expr[1] then put(elist,x := ^expr[2]) else { # # If no further iterations, suspend a result. # suspend v # # We've been backed into -- reset to last expr[2]. # i -:= 1 } # # Evaluate the expression. # if v := @\x then { # # If success, move on to the refreshed next expression. # i +:= 1 elist[i] := ^elist[i] } else # # If failure, back up. # i -:= 1 } end icon-9.4.3/ipl/procs/weaving.icn0000664000175000017500000001135607140717301016056 0ustar chrishchrish############################################################################ # # File: weaving.icn # # Subject: Procedures to implement weaving expressions # # Author: Ralph E. Griswold # # Date: October 22, 1999 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # These procedures implement the weaving expressions supported by Painter # and described in the PDF document "Advanced Weaving" that accompanies # that application. # ############################################################################ # # Links: strings # ############################################################################ $define Domain "12345678" $define DomainForward "1234567812345678" $define DomainBackward "8765432187654321" procedure Between(p1, p2) DomainForward ? { tab(upto(p1[-1]) + 1) return tab(upto(p2[1])) } end procedure Block(p1, p2) #: weaving block local i, s, p3, counts if *p1 < *p2 then p1 := Extend(p1, *p2) | fail else if *p2 < *p1 then p2 := Extend(p2, *p1) | fail counts := [] p2 ? { while s := tab(upto('{')) do { every put(counts, !s) move(1) put(counts, tab(upto('}'))) move(1) } every put(counts, !tab(0)) } p3 := "" every i := 1 to *p1 do p3 ||:= repl(p1[i], counts[i]) return p3 end procedure DownRun(c1, c2) #: weaving downrun DomainBackward ? { tab(upto(c1)) return tab(upto(c2) + 1) } end # CYCLES WRONG procedure DownUp(p1, p2, cycles) #: weaving downup local i, p3 /cycles := 0 if *p1 < *p2 then p1 := Extend(p1, *p2) | fail else if *p2 < *p1 then p2 := Extend(p2, *p1) | fail p3 := p1[1] if cycles > 0 then { DomainForward ? { tab(upto(p1[-1]) + 1) p3 ||:= repl(move(8), cycles) } } every i := 1 to *p1 do { p3 ||:= DownRun(p1[i], p2[i])[2:0] p3 ||:= UpRun(p2[i], p1[i + 1])[2:0] # might fail } return p3 end procedure Downto(p1, p2, cycles) #: weaving downto local p3 p3 := p1 /cycles := 0 if cycles > 0 then { DomainBackward ? { tab(upto(p1[-1]) + 1) p3 ||:= repl(move(8), cycles) } } DomainBackward ? { tab(upto(p1[-1]) + 1) return p3 || tab(upto(p2[1])) || p2 } end procedure Extend(p, i) #: weaving extension if *p = 0 then fail i := integer(i) return case i of { *p > i : left(p, i) *p < i : left(repl(p, (i / *p) + 1), i) default : p } end procedure Interleave(p1, p2) #: weaving interleave local i, p3 if *p1 < *p2 then p1 := Extend(p1, *p2) | fail else if *p2 < *p1 then p2 := Extend(p2, *p1) | fail p3 := "" every i := 1 to *p1 do p3 ||:= p1[i] || p2[i] return p3 end procedure Palindrome(p) #: weaving palindrome if *p = 1 then return p else return p || reverse(p[2:-1]) end procedure Pbox(p1, p2) #: weaving pbox local p3, i if *p2 ~= *p1 then p2 := Extend(p2, *p1) | fail p3 := "" every i := !p1 do p3 ||:= p1[p2[i]] return p3 end procedure Permute(p1, p2) #: weaving permutation local p3, chunk, i, j j := *p1 % *p2 if j ~= 0 then p1 := Extend(p1, *p1 + *p2 - j) | fail p3 := "" p1 ? { while chunk := move(*p2) do every i := !p2 do p3 ||:= chunk[i] } return p3 end procedure Run(p, count) DomainForward ? { tab(upto(p[-1]) + 1) return repl(move(*Domain), count) } end procedure Template(p1, p2) #: weaving Template local p3, dlist, i, j, k dlist := [] every i := 1 to *p1 do put(dlist, p1[i] - p1[1]) p3 := "" every j := 1 to *dlist do every i := 1 to *p2 do { k := p2[i] + dlist[j] if k > 8 then k -:= 8 p3 ||:= k } return p3 end # CYCLES WRONG procedure UpDown(p1, p2, cycles) #: weaving updown local p3, i /cycles := 0 if *p1 < *p2 then p1 := Extend(p1, *p2) | fail else if *p2 < *p1 then p2 := Extend(p2, *p1) | fail p3 := p1[1] if cycles > 0 then { DomainForward ? { tab(upto(p1[-1]) + 1) p3 ||:= repl(move(8), cycles) } } every i := 1 to *p1 do { p3 ||:= UpRun(p1[i], p2[i])[2:0] p3 ||:= DownRun(p2[i], p1[i + 1])[2:0] # might fail } return p3 end procedure UpRun(c1, c2) #: weaving uprun DomainForward ? { tab(upto(c1)) return tab(upto(c2) + 1) } end procedure Upto(p1, p2, cycles) #: weaving upto local p3 /cycles := 0 p3 := p1 return p1 || Run(p1, cycles) || Between(p1, p2) || p2 end icon-9.4.3/ipl/procs/emptygen.icn0000664000175000017500000000740107140713037016244 0ustar chrishchrish############################################################################ # # File: emptygen.icn # # Subject: Procedures for meta-translation code generation # # Author: Ralph E. Griswold # # Date: December 5, 1995 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # This program is designed to be linked with the output of the meta- # translator. As given here, they produce an identity translation. # Modifications can be made to effect different translations. # # The procedures here are just wrappers. This file is a skeleton that # can be used as a basis for code-generation procedures. # ############################################################################ # # Bug: The invocable declaration is not handled properly. "invocable all" # will get by, but some other forms produce syntax errors. The # problem is in the meta-translator itself, not in this program. # ############################################################################ # # Links: strings # ############################################################################ link strings procedure main() Mp() # call meta-procedure end procedure Alt(e1, e2) # e1 | e2 end procedure Apply(e1, e2) # e1 ! e2 end procedure Arg(e) # procedure argument (parameter) end procedure Asgnop(op, e1, e2) # e1 op e2 end procedure Augscan(e1, e2) # e1 ?:= e2 end procedure Bamper(e1, e2) # e1 & e2 end procedure Binop(op, e1, e2) # e1 op e2 end procedure Body(es[]) # procedure body end procedure Break(e) # break e end procedure Case(e, clist) # case e of { caselist } end procedure Cclause(e1, e2) # e1 : e2 end procedure Clist(cclause1, cclause2) # cclause1 ; cclause2 end procedure Clit(c) # 'c' end procedure Compound(es[]) # { e1; e2; ... } end procedure Create(e) # create e end procedure Default(e) # default: e end procedure End() # end end procedure Every(e) # every e end procedure EveryDo(e1, e2) # every e1 do e2 end procedure Fail() # fail end procedure Field(e, f) # e . f end procedure Global(vs[]) # global v1, v2, ... end procedure If(e1, e2) # if e1 then e2 end procedure IfElse(e1, e2, e3) # if e1 then e2 else e3 end procedure Ilit(i) # i end procedure Initial(e) # initial e end procedure Invocable(ss[]) # invocable s1, s2, ... (problem) end procedure Invoke(e, es[]) # e(e1, e2, ...) end procedure Key(s) # &s end procedure Limit(e1, e2) # e1 \ e2 end procedure Link(vs[]) # link "v1, v2, ..." end procedure List(es[]) # [e1, e2, ... ] end procedure Local(vs[]) # local v1, v2, ... end procedure Next() # next end procedure Not(e) # not e end procedure Null() # &null end procedure Paren(es[]) # (e1, e2, ... ) end procedure Pdco(e, es[]) # e{e1, e2, ... } end procedure Proc(n, vs[]) # procedure n(v1, v2, ...) end procedure Record(n, fs[]) # record n(f1, f2, ...) end procedure Repeat(e) # repeat e end procedure Return(e) # return e end procedure Rlit(r) # r end procedure Scan(e1, e2) # e1 ? e2 end procedure Section(op, e1, e2, e3) # e1[e2 op e3] end procedure Slit(s) # "s" end procedure Static(vs[]) # static v1, v2, .. end procedure Subscript(e1, e2) # e1[e2] end procedure Suspend(e) # suspend e end procedure SuspendDo(e1, e2) # suspend e1 do e2 end procedure To(e1, e2) # e1 to e2 end procedure ToBy(e1, e2, e3) # e1 to e2 by e3 end procedure Repalt(e) # |e end procedure Unop(op, e) # op e end procedure Until(e) # until e end procedure UntilDo(e1, e2) # until e1 do e2 end procedure Var(v) # v end procedure While(e) # while e end procedure WhileDo(e1, e2) # while e1 do e2 end icon-9.4.3/ipl/procs/strip.icn0000664000175000017500000000161707140713037015560 0ustar chrishchrish############################################################################ # # File: strip.icn # # Subject: Procedure to strip characters from a string # # Author: Richard L. Goerwitz # # Date: June 3, 1991 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # Version: 1.1 # ############################################################################ # # strip(s,c) - strip characters c from string s # ############################################################################ procedure strip(s,c) # Return string s stripped of characters c. Succeed whether # any characters c were found in s or not. local s2 s2 := "" s ? { while s2 ||:= tab(upto(c)) do tab(many(c)) s2 ||:= tab(0) } return s2 end icon-9.4.3/ipl/procs/identity.icn0000664000175000017500000000146507140713036016250 0ustar chrishchrish############################################################################ # # File: identity.icn # # Subject: Procedures to produce identities for Icon types # # Author: Ralph E. Griswold # # Date: September 2, 1991 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # This procedure produces an "identity" value for types that have one. # ############################################################################ procedure identity(x) return case x of { "null": &null "integer": 0 "real": 0.0 "string": "" "cset": '' "list": [] "set": set() "table": table() default: fail } end icon-9.4.3/ipl/procs/tclass.icn0000664000175000017500000000137307140713037015707 0ustar chrishchrish############################################################################ # # File: tclass.icn # # Subject: Procedure to classify values as atomic or composite # # Author: Ralph E. Griswold # # Date: August 14, 1996 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # tclass(x) returns "atomic" or "composite" depending on the type of x. # ############################################################################ procedure tclass(x) return case type(x) of { "null" | "integer" | "real" | "string" | "cset": "atomic" default: "composite" } end icon-9.4.3/ipl/procs/namepfx.icn0000664000175000017500000000217707140713037016057 0ustar chrishchrish############################################################################ # # File: namepfx.icn # # Subject: Procedure to produce prefix portion of name # # Author: Ralph E. Griswold # # Date: September 2, 1991 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # Produces the "name prefix" from a name in standard form -- omitting # any title, but picking up the first name and any initials. # # There are a lot more titles that should be added to this list. # # Obviously, it can't always produce the "correct" result. # ############################################################################ # # Links: lastname, titleset # ############################################################################ link lastname, titleset procedure namepfx(s) static titles initial titles := titleset() s ?:= { # Get past title while =!titles do tab(many(' ')) # "Professor Doctor ... " tab(0) } s ?:= trim(tab(find(lastname(s)))) return s end icon-9.4.3/ipl/procs/usage.icn0000664000175000017500000000334007140713037015516 0ustar chrishchrish############################################################################ # # File: usage.icn # # Subject: Procedures for service functions # # Author: Ralph E. Griswold # # Date: July 19, 1991 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # These procedures provide various common services: # # Usage(s) stops executions with a message concerning the # expected form of usage of a program. # # Error(L[]) writes arguments to &errout and returns. # # # ErrorCheck(l,f) reports an error that has been converted to # failure. # # Feature(s) succeeds if feature s is available in the running # implementation of Icon. # # Requires(s) terminates execution is feature s is not available. # # Signature() writes the version, host, and features support in # the running implementation of Icon. # ############################################################################ procedure Usage(s) stop("Usage: ",s) end procedure Error(L[]) push(L,"*** ") push(L, &errout) write ! L end procedure ErrorCheck(line,file) if &errortext == "" then fail # No converted error write("\nError ",&errornumber," at line ",line, " in file ",file) write(&errortext) write("offending value: ",image(&errorvalue)) return end procedure Feature(s) if s == &features then return else fail end procedure Requires(s) if not(Feature(s)) then stop(s," required") end procedure Signature() write(&version) write(&host) every write(&features) end icon-9.4.3/ipl/procs/statemap.icn0000664000175000017500000000523607450115327016240 0ustar chrishchrish############################################################################ # # File: statemap.icn # # Subject: Procedure for table of states and abbreviations # # Author: Ralph E. Griswold # # Date: March 25, 2002 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # This procedure produces a "two-way" table to map state names (in # the postal sense) to their postal abbreviations and vice-versa. # # The list is done in two parts with auxiliary procedures so that this # procedure can be used with the default constant-table size for the # translator and linker. # ############################################################################ procedure statemap() local state_list, state_map, i state_map := table() every state_list := __list1() | __list2() do every i := 1 to *state_list - 1 by 2 do { insert(state_map, state_list[i], state_list[i + 1]) insert(state_map, state_list[i + 1], state_list[i]) } return state_map end procedure __list1() return [ "AK", "Alaska", "AL", "Alabama", "AR", "Arkansas", "AS", "American Samoa", "AZ", "Arizona", "CA", "California", "CO", "Colorado", "CT", "Connecticut", "DC", "District of Columbia", "DE", "Delaware", "FL", "Florida", "FM", "Federated States of Micronesia", "GA", "Georgia", "GU", "Guam", "HI", "Hawaii", "IA", "Iowa", "ID", "Idaho", "IL", "Illinois", "IN", "Indiana", "KS", "Kansas", "KY", "Kentucky", "LA", "Louisiana", "MA", "Massachusetts", "MD", "Maryland", "ME", "Maine", "MH", "Marshall Islands", "MI", "Michigan", "MN", "Minnesota" ] end procedure __list2() return [ "MO", "Missouri", "MP", "Northern Mariana Islands", "MS", "Mississippi", "MT", "Montana", "NC", "North Carolina", "ND", "North Dakota", "NE", "Nebraska", "NH", "New Hampshire", "NJ", "New Jersey", "NM", "New Mexico", "NV", "Nevada", "NY", "New York", "OH", "Ohio", "OK", "Oklahoma", "OR", "Oregon", "PA", "Pennsylvania", "PR", "Puerto Rico", "PW", "Palau", "RI", "Rhode Island", "SC", "South Carolina", "SD", "South Dakota", "TN", "Tennessee", "TX", "Texas", "UT", "Utah", "VA", "Virginia", "VT", "Vermont", "WA", "Washington", "WI", "Wisconsin", "WV", "West Virginia", "WY", "Wyoming" ] end icon-9.4.3/ipl/procs/scanset.icn0000664000175000017500000000405707140713037016060 0ustar chrishchrish############################################################################ # # File: scanset.icn # # Subject: Procedures setup for string scanning procedures # # Author: Robert J. Alexander # # Date: June 4, 1993 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # Procedure to set up for user-written string-scanning procedures that # are in the spirit of Icon's built-ins. # # The values passed are the s, i1, i2 parameters which are the last # three arguments to all Icon scanning functions (such as # upto(c,s,i1,i2)). scan_setup() supplies any appropriate defaults and # returns needed values. # # The value returned is a "scan_setup_result" record consisting of two # values: # # 1. The substring of s to be scanned (ss). # 2. The size of the substring of s that precedes the # substring to be scanned (offset). # # scan_setup() fails if i1 or i2 is out of range with respect to s. # # The user-written procedure can then match in the string ss to compute # the position within ss appropriate to the scan (p). The value # returned (or suspended) to the caller is p + offset (the position # within the original string, s). # # For example, the following function finds two words separated by # spaces: # # procedure two_words(s,i1,i2) # local x,p # x := scan_setup(s,i1,i2) | fail # fail if out of range # x.ss ? suspend { # tab(upto(&letters)) & # pos(1) | (move(-1) & tab(any(~&letters))) & # p := &pos & # remember starting position # tab(many(&letters)) & # tab(many(' ')) & # tab(many(&letters)) & # p + x.offset # return position in original s # } # end # record scan_setup_result( ss, # substring to be scanned offset) # length of substring preceding ss procedure scan_setup(s,i1,i2) if /s := &subject then /i1 := &pos else /i1 := 1 /i2 := 0 return scan_setup_result(s[i1:i2],match("",s,i1,i2) - 1) end icon-9.4.3/ipl/procs/pascltri.icn0000664000175000017500000000444107140713037016236 0ustar chrishchrish############################################################################ # # File: pascltri.icn # # Subject: Procedure to compute a row of Pascal's Triangle # # Author: Erik Eid # # Date: August 7, 1997 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # The procedure, when invoked by a call to PascalsTriangle(n), returns # the nth row of Pascal's Triangle in list form. Pascal's Triangle is a # mathematical structure in which each element of a row is the sum of the # two elements directly above it. The first few levels are: # # Row 1: 1 Triangle stored as: [[1], # 2: 1 1 [1, 1], # 3: 1 2 1 [1, 2, 1], # 4: 1 3 3 1 [1, 3, 3, 1], # 5: 1 4 6 4 1 [1, 4, 6, 4, 1]] # # For example, PascalsTriangle(4) would return the list [1, 3, 3, 1]. # # The procedure fails if n is not an integer or if it is less than one. # ############################################################################ procedure PascalsTriangle(level) #: Pascal triangle row static tri local row, elem, temp initial tri := [[1], [1, 1]] # Start with first two rows stored if not (level = integer(level)) then fail if level < 1 then fail if level > *tri then # If we haven't calculated this # row before, then do so and keep # it statically to prevent having # to do so again. every row := *tri+1 to level do { temp := [1] # First element of any row is 1. every elem := 2 to row-1 do # Each of the next elements is put (temp, tri[row-1][elem-1] + # the sum of the two above it. tri[row-1][elem]) put (temp, 1) # Last element of any row is 1. put (tri, temp) # Attach this row to the triangle. } return tri[level] # Return the chosen level. end icon-9.4.3/ipl/procs/gdl2.icn0000664000175000017500000002600607140713040015240 0ustar chrishchrish############################################################################ # # File: gdl2.icn # # Subject: Procedures to get directory lists # # Authors: Richard L. Goerwitz and Charles Shartsis # # Date: August 14, 1995 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # Version: 1.3+ # ############################################################################ # # Gdl returns a list containing everything in a directory (whose name # must be passed as an argument to gdl). Nothing fancy. I use this file # as a template, modifying the procedures according to the needs of the # program in which they are used. # # NOTE: MSDOS results are all in lower case # # Modifications: # 1) Fixed MSDOS routines. # 2) Added gdlrec which does same thing as gdl except it recursively descends # through subdirectories. May choose which Unix utility to use by passing # in method parameter. See below. # ############################################################################ # # Requires: UNIX or MS-DOS # ############################################################################ procedure gdl(dir) local getdir getdir := set_getdir_by_os() return getdir(dir) end procedure gdlrec(dir, method) # Unix method to use: &null for compatibility (uses "/bin/ls"), # not null for speed (uses "find") local getdir getdir := set_getdir_rec_by_os(method) return getdir(dir) end procedure set_getdir_by_os() # Decide how to get a directory, based on whether we are running # under Unix or MS-DOS. if find("UNIX", &features) then return unix_get_dir else if find("MS-DOS", &features) then return msdos_get_dir else stop("Your operating system is not (yet) supported.") end procedure set_getdir_rec_by_os(method) # Decide how to get a directory, based on whether we are running # under Unix or MS-DOS. if find("UNIX", &features) then { if /method then return unix_get_dir_rec else return unix_get_dir_rec2 } else if find("MS-DOS", &features) then return msdos_get_dir_rec else stop("Your operating system is not (yet) supported.") end procedure msdos_get_dir(dir) # Returns a sorted list of all filenames (full paths included) in # directory "dir." The list is sorted. Fails on invalid or empty # directory. Aborts if temp file cannot be opened. # # Temp files can be directed to one or another directory either by # manually setting the variable temp_dir below, or by setting the # value of the environment variable TEMPDIR to an appropriate # directory name. local in_dir, filename_list, line, temp_name, filename static temp_dir initial { temp_dir := (trim(map(getenv("TEMPDIR"), "/", "\\"), '\\') || "\\") | ".\\" } # Get name of tempfile to be used. temp_name := get_dos_tempname(temp_dir) | stop("No more available tempfile names!") ### Added by C. Shartsis 9/19/94 # Make implicit current directory explicit # Otherwise current and root directory get mapped to same thing if (dir == "") | (dir ? (tab(any(&letters)) & =":" & pos(0)) ) then dir ||:= "." # Make sure we have an unambiguous directory name, with backslashes # instead of Unix-like forward slashes. dir := trim(map(dir, "/", "\\"), '\\') ### Added by C. Shartsis 9/19/94 # Put backslash back on if dir is the root directory # Otherwise the current directory is returned if (dir == "") | (dir ? (tab(any(&letters)) & =":" & pos(0)) ) then dir ||:= "\\" # Put dir listing into a temp file. system("dir "||dir||" > "||temp_name) # Put tempfile entries into a list, removing blank- and # space-initial lines. Exclude directories (i.e. return file # names only). in_dir := open(temp_name,"r") | stop("Can't open temp file in directory ",temp_dir,".") filename_list := list() every filename := ("" ~== !in_dir) do { match(" ",filename) | find("

", filename) & next # Exclude our own tempfiles (may not always be appropriate). filename ?:= trim(trim(tab(10)) || "." || tab(13), '. ') ### Change: C. Shartsis - 4/9/95 # Exclude tempfile if filename ? ( ="ICONDIR." & tab(any(&digits)) & tab(any(&digits)) & tab(any(&digits)) ) then next ### Change: C. Shartsis - 9/19/94 # Otherwise file f in directory c:\d comes out as "c:\df" instead of "c:\d\f" #put(filename_list, map(dir || filename)) put(filename_list, map(trim(dir, '\\') || "\\" || filename)) } # Clean up. close(in_dir) & remove(temp_name) # Check to be sure we actually managed to read some files. if *filename_list = 0 then fail else return sort(filename_list) end procedure msdos_get_dir_rec(dir, level) # Returns a sorted list of all filenames (full paths included) in # directory "dir." The list is sorted. Fails on invalid or empty # directory. Aborts if temp file cannot be opened. # # Temp files can be directed to one or another directory either by # manually setting the variable temp_dir below, or by setting the # value of the environment variable TEMPDIR to an appropriate # directory name. local in_dir, line, filename, raw_list local tmp_filelist, tmp_dirlist static temp_dir, temp_name, filename_list initial { temp_dir := (trim(map(getenv("TEMPDIR"), "/", "\\"), '\\') || "\\") | ".\\" } # Establish recursion level /level := 0 if level = 0 then { filename_list := list() # Get name of tempfile to be used. temp_name := get_dos_tempname(temp_dir) | stop("No more available tempfile names!") } # Make implicit current directory explicit # Otherwise current and root directory get mapped to same thing if (dir == "") | (dir ? (tab(any(&letters)) & =":" & pos(0)) ) then dir ||:= "." # Make sure we have an unambiguous directory name, with backslashes # instead of Unix-like forward slashes. dir := trim(map(dir, "/", "\\"), '\\') # Put backslash back on if dir is the root directory # Otherwise the current directory is returned if (dir == "") | (dir ? (tab(any(&letters)) & =":" & pos(0)) ) then dir ||:= "\\" # Put dir listing into a temp file. system("dir "||dir||" > "||temp_name) # Put tempfile entries into a list, removing blank- and # space-initial lines. Exclude directories (i.e. return file # names only). in_dir := open(temp_name,"r") | stop("Can't open temp file in directory ",temp_dir,".") raw_list := [] every put(raw_list, !in_dir) # Clean up. close(in_dir) & remove(temp_name) tmp_dirlist := [] tmp_filelist := [] every filename := ("" ~== !raw_list) do { match(" ",filename) | match(".",filename) & next # Process Directories if find(" ", filename) then { filename ?:= tab(many(~' \t')) put(tmp_dirlist, map(trim(dir, '\\') || "\\" || filename)) } # Save files to list else { # extract the file name filename ?:= trim(trim(tab(10)) || "." || tab(13), '. ') # Exclude tempfile if not (filename ? ( ="ICONDIR." & tab(any(&digits)) & tab(any(&digits)) & tab(any(&digits)) )) then # Otherwise file f in directory c:\d comes out as "c:\df" instead of "c:\d\f" put(tmp_filelist, map(trim(dir, '\\') || "\\" || filename)) } } # Add files to master list every put(filename_list, !sort(tmp_filelist)) # Process remaining directories every msdos_get_dir_rec(!sort(tmp_dirlist), level + 1) # Check to be sure we actually managed to read some files. if level = 0 then { if *filename_list = 0 then fail else return filename_list } end procedure get_dos_tempname(dir) local temp_name, temp_file # Don't clobber existing files. Get a unique temp file name for # use as a temporary storage site. every temp_name := dir || "icondir." || right(string(1 to 999),3,"0") do { temp_file := open(temp_name,"r") | break close(temp_file) } return \temp_name end procedure unix_get_dir(dir) local filename_list, in_dir, filename dir := trim(dir, '/') || "/" filename_list := list() in_dir := open("/bin/ls -F "||dir, "pr") every filename := ("" ~== !in_dir) do { match("/",filename,*filename) & next put(filename_list, trim(dir || filename, '*')) } close(in_dir) if *filename_list = 0 then fail else return filename_list end procedure unix_get_dir_rec(dir, level) # Returns a sorted list of all filenames (full paths included) in # directory "dir." The list is sorted. Fails on invalid or empty # directory. Aborts if temp file cannot be opened. local in_dir, filename, raw_list, cmd local tmp_filelist, tmp_dirlist static filename_list # Establish recursion level /level := 0 if level = 0 then filename_list := list() # Append trailing slash dir := trim(dir, '/') || "/" # Put tempfile entries into a list, removing blank- and # space-initial lines. Exclude directories (i.e. return file # names only). cmd := "/bin/ls -FL " || dir in_dir := open(cmd,"pr") | stop(cmd, " will not run on this system") raw_list := [] every put(raw_list, !in_dir) # Clean up. close(in_dir) tmp_dirlist := [] tmp_filelist := [] every filename := ("" ~== !raw_list) do { if match(" ",filename) | match(".",filename) | filename[-1] == "=" then next if filename[-1] == "*" then filename := filename[1:-1] # Process Directories if filename[-1] == "/" then put(tmp_dirlist, dir || filename) # Save files to list else put(tmp_filelist, dir || filename) } # Add files to master list every put(filename_list, !sort(tmp_filelist)) # Process remaining directories every unix_get_dir_rec(!sort(tmp_dirlist), level + 1) # Check to be sure we actually managed to read some files. if level = 0 then { if *filename_list = 0 then fail else return filename_list } end # This works too. # This routine is faster but depends on the Unix "find" program. # Don't know if all Unixes have this. procedure unix_get_dir_rec2(dir) local filename_list, in_dir, cmd dir := trim(dir, '/') || "/" filename_list := list() cmd := "find " || dir || " -type f -print" in_dir := open(cmd, "pr") | stop(cmd, " will not run on this system") every put(filename_list, !in_dir) close(in_dir) if *filename_list = 0 then fail else return filename_list end icon-9.4.3/ipl/procs/codeobj.icn0000664000175000017500000001755707450115327016040 0ustar chrishchrish############################################################################ # # File: codeobj.icn # # Subject: Procedures to encode and decode Icon data # # Author: Ralph E. Griswold # # Date: March 25, 2002 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # These procedures provide a way of storing Icon values as strings and # retrieving them. The procedure encode(x) converts x to a string s that # can be converted back to x by decode(s). These procedures handle all # kinds of values, including structures of arbitrary complexity and even # loops. For "scalar" types -- null, integer, real, cset, and string -- # # decode(encode(x)) === x # # For structures types -- list, set, table, and record types -- # decode(encode(x)) is, for course, not identical to x, but it has the # same "shape" and its elements bear the same relation to the original # as if they were encoded and decode individually. # # No much can be done with files, functions and procedures, and # co-expressions except to preserve type and identification. # # The encoding of strings and csets handles all characters in a way # that it is safe to write the encoding to a file and read it back. # # No particular effort was made to use an encoding of value that # minimizes the length of the resulting string. Note, however, that # as of Version 7 of Icon, there are no limits on the length of strings # that can be written out or read in. # ############################################################################ # # The encoding of a value consists of four parts: a tag, a length, # a type code, and a string of the specified length that encodes the value # itself. # # The tag is omitted for scalar values that are self-defining. # For other values, the tag serves as a unique identification. If such a # value appears more than once, only its tag appears after the first encoding. # There is, therefore, a type code that distinguishes a label for a previously # encoded value from other encodings. Tags are strings of lowercase # letters. Since the tag is followed by a digit that starts the length, the # two can be distinguished. # # The length is simply the length of the encoded value that follows. # # The type codes consist of single letters taken from the first character # of the type name, with lower- and uppercase used to avoid ambiguities. # # Where a structure contains several elements, the encodings of the # elements are concatenated. Note that the form of the encoding contains # the information needed to separate consecutive elements. # # Here are some examples of values and their encodings: # # x encode(x) # ------------------------------------------------------- # # 1 "1i1" # 2.0 "3r2.0" # &null "0n" # "\377" "4s\\377" # '\376\377' "8c\\376\\377" # procedure main "a4pmain" # co-expression #1 (0) "b0C" # [] "c0L" # set() "d0S" # table("a") "e3T1sa" # L1 := ["hi","there"] "f11L2shi5sthere" # # A loop is illustrated by # # L2 := [] # put(L2,L2) # # for which # # x encode(x) # ------------------------------------------------------- # # L2 "g3L1lg" # # Of course, you don't have to know all this to use encode and decode. # ############################################################################ # # Links: escape, gener, procname, typecode # ############################################################################ # # Requires: co-expressions # ############################################################################ invocable all link escape, gener, procname, typecode global outlab, inlab record triple(type,value,tag) # Encode an arbitary value as a string. # procedure encode(x,level) local str, tag, Type static label initial label := create "l" || star(string(&lcase)) if /level then outlab := table() # table is global, but reset at # each root call. tag := "" Type := typecode(x) if Type == !"ri" then str := string(x) # first the scalars else if Type == !"cs" then str := image(string(x))[2:-1] # remove quotes else if Type == "n" then str := "" else if Type == !"LSRTfpC" then # next the structures and other types if str := \outlab[x] then # if the object has been processed, Type := "l" # use its label and type it as label. else { tag := outlab[x] := @label # else make a label for it. str := "" if Type == !"LSRT" then { # structures every str ||:= encode( # generate, recurse, and concatenate case Type of { !"LS": !x # elements "T": x[[]] | !sort(x,3) # default, then elements "R": type(x) | !x # type then elements } ,1) # indicate internal call } else str ||:= case Type of { # other things "f": image(x) "C": "" "p": procname(x) } } else stop("unsupported type in encode: ",image(x)) return tag || *str || Type || str end # Generate decoded results. At the top level, there is only one, # but for structures, it is called recursively and generates the # the decoded elements. # procedure decode(s,level) local p if /level then inlab := table() # global but reset every p := separ(s) do { suspend case p.type of { "l": inlab[p.value] # label for an object "i": integer(p.value) "s": escape(p.value) "c": cset(escape(p.value)) "r": real(p.value) "n": &null "L": delist(p.value,p.tag) "R": derecord(p.value,p.tag) "S": deset(p.value,p.tag) "T": detable(p.value,p.tag) "f": defile(p.value) "C": inlab[p.tag] := create &fail # can't hurt much to fail "p": inlab[p.tag] := (proc(p.value) | stop("encoded procedure not found")) \ 1 default: stop("unexpected type in decode: ",p.type) } } end # Generate triples for the encoded values in concatenation. # procedure separ(s) local p, size while *s ~= 0 do { p := triple() s ?:= { p.tag := tab(many(&lcase)) size := tab(many(&digits)) | break p.type := move(1) p.value := move(size) tab(0) } suspend p } end # Decode a list. The newly constructed list is added to the table that # relates tags to structure values. # procedure delist(s,tag) local a inlab[tag] := a := [] # insert object for label every put(a,decode(s,1)) return a end # Decode a set. Compare to delist above. # procedure deset(s,tag) local S inlab[tag] := S := set() every insert(S,decode(s,1)) return S end # Decode a record. # procedure derecord(s,tag) local R, e e := create decode(s,1) # note use of co-expressions to control # generation, since record must be constructed # before fields are produced. inlab[tag] := R := proc(@e)() | stop("error in decoding record") every !R := @e return R end # Decode a table. # procedure detable(s,tag) local t, e e := create decode(s,1) # see derecord above; here it's the default # value that motivates co-expressions. inlab[tag] := t := table(@e) while t[@e] := @e return t end # Decode a file. # procedure defile(s, tag) return inlab[tag] := case s of { # files aren't so simple ... "&input": &input "&output": &output "&errout": &errout default: s ? { ="file(" # open for reading to play it safe open(tab(upto(')'))) | stop("cannot open encoded file") } } end icon-9.4.3/ipl/procs/xcodes.icn0000664000175000017500000003073707140713037015711 0ustar chrishchrish############################################################################ # # File: xcodes.icn # # Subject: Procedures to save and restore Icon data # # Author: Bob Alexander # # Date: November 19, 1997 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # Contributor: Ralph E. Griswold # ############################################################################ # # Note: This version handles the encoding of records using canonical # names: record0, record1, ... . This allows programs to decode files # by providing declarations for these names when the original declarations # are not available. This version also provides for procedures and # files present in the encoded file that are not in the decoding program. # # This version should be merged with the ordinary version. # # Description # ----------- # # These procedures provide a way of storing Icon values in files # and retrieving them. The procedure xencode(x,f) stores x in file f # such that it can be converted back to x by xdecode(f). These # procedures handle several kinds of values, including structures of # arbitrary complexity and even loops. The following sequence will # output x and recreate it as y: # # f := open("xstore","w") # xencode(x,f) # close(f) # f := open("xstore") # y := xdecode(f) # close(f) # # For "scalar" types -- null, integer, real, cset, and string, the # above sequence will result in the relationship # # x === y # # For structured types -- list, set, table, and record types -- # y is, for course, not identical to x, but it has the same "shape" and # its elements bear the same relation to the original as if they were # encoded and decoded individually. # # Files, co-expressions, and windows cannot generally be restored in any # way that makes much sense. These objects are restored as empty lists so # that (1) they will be unique objects and (2) will likely generate # run-time errors if they are (probably erroneously) used in # computation. However, the special files &input, &output, and &errout are # restored. # # Not much can be done with functions and procedures, except to preserve # type and identification. # # The encoding of strings and csets handles all characters in a way # that it is safe to write the encoding to a file and read it back. # # xdecode() fails if given a file that is not in xcode format or it # the encoded file contains a record for which there is no declaration # in the program in which the decoding is done. Of course, if a record # is declared differently in the encoding and decoding programs, the # decoding may be bogus. # # xencoden() and xdecoden() perform the same operations, except # xencoden() and xdecoden() take the name of a file, not a file. # # xencodet() and xdecodet() are like xencode() and xdecode() # except that the trailing argument is a type name. If the encoded # decoded value is not of that type, they fail. xencodet() does # not take an opt argument. # ############################################################################ # # Complete calling sequences # -------------------------- # # xencode(x, f, p) # returns f # # where # # x is the object to encode # # f is the file to write (default &output) # # p is a procedure that writes a line on f using the # same interface as write() (the first parameter is # always a the value passed as "file") (default: write) # # # xencode(f, p) # returns the restored object # # where # # f is the file to read (default &input) # # p is a procedure that reads a line from f using the # same interface as read() (the parameter is # always a the value passed as "file") (default: read) # # # The "p" parameter is not normally used for storage in text files, but # it provides the flexibility to store the data in other ways, such as # a string in memory. If "p" is provided, then "f" can be any # arbitrary data object -- it need not be a file. # # For example, to "write" x to an Icon string: # # record StringFile(s) # # procedure main() # ... # encodeString := xencode(x,StringFile(""),WriteString).s # ... # end # # procedure WriteString(f,s[]) # every f.s ||:= !s # f.s ||:= "\n" # return # end # ############################################################################ # # Notes on the encoding # --------------------- # # Values are encoded as a sequence of one or more lines written to # a plain text file. The first or only line of a value begins with a # single character that unambiguously indicates its type. The # remainder of the line, for some types, contains additional value # information. Then, for some types, additional lines follow # consisting of additional object encodings that further specify the # object. The null value is a special case consisting of an empty # line. # # Each object other than &null is assigned an integer tag as it is # encoded. The tag is not, however, written to the output file. On # input, tags are assigned in the same order as objects are decoded, so # each restored object is associated with the same integer tag as it # was when being written. In encoding, any recurrence of an object is # represented by the original object's tag. Tag references are # represented as integers, and are easily recognized since no object's # representation begins with a digit. # # Where a structure contains elements, the encodings of the # elements follow the structure's specification on following lines. # Note that the form of the encoding contains the information needed to # separate consecutive elements. # # Here are some examples of values and their encodings: # # x encode(x) # ------------------------------------------------------- # # 1 N1 # 2.0 N2.0 # &null # "\377" "\377" # '\376\377' '\376\377' # procedure main p # "main" # co-expression #1 (0) C # [] L # N0 # set() "S" # N0 # table("a") T # N0 # "a" # ["hi","there"] L # N2 # "hi" # "there" # # A loop is illustrated by # # L2 := [] # put(L2,L2) # # for which # # x encode(x) # ------------------------------------------------------- # # L2 L # N1 # 2 # # The "2" on the third line is a tag referring to the list L2. The tag # ordering specifies that an object is tagged *after* its describing # objects, thus the list L2 has the tag 2 (the integer 1 has tag 1). # # Of course, you don't have to know all this to use xencode and # xdecode. # ############################################################################ # # Links: escape # ############################################################################ # # See also: codeobj.icn # ############################################################################ link escape record xcode_rec(file,ioProc,done,nextTag) procedure xencode(x,file,writeProc) #: write structure to file /file := &output return xencode_1( xcode_rec( file, (\writeProc | write) \ 1, table(), 0), x) end procedure xencode_1(data,x) local tp,wr,f,im wr := data.ioProc f := data.file # # Special case for &null. # if /x then { wr(f) return f } # # If this object has already been output, just write its tag. # if tp := \data.done[\x] then { wr(f,tp) return f } # # Check to see if it's a "distinguished" that is represented by # a keyword (special files and csets). If so, just use the keyword # in the output. # im := image(x) if match("integer(", im) then im := string(x) else if match("&",im) then { wr(f,im) data.done[x] := data.nextTag +:= 1 return f } # # Determine the type and handle accordingly. # tp := case type(x) of { "cset" | "string": "" "file" | "window": "f" "integer" | "real": "N" "co-expression": "C" "procedure": "p" "list": "L" "set": "S" "table": "T" default: "R" } case tp of { # # String, cset, or numeric outputs its string followed by its # image. # "" | "N": wr(f,tp,im) # # Procedure writes "p" followed (on subsequent line) by its name # as a string object. # "p": { wr(f,tp) im ? { while tab(find(" ") + 1) xencode_1(data,tab(0)) } } # # Co-expression, or file just outputs its letter. # !"CEf": wr(f,tp) # # Structured type outputs its letter followed (on subsequent # lines) by additional data. A record writes its type as a # string object; other type writes its size as an integer object. # Structure elements follow on subsequent lines (alternating keys # and values for tables). # default: { wr(f,tp) case tp of { !"LST": { im ? { tab(find("(") + 1) xencode_1(data,integer(tab(-1))) } if tp == "T" then xencode_1(data,x[[]]) } default: xencode_1(data, "record" || *x) # record -- fake it } # # Create the tag. It's important that the tag is assigned # *after* other other objects that describe this object (e.g. # the length of a list) are output (and tagged), but *before* # the structure elements; otherwise decoding would be # difficult. # data.done[x] := data.nextTag +:= 1 # # Output the elements of the structure. # every xencode_1(data, !case tp of {"S": sort(x); "T": sort(x,3); default: x}) } } # # Tag the object if it's not already tagged. # /data.done[x] := data.nextTag +:= 1 return f end procedure xdecode(file,readProc) #: read structure from file /file := &input return xdecode_1( xcode_rec( file, (\readProc | read) \ 1, [])) end # This procedure fails if it encounters bad data procedure xdecode_1(data) local x,tp,sz, i, s data.ioProc(data.file) ? { if any(&digits) then { # # It's a tag -- return its value from the object table. # return data.done[tab(0)] } if tp := move(1) then { x := case tp of { "N": numeric(tab(0)) "\"": escape(tab(-1)) "'": cset(escape(tab(-1))) "p": proc(xdecode_1(data) | main) "L": list(xdecode_1(data)) | stop("bad list") "S": {sz := xdecode_1(data) | stop("bad set"); set()} "T": {sz := xdecode_1(data) | stop("bad table"); table(xdecode_1(data)) | stop("bad table")} "R": proc(s := xdecode_1(data))() | stop("*** bad record: ", image(s)) "&": case tab(0) of { # # Special csets. # "cset": &cset "ascii": &ascii "digits": &digits "letters": &letters "lcase": &lcase "ucase": &ucase # # Special files. # "input": &input "output": &output "errout": &errout default: [] # so it won't crash if new keywords arise } "f": &input # to allow decoding "C": &main # to allow decoding default: stop("unknown type") } put(data.done,x) case tp of { !"LR": every i := 1 to *x do x[i] := xdecode_1(data) | stop("bad list or record") "T": every 1 to sz do insert(x,xdecode_1(data),xdecode_1(data)) | fail "S": every 1 to sz do insert(x,xdecode_1(data)) | fail } return x } else return } end procedure xencoden(x, name, opt) local output /opt := "w" output := open(name, opt) | stop("*** xencoden(): cannot open ", name) xencode(x, output) close(output) return end procedure xencodet(x, file, typ) if type(x) === typ then return xencode(x, file) else fail end procedure xdecodet(file, typ) local x x := xdecode(file) if type(x) == typ then return x else fail end procedure xdecoden(name) local input, x input := open(name) | stop("*** xdecoden(): cannot open ", name) if x := xdecode(input) then { close(input) return x } else { close(input) fail } end icon-9.4.3/ipl/procs/apply.icn0000664000175000017500000000152007140713040015527 0ustar chrishchrish############################################################################ # # File: apply.icn # # Subject: Procedure to apply a list of functions to an argument # # Author: Ralph E. Griswold # # Date: March 4, 1995 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # This procedure applies a list of functions to an argument. An example is # # apply([integer, log], 10) # # which is equivalent to integer(log(10)). # # ############################################################################ procedure apply(plist, arg) local p plist := copy(plist) p := get(plist) | fail if *plist = 0 then suspend p(arg) else suspend p(apply(plist, arg)) end icon-9.4.3/ipl/procs/pbkform.icn0000664000175000017500000001101407140713037016047 0ustar chrishchrish############################################################################ # # File: pbkform.icn # # Subject: Procedures to process HP95 phone book files # # Author: Robert J. Alexander # # Date: August 14, 1996 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # Icon procedure set to read and write HP95LX phone book (.pbk) files. # ############################################################################ # # HP 95LX Phone Book File Format # # The HP 95LX Phone Book file is structured as a file identification # record, followed by a variable number of phone book data records, # and terminated by an end of file record. Each data record contains # the information for one phone book entry. # # The format of these phone book records is described below. In the # descriptions, the type refers to a two byte integer stored least # significant byte first, the type refers to a one byte integer, # and the type refers to a string of ASCII characters. # # HP 95LX Phone Book File Identification Record: # # Byte Offset Name Type Contents # # 0 ProductCode int -2 (FEh, FFh) # 2 ReleaseNum int 1 (01h, 00h) # 4 FileType char 3 (03h) # ############################################################################ # # Links: bkutil # ############################################################################ # # See also: pbkutil.icn, abkform.icn # ############################################################################ link bkutil record pbk_id(releaseNum,fileType) procedure pbk_write_id(f) writes(f,"\xfe\xff\x01\x00\x03") return end procedure pbk_read_id(f) bk_read_int(f) = 16rfffe | fail return pbk_id(bk_read_int(f),ord(reads(f))) end # # HP 95LX Phone Book Data Record: # # Byte Offset Name Type Contents # # 0 RecordType char 1 (01h) # 1 RecordLength int Number of bytes in remainder # of this data record, see note # below. # 3 NameLength char Length of name text in bytes. # 4 NumberLength char Length on number text in bytes. # 5 AddressLength int Length of address text in bytes. # 7 NameText ASCII Name text, 30 characters maximum. # 7+NameLength NumberText ASCII Number text, 30 characters maximum. # 7+NameLength+ # NumberLength AddressText ASCII Address text where the null # character is used as the line # terminator. Addresses are limited # to a maximum of 8 lines of 39 # characters per line (not counting # the line terminator). # record pbk_data(name,number,address) procedure pbk_write_data(f,data) local name,number,address name := \data.name | "" number := \data.number | "" address := \data.address | "" writes(f,"\x01",bk_int(*name + *number + *address + 4),char(*name), char(*number),bk_int(*address),name,number,address) return data end procedure pbk_read_data(f,id) local next_rec,name_len,number_len,address_len,data (reads(f) == "\x01" | (seek(f,where(f) - 1),&fail) & next_rec := bk_read_int(f) + where(f) & name_len := ord(reads(f)) & number_len := ord(reads(f)) & address_len := bk_read_int(f) & data := pbk_data(reads(f,0 ~= name_len) | "",reads(f,0 ~= number_len) | "", reads(f,0 ~= address_len) | "") | fail & seek(f,next_rec)) | fail return data end # # HP 95LX Phone Book End of File Record: # # Byte Offset Name Type Contents # # 0 RecordType char 2 (02h) # 1 RecordLength int 0 (00h, 00h) # procedure pbk_write_end(f) writes(f,"\x02\x00\x00") return end procedure pbk_read_end(f,id) (reads(f) == "\x02" & reads(f,2)) | fail return end # # # Note: Files created by the Phone Book application may contain # some padding following the last field of some data records. Hence, # the RecordLength field must be used to determine the start of the # next record. Phone book files created by other programs need not # have any padding. icon-9.4.3/ipl/procs/binary.icn0000664000175000017500000005346307140713040015703 0ustar chrishchrish############################################################################ # # File: binary.icn # # Subject: Procedures to pack and unpack values # # Author: Robert J. Alexander # # Date: August 14, 1996 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # This is a collection of procedures that support conversion of Icon # data elements to and from binary data formats. The purpose is to # facilitate dealing with binary data files. # # The procedures can be used individually or via the "control" # procedures pack() and unpack(). # ############################################################################ # # The individual conversion functions are prefixed by either "pack_" or # "unpack_" and are identified in comments by their format character(s). # The "pack_" procedures convert from Icon to binary and take a single # argument: the value to be converted. The "unpack_" procedures # convert from binary to Icon and usually take no parameters -- they are # executed within a string-scanning context and scan the necessary # amount from the &subject string. Some of the "unpack_" functions take # a parameter that specifies the length of the output string. The # individual conversion procedures are minimally commented, but their # action is apparent from their procedure names and the documentation # of the pack() and unpack() procedures. # # The control procedures pack() and unpack() take a format string that # controls conversions of several values (similar to the "printf" C # library function). pack() and unpack() are patterned after the Perl # (programming language) functions of the same names, and are documented # below. # # # pack(template,value1,...) : packed_binary_string # ------------------------------------------------ # # This procedure packs the "values" into a binary structure, returning # the string containing the structure. The elements of any lists in the # "value" parameters are processed individually as if they were # "spliced" into the "value" parameter list. The "template" is a # sequence of characters that give the order and type of values, as # follows" (using C language terminology): # # a An ascii string, will be null padded (unstripped for unpack()). # A An ascii string, will be space padded (trailing nulls and # spaces will be stripped for unpack()). # b A bit string, low-to-high order. # B A bit string, high-to-low order. # h A hexadecimal string, low-nybble-first. # H A hexadecimal string, high-nybble-first. # c A signed char value. # C An unsigned char value. # s A signed short value. # S An unsigned short value. # i A signed int value. # I An unsigned int value. # l A signed long value. # L An unsigned long value. # n A short in "network" order (big-endian). # N A long in "network" order (big-endian). # v A short in "vax" order (little-endian). # V A long in "vax" order (little-endian). # f A single-precision float in IEEE Motorola format. # d A double-precision float in IEEE Motorola format. # e An extended-precision float in IEEE Motorola format 80-bit. # E An extended-precision float in IEEE Motorola format 96-bit. # x Skip forward a byte (null-fill for pack()). # X Back up a byte. # @ Go to absolute position (null-fill if necessary for pack()). # u A uu-encoded/decoded string. # # Each letter may optionally be followed by a number which gives a # count. Together the letter and the count make a field specifier. # Letters and numbers can be separated by white space which will be # ignored. Types A, a, B, b, H, and h consume one value from the # "value" list and produce a string of the length given as the # field-specifier-count. The other types consume # "field-specifier-count" values from the "value" list and append the # appropriate data to the packed string. # # # unpack(template,string) : value_list # ------------------------------------ # # This procedure does the reverse of pack(): it takes a string # representing a structure and expands it out into a list of values. # The template has mostly the same format as for pack() -- see pack(), # above. # # # Endianicity of integers # ----------------------- # # Integer values can be packed and unpacked in either big-endian # (Motorola) or little-endian (Intel) order. The default is big-endian. # Procedures pack_little_endian() and pack_big_endian() set the # mode for future packs and unpacks. # # # Size of ints # ------------ # # The "i" (signed int) and "I" (unsigned int) types can pack and unpack # either 16-bit or 32-bit values. 32-bit is the default. Procedures # pack_int_as_short() and pack_int_as_long() change the mode for # future packs and unpacks. # ############################################################################ # # To Do List # # - implement other-endian versions of floats (only big-endian supported # now). # # # The implementation # global pack_short,pack_long, unpack_short,unpack_unsigned_short, unpack_long,unpack_unsigned_long, pack_int_proc,unpack_int_proc,unpack_unsigned_int_proc procedure pack(template,values[]) #: pack values into a string local result,t,n,c,v,spliced_values initial if /pack_short then pack_big_endian() spliced_values := [] every v := !values do { if type(v) == "list" then spliced_values |||:= v else put(spliced_values,v) } values := spliced_values result := "" every t := pack_parse_template(template) do { n := t.count c := t.conversion case c of { !"aAbBhH": { # # Handle string. # v := string(get(values)) | break if n == "*" then n := *v result ||:= (case c of { !"aA": if integer(n) then left(v,n,if c == "A" then " " else "\0") else v default: (case c of { "b": pack_bits_low_to_high "B": pack_bits_high_to_low "h": pack_hex_low_to_high "H": pack_hex_high_to_low })(v[1:n + 1 | 0]) }) | break } "@": result := left(result,n + 1,"\0") "x": result := left(result,*result + n,"\0") "X": result := left(result,*result - n) default: { # # Handle item that consumes argument(s). # every if n === "*" then &null else 1 to n do { v := get(values) | break result ||:= (case c of { !"cC": pack_char !"sS": pack_short !"iI": pack_int !"lL": pack_long "n": pack_nshort "N": pack_nlong "v": pack_vshort "V": pack_vlong "f": pack_single_float "d": pack_double_float "e": pack_extended_float "E": pack_extended96_float "u": pack_uuencoded_string })(v) | break } } } } return result end procedure unpack(template,binaryString) #: unpack values from string local result,t,n,c,v initial if /unpack_short then pack_big_endian() result := [] binaryString ? { every t := pack_parse_template(template) do { n := t.count c := t.conversion case c of { "X": move(-integer(n)) | tab(1) "x": move(integer(n)) | tab(0) "@": tab(if n === "*" then 0 else n) !"aA": { v := move(integer(n)) | tab(0) if c == "A" then v := trim(v,' \t\0') put(result,v) } !"bBhH": { put(result,(case c of { "b": unpack_bits_low_to_high "B": unpack_bits_high_to_low "h": unpack_hex_low_to_high "H": unpack_hex_high_to_low })(n)) } default: { every if n === "*" then &null else 1 to n do { if pos(0) then break put(result,(case c of { "c": unpack_char "C": unpack_unsigned_char "s": unpack_short "S": unpack_unsigned_short "i": unpack_int "I": unpack_unsigned_int "l": unpack_long "L": unpack_unsigned_long "n": unpack_nshort "N": unpack_nlong "v": unpack_vshort "V": unpack_vlong "f": unpack_single_float "d": unpack_double_float "e": unpack_extended_float "E": unpack_extended96_float "u": unpack_uuencoded_string })()) | break } } } } } return result end record pack_template_rec(conversion,count) procedure pack_parse_template(template) local c,n template ? { pack_parse_space() while c := tab(any('aAbBhHcCsSiIlLnNvVfdeExX@u')) do { pack_parse_space() n := ="*" | integer(tab(many(&digits))) | 1 suspend pack_template_rec(c,n) pack_parse_space() } } end procedure pack_parse_space() suspend tab(many(' \t')) end procedure pack_big_endian() pack_short := pack_nshort pack_long := pack_nlong unpack_short := unpack_nshort unpack_unsigned_short := unpack_unsigned_nshort unpack_long := unpack_nlong unpack_unsigned_long := unpack_unsigned_nlong case pack_int_proc of { pack_vshort: pack_int_as_short() pack_vlong: pack_int_as_long() } return end procedure pack_little_endian() pack_short := pack_vshort pack_long := pack_vlong unpack_short := unpack_vshort unpack_unsigned_short := unpack_unsigned_vshort unpack_long := unpack_vlong unpack_unsigned_long := unpack_unsigned_vlong case pack_int_proc of { pack_nshort: pack_int_as_short() pack_nlong: pack_int_as_long() } return end procedure pack_int_as_long() pack_int_proc := pack_long unpack_int_proc := unpack_long unpack_unsigned_int_proc := unpack_unsigned_long return end procedure pack_int_as_short() pack_int_proc := pack_short unpack_int_proc := unpack_short unpack_unsigned_int_proc := unpack_unsigned_short return end # # "b" # procedure pack_bits_low_to_high(v) local result,n,b,buf result := "" n := buf := 0 every b := !v do { buf := ior(ishift(buf,-1),ishift(b % 2,7)) n +:= 1 if n = 8 then { result ||:= char(buf) n := buf := 0 } } if n > 0 then { result ||:= char(ishift(buf,-(8 - n))) } return result end # # "B" # procedure pack_bits_high_to_low(v) local result,n,b,buf result := "" n := buf := 0 every b := !v do { buf := ior(ishift(buf,1),b % 2) n +:= 1 if n = 8 then { result ||:= char(buf) n := buf := 0 } } if n > 0 then { result ||:= char(ishift(buf,8 - n)) } return result end # # "h" # procedure pack_hex_low_to_high(v) local result,pair result := "" v ? { while pair := move(2) do { result ||:= char(ior(pack_hex_digit(pair[1]), ishift(pack_hex_digit(pair[2]),4))) } result ||:= char(pack_hex_digit(move(1))) } return result end # # "H" # procedure pack_hex_high_to_low(v) local result,pair result := "" v ? { while pair := move(2) do { result ||:= char(ior(pack_hex_digit(pair[2]), ishift(pack_hex_digit(pair[1]),4))) } result ||:= char(ishift(pack_hex_digit(move(1)),4)) } return result end procedure pack_hex_digit(s) return (case map(s) of { "0": 2r0000 "1": 2r0001 "2": 2r0010 "3": 2r0011 "4": 2r0100 "5": 2r0101 "6": 2r0110 "7": 2r0111 "8": 2r1000 "9": 2r1001 "a": 2r1010 "b": 2r1011 "c": 2r1100 "d": 2r1101 "e": 2r1110 "f": 2r1111 }) | stop("bad hex digit: ",image(s)) end # # "c" and "C" # procedure pack_char(v) if v < 0 then v +:= 256 return char(v) end # # "s" and "S" (big-endian) # procedure pack_nshort(v) if v < 0 then v +:= 65536 return char(v / 256) || char(v % 256) end # # "s" and "S" (little-endian) # procedure pack_vshort(v) if v < 0 then v +:= 65536 return char(v % 256) || char(v / 256) end # # "i" and "I" # procedure pack_int(v) initial /pack_int_proc := pack_long return pack_int_proc(v) end # # "l" and "L" (big-endian) # procedure pack_nlong(v) local result if v < 0 then v +:= 4294967296 result := "" every 1 to 4 do { result ||:= char(v % 256) v /:= 256 } return reverse(result) end # # "l" and "L" (little-endian) # procedure pack_vlong(v) local result if v < 0 then v +:= 4294967296 result := "" every 1 to 4 do { result ||:= char(v % 256) v /:= 256 } return result end # # "u" # procedure pack_uuencoded_string(v) return UUEncodeString(v) end # # "b" # procedure unpack_bits_low_to_high(n) local result,c,r result := "" while *result < n do { c := ord(move(1)) | fail r := "" every 1 to 8 do { r ||:= iand(c,1) c := ishift(c,-1) } result ||:= r } return result[1+:n] | result end # # "B" # procedure unpack_bits_high_to_low(n) local result,c,r result := "" while *result < n do { c := ord(move(1)) | fail r := "" every 1 to 8 do { r := iand(c,1) || r c := ishift(c,-1) } result ||:= r } return result[1+:n] | result end # # "h" # procedure unpack_hex_low_to_high(n) local result,c result := "" while *result < n do { c := ord(move(1)) | fail result ||:= unpack_hex_digit(iand(c,16rf)) || unpack_hex_digit(ishift(c,-4)) } return result[1+:n] | result end # # "H" # procedure unpack_hex_high_to_low(n) local result,c result := "" while *result < n do { c := ord(move(1)) | fail result ||:= unpack_hex_digit(ishift(c,-4)) || unpack_hex_digit(iand(c,16rf)) } return result[1+:n] | result end procedure unpack_hex_digit(i) return "0123456789abcdef"[i + 1] end # # "c" # procedure unpack_char() local v v := ord(move(1)) | fail if v >= 128 then v -:= 256 return v end # # "C" # procedure unpack_unsigned_char() return ord(move(1)) end # # "n" and "s" (big-endian) # procedure unpack_nshort() local v v := unpack_unsigned_nshort() | fail if v >= 32768 then v -:= 65536 return v end # # "v" and "s" (little-endian) # procedure unpack_vshort() local v v := unpack_unsigned_vshort() | fail if v >= 32768 then v -:= 65536 return v end # # "S" (big-endian) # procedure unpack_unsigned_nshort() return 256 * ord(move(1)) + ord(move(1)) end # # "S" (little-endian) # procedure unpack_unsigned_vshort() return ord(move(1)) + 256 * ord(move(1)) end # # "i" # procedure unpack_int() initial /unpack_int_proc := unpack_long return unpack_int_proc() end # # "I" (aye) # procedure unpack_unsigned_int() initial /unpack_unsigned_int_proc := unpack_unsigned_long return unpack_unsigned_int_proc() end # # "N" and "l" (ell) (big-endian) # procedure unpack_nlong() local v v := 0 every 1 to 4 do { v := 256 * v + ord(move(1)) | fail } if v >= 2147483648 then v -:= 4294967296 return v end # # "V" and "l" (ell) (little-endian) # procedure unpack_vlong() local v,m v := 0 m := 1 every 1 to 4 do { v := v + m * ord(move(1)) | fail m *:= 256 } if v >= 2147483648 then v -:= 4294967296 return v end # # "L" (big-endian) # procedure unpack_unsigned_nlong() local v v := 0 every 1 to 4 do { v := v * 256 + ord(move(1)) | fail } return v end # # "L" (little-endian) # procedure unpack_unsigned_vlong() local v,m v := 0 m := 1 every 1 to 4 do { v := v + m * ord(move(1)) | fail m *:= 256 } return v end # # "u" # procedure unpack_uuencoded_string() return UUDecodeString(tab(0)) end # # Procedures for converting real values from input streams. These # procedures accept standard IEEE floating point values as strings, # usually as read from a file, and return their numeric equivalent as a # "real". The degree of accuracy is likely to vary with different # implementations of Icon. # # Requires large integers. # # Parameter Float Double Extended Extended96 # ================================================================= # Size (bytes:bits) 4:32 8:64 10:80 12:96 # # Range of binary exponents # Minimum -126 -1022 -16383 -16383 # Maximum +127 +1023 +16383 +16383 # Exponent width in bits 8 11 15 15 # Exponent bias +127 +1023 +16383 +16383 # # Significand precision # Bits 24 53 64 64 # Decimal digits 7-8 15-16 18-19 18-19 # # Decimal range approximate # Maximum positive 3.4E+38 1.7E+308 1.1E+4932 # Minimum positive norm 1.2E-38 2.3E-308 1.7E-4932 # Minimum positive denorm 1.5E-45 5.0E-324 1.9E-4951 # Maximum negative denorm -1.5E-45 -5.0E-324 -1.9E-4951 # Maximum negative norm -1.2E-38 -2.3E-308 -1.7E-4932 # Minimum negative -3.4E+38 -1.7E+308 -1.1E+4932 # # # "d" # procedure pack_double_float(v) local exp,mant,result,av static dvsr initial dvsr := 2.0 ^ 52 v := real(v) if v = 0.0 then return "\0\0\0\0\0\0\0\0" else { av := abs(v) exp := integer(log(av,2)) if exp <= -1023 then return "\0\0\0\0\0\0\0\0" if exp > 1023 then return if v < 0.0 then "\xff\xf0\0\0\0\0\0\0" else "\x7f\xf0\0\0\0\0\0\0" mant := integer(av / 2.0 ^ real(exp) * dvsr + 0.5) exp +:= 1023 result := "" every 3 to 8 do { result := char(mant % 256) || result mant /:= 256 } result := char(ior(if v < 0.0 then 16r80 else 0,ishift(exp,-4))) || char(ior(iand(mant % 256,16rf),iand(ishift(exp,4),16rf0))) || result return result } end # # "f" # procedure pack_single_float(v) local exp,mant,result,av static dvsr initial dvsr := 2.0 ^ 23 v := real(v) if v = 0.0 then return "\0\0\0\0" else { av := abs(v) exp := integer(log(av,2)) if exp <= -127 then return "\0\0\0\0" if exp > 127 then return if v < 0.0 then "\xff\x80\0\0" else "\x7f\x80\0\0" mant := integer(av / 2.0 ^ real(exp) * dvsr + 0.5) exp +:= 127 result := "" every 3 to 4 do { result := char(mant % 256) || result mant /:= 256 } result := char(ior(if v < 0.0 then 16r80 else 0,ishift(exp,-1))) || char(ior(iand(mant % 256,16r7f),iand(ishift(exp,7),16r80))) || result return result } end # # "e" # procedure pack_extended_float(v) local exp,mant,result,av static dvsr initial dvsr := 2.0 ^ 63 v := real(v) if v = 0.0 then return "\0\0\0\0\0\0\0\0\0\0" else { av := abs(v) exp := integer(log(av,2)) if exp <= -16383 then return "\0\0\0\0\0\0\0\0\0\0" if exp > 16383 then return if v < 0.0 then "\xff\xff\0\0\0\0\0\0\0\0" else "\x7f\xff\0\0\0\0\0\0\0\0" mant := integer(av / 2.0 ^ real(exp) * dvsr + 0.5) exp +:= 16383 result := "" every 3 to 10 do { result := char(mant % 256) || result mant /:= 256 } result := char(ior(if v < 0.0 then 16r80 else 0,ishift(exp,-8))) || char(iand(exp,16rff)) || result return result } end # # "E" # procedure pack_extended96_float(v) return pack_x80tox96(pack_extended_float(v)) end # # "d" # procedure unpack_double_float() local exp,mant,v,i,s static dvsr initial dvsr := 2.0 ^ 52 (s := move(8)) | fail exp := ior(ishift(iand(ord(s[1]),16r7f),4),ishift(ord(s[2]),-4)) - 1023 v := if exp = -1023 then 0.0 else { mant := ior(16r10,iand(ord(s[2]),16r0f)) every i := 3 to 8 do mant := mant * 256 + ord(s[i]) mant / dvsr * 2.0 ^ real(exp) } return if s[1] >>= "\x80" then -v else v end # # "f" # procedure unpack_single_float() local exp,mant,v,i,s static dvsr initial dvsr := 2.0 ^ 23 (s := move(4)) | fail exp := ior(ishift(iand(ord(s[1]),16r7f),1),ishift(ord(s[2]),-7)) - 127 v := if exp = -127 then 0.0 else { mant := ior(16r80,iand(ord(s[2]),16r7f)) every i := 3 to 4 do mant := mant * 256 + ord(s[i]) mant / dvsr * 2.0 ^ real(exp) } return if s[1] >>= "\x80" then -v else v end # # "e" # procedure unpack_extended_float(s) local exp,mant,v,i static dvsr initial dvsr := 2.0 ^ 63 if /s then (s := move(10)) | fail exp := ior(ishift(iand(ord(s[1]),16r7f),8),ord(s[2])) - 16383 v := if exp = -16383 then 0.0 else { mant := ord(s[3]) every i := 4 to 10 do mant := mant * 256 + ord(s[i]) mant / dvsr * 2.0 ^ real(exp) } return if s[1] >>= "\x80" then -v else v end # # "E" # procedure unpack_extended96_float() return unpack_extended_float(pack_x96tox80(move(12))) end procedure pack_x80tox96(s) return s[1:3] || "\0\0" || s[3:0] end procedure pack_x96tox80(s) return s[1:3] || s[5:0] end # # Procedures for working with UNIX "uuencode" format. # global UUErrorText # # Decode a uu-encoded string. # procedure UUDecodeString(s) local len s ? { len := UUDecodeChar(move(1)) s := "" while s ||:= UUDecodeQuad(move(4)) if not pos(0) then { UUErrorText := "not multiple of 4 encoded characters" fail } if not (0 <= *s - len < 3) then { UUErrorText := "actual length, " || *s || " doesn't jive with length character, " || len fail } } return s[1+:len] | s end # # Get a binary value from a uu-encoded character. # procedure UUDecodeChar(s) static spaceVal initial spaceVal := ord(" ") return ord(s) - spaceVal end # # Decode 4-byte encoded string to 3-bytes of binary data. # procedure UUDecodeQuad(s) local v1,v2,v3,v4 *s = 4 | { write(&errout,"Input string not of length 4") runerr(500,s) } v1 := UUDecodeChar(s[1]) v2 := UUDecodeChar(s[2]) v3 := UUDecodeChar(s[3]) v4 := UUDecodeChar(s[4]) return ( char(ior(ishift(v1,2),ishift(v2,-4))) || char(ior(ishift(iand(v2,16rf),4),ishift(v3,-2))) || char(ior(ishift(iand(v3,16r3),6),v4)) ) end # # Convert "s" to uu-encoded format. # procedure UUEncodeString(s) local outLine s ? { outLine := "" until pos(0) do outLine ||:= UUEncodeTriple(move(3) | tab(0)) } return UUEncodeChar(*s) || outLine end # # Get the ascii character for uu-encoding "i". # procedure UUEncodeChar(i) static spaceVal initial spaceVal := ord(" ") return char(i + spaceVal) end # # Encode to 3-bytes of binary data into 4-byte uu-encoded string. # procedure UUEncodeTriple(s) local v1,v2,v3 v1 := ord(s[1]) v2 := ord(s[2]) | 0 v3 := ord(s[3]) | 0 return ( UUEncodeChar(ishift(v1,-2)) || UUEncodeChar(ior(ishift(iand(v1,16r3),4),ishift(v2,-4))) || UUEncodeChar(ior(ishift(iand(v2,16rf),2),ishift(v3,-6))) || UUEncodeChar(iand(v3,16r3f)) ) end icon-9.4.3/ipl/procs/patch.icn0000664000175000017500000000431107140713037015510 0ustar chrishchrish############################################################################ # # File: patch.icn # # Subject: Procedures for UNIX-like patch(1) # # Author: Rich Morin # # Date: June 18, 1990 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # This procedure produces a sequence of edited items, reading a source # stream (from) and a stream of difference records (diffs), as generated # by dif.icn. # # An optional parameter (rev) causes the edits to be made in reverse. # This allows an old stream to be regenerated from a new stream and an # appropriate stream of difference records. # # The original patch(1) utility was written by Larry Wall, and is used # widely in the UNIX community. See also diffu.icn and patchu.icn, the # utility program versions of dif.icn and patch.icn. # # Usage: patch(old, diff) # patch old to new via diff # patch(new, diff, rev) # patch new to old via diff # ############################################################################ # # Requires: co-expressions # ############################################################################ procedure patch(from, diff, rev) local c_diff, c_from, cnte, cnti, i, item, ldr, o initial { i := 1 o := 2 if \rev then i :=: o c_diff := create !diff c_from := create !from cnti := item := 0 ldr := @c_diff cnte := ldr[i].pos } repeat { while /ldr | cnti < cnte-1 do { # copy old items cnti +:= 1 if item := @c_from then suspend item else { item := &null break } } if \ldr then { # still have edits every 1 to *ldr[i].diffs do { # discard items cnti +:= 1 @c_from | zot_patch("unexpected end of stream") } if *ldr[o].diffs > 0 then # copy new items suspend !ldr[o].diffs if ldr := @c_diff then # get next edit cnte := ldr[i].pos else ldr := &null } if /item & /ldr then fail } end procedure zot_patch(msg) # exit w/ message write(&errout, "patch: ", msg) exit(1) end icon-9.4.3/ipl/procs/html.icn0000664000175000017500000002176110233544600015360 0ustar chrishchrish############################################################################ # # File: html.icn # # Subject: Procedures for parsing HTML # # Author: Gregg M. Townsend # # Date: April 26, 2005 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # These procedures parse HTML files: # # htchunks(f) generates the basic chunks -- tags and text -- # that compose an HTML file. # # htrefs(f) generates the tagname/keyword/value combinations # that reference other files. # # These procedures process strings from HTML files: # # httag(s) extracts the name of a tag. # # htvals(s) generates the keyword/value pairs from a tag. # # urlmerge(base,new) interprets a new URL in the context of a base. # # canpath(s) puts a path in canonical form # ############################################################################ # # htchunks(f) generates the HTML chunks from file f. # It returns strings beginning with # # ") + 3) then fail # normal case: discard comment s ||:= tab(0) &subject := (read(f) || "\n") | break } &subject := s # rescan unclosed comment return " 0 Match any substring (including empty) # ? --> 1 Matches any single character # [abc] --> 'abc' Matches single character in 'abc' (more below) # abc --> "abc" Matches "abc" # \ Escapes the following character, causing it # to be considered part of a string to match # rather than one of the special pattern # characters. # plist := [] s ? { until pos(0) do { c := &null # # Put pattern element on list. # e := (="*" & 0) | (="?" & 1) | (="\\" & move(1)) | (="[" & c := (=("]" | "!]" | "!-]" | "") || tab(find("]"))) & move(1)) | move(1) || tab(upto('*?[\\') | 0) # # If it's [abc], create a cset. Special notations: # # A-Z means all characters from A to Z inclusive. # ! (if first) means any character not among those specified. # - or ] (if first, or after initial !) means itself. # \c ? { complement := ="!" | &null special := '-]' e := '' while ch := tab(any(special)) do { e ++:= ch special --:= ch } while chars := tab(find("-")) do { move(1) e ++:= chars[1:-1] ++ &cset[ord(chars[-1]) + 1:ord(move(1)) + 2] } e ++:= tab(0) if \complement then e := ~e } if type(e) == "string" == type(plist[-1]) then plist[-1] ||:= e else put(plist,e) } } return plist end procedure wild_skip(plist) # s1,s2,...,sN # # Used privately -- match a sequence of strings in s past which a match # of the first pattern element in plist is likely to succeed. This # procedure is used for heuristic performance improvement by # wild_match() for the "*" pattern element by matching only strings # where the next element is likely to succeed, and by wild_find() to # attempt matches only at likely positions. # local x,t x := plist[1] suspend tab( case type(x) of { "string": find(x) "cset": upto(x) default: &pos to *&subject + 1 } ) end procedure wild_match1(plist,v) # s1,s2,...,sN # # Used privately by wild_match() to simulate a computed conjunction # expression via recursive suspension. # local c if c := pop(plist) then { suspend wild_match1(plist,case c of { 0: wild_skip(plist) 1: move(1) default: case type(c) of { "cset": tab(any(c)) default: =c } }) push(plist,c) } else return v end icon-9.4.3/ipl/procs/lcseval.icn0000664000175000017500000000356407140713037016053 0ustar chrishchrish############################################################################ # # File: lcseval.icn # # Subject: Procedure to evaluate linear congruence parameters # # Author: Ralph E. Griswold # # Date: May 23, 1996 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # rcseval(a, c, m) evaluates the constants used in a linear congruence # recurrence for generating a sequence of pseudo-random numbers. # a is the multiplicative constant, c is the additive constant, and # m is the modulus. # # Any line of output starting with asterisks indicates a problem. # # See Donald E. Knuth, "Random Numbers" in The Art of Computer Programming, # Vol. 2, Seminumerical Algorithms, Addison-Wesley, Reading, Massachusetts, # 1969, pp. 1-160. # ############################################################################ # # Deficiency: The modulus test for a assumes m is a power of 2. # ############################################################################ # # Requires: large integers # ############################################################################ procedure lcseval(a, c, m) local b, s write("a=", a, " (should not have a regular pattern of digits)") write("c=", c) write("m=", m, " (should be large)") if (m / 100) < a < (m - sqrt(m)) then write("a passes range test") else write("*** a fails range test") if a % 8 = 5 then write("a passes mod test") else write("*** a fails mod test") if (c % 2) ~= 1 then write("c relatively prime to m") else write("*** c not relatively prime to m") write("c/m=", c / real(m), " (should be approximately 0.211324865405187)") b := a - 1 every s := seq() do if (b ^ s) % m = 0 then stop("potency=", s, " (should be at least 5)") end icon-9.4.3/ipl/procs/shquote.icn0000664000175000017500000001012007140713037016074 0ustar chrishchrish############################################################################ # # File: shquote.icn # # Subject: Procedures to quote word for UNIX-like shells # # Author: Robert J. Alexander # # Date: December 30, 1993 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # The following procedures are useful for writing Icon programs that # generate shell commands. Certain characters cannot appear in the # open in strings that are to be interpreted as "words" by command # shells. This family of procedures assists in quoting such strings so # that they will be interpreted as single words. Quoting characters # are applied only if necessary -- if strings need no quoting they are # returned unchanged. # # shquote(s1, s2, ..., sN) : s -- Produces a string of words s1, s2, # ..., sN that are properly separated and quoted for the Bourne Shell # (sh). # # cshquote(s1, s2, ..., sN) : s -- Produces a string of words s1, s2, ..., sN # that are properly separated and quoted for the C-Shell (csh). # # mpwquote(s1, s2, ..., sN) : s -- Produces a string of words s1, s2, # ..., sN that are properly separated and quoted for the Macintosh # Programmer's Workshop shell (MPW Shell). # # dequote(s1,s2) : s3 -- Produces the UNIX-style command line word s1 # with any quoting characters removed. s2 is the escape character # required by the shell (s2 defaults the the usual UNIX escape # character, the backslash "\\"). # ############################################################################ procedure shquote(s[]) return shquote_words(s) end procedure cshquote(s[]) s := shquote_words(s,'\t\n $"#&\'()*;<>?[\\`|~') # # But backslashes before any bangs (!). # s ? { s := "" while s ||:= tab(find("!")) do { s ||:= "\\" || move(1) } s ||:= tab(0) } return s end procedure mpwquote(s[]) # # The following are Macintosh Option- characters that have special # meaning to the MPW Shell. They are represented here as Icon # escape sequences rather than as themselves since some # ASCII-oriented mailers change characters that have their # high-order bits set. # # \xa8 circled r # \xb3 >= (I/O redirection) # \xb6 lower case delta (escape character) # \xb7 upper case sigma # \xc5 lower case phi # \xc7 << (I/O redirection) # \xc8 >> (I/O redirection) # \xc9 ... # local result result := "" # # If there is a "return" in the string, it must be replaced by an # escape sequence outside of the single quotes. # shquote_words(s, '\0\t\n\r "#&\'()*+/;<>?[\\]`{|}\xa8\xb3\xb6\xb7\xc5\xc7\xc8\xc9', "\xb6") ? { while result ||:= tab(find("\x0d")) do { result ||:= "'\xb6n'" move (1) } result ||:= tab(0) } return result end procedure shquote_words(wordList,quotedChars,escapeString,sepString) local s, result, sep /quotedChars := '\t\n\r $"#&\'()*;<>?[\\^`|' /escapeString := "\\" /sepString := " " result := sep := "" every s := !wordList do { if s == "" | upto(quotedChars,s) then { s ? { s := "'" while s ||:= tab(find("'")) || "'" || escapeString || "''" & move(1) s ||:= tab(0) || "'" } } result ||:= sep || s sep := sepString } return result end procedure dequote(s,escapeString,escapeProc) local quoteChars,c,d /escapeString := "\\" /escapeProc := 1 quoteChars := '"\'' ++ escapeString[1] s ? { s := "" while s ||:= tab(upto(quoteChars)) do { if =escapeString then s ||:= (if d === "'" then escapeString else escapeProc(move(1))) else { c := move(1) (/d := c) | (s ||:= d ~== c) | (d := &null) } } return s || tab(0) } end procedure mpwdequote(s) return dequote(s,"\xb6",mpw_escape_proc) end procedure mpw_escape_proc(ch) return case ch of { "n": "\n" "t": "\t" "f": "\f" default: ch } end icon-9.4.3/ipl/procs/matrix2.icn0000664000175000017500000002652210331771766016020 0ustar chrishchrish############################################################################ # # File: matrix2.icn # # Subject: Procedures for matrix transposition and scalar multiplication # # Authors: Arthur C. Eschenlauer # # Date: November 1, 2005 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # transpose_matrix(M) : L - produces a matrix R that is the transpose of M: # R[j][i] = M[i][j] # # numeric_matrix(M) : L - produces a matrix R that is a copy of M except # each element has been subjected to the # numeric(x) function; if numeric fails for any # element, numeric_matrix fails: # R[i][j] = numeric(M[i][j]) # # scale_matrix(M,mult) : L - produces a new matrix R each of whose elements # is mult times larger than its peer in M: # R[i][j] := mult * M[i][j] # scale_matrix(mult,M) : L - is a synonym for scale_matrix(M,mult). # # floor_matrix(M,min) : L - produces a matrix R that is a copy of M except # each element is increased to min if necessary: # R[i][j] := min <= M[i][j] | min # floor_matrix(min,M) : L - is a synonym for floor_matrix(M,min). # # ceil_matrix(M,max) : L - produces a matrix R that is a copy of M except # each element is increased to max if necessary: # R[i][j] := max <= M[i][j] | max # ceil_matrix(max,M) : L - is a synonym for ceil_matrix(M,max). # # sumsquares_matrix(M) : n - produces the sum of the squares # of all terms in a matrix # sum(for every i,j) (M[i][j])^2 # # sumsquaresdiff_matrix(M1,M2) : n - produces the sum of the squares of all # terms in the difference between two matrices # sum(for every i,j) (M1[i][j] - M2[i][j])^2 # # normalize_rows(M,t) : L - produce a row-scaled matrix such that, # for every row i, the sum of the values in # all columns is 1 # R[i][j] /:= sum(for every J) M[i][J] # t is a required minimum magnitude # for row sums to avoid divide-by-zero errors # normalize_rows(t,M) : L - synonym for normalize_rows(M,t) # # normalize_columns(M,t) : L - produce a column-scaled matrix such that, # for every column i, the sum of the values # in all rows is 1 # such that their sum is 1 # R[i][j] /:= sum(for every I) M[I][j] # t is a required minimum magnitude for # column sums to avoid divide-by-zero errors # normalize_columns(t,M) : L - synonym for normalize_columns(M,t) # # sprintf_matrix(f,M) - produces a matrix R of strings whose elements # are formatted (by the IPL sprintf routine) # from the elements of M: # R[i][j] := sprintf(f,M[i,j]) # ############################################################################ # # Links: matrix, printf # ############################################################################ link matrix link printf # transpose_matrix(M) - produces a new matrix R that is the transpose of M: # R[j][i] = M[i][j] procedure transpose_matrix(M) local R, row, rowcnt, colcnt, i, j # sanity checks type(M) == "list" | fail type(M[1]) == "list" | fail rowcnt := *M | fail colcnt := *M[1] | fail every i := 2 to rowcnt do *M[i] = colcnt | fail R := list( ) # create list of rows every i := 1 to colcnt do { put( R, row := list( ) ) # create list of column values every j := 1 to rowcnt do # populate column values put( row, M[j][i] ) } return R end # numeric_matrix(M) - produces a new matrix R that is a copy of M except # each element has been subjected to the numeric(x) # function; if numeric fails for any element, # numeric_matrix fails: # R[i][j] = numeric(M[i][j]) procedure numeric_matrix(M) local R, row, rowcnt, colcnt, i, j # sanity checks type(M) == "list" | fail type(M[1]) == "list" | fail rowcnt := *M | fail colcnt := *M[1] | fail every i := 2 to rowcnt do *M[i] = colcnt | fail R := list( ) # create list of rows every i := 1 to rowcnt do { put( R, row := list( ) ) # create list of column values every j := 1 to colcnt do # populate column values put( row, numeric(M[i][j]) | fail ) } return R end # scale_matrix(M,mult) - produces a new matrix R each of whose elements is # mult times larger than its peer in M: # R[i][j] := mult * M[i][j] # scale_matrix(mult,M) - is a synonym for scale_matrix(M,mult). procedure scale_matrix(mult,M) local R, i, j # handle synonymous invocation if numeric(M) & type(mult) == "list" then M :=: mult # sanity checks mult := numeric(mult) | fail type(M) == "list" | fail type(M[1]) == "list" | fail R := copy_matrix(M) | fail # create a copy of input matrix every i := 1 to *R do # for each row every j := 1 to *R[1] do # for each column # scale the column value R[i][j] := numeric(R[i][j]) * mult | fail return R end # floor_matrix(M,min) - produces a new matrix R that is a copy of M except # each element is increased to min if necessary: # R[i][j] := min <= M[i][j] | min procedure floor_matrix(min,M) local R, i, j, r # handle synonymous invocation if numeric(M) & type(min) == "list" then M :=: min # sanity checks min := numeric(min) | fail type(M) == "list" | fail type(M[1]) == "list" | fail R := copy_matrix(M) | fail # create copy of input matrix every i := 1 to *R do # for each row every j := 1 to *R[1] do { # for each column # adjust column value if less than min r := numeric(R[i][j]) | fail R[i][j] := r < min | r } return R end # floor_matrix(min,M) - is a synonym for floor_matrix(M,min). # ceil_matrix(M,max) - produces a new matrix R that is a copy of M except # each element is increased to max if necessary: # R[i][j] := max <= M[i][j] | max procedure ceil_matrix(max,M) local R, i, j, r # handle synonymous invocation if numeric(M) & type(max) == "list" then M :=: max # sanity checks max := numeric(max) | fail type(M) == "list" | fail type(M[1]) == "list" | fail R := copy_matrix(M) | fail # create copy of input matrix every i := 1 to *R do # for each row every j := 1 to *R[1] do { # for each column # adjust column value if less than max r := numeric(R[i][j]) | fail R[i][j] := r > max | r } return R end # ceil_matrix(max,M) - is a synonym for ceil_matrix(M,max). # sumsquares_matrix(M) - produces the sum of the squares # of all terms in a matrix # sum( for every i,j ) (M[i][j])^2 procedure sumsquares_matrix(M) local r, r1, i, j # sanity checks type(M) == "list" | fail type(M[1]) == "list" | fail # compute the sum of squares r := 0 every i := 1 to *M do # for each row every j := 1 to *M[1] do { # for each column # sumsquare the column value r1 := M[i][j] r +:= r1 * r1 } return r end # sumsquaresdiff_matrix(M1,M2) - produces the sum of the squares # of all terms in the difference between two matrices # sum( for every i,j ) (M1[i][j] - M2[i][j])^2 procedure sumsquaresdiff_matrix(M1,M2) local r, r1, r2, i, j, scratch # sanity checks type(M1) == type(M2) == "list" | fail type(M1[1]) == type(M2[1]) == "list" | fail ( *M1 = *M2, *M1[1] = *M2[1] ) | fail # compute the sum of squares r := 0 every i := 1 to *M1 do # for each row every j := 1 to *M1[1] do { # for each column # sumsquare the column value r1 := M1[i][j] ; r2 := r1 - M2[i][j] r +:= r2 * r2 } return r end # normalize_rows(M,t) : L - produce a row-scaled matrix such that, # for every row i, the sum of the values in # all columns is 1 # R[i][j] /:= sum(for every J) M[i][J] # t is a required minimum magnitude # for row sums to avoid divide-by-zero errors # normalize_rows(t,M) : L - synonym for normalize_rows(M,t) procedure normalize_rows(M,threshold) local R, rowsum, rowcnt, colcnt, i, j # handle synonymous invocation if numeric(M) & type(threshold) == "list" then M :=: threshold # sanity checks type(M) == "list" | fail type(M[1]) == "list" | fail \threshold | fail R := copy_matrix( M ) | fail rowcnt := *R colcnt := *R[1] every i := 1 to rowcnt do { # for each column rowsum := 0 every j := 1 to colcnt do rowsum +:= R[i][j] if not -threshold < rowsum < threshold then every j := 1 to colcnt do R[i][j] /:= rowsum } return R end # normalize_columns(M,t) : L - produce a column-scaled matrix such that, # for every column i, the sum of the values # in all rows is 1 # such that their sum is 1 # R[i][j] /:= sum(for every I) M[I][j] # t is a required minimum magnitude for # column sums to avoid divide-by-zero errors # normalize_columns(t,M) : L - synonym for normalize_columns(M,T) procedure normalize_columns(M,threshold) local R, colsum, rowcnt, colcnt, i, j # handle synonymous invocation if numeric(M) & type(threshold) == "list" then M :=: threshold # sanity checks type(M) == "list" | fail type(M[1]) == "list" | fail \threshold | fail R := copy_matrix( M ) | fail rowcnt := *R colcnt := *R[1] every j := 1 to colcnt do { # for each column colsum := 0 every i := 1 to rowcnt do colsum +:= R[i][j] if not -threshold < colsum < threshold then every i := 1 to rowcnt do R[i][j] /:= colsum } return R end # sprintf_matrix(format,M) - produces a matrix R of strings formatted # by sprintf procedure sprintf_matrix( fmt, M ) local R, row, rowcnt, colcnt, i, j # sanity checks type(M) == "list" | fail type(M[1]) == "list" | fail rowcnt := *M | fail colcnt := *M[1] | fail every i := 2 to rowcnt do *M[i] = colcnt | fail R := list( ) # create list of rows every i := 1 to rowcnt do { put( R, row := list( ) ) # create list of column values every j := 1 to colcnt do # populate column values put( row, sprintf( fmt, M[i][j] ) | fail ) } return R end icon-9.4.3/ipl/procs/itokens.icn0000664000175000017500000007336507140713037016104 0ustar chrishchrish############################################################################ # # File: itokens.icn # # Subject: Procedures for tokenizing Icon code # # Author: Richard L. Goerwitz # # Date: March 3, 1996 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # Version: 1.11 # ############################################################################ # # This file contains itokens() - a utility for breaking Icon source # files up into individual tokens. This is the sort of routine one # needs to have around when implementing things like pretty printers, # preprocessors, code obfuscators, etc. It would also be useful for # implementing cut-down implementations of Icon written in Icon - the # sort of thing one might use in an interactive tutorial. # # Itokens(f, x) takes, as its first argument, f, an open file, and # suspends successive TOK records. TOK records contain two fields. # The first field, sym, contains a string that represents the name of # the next token (e.g. "CSET", "STRING", etc.). The second field, # str, gives that token's literal value. E.g. the TOK for a literal # semicolon is TOK("SEMICOL", ";"). For a mandatory newline, itokens # would suspend TOK("SEMICOL", "\n"). # # Unlike Icon's own tokenizer, itokens() does not return an EOFX # token on end-of-file, but rather simply fails. It also can be # instructed to return syntactically meaningless newlines by passing # it a nonnull second argument (e.g. itokens(infile, 1)). These # meaningless newlines are returned as TOK records with a null sym # field (i.e. TOK(&null, "\n")). # # NOTE WELL: If new reserved words or operators are added to a given # implementation, the tables below will have to be altered. Note # also that &keywords should be implemented on the syntactic level - # not on the lexical one. As a result, a keyword like &features will # be suspended as TOK("CONJUNC", "&") and TOK("IDENT", "features"). # ############################################################################ # # Links: scan # ############################################################################ # # Requires: coexpressions # ############################################################################ link scan global next_c, line_number record TOK(sym, str) # # main: an Icon source code uglifier # # Stub main for testing; uncomment & compile. The resulting # executable will act as an Icon file compressor, taking the # standard input and outputting Icon code stripped of all # unnecessary whitespace. Guaranteed to make the code a visual # mess :-). # #procedure main() # # local separator, T # separator := "" # every T := itokens(&input) do { # if any(&digits ++ &letters ++ '_.', \T.str, 1, 2) & \T.sym ~== "DOT" # then writes(separator) # if T.sym == "SEMICOL" then writes(";") else writes(T.str) # if any(&digits ++ &letters ++ '_.', \T.str, -1, 0) & \T.sym ~== "DOT" # then separator := " " else separator := "" # } # #end # # itokens: file x anything -> TOK records (a generator) # (stream, nostrip) -> Rs # # Where stream is an open file, anything is any object (it only # matters whether it is null or not), and Rs are TOK records. # Note that itokens strips out useless newlines. If the second # argument is nonnull, itokens does not strip out superfluous # newlines. It may be useful to keep them when the original line # structure of the input file must be maintained. # procedure itokens(stream, nostrip) local T, last_token # initialize to some meaningless value last_token := TOK() every T := \iparse_tokens(stream) do { if \T.sym then { if T.sym == "EOFX" then fail else { # # If the last token was a semicolon, then interpret # all ambiguously unary/binary sequences like "**" as # beginners (** could be two unary stars or the [c]set # intersection operator). # if \last_token.sym == "SEMICOL" then suspend last_token := expand_fake_beginner(T) else suspend last_token := T } } else { if \nostrip then suspend last_token := T } } end # # expand_fake_beginner: TOK record -> TOK records # # Some "beginner" tokens aren't really beginners. They are token # sequences that could be either a single binary operator or a # series of unary operators. The tokenizer's job is just to snap # up as many characters as could logically constitute an operator. # Here is where we decide whether to break the sequence up into # more than one op or not. # procedure expand_fake_beginner(next_token) static exptbl initial { exptbl := table() insert(exptbl, "CONCAT", [TOK("BAR", "|"), TOK("BAR", "|")]) insert(exptbl, "DIFF", [TOK("MINUS", "-"), TOK("MINUS", "-")]) insert(exptbl, "EQUIV", [TOK("NUMEQ", "="), TOK("NUMEQ", "="), TOK("NUMEQ", "=")]) insert(exptbl, "INTER", [TOK("STAR", "*"), TOK("STAR", "*")]) insert(exptbl, "LCONCAT", [TOK("BAR", "|"), TOK("BAR", "|"), TOK("BAR", "|")]) insert(exptbl, "LEXEQ", [TOK("NUMEQ", "="), TOK("NUMEQ", "=")]) insert(exptbl, "LEXNE", [TOK("TILDE", "~"), TOK("NUMEQ", "="), TOK("NUMEQ", "=")]) insert(exptbl, "NOTEQUIV",[TOK("TILDE", "~"), TOK("NUMEQ","="), TOK("NUMEQ", "="), TOK("NUMEQ", "=")]) insert(exptbl, "NUMNE", [TOK("TILDE", "~"), TOK("NUMEQ","=")]) insert(exptbl, "UNION", [TOK("PLUS", "+"), TOK("PLUS", "+")]) } if \exptbl[next_token.sym] then suspend !exptbl[next_token.sym] else return next_token end # # iparse_tokens: file -> TOK records (a generator) # (stream) -> tokens # # Where file is an open input stream, and tokens are TOK records # holding both the token type and actual token text. # # TOK records contain two parts, a preterminal symbol (the first # "sym" field), and the actual text of the token ("str"). The # parser only pays attention to the sym field, although the # strings themselves get pushed onto the value stack. # # Note the following kludge: Unlike real Icon tokenizers, this # procedure returns syntactially meaningless newlines as TOK # records with a null sym field. Normally they would be ignored. # I wanted to return them so they could be printed on the output # stream, thus preserving the line structure of the original # file, and making later diagnostic messages more usable. # procedure iparse_tokens(stream, getchar) local elem, whitespace, token, last_token, primitives, reserveds static be_tbl, reserved_tbl, operators initial { # Primitive Tokens # primitives := [ ["identifier", "IDENT", "be"], ["integer-literal", "INTLIT", "be"], ["real-literal", "REALLIT", "be"], ["string-literal", "STRINGLIT", "be"], ["cset-literal", "CSETLIT", "be"], ["end-of-file", "EOFX", "" ]] # Reserved Words # reserveds := [ ["break", "BREAK", "be"], ["by", "BY", "" ], ["case", "CASE", "b" ], ["create", "CREATE", "b" ], ["default", "DEFAULT", "b" ], ["do", "DO", "" ], ["else", "ELSE", "" ], ["end", "END", "b" ], ["every", "EVERY", "b" ], ["fail", "FAIL", "be"], ["global", "GLOBAL", "" ], ["if", "IF", "b" ], ["initial", "INITIAL", "b" ], ["invocable", "INVOCABLE", "" ], ["link", "LINK", "" ], ["local", "LOCAL", "b" ], ["next", "NEXT", "be"], ["not", "NOT", "b" ], ["of", "OF", "" ], ["procedure", "PROCEDURE", "" ], ["record", "RECORD", "" ], ["repeat", "REPEAT", "b" ], ["return", "RETURN", "be"], ["static", "STATIC", "b" ], ["suspend", "SUSPEND", "be"], ["then", "THEN", "" ], ["to", "TO", "" ], ["until", "UNTIL", "b" ], ["while", "WHILE", "b" ]] # Operators # operators := [ [":=", "ASSIGN", "" ], ["@", "AT", "b" ], ["@:=", "AUGACT", "" ], ["&:=", "AUGAND", "" ], ["=:=", "AUGEQ", "" ], ["===:=", "AUGEQV", "" ], [">=:=", "AUGGE", "" ], [">:=", "AUGGT", "" ], ["<=:=", "AUGLE", "" ], ["<:=", "AUGLT", "" ], ["~=:=", "AUGNE", "" ], ["~===:=", "AUGNEQV", "" ], ["==:=", "AUGSEQ", "" ], [">>=:=", "AUGSGE", "" ], [">>:=", "AUGSGT", "" ], ["<<=:=", "AUGSLE", "" ], ["<<:=", "AUGSLT", "" ], ["~==:=", "AUGSNE", "" ], ["\\", "BACKSLASH", "b" ], ["!", "BANG", "b" ], ["|", "BAR", "b" ], ["^", "CARET", "b" ], ["^:=", "CARETASGN", "b" ], [":", "COLON", "" ], [",", "COMMA", "" ], ["||", "CONCAT", "b" ], ["||:=", "CONCATASGN","" ], ["&", "CONJUNC", "b" ], [".", "DOT", "b" ], ["--", "DIFF", "b" ], ["--:=", "DIFFASGN", "" ], ["===", "EQUIV", "b" ], ["**", "INTER", "b" ], ["**:=", "INTERASGN", "" ], ["{", "LBRACE", "b" ], ["[", "LBRACK", "b" ], ["|||", "LCONCAT", "b" ], ["|||:=", "LCONCATASGN","" ], ["==", "LEXEQ", "b" ], [">>=", "LEXGE", "" ], [">>", "LEXGT", "" ], ["<<=", "LEXLE", "" ], ["<<", "LEXLT", "" ], ["~==", "LEXNE", "b" ], ["(", "LPAREN", "b" ], ["-:", "MCOLON", "" ], ["-", "MINUS", "b" ], ["-:=", "MINUSASGN", "" ], ["%", "MOD", "" ], ["%:=", "MODASGN", "" ], ["~===", "NOTEQUIV", "b" ], ["=", "NUMEQ", "b" ], [">=", "NUMGE", "" ], [">", "NUMGT", "" ], ["<=", "NUMLE", "" ], ["<", "NUMLT", "" ], ["~=", "NUMNE", "b" ], ["+:", "PCOLON", "" ], ["+", "PLUS", "b" ], ["+:=", "PLUSASGN", "" ], ["?", "QMARK", "b" ], ["<-", "REVASSIGN", "" ], ["<->", "REVSWAP", "" ], ["}", "RBRACE", "e" ], ["]", "RBRACK", "e" ], [")", "RPAREN", "e" ], [";", "SEMICOL", "" ], ["?:=", "SCANASGN", "" ], ["/", "SLASH", "b" ], ["/:=", "SLASHASGN", "" ], ["*", "STAR", "b" ], ["*:=", "STARASGN", "" ], [":=:", "SWAP", "" ], ["~", "TILDE", "b" ], ["++", "UNION", "b" ], ["++:=", "UNIONASGN", "" ], ["$(", "LBRACE", "b" ], ["$)", "RBRACE", "e" ], ["$<", "LBRACK", "b" ], ["$>", "RBRACK", "e" ], ["$", "RHSARG", "b" ], ["%$(", "BEGGLOB", "b" ], ["%$)", "ENDGLOB", "e" ], ["%{", "BEGGLOB", "b" ], ["%}", "ENDGLOB", "e" ], ["%%", "NEWSECT", "be"]] # static be_tbl, reserved_tbl reserved_tbl := table() every elem := !reserveds do insert(reserved_tbl, elem[1], elem[2]) be_tbl := table() every elem := !primitives | !reserveds | !operators do { insert(be_tbl, elem[2], elem[3]) } } /getchar := create { line_number := 0 ! ( 1(!stream, line_number +:=1) || "\n" ) } whitespace := ' \t' /next_c := @getchar | { if \stream then return TOK("EOFX") else fail } repeat { case next_c of { "." : { # Could be a real literal *or* a dot operator. Check # following character to see if it's a digit. If so, # it's a real literal. We can only get away with # doing the dot here because it is not a substring of # any longer identifier. If this gets changed, we'll # have to move this code into do_operator(). # last_token := do_dot(getchar) suspend last_token # write(&errout, "next_c == ", image(next_c)) next } "\n" : { # If do_newline fails, it means we're at the end of # the input stream, and we should break out of the # repeat loop. # every last_token := do_newline(getchar, last_token, be_tbl) do suspend last_token if next_c === &null then break next } "\#" : { # Just a comment. Strip it by reading every character # up to the next newline. The global var next_c # should *always* == "\n" when this is done. # do_number_sign(getchar) # write(&errout, "next_c == ", image(next_c)) next } "\"" : { # Suspend as STRINGLIT everything from here up to the # next non-backslashed quotation mark, inclusive # (accounting for the _ line-continuation convention). # last_token := do_quotation_mark(getchar) suspend last_token # write(&errout, "next_c == ", image(next_c)) next } "'" : { # Suspend as CSETLIT everything from here up to the # next non-backslashed apostrophe, inclusive. # last_token := do_apostrophe(getchar) suspend last_token # write(&errout, "next_c == ", image(next_c)) next } &null : stop("iparse_tokens (lexer): unexpected EOF") default : { # If we get to here, we have either whitespace, an # integer or real literal, an identifier or reserved # word (both get handled by do_identifier), or an # operator. The question of which we have can be # determined by checking the first character. # if any(whitespace, next_c) then { # Like all of the TOK forming procedures, # do_whitespace resets next_c. do_whitespace(getchar, whitespace) # don't suspend any tokens next } if any(&digits, next_c) then { last_token := do_digits(getchar) suspend last_token next } if any(&letters ++ '_', next_c) then { last_token := do_identifier(getchar, reserved_tbl) suspend last_token next } # write(&errout, "it's an operator") last_token := do_operator(getchar, operators) suspend last_token next } } } # If stream argument is nonnull, then we are in the top-level # iparse_tokens(). If not, then we are in a recursive call, and # we should not emit all this end-of-file crap. # if \stream then { return TOK("EOFX") } else fail end # # do_dot: coexpression -> TOK record # getchar -> t # # Where getchar is the coexpression that produces the next # character from the input stream and t is a token record whose # sym field contains either "REALLIT" or "DOT". Essentially, # do_dot checks the next char on the input stream to see if it's # an integer. Since the preceding char was a dot, an integer # tips us off that we have a real literal. Otherwise, it's just # a dot operator. Note that do_dot resets next_c for the next # cycle through the main case loop in the calling procedure. # procedure do_dot(getchar) local token # global next_c # write(&errout, "it's a dot") # If dot's followed by a digit, then we have a real literal. # if any(&digits, next_c := @getchar) then { # write(&errout, "dot -> it's a real literal") token := "." || next_c while any(&digits, next_c := @getchar) do token ||:= next_c if token ||:= (next_c == ("e"|"E")) then { while (next_c := @getchar) == "0" while any(&digits, next_c) do { token ||:= next_c next_c = @getchar } } return TOK("REALLIT", token) } # Dot not followed by an integer; so we just have a dot operator, # and not a real literal. # # write(&errout, "dot -> just a plain dot") return TOK("DOT", ".") end # # do_newline: coexpression x TOK record x table -> TOK records # (getchar, last_token, be_tbl) -> Ts (a generator) # # Where getchar is the coexpression that returns the next # character from the input stream, last_token is the last TOK # record suspended by the calling procedure, be_tbl is a table of # tokens and their "beginner/ender" status, and Ts are TOK # records. Note that do_newline resets next_c. Do_newline is a # mess. What it does is check the last token suspended by the # calling procedure to see if it was a beginner or ender. It # then gets the next token by calling iparse_tokens again. If # the next token is a beginner and the last token is an ender, # then we have to suspend a SEMICOL token. In either event, both # the last and next token are suspended. # procedure do_newline(getchar, last_token, be_tbl) local next_token # global next_c # write(&errout, "it's a newline") # Go past any additional newlines. # while next_c == "\n" do { # NL can be the last char in the getchar stream; if it *is*, # then signal that it's time to break out of the repeat loop # in the calling procedure. # next_c := @getchar | { next_c := &null fail } suspend TOK(&null, next_c == "\n") } # If there was a last token (i.e. if a newline wasn't the first # character of significance in the input stream), then check to # see if it was an ender. If so, then check to see if the next # token is a beginner. If so, then suspend a TOK("SEMICOL") # record before suspending the next token. # if find("e", be_tbl[(\last_token).sym]) then { # write(&errout, "calling iparse_tokens via do_newline") # &trace := -1 # First arg to iparse_tokens can be null here. \ (next_token := iparse_tokens(&null, getchar)).sym if \next_token then { # write(&errout, "call of iparse_tokens via do_newline yields ", # ximage(next_token)) if find("b", be_tbl[next_token.sym]) then suspend TOK("SEMICOL", "\n") # # See below. If this were like the real Icon parser, # the following line would be commented out. # else suspend TOK(&null, "\n") return next_token } else { # # If this were a *real* Icon tokenizer, it would not emit # any record here, but would simply fail. Instead, we'll # emit a dummy record with a null sym field. # return TOK(&null, "\n") # &trace := 0 # fail } } # See above. Again, if this were like Icon's own tokenizer, we # would just fail here, and not return any TOK record. # # &trace := 0 return TOK(&null, "\n") # fail end # # do_number_sign: coexpression -> &null # getchar -> # # Where getchar is the coexpression that pops characters off the # main input stream. Sets the global variable next_c. This # procedure simply reads characters until it gets a newline, then # returns with next_c == "\n". Since the starting character was # a number sign, this has the effect of stripping comments. # procedure do_number_sign(getchar) # global next_c # write(&errout, "it's a number sign") while next_c ~== "\n" do { next_c := @getchar } # Return to calling procedure to cycle around again with the new # next_c already set. Next_c should always be "\n" at this point. return end # # do_quotation_mark: coexpression -> TOK record # getchar -> t # # Where getchar is the coexpression that yields another character # from the input stream, and t is a TOK record with "STRINGLIT" # as its sym field. Puts everything upto and including the next # non-backslashed quotation mark into the str field. Handles the # underscore continuation convention. # procedure do_quotation_mark(getchar) local token # global next_c # write(&errout, "it's a string literal") token := "\"" next_c := @getchar repeat { if next_c == "\n" & token[-1] == "_" then { token := token[1:-1] while any('\t ', next_c := @getchar) next } else { if slshupto('"', token ||:= next_c, 2) then { next_c := @getchar # resume outermost (repeat) loop in calling procedure, # with the new (here explicitly set) next_c return TOK("STRINGLIT", token) } next_c := @getchar } } end # # do_apostrophe: coexpression -> TOK record # getchar -> t # # Where getchar is the coexpression that yields another character # from the input stream, and t is a TOK record with "CSETLIT" # as its sym field. Puts everything upto and including the next # non-backslashed apostrope into the str field. # procedure do_apostrophe(getchar) local token # global next_c # write(&errout, "it's a cset literal") token := "'" next_c := @getchar repeat { if next_c == "\n" & token[-1] == "_" then { token := token[1:-1] while any('\t ', next_c := @getchar) next } else { if slshupto("'", token ||:= next_c, 2) then { next_c := @getchar # Return & resume outermost containing loop in calling # procedure w/ new next_c. return TOK("CSETLIT", token) } next_c := @getchar } } end # # do_digits: coexpression -> TOK record # getchar -> t # # Where getchar is the coexpression that produces the next char # on the input stream, and where t is a TOK record containing # either "REALLIT" or "INTLIT" in its sym field, and the text of # the numeric literal in its str field. # procedure do_digits(getchar) local token, tok_record, extras, digits, over # global next_c # For bases > 16 extras := "AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz" # Assume integer literal until proven otherwise.... tok_record := TOK("INTLIT") # write(&errout, "it's an integer or real literal") token := ("0" ~== next_c) | "" while any(&digits, next_c := @getchar) do token ||:= next_c if token ||:= (next_c == ("R"|"r")) then { digits := &digits if over := ((10 < token[1:-1]) - 10) * 2 then digits ++:= extras[1:over+1] | extras next_c := @getchar if next_c == "-" then { token ||:= next_c next_c := @getchar } while any(digits, next_c) do { token ||:= next_c next_c := @getchar } } else { if token ||:= (next_c == ".") then { while any(&digits, next_c := @getchar) do token ||:= next_c tok_record := TOK("REALLIT") } if token ||:= (next_c == ("e"|"E")) then { next_c := @getchar if next_c == "-" then { token ||:= next_c next_c := @getchar } while any(&digits, next_c) do { token ||:= next_c next_c := @getchar } tok_record := TOK("REALLIT") } } tok_record.str := ("" ~== token) | "0" return tok_record end # # do_whitespace: coexpression x cset -> &null # getchar x whitespace -> &null # # Where getchar is the coexpression producing the next char on # the input stream. Do_whitespace just repeats until it finds a # non-whitespace character, whitespace being defined as # membership of a given character in the whitespace argument (a # cset). # procedure do_whitespace(getchar, whitespace) # write(&errout, "it's junk") while any(whitespace, next_c) do next_c := @getchar return end # # do_identifier: coexpression x table -> TOK record # (getchar, reserved_tbl) -> t # # Where getchar is the coexpression that pops off characters from # the input stream, reserved_tbl is a table of reserved words # (keys = the string values, values = the names qua symbols in # the grammar), and t is a TOK record containing all subsequent # letters, digits, or underscores after next_c (which must be a # letter or underscore). Note that next_c is global and gets # reset by do_identifier. # procedure do_identifier(getchar, reserved_tbl) local token # global next_c # write(&errout, "it's an indentifier") token := next_c while any(&letters ++ &digits ++ '_', next_c := @getchar) do token ||:= next_c return TOK(\reserved_tbl[token], token) | TOK("IDENT", token) end # # do_operator: coexpression x list -> TOK record # (getchar, operators) -> t # # Where getchar is the coexpression that produces the next # character on the input stream, operators is the operator list, # and where t is a TOK record describing the operator just # scanned. Calls recognop, which creates a DFSA to recognize # valid Icon operators. Arg2 (operators) is the list of lists # containing valid Icon operator string values and names (see # above). # procedure do_operator(getchar, operators) local token, elem token := next_c # Go until recognop fails. while elem := recognop(operators, token, 1) do token ||:= (next_c := @getchar) # write(&errout, ximage(elem)) if *\elem = 1 then return TOK(elem[1][2], elem[1][1]) else fail end record dfstn_state(b, e, tbl) record start_state(b, e, tbl, master_list) # # recognop: list x string x integer -> list # (l, s, i) -> l2 # # Where l is the list of lists created by the calling procedure # (each element contains a token string value, name, and # beginner/ender string), where s is a string possibly # corresponding to a token in the list, where i is the position in # the elements of l where the operator string values are recorded, # and where l2 is a list of elements from l that contain operators # for which string s is an exact match. Fails if there are no # operators that s is a prefix of, but returns an empty list if # there just aren't any that happen to match exactly. # # What this does is let the calling procedure just keep adding # characters to s until recognop fails, then check the last list # it returned to see if it is of length 1. If it is, then it # contains list with the vital stats for the operator last # recognized. If it is of length 0, then string s did not # contain any recognizable operator. # procedure recognop(l, s, i) local current_state, master_list, c, result, j static dfstn_table initial dfstn_table := table() /i := 1 # See if we've created an automaton for l already. /dfstn_table[l] := start_state(1, *l, &null, &null) & { dfstn_table[l].master_list := sortf(l, i) } current_state := dfstn_table[l] # Save master_list, as current_state will change later on. master_list := current_state.master_list s ? { while c := move(1) do { # Null means that this part of the automaton isn't # complete. # if /current_state.tbl then create_arcs(master_list, i, current_state, &pos) # If the table has been clobbered, then there are no arcs # leading out of the current state. Fail. # if current_state.tbl === 0 then fail # write(&errout, "c = ", image(c)) # write(&errout, "table for current state = ", # ximage(current_state.tbl)) # If we get to here, the current state has arcs leading # out of it. See if c is one of them. If so, make the # node to which arc c is connected the current state. # Otherwise fail. # current_state := \current_state.tbl[c] | fail } } # Return possible completions. # result := list() every j := current_state.b to current_state.e do { if *master_list[j][i] = *s then put(result, master_list[j]) } # return empty list if nothing the right length is found return result end # # create_arcs: fill out a table of arcs leading out of the current # state, and place that table in the tbl field for # current_state # procedure create_arcs(master_list, field, current_state, POS) local elem, i, first_char, old_first_char current_state.tbl := table() old_first_char := "" every elem := master_list[i := current_state.b to current_state.e][field] do { # Get the first character for the current position (note that # we're one character behind the calling routine; hence # POS-1). # first_char := elem[POS-1] | next # If we have a new first character, create a new arc out of # the current state. # if first_char ~== old_first_char then { # Store the start position for the current character. current_state.tbl[first_char] := dfstn_state(i) # Store the end position for the old character. (\current_state.tbl[old_first_char]).e := i-1 old_first_char := first_char } } (\current_state.tbl[old_first_char]).e := i # Clobber table with 0 if no arcs were added. current_state.tbl := (*current_state.tbl = 0) return current_state end icon-9.4.3/ipl/procs/gdl.icn0000664000175000017500000000752107274062401015165 0ustar chrishchrish############################################################################ # # File: gdl.icn # # Subject: Procedures to get directory lists # # Author: Richard L. Goerwitz # # Date: May 2, 2001 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # Version: 1.3 # ############################################################################ # # Gdl returns a list containing everything in a directory (whose name # must be passed as an argument to gdl). Nothing fancy. I use this file # as a template, modifying the procedures according to the needs of the # program in which they are used. # ############################################################################ # # Requires: UNIX or MS-DOS # ############################################################################ procedure gdl(dir) local getdir getdir := set_getdir_by_os() return getdir(dir) end procedure set_getdir_by_os() # Decide how to get a directory, based on whether we are running # under Unix or MS-DOS. if find("UNIX", &features) then return unix_get_dir else if find("MS-DOS", &features) then return msdos_get_dir else stop("Your operating system is not (yet) supported.") end procedure msdos_get_dir(dir) # Returns a sorted list of all filenames (full paths included) in # directory "dir." The list is sorted. Fails on invalid or empty # directory. Aborts if temp file cannot be opened. # # Temp files can be directed to one or another directory either by # manually setting the variable temp_dir below, or by setting the # value of the environment variable TEMPDIR to an appropriate # directory name. local in_dir, filename_list, line, temp_name, filename static temp_dir initial { temp_dir := (trim(map(getenv("TEMPDIR"), "/", "\\"), '\\') || "\\") | ".\\" } # Get name of tempfile to be used. temp_name := get_dos_tempname(temp_dir) | stop("No more available tempfile names!") # Make sure we have an unambiguous directory name, with backslashes # instead of Unix-like forward slashes. dir := trim(map(dir, "/", "\\"), '\\') # Put dir listing into a temp file. system("dir "||dir||" > "||temp_name) # Put tempfile entries into a list, removing blank- and # space-initial lines. Exclude directories (i.e. return file # names only). in_dir := open(temp_name,"r") | stop("Can't open temp file in directory ",temp_dir,".") filename_list := list() every filename := ("" ~== !in_dir) do { match(" ",filename) | find(" ", filename) & next # Exclude our own tempfiles (may not always be appropriate). filename ?:= trim(trim(tab(10)) || "." || tab(13), '. ') put(filename_list, map(dir || filename)) } # Clean up. close(in_dir) & remove(temp_name) # Check to be sure we actually managed to read some files. if *filename_list = 0 then fail else return sort(filename_list) end procedure get_dos_tempname(dir) local temp_name, temp_file # Don't clobber existing files. Get a unique temp file name for # use as a temporary storage site. every temp_name := dir || "icondir." || right(string(1 to 999),3,"0") do { temp_file := open(temp_name,"r") | break close(temp_file) } return \temp_name end procedure unix_get_dir(dir) local filename_list, in_dir, filename dir := trim(dir, '/') || "/" filename_list := list() in_dir := open("/bin/ls -F "||dir, "pr") every filename := ("" ~== !in_dir) do { match("/",filename,*filename) & next put(filename_list, trim(dir || filename, '*')) } close(in_dir) if *filename_list = 0 then fail else return filename_list end icon-9.4.3/ipl/procs/datefns.icn0000664000175000017500000001417707140713040016042 0ustar chrishchrish############################################################################ # # File: datefns.icn # # Subject: Procedure for dates # # Author: Charles Hethcoat # # Date: August 14, 1995 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # datefns.icn - a collection of date functions # # Adaptor: Charles L Hethcoat III # June 12, 1995 # Taken from various sources as attributed below. # # All date and calendar functions use the "date_rec" structure defined # below. # # Note: I adapted the procedures "julian" and "unjulian" sometime in 1994 # from "Numerical Recipes in C." Some time later I discovered them # (under slightly different names) in Version 9 of the Icon Library # (Ralph Griswold, author). I am including mine for what they are worth. # That'll teach me to wait! # ############################################################################ record date_rec(year, month, day, yearday, monthname, dayname) global monthlist # Maps month numbers into month names global monthtbl # Maps month names into numbers 1-12 global dow # Maps 1-7 into Sunday-Saturday global cum_days # Cum. day counts for month end, leap & non-leap yrs. # initdate - call to initialize the global data before using other fns. # See "The C Programming Language," by Kernighan and Richie (Wylie, # 1978) procedure initdate() monthlist := ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"] monthtbl := table() monthtbl["January"] := 1 monthtbl["February"] := 2 monthtbl["March"] := 3 monthtbl["April"] := 4 monthtbl["May"] := 5 monthtbl["June"] := 6 monthtbl["July"] := 7 monthtbl["August"] := 8 monthtbl["September"] := 9 monthtbl["October"] := 10 monthtbl["November"] := 11 monthtbl["December"] := 12 dow := ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"] cum_days := [ [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365], [0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366] ] return end # today - obtain computationally-useful values for today's date procedure today() local junk, datestruct datestruct := date_rec() &dateline ? { # &dateline is in a fixed format: junk := tab(upto(&letters)) datestruct.dayname := tab(many(&letters)) junk := tab(upto(&letters)) datestruct.monthname := tab(many(&letters)) junk := tab(upto(&digits)) datestruct.day := tab(many(&digits)) junk := tab(upto(&digits)) datestruct.year := tab(many(&digits)) } datestruct.month := monthtbl[datestruct.monthname] datestruct.yearday := doy(datestruct.year, datestruct.month, datestruct.day) return datestruct end # The next two routines have been adapted from "Numerical Recipes in C," # by Press, Flannery, Teukolsky, and Vetterling (Cambridge, 1988). The # following quote is from page 10: # Astronomers number each 24-hour period, starting and ending at noon, # with a unique integer, the Julian Day Number. Julian Day Zero was # a very long time ago; a convenient reference point is that Julian # Day 2440000 began at noon of May 23, 1968. If you know the Julian # Day Number that began at noon of a given calendar date, then the day # of the week of that date is obtained by adding 1 and taking the result # modulo base 7; a zero answer corresponds to Sunday, 1 to Monday, ..., # 6 to Saturday. # The C code presented in that book heavily uses the automatic conversion # of real (floating point) numbers to integers by truncation. Since Icon # doesn't do this, explicit type conversions are required. # julian - convert a date_rec to a Julian day number procedure julian(date) local jul local ja, jy, jm, z1, z2 if date.year = 0 then fail if date.year < 0 then date.year +:= 1 if date.month > 2 then { jy := date.year jm := date.month + 1 } else { jy := date.year - 1 jm := date.month + 13 } z1 := real(integer(365.25*jy)) z2 := real(integer(30.6001*jm)) jul := integer(z1 + z2 + date.day + 1720995) if date.day + 31*(date.month + 12*date.year) >= 588829 then { ja := integer(0.01*jy) jul +:= 2 - ja + integer(0.25*ja) } return jul end # unjulian - produce a date from the Julian day number procedure unjulian(julianday) local ja, jalpha, jb, jc, jd, je # integers all local datestruct datestruct := date_rec() if julianday >= 2299161 then { jalpha := integer((real(julianday - 1867216) - 0.25)/36524.25) ja := julianday + 1 + jalpha - integer(0.25*jalpha) } else ja := julianday jb := ja + 1524 jc := integer(6680.0 + (real(jb - 2439870) - 122.1)/365.25) jd := 365*jc + integer(0.25*jc) je := integer((jb - jd)/30.6001) datestruct.day := jb - jd - integer(30.6001*je) datestruct.month := je - 1 if datestruct.month > 12 then datestruct.month -:= 12 datestruct.year := jc - 4715 if datestruct.month > 2 then datestruct.year -:= 1 if datestruct.year <= 0 then datestruct.year -:= 1 # Get the day number in the year: datestruct.yearday := doy(datestruct.year, datestruct.month, datestruct.day) # Get the name of the month: datestruct.monthname := monthlist[datestruct.month] # Calculate the day of the week: datestruct.dayname := dow[(julianday + 1) % 7 + 1] return datestruct end # doy - return day-of-year from (year, month, day) # Adapted from K&R procedure doy(year, month, day) local leap, y, m, d y := integer(year) m := integer(month) d := integer(day) leap := if (y % 4 = 0 & y % 100 ~= 0) | y % 400 = 0 then 2 # leap year else 1 # non-leap year return cum_days[leap][m] + d end # wrdate - write out a basic date string with a leadin string procedure wrdate(leadin, date) write(leadin, " ", date.year, " ", date.monthname, " ", date.day) end icon-9.4.3/ipl/procs/gen.icn0000664000175000017500000001443107140713037015166 0ustar chrishchrish############################################################################ # # File: gen.icn # # Subject: Procedures for meta-variant code generation # # Author: Ralph E. Griswold # # Date: April 30, 1993 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # These procedures are for use with code produced by a meta-variant # translator. As given here, they produce an identity translation. # Modifications can be made to effect variant translations. # ############################################################################ # main() calls program(), which is produced by the meta-variant # translation. procedure main() program() end procedure Alt_(e1, e2) # e1 | e2 return "(" || e1 || "|" || e2 || ")" end procedure Apply_(e1, e2) # e1 ! e2 return "(" || e1 || "!" || e2 || ")" end procedure Asgnop_(op, e1, e2) # e1 op e2 return "(" || e1 || " " || op || " " || | e2 || ")" end procedure Augscan_(e1, e2) # e1 ?:= e2 return "(" || e1 || " ?:= " || e2 || ")" end procedure Bamper_(e1, e2) # e1 & e2 return "(" || e1 || " & " || e2 || ")" end procedure Binop_(op, e1, e2) # e1 op e2 return "(" || e1 || " " || op || " " || e2 || ")" end procedure Break_(e) # break e return "break " || e end procedure Case_(e, clist) # case e of { caselist } return "case " || e || " of {" || clist || "}" end procedure Cclause_(e1, e2) # e1 : e2 return e1 || " : " || e2 || "\n" end procedure Clist_(e1, e2) # e1 ; e2 in case list return e1 || ";" || e2 end procedure Clit_(e) # 's' return "'" || e || "'" end procedure Compound_(es[]) # { e1; e2; ... } local result if *es = 0 then return "{}\n" result := "{\n" every result ||:= !es || "\n" return result || "}\n" end procedure Create_(e) # create e return "create " || e end procedure Default_(e) # default: e return "default: " || e end procedure End_() # end write("end") return end procedure Every_(e) # every e return "every " || e end procedure Every_Do_(e1, e2) # every e1 do e2 return "every " || e1 || " do " || e2 end procedure Fail_() # fail return "fail" end procedure Field_(e1, e2) # e . f return "(" || e1 || "." || e2 || ")" end procedure Global_(vs[]) # global v1, v2, ... local result result := "" every result ||:= !vs || ", " write("global ", result[1:-2]) return end procedure If_(e1, e2) # if e1 then e2 return "if " || e1 || " then " || e2 end procedure If_Else_(e1, e2, e3) # if e1 then e2 else e3 return "if " || e1 || " then " || e2 || " else " || e3 end procedure Ilit_(e) # i return e end procedure Initial_(s) # initial e write("initial ", s) return end procedure Invoke_(e0, es[]) # e0(e1, e2, ...) local result if *es = 0 then return e0 || "()" result := "" every result ||:= !es || ", " return e0 || "(" || result[1:-2] || ")" end procedure Key_(s) # &s return "&" || s end procedure Limit_(e1, e2) # e1 \ e2 return "(" || e1 || "\\" || e2 || ")" end procedure Link_(vs) # link "v1, v2, ..." (problem) write("link ", vs) end procedure List_(es[]) # [e1, e2, ... ] local result if *es = 0 then return "[]" result := "" every result ||:= !es || ", " return "[" || result[1:-2] || "]" end procedure Local_(vs[]) # local v1, v2, ... local result result := "" every result ||:= !vs || ", " write("local ", result[1:-2]) return end procedure Next_() # next return "next" end procedure Null_() # &null return "" end procedure Paren_(es[]) # (e1, e2, ... ) local result if *es = 0 then return "()" result := "" every result ||:= !es || ", " return "(" || result[1:-2] || ")" end procedure Pdco_(e0, es[]) # e0{e1, e2, ... } local result if *es = 0 then return e0 || "{}" result := "" every result ||:= !es || ", " return e0 || "{" || result[1:-2] || "}" end procedure Proc_(s, es[]) # procedure s(v1, v2, ...) local result, e if *es = 0 then write("procedure ", s, "()") result := "" every e := !es do if e == "[]" then result[-2:0] := e || ", " else result ||:= (\e | "") || ", " write("procedure ", s, "(", result[1:-2], ")") return end procedure Record_(s, es[]) # record s(v1, v2, ...) local result, field if *es = 0 then write("record ", s, "()") result := "" every field := !es do result ||:= (\field | "") || ", " write("record ", s, "(", result[1:-2], ")") return end procedure Reduce_(s[]) # used in code generation every write(!s) return end procedure Repeat_(e) # repeat e return "repeat " || e end procedure Return_(e) # return e return "return " || e end procedure Rlit_(e) return e end procedure Scan_(e1, e2) # e1 ? e2 return "(" || e1 || " ? " || e2 || ")" end procedure Section_(op, e1, e2, e3) # e1[e2 op e3] return e1 || "[" || e2 || op || e3 || "]" end procedure Slit_(s) # "s" return image(s) end procedure Static_(ev[]) # static v1, v2, .. local result result := "" every result ||:= !ev || ", " write("static ", result[1:-2]) return end procedure Subscript_(e1, e2) # e1[e2] return e1 || "[" || e2 || "]" end procedure Suspend_(e) # suspend e return "suspend " || e end procedure Suspend_Do_(e1, e2) # suspend e1 do e2 return "suspend " || e1 || " do " || e2 end procedure To_(e1, e2) # e1 to e2 return "(" || e1 || " to " || e2 || ")" end procedure To_By_(e1, e2, e3) # e1 to e2 by e3 return "(" || e1 || " to " || e2 || " by " || e3 || ")" end procedure Repalt_(e) # |e return "(|" || e || ")" end procedure Unop_(op, e) # op e return "(" || op || e || ")" end procedure Not_(e) # not e return "not(" || e || ")" end procedure Until_(e) # until e return "until " || e end procedure Until_Do_(e1, e2) # until e1 do e2 return "until " || e1 || " do " || e2 end procedure Var_(s) # v return s end procedure While_(e) # while e return "while " || e end procedure While_Do_(e1, e2) # while e1 do e2 return "while " || e1 || " do " || e2 end icon-9.4.3/ipl/procs/math.icn0000664000175000017500000000300707140713036015342 0ustar chrishchrish############################################################################ # # File: math.icn # # Subject: Procedures for mathematical computations # # Author: Ralph E. Griswold # # Date: December 26, 1995 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # binocoef(n, k) produces the binomial coefficient n over k. It # fails unless 0 <= k <= n. # # cosh(r) produces the hyperbolic cosine of r. # # sinh(r) produces the hyperbolic sine of r. # # tanh(r) produces the hyperbolic tangent of r. # # ############################################################################ # # Requires: Large integer arithmetic for binocoef(n, k) for all but small # values of n and k. # ############################################################################ # # Links: factors # ############################################################################ link factors procedure binocoef(n, k) #: binomial coefficient k := integer(k) | fail n := integer(n) | fail if (k = 0) | (n = k) then return 1 if 0 <= k <= n then return factorial(n) / (factorial(k) * factorial(n - k)) else fail end procedure cosh(r) #: hyperbolic cosine return (&e ^ r + &e ^ -r) / 2 end procedure sinh(r) #: hyperbolic sine return (&e ^ r - &e ^ -r) / 2 end procedure tanh(r) #: hyperbolic tanh return (&e ^ r - &e ^ -r) / (&e ^ r + &e ^ -r) end icon-9.4.3/ipl/procs/records.icn0000664000175000017500000000261207561520205016054 0ustar chrishchrish############################################################################ # # File: records.icn # # Subject: Procedures to manipulate records # # Authors: Ralph E. Griswold and Gregg M. Townsend # # Date: November 4, 2002 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # Contributor: Paul Abrahams # ############################################################################ # # field(R, i) returns the name of the ith field of R. # # fieldnum(R, s) returns the index of the field named s in record R. # # movecorr(R1, R2) copies values from the fields of record R1 into # fields of the same names (if any) in record R2, and returns R2. # ############################################################################ procedure field(R, i) #: return name of field R[i] name(R[i]) ? { tab(upto('.') + 1) return tab(0) } end procedure fieldnum(R, s) #: return index of field R.s local i R := copy(R) every i := 1 to *R do R[i] := i return R[s] end procedure movecorr(R1, R2) #: move corresponding record fields local s static name initial name := proc("name", 0) # protect attractive name every s := (name(!R1) ? (tab(upto('.') + 1) & tab(0))) do R2[s] := R1[s] return R2 end icon-9.4.3/ipl/procs/bitstr.icn0000664000175000017500000001106207140713037015721 0ustar chrishchrish############################################################################ # # File: bitstr.icn # # Subject: Procedures for bits in Icon strings # # Author: Robert J. Alexander # # Date: August 14, 1996 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # Procedures for working with strings made up of numeric values # represented by strings of an arbitrary number of bits, stored without # regard to character boundaries. # # In conjunction with the "large integers" feature of Icon, this # facility can deal with bitstring segments of arbitrary size. If # "large integers" are not supported, bitstring segments (i.e. the # nbits parameter of BitStringGet and BitStringPut) wider that the # integer size of the platform are likely to produce incorrect results. # ############################################################################ # # Usage of BitStringPut, by example: # # record bit_value(value, nbits) # ... # bitString := BitString("") # while value := get_new_value() do # loop to append to string # BitStringPut(bitString, value.nbits, value.value) # resultString := BitStringPut(bitString) # output any buffered bits # # Note the interesting effect that BitStringPut(bitString), as well as # producing the complete string, pads the buffered string to an even # character boundary. This can be dune during construction of a bit # string if the effect is desired. # # The "value" argument defaults to zero. # ############################################################################ # # Usage of BitStringGet, by example: # # record bit_value(value, nbits) # ... # bitString := BitString(string_of_bits) # while value := BitStringGet(bitString, nbits) do # # do something with value # # BitStringGet fails when too few bits remain to satisfy a request. # However, if bits remain in the string, subsequent calls with fewer # bits requested may succeed. A negative "nbits" value gets the value # of the entire remainder of the string, to the byte boundary at its # end. # ############################################################################ # # See also: bitstrm.icn # ############################################################################ record BitString(s, buffer, bufferBits) procedure BitStringPut(bitString, nbits, value) local outvalue # # Initialize. # /bitString.buffer := bitString.bufferBits := 0 # # If this is "close" call ("nbits" is null), flush buffer, # reinitialize, and return the bit string with the final character # value zero padded on the right. # if /nbits then { if bitString.bufferBits > 0 then bitString.s ||:= char(ishift(bitString.buffer, 8 - bitString.bufferBits)) bitString.buffer := bitString.bufferBits := 0 return bitString.s } # # Merge new value into buffer. # /value := 0 bitString.buffer := ior(ishift(bitString.buffer, nbits), value) bitString.bufferBits +:= nbits # # Output bits. # while bitString.bufferBits >= 8 do { bitString.s ||:= char(outvalue := ishift(bitString.buffer, 8 - bitString.bufferBits)) bitString.buffer := ixor(bitString.buffer, ishift(outvalue, bitString.bufferBits - 8)) bitString.bufferBits -:= 8 } return end procedure BitStringGet(bitString, nbits) local value, save, i # # Initialize. # /bitString.buffer := bitString.bufferBits := 0 # # Get more data if necessary. # save := copy(bitString) while nbits < 0 | bitString.bufferBits < nbits do { (bitString.buffer := ior(ishift(bitString.buffer, 8), ord(bitString.s[1]))) | { # # There aren't enough bits left in the file. Restore the # BitString to its state before the call (in case he wants to # try again), and fail. # if nbits >= 0 then { every i := 1 to *bitString do bitString[i] := save[i] fail } else { bitString.s := "" bitString.bufferBits := value := 0 value :=: bitString.buffer return value } } bitString.s[1] := "" bitString.bufferBits +:= 8 } # # Extract value from buffer and return. # value := ishift(bitString.buffer, nbits - bitString.bufferBits) bitString.buffer := ixor(bitString.buffer, ishift(value, bitString.bufferBits - nbits)) bitString.bufferBits -:= nbits return value end icon-9.4.3/ipl/procs/reassign.icn0000664000175000017500000000247007274076347016246 0ustar chrishchrish############################################################################# # # File: reassign.icn # # Subject: Procedures to access RE groupings and format into a string # # Author: David A. Gamey # # Date: May 2, 2001 # ############################################################################# # # This file is in the public domain. # ############################################################################# # # Descriptions: # # ReAssign( s ) : s2 # # Replaces sequences of \n in s with the corresponding parenthesis # groups from the last regular expression match/find (if one exists). # # Special characters: # \n use nth parenthesis group # \\ escaped \ # \n.i nth group followed by a number # # ############################################################################# # # Links: regexp # ############################################################################ link regexp procedure ReAssign( s ) local s1, n s1 := "" s ? { while s1 := 1( tab(upto('\\')), move(1) ) do { if s1 ||:= ="\\" then next if n := integer(tab(many(&digits))) then { n := Re_ParenGroups[n] s1 ||:= n if ( =".", tab(any(&digits)) ) then move(-1) } } return s1 ||:= tab(0) } end icon-9.4.3/ipl/procs/divide.icn0000664000175000017500000000165707424071014015664 0ustar chrishchrish############################################################################ # # File: divide.icn # # Subject: Procedure to perform long division # # Author: Ralph E. Griswold # # Date: March 29, 2000 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # Doesn't get the decimal point. Not sure what the padding does; # to study. # ############################################################################ # # Requires: Large integer arithmetic, potentially # ############################################################################ procedure divide(i, j, k) # long division local q, pad /k := 5 q := "" pad := 20 i ||:= repl("0", pad) every 1 to k do { q ||:= i / j i %:= j if i = 0 then break } return q[1:-pad] end icon-9.4.3/ipl/procs/stripcom.icn0000664000175000017500000000323407140713037016254 0ustar chrishchrish############################################################################ # # File: stripcom.icn # # Subject: Procedures to strip comments from Icon line # # Author: Richard L. Goerwitz # # Date: March 3, 1996 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # Version: 1.5 # ############################################################################ # # Strip commented-out portion of a line of Icon code. Fails on lines # which, either stripped or otherwise, come out as an empty string. # ############################################################################ # # BUGS: Can't handle lines ending in an underscore as part of a # broken string literal, since stripcom is not intended to be used # on sequentially read files. It simply removes comments from indi- # vidual lines. # ############################################################################ # To preserve parallelism between file and procedure names. procedure stripcom(s) return strip_comments(s) end # The original name - procedure strip_comments(s) local i, j, c, c2, s2 s ? { tab(many(' \t')) pos(0) & fail find("#") | (return trim(tab(0),' \t')) match("#") & fail (s2 <- tab(find("#"))) ? { c2 := &null while tab(upto('\\"\'')) do { case c := move(1) of { "\\" : { if match("^") then move(2) else move(1) } default: { if \c2 then (c == c2, c2 := &null) else c2 := c } } } /c2 } return "" ~== trim((\s2 | tab(0)) \ 1, ' \t') } end icon-9.4.3/ipl/procs/bincvt.icn0000664000175000017500000000321707140713037015702 0ustar chrishchrish############################################################################ # # File: bincvt.icn # # Subject: Procedures to convert binary data # # Author: Robert J. Alexander # # Date: October 16, 1996 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # unsigned() -- Converts binary byte string into unsigned integer. # Detects overflow if number is too large. # # This procedure is normally used for processing of binary data # read from a file. # # raw() -- Puts raw bits of characters of string s into an integer. If # the size of s is less than the size of an integer, the bytes are put # into the low order part of the integer, with the remaining high order # bytes filled with zero. If the string is too large, the most # significant bytes will be lost -- no overflow detection. # # This procedure is normally used for processing of binary data # read from a file. # # rawstring() -- Creates a string consisting of the raw bits in the low # order "size" bytes of integer i. # # This procedure is normally used for processing of binary data # to be written to a file. # ############################################################################ procedure unsigned(s) local i i := 0 every i := ord(!s) + i * 256 return i end procedure raw(s) local i i := 0 every i := ior(ord(!s),ishift(i,8)) return i end procedure rawstring(i,size) local s s := "" every 1 to size do { s := char(iand(i,16rFF)) || s i := ishift(i,-8) } return s end icon-9.4.3/ipl/procs/array.icn0000664000175000017500000000302707140713036015531 0ustar chrishchrish############################################################################ # # File: array.icn # # Subject: Procedures for n-dimensional arrays # # Author: Ralph E. Griswold # # Date: April 30, 1993 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # create_array([lbs], [ubs], value) creates a n-dimensional array # with the specified lower bounds, upper bounds, and with each array element # having the specified initial value. # # ref_array(A, i1, i2, ...) references the i1-th i2-th ... element of A. # ############################################################################ record array(structure, lbs) procedure create_array(lbs, ubs, value) local lengths, i if (*lbs ~= *ubs) | (*lbs = 0) then stop("*** bad specification") lengths :=list(*lbs) every i := 1 to *lbs do lengths[i] := ubs[i] - lbs[i] + 1 return array(create_struct(lengths, value), lbs) end procedure create_struct(lengths, value) local A lengths := copy(lengths) A := list(get(lengths), value) if *lengths > 0 then every !A := create_struct(lengths, value) return A end procedure ref_array(A, subscrs[]) local lbs, i, A1 if *A.lbs ~= *subscrs then stop("*** bad specification") lbs := A.lbs A1 := A.structure every i := 1 to *subscrs - 1 do A1 := A1[subscrs[i] - lbs[i] + 1] | fail return A1[subscrs[-1] - lbs[-1] + 1] end icon-9.4.3/ipl/procs/converge.icn0000664000175000017500000000214207140717301016217 0ustar chrishchrish############################################################################ # # File: converge.icn # # Subject: Procedure to produce continued-fraction convergents # # Author: Ralph E. Griswold # # Date: June 7, 2000 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # This procedure produces continued-fraction convergents from a list # of partial quotients. # ############################################################################ # # Links: rational # ############################################################################ link rational procedure converge(seq) #: continued-fraction convergents local prev_p, prev_q, p, q, t seq := copy(seq) prev_p := [0, 1] prev_q := [1, 0] while t := get(seq) do { p := t * prev_p[2] + prev_p[1] q := t * prev_q[2] + prev_q[1] suspend rational(p, q, 1) prev_p[1] := prev_p[2] prev_p[2] := p prev_q[1] := prev_q[2] prev_q[2] := q } end icon-9.4.3/ipl/procs/gener.icn0000664000175000017500000000314007450115327015512 0ustar chrishchrish############################################################################ # # File: gener.icn # # Subject: Procedures to generate miscellaneous sequences # # Author: Ralph E. Griswold # # Date: March 25, 2002 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # These procedures generate sequences of results. # # days() days of the week. # # hex() sequence of hexadecimal codes for numbers # from 0 to 255 # # label(s,i) sequence of labels with prefix s starting at i # # multii(i, j) sequence of i * j i's # # months() months of the year # # octal() sequence of octal codes for numbers from 0 to 255 # # star(s) sequence consisting of the closure of s # starting with the empty string and continuing # in lexical order as given in s # ############################################################################ procedure days() suspend "Sunday" | "Monday" | "Tuesday" | "Wednesday" | "Thursday" | "Friday" | "Saturday" end procedure hex() suspend !"0123456789abcdef" || !"0123456789abcdef" end procedure label(s,i) suspend s || (i | (i +:= |1)) end procedure multii(i, j) suspend (i to i * j) & i end procedure months() suspend "January" | "February" | "March" | "April" | "May" | "June" | "July" | "August" | "September" | "October" | "November" | "December" end procedure octal() suspend (0 to 3) || (0 to 7) || (0 to 7) end procedure star(s) suspend "" | (star(s) || !s) end icon-9.4.3/ipl/procs/core.icn0000664000175000017500000000174107142616021015342 0ustar chrishchrish############################################################################ # # File: core.icn # # Subject: Procedures for general application # # Author: Gregg M. Townsend # # Date: August 4, 2000 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # Links to core modules of the basic part of the library, as defined # in the Icon Language book (3/e, p.179) and Graphics book (p.47). # ############################################################################ # # Links: convert, datetime, factors, io, lists, math, numbers, # random, records, scan, sets, sort, strings, tables # ############################################################################ link convert link datetime link factors link io link lists link math link numbers link random link records link scan link sets link sort link strings link tables icon-9.4.3/ipl/procs/longstr.icn0000664000175000017500000000476007140713036016110 0ustar chrishchrish############################################################################ # # File: longstr.icn # # Subject: Procedure to match longest string # # Author: Jerry Nowlin # # Date: June 1, 1991 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # Contributors: Stephen B. Wampler, Kenneth Walker, Bob Alexander, # and Richard E. Goerwitz # ############################################################################ # # Version: 1.9 # ############################################################################ # # longstr(l,s,i,j) works like any(), except that instead of taking a # cset as its first argument, it takes instead a list or set of # strings (l). Returns i + *x, where x is the longest string in l # for which match(x,s,i,j) succeeds. Fails if no match occurs. # # Defaults: # s &subject # i &pos if s is defaulted, otherwise 1 # j 0 # # Errors: # The only manual error-checking that is done is to test l to # be sure it is, in fact, a list or set. Errors such as non- # string members in l, and non-integer i/j parameters, are # caught by the normal Icon built-in string processing and sub- # scripting mechanisms. # ############################################################################ procedure longstr(l,s,i,j) local elem, tmp_table static l_table initial l_table := table() # # No-arg invocation wipes out all static structures, and forces an # immediate garbage collection. # if (/l, /s) then { l_table := table() collect() # do it NOW return # return &null } # # Is l a list, set, or table? # type(l) == ("list"|"set"|"table") | stop("longstr: list, set, or table expected (arg 1)") # # Sort l longest-to-shortest, and keep a copy of the resulting # structure in l_table[l] for later use. # if /l_table[l] := [] then { tmp_table := table() # keys = lengths of elements, values = elements every elem := !l do { /tmp_table[*elem] := [] put(tmp_table[*elem], elem) } # sort by key; stuff values, in reverse order, into a list every put(l_table[l], !sort(tmp_table,3)[*tmp_table*2 to 2 by -2]) } # # First element in l_table[l] to match is the longest match (it's # sorted longest-to-shortest, remember?). # return match(!l_table[l],s,i,j) end icon-9.4.3/ipl/procs/eval.icn0000664000175000017500000000324507140713040015337 0ustar chrishchrish############################################################################ # # File: eval.icn # # Subject: Procedure to evaluate string as a call # # Author: Ralph E. Griswold # # Date: March 3, 1996 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # This procedure analyzes a string representing an Icon function or # procedure call and evaluates the result. Operators can be # used in functional form, as in "*(2,3)". # # This procedure cannot handle nested expressions or control structures. # # It assumes the string is well-formed. The arguments can only be # Icon literals. Escapes, commas, and parentheses in strings literals # are not handled. # # In the case of operators that are both unary and binary, the binary # form is used. # ############################################################################ # # Links: ivalue # ############################################################################ invocable all link ivalue procedure eval(expr) local p, args, tok &error := -1 # to prevent error termination ... expr ? { p := trim(tab(upto('(')), '\t ') | { write(&errout, "*** syntax error") fail } p := proc(p, 2 | 1 | 3) | { write(&errout, "*** invalid operation") fail } move(1) args := [] repeat { tab(many(' \t')) tok := trim(tab(upto(',)'))) | break put(args, ivalue(tok)) | fail # fail on syntax error move(1) } suspend p ! args } end icon-9.4.3/ipl/procs/strings.icn0000664000175000017500000003554107466256251016126 0ustar chrishchrish############################################################################ # # File: strings.icn # # Subject: Procedures for manipulating strings # # Author: Ralph E. Griswold # # Date: May 8, 2002 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # These procedures perform operations on strings. # # cat(s1, s2, ...) concatenates an arbitrary number of strings. # # charcnt(s, c) returns the number of instances of characters in # c in s. # # collate(s1, s2) collates the characters of s1 and s2. For example, # collate("abc", "def") # produces "adbecf". # # comb(s, i) generates the combinations of characters from s # taken i at a time. # # compress(s, c) compresses consecutive occurrences of charac- # ters in c that occur in s; c defaults to &cset. # # coprefix(s1, s2, ...) # produces the common prefix of its arguments: # the longest initial substring shared by all, # which may be the empty string. # # cosuffix(s1, s2, ...) # produces the common suffix of its arguments: # the longest trailing substring shared by all, # which may be the empty string. # # csort(s) produces the characters of s in lexical order. # # decollate(s, i) produces a string consisting of every other # character of s. If i is odd, the odd-numbered # characters are selected, while if i is even, # the even-numbered characters are selected. # The default value of i is 1. # # deletec(s, c) deletes occurrences of characters in c from s. # # deletep(s, L) deletes all characters at positions specified in # L. # # deletes(s1, s2) deletes occurrences of s2 in s1. # # diffcnt(s) returns count of the number of different # characters in s. # # extend(s, n) replicates s to length n. # # fchars(s) returns characters of s in order of decreasing # frequency # # interleave(s1, s2) interleaves characters s2 extended to the length # of s1 with s1. # # ispal(s) succeeds and returns s if s is a palindrome # # maxlen(L, p) returns the length of the longest string in L. # If p is given, it is applied to each string as # as a "length" procedure. The default for p is # proc("*", 1). # # meander(s, n) produces a "meandering" string that contains all # n-tuples of characters of s. # # multicoll(L) returns the collation of the strings in L. # # ochars(s) produces the unique characters of s in the order # that they first appear in s. # # odd_even(s) inserts values in a numerical string so that # adjacent digits follow an odd-even pattern. # # palins(s, n) generates all the n-character palindromes from the # characters in s. # # permutes(s) generates all the permutations of the string s. # # pretrim(s, c) trims characters from beginning of s. # # reflect(s1, i, s2) # returns s1 concatenated s2 and the reversal of s1 # to produce a palindroid; the values of i # determine "end conditions" for the reversal: # # 0 pattern palindrome; the default # 1 pattern palindrome with center duplicated # 2 true palindrome with center not duplicated # 3 true palindrome with center duplicated # # s2 defaults to the empty string, in which case the # result is a full palindrome # # replace(s1, s2, s3) # replaces all occurrences of s2 in s1 by s3; fails # if s2 is null. # # replacem(s, ...) performs multiple replacements in the style of # of replace(), where multiple argument pairs # may be given, as in # # replacem(s, "a", "bc", "d", "cd") # # which replaced all "a"s by "bc"s and all # "d"s by "cd"s. Replacements are performed # one after another, not in parallel. # # replc(s, L) replicates each character of c by the amount # given by the values in L. # # rotate(s, i) rotates s i characters to the left (negative i # produces rotation to the right); the default # value of i is 1. # # schars(s) produces the unique characters of s in lexical # order. # # scramble(s) scrambles (shuffles) the characters of s randomly. # # selectp(s, L) selects characters of s that are at positions # given in L. # # slugs(s, n, c) generates column-sized chunks (length <= n) # of string s broken at spans of cset c. # # Defaults: n 80 # c ' \t\r\n\v\f' # # Example: every write("> ", slugs(msg, 50)) # # starseq(s) sequence consisting of the closure of s # starting with the empty string and continuing # in lexical order as given in s # # strcnt(s1, s2) produces a count of the number of non-overlapping # times s1 occurs in s2; fails is s1 is null # # substrings(s, i, j) # generates all the substrings of s with lengths # from i to j, inclusive; i defaults to 1, j # to *s # # transpose(s1, s2, s3) # transposes s1 according to label s2 and # transposition s3. # # words(s, c) generates the "words" from the string s that # are separated by characters from the cset # c, which defaults to ' \t\r\n\v\f'. # ############################################################################ # # Links: lists # ############################################################################ link lists procedure cat(args[]) #: concatenate strings local result result := "" every result ||:= !args return result end procedure charcnt(s, c) #: character count local count count := 0 s ? { while tab(upto(c)) do count +:= *tab(many(c)) } return count end procedure collate(s1, s2) #: string collation local length, ltemp, rtemp static llabels, rlabels, clabels, blabels, half initial { llabels := "ab" rlabels := "cd" blabels := llabels || rlabels clabels := "acbd" half := 2 ltemp := left(&cset, *&cset / 2) rtemp := right(&cset, *&cset / 2) clabels := collate(ltemp, rtemp) llabels := ltemp rlabels := rtemp blabels := string(&cset) half := *llabels } length := *s1 if length <= half then return map(left(clabels, 2 * length), left(llabels, length) || left(rlabels, length), s1 || s2) else return map(clabels, blabels, left(s1, half) || left(s2, half)) || collate(right(s1, length - half), right(s2, length - half)) end procedure comb(s, i) #: character combinations local j if i < 1 then fail suspend if i = 1 then !s else s[j := 1 to *s - i + 1] || comb(s[j + 1:0], i - 1) end procedure compress(s, c) #: character compression local result, s1 /c := &cset result := "" s ? { while result ||:= tab(upto(c)) do { result ||:= (s1 := move(1)) tab(many(s1)) } return result || tab(0) } end procedure coprefix(args[]) #: find common prefix of strings local s, t, i s := get(args) | fail every t := !args do { every i := seq(1) do if not (s[i] == t[i]) then break s := s[1+:(i-1)] } return s end procedure cosuffix(args[]) #: find common suffix of strings local s, t, i s := get(args) | fail every t := !args do { every i := seq(-1, -1) do if not (s[i] == t[i]) then break s := s[i+1:0] } return s end procedure csort(s) #: lexically ordered characters local c, s1 s1 := "" every c := !cset(s) do every find(c, s) do s1 ||:= c return s1 end # decollate s according to even or odd i # procedure decollate(s, i) #: string decollation local ssize static dsize, image, object initial { image := collate(left(&cset, *&cset / 2), left(&cset, *&cset / 2)) object := left(&cset, *&cset / 2) dsize := *image } /i := 1 i %:= 2 ssize := *s if ssize + i <= dsize then return map(object[1+:(ssize + i) / 2], image[(i + 1)+:ssize], s) else return map(object[1+:(dsize - 2) / 2], image[(i + 1)+:dsize - 2], s[1+:(dsize - 2)]) || decollate(s[dsize - 1:0], i) end procedure deletec(s, c) #: delete characters local result result := "" s ? { while result ||:= tab(upto(c)) do tab(many(c)) return result ||:= tab(0) } end procedure deletep(s, L) L := sort(L) while s[pull(L)] := "" return s end procedure deletes(s1, s2) #: delete string local result, i result := "" i := *s2 s1 ? { while result ||:= tab(find(s2)) do move(i) return result ||:= tab(0) } end procedure diffcnt(s) #: number of different characters return *cset(s) end procedure extend(s, n) #: extend string local i if *s = 0 then fail i := n / *s if n % *s > 0 then i +:= 1 return left(repl(s, i), n) end procedure fchars(s) #: characters in order of frequency local counts, clist, bins, blist, result counts := table(0) every counts[!s] +:= 1 clist := sort(counts, 4) bins := table('') while bins[pull(clist)] ++:= pull(clist) blist := sort(bins, 3) result := "" while result ||:= pull(blist) do pull(blist) return result end procedure interleave(s1, s2) #: interleave strings return collate(s1, extend(s2, *s1)) | fail end procedure ispal(s) #: test for palindrome if s == reverse(s) then return s else fail end procedure maxlen(L, p) #: maximum string length local i if *L = 0 then fail /p := proc("*", 1) i := 0 every i <:= p(!L) return i end procedure meander(alpha, n) #: meandering strings local result, trial, t, i, c i := *alpha t := n - 1 result := repl(alpha[1], t) # base string while c := alpha[i] do { # try a character result ? { # get the potential n-tuple tab(-t) trial := tab(0) || c } if result ? find(trial) then # duplicate, work back i -:= 1 else { result ||:= c # add it i := *alpha # and start from end again } } return result[n:0] end procedure multicoll(L) #: collate strings in list local result, i, j result := "" every i := 1 to *L[1] do # no other longer if legal every j := 1 to *L do result ||:= L[j][i] return result end procedure ochars(w) #: first appearance unique characters local out, c out := "" every c := !w do if not find(c, out) then out ||:= c return out end procedure odd_even(s) #: odd-even numerical string local result, i, j every i := integer(!s) do { if /result then result := i else if (i % 2) = (j % 2) then result ||:= (j + 1) || i else result ||:= i j := i } return result end procedure palins(s, n) #: palindromes local c, lpart, mpart, rpart, h, p if n = 1 then suspend !s else if n = 2 then every c := !s do suspend c || c else if n % 2 = 0 then { # even h := (n - 2) / 2 every p := palins(s, n - 2) do { p ? { lpart := move(h) rpart := tab(0) } every c := !s do { mpart := c || c suspend lpart || mpart || rpart } } } else { # odd h := (n - 1) / 2 every p := palins(s, n - 1) do { p ? { lpart := move(h) rpart := tab(0) } every suspend lpart || !s || rpart } } end procedure permutes(s) #: generate string permutations local i if *s = 0 then return "" suspend s[i := 1 to *s] || permutes(s[1:i] || s[i+1:0]) end procedure pretrim(s, c) #: pre-trim string /c := ' ' s ? { tab(many(c)) return tab(0) } end procedure reflect(s1, i, s2) #: string reflection /i :=0 /s2 := "" return s1 || s2 || reverse( case i of { 0: s1[2:-1] # pattern palindrome 1: s1[2:0] # pattern palindrome with first character at end 2: s1[1:-1] # true palindrome with center character unduplicated 3: s1 # true palindrome with center character duplicated } ) end procedure replace(s1, s2, s3) #: string replacement local result, i result := "" i := *s2 if i = 0 then fail # would loop on empty string s1 ? { while result ||:= tab(find(s2)) do { result ||:= s3 move(i) } return result || tab(0) } end procedure replacem(s, pairs[]) #: multiple string replacement while s := replace(s, get(pairs), get(pairs)) return s end procedure replc(s, L) #: replicate characters local result result := "" every result ||:= repl(!s, get(L)) return result end procedure rotate(s, i) #: string rotation if s == "" then return s /i := 1 if i = 0 then return s else if i < 0 then i +:= *s i %:= *s return s[(i + 1):0] || s[1:(i + 1)] end procedure schars(s) #: lexical unique characters return string(cset(s)) end procedure scramble(s) #: scramble string local i s := string(s) | fail every i := *s to 2 by -1 do s[?i] :=: s[i] return s end procedure selectp(s, L) #: select characters local result result := "" every result ||:= s[!L] return result end procedure slugs(s, n, c) #: generate s in chunks of size <= n local i, t (/n := 80) | (n := 0 < integer(n)) | runerr(101, n) /c := ' \t\r\n\v\f' n +:= 1 while *s > 0 do s ? { if *s <= n then return trim(s, c) if tab(i := (n >= upto(c))) then { tab(many(c)) while tab(i := (n >= upto(c))) do { tab(many(c)) } suspend .&subject[1:i] } else { t := tab(n | 0) suspend t } s := tab(0) } fail end procedure starseq(s) #: closure sequence /s := "" suspend "" | (starseq(s) || !s) end procedure strcnt(s1, s2) #: substring count local j, i if *s1 = 0 then fail # null string would loop j := 0 i := *s1 s2 ? { while tab(find(s1)) do { j +:= 1 move(i) } return j } end procedure substrings(s, i, j) #: generate substrings /i := 1 /j := *s s ? { every tab(1 to *s) do suspend move(i to j) } end procedure transpose(s1, s2, s3) #: transpose characters local n, result n := *s2 result := "" s1 ? { while result ||:= map(s3, s2, move(n)) return result ||:= tab(0) } end procedure words(s, c) #: generate words from string /c := ' \t\r\n\v\f' s ? { tab(many(c)) while not pos(0) do { suspend tab(upto(c) | 0) \ 1 tab(many(c)) } } fail end icon-9.4.3/ipl/procs/io.icn0000664000175000017500000005150207450115327015026 0ustar chrishchrish############################################################################ # # File: io.icn # # Subject: Procedures for input and output # # Author: Ralph E. Griswold # # Date: March 25, 2002 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # Contributors: Paul Abrahams, Bob Alexander, Will Evans, David A. Gamey, # Richard L. Goerwitz, Will Menagarini, Charles Shartsis, # and Gregg Townsend. # ############################################################################ # # They provide facilities for handling input, output, and files. # # There are other modules in the Icon program library that deal with # input and output. They are not included here because they conflict # with procedures here or each other. # ############################################################################ # # Requires: Appropriate operating system for procedures used. Some # require loadfunc(). # ############################################################################ # # Links: random, strings # ############################################################################ # # File copying: # # fcopy(fn1, fn2) copies a file named fn1 to file named fn2. # ############################################################################ # # File existence: # # exists(name) succeeds if name exists as a file but fails # otherwise. # # directory(name) succeeds if name exists as a directory # but fails otherwise. # ############################################################################ # # File lists: # # filelist(s,x) returns a list of the file names that match the # specification s. If x is nonnull, any directory # is stripped off. At present it only works for # UNIX. Users of other platforms are invited to add # code for their platforms. # ############################################################################ # # Reading and writing files: # # filetext(f) reads the lines of f into a list and returns that # list # # readline(file) assembles backslash-continued lines from the specified # file into a single line. If the last line in a file # ends in a backslash, that character is included in the # last line read. # # splitline(file, line, limit) # splits line into pieces at first blank after # the limit, appending a backslash to identify split # lines (if a line ends in a backslash already, that's # too bad). The pieces are written to the specified file. # ############################################################################ # # Buffered input and output: # # ClearOut() remove contents of output buffer without writing # Flush() flush output buffer # GetBack() get back line writen # LookAhead() look ahead at next line # PutBack(s) put back a line # Read() read a line # ReadAhead(n) read ahead n lines # Write(s) write a line # ############################################################################ # # Path searching: # # dopen(s) opens and returns the file s on DPATH. # # dpath(s) returns the path to s on DPATH. # # Both fail if the file is not found. # # pathfind(fname, path) # returns the full path of fname if found along the list of # directories in "path", else fails. If no path is given, # getenv("DPATH") is the default. As is customary in Icon # path searching, "." is prepended to the path. # # pathload(fname, entry) # calls loadfunc() to load entry from the file fname found on the # function path. If the file or entry point cannot be found, the # program is aborted. The function path consists of the current # directory, then getenv("FPATH"), to which iconx automatically # appends the directory containing the standard libcfunc.so file. # ############################################################################ # # Parsing file names: # # suffix() parses a hierarchical file name, returning a 2-element # list: [prefix,suffix]. E.g. suffix("/a/b/c.d") -> # ["/a/b/c","d"] # # tail() parses a hierarchical file name, returning a 2-element # list: [head,tail]. E.g. tail("/a/b/c.d") -> # ["/a/b","c.d"]. # # components() parses a hierarchical file name, returning a list of # all directory names in the file path, with the file # name (tail) as the last element. For example, # components("/a/b/c.d") -> ["/","a","b","c.d"]. # ############################################################################ # # Temporary files: # # tempfile(prefix, suffix, path, len) # produces a "temporary" file that can be written. The name # is chosen so as not to overwrite an existing file. # The prefix and suffix are prepended and appended, respectively, # to a randomly chosen number. They default to the empty # string. The path is prepended to the file name; its default # is "." The randomly chosen number is fit into a field of len # (default 8) by truncation or right filling with zeros as # necessary. # # It is the user's responsibility to remove the file when it is # no longer needed. # # tempname(prefix, suffix, path, len) # produces the name of a temporary file. # ############################################################################ # # DOS helpers: # # dosdir(diropts) generates records of type dirinfo for each file # found in the directory, failing when no more files # are available, as in # # every dirent := dosdir("*.*") do .... # # known problems: # # When used to traverse directories and sub-directories in nested every # loops it doesn't work as expected - requires further investigation. # Bypass by building lists of the subdirectories to be traversed. # # dosdirlist( dpath, dpart2, infotab ) # returns a list containing the qualified file names for files # in dpath and matching file patterns and/or options specified # in dpart2. For example, # # dirlist := dosdirlist( "..", "*.* /o:n /a:r-d" ) # # returns a list of all read-only-non-directory files in the # parent directory on a MS-DOS compatible system. # # If the optional infotab is specified, # # (1) it must be a table or a run time error will result # (2) the contents of the table will be updated as follows # a dirinfo record will be created for each filename # (3) the filename will be the key to the table # # For example, # # t := table() # dirlist := dosdirlist( "..", "*.* /o:n /a:r-d", t ) # maxsize := 0 ; every maxsize <:= t[!dirlist].size # # calculates the maximum size of the files. # # dosfiles(pfn) accepts a DOS filename possibly containing wildcards. # The filename can also include a drive letter and path. # If the filename ends in "\" or ":", "*.*" is appended. # The result sequence is a sequence of the filenames # corresponding to pfn. # # dosname(s) converts a file name by truncating to the # MS-DOS 8.3 format. Forward slashes are converted # to backslashes and all letters are converted to # lower case. # # Every disk drive on a MS-DOS system has a "working directory", which is # the directory referred to by any references to that drive that don't begin # with a backslash (& so are either direct references to that working # directory, or paths relative to it). There is also 1 "current drive", & # its working directory is called the "current working directory". Any paths # that don't explicitly specify a drive refer to the current drive. For # example, "name.ext" refers to the current drive's working directory, aka # the current working directory; "\name.ext" refers to the current drive's # root directory; & "d:name.ext" refers to the working directory on d:. # # It's reasonable to want to inquire any of these values. The CD command # displays both, in the form of a complete path to the current working # directory. However, passing such a path to either CD or the Icon function # chdir() doesn't change to that dir on that drive; it changes that drive's # working directory to the specified path without changing the current # drive. The command to change the current drive is the system() function # of a command consisting of just the drive letter followed by ":". # # This affects the design of inquiry functions. They could be implemented # with system( "CD >" || ( name := tempname() ) ) & read(open(name)), but # because this requires a slow disk access (which could fail on a full disk) # it's unacceptable to need to do that *twice*, once for the drive & again # for the dir; so if that strategy were used, it'd be necessary to return a # structure containing the current drive & the working directory. That # structure, whether table, list, or string, would then need to be either # indexed or string-scanned to get the individual values, making the code # cumbersome & obscure. It's much better to have 2 separate inquiry # functions, 1 for each value; but for this to be acceptably efficient, it's # necessary to forgo the disk access & implement the functions with # interrupts. # # getdrive() returns the current drive as a lowercase string with # the ":". # # getwd("g") # getwd("g:") return the working directory on drive g:, or # fail if g: doesn't exist. getwd() returns the current # working directory. getwd(...) always returns # lowercase. It prepends the relevant drive letter # with its colon; that's harmless in a chdir(), & useful # in an open(). # # DOS_FileParts(s) takes a DOS file name and returns # a record containing various representations of # the file name and its components. The name # given is returned in the fullname field. # Fields that cannot be determined are returned # as empty strings. # ############################################################################ link random link strings global buffer_in, buffer_out, Eof record _DOS_FileParts_(fullname,devpath,device,path,name,extension) record dirinfo( name, ext, size, date, time ) procedure ClearOut() #: remove contents of output buffer buffer_out := [] end procedure DOS_FileParts(filename) #: parse DOSfile name local dev, path, name, ext, p, d filename ? { dev := 1( tab( upto(':') ), move(1) ) | "" d := &pos - 1 tab(0) } ? { p := 1 path := tab( ( every p := upto('\\') + 1 ) | p ) tab(0) } ? { name := 1( tab( upto('.') ), move(1) ) | tab(0) ext := tab(0) } return _DOS_FileParts_(filename,filename[1:d + p],dev,path,name,ext) end procedure Flush() #: flush output buffer while write(pull(buffer_out)) return end procedure GetBack() #: get back line written return get(buffer_out) end procedure LookAhead() #: look at next line return buffer_in[1] end procedure PutBack(s) #: put back line read push(buffer_in,s) return end procedure Read() #: read a line in buffered mode initial{ buffer_in := [] } if *buffer_in = 0 then put(buffer_in,read()) | (Eof := 1) return get(buffer_in) end procedure ReadAhead(n) #: read ahead while *buffer_in < n do put(buffer_in,read()) | { Eof := 1 fail } return end procedure Write(s) #: write in buffered mode initial buffer_out := [] push(buffer_out,s) return s end procedure components(s,separator) #: get components of file name local x,head /separator := "/" x := tail(s,separator) return case head := x[1] of { separator: [separator] "": [] # C. Shartsis: 4/23/95 - fix for MS-DOS # default: components(head) default: components(head, separator) } ||| ([&null ~=== x[2]] | []) end procedure dopen(s) #: open file on DPATH local file, paths, path if file := open(s) then return file # look in current directory paths := getenv("DPATH") | fail s := "/" || s # platform-specific paths ? { while path := tab(upto(' ') | 0) do { if file := open(path || s) then return file tab(many(' ')) | break } } fail end procedure dosdir( diropts ) #: process DOS directory local de, line static tempfn, tempf, dosdir_ver initial { close(open(tempfn := tempname(),"w")) system("ver > " || tempfn) (tempf := open(tempfn,"r")) | stop("Unable to open ",tempfn," from dosdir.") while line := read(tempf) do if find("MS-DOS",line) then if find("6.20",line) then dosdir_ver := dosdir_62 else dosdir_ver := dosdir_xx close(tempf) system("erase " || tempfn) } close(open(tempfn := tempname(),"w")) # ensure useable file system("dir " || diropts || " > " || tempfn) # get dir tempf := open(tempfn,"r") # open file while line := map(read(tempf)) do { line ? if de := dosdir_ver() then suspend de else next } close(tempf) system("erase " || tempfn) end procedure dosdir_62() static nb local de initial nb := ~' ' if *&subject = 43 & (tab(any(nb)), move(-1)) then { de := dirinfo() (de.name := trim(move(8)), move(1), de.ext := trim(move(3)), move(1), de.size := move(13), move(1), de.date := move(8), move(2), de.time := tab(0)) every de.size ?:= 1(tab(upto(',')),move(1)) || tab(0) return de } end procedure dosdir_xx() static nb local de initial nb := ~' ' if *&subject = 39 & (tab(any(nb)), move(-1)) then { de := dirinfo() (de.name := trim(move(8)), move(1), de.ext := trim(move(3)), move(1), de.size := integer(move(9)), move(1), de.date := move(8), move(2), de.time := tab(0)) return de } end procedure dosdirlist( #: get list of DOS directory dpath, dpart2, infotab ) local dl, di, fn if type(\infotab) ~== "table" then runerr( 124, infotab ) dpath ||:= dpath[-1] ~== "\\" /dpart2 := "*.*" dl := [] every di := dosdir( dpath || dpart2 ) do if not ( di.name == ("." | "..") ) then { put( dl, fn := ( dpath || di.name || "." || trim(di.ext) ) ) (\infotab)[fn] := di } return dl end $ifdef _MSDOS procedure dosfiles(pfn) #: DOS file names local asciiz, fnr, prefix, k, name local ds, dx, result, fnloc, string_block # Get Disk Transfer Address; filename locn is 30 beyond that. result := Int86([16r21, 16r2f00] ||| list(7,0)) # pointer arithmetic wrong: fnloc := 16 * result[8] + result[3]+ 30 fnloc := ishift( result[8], 16 ) + result[3] + 30 # Get the generalized filename. fnr := reverse(pfn) k := upto("\\:", fnr) | *fnr + 1 prefix := reverse(fnr[k:0]) name := "" ~== reverse(fnr[1:k]) | "*.*" # Get the first file in the sequence. asciiz := prefix || name || "\x00" Poke(string_block := GetSpace(*asciiz), asciiz) | stop( "dosfiles(): GetSpace() failed." ) # pointer arithmetic wrong: ds := string_block / 16 # pointer arithmetic wrong: dx := string_block % 16 ds := ishift( string_block, -16 ) dx := iand( string_block, 16rffff ) result := Int86([16r21, 16r4e00, 0, 0, dx, 0, 0, 0, ds]) FreeSpace(string_block) case result[2] of { 0 : {} 18 : fail default : stop("I/O Error ", result[2]) } suspend prefix || extract_name(fnloc) # Get the remaining files in the sequence. while Int86([16r21, 16r4f00, 0, 0, 0, 0, 0, 0, 0])[2] = 0 do suspend prefix || extract_name(fnloc) end $endif procedure dosname(namein) #: convert file name to DOS format local prefix, base, extension, pair, extended_name namein := replace(namein, "/", "\\") pair := tail(namein, "\\") prefix := pair[1] extended_name := pair[2] pair := suffix(extended_name) base := pair[1] extension := pair[2] base := base[1:9] extension := extension[1:4] return map(prefix || "\\" || base || "." || extension) end procedure dpath(s) #: full path to file on DPATH local file, paths, path, result if exists(s) then return s # look in current directory paths := getenv("DPATH") | fail s := "/" || s # platform-specific paths ? { while path := tab(upto(' ') | 0) do { if exists(result := path || s) then return result tab(many(' ')) | break } } fail end procedure exists(name) #: test file existence return close(open(name)) end procedure directory(name) #: succeed if name is a directory $ifdef _MS_WINDOWS if fattrib(name, "status")[1] == "d" then return name else fail $else if close(open(name || "/.")) then return name else fail $endif end $ifdef _MSDOS procedure extract_name(fnloc) local asciiz asciiz := Peek(fnloc, 13) return asciiz[1:upto("\x00", asciiz)] end $endif procedure fcopy(fn1,fn2) #: copy file local f1, f2, buf f1 := open(fn1,"ru") | stop("Can't open ",fn1) f2 := open(fn2,"wu") | stop("Can't open ",fn2," for writing") while buf := reads(f1,512) do writes(f2,buf) every close(f2 | f1) return fn2 end procedure filelist(spec, x) #: get list of files local flist, ls, f /spec := "" flist := [] if &features == "UNIX" then { ls := open("ls " || spec || " 2>/dev/null", "p") every f := !ls do { if \x then f ?:= { while tab(upto("/") + 1) tab(0) } put(flist, f) } close(ls) return flist } else fail # don't take control away from caller end procedure filetext(f) #: read file into list local input, file, text input := open(f) | stop("cannot open input file") text := [] while put(text,read(input)) close(input) return text end $ifdef _MSDOS procedure getdrive() #: get current DOS drive return &lcase[iand( Int86([33,16r1900,0,0,0,0,0,0,0])[2], 255 )+1] || ":" end procedure getwd(drive) #: get DOS working directory local A, dx, si, cf, ds A := GetSpace(64) | stop( "getwd(): GetSpace() failed." ) dx := ("36r" || !\drive) - 9 | 0 si := iand( A, 16rffff ); ds := ishift( A, -16 ) cf := !Int86([33,16r4700,0,0,dx,si,0,0,ds]) % 2 Peek( A , 64 ) ? path := tab(many(~'\0')) | "" FreeSpace(A) cf = 0 | fail return ( map(!\drive) || ":" | getdrive() ) || "\\" || map(path) end $endif procedure pathfind(fname, path) #: find file on path local f, dir, fullname $ifdef _UNIX $define PSEP ' :' $else $define PSEP ' ' $endif fname ? { if ="/" & close(open(fname)) then return fname # full absolute path works while tab(upto('/') + 1) fname := tab(0) # get final component of path } /path := getenv("DPATH") /path := "" path := ". " || path path ? while not pos(0) do { dir := tab(upto(PSEP) | 0) fullname := trim(dir, '/') || "/" || fname if close(open(fullname)) then return fullname tab(many(PSEP)) } fail end procedure pathload(fname, entry) #: load C function from $FPATH local path, found path := getenv("FPATH") | "." found := pathfind(fname, path) if /found then stop ("cannot find \"", fname, "\" on path \". ", path, "\"") return loadfunc(found, entry) # aborts if unsuccessful end procedure readline(file) #: assemble backslash-continued lines local line line := read(file) | fail while line[-1] == "\\" do line := line[1:-1] || read(file) | break return line end procedure splitline(file,line,limit) #: split line into pieces local i, j if *line = 0 then { # don't fail to write empty line write(file,line) return } while *line > limit do { line ?:= { i := j := 0 every i := find(" ") do { # find a point to split if i >= limit then break else j := i } if j = 0 then { # can't split write(file,line) return } write(file,tab(j + 1),"\\") tab(0) # update line } } if *line > 0 then write(file,line) # the rest return end procedure suffix(s,separator) #: find suffix of file name local i /separator := "." i := *s + 1 every i := find(separator,s) return [s[1:i],s[(*s >= i) + 1:0] | &null] end procedure tail(s,separator) #: find tail of file name local i /separator := "/" i := 0 every i := find(separator,s) return [s[1:i + (i <= 1 | 0)],"" ~== s[i + 1:0] | &null] end procedure tempfile( #: get temporary file prefix, suffix, path, len ) local name name := tempname(prefix, suffix, path, len) return open(name, "w") | fail end procedure tempname( #: get temporary file name prefix, suffix, path, len ) local name, file /prefix := "" /suffix := "" /path := "." prefix := path || "/" || prefix /len := 8 randomize() repeat { ?1 # change &random name := prefix || left(&random, 8, "0") || suffix if not exists(name) then return name } end icon-9.4.3/ipl/procs/bufread.icn0000664000175000017500000001520307140713040016015 0ustar chrishchrish############################################################################ # # File: bufread.icn # # Subject: Procedures for buffered read and lookahead # # Author: Charles A. Shartsis # # Date: March 11,1995 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # Version: 1.0 # ############################################################################ # # Synopsis: # # bufopen(s) Open a file name s for buffered read and lookahead # bufread(f) Read the next line from file f # bufnext(f, n) Return the next nth record from file f # without changing the next record to be read by # bufread # bufclose(f) Close file f # ############################################################################ # # These procedures provide a mechanism for looking ahead an # arbitrary number of records in an open file while still # keeping track of the logical current record and end-of-file. # Although similar in intent to the procedures in buffer.icn, these # procedures are used differently. The procedures bufopen, # bufread, and bufclose were designed to closely mirror the # built-in open, read, and close. # # A code segment like # # file := open("name", "r") | stop("open failed") # while line := read(file) do { # ...process current line... # } # close(file) # # can be changed to the following with no difference in behavior: # # file := bufopen("name", "r") | stop("open failed") # while line := bufread(file) do { # ...process current line... # } # bufclose(file) # # However in addition to processing the current line, one may # also process subsequent lines BEFORE they are logically # read: # # file := bufopen("name", "r") | stop("open failed") # while line := bufread(file) do { # ...process current line... # line := bufnext(file,1) # return next line # ...process next line... # line := bufnext(file,2) # return 2nd next line # ...process 2nd next line... # ...etc... # } # bufclose(file) # # In the code above, calls to bufnext do not affect the results of # subsequent bufread's. The bufread procedure always steps through # the input file a line at a time without skipping lines whether or # not bufnext is called. # ############################################################################ # # Here is a more detailed description of the procedures: # # bufopen(s) # ========== # Produces a file resulting from opening s for reading ("r" option), # but fails if the file cannot be opened. if s is missing or # the value of s is &null, then standard input is opened and # &input is returned. Unlike the Icon open function, bufopen() # can and must be called prior to any call to bufread or bufnext # involving standard input. Unlike named files, only one buffered # standard input may be open at any given time. # # Default: # s &null (indicates &input should be opened for buffered # reading) # # Errors (from open): # 103 s not string # # Errors (new): # Attempt to open standard input when currently open # # # bufread(f) # ========== # Produces a string consisting of the next line from f, but fails on # end of file. Calls to bufnext do not affect the results of # subsequent bufread's. The procedure bufread always steps # through a file a line at a time without skipping lines. The # procedure bufread fails when a logical end of file is # reached, i.e., when the physical end of file has # been reached AND the internal buffer is empty. # # Default: # f &input # # Errors: # f is not a file # f not opened for buffered reads (includes &input) # # # bufnext(f, n) # ============= # Produces a string consisting of the nth next line from f after # the current line. It fails when the physical end of file # has been reached. # # Default: # f &input # n 1 (the next line after the current one) # # Errors: # f is not a file # f not opened for buffered reads (includes &input) # n not convertible to integer # n not positive # # # bufclose(f) # =========== # Produces f after closing it. Standard input must # be closed before it can be reopened using bufopen. # If standard input is closed, all lines read using bufnext # are lost when it is reopened. In general, there is no # practical reason to bufclose and then bufopen standard input. # One may want to bufclose standard input to release its # internal buffer for garbage collection. # # Default: # f &input # # Errors (from close): # 105 f not file # ############################################################################ global __buf procedure bufopen(fname) local file if /__buf then __buf := table(&null) if /fname then { /__buf[&input] | stop("bufopen: Standard input is already open") __buf[&input] := [] return &input } else if file := open(fname, "r") then { __buf[file] := [] return file } else fail end procedure bufclose(file) if /__buf then __buf := table(&null) if /file then { __buf[&input] := &null return &input } else { close(file) __buf[file] := &null return file } end procedure bufread(file) local buf if /__buf then __buf := table(&null) if /file then file := &input type(file) == "file" | stop("bufread: Parameter is not a file") buf := \__buf[file] | stop("bufread: File not open for buffered reads") return get(buf) | read(file) end procedure bufnext(file, n) local buf if /__buf then __buf := table(&null) if /file then file := &input if /n then n := 1 type(file) == "file" | stop("bufnext: Parameter is not a file") integer(n) | stop("bufnext: Look ahead count was not convertible to integer") (n > 0) | stop("bufnext: Look ahead count was non-positive") buf := \__buf[file] | stop("bufnext: File not open for buffered reads") return buf[n] | ( while *buf < n do (put(buf, read(file)) | break &fail) ) | buf[n] end icon-9.4.3/ipl/procs/bitstrm.icn0000664000175000017500000000640507140713037016103 0ustar chrishchrish############################################################################ # # File: bitstrm.icn # # Subject: Procedures to read and write strings of bits in files # # Author: Robert J. Alexander # # Date: August 14, 1996 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # Procedures for reading and writing integer values made up of an # arbitrary number of bits, stored without regard to character # boundaries. # ############################################################################ # # Usage of BitStreamWrite, by example: # # record bit_value(value, nbits) # ... # BitStreamWrite() #initialize # while value := get_new_value() do # loop to output values # BitStreamWrite(outfile, value.nbits, value.value) # BitStreamWrite(outfile) # output any buffered bits # # Note the interesting effect that BitStreamWrite(outproc), as well as # outputting the complete string, pads the output to an even character # boundary. This can be dune during construction of a bit string if # the effect is desired. # # The "value" argument defaults to zero. # ############################################################################ # # Usage of BitStreamRead, by example: # # BitStreamRead() # while value := BitStreamRead(infile, nbits) do # # do something with value # # BitStringRead fails when too few bits remain to satisfy a request. # ############################################################################ # # See also: bitstr.icn # ############################################################################ procedure BitStreamWrite(outfile,bits,value,outproc) local outvalue static buffer,bufferbits # # Initialize. # initial { buffer := bufferbits := 0 } /outproc := writes # # If this is "close" call, flush buffer and reinitialize. # if /value then { outvalue := &null if bufferbits > 0 then outproc(outfile,char(outvalue := ishift(buffer,8 - bufferbits))) buffer := bufferbits := 0 return outvalue } # # Merge new value into buffer. # buffer := ior(ishift(buffer,bits),value) bufferbits +:= bits # # Output bits. # while bufferbits >= 8 do { outproc(outfile,char(outvalue := ishift(buffer,8 - bufferbits))) buffer := ixor(buffer,ishift(outvalue,bufferbits - 8)) bufferbits -:= 8 } return outvalue end procedure BitStreamRead(infile,bits,inproc) local value static buffer,bufferbits # # Initialize. # initial { buffer := bufferbits := 0 } # # Reinitialize if called with no arguments. # if /infile then { buffer := bufferbits := 0 return } # # Read in more data if necessary. # /inproc := reads while bufferbits < bits do { buffer := ior(ishift(buffer,8),ord(inproc(infile))) | fail bufferbits +:= 8 } # # Extract value from buffer and return. # value := ishift(buffer,bits - bufferbits) buffer := ixor(buffer,ishift(value,bufferbits - bits)) bufferbits -:= bits return value end icon-9.4.3/ipl/procs/segment.icn0000664000175000017500000000253407140713037016060 0ustar chrishchrish############################################################################ # # File: segment.icn # # Subject: Procedures to segment string # # Author: William H. Mitchell # # Date: June 10, 1988 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # These procedures segment a string s into consecutive substrings # consisting of characters that respectively do/do not occur in c. # segment(s,c) generates the substrings, while seglist produces a list # of the segments. For example, # # segment("Not a sentence.",&letters) # # generates # # "Not" # " " # "a" # " " # "sentence" # "." # while # seglist("Not a sentence.",&letters) # # produces # # ["Not"," ","a","sentence","."] # ############################################################################ procedure segment(line,dlms) local ndlms dlms := (any(dlms,line[1]) & ~dlms) ndlms := ~dlms line ? repeat { suspend tab(many(ndlms)) \ 1 suspend tab(many(dlms)) \ 1 pos(0) & break } end procedure seglist(s,c) local L L := [] c := (any(c,s[1]) & ~c) s ? while put(L,tab(many(c := ~c))) return L end icon-9.4.3/ipl/procs/gobject.icn0000664000175000017500000000153207142351332016026 0ustar chrishchrish############################################################################ # # File: gobject.icn # # Subject: Declarations for geometrical objects # # Author: Ralph E. Griswold # # Date: July 22, 1997 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # These declarations are provided for representing geometrical objects # as records. # ############################################################################ record Circle(center, radius) # point, length record Line(p1, p2) # point, point record Point(x, y, z) # x and y coordinates record Point_Polar(r, a) # radius, angle record Polygon(points) # list of points record Rectangle(upper_left, lower_right) # point, point icon-9.4.3/ipl/procs/lstfncs.icn0000664000175000017500000000234707311234604016072 0ustar chrishchrish############################################################################ # # File: lstfncs.icn # # Subject: Procedures to produce lists from sequences # # Author: Ralph E. Griswold # # Date: April 23, 2001 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # Links: genrfncs, numbers # ############################################################################ link genrfncs link numbers procedure fiblist(l, m) local result /l := 128 /m := 8 result := [] every put(result, residue(fibseq(), m, 1)) \ l return result end procedure multilist(l, m) local result /l := 128 /m := 8 result := [] every put(result, residue(multiseq(), m, 1)) \ l return result end procedure primelist(l, m) local result /l := 128 /m := 8 result := [] every put(result, residue(primeseq(), m, 1)) \ l return result end procedure List(L) # called as List{e, l, m} local l, m, result l := \@L[2] | 128 # length m := \@L[3] | 8 # modulus result := [] every put(result, residue(|@L[1], m, 1)) \ l return result end icon-9.4.3/ipl/procs/image.icn0000664000175000017500000002042207274062401015474 0ustar chrishchrish############################################################################ # # File: image.icn # # Subject: Procedures to produce images of Icon values # # Authors: Michael Glass, Ralph E. Griswold, and David Yost # # Date: May 2, 2001 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # The procedure Image(x,style) produces a string image of the value x. # The value produced is a generalization of the value produced by # the Icon function image(x), providing detailed information about # structures. The value of style determines the formatting and # order of processing: # # 1 indented, with ] and ) at end of last item (default) # 2 indented, with ] and ) on new line # 3 puts the whole image on one line # 4 as 3, but with structures expanded breadth-first instead of # depth-first as for other styles. # ############################################################################ # # Tags are used to uniquely identify structures. A tag consists # of a letter identifying the type followed by an integer. The tag # letters are L for lists, R for records, S for sets, and T for # tables. The first time a structure is encountered, it is imaged # as the tag followed by a colon, followed by a representation of # the structure. If the same structure is encountered again, only # the tag is given. # # An example is # # a := ["x"] # push(a,a) # t := table() # push(a,t) # t[a] := t # t["x"] := [] # t[t] := a # write(Image(t)) # # which produces # # T1:[ # "x"->L1:[], # L2:[ # T1, # L2, # "x"]->T1, # T1->L2] # # On the other hand, Image(t,3) produces # # T1:["x"->L1:[],L2:[T1,L2,"x"]->T1,T1->L2] # # Note that a table is represented as a list of entry and assigned # values separated by ->. # ############################################################################ # # Problem: # # The procedure here really is a combination of an earlier version and # two modifications to it. It should be re-organized to combine the # presentation style and order of expansion. # # Bug: # # Since the table of structures used in a call to Image is local to # that call, but the numbers used to generate unique tags are static to # the procedures that generate tags, the same structure gets different # tags in different calls of Image. # ############################################################################ procedure Image(x,style,done,depth,nonewline) local retval if style === 4 then return Imageb(x) # breadth-first style /style := 1 /done := table() if /depth then depth := 0 else depth +:= 2 if (style ~= 3 & depth > 0 & /nonewline) then retval := "\n" || repl(" ",depth) else retval := "" if match("record ",image(x)) then retval ||:= Rimage(x,done,depth,style) else { retval ||:= case type(x) of { "list": Limage(x,done,depth,style) "table": Timage(x,done,depth,style) "set": Simage(x,done,depth,style) default: image(x) } } depth -:= 2 return retval end # list image # procedure Limage(a,done,depth,style) static i local s, tag initial i := 0 if \done[a] then return done[a] done[a] := tag := "L" || (i +:= 1) if *a = 0 then s := tag || ":[]" else { s := tag || ":[" every s ||:= Image(!a,style,done,depth) || "," s[-1] := endof("]",depth,style) } return s end # record image # procedure Rimage(x,done,depth,style) static i local s, tag initial i := 0 s := image(x) # might be record constructor if match("record constructor ",s) then return s if \done[x] then return done[x] done[x] := tag := "R" || (i +:= 1) s ?:= (="record " & (":" || (tab(upto('(') + 1)))) if *x = 0 then s := tag || s || ")" else { s := tag || s every s ||:= Image(!x,style,done,depth) || "," s[-1] := endof(")",depth,style) } return s end # set image # procedure Simage(S,done,depth,style) static i local s, tag initial i := 0 if \done[S] then return done[S] done[S] := tag := "S" || (i +:= 1) if *S = 0 then s := tag || ":[]" else { s := tag || ":[" every s ||:= Image(!S,style,done,depth) || "," s[-1] := endof("]",depth,style) } return s end # table image # procedure Timage(t,done,depth,style) static i local s, tag, a, a1 initial i := 0 if \done[t] then return done[t] done[t] := tag := "T" || (i +:= 1) if *t = 0 then s := tag || ":[]" else { a := sort(t,3) s := tag || ":[" while s ||:= Image(get(a),style,done,depth) || "->" || Image(get(a),style,done,depth,1) || "," s[-1] := endof("]",depth,style) } return s end procedure endof (s,depth,style) if style = 2 then return "\n" || repl(" ",depth) || "]" else return "]" end ############################################################################ # # What follows is the breadth-first expansion style # procedure Imageb(x, done, tags) local t if /done then { done := [set()] # done[1] actually done; done[2:0] pseudo-done tags := table() # unique label for each structure } if member(!done, x) then return tags[x] t := tagit(x, tags) # The tag for x if structure; image(x) if not if /tags[x] then return t # Wasn't a structure else { insert(done[1], x) # Mark x as actually done return case t[1] of { "R": rimageb(x, done, tags) # record "L": limageb(x, done, tags) # list "T": timageb(x, done, tags) # table "S": simageb(x, done, tags) # set } } end # Create and return a tag for a structure, and save it in tags[x]. # Otherwise, if x is not a structure, return image(x). # procedure tagit(x, tags) local ximage, t, prefix static serial initial serial := table(0) if \tags[x] then return tags[x] if match("record constructor ", ximage := image(x)) then return ximage # record constructor if match("record ", t := ximage) | ((t := type(x)) == ("list" | "table" | "set")) then { prefix := map(t[1], "rlts", "RLTS") return tags[x] := prefix || (serial[prefix] +:=1) } # structure else return ximage # anything else end # Every component sub-structure of the current structure gets tagged # and added to a pseudo-done set. # procedure defer_image(a, done, tags) local x, t t := set() every x := !a do { tagit(x, tags) if \tags[x] then insert(t, x) # if x actually is a sub-structure } put(done, t) return end # Create the image of every component of the current structure. # Sub-structures get deleted from the local pseudo-done set before # we actually create their image. # procedure do_image(a, done, tags) local x, t t := done[-1] suspend (delete(t, x := !a), Imageb(x, done, tags)) end # list image # procedure limageb(a, done, tags) local s if *a = 0 then s := tags[a] || ":[]" else { defer_image(a, done, tags) s := tags[a] || ":[" every s ||:= do_image(a, done, tags) || "," s[-1] := "]" pull(done) } return s end # record image # procedure rimageb(x, done, tags) local s s := image(x) s ?:= (="record " & (":" || (tab(upto('(') + 1)))) if *x = 0 then s := tags[x] || s || ")" else { defer_image(x, done, tags) s := tags[x] || s every s ||:= do_image(x, done, tags) || "," s[-1] := ")" pull(done) } return s end # set image # procedure simageb(S, done, tags) local s if *S = 0 then s := tags[S] || ":[]" else { defer_image(S, done, tags) s := tags[S] || ":[" every s ||:= do_image(S, done, tags) || "," s[-1] := "]" pull(done) } return s end # table image # procedure timageb(t, done, tags) local s, a if *t = 0 then s := tags[t] || ":[]" else { a := sort(t,3) defer_image(a, done, tags) s := tags[t] || ":[" while s ||:= do_image([get(a)], done, tags) || "->" || do_image([get(a)], done, tags) || "," s[-1] := "]" pull(done) } return s end icon-9.4.3/ipl/procs/vrml2lib.icn0000664000175000017500000001453107310755716016160 0ustar chrishchrish############################################################################ # # File: vrml2lib.icn # # Subject: Procedures to support construction of VRML 2.0 files # # Author: Ralph E. Griswold # # Date: November 19, 1997 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # This file contains record declarations for VRML 2.0 nodes. # # Note: Although VRML 2.0 allows node fields to be given in any order, # they must be specified in the order given in the record declarations # that follow. # # Group nodes require list arguments for lists of nodes. # ############################################################################ record Anchor( children, bboxCenter, bboxSize, url, parameter, decsription, addChildren, removeChildren ) record Appearance( material, texture, textureTransform ) record AudioClip( url, duration, starttime, stopTime, pitch, loop, isActive, duration_changed ) record Background( skyColor, skyAngle, groundCOlor, groundAngle, backUrl, bottomUrl, frontUrl, leftUrl, rightUrl, topUrl, set_bind, bind_changed ) record Billboard( children, axixOfRotation, bboxCenter, bboxSize, addChildren, removeChildren ) record Box( size ) record Collision( children, collide, bboxCenter, bboxSize, proxy, collideTime, addChildren, removeChildren ) record Color( color ) record ColorInterpolator( key, keyValue, set_fraction, value_changed ) record Comment( text ) record Cone( height, bottomRadius, side, bottom ) record Coordinate( point ) record CoordinateInterpolator( key, keyValue, set_fraction, value_changed ) record Cylinder( radius, height, side, top, bottom ) record CylinderSensor( enabled, diskAngle, autoOffset, maxAngle, minAngle, isActive, rotation_changed, trackPoint_changed ) record DirectionalLight( on, intensity, ambientIntensity, color, direction ) record ElevationGrid( xDimension, xSpacing, zDimension, zSpacing, height, color, colorPerVertex, normal, normalPerVertex, texCoord, ccw, solid, creaseAngle, set_height ) record Extrusion( crossSection, spine, scale, orientation, beginCap, endCap, ccw, solid, convex, creaseAngle, set_spine, set_crossSection, set_scale, set_orientation ) record Fog( color, visibilityRange, fogType, set_bind, bind_changed ) record FontStyle( family, style, size, spacing, justify, horizontal, leftToRight, topToBottom, language ) record Group( children, bboxCenter, bboxSize, addChildren, removeChildren ) record ImageTexture( url, repeatS, repeatT ) record Include( name ) record IndexedFaceSet( coord, coordIndex, texCoord, texCoordIndex, color, colorIndex, colorPerVertex, normal, normalIndex, normalPerVertex, ccw, convex, solid, creaseAngle, set_coordIndex, set_texCoordIndex, set_colorIndex, set_normalIndex ) record IndexedLineSet( coord, coordIndex, color, colorIndex, colorPerVertex, set_coordIndex, set_colorIndex ) record Inline( url, bboxCenter, bboxSize ) record LOD( center, level, range ) record Material( diffuseColor, ambientIntensity, emissiveColor, shininess, specularColor, transparency ) record MovieTexture( url, loop, speed, startTime, stopTime, repeatS, repeatT, isActive, duration_changed ) record NavigationInfo( type, speed, avatarSize, headlight, visibilityLimit, set_bind, isBound ) record Normal( vector ) record NormalInterpolator( key, keyValue, set_fraction, value_changed ) record OrientationInterpolator( key, keyValue, set_fraction, value_changed ) record PixelTexture( image, repeatS, repeatT ) record PlaneSensor( enabled, autoOffset, offset, maxPosition, minPosition, isActive, translation_changed, trackPoint_changed ) record PointLight( on, location, radius, intensity, ambientIntensity, color, attenuation ) record PointSet( coord, color ) record PositionInterpolator( key, keyValue, set_fraction, value_changed ) record ProximitySensor( enabled, center, size, isActive, enterTime, exitTIme, position_changed, orientation_cahnged ) record ScalarInterpolator( key, keyValue, set_fraction, value_changed ) record Script( url, mustEvaluate, directOutput, list ) record Shape( appearance, geometry ) record Sound( source, intensity, location, direction, minFront, minBack, maxFront, maxBack, priority, spatialize ) record Sphere( radius ) record SphereSensor( enabled, autoOffset, offset, isActive, rotation_changed, trackPoint_changed ) record SpotLight( on, location, direction, radius, intensity, ambientIntensity, color, attenuation, beamWidth, cutOffAngle ) record Switch( children, choice, whichChoice ) record Text( string, length, maxExtent, fontStyle ) record TextureCoordinate( point ) record TextureTransform( translation, rotation, scale, center ) record TimeSensor( enabled, startTime, stopTime, cycleInterval, loop, isActive, time, cycleTime, fraction_changed ) record TouchSensor( enabled, isActive, isOver, touchTime, hitPoint_changed, hitNOrmal_changed, hitTexCoord_changed ) record Transform( children, translation, rotation, scale, scaleOrientation, bboxCenter, bboxSize, center, addChildren, removeChildren ) record Viewpoint( position, orientation, fieldOfView, description, jump, set_bind, isBound, bindTime ) record VisibilitySensor( enabled, center, size, isActive, enterTime, exitTIme ) record WorldInfo( title, info ) icon-9.4.3/ipl/procs/trees.icn0000664000175000017500000000426207140713037015540 0ustar chrishchrish############################################################################ # # File: trees.icn # # Subject: Procedures for manipulating trees and dags # # Author: Ralph E. Griswold # # Date: December 27, 1995 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # depth(t) compute maximum depth of tree t # # ldag(s) construct a dag from the string s # # ltree(s) construct a tree from the string s # # stree(t) construct a string from the tree t # # tcopy(t) copy tree t # # teq(t1,t2) compare trees t1 and t2 # # visit(t) visit, in preorder, the nodes of the tree t # ############################################################################ procedure depth(ltree) #: depth of tree local count count := 0 every count <:= 1 + depth(ltree[2 to *ltree]) return count end procedure ldag(stree,done) #: construct dag from string local L /done := table() if L := \done[stree] then return L stree ? if L := [tab(upto('('))] then { move(1) while put(L,ldag(tab(bal(',)')),done)) do move(1) } else L := [tab(0)] return done[stree] := L end procedure ltree(stree) #: construct tree from string local L stree ? if L := [tab(upto('('))] then { move(1) while put(L,ltree(tab(bal(',)')))) do move(1) } else L := [tab(0)] return L end procedure stree(ltree) #: construct string from tree local s if *ltree = 1 then return ltree[1] s := ltree[1] || "(" every s ||:= stree(ltree[2 to *ltree]) || "," return s[1:-1] || ")" end procedure tcopy(ltree) #: tree copy local L L := [ltree[1]] every put(L,tcopy(ltree[2 to *ltree])) return L end procedure teq(L1,L2) #: tree equivalence local i if *L1 ~= *L2 then fail if L1[1] ~== L2[1] then fail every i := 2 to *L1 do if not teq(L1[i],L2[i]) then fail return L2 end procedure visit(ltree) #: visit nodes of tree suspend ltree | visit(ltree[2 to *ltree]) end icon-9.4.3/ipl/procs/iscreen.icn0000664000175000017500000001636607274062401016056 0ustar chrishchrish############################################################################ # # File: iscreen.icn # # Subject: Procedures for screen functions # # Author: Richard L. Goerwitz # # Date: May 2, 2001 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # Version: 1.28 # ############################################################################ # # This file contains some rudimentary screen functions for use with # itlib.icn (termlib-like routines for Icon). # # clear() - clears the screen (tries several methods) # emphasize() - initiates emphasized (usu. = reverse) mode # boldface() - initiates bold mode # blink() - initiates blinking mode # normal() - resets to normal mode # message(s) - displays message s on 2nd-to-last line # underline() - initiates underline mode # status_line(s,s2,p) - draws status line s on the 3rd-to-last # screen line; if s is too short for the terminal, s2 is used; # if p is nonnull then it either centers, left-, or right-justi- # fies, depending on the value, "c," "l," or "r." # clear_emphasize() - horrible way of clearing the screen to all- # emphasize mode; necessary for many terminals # ############################################################################ # # Requires: UNIX # ############################################################################ # # Links: itlib (or your OS-specific port of itlib) # ############################################################################ # # See also: boldface.icn # ############################################################################ link itlib procedure clear() # Clears the screen. Tries several methods. local i normal() if not iputs(getval("cl")) then iputs(igoto(getval("cm"),1,1) | getval("ho")) if not iputs(getval("cd")) then { every i := 1 to getval("li") do { iputs(igoto(getval("cm"),1,i)) iputs(getval("ce")) } iputs(igoto(getval("cm"),1,1)) } return end procedure boldface() static bold_str, cookie_str initial { if bold_str := getval("md") then cookie_str := repl(getval("le"|"bc") | "\b", getval("mg")) else { # One global procedure value substituted for another. boldface := emphasize return emphasize() } } normal() iputs(\bold_str) iputs(\cookie_str) return end procedure blink() static blink_str, cookie_str initial { if blink_str := getval("mb") then cookie_str := repl(getval("le"|"bc") | "\b", getval("mg")) else { # One global procedure value substituted for another. blink := emphasize return emphasize() } } normal() iputs(\blink_str) iputs(\cookie_str) return end procedure emphasize() static emph_str, cookie_str initial { if emph_str := getval("so") then cookie_str := repl(getval("le"|"bc") | "\b", getval("sg")) else { if emph_str := getval("mr") then cookie_str := repl(getval("le"|"bc") | "\b", getval("mg")) else if emph_str := getval("us") then cookie_str := repl(getval("le"|"bc") | "\b", getval("ug")) } } normal() iputs(\emph_str) iputs(\cookie_str) return end procedure underline() static underline_str, cookie_str initial { if underline_str := getval("us") then cookie_str := repl(getval("le"|"bc") | "\b", getval("ug")) } normal() iputs(\underline_str) iputs(\cookie_str) return end procedure normal(mode) static UN_emph_str, emph_cookie_str, UN_underline_str, underline_cookie_str, UN_bold_str, bold_cookie_str initial { # Find out code to turn off emphasize (reverse video) mode. if UN_emph_str := getval("se") then # Figure out how many backspaces we need to erase cookies. emph_cookie_str := repl(getval("le"|"bc") | "\b", getval("sg")) else UN_emph_str := "" # Finally, figure out how to turn off underline mode. if UN_underline_str := (UN_emph_str ~== getval("ue")) then underline_cookie_str := repl(getval("le"|"bc")|"\b", getval("ug")) else UN_underline_str := "" # Figure out how to turn off boldface mode. if UN_bold_str := (UN_underline_str ~== (UN_emph_str ~== getval("me"))) then # Figure out how many backspaces we need to erase cookies. bold_cookie_str := repl(getval("le"|"bc") | "\b", getval("mg")) else UN_bold_str := "" } iputs("" ~== UN_emph_str) & iputs(\emph_cookie_str) iputs("" ~== UN_underline_str) & iputs(\underline_cookie_str) iputs("" ~== UN_bold_str) & iputs(\bold_cookie_str) return end procedure status_line(s,s2,p) # Writes a status line on the terminal's third-to-last line # The only necessary argument is s. S2 (optional) is used # for extra narrow screens. In other words, by specifying # s2 you give status_line an alternate, shorter status string # to display, in case the terminal isn't wide enough to sup- # port s. If p is nonnull, then the status line is either # centered (if equal to "c"), left justified ("l"), or right # justified ("r"). local width /s := ""; /s2 := ""; /p := "c" width := getval("co") if *s > width then { (*s2 < width, s := s2) | er("status_line","Your terminal is too narrow.",4) } case p of { "c" : s := center(s,width) "l" : s := left(s,width) "r" : s := right(s,width) default: stop("status_line: Unknown option "||string(p),4) } iputs(igoto(getval("cm"), 1, getval("li")-2)) emphasize(); writes(s) normal() return end procedure message(s) # Display prompt s on the second-to-last line of the screen. # I hate to use the last line, due to all the problems with # automatic scrolling. /s := "" normal() iputs(igoto(getval("cm"), 1, getval("li"))) iputs(getval("ce")) normal() iputs(igoto(getval("cm"), 1, getval("li")-1)) iputs(getval("ce")) writes(s[1:getval("co")] | s) return end procedure clear_underline() # Horrible way of clearing the screen to all underline mode, but # the only apparent way we can do it "portably" using the termcap # capability database. local i underline() iputs(igoto(getval("cm"),1,1)) if getval("am") then { underline() every 1 to (getval("li")-1) * getval("co") do writes(" ") } else { every i := 1 to getval("li")-1 do { iputs(igoto(getval("cm"), 1, i)) underline() writes(repl(" ",getval("co"))) } } iputs(igoto(getval("cm"),1,1)) end procedure clear_emphasize() # Horrible way of clearing the screen to all reverse-video, but # the only apparent way we can do it "portably" using the termcap # capability database. local i emphasize() iputs(igoto(getval("cm"),1,1)) if getval("am") then { emphasize() every 1 to (getval("li")-1) * getval("co") do writes(" ") } else { every i := 1 to getval("li")-1 do { iputs(igoto(getval("cm"), 1, i)) emphasize() writes(repl(" ",getval("co"))) } } iputs(igoto(getval("cm"),1,1)) end icon-9.4.3/ipl/procs/word.icn0000664000175000017500000000316407140713037015371 0ustar chrishchrish############################################################################ # # File: word.icn # # Subject: Procedure to scan UNIX-style command line words # # Author: Robert J. Alexander # # Date: August 14, 1996 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # word(s) -- Produces the position past a UNIX-style command line # word. # # dequote(s) -- Produces the UNIX-style command line word s with any # quoting characters removed. # ############################################################################ # # Links: scanset # ############################################################################ link scanset # # word(s) -- Produces the position past a UNIX-style command line # word. # procedure word(s,i1,i2) local c,d,p,e,x x := scan_setup(s,i1,i2) x.ss ? { (while tab(upto(' \t"\'')) do { if (c := move(1)) == ("\"" | "'") then { e := c ++ "\\" while tab(upto(e)) do { d := move(1) if d == c then break move(1) } } else break }) | "" ~== tab(0) | fail p := &pos } return x.offset + p end # # dequote(s) -- Produces the UNIX-style command line word s with any # quoting characters removed. # procedure word_dequote(s) local c,d s ? { s := "" while s ||:= tab(upto('"\'\\')) do { c := move(1) if c == "\\" then s ||:= move(1) else { if \d then (s ||:= d ~== c) | (d := &null) else d := c } } return s || tab(0) } end icon-9.4.3/ipl/procs/speedo.icn0000664000175000017500000000441707450115327015701 0ustar chrishchrish############################################################################ # # File: speedo.icn # # Subject: Procedure to indicate percentage of completion # # Author: Robert J. Alexander # # Date: March 25, 2002 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # speedo -- a "percentage complete" graphic indicator for # command-line-oriented user interfaces. # # This is a general facility that can function for anything, and a # specific implementation for input files. # # The general implementation consists of two procedures: # # SpeedoNew -- Starts a speedo # SpeedoValue -- Sets a new value for the speedo (non-decreasing) # # See FileSpeedo for an example of using the general facility. # # FileSpeedo is especially for input files. Here is how to use it, by # example: # # f := open("input_file") | stop("!!!") # FileSpeedo(f,75,&errout) # Start a file speedo, specifying # # length and output file # while read(f) do { # FileSpeedo(f) # Keep it updated while reading file # ... # } # FileSpeedo() # Finish up # ############################################################################ record SpeedoRec(max,length,file,lastOut,string) procedure SpeedoNew(max,length,file,str) /length := 79 /file := &errout /str := "=" write(file,"|",repl("-",length / *str * *str - 2),"|") return SpeedoRec(max,length,file,0,str) end procedure SpeedoValue(self,value) local len if /value then { write(self.file) return } len := self.length * value / self.max / *self.string if len > self.lastOut then { writes(self.file,repl(self.string,len - self.lastOut)) self.lastOut := len } return self end procedure FileSpeedo(file,length,outFile,str) local savePos, fileSize static speedo if /file then { SpeedoValue(speedo) return } if \length then { savePos := where(file) seek(file,0) fileSize := where(file) seek(file,savePos) return speedo := SpeedoNew(fileSize,length,outFile,str) } return SpeedoValue(speedo,where(file)) end icon-9.4.3/ipl/procs/filesize.icn0000664000175000017500000000140707140713040016220 0ustar chrishchrish############################################################################ # # File: filesize.icn # # Subject: Procedure to get the size of a file # # Author: Ralph E. Griswold # # Date: July 9, 1998 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # filesize(s) returns the number of characters in the file named s; it # fails if s cannot be opened. # ############################################################################ procedure filesize(s) #: file size local input, size input := open(s) | fail size := 0 while size +:= *reads(input, 10000) close(input) return size end icon-9.4.3/ipl/procs/complex.icn0000664000175000017500000000417507140717301016066 0ustar chrishchrish############################################################################ # # File: complex.icn # # Subject: Procedures to perform complex arithmetic # # Author: Ralph E. Griswold # # Date: June 21, 2000 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # The following procedures perform operations on complex numbers. # # complex(r,i) create complex number with real part r and # imaginary part i # # cpxadd(z1, z2) add complex numbers z1 and z2 # # cpxdiv(z1, z2) divide complex number z1 by complex number z2 # # cpxmul(z1, z2) multiply complex number z1 by complex number z2 # # cpxsub(z1, z2) subtract complex number z2 from complex number z1 # # cpxstr(z) convert complex number z to string representation # # strcpx(s) convert string representation s of complex # number to complex number # ############################################################################ record complex(rpart, ipart) procedure strcpx(s) s ? { ="(" | fail return complex(numeric(upto('+-')), 2(move(1), numeric(upto(')')), tab(-1))) } end procedure cpxstr(z) if z.ipart < 0 then return "(" || z.rpart || z.ipart || "i)" else return "(" || z.rpart || "+" || z.ipart || "i)" end procedure cpxadd(z1, z2) return complex(z1.rpart + z2.rpart, z1.ipart + z2.ipart) end procedure cpxsub(z1, z2) return complex(z1.rpart - z2.rpart, z1.ipart - z2.ipart) end procedure cpxmul(z1, z2) return complex(z1.rpart * z2.rpart - z1.ipart * z2.ipart, z1.rpart * z2.ipart + z1.ipart * z2.rpart) end procedure cpxdiv(z1, z2) local denom denom := z2.rpart ^ 2 + z2.ipart ^ 2 return complex((z1.rpart * z2.rpart + z1.ipart * z2.ipart) / denom, (z1.ipart * z2.rpart - z1.rpart * z2.ipart) / denom) end procedure cpxconj(z) return complex(z.rpart, -z.ipart) end procedure cpxabs(z) return sqrt(z.rpart ^ 2 + z.ipart ^ 2) end icon-9.4.3/ipl/procs/polystuf.icn0000664000175000017500000001342407140713037016303 0ustar chrishchrish############################################################################ # # File: polystuf.icn # # Subject: Procedures for manipulating polynomials # # Author: Erik Eid # # Date: May 23, 1994 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # These procedures are for creating and performing operations on single- # variable polynomials (like ax^2 + bx + c). # # poly (c1, e1, c2, e2, ...) - creates a polynomial from the parameters # given as coefficient-exponent pairs: # c1x^e1 + c2x^e2 + ... # is_zero (n) - determines if n = 0 # is_zero_poly (p) - determines if a given polynomial is 0x^0 # poly_add (p1, p2) - returns the sum of two polynomials # poly_sub (p1, p2) - returns the difference of p1 - p2 # poly_mul (p1, p2) - returns the product of two polynomials # poly_eval (p, x) - finds the value of polynomial p when # evaluated at the given x. # term2string (c, e) - converts one coefficient-exponent pair # into a string. # poly_string (p) - returns the string representation of an # entire polynomial. # ############################################################################ procedure poly (terms[]) local p, coef, expn if *terms % 2 = 1 then fail # Odd number of terms means the # list does not contain all # coefficient-exponent pairs. p := table() while *terms > 0 do { # A polynomial is stored as a coef := get(terms) # table in which the keys are expn := get(terms) # exponents and the elements are # coefficients. if numeric(coef) then if numeric(expn) then p[real(expn)] := coef # If any part of pair is invalid, # discard it. Otherwise, save # term with a real key (necessary # for consistency in sorting). } return p end procedure is_zero (n) if ((n = integer(n)) & (n = 0)) then return else fail end procedure is_zero_poly (p) if ((*p = 1) & is_zero(p[real(0)])) then return else fail end procedure poly_add (p1, p2) local p3, z p3 := copy(p1) # Make a copy to start with. if is_zero_poly (p3) then delete (p3, real(0)) # If first is zero, don't include # the 0x^0 term. every z := key(p2) do { # For every term in the second if member (p3, z) then p3[z] +:= p2[z] # polynomial, if one of its else p3[z] := p2[z] # exponent is in the third, # increment its coefficient. # Otherwise, create a new term. if is_zero(p3[z]) then delete (p3, z) # Remove any term with coefficient # zero, since the term equals 0. } if *p3 = 0 then p3[real(0)] := 0 # Empty poly table indicates a # zero polynomial. return p3 end procedure poly_sub (p1, p2) local p3, z p3 := copy(p1) # Similar process to poly_add. if is_zero_poly (p3) then delete (p3, real(0)) every z := key(p2) do { if member (p3, z) then p3[z] -:= p2[z] else p3[z] := -p2[z] if is_zero(p3[z]) then delete (p3, z) } if *p3 = 0 then p3[real(0)] := 0 return p3 end procedure poly_mul (p1, p2) local p3, c, e, y, z p3 := table() every y := key(p1) do # Multiply every term in p1 by every z := key(p2) do { # every term in p2 and add those c := p1[y] * p2[z] # results into p3 as in poly_add. e := y + z if member (p3, e) then p3[e] +:= c else p3[e] := c if is_zero(p3[e]) then delete (p3, e) } if *p3 = 0 then p3[real(0)] := 0 return p3 end procedure poly_eval (p, x) local e, sum sum := 0 every e := key(p) do # Increase sum by coef * x ^ exp. sum +:= p[e] * (x ^ e) # Note: this procedure does not # check in advance if x^e will # result in an error. return sum end procedure term2string (c, e) local t t := "" if e = integer(e) then e := integer(e) # Removes unnecessary ".0" if c ~= 1 then { if c = -1 then t ||:= "-" else t ||:= c } # Use "-x" or "x," not "-1x" or # "1x." else if e = 0 then t ||:= c # Make sure to include a # constant term. if e ~= 0 then { t ||:= "x" if e ~= 1 then t ||:= ("^" || e) # Use "x," not "x^1." } return t end procedure poly_string (p) local pstr, plist, c, e pstr := "" plist := sort(p, 3) # Sort table into key-value pairs. while *plist > 0 do { c := pull(plist) # Since sort is nondecreasing, e := pull(plist) # take terms in reverse order. pstr ||:= (term2string (c, e) || " + ") } pstr := pstr[1:-3] # Remove last " + " from end return pstr end icon-9.4.3/ipl/procs/memlog.icn0000664000175000017500000000241407140713037015673 0ustar chrishchrish############################################################################ # # File: memlog.icn # # Subject: Procedure to log memory usage # # Author: Gregg M. Townsend # # Date: August 14, 1996 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # memlog(f) writes a message to file f recording the current memory # usage in the string and block regions. For each, three figures are # written: amount in use, amount reserved, and number of collections. # # memlog does not perturb the figures: it requires no allocation itself. # f defaults to &output. memlog() returns the total current usage. # ############################################################################ procedure memlog(f) #: log memory usage local sused, bused, salloc, balloc, scoll, bcoll every sused := &storage \ 2 every bused := &storage \ 3 every salloc := ®ions \ 2 every balloc := ®ions \ 3 every scoll := &collections \ 3 every bcoll := &collections \ 4 write(f, "str:", sused, "/", salloc, "(", scoll, ") ", "blk:", bused, "/", balloc, "(", bcoll, ") ") return sused + bused end icon-9.4.3/ipl/procs/lu.icn0000664000175000017500000001051107140713036015027 0ustar chrishchrish############################################################################ # # File: lu.icn # # Subject: Procedures for LU manipulation # # Author: Ralph E. Griswold # # Date: August 14, 1996 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # lu_decomp(M, I) performs LU decomposition on the square matrix M # using the vector I. Both M and I are modified in the process. The # value returned is +1 or -1 depending on whether the number of row # interchanges is even or odd. lu_decomp() is used in combination with # lu_back_sub() to solve linear equations or invert matrices. # # lu_decomp() fails if the matrix is singular. # # lu_back_sub(M, I, B) solves the set of linear equations M x X = B. M # is the matrix as modified by lu_decomp(). I is the index vector # produced by lu_decomp(). B is the right-hand side vector and return # with the solution vector. M and I are not modified by lu_back_sub() # and can be used in successive calls of lu_back_sub() with different # Bs. # ############################################################################ # # Acknowledgement: These procedures are based on algorithms given in # "Numerical Recipes; The Art of Scientific Computing"; William H. Press, # Brian P. Flannery, Saul A. Teukolsky. and William T. Vetterling; # Cambridge University Press, 1986. # ############################################################################ procedure lu_decomp(M, I) local small, d, n, vv, i, largest, j, sum, k, pivot_val, imax initial small := 1.0e-20 d := 1.0 n := *M if n ~= *M[1] then stop("*** non-square matrix") if n ~= *I then stop("*** index vector incorrect length") vv := list(n, 0.0) # scaling vector every i := 1 to n do { largest := 0.0 every j := 1 to n do largest <:= abs(M[i][j]) if largest = 0.0 then fail # matrix is singular vv[i] := 1.0 / largest } every j := 1 to n do { # Crout's method if j > 1 then { every i := 1 to j - 1 do { sum := M[i][j] if i > 1 then { every k := 1 to i - 1 do sum -:= M[i][k] * M[k][j] M[i][j] := sum } } } largest := 0.0 # search for largest pivot every i := j to n do { sum := M[i][j] if j > 1 then { every k := 1 to j - 1 do sum -:= M[i][k] * M[k][j] M[i][j] := sum } pivot_val := vv[i] * abs(sum) if pivot_val > largest then { largest := pivot_val imax := i } } if j ~= imax then { # interchange rows? every k := 1 to n do { pivot_val := M[imax][k] M[imax][k] := M[j][k] M[j][k] := pivot_val } d := -d # change parity vv[imax] := vv[j] # and scale factor } I[j] := imax if j ~= n then { # divide by the pivot element if M[j][j] = 0.0 then M[j][j] := small # small value is better than pivot_val := 1.0 / M[j][j] # zero for some applications every i := j + 1 to n do M[i][j] *:= pivot_val } } if M[n][n] = 0.0 then M[n][n] := small return d end procedure lu_back_sub(M, I, B) local n, ii, i, ip, sum, j n := *M if n ~= *M[1] then stop("*** matrix not square") if n ~= *I then stop("*** index vector wrong length") if n ~= *B then stop("*** output vector wrong length") ii := 0 every i := 1 to n do { ip := I[i] | stop("failed in line ", &line) sum := B[ip] | stop("failed in line ", &line) B[ip] := B[i] | stop("failed in line ", &line) if ii ~= 0 then every j := ii to i - 1 do sum -:= M[i][j] * B[j] | stop("failed in line ", &line) else if sum ~= 0.0 then ii := i B[i] := sum | stop("failed in line ", &line) } every i := n to 1 by -1 do { sum := B[i] | stop("failed in line ", &line) if i < n then { every j := i + 1 to n do sum -:= M[i][j] * B[j] | stop("failed in line ", &line) } B[i] := sum / M[i][i] | stop("failed in line ", &line) } return end icon-9.4.3/ipl/procs/findre.icn0000664000175000017500000005141207140713036015663 0ustar chrishchrish############################################################################ # # File: findre.icn # # Subject: Procedure to find regular expression # # Author: Richard L. Goerwitz # # Date: March 3, 1996 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # Version: 1.17 # ############################################################################ # # DESCRIPTION: findre() is like the Icon builtin function find(), # except that it takes, as its first argument, a regular expression # pretty much like the ones the Unix egrep command uses (the few # minor differences are listed below). Its syntax is the same as # find's (i.e. findre(s1,s2,i,j)), with the exception that a no- # argument invocation wipes out all static structures utilized by # findre, and then forces a garbage collection. # ############################################################################ # # (For those not familiar with regular expressions and the Unix egrep # command: findre() offers a simple and compact wildcard-based search # system. If you do a lot of searches through text files, or write # programs which do searches based on user input, then findre is a # utility you might want to look over.) # # IMPORTANT DIFFERENCES between find and findre: As noted above, # findre() is just a find() function that takes a regular expression # as its first argument. One major problem with this setup is that # it leaves the user with no easy way to tab past a matched # substring, as with # # s ? write(tab(find("hello")+5)) # # In order to remedy this intrinsic deficiency, findre() sets the # global variable __endpoint to the first position after any given # match occurs. Use this variable with great care, preferably # assigning its value to some other variable immediately after the # match (for example, findre("hello [.?!]*",s) & tmp := __endpoint). # Otherwise, you will certainly run into trouble. (See the example # below for an illustration of how __endpoint is used). # # IMPORTANT DIFFERENCES between egrep and findre: findre utilizes # the same basic language as egrep. The only big difference is that # findre uses intrinsic Icon data structures and escaping conven- # tions rather than those of any particular Unix variant. Be care- # ful! If you put findre("\(hello\)",s) into your source file, # findre will treat it just like findre("(hello)",s). If, however, # you enter '\(hello\)' at run-time (via, say, findre(!&input,s)), # what Icon receives will depend on your operating system (most # likely, a trace will show "\\(hello\\)"). # ############################################################################ # # BUGS: Space has essentially been conserved at the expense of time # in the automata produced by findre(). The algorithm, in other # words, will produce the equivalent of a pushdown automaton under # certain circumstances, rather than strive (at the expense of space) # for full determinism. I tried to make up a nfa -> dfa converter # that would only create that portion of the dfa it needed to accept # or reject a string, but the resulting automaton was actually quite # slow (if anyone can think of a way to do this in Icon, and keep it # small and fast, please let us all know about it). Note that under # version 8 of Icon, findre takes up negligible storage space, due to # the much improved hashing algorithm. I have not tested it under # version 7, but I would expect it to use up quite a bit more space # in that environment. # # IMPORTANT NOTE: Findre takes a shortest-possible-match approach # to regular expressions. In other words, if you look for "a*", # findre will not even bother looking for an "a." It will just match # the empty string. Without this feature, findre would perform a bit # more slowly. The problem with such an approach is that often the # user will want to tab past the longest possible string of matched # characters (say tab((findre("a*|b*"), __endpoint)). In circumstan- # ces like this, please just use something like: # # s ? { # tab(find("a")) & # or use Arb() from the IPL (patterns.icn) # tab(many('a')) # tab(many('b')) # } # # or else use some combination of findre and the above. # ############################################################################ # # REGULAR EXPRESSION SYNTAX: Regular expression syntax is complex, # and yet simple. It is simple in the sense that most of its power # is concentrated in about a dozen easy-to-learn symbols. It is # complex in the sense that, by combining these symbols with # characters, you can represent very intricate patterns. # # I make no pretense here of offering a full explanation of regular # expressions, their usage, and the deeper nuances of their syntax. # As noted above, this should be gleaned from a Unix manual. For # quick reference, however, I have included a brief summary of all # the special symbols used, accompanied by an explanation of what # they mean, and, in some cases, of how they are used (most of this # is taken from the comments prepended to Jerry Nowlin's Icon-grep # command, as posted a couple of years ago): # # ^ - matches if the following pattern is at the beginning # of a line (i.e. ^# matches lines beginning with "#") # $ - matches if the preceding pattern is at the end of a line # . - matches any single character # + - matches from 1 to any number of occurrences of the # previous expression (i.e. a character, or set of paren- # thesized/bracketed characters) # * - matches from 0 to any number of occurrences of the previous # expression # \ - removes the special meaning of any special characters # recognized by this program (i.e if you want to match lines # beginning with a "[", write ^\[, and not ^[) # | - matches either the pattern before it, or the one after # it (i.e. abc|cde matches either abc or cde) # [] - matches any member of the enclosed character set, or, # if ^ is the first character, any nonmember of the # enclosed character set (i.e. [^ab] matches any character # _except_ a and b). # () - used for grouping (e.g. ^(abc|cde)$ matches lines consist- # ing of either "abc" or "cde," while ^abc|cde$ matches # lines either beginning with "abc" or ending in "cde") # ############################################################################ # # EXAMPLE program: # # procedure main(a) # while line := !&input do { # token_list := tokenize_line(line,a[1]) # every write(!token_list) # } # end # # procedure tokenize_line(s,sep) # tmp_lst := [] # s ? { # while field := tab(findre(sep)|0) & # mark := __endpoint # do { # put(tmp_lst,"" ~== field) # if pos(0) then break # else tab(mark) # } # } # return tmp_lst # end # # The above program would be compiled with findre (e.g. "icont # test_prg.icn findre.icn") to produce a single executable which # tokenizes each line of input based on a user-specified delimiter. # Note how __endpoint is set soon after findre() succeeds. Note # also how empty fields are excluded with "" ~==, etc. Finally, note # that the temporary list, tmp_lst, is not needed. It is included # here merely to illustrate one way in which tokens might be stored. # # Tokenizing is, of course, only one of many uses one might put # findre to. It is very helpful in allowing the user to construct # automata at run-time. If, say, you want to write a program that # searches text files for patterns given by the user, findre would be # a perfect utility to use. Findre in general permits more compact # expression of patterns than one can obtain using intrinsic Icon # scanning facilities. Its near complete compatibility with the Unix # regexp library, moreover, makes for greater ease of porting, # especially in cases where Icon is being used to prototype C code. # ############################################################################ global state_table, parends_present, slash_present global biggest_nonmeta_str, __endpoint record o_a_s(op,arg,state) procedure findre(re, s, i, j) local p, default_val, x, nonmeta_len, tokenized_re, tmp static FSTN_table, STRING_table initial { FSTN_table := table() STRING_table := table() } if /re then { FSTN_table := table() STRING_table := table() collect() # do it *now* return } if /s := &subject then default_val := &pos else default_val := 1 if \i then { if i < 1 then i := *s + (i+1) } else i := default_val if \j then { if j < 1 then j := *s + (j+1) } else j := *s+1 if /FSTN_table[re] then { # If we haven't seen this re before, then... if \STRING_table[re] then { # ...if it's in the STRING_table, use plain find() every p := find(STRING_table[re],s,i,j) do { __endpoint := p + *STRING_table[re]; suspend p } fail } else { # However, if it's not in the string table, we have to # tokenize it and check for metacharacters. If it has # metas, we create an FSTN, and put that into FSTN_table; # otherwise, we just put it into the STRING_table. tokenized_re := tokenize(re) if 0 > !tokenized_re then { # if at least one element is < 0, re has metas MakeFSTN(tokenized_re) | err_out(re,2) # both biggest_nonmeta_str and state_table are global /FSTN_table[re] := [.biggest_nonmeta_str, copy(state_table)] } else { # re has no metas; put the input string into STRING_table # for future reference, and execute find() at once tmp := ""; every tmp ||:= char(!tokenized_re) insert(STRING_table,re,tmp) every p := find(STRING_table[re],s,i,j) do { __endpoint := p + *STRING_table[re]; suspend p } fail } } } if nonmeta_len := (1 < *FSTN_table[re][1]) then { # If the biggest non-meta string in the original re # was more than 1, then put in a check for it... s[1:j] ? { tab(x := i to j - nonmeta_len) & (find(FSTN_table[re][1]) | fail) \ 1 & (__endpoint := apply_FSTN(&null,FSTN_table[re][2])) & (suspend x) } } else { #...otherwise it's not worth worrying about the biggest nonmeta str s[1:j] ? { tab(x := i to j) & (__endpoint := apply_FSTN(&null,FSTN_table[re][2])) & (suspend x) } } end procedure apply_FSTN(ini,tbl) local biggest_pos, POS, tmp, fin static s_tbl /ini := 1 & s_tbl := tbl & biggest_pos := 1 if ini = 0 then { return &pos } POS := &pos fin := 0 repeat { if tmp := !s_tbl[ini] & tab(tmp.op(tmp.arg)) then { if tmp.state = fin then return &pos else ini := tmp.state } else (&pos := POS, fail) } end procedure tokenize(s) local token_list, chr, tmp, b_loc, next_one, fixed_length_token_list, i token_list := list() s ? { tab(many('*+?|')) while chr := move(1) do { if chr == "\\" # it can't be a metacharacter; remove the \ and "put" # the integer value of the next chr into token_list then put(token_list,ord(move(1))) | err_out(s,2,chr) else if any('*+()|?.$^',chr) then { # Yuck! Egrep compatibility stuff. case chr of { "*" : { tab(many('*+?')) put(token_list,-ord("*")) } "+" : { tmp := tab(many('*?+')) | &null if upto('*?',\tmp) then put(token_list,-ord("*")) else put(token_list,-ord("+")) } "?" : { tmp := tab(many('*?+')) | &null if upto('*+',\tmp) then put(token_list,-ord("*")) else put(token_list,-ord("?")) } "(" : { tab(many('*+?')) put(token_list,-ord("(")) } default: { put(token_list,-ord(chr)) } } } else { case chr of { # More egrep compatibility stuff. "[" : { b_loc := find("[") | *&subject+1 every next_one := find("]",,,b_loc) \next_one ~= &pos | err_out(s,2,chr) put(token_list,-ord(chr)) } "]" : { if &pos = (\next_one+1) then put(token_list,-ord(chr)) & next_one := &null else put(token_list,ord(chr)) } default: put(token_list,ord(chr)) } } } } token_list := UnMetaBrackets(token_list) fixed_length_token_list := list(*token_list) every i := 1 to *token_list do fixed_length_token_list[i] := token_list[i] return fixed_length_token_list end procedure UnMetaBrackets(l) # Since brackets delineate a cset, it doesn't make # any sense to have metacharacters inside of them. # UnMetaBrackets makes sure there are no metacharac- # ters inside of the braces. local tmplst, i, Lb, Rb tmplst := list(); i := 0 Lb := -ord("[") Rb := -ord("]") while (i +:= 1) <= *l do { if l[i] = Lb then { put(tmplst,l[i]) until l[i +:= 1] = Rb do put(tmplst,abs(l[i])) put(tmplst,l[i]) } else put(tmplst,l[i]) } return tmplst end procedure MakeFSTN(l,INI,FIN) # MakeFSTN recursively descends through the tree structure # implied by the tokenized string, l, recording in (global) # fstn_table a list of operations to be performed, and the # initial and final states which apply to them. local i, inter, inter2, tmp, Op, Arg static Lp, Rp, Sl, Lb, Rb, Caret_inside, Dot, Dollar, Caret_outside # global biggest_nonmeta_str, slash_present, parends_present initial { Lp := -ord("("); Rp := -ord(")") Sl := -ord("|") Lb := -ord("["); Rb := -ord("]"); Caret_inside := ord("^") Dot := -ord("."); Dollar := -ord("$"); Caret_outside := -ord("^") } /INI := 1 & state_table := table() & NextState("new") & biggest_nonmeta_str := "" /FIN := 0 # I haven't bothered to test for empty lists everywhere. if *l = 0 then { /state_table[INI] := [] put(state_table[INI],o_a_s(zSucceed,&null,FIN)) return } # HUNT DOWN THE SLASH (ALTERNATION OPERATOR) every i := 1 to *l do { if l[i] = Sl & tab_bal(l,Lp,Rp) = i then { if i = 1 then err_out(l,2,char(abs(l[i]))) else { /slash_present := "yes" inter := NextState() inter2:= NextState() MakeFSTN(l[1:i],inter2,FIN) MakeFSTN(l[i+1:0],inter,FIN) /state_table[INI] := [] put(state_table[INI],o_a_s(apply_FSTN,inter2,0)) put(state_table[INI],o_a_s(apply_FSTN,inter,0)) return } } } # HUNT DOWN PARENTHESES if l[1] = Lp then { i := tab_bal(l,Lp,Rp) | err_out(l,2,"(") inter := NextState() if any('*+?',char(abs(0 > l[i+1]))) then { case l[i+1] of { -ord("*") : { /state_table[INI] := [] put(state_table[INI],o_a_s(apply_FSTN,inter,0)) MakeFSTN(l[2:i],INI,INI) MakeFSTN(l[i+2:0],inter,FIN) return } -ord("+") : { inter2 := NextState() /state_table[inter2] := [] MakeFSTN(l[2:i],INI,inter2) put(state_table[inter2],o_a_s(apply_FSTN,inter,0)) MakeFSTN(l[2:i],inter2,inter2) MakeFSTN(l[i+2:0],inter,FIN) return } -ord("?") : { /state_table[INI] := [] put(state_table[INI],o_a_s(apply_FSTN,inter,0)) MakeFSTN(l[2:i],INI,inter) MakeFSTN(l[i+2:0],inter,FIN) return } } } else { MakeFSTN(l[2:i],INI,inter) MakeFSTN(l[i+1:0],inter,FIN) return } } else { # I.E. l[1] NOT = Lp (left parenthesis as -ord("(")) every i := 1 to *l do { case l[i] of { Lp : { inter := NextState() MakeFSTN(l[1:i],INI,inter) /parends_present := "yes" MakeFSTN(l[i:0],inter,FIN) return } Rp : err_out(l,2,")") } } } # NOW, HUNT DOWN BRACKETS if l[1] = Lb then { i := tab_bal(l,Lb,Rb) | err_out(l,2,"[") inter := NextState() tmp := ""; every tmp ||:= char(l[2 to i-1]) if Caret_inside = l[2] then tmp := ~cset(Expand(tmp[2:0])) else tmp := cset(Expand(tmp)) if any('*+?',char(abs(0 > l[i+1]))) then { case l[i+1] of { -ord("*") : { /state_table[INI] := [] put(state_table[INI],o_a_s(apply_FSTN,inter,0)) put(state_table[INI],o_a_s(any,tmp,INI)) MakeFSTN(l[i+2:0],inter,FIN) return } -ord("+") : { inter2 := NextState() /state_table[INI] := [] put(state_table[INI],o_a_s(any,tmp,inter2)) /state_table[inter2] := [] put(state_table[inter2],o_a_s(apply_FSTN,inter,0)) put(state_table[inter2],o_a_s(any,tmp,inter2)) MakeFSTN(l[i+2:0],inter,FIN) return } -ord("?") : { /state_table[INI] := [] put(state_table[INI],o_a_s(apply_FSTN,inter,0)) put(state_table[INI],o_a_s(any,tmp,inter)) MakeFSTN(l[i+2:0],inter,FIN) return } } } else { /state_table[INI] := [] put(state_table[INI],o_a_s(any,tmp,inter)) MakeFSTN(l[i+1:0],inter,FIN) return } } else { # I.E. l[1] not = Lb every i := 1 to *l do { case l[i] of { Lb : { inter := NextState() MakeFSTN(l[1:i],INI,inter) MakeFSTN(l[i:0],inter,FIN) return } Rb : err_out(l,2,"]") } } } # FIND INITIAL SEQUENCES OF POSITIVE INTEGERS, CONCATENATE THEM if i := match_positive_ints(l) then { inter := NextState() tmp := Ints2String(l[1:i]) # if a slash has been encountered already, forget optimizing # in this way; if parends are present, too, then forget it, # unless we are at the beginning or end of the input string if INI = 1 | FIN = 2 | /parends_present & /slash_present & *tmp > *biggest_nonmeta_str then biggest_nonmeta_str := tmp /state_table[INI] := [] put(state_table[INI],o_a_s(match,tmp,inter)) MakeFSTN(l[i:0],inter,FIN) return } # OKAY, CLEAN UP ALL THE JUNK THAT'S LEFT i := 0 while (i +:= 1) <= *l do { case l[i] of { Dot : { Op := any; Arg := &cset } Dollar : { Op := pos; Arg := 0 } Caret_outside: { Op := pos; Arg := 1 } default : { Op := match; Arg := char(0 < l[i]) } } | err_out(l,2,char(abs(l[i]))) inter := NextState() if any('*+?',char(abs(0 > l[i+1]))) then { case l[i+1] of { -ord("*") : { /state_table[INI] := [] put(state_table[INI],o_a_s(apply_FSTN,inter,0)) put(state_table[INI],o_a_s(Op,Arg,INI)) MakeFSTN(l[i+2:0],inter,FIN) return } -ord("+") : { inter2 := NextState() /state_table[INI] := [] put(state_table[INI],o_a_s(Op,Arg,inter2)) /state_table[inter2] := [] put(state_table[inter2],o_a_s(apply_FSTN,inter,0)) put(state_table[inter2],o_a_s(Op,Arg,inter2)) MakeFSTN(l[i+2:0],inter,FIN) return } -ord("?") : { /state_table[INI] := [] put(state_table[INI],o_a_s(apply_FSTN,inter,0)) put(state_table[INI],o_a_s(Op,Arg,inter)) MakeFSTN(l[i+2:0],inter,FIN) return } } } else { /state_table[INI] := [] put(state_table[INI],o_a_s(Op,Arg,inter)) MakeFSTN(l[i+1:0],inter,FIN) return } } # WE SHOULD NOW BE DONE INSERTING EVERYTHING INTO state_table # IF WE GET TO HERE, WE'VE PARSED INCORRECTLY! err_out(l,4) end procedure NextState(new) static nextstate if \new then nextstate := 1 else nextstate +:= 1 return nextstate end procedure err_out(x,i,elem) writes(&errout,"Error number ",i," parsing ",image(x)," at ") if \elem then write(&errout,image(elem),".") else write(&errout,"(?).") exit(i) end procedure zSucceed() return .&pos end procedure Expand(s) local s2, c1, c2 s2 := "" s ? { s2 ||:= ="^" s2 ||:= ="-" while s2 ||:= tab(find("-")-1) do { if (c1 := move(1), ="-", c2 := move(1), c1 << c2) then every s2 ||:= char(ord(c1) to ord(c2)) else s2 ||:= 1(move(2), not(pos(0))) | err_out(s,2,"-") } s2 ||:= tab(0) } return s2 end procedure tab_bal(l,i1,i2) local i, i1_count, i2_count i := 0 i1_count := 0; i2_count := 0 while (i +:= 1) <= *l do { case l[i] of { i1 : i1_count +:= 1 i2 : i2_count +:= 1 } if i1_count = i2_count then suspend i } end procedure match_positive_ints(l) # Matches the longest sequence of positive integers in l, # beginning at l[1], which neither contains, nor is fol- # lowed by a negative integer. Returns the first position # after the match. Hence, given [55, 55, 55, -42, 55], # match_positive_ints will return 3. [55, -42] will cause # it to fail rather than return 1 (NOTE WELL!). local i every i := 1 to *l do { if l[i] < 0 then return (3 < i) - 1 | fail } return *l + 1 end procedure Ints2String(l) local tmp tmp := "" every tmp ||:= char(!l) return tmp end procedure StripChar(s,s2) local tmp if find(s2,s) then { tmp := "" s ? { while tmp ||:= tab(find("s2")) do tab(many(cset(s2))) tmp ||:= tab(0) } } return \tmp | s end icon-9.4.3/ipl/procs/tab2list.icn0000664000175000017500000000173107140713037016140 0ustar chrishchrish############################################################################ # # File: tab2list.icn # # Subject: Procedure to put tab-separated strings in list # # Author: Ralph E. Griswold # # Date: January 3, 1994 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # This procedure to takes tab-separated strings and inserts them # into a list. # # Vertical tabs in strings are converted to carriage returns. # # (Works for lists too.) # ############################################################################ # # See also: list2tab.icn, tab2rec.icn, rec2tab.icn # ############################################################################ procedure tab2list(s) local L L := [] s ? { while put(L, map(tab(upto('\t') | 0), "\v", "\n")) do move(1) | break } return L end icon-9.4.3/ipl/procs/weavutil.icn0000664000175000017500000002252207631301750016255 0ustar chrishchrish############################################################################ # # File: weavutil.icn # # Subject: Procedures to support numerical weavings # # Author: Ralph E. Griswold # # Date: April 13, 2002 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # Links: expander, tables # ############################################################################ link expander link tables $define Mask ("123456789" || &letters || &cset[162:-1]) # NEEDS FIXING record analysis(rows, sequence, patterns) # PFL weaving parameters record PflParams(P, T) # Sequence-drafting database record record sdb(table, name) # specification database record ldb(table, name) # specification database record ddb(table) # definition database record edb(table) # expression database record tdb(table) # tie-up database record pfd( # pattern-form draft name, threading, treadling, warp_colors, weft_colors, palette, colors, shafts, treadles, tieup, liftplan, drawdown ) record isd( # internal structure draft name, threading, # list of shaft numbers treadling, # list of treadle numbers warp_colors, # list of indexes into color_list weft_colors, # list of indexes into color_list color_list, # list of colors shafts, # number of shafts treadles, # number of treadles width, # image width height, # image height tieup, # tie-up row list liftplan # liftplan matrix ) procedure readpfd(input) # read PFD local draft draft := pfd() draft.name := read(input) & draft.threading := read(input) & draft.treadling := read(input) & draft.warp_colors := read(input) & draft.weft_colors := read(input) & draft.palette := read(input) & draft.colors := read(input) & draft.shafts := read(input) & draft.treadles := read(input) & draft.tieup := read(input) | fail draft.liftplan := read(input) # may be missing draft.drawdown := read(input) # may be missing return draft end procedure writepfd(output, pfd) #: write PFD write(output, pfd.name) write(output, pfd.threading) write(output, pfd.treadling) write(output, pfd.warp_colors) write(output, pfd.weft_colors) write(output, pfd.palette) write(output, pfd.colors) write(output, pfd.shafts) write(output, pfd.treadles) write(output, pfd.tieup) if *\pfd.liftplan > 0 then write(pfd.liftplan) else write() return end procedure expandpfd(pfd) #: expand PFD pfd := copy(pfd) pfd.threading := pfl2str(pfd.threading) pfd.treadling := pfl2str(pfd.treadling) pfd.warp_colors := pfl2str(pfd.warp_colors) pfd.weft_colors := pfl2str(pfd.weft_colors) pfd.warp_colors := Extend(pfd.warp_colors, *pfd.threading) pfd.weft_colors := Extend(pfd.weft_colors, *pfd.treadling) return pfd end # Write include file for seqdraft (old) procedure write_spec(name, spec, opt, mode) #: write weaving include file local n, output static bar initial bar := repl("#", 72) /opt := "w" output := open(name, opt) | fail if \mode == "drawdown" then write(output, "$define DrawDown") # Literals are output with image(). Other definitions are # Icon expressions, enclosed in parentheses. write(output, "$define Comments ", image(spec.comments)) write(output, "$define Name ", image(spec.name)) write(output, "$define Palette ", image(spec.palette)) write(output, "$define WarpColors (", check(spec.warp_colors), ")") write(output, "$define WeftColors (", check(spec.weft_colors), ")") write(output, "$define Breadth (", spec.breadth, ")") write(output, "$define Length (", spec.length, ")") write(output, "$define Threading (", check(spec.threading), ")") write(output, "$define Treadling (", check(spec.treadling), ")") write(output, "$define Shafts (", spec.shafts, ")") write(output, "$define Treadles (", spec.treadles, ")") write(output, "$define Tieup ", image(spec.tieup)) write(output, "$define Threads ", spec.links[1]) write(output, "$define Treads ", spec.links[2]) every n := !keylist(spec.defns) do write(output, "$define ", n, " ", spec.defns[n]) write(output, bar) close(output) return end # Write include file for seqdraft (new) procedure write_spec1(name, spec, opt, mode, defns) #: weaving include file local n, output static bar initial bar := repl("#", 72) /opt := "w" output := open(name, opt) | fail if \mode == "drawdown" then write(output, "$define DrawDown") # Literals are output with image(). Other definitions are # Icon expressions, enclosed in parentheses. write(output, "$define Comments ", image(spec.comments)) write(output, "$define Name ", image(spec.name)) write(output, "$define Palette ", image((\spec.palette).name)) # write(output, "$define WarpPalette ", image((\spec.warp_palette).name)) # write(output, "$define WeftPalette ", image((\spec.weft_palette).name)) write(output, "$define WarpColors (", check(spec.warp_colors), ")") write(output, "$define WeftColors (", check(spec.weft_colors), ")") write(output, "$define Breadth (", spec.breadth, ")") write(output, "$define Length (", spec.length, ")") write(output, "$define Threading (", check(spec.threading), ")") write(output, "$define Treadling (", check(spec.treadling), ")") write(output, "$define Shafts (", spec.shafts, ")") write(output, "$define Treadles (", spec.treadles, ")") write(output, "$define Tieup ", spec.tieup) write(output, "$define Threads ", spec.links[1]) write(output, "$define Treads ", spec.links[2]) every n := !keylist(spec.defns) do write(output, "$define ", n, " ", spec.defns[n]) if \defns then every n := !keylist(defns) do write(output, "$define ", n, " ", defns[n]) write(output, bar) close(output) return end # Write include file for lstdraft (new) procedure write_spec2(name, spec, opt, mode, defns) #: weaving include file local n, output static bar initial bar := repl("#", 72) /opt := "w" output := open(name, opt) | fail if \mode == "drawdown" then write(output, "$define DrawDown") # Literals are output with image(). Other definitions are # Icon expressions, enclosed in parentheses. write(output, "$define Comments ", image(spec.comments)) write(output, "$define Name ", image(spec.name)) write(output, "$define Palette ", image((\spec.palette))) write(output, "$define WarpPalette ", image((\spec.warp_palette))) write(output, "$define WeftPalette ", image((\spec.weft_palette))) write(output, "$define WarpColors (", spec.warp_colors, ")") write(output, "$define WeftColors (", spec.weft_colors, ")") write(output, "$define Breadth (", spec.breadth, ")") write(output, "$define Length (", spec.length, ")") write(output, "$define Threading (", spec.threading, ")") write(output, "$define Treadling (", spec.treadling, ")") write(output, "$define Shafts (", spec.shafts, ")") write(output, "$define Treadles (", spec.treadles, ")") write(output, "$define Tieup ", spec.tieup) write(output, "$define Threads ", spec.links[1]) write(output, "$define Treads ", spec.links[2]) every n := !keylist(spec.defns) do write(output, "$define ", n, " ", spec.defns[n]) if \defns then every n := !keylist(defns) do write(output, "$define ", n, " ", defns[n]) write(output, bar) close(output) return end procedure check(s) #: check for pattern form if s[1] == "[" then s := "!pfl2str(" || image(s) || ")" return s end procedure display(pfd) write(&errout, "name=", pfd.name) write(&errout, "threading=", pfd.threading) write(&errout, "treadling=", pfd.treadling) write(&errout, "warp colors=", pfd.warp_colors) write(&errout, "weft colors=", pfd.weft_colors) write(&errout, "tie up=", limage(pfd.tieup)) write(&errout, "palette=", pfd.palette) return end procedure sympos(sym) #: position of symbol in symbol list static mask initial mask := Mask return upto(sym, mask) # may fail end procedure possym(i) #: symbol in position i of symbol list static mask initial mask := Mask return mask[i] # may fail end # Procedure to convert a tier to a list of productions $define Different 2 procedure tier2prodl(tier, name) local rows, row, count, unique, prodl, prod unique := table() rows := [] count := 0 every row := !tier.matrix do { if /unique[row] then unique[row] := (count +:= 1) put(rows, unique[row]) } prod := name || "->" every prod ||:= possym(!rows + Different) prodl := [ "name:" || "t-" || name, "comment: ex pfd2wpg " || &dateline, "axiom:2", "gener:1", prod ] unique := sort(unique, 4) while row := get(unique) do put(prodl, possym(get(unique) + Different) || "->" || row) put(prodl, "end:") return prodl end procedure analyze(drawdown) local sequence, rows, row, count, patterns sequence := [] patterns := [] rows := table() count := 0 every row := !drawdown do { if /rows[row] then { rows[row] := count +:= 1 put(patterns, row) } put(sequence, rows[row]) } return analysis(rows, sequence, patterns) end icon-9.4.3/ipl/procs/pdco.icn0000664000175000017500000005520407631301745015351 0ustar chrishchrish############################################################################ # # File: pdco.icn # # Subject: Procedures for programmer-defined control operations # # Authors: Ralph E. Griswold and Robert J. Alexander # # Date: March 4, 2003 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # These procedures use co-expressions to used to model the built-in # control structures of Icon and also provide new ones. # # AddTabbyPDCO{e, i} adds tabby to treadling sequence # # AllparAER{e1,e2, ...} # parallel evaluation with last result # used for short sequences # # AltPDCO{e1,e2} models e1 | e2 # # BinopPDCO{op,e1,e2} produces the result of applying op to e1 and e2 # # CFapproxPDCO{e} produce sequence of approximations for the # continued-fraction sequence e # # ComparePDCO{e1,e2} compares result sequences of e1 and e2 # # ComplintPDCO{e} produces the integers not in e # # CondPDCO{e1,e2, ...} # models the generalized Lisp conditional # # CumsumPDCO{e} generates the cumulative sum of the terms of e # # CycleparAER{e1,e2, ...} # parallel evaluation with shorter sequences # re-evaluated # # DecimatePDCO{e1, e2} # "decimate" e1 by deleting e2-numbered terms # (e2 is assumed to be an increasing sequence). # # DecimationPDCO{e} produce a decimation sequence from e1 by # deleting even-valued terms and replacing # odd-valued terms by their position. # # DecollatePDCO{e, i} decollate e according to parity of i # # DeltaPDCO{e1} produces the difference of the values in e1 # # ElevatePDCO{e1, m, n} # elevate e1 mod n to n values # # EveryPDCO{e1,e2} models every e1 do e2 # # ExtendSeqPDCO{e1,i} extends e1 to i results # # ExtractAER{e1,e2, ...} # extract results of even-numbered arguments # according to odd-numbered values # # FifoAER{e1,e2, ...} reversal of lifo evaluation # # FriendlyPDCO{m, k, e3} # friendly sequence starting at k shaft mod m # # GaltPDCO{e1,e2, ...} # produces the results of concatenating the # sequences for e1, e2, ... # # GconjPDCO{e1,e2,...} # models generalized conjunction: e1 & e2 & ... # # The programmer-defined control operation above shows an interesting # technique for modeling conjunction via recursive generative # procedures. # # HistoPDCO{e,i} generates histogram for e limited to i terms; # default 100. # # IncreasingPDCO{e} filters out non-increasing values in integer # sequence # # IndexPDCO{e1,e2} produce e2-th terms from e1 # # InterPDCO{e1,e2, ...} # produces results of e1, e2, ... alternately # # LcondPDCO{e1,e2, ...} # models the Lisp conditional # # LengthPDCO{e} returns the length of e # # LifoAER{e1,e2, ...} models standard Icon "lifo" evaluation # # LimitPDCO{e1,e2} models e1 \ e2 # # ListPDCO{e,i} produces a list of the first i results from e # # LowerTrimPDCO{e} lower trim # # MapPDCO{e1,e2} maps values of e1 in the order they first appear # to values of e2 (as needed) # # OddEven{e} forces odd/even sequence # # PalinPDCO{e} x produces results of concatenating the # sequences for e and then its reverse. # # ParallelPDCO{e1,e2, ...} # synonym for InterPDCO{e1, e2, ...} # # ParallelAER{e1,e2, ...} # parallel evaluation terminating on # shortest sequence # # PatternPalinPDCO{e, i} # produces pattern palindrome. If i is given, # e is truncated to length i. # # PeriodPDCO{e, i} generates the periodic part of e; i values are # used to find the period # # PermutePDCO{e1,e2} permutes each n-subsequence of e1 by the # n positional values in lists from e2. If a list does # not consist of all the integers in the range 1 to # n, "interesting" things happen (see the use # of map() for transpositions). # # PivotPDCO{e, m} produces pivot points from e % m; m default 100 # # PosDiffPDCO{e1,e2} produces positions at which e1 and e2 differ # # PositionsPDCO{e, i} generates the positions at which i occurs in e. # # RandomPDCO{e1,e2, ...} # produces results of e1, e2, ... at random # # ReducePDCO{op, x, e} # "reduces" the sequence e by starting with the value x # and repetitively applying op to the current # value and values from e. # # RemoveDuplPDCO{e} removes duplicate adjacent values. # # RepaltPDCO{e} models |e # # RepeatPDCO{e1, e2} repeats the sequence for e1 e2 times # # ReplPDCO{e1,e2} replicates each value in e1 by the corresponding # integer value in e2. # # ResumePDCO{e1,e2,e3} # models every e1 \ e2 do e3 # # ReversePDCO{e, i} produces the results of e in reverse order. If i # is given, e is truncated to i values. # # RotatePDCO(e, i) rotates the sequence for e left by i; negative # i rotates to the right # # SelfreplPDCO{e1,i} produces e1 * i copies of e1 # # SeqlistPDCO{e1, i} produce list with first i values of e1; i # defaults to all values # # SimpleAER{e1,e2, ...} # simple evaluation with only success or # failure # # SkipPDCO{e1,e2} generate e1 skipping each e2 terms # # SmodPDCO{e1,e2} reduce terms in e1 (shaft) modulus e2 # # SpanPDCO{e,m} fill in between consecutive (integer) values in # e % m; m default 100 # # SumlimitPDCO{e, i, j} # produces values of e until their sum exceeds # i. Values less than j are discarded. # # TrinopPDCO{op,e2,e2,e3} # produces the result of applying op to e1, e2, and e3 # # UndulantPDCO{e} produces the undulant for e. # # UniquePDCO{e} produces the unique results of e in the order # they first appear # # UnopPDCO{e1,e2} produces the result of applying e1 to e2 # # UpperTrimPDCO{e} upper trim # # ValrptPDCO{e1,e2} synonym for ReplPDCO # # WobblePDCO{e} produces e(1), e(2), e(1), e(2), e(3), e(2), ... # # Comments: # # Because of the handling of the scope of local identifiers in # co-expressions, expressions in programmer-defined control # operations cannot communicate through local identifiers. Some # constructions, such as break and return, cannot be used in argu- # ments to programmer-defined control operations. # ############################################################################ # # Requires: co-expressions # ############################################################################ # # Links: lists, periodic, rational # ############################################################################ link lists link periodic link rational procedure AddTabbyPDCO(L) #: PDCO to add tabby to treadling local i i := @L[2] | 4 # number of regular treadles suspend InterPDCO([L[1], create |((i + 1) | (i + 2))]) end procedure AllparAER(L) #: PDAE for parallel evaluation with repeats local i, L1, done L1 := list(*L) done := list(*L,1) every i := 1 to *L do L1[i] := @L[i] | fail repeat { suspend L1[1] ! L1[2:0] every i := 1 to *L do if done[i] = 1 then ((L1[i] := @L[i]) | (done[i] := 0)) if not(!done = 1) then fail } end procedure AltPDCO(L) #: PDCO to model alternation suspend |@L[1] suspend |@L[2] end procedure BinopPDCO(L) #: PDCO to apply binary operation to sequences local op, x, y repeat { op := @L[1] op := proc(op, 2) | fail (x := @L[2] & y := @L[3]) | fail suspend op(x, y) } end procedure CFapproxPDCO(L) #: PDCO for continued-fraction approximations local prev_n, prev_m, n, m, t prev_n := [1] prev_m := [0, 1] put(prev_n, (@L[1]).denom) | fail while t := @L[1] do { n := t.denom * get(prev_n) + t.numer * prev_n[1] m := t.denom * get(prev_m) + t.numer * prev_m[1] suspend rational(n, m, 1) put(prev_n, n) put(prev_m, m) if t.denom ~= 0 then { # renormalize every !prev_n /:= t.denom every !prev_m /:= t.denom } } end procedure ComparePDCO(L) #: PDCO to compare sequences local x1, x2 while x1 := @L[1] do (x1 === @L[2]) | fail if @L[2] then fail else return end procedure ComplintPDCO(L) #: PDCO to generate integers not in sequence local i, j # EXPECTS MONOTONE NON-DECREASING SEQUENCE j := 0 while i := @L[1] do { i := integer(i) | stop("*** invalid value in sequence to Compl{}") suspend j to i - 1 j := i + 1 } suspend seq(j) end procedure CondPDCO(L) #: PDCO for generalized Lisp conditional local i, x every i := 1 to *L do if x := @L[i] then { suspend x suspend |@L[i] fail } end procedure CumsumPDCO(L) #: PDCO to produce cumulative sum local i i := 0 while i +:= @L[1] do suspend i end procedure CycleparAER(L) #: PDAE for parallel evaluation with cycling local i, L1, done L1 := list(*L) done := list(*L,1) every i := 1 to *L do L1[i] := @L[i] | fail repeat { suspend L1[1]!L1[2:0] every i := 1 to *L do { if not(L1[i] := @L[i]) then { done[i] := 0 if !done = 1 then { L[i] := ^L[i] L1[i] := @L[i] | fail } else fail } } } end procedure DecimatePDCO(L) #: PDCO to decimate sequence local i, j, count count := 0 while j := @L[2] do { while i := @L[1] | fail do { count +:= 1 if count = j then break next else suspend i } } end procedure DecimationPDCO(L) #: PDCO to create decimation sequence local i, count count := 0 while i := @L[1] do { count +:= 1 if i % 2 = 1 then suspend count } end procedure DecollatePDCO(L) #: PDCO to decollate sequence local i, j, x i := @L[2] | 1 i %:= 2 j := 0 while x := @L[1] do { j +:= 1 if j % 2 = i then suspend x } end procedure DeltaPDCO(L) #: PDCO to generate difference sequence local i, j i := @L[1] | fail while j := @L[1] do { suspend j - i i := j } end procedure ElevatePDCO(L) #: PDCO to elevate sequence local n, m, shafts, i, j, k m := @L[2] | fail n := @L[3] | fail shafts := list(m) every !shafts := [] every i := 1 to m do every put(shafts[i], i to n by m) while j := @L[1] do { i := j % m + 1 k := get(shafts[i]) suspend k put(shafts[i], k) } end procedure EveryPDCO(L) #: PDCO to model iteration while @L[1] do @^L[2] end procedure ExtendSeqPDCO(L) #: PDCO to extend sequence local count count := integer(@L[2]) | fail if count < 1 then fail repeat { suspend |@L[1] do { count -:= 1 if count = 0 then fail } if *L[1] == 0 then fail L[1] := ^L[1] } end procedure ExtractAER(L) #: PDAE to extract values local i, j, n, L1 L1 := list(*L/2) repeat { i := 1 while i < *L do { n := @L[i] | fail every 1 to n do L1[(i + 1)/2] := @L[i + 1] | fail L[i + 1] := ^L[i + 1] i +:= 2 } suspend L1[1] ! L1[2:0] } end procedure FifoAER(L) #: PDAE for reversal of lifo evaluation local i, L1, j L1 := list(*L) j := *L repeat { repeat { if L1[j] := @L[j] then { j -:= 1 (L[j] := ^L[j]) | break } else if (j +:= 1) > *L then fail } suspend L1[1] ! L1[2:0] j := 1 } end procedure FriendlyPDCO(L) # PDCO for friendly sequences local mod, state, value mod := @L[1] | fail state := @L[2] if /state then state := ?mod repeat { suspend state value := @L[3] | fail if value % 2 = 0 then state +:= 1 else state -:= 1 state := residue(state, mod, 1) } end procedure GaltPDCO(L) #: PDCO to concatenate sequences local C every C := !L do suspend |@C end procedure GconjPDCO(L) #: PDCO for generalized conjunction suspend Gconj_(L,1) end procedure Gconj_(L,i,v) local e if e := L[i] then { suspend v:= |@e & Gconj_(L,i + 1,v) L[i] := ^e } else suspend v end procedure HistoPDCO(L) #: histogram local limit, results, seq limit := @L[2] | 100 seq := [] while put(seq, @L[1]) results := list(max ! seq, 0) every results[!seq] +:= 1 suspend !results end procedure IncreasingPDCO(L) #: PDCO to filter out non-increasing values local last, current last := @L[1] | fail suspend last while current := @L[1] do { if current <= last then next else { suspend current last := current } } end procedure IndexPDCO(L) #: PDCO to select terms by position local i, j, x j := @L[2] | fail every i := seq() do { # position x := @L[1] | fail if j = i then { suspend x repeat { j := @L[2] | fail if j > i then break } } } end procedure InterPDCO(L) #: PDCO to interleave sequences suspend |@!L end procedure LcondPDCO(L) #: PDCO for Lisp conditional local i every i := 1 to *L by 2 do if @L[i] then { suspend |@L[i + 1] fail } end procedure LengthPDCO(L) #: PDCO to produce length of sequence local i i := 0 while @L[1] do i +:= 1 return i end procedure LifoAER(L) #: PDAE for standard lifo evaluation local i, L1, j L1 := list(*L) j := 1 repeat { repeat if L1[j] := @L[j] then { j +:= 1 (L[j] := ^L[j]) | break } else if (j -:= 1) = 0 then fail suspend L1[1] ! L1[2:0] j := *L } end procedure LimitPDCO(L) #: PDCO to model limitation local i, x while i := @L[2] do { every 1 to i do if x := @L[1] then suspend x else break L[1] := ^L[1] } end procedure ListPDCO(L) #: list from sequence local limit, result limit := @L[2] | 100 result := [] every put(result, |@L[1]) \ limit return result end procedure LowerTrimPDCO(L) #: lower trimming local i while i := @L[1] do { i -:= 1 if i ~= 0 then suspend i } end procedure MapPDCO(L) #: PDCO to map values local maptbl, x maptbl := table() while x := @L[1] do { /maptbl[x] := (@L[2] | fail) suspend maptbl[x] } end procedure OddEvenPDCO(L) #: PDCO to force odd/even sequence local val, val_old while val := @L[1] do { if val % 2 = \val_old % 2 then suspend val_old + 1 suspend val val_old := val } end procedure PalinPDCO(L) #: PDCO to produce palindromic sequence local tail, x tail := [] while x := @L[1] do { suspend x push(tail, x) } every suspend !tail end procedure ParallelPDCO(L) #: synonym for Inter ParallelPDCO := InterPDCO # redefine for next use suspend InterPDCO(L) end procedure ParallelAER(L) #: PDAE for parallel evaluation local i, L1 L1 := list(*L) repeat { every i := 1 to *L do L1[i] := @L[i] | fail suspend L1[1] ! L1[2:0] } end procedure PatternPalinPDCO(L) #: PDCO to produce pattern palindrome local tail, x, limit tail := [] limit := @L[2] | (2 ^ 15) # good enough every 1 to limit do { x := @L[1] | break suspend x push(tail, x) } get(tail) pull(tail) every suspend !tail end procedure PeriodPDCO(L) #: PDCO for periodic part of sequence local limit, result limit := @L[2] | 300 result := [] every put(result, |@L[1]) \ limit result := repeater(result) suspend !result[2] end procedure PermutePDCO(L) #: PDCO for permutations local temp1, temp2, chunk, i, x repeat { temp1 := @L[2] | fail temp2 := [] every put(temp2, i := 1 to *temp1) chunk := [] every 1 to i do put(chunk, @L[1]) | fail suspend !lmap(temp1, temp2, chunk) } end procedure PivotPDCO(L) #: PDCO to generate pivot points local current, direction, m, new m := @L[2] /m := 100 direction := "+" current := @L[1] % m | fail suspend current repeat { new := @L[1] % m | break if new = current then next case direction of { "+": { if new > current then { current := new next } else { suspend current current := new direction := "-" } } "-": { if new < current then { current := new next } else { suspend current current := new direction := "+" } } } } return current end procedure PositionsPDCO(L) # positions in e of i local i, count, j i := integer(@L[2]) | fail count := 0 while j := @L[1] do { count +:= 1 if j = i then suspend count } end procedure PosDiffPDCO(L) # PDCO to generate positions of difference local i, x, y i := 0 while x := @L[1] & y := @L[2] do { i +:= 1 if x ~=== y then suspend i } end procedure RandomPDCO(L) #: PDCO to generate from sequences at random local x while x := @?L do suspend x end procedure RepaltPDCO(L) #: PDCO to model repeated alternation local x repeat { suspend |@L[1] if *L[1] == 0 then fail L[1] := ^L[1] } end procedure ReducePDCO(L) #: PDCO to reduce sequence using binary operation local op, x op := proc(@L[1], 2) | stop("*** invalid operation for Reduce{}") x := @L[2] | fail while x := op(x, @L[3]) return x end procedure RepeatPDCO(L) #: PDCO to repeat sequence local i, x while i := @L[2] do { if not(i := integer(i)) then stop("*** invalid repetition in Repeat{}") every 1 to i do { suspend |@L[1] L[1] := ^L[1] } } end procedure RemoveDuplPDCO(L) #: PDCO for remove duplicate values in a sequence local old, new old := @L[1] | fail suspend old repeat { new := @L[1] | fail if new === old then next else { suspend new old := new } } end procedure ReplPDCO(L) #: PDCO to replicate values in a sequence local x, i i := 1 # default while x := @L[1] do { i := @L[2] suspend (1 to i) & x } end procedure ResumePDCO(L) #: PDCO to model limited iteration local i while i := @L[2] do { L[1] := ^L[1] every 1 to i do if @L[1] then @^L[3] else break } end procedure ReversePDCO(L) #: PDCO to reverse sequence local result, limit result := [] limit := @L[2] /limit := 2 ^ 15 # enough every 1 to limit do push(result, @L[1]) | break suspend !result end procedure RotatePDCO(L) #: PDCO to rotate sequence local result, i, x i := integer(@L[2]) | stop("*** invalid specification in Rotate{}") result := [] if i <= 0 then { # if not to right, works for infinite sequence every 1 to -i do put(result, @L[1]) | break while x := @L[1] do suspend x suspend !result } else { while put(result, @L[1]) suspend !lrotate(result, i) } end procedure SelfreplPDCO(L) #: PDCO to produce multiple of values in sequence local i, j j := @L[2] | 1 j := integer(j) | stop("*** invalid second argument to Selfrepl{}") while i := @L[1] do { i := integer(i) | stop("*** invalid value in Selfrepl{}") suspend (1 to i * j) & i } end procedure SeqlistPDCO(L) #: PDCO to return list of values local result, limit result := [] limit := @L[2] | 2 ^ 15 # crude ... every 1 to limit do put(result, @L[1]) | break return result end procedure SimpleAER(L) #: PDAE for simple evaluation local i, L1 L1 := list(*L) every i := 1 to *L do L1[i] := @L[i] | fail return L1[1] ! L1[2:0] end procedure SkipPDCO(L) #: PDCO to skip terms local gap suspend @L[1] repeat { gap := @L[2] | fail every 1 to gap do @L[1] | fail suspend @L[1] } end procedure SmodPDCO(L) #: generalized modular reduction local i, m while i := @L[1] do { m := @L[2] | fail suspend residue(i, m, 1) } end procedure SpanPDCO(L) #: fill in gaps in integer sequences local i, j, m j := @L[1] | fail m := @L[2] /m := 100 while i := residue(@L[1], m, 1) do { if i > j then suspend j to i - 1 else if i < j then suspend j to i + 1 by -1 j := i } suspend j end procedure SumlimitPDCO(L) #: PDCO to sum sequence to a limit local sum, min, limit, i limit := integer(@L[2]) | 2 ^ 15 min := integer(@L[3]) | 0 sum := 0 while i := @L[1] do { if i < min then next if (sum + i) > limit then fail sum +:= i suspend i } end procedure TrinopPDCO(L) #: PDCO to apply trinary operator to sequences local op, x, y, z repeat { op := proc(@L[1], 3) | fail x := @L[2] & y := @L[3] & z := @L[4] | fail suspend op(x, y, z) } end procedure UndulantPDCO(L) #: PDCO to produce undulant local i, j, dir i := @L[1] | fail suspend i # first value always is in undulant j := i # last term in undulant while i := @L[1] do { # get initial direction if i > j then { dir := -1 break } else if i < j then { dir := 1 break } } j := i while i := @L[1] do { if i < j then { if dir = -1 then { suspend j j := i dir := 1 } else j := i } if i > j then { if dir = 1 then { suspend j j := i dir := -1 } else j := i } } fail end procedure UniquePDCO(L) #: PDCO to filter out duplication values local done, x done := set() while x := @L[1] do if member(done, x) then next else { insert(done, x) suspend x } end procedure UnopPDCO(L) #: PDCO to apply unary operation to sequence local op, x repeat { op := @L[1] op := proc(op, 1) | fail x := @L[2] | fail suspend op(x) } end procedure UpperTrimPDCO(L) #: upper sequence trimming local done, i done := set() while i := @L[1] do { if not member(done, i) then insert(done, i) else suspend i } end procedure ValrptPDCO(L) #: synonym for Repl ValrptPDCO := ReplPDCO suspend ReplPDCO(L) end procedure WobblePDCO(L) #: PDCO to produce sequence values alternately local x, y x := @L[1] | fail suspend x while y := @L[1] do { suspend y | x | y x := y } end icon-9.4.3/ipl/procs/printcol.icn0000664000175000017500000001202407140713037016243 0ustar chrishchrish############################################################################ # # File: printcol.icn # # Subject: Procedure to format columnar data # # Author: Robert J. Alexander # # Date: August 14, 1996 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # This procedure deals with with the problem of printing tabular # data where the total width of items to be printed is wider than # the page. Simply allowing the data to wrap to additional lines # often produces marginally readable output. This procedure facil- # itates printing such groups of data as vertical columns down the # page length, instead of as horizontal rows across the page. That # way many, many fields can be printed neatly. The programming of # such a transformation can be a nuisance. This procedure does # much of the work for you, like deciding how many items can fit # across the page width and ensuring that entire items will be # printed on the same page without page breaks (if that service is # requested). # ############################################################################ # # For example, suppose we have a list of records we would like # to print. The record is defined as: # # record rec(item1,item2,item3,...) # # Also suppose that lines such as # # Field 1 Field 2 Field 3 ... # ------- ------- ------- --- # Record 1 item1 item2 item3 ... # Record 2 item1 item2 item3 ... # # are too long to print across the page. This procedure will print # them as: # # TITLE # ===== # Record 1 Record 2 ... # -------- -------- --- # Field 1 item1 item1 ... # Field 2 item2 item2 ... # Field 3 item3 item3 ... # # The arguments are: # # items: a co-expression that produces a sequence of # items (usually structured data objects, but not # necessarily) for which data is to be printed. # # fields: a list of procedures to produce the field's # data. Each procedure takes two arguments. The # procedure's action depends upon what is passed # in the first argument: # # header Produces the row heading string to be used # for that field (the field name). # # width Produces the maximum field width that can # be produced (including the column header). # # Other Produces the field value string for the # item passed as the argument. # # The second argument is arbitrary data from the procedures # with each invocation. The data returned by the first func- # tion on the list is used as a column heading string (the # item name). # # title: optional. # # # pagelength: if null (omitted) page breaks are ignored. # # linelength: default 80. # # auxdata: auxiliary arbitrary data to be passed to the field # procedures -- see `fields', above. # ############################################################################ procedure printcol(items,fields,title,pagelength,linelength,auxdata) local maxwidth,maxhead,groups,columns,itemlist,cont,f,p,underline, hfield /linelength := 80 /pagelength := 30000 /title := "" # # Compute the maximum field width (so we know the column spacing) and # the maximum header width (so we know how much space to leave on the # left for headings. # maxwidth := maxhead := -1 cont := "" every maxwidth <:= (!fields)("width",auxdata) hfield := get(fields) every maxhead <:= *(!fields)("header",auxdata) columns := (linelength - maxhead) / (maxwidth + 1) groups := pagelength / (6 + *fields) # # Loop to print groups of data. # repeat { if pagelength < 30000 then writes("\f") # # Loop to print data of a group (a page's worth). # every 1 to groups do { # # Collect the items to be output in this group. A group is the number # of columns that can fit across the page. # itemlist := [] every 1 to columns do put(itemlist,@items) | break if *itemlist = 0 then break break # # Print a title and the column headings. # write(repl("=",*write("\n",title || cont))) cont := " (continued)" writes(underline := left("",maxhead)) every f := hfield(!itemlist,auxdata) do { p := if *f < maxwidth then center else left writes(" ",p(f,maxwidth)) underline ||:= " " || p(repl("-",*f),maxwidth) } write("\n",underline) # # Print the fields. # every f := !fields do { writes(right(f("header",auxdata),maxhead)) every writes(" ",center(f(!itemlist,auxdata),maxwidth)) write() } } # End of loop to print groups. } # End of loop to print all items. return end icon-9.4.3/ipl/procs/periodic.icn0000664000175000017500000000760307424071014016213 0ustar chrishchrish############################################################################ # # File: periodic.icn # # Subject: Procedures related to periodic sequences # # Author: Ralph E. Griswold # # Date: June 10, 2001 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # Sqrt(i, j) produces a rational approximation to the square root of i # with j iterations of the half-way method. j defaults to 5. # ############################################################################ # # Requires: Large-integer arithmetic # ############################################################################ # # Links: lists, numbers, rational, strings # ############################################################################ link lists link numbers link rational link strings record perseq(pre, rep) procedure Sqrt(i, j) #: rational approximate to square root local rat, half /j := 5 half := rational(1, 2, 1) rat := rational(integer(sqrt(i)), 1, 1) # initial approximation i := rational(i, 1, 1) every 1 to j do rat := mpyrat(half, addrat(rat, divrat(i, rat, 1), 1)) return rat end procedure rat2cf(rat) #: continued fraction sequence for rational local r, result, i, j i := rat.numer j := rat.denom result := [] repeat { put(result, rational(integer(i / j), 1, 1).numer) r := i % j i := j j := r if j = 0 then break } return perseq(result, []) end procedure cfapprox(lst) #: continued-fraction approximation local prev_n, prev_m, n, m, t lst := copy(lst) prev_n := [1] prev_m := [0, 1] put(prev_n, get(lst).denom) | fail while t := get(lst) do { n := t.denom * get(prev_n) + t.numer * prev_n[1] m := t.denom * get(prev_m) + t.numer * prev_m[1] suspend rational(n, m, 1) put(prev_n, n) put(prev_m, m) if t.denom ~= 0 then { # renormalize every !prev_n /:= t.denom every !prev_m /:= t.denom } } end procedure dec2rat(pre, rep) #: convert repeating decimal to rational local s s := "" every s ||:= (!pre | |!rep) \ (*pre + *rep) return ratred(rational(s - left(s, *pre), 10 ^ (*pre + *rep) - 10 ^ *pre, 1)) end procedure rat2dec(rat) #: decimal expansion of rational local result, remainders, count, seq rat := copy(rat) result := "" remainders := table() rat.numer %:= rat.denom rat.numer *:= 10 count := 0 while rat.numer > 0 do { count +:= 1 if member(remainders, rat.numer) then { # been here; done that seq := perseq() result ? { seq.pre := move(remainders[rat.numer] - 1) seq.rep := tab(0) } return seq } else insert(remainders, rat.numer, count) result ||:= rat.numer / rat.denom rat.numer %:= rat.denom rat.numer *:= 10 } return perseq([rat.denom], []) # WRONG!!! end procedure repeater(seq, ratio, limit) #: find repeat in sequence local init, i, prefix, results, segment, span /ratio := 2 /limit := 0.75 results := copy(seq) prefix := [] repeat { span := *results / ratio every i := 1 to span do { segment := results[1+:i] | next if lequiv(lextend(segment, *results), results) then return perseq(prefix, segment) } put(prefix, get(results)) | # first term to prefix return perseq(prefix, results) if *prefix > limit * *seq then return perseq(seq, []) } end procedure seqimage(seq) #: sequence image local result result := "" every result ||:= !seq.pre || "," result ||:= "[" if *seq.rep > 0 then { every result ||:= !seq.rep || "," result[-1] := "]" } else result ||:= "]" return result end icon-9.4.3/ipl/procs/asciinam.icn0000664000175000017500000000170007140713036016173 0ustar chrishchrish############################################################################ # # File: asciinam.icn # # Subject: Procedure for ASCII name of unprintable character # # Author: Robert J. Alexander # # Date: August 14, 1996 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # asciiname(s) returns the mnemonic name of the single unprintable # ASCII character s. # ############################################################################ procedure asciiname(s) local o static names initial { names := ["NUL","SOH","STX","ETX","EOT","ENQ","ACK","BEL", "BS" ,"HT" ,"NL" ,"VT" ,"NP" ,"CR" ,"SO" ,"SI" , "DLE","DC1","DC2","DC3","DC4","NAK","SYN","ETB", "CAN","EM" ,"SUB","ESC","FS" ,"GS" ,"RS" ,"US" ] } o := ord(s) return names[o + 1] | (if o = 127 then "DEL") end icon-9.4.3/ipl/procs/phoname.icn0000664000175000017500000000245407140713037016046 0ustar chrishchrish############################################################################ # # File: phoname.icn # # Subject: Procedures to generate letters for phone numbers # # Author: Thomas R. Hicks # # Date: June 10, 1988 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # This procedure generates the letter combinations corresponding to the # digits in a telephone number. # # Warning: # # The number of possibilities is very large. This procedure should be # used in a context that limits or filters its output. # ############################################################################ procedure phoname(number) local buttons, nondigits, pstr, t, x buttons := ["000","111","abc","def","ghi","jkl","mno", "prs","tuv","wxy"] nondigits := ~&digits pstr := stripstr(number,nondigits) if 7 ~= *pstr then fail t := [] every x := !pstr do put(t,buttons[x+1]) suspend !t[1] || !t[2] || !t[3] || !t[4] || !t[5] || !t[6] || !t[7] end procedure stripstr(str,delchs) local i i := 1 while i <= *str do { if any(delchs,str,i) then str[i] := "" else i +:= 1 } return str end # stripstr icon-9.4.3/ipl/procs/factors.icn0000664000175000017500000001527107424067416016071 0ustar chrishchrish############################################################################ # # File: factors.icn # # Subject: Procedures related to factors and prime numbers # # Authors: Ralph E. Griswold and Gregg M. Townsend # # Date: January 23, 2002 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # This file contains procedures related to factorization and prime # numbers. # # divisors(n) generates the divisors of n. # # divisorl(n) returns a list of the divisors of n. # # factorial(n) returns n!. It fails if n is less than 0. # # factors(i, j) returns a list containing the prime factors of i # limited to maximum value j; default, no limit. # # genfactors(i, j) # like factors(), except factors are generated as # they are found. # # gfactorial(n, i) # generalized factorial; n x (n - i) x (n - 2i) x ... # # ispower(i, j) succeeds and returns root if i is k^j # # isprime(n) succeeds if n is a prime. # # nxtprime(n) returns the next prime number beyond n. # # pfactors(i) returns a list containing the primes that divide i. # # prdecomp(i) returns a list of exponents for the prime # decomposition of i. # # prime() generates the primes. # # primel() generates the primes from a precompiled list. # # primorial(i,j) product of primes j <= i; j defaults to 1. # # sfactors(i, j) as factors(i, j), except output is in string form # with exponents for repeated factors # # squarefree(i) succeeds if the factors of i are distinct # ############################################################################ # # Notes: Some of these procedures are not fast enough for extensive work. # Factoring is believed to be a hard problem. factors() should only be # used for small numbers. # ############################################################################ # # Requires: Large-integer arithmetic; prime.lst for primel() and primorial(). # ############################################################################ # # Links: io, numbers # ############################################################################ link io link numbers procedure divisors(n) #: generate the divisors of n local d, dlist dlist := [] every d := seq() do { if d * d >= n then break if n % d = 0 then { push(dlist, d) suspend d } } if d * d = n then suspend d suspend n / !dlist end procedure divisorl(n) #: return list of divisors of n local divs every put(divs := [], divisors(n)) return divs end procedure factorial(n) #: return n! (n factorial) local i n := integer(n) | runerr(101, n) if n < 0 then fail i := 1 every i *:= 1 to n return i end procedure factors(i, j) #: return list of factors local facts every put(facts := [], genfactors(i, j)) return facts end procedure genfactors(i, j) #: generate prime factors of integer local p i := integer(i) | runerr(101, i) /j := i every p := prime() do { if p > j | p * p > i then break while i % p = 0 do { suspend p i /:= p } if i = 1 then break } if i > 1 then suspend i end procedure gfactorial(n, i) #: generalized factorial local j n := integer(n) | runerr(101, n) i := integer(i) | 1 if n < 0 then fail if i < 1 then fail j := n while n > i do { n -:= i j *:= n } return j end procedure pfactors(i) #: primes that divide integer local facts, p i := integer(i) | runerr(101, i) facts := [] every p := prime() do { if p > i then break if i % p = 0 then { put(facts, p) while i % p = 0 do i /:= p } } return facts end procedure ispower(i, j) #: test for integer power local k, n k := (n := round(i ^ (1.0 / j))) ^ j if k = i then return n else fail end # NOTE: The following method for testing primality, called Baby Division, # is about the worst possible. It is inappropriate for all but small # numbers. procedure isprime(n) #: test for primality local p n := integer(n) | runerr(101, n) if n <= 1 then fail # 1 is not a prime every p := prime() do { if p * p > n then return n if n % p = 0 then fail } end procedure nxtprime(n) #: next prime beyond n local d static step, div initial { step := [1,6,5,4,3,2,1,4,3,2,1,2,1,4,3,2,1,2,1,4,3,2,1,6,5,4,3,2,1,2] div := [7] # list of known primes } n := integer(n) | runerr(101, n) if n < 7 then # handle small primes specially return n < (2 | 3 | 5 | 7) repeat { n +:= step[n % 30 + 1] # step past multiples of 2, 3, 5 every (d := !div) | |put(div, d := nxtprime(d)) do { # get test divisors if n % d = 0 then # if composite, try a larger candidate break if d * d > n then # if not divisible up to sqrt, is prime return n } } end procedure prdecomp(i) #: prime decomposition local decomp, count, p decomp := [] every p := prime() do { count := 0 while i % p = 0 do { count +:= 1 i /:= p } put(decomp, count) if i = 1 then break } return decomp end procedure prime() #: generate primes local i, k suspend 2 | ((i := seq(3, 2)) & (not(i = (k := (3 to sqrt(i) by 2)) * (i / k))) & i) end procedure primel() #: primes from list local pfile pfile := dopen("primes.lst") | stop("*** cannot open primes.lst") suspend !pfile end procedure primorial(i, j) #: product of primes local m, k, mark /j := 1 m := 1 mark := &null # to check for completeness every k := primel() do { # limited by prime list if k <= j then next if k <= i then m *:= k else { mark := 1 break } } if \mark then return m else fail # fail if list is too short end procedure sfactors(i, j) #: return factors in string form local facts, result, term, nterm, count facts := factors(i, j) result := "" term := get(facts) # will be at least one count := 1 while nterm := get(facts) do { if term = nterm then count +:= 1 else { if count > 1 then result ||:= " " || term || "^" || count else result ||:= " " || term count := 1 term := nterm } } if count > 1 then result ||:= " " || term || "^" || count else result ||:= " " || term return result[2:0] end procedure squarefree(n) #: test for square-free number local facts facts := factors(n) if *facts = *set(facts) then return n else fail end icon-9.4.3/ipl/procs/nestlist.icn0000664000175000017500000000362510331771766016276 0ustar chrishchrish############################################################################ # # File: nestlist.icn # # Subject: Procedures to interconvert strings and nested lists # # Author: Arthur C. Eschenlauer # # Date: November 1, 2005 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # Procedure s_list(L) produces a string-representation of a nested # list. # # Procedure l_list(s) produces a nested list from s, its string # representation. # ############################################################################ # # # demo for reading nested numeric array from a string, e.g., # # [1,[2,3,[4]],[[5]]] # procedure main( ) # local line, m, i # while line := read( ) # do # if m := l_list( line ) # then write( s_list( m ) ) # end # ############################################################################ # s_list - produce a string from a nested list procedure s_list( L ) local i, s if type( L ) ~== "list" then return string( L ) s := "[" every i := 1 to *L do s ||:= ( if i ~= 1 then "," else "" ) || s_list( L[i] ) return s || "]" end # l_list - produce a nested list from a string # l_list( ) ::= l_listall( ) pos(0) # l_listall( ) ::= ="[" l_terms( ) ="]" # l_terms( ) ::= l_term( ) ="," l_terms( ) | l_term( ) # l_term( ) ::= l_listall( ) | tab(many(&cset--'[,]')) procedure l_list( s ) s ? return 1(l_listall( ), pos(0)) end procedure l_listall( ) every suspend 2( ="[", l_terms( ), ="]" ) end procedure l_terms( ) local a1, a2 every suspend 4( a1:=l_term( ) , ="," , a2:=l_terms( ), a1 ||| a2 ) | l_term( ) end procedure l_term( ) static noend, convert initial noend := &cset -- '[,]' suspend [ l_listall( ) | tab( many( noend ) ) ] end icon-9.4.3/ipl/procs/basename.icn0000664000175000017500000000226107140713037016166 0ustar chrishchrish############################################################################ # # File: basename.icn # # Subject: Procedures to produce base name of a file # # Author: Ralph E. Griswold # # Date: September 22, 1998 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # Contributor: Charles Shartsis # ############################################################################ # # This procedure is based on the UNIX basename(1) utility. It strips off # any path information and removes the specified suffix, if present. # # If no suffix is provided, the portion of the name up to the first # "." is returned. # # It should work under UNIX, MS-DOS, and the Macintosh. # ############################################################################ procedure basename(name, suffix) #: base name of file local i, base name ? { every i := upto('/\\:') tab(integer(i) + 1) # get rid of path, if any if base := 1(tab(find(\suffix)), pos(-*suffix)) then return base else return tab(0) } end icon-9.4.3/ipl/procs/serial.icn0000664000175000017500000000137007140713040015664 0ustar chrishchrish############################################################################ # # File: serial.icn # # Subject: Procedure to return serial number of structure # # Author: Ralph E. Griswold # # Date: April 19, 1996 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # Procedure to return the serial number of a structure. # ############################################################################ procedure serial(x) #: structure serial number return image(x) ? { # fails on non-structure or bogus kind tab(upto('_') + 1) | fail return integer(tab(many(&digits))) } end icon-9.4.3/ipl/procs/sentence.icn0000664000175000017500000001112307140713037016214 0ustar chrishchrish############################################################################ # # File: sentence.icn # # Subject: Procedure to generate sentences in file # # Author: Richard L. Goerwitz # # Date: August 14, 1996 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # Version: 1.2 # ############################################################################ # # sentence(f) - suspends sentences from file f # # A lot of grammatical and stylistic analysis programs are predicated # on the notion of a sentence. For instance, some programs count the # number of words in each sentence. Other count the number and length # of clauses. Still others pedantically check for sentence-final par- # ticles and prepositions. # # This procedure, sentence(), is supposed to be used as a filter for # ASCII text files, suspending everything that looks remotely like a # sentence in them. # ############################################################################ # # BUGS: Cannot correctly parse sentences with constructs like "R. L. # Goerwitz" in them. The algorithm can be much improved simply by # checking to see if the word after the period is in /usr/dict/words # or whatever your system dictionary file is. If it isn't, then it's # likely not to be the beginning of a sentence (this also is not in- # fallible, naturally). # ############################################################################ # # Requires: co-expressions # ############################################################################ procedure sentence(intext) local sentence, get_line, line, tmp_s, end_part, whole_thing static inits, punct initial { inits := &ucase ++ &digits punct := ".\"'!?)]" } sentence := "" get_line := create read_line(intext) while line := @get_line do { # If we hit a blank line, it's a signal from read_line that we # have encountered a change in the indentation level, and # should call it a sentence break (though it could just be # indentation for a quote, a section header, etc., it seems # these all indicate major, sentence-like divisions in the # text). if line == "" then { suspend sentence sentence := "" next } # Go on until you can't find any more sentence-endings in line, # then break and get another line. repeat { # Scan for a sentence break somewhere in line. line ? { # Ugly, but it works. Look for sequences containing # things like periods and question marks, followed by # a space and another space or a word beginning with # a capital letter. If we don't have enough context, # append the next line from intext to line & scan again. if tmp_s := tab(upto(punct)) & upto('!?.', end_part := tab(many(punct))) & not (pos(-1), line ||:= @get_line, next) & =" " & (=" " | (tab(many('\'"('))|&null,any(inits))) # IF YOU WANT TO ADD A DICTIONARY CHECK, then read in # a dictionary like /usr/dict/words, and then change # any(inits) above to something like (any(inits), # longstr(list_of_usrdictwords,map(&subject),&pos), =" ") # where longstr() matches each string in list_of_usr- # dictwords. then { # Don't bother with little two-letter hunks. whole_thing := sentence || tmp_s || end_part if *whole_thing > 3 | find(" ",whole_thing) then suspend whole_thing tab(many(' ')) line := tab(0) sentence := "" next } else break } } # Otherwise just tack line onto sentence & try again. sentence ||:= line } return sentence end procedure read_line(intext) local new_line, ilevel, junk_count, space_count, line static last_ilevel, blank_flag last_ilevel := 0 while line := trim(!intext,'\t ') do { # Check to see if line is blank; if so, set blank_flag. if line == "" then { blank_flag := 1; next } # Determine current indentation level. detab(line) ? { ilevel := *tab(many(' ')) | 0 } line ? { tab(many('\t ')) # Signal the calling procedure if there is a change in the # indentation level by suspending a blank line. if (ilevel > last_ilevel) | (ilevel < last_ilevel, \blank_flag) then suspend "" last_ilevel := ilevel # Put a space on the end of line, unless it ends in a dash. new_line := tab(-1) || (="-" | (move(1) || " ")) # Make sure the flag that indicates blank lines is unset. blank_flag := &null } # Suspend the newly reformatted, trimmed, space-terminated line. suspend new_line } end icon-9.4.3/ipl/procs/soundex1.icn0000664000175000017500000000506707140713037016170 0ustar chrishchrish############################################################################ # # File: soundex1.icn # # Subject: Procedures for Soundex algorithm # # Author: John David Stone # # Date: April 30, 1993 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # When names are communicated by telephone, they are often transcribed # incorrectly. An organization that has to keep track of a lot of names has # a need, therefore, for some system of representing or encoding a name that # will mitigate the effects of transcription errors. One idea, originally # proposed by Margaret K. Odell and Robert C. Russell, uses the following # encoding system to try to bring together occurrences of the same surname, # variously spelled: # # Encode each of the letters of the name according to the # following equivalences: # # a, e, h, i, o, u, w, y -> * # b, f, p, v -> 1 # c, g, j, k, q, s, x, z -> 2 # d, t -> 3 # l -> 4 # m, n -> 5 # r -> 6 # # # If any two adjacent letters have the same code, change the code for the # second one to *. # # The Soundex representation consists of four characters: the initial letter # of the name, and the first three digit (non-asterisk) codes corresponding # to letters after the initial. If there are fewer than three such digit # codes, use all that there are, and add zeroes at the end to make up the # four-character representation. # ############################################################################ procedure soundex(name) local coded_name, new_name coded_name := encode(strip(name)) new_name := name[1] every pos := 2 to *coded_name do { if coded_name[pos] ~== "*" then new_name := new_name || coded_name[pos] if *new_name = 4 then break } return new_name || repl ("0", 4 - *new_name) end procedure encode(name) name := map(name, &ucase, &lcase) name := map(name, "aehiouwybfpvcgjkqsxzdtlmnr", "********111122222222334556") every pos := *name to 2 by -1 do if name[pos - 1] == name[pos] then name[pos] := "*" return name end procedure strip(name) local result, ch static alphabet initial alphabet := string(&letters) result := "" every ch := !name do if find(ch, alphabet) then result ||:= ch return result end icon-9.4.3/ipl/procs/revadd.icn0000664000175000017500000000273207274076347015701 0ustar chrishchrish############################################################################ # # File: revadd.icn # # Subject: Procedure to generate reverse-summed integers # # Author: Ralph E. Griswold # # Date: May 2, 2001 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # This procedure is designed to help explore the number-theory problem # in which an integer is added to its (digit) reversal until a # palindrome appears. # # It is unknown if this process terminates for all integers. For # example, for 196, it appears not to, but no proof, to our # knowledge, exists for nontermination. The radix used is important. # For bases that are powers of 2, it can be proved that there are # integers for which the process does not terminate in a palindrome. # ############################################################################ # # Requires: Large integer arithmetic # ############################################################################ # Generate integers in the reverse-addition sequence starting at i, # but terminating when the number is palindromic. # # Note that revadd() returns an integer (native or large). procedure revadd(i) local j i := integer(i) | stop("*** invalid type to revadd()") repeat { j := reverse(i) if i == j then return i else suspend i i +:= j } end icon-9.4.3/ipl/procs/openchk.icn0000664000175000017500000000460407140713040016037 0ustar chrishchrish############################################################################ # # File: openchk.icn # # Subject: Procedure to aid in open/close debugging # # Author: David A. Gamey # # Date: March 14, 1995 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # Usage: # # OpenCheck() # # Subsequent opens and closes will write diagnostic information to &errout # Useful for diagnosing situations where many files are opened and closed # and there is a possibility that some files are not always being closed. # ############################################################################# procedure OpenCheck(p,x) local f, e static openS if type(p) == "procedure" then { # Internal use, by intercept routines if /openS then { write(&errout,"OpenCheck has not been initialized.") runerr(500) } case p of { OpenCheck_open : { if ( f := p!x ) then { write( &errout, "Open of ", image(f), " succeeded." ) insert( openS, f ) } else { writes( &errout, "Open of ") every writes( &errout, image(!x) ) write( &errout, " failed." ) } } OpenCheck_close: { e := 1 &error :=: e if ( f := p!x ) then { &error :=: e write( &errout, "Close of ", image(f), " succeeded." ) delete( openS, f ) } else { &error :=: e write( &errout, "Close of ", image(f), " failed." ) } } default: runerr(500) } write( &errout, *openS, " objects are open:" ) every write( &errout, " ", image(!sort( openS )) ) if type(f) == "file" then return f else { runerr(&errornumber,&errorvalue) # if error fail } } else { # Setup call comes here if /p & /x then if /openS := set() then { OpenCheck_open :=: open OpenCheck_close :=: close } else runerr(123, \p | \x ) } return end procedure OpenCheck_open( x[] ) return OpenCheck(OpenCheck_open,x) end procedure OpenCheck_close( x[] ) return OpenCheck(OpenCheck_close,x) end icon-9.4.3/ipl/procs/identgen.icn0000664000175000017500000001614607142351332016215 0ustar chrishchrish############################################################################ # # File: identgen.icn # # Subject: Procedures for meta-translation code generation # # Author: Ralph E. Griswold # # Date: August 3, 2000 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # This program is designed to be linked with the output of the meta- # translator. As given here, they produce an identity translation. # Modifications can be made to effect different translations. # ############################################################################ # # Bug: The invocable declaration is not handled properly. "invocable all" # will get by, but some other forms produce syntax errors. The # problem is in the meta-translator itself, not in this program. # ############################################################################ # # Links: strings # ############################################################################ link strings # cat(s1, s2, ... ) global code_gen procedure main() code_gen := cat # so it can be changed easily Mp() # call meta-procedure end procedure Alt(e1, e2) # e1 | e2 return code_gen("(", e1, "|", e2, ")") end procedure Apply(e1, e2) # e1 ! e2 return code_gen("(", e1, "!", e2, ")") end procedure Arg(e) return e end procedure Asgnop(op, e1, e2) # e1 op e2 return code_gen("(", e1, " ", op, " ", e2, ")") end procedure Augscan(e1, e2) # e1 ?:= e2 return code_gen("(", e1, " ?:= ", e2, ")") end procedure Bamper(e1, e2) # e1 & e2 return code_gen("(", e1, " & ", e2, ")") end procedure Binop(op, e1, e2) # e1 op e2 return code_gen("(", e1, " ", op, " ", e2, ")") end procedure Body(es[]) # procedure body every write(!es) return end procedure Break(e) # break e return code_gen("break ", e) end procedure Case(e, clist) # case e of { caselist } return code_gen("case ", e, " of {", clist, "}") end procedure Cclause(e1, e2) # e1 : e2 return code_gen(e1, " : ", e2, "\n") end procedure Clist(cclause1, cclause2) # cclause1 ; cclause2 return code_gen(cclause1, ";", cclause2) end procedure Clit(c) # 'c' return image(c) end procedure Compound(es[]) # { e1; e2; ... } local result if *es = 0 then return "{}\n" result := "{\n" every result ||:= !es || "\n" return code_gen(result, "}\n") end procedure Create(e) # create e return code_gen("create ", e) end procedure Default(e) # default: e return code_gen("default: ", e) end procedure End() # end write("end") return end procedure Every(e) # every e return code_gen("every ", e) end procedure EveryDo(e1, e2) # every e1 do e2 return code_gen("every ", e1, " do ", e2) end procedure Fail() # fail return "fail" end procedure Field(e, f) # e . f return code_gen("(", e, ".", f, ")") end procedure Global(vs[]) # global v1, v2, ... local result result := "" every result ||:= !vs || ", " write("global ", result[1:-2]) return end procedure If(e1, e2) # if e1 then e2 return code_gen("if ", e1, " then ", e2) end procedure IfElse(e1, e2, e3) # if e1 then e2 else e3 return code_gen("if ", e1, " then ", e2, " else ", e3) end procedure Ilit(i) # i return i end procedure Initial(e) # initial e write("initial ", e) return end procedure Invocable(ss[]) # invocable s1, s2, ... (problem) if \ss then write("invocable all") else write("invocable ", ss) return end procedure Invoke(e, es[]) # e(e1, e2, ...) local result if *es = 0 then return code_gen(e, "()") result := "" every result ||:= !es || ", " return code_gen(e, "(", result[1:-2], ")") end procedure Key(s) # &s return code_gen("&", s) end procedure Limit(e1, e2) # e1 \ e2 return code_gen("(", e1, "\\", e2, ")") end procedure Link(vs[]) # link "v1, v2, ..." local result result := "" every result ||:= !vs || ", " write("link ", result[1:-2]) return end procedure List(es[]) # [e1, e2, ... ] local result if *es = 0 then return "[]" result := "" every result ||:= !es || ", " return code_gen("[", result[1:-2], "]") end procedure Local(vs[]) # local v1, v2, ... local result result := "" every result ||:= !vs || ", " write("local ", result[1:-2]) return end procedure Next() # next return "next" end procedure Not(e) # not e return code_gen("not(", e, ")") end procedure Null() # &null return "" end procedure Paren(es[]) # (e1, e2, ... ) local result if *es = 0 then return "()" result := "" every result ||:= !es || ", " return code_gen("(", result[1:-2], ")") end procedure Pdco(e, es[]) # e{e1, e2, ... } local result if *es = 0 then return code_gen(e, "{}") result := "" every result ||:= !es || ", " return code_gen(e, "{", result[1:-2], "}") end procedure Proc(n, vs[]) # procedure n(v1, v2, ...) local result, v if *vs = 0 then write("procedure ", n, "()") result := "" every v := !vs do if \v == "[]" then result[-2:0] := v || ", " else result ||:= (\v | "") || ", " write("procedure ", n, "(", result[1:-2], ")") return end procedure Record(n, fs[]) # record n(f1, f2, ...) local result, field if *fs = 0 then write("record ", n, "()") result := "" every field := !fs do result ||:= (\field | "") || ", " write("record ", n, "(", result[1:-2], ")") return end procedure Repeat(e) # repeat e return code_gen("repeat ", e) end procedure Return(e) # return e return code_gen("return ", e) end procedure Rlit(r) # r return r end procedure Scan(e1, e2) # e1 ? e2 return code_gen("(", e1 , " ? ", e2, ")") end procedure Section(op, e1, e2, e3) # e1[e2 op e3] return code_gen(e1, "[", e2, op, e3, "]") end procedure Slit(s) # "s" return image(s) end procedure Static(vs[]) # static v1, v2, .. local result result := "" every result ||:= !vs || ", " write("static ", result[1:-2]) return end procedure Subscript(e1, e2) # e1[e2] return code_gen(e1, "[", e2, "]") end procedure Suspend(e) # suspend e return code_gen("suspend ", e) end procedure SuspendDo(e1, e2) # suspend e1 do e2 return code_gen("suspend ", e1, " do ", e2) end procedure To(e1, e2) # e1 to e2 return code_gen("(", e1, " to ", e2, ")") end procedure ToBy(e1, e2, e3) # e1 to e2 by e3 return code_gen("(", e1, " to ", e2, " by ", e3, ")") end procedure Repalt(e) # |e return code_gen("(|", e, ")") end procedure Unop(op, e) # op e return code_gen("(", op, e, ")") end procedure Until(e) # until e return code_gen("until ", e) end procedure UntilDo(e1, e2) # until e1 do e2 return code_gen("until ", e1, " do ", e2) end procedure Var(v) # v return v end procedure While(e) # while e return code_gen("while ", e) end procedure WhileDo(e1, e2) # while e1 do e2 return code_gen("while ", e1, " do ", e2) end icon-9.4.3/ipl/procs/hetero.icn0000664000175000017500000000216207140713036015700 0ustar chrishchrish############################################################################ # # File: hetero.icn # # Subject: Procedures to test structure typing # # Author: Ralph E. Griswold # # Date: April 19, 1996 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # # ############################################################################ procedure stypes(X, ref) #: types of structure elements local op, types, t, k op := proc("!", 1) t := type(X) op := if (t == "table") & (ref === 1) then "key" if (t == "table") & (ref === 2) then { types := set() every k := key(X) do insert(types, type(k) || ":" || type(X[k])) return sort(types) } else if t == ("list" | "record" | "table" | "set") then { types := set() every insert(types, type(op(X))) return sort(types) } else stop("*** invalid type to stypes()") end procedure homogeneous(X, ref) if *stypes(X, ref) = 1 then return else fail end icon-9.4.3/ipl/procs/patterns.icn0000664000175000017500000001160307140713037016253 0ustar chrishchrish############################################################################ # # File: patterns.icn # # Subject: Procedures for SNOBOL4-style pattern matching # # Author: Ralph E. Griswold # # Date: June 10, 1988 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # These procedures provide procedural equivalents for most SNOBOL4 # patterns and some extensions. # # Procedures and their pattern equivalents are: # # Any(s) ANY(S) # # Arb() ARB # # Arbno(p) ARBNO(P) # # Arbx(i) ARB(I) # # Bal() BAL # # Break(s) BREAK(S) # # Breakx(s) BREAKX(S) # # Cat(p1,p2) P1 P2 # # Discard(p) /P # # Exog(s) \S # # Find(s) FIND(S) # # Len(i) LEN(I) # # Limit(p,i) P \ i # # Locate(p) LOCATE(P) # # Marb() longest-first ARB # # Notany(s) NOTANY(S) # # Pos(i) POS(I) # # Replace(p,s) P = S # # Rpos(i) RPOS(I) # # Rtab(i) RTAB(I) # # Span(s) SPAN(S) # # String(s) S # # Succeed() SUCCEED # # Tab(i) TAB(I) # # Xform(f,p) F(P) # # The following procedures relate to the application and control # of pattern matching: # # Apply(s,p) S ? P # # Mode() anchored or unanchored matching (see Anchor # and Float) # # Anchor() &ANCHOR = 1 if Mode := Anchor # # Float() &ANCHOR = 0 if Mode := Float # # In addition to the procedures above, the following expressions # can be used: # # p1() | p2() P1 | P2 # # v <- p() P . V (approximate) # # v := p() P $ V (approximate) # # fail FAIL # # =s S (in place of String(s)) # # p1() || p2() P1 P2 (in place of Cat(p1,p2)) # # Using this system, most SNOBOL4 patterns can be satisfactorily # transliterated into Icon procedures and expressions. For example, # the pattern # # SPAN("0123456789") $ N "H" LEN(*N) $ LIT # # can be transliterated into # # (n <- Span('0123456789')) || ="H" || # (lit <- Len(n)) # # Concatenation of components is necessary to preserve the # pattern-matching properties of SNOBOL4. # # Caveats: Simulating SNOBOL4 pattern matching using the procedures # above is inefficient. # ############################################################################ global Mode, Float procedure Anchor() # &ANCHOR = 1 suspend "" end procedure Any(s) # ANY(S) suspend tab(any(s)) end procedure Apply(s,p) # S ? P local tsubject, tpos, value initial { Float := Arb /Mode := Float # &ANCHOR = 0 if not already set } suspend ( (tsubject := &subject) & (tpos := &pos) & (&subject <- s) & (&pos <- 1) & (Mode() & (value := p())) & (&pos <- tpos) & # to restore on backtracking (&subject <- tsubject) & # note this sets &pos (&pos <- tpos) & # to restore on evaluation value ) end procedure Arb() # ARB suspend tab(&pos to *&subject + 1) end procedure Arbno(p) # ARBNO(P) suspend "" | (p() || Arbno(p)) end procedure Arbx(i) # ARB(I) suspend tab(&pos to *&subject + 1 by i) end procedure Bal() # BAL suspend Bbal() || Arbno(Bbal) end procedure Bbal() # used by Bal() suspend (="(" || Arbno(Bbal) || =")") | Notany("()") end procedure Break(s) # BREAK(S) suspend tab(upto(s) \ 1) end procedure Breakx(s) # BREAKX(S) suspend tab(upto(s)) end procedure Cat(p1,p2) # P1 P2 suspend p1() || p2() end procedure Discard(p) # /P suspend p() & "" end procedure Exog(s) # \S suspend s end procedure Find(s) # FIND(S) suspend tab(find(s) + 1) end procedure Len(i) # LEN(I) suspend move(i) end procedure Limit(p,i) # P \ i local j j := &pos suspend p() \ i &pos := j end procedure Locate(p) # LOCATE(P) suspend tab(&pos to *&subject + 1) & p() end procedure Marb() # max-first ARB suspend tab(*&subject + 1 to &pos by -1) end procedure Notany(s) # NOTANY(S) suspend tab(any(~s)) end procedure Pos(i) # POS(I) suspend pos(i + 1) & "" end procedure Replace(p,s) # P = S suspend p() & s end procedure Rpos(i) # RPOS(I) suspend pos(-i) & "" end procedure Rtab(i) # RTAB(I) suspend tab(-i) end procedure Span(s) # SPAN(S) suspend tab(many(s)) end procedure String(s) # S suspend =s end procedure Succeed() # SUCCEED suspend |"" end procedure Tab(i) # TAB(I) suspend tab(i + 1) end procedure Xform(f,p) # F(P) suspend f(p()) end icon-9.4.3/ipl/procs/morse.icn0000664000175000017500000000264507140713037015546 0ustar chrishchrish############################################################################ # # File: morse.icn # # Subject: Procedures to convert string to Morse code # # Author: Ralph E. Griswold, modified by Rich Morin # # Date: June 26, 1990 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # This procedure converts the string s to its Morse code equivalent. # # The version used is known both as International Morse Code and as # Continental Code, and is used by radio amateurs (hams). # ############################################################################ procedure morse(s) local i, c, t, x static code, key1, key2 initial { code := "....------.----..---.-.---...--.--._ -..--..-.--....-.-.-...-..-....." key1 := "tmot09ttt1t8tt2gqtttjtz7t3nky(tcttt_ tdx/twptb64earttltvtiuftsh5" key2 := "tttttttttt'tt,ttttttttt:tttttt)tttt_ t?tttttttt-ttt.;tttttt\"tttt" } x := "" every c := !map(s) do if i := upto(c, key1) then { t := code[i+:6] x ||:= t[ upto("-",t)+1 : 0 ] || " " } else if i := upto(c, key2) then x ||:= code[i+:6] || " " else if c == " " then x ||:= " " else x ||:= "<" || c || "> " return x end icon-9.4.3/ipl/procs/calls.icn0000664000175000017500000000563407450115326015521 0ustar chrishchrish############################################################################ # # File: calls.icn # # Subject: Procedures for calls as objects # # Author: Ralph E. Griswold # # Date: March 25, 2002 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # These procedures deal with procedure invocations that are encapsulated # in records. # ############################################################################ # # Links: ivalue, procname # ############################################################################ invocable all link ivalue link procname record call(proc, args) # # Invoke a procedure with a argument list from a call record. procedure invoke(call) suspend call.proc ! call.args end # # Produce a string images of a call procedure call_image(call) local args args := "" every args ||:= !call.args || ", " return procname(call.proc) || "(" || args[1:-2] || ")" end # Make a call record from a string that looks like an invocation. # What the arguments can be is limited to the capabilities of ivalue. procedure make_call(s) local arg, args, result s ? { result := call(proc(tab(upto('(')))) | fail move(1) result.args := make_args(tab(-1)) } return result end # Make an argument list from a comma-separated string procedure make_args(s) local args, arg args := [] s ? { while arg := tab(upto(',') | 0) do { put(args, ivalue(arg)) | fail move(1) | break } } return args end # Produce a string of Icon code to construct a call record. procedure call_code(s) local code, arg, result s ? { result := "call(" || tab(upto('(')) || ", [" | fail move(1) while arg := tab(upto(',)')) do { result ||:= ivalue(arg) || ", " | fail move(1) | break } } return result[1:-2] || "])" end # Write a table of calls to a file. The file format is # # name=proc:arg1,arg2,arg3, ... argn, # # where name is the name associated with the call, proc is the # procedure, and arg1, arg2, arg3, ... argn are the arguments. # Note the trailing comma. procedure write_calltable(T, p, f) local name every name := key(T) do { writes(f, name, "=") writes(f, procname(p), ":") every writes(f, image(!T[name]), ",") } write(f) return end # read a call table file into a table procedure read_calltable(f) local T, line, p, args T := table() every line := read(f) do line ? { name := tab(upto('="')) | fail move(1) p := tab(upto(':')) | fail move(1) args := [] while put(args, ivalue(tab(upto(',')))) do move(1) T[name] := call(proc(p), args) | fail } return T end icon-9.4.3/ipl/procs/getmail.icn0000664000175000017500000003205507140713037016041 0ustar chrishchrish############################################################################ # # File: getmail.icn # # Subject: Procedure to parse mail file # # Author: Charles Shartsis # # Date: August 19, 1996 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # The getmail procedure reads a Unix/Internet type mail folder # and generates a sequence of records, one per mail message. # It fails when end-of-file is reached. Each record contains the # message header and message text components parsed into separate # record fields. The entire uninterpreted message (header and text) # are also stored in the record. See the description # of message_record below. # # The argument to getmail is either the name of a mail folder or # the file handle for a mail folder which has already been opened # for reading. If getmail is resumed after the last message is # generated, it closes the mail folder and returns failure. # # If getmail generates an incomplete sequence (does not close the # folder and return failure) and is then restarted (not resumed) # on the same or a different mail folder, the previous folder file # handle remains open and inaccessible. This may be a problem if # done repeatedly since there is usually an OS-imposed limit # on number of open file handles. Safest way to use getmail # is using one of the below forms: # # message := message_record() # every message := !getmail("folder_name") do { # # process message ... # # } # # message := message_record() # coex := create getmail("folder_name") # while message := @coex do { # # process message ... # # } # # Note that if message_record's are stored in a list, the records # may be sorted by individual components (like sender, _date, _subject) # using sortf function in Icon Version 9.0. # ############################################################################ # # Requires: Icon Version 9 or greater # ############################################################################ record message_record( # components of "From " line sender, # E-Mail address of sender dayofweek, month, day, time, year, # selected message header fields # The following record fields hold the contents of common # message header fields. Each record field contains the # corresponding message field's body (as a string) or a null indicating # that no such field was present in the header. # Note that a list of message_record's # can be sorted on any of these fields using the sortff function. # The record field name is related to the message header field name # in the following way: # # record_field_name := "_" || # map(message_header_field_name, &ucase || "-", &lcase || "_") # # Thus the "Mime-Version" field body is stored in the _mime_version # record field. Multiline message header fields are "unfolded" # into a single line according to RFC 822. The message field # name, the following colon, and any immediately following # whitespace are stripped from the beginning of the # record field. E.g., if a header contains # # Mime-Version: 1.0 # # then # # message._mime_version := "1.0" # # The "Received:" field is handled differently from the other # fields since there are typically multiple occurrences of it # in the same header. The _received record field is either null or # contains a list of "Received:" fields. The message field names # are NOT stripped off. Thus # # Received: from relay4.UU.NET by mail.netcom.com (8.6.12/Netcom) # id PAA10801; Sun, 28 May 1995 15:24:17 -0700 # Received: from alterdial.UU.NET by relay4.UU.NET with SMTP # id QQyrsr05731; Sun, 28 May 1995 18:17:45 -0400 # # get stored as: # message._received := # ["Received: from relay4.UU.NET by mail.netcom.com (8.6.12/Netcom) id etc...", # "Received: from alterdial.UU.NET by relay4.UU.NET with SMTP id etc..."] _return_path, _received, _date, _message_id, _x_sender, _x_mailer, _mime_version, _content_type, _to, _from, _subject, _status, _x_status, _path, _xref, _references, _errors_to, _x_lines, _x_vm_attributes, _reply_to, _newsgroups, _content_length, # The "other" field gets all the message header fields for which we have not set up # a specific record field. The "other" record field either contains null # or a list of header fields not stored in the previous fields. # Message field names are NOT stripped off field bodies before being stored. # If there are multiple occurrences of the previously selected fields # (except _received which is assumed to occur multiple times), then # the first occurrence is stored in the appropriate record field from # the list above while subsequent occurences in the same header are # stored as separate list elements in the "other" record field. # E.g., the following header fields: # # ... # Whatever: Hello # Status: RO # Status: XX # Status: YY # ... # # would be stored as # # message._status := "RO" # message.other := # [..., "Whatever: Hello", "Status: XX", "Status: YY", ...] other, # The message text # This field is either null or a list of lines comprising # the message text. message_text, # The entire message - header and text # This field contains a list of uninterpreted lines (no RFC 822 unfolding) # comprising the raw message. all ) # getmail SEQ procedure getmail(folder_name) local folder, line, message, ws, item_tag, first_item_value, tag_field local time, message_text, unfolded_line ws := ' \t' if type(folder_name) == "file" then folder := folder_name else folder := open(folder_name, "r") | stop("Could not open ", folder_name) line := read(folder) | &null # body ITR UNTIL EOF until /line do { # message SEQ message := message_record() every !message := &null # header SEQ # from-line SEQ message.all := [] put(message.all, line) line ? ( ="From" & tab(many(ws)) & message.sender <- tab(many(~ws)) & tab(many(ws)) & message.dayofweek <- tab(many(&letters)) & tab(many(ws)) & message.month <- tab(many(&letters)) & tab(many(ws)) & message.day <- tab(many(&digits)) & tab(many(ws)) & message.time <- match_time() & tab(many(ws)) & message.year <- match_year() ) | stop("Invalid first message header line:\n", line) line := read(folder) | &null # from-line END # header-fields ITR UNTIL EOF or blank-line or From line until /line | line == "" | is_From_line(line) do { # header-field SEQ # first-line SEQ put(message.all, line) # process quoted EOL character if line[-1] == "\\" then line[-1] := "\n" unfolded_line := line line := read(folder) | &null # first-line END # after-lines ITR UNTIL EOF or line doesn't start with ws or # blank-line or From line until /line | not any(ws, line) | line == "" | is_From_line(line) do { # after-line SEQ put(message.all, line) # process quoted EOL character if line[-1] == "\\" then line[-1] := "\n" if unfolded_line[-1] == "\n" then line[1] := "" unfolded_line ||:= line line := read(folder) | &null # after-line END # after-lines END } process_header_field(message, unfolded_line) # header-field END # header-fields END } # header END # post-header ALT if blank line if line == "" then { # optional-message-text SEQ # blank-line SEQ put(message.all, line) line := read(folder) | &null # blank-line END # message-text ITR UNTIL EOF or From line until /line | is_From_line(line) do { # message-text-line SEQ put(message.all, line) /message.message_text := [] put(message.message_text, line) line := read(folder) | &null # message-text-line END # message-text END } # optional-message-text END # post-header ALT default } else { # post-header END } suspend message # message END # body END } if folder ~=== &input then close(folder) # getmail END end ############################################################################# # procedure is_From_line ############################################################################# procedure is_From_line(line) return line ? ="From " end ############################################################################# # procedure match_time ############################################################################# procedure match_time() suspend tab(any(&digits)) || tab(any(&digits)) || =":" || tab(any(&digits)) || tab(any(&digits)) || =":" || tab(any(&digits)) || tab(any(&digits)) end ############################################################################# # procedure match_year ############################################################################# procedure match_year() suspend tab(any(&digits)) || tab(any(&digits)) || tab(any(&digits)) || tab(any(&digits)) end ############################################################################# # procedure mfield_to_rfield_name ############################################################################# procedure mfield_to_rfield_name(mfield_name) static mapfrom, mapto initial { mapfrom := &ucase || "-" mapto := &lcase || "_" } return "_" || map(mfield_name, mapfrom, mapto) end ############################################################################# # procedure process_header_field ############################################################################# procedure process_header_field(message, field) local record_field_name, header_field_name, field_body static field_chars, ws # header field name can have ASCII 33 through 126 except for colon initial { field_chars := cset(string(&ascii)[34:-1]) -- ':' ws := ' \t' } field ? ( header_field_name <- tab(many(field_chars)) & =":" & (tab(many(ws)) | "") & field_body <- tab(0) ) | stop("Invalid header field:\n", field) record_field_name := mfield_to_rfield_name(header_field_name) # This is one of the selected fields if message[record_field_name] then { # Its a "Received" field if record_field_name == "_received" then { # Append whole field to received field list /message._received := [] put(message._received, field) # Not a "Received" field } else { # First occurrence in header of selected field if /message[record_field_name] then { # Assign field body to selected record field message[record_field_name] := field_body # Subsequent occurrence in header of selected field } else { # Append whole field to other field list /message.other := [] put(message.other, field) } } # Not a selected field } else { # Append whole field to other field list /message.other := [] put(message.other, field) } end ############################################################################# icon-9.4.3/ipl/procs/inserts.icn0000664000175000017500000000140707140713036016102 0ustar chrishchrish############################################################################ # # File: inserts.icn # # Subject: Procedures to build tables with duplicate keys # # Author: Robert J. Alexander # # Date: September 7, 1990 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # inserts() -- Inserts values into a table in which the same key can # have more than one value (i.e., duplicate keys). The value of each # element is a list of inserted values. The table must be created # with default value &null. # procedure inserts(tabl,key,value) (/tabl[key] := [value]) | put(tabl[key],value) return tabl end icon-9.4.3/ipl/procs/ebcdic.icn0000664000175000017500000001461607140713036015632 0ustar chrishchrish############################################################################ # # File: ebcdic.icn # # Subject: Procedures to convert between ASCII and EBCDIC # # Author: Alan Beale # # Date: August 14, 1996 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # These procedures assist in use of the ASCII and EBCDIC character sets, # regardless of the native character set of the host: # # Ascii128() Returns a 128-byte string of ASCII characters in # numerical order. Ascii128() should be used in # preference to &ascii for applications which might # run on an EBCDIC host. # # Ascii256() Returns a 256-byte string representing the 256- # character ASCII character set. On an EBCDIC host, # the order of the second 128 characters is essentially # arbitrary. # # Ebcdic() Returns a 256-byte string of EBCDIC characters in # numerical order. # # AsciiChar(i) Returns the character whose ASCII representation is i. # # AsciiOrd(c) Returns the position of the character c in the ASCII # collating sequence. # # EbcdicChar(i) Returns the character whose EBCDIC representation is i. # # EbcdicOrd(c) Returns the position of the character c in the EBCDIC # collating sequence. # # MapEtoA(s) Maps a string of EBCDIC characters to the equivalent # ASCII string, according to a plausible mapping. # # MapAtoE(s) Maps a string of ASCII characters to the equivalent # EBCDIC string, according to a plausible mapping. # # Control(c) Returns the "control character" associated with the # character c. On an EBCDIC host, with $ representing # an EBCDIC character with no 7-bit ASCII equivalent, # Control("$") may not be identical to "\^$", as # translated by ICONT (and neither result is particularly # meaningful). # ############################################################################ # # Notes: # # There is no universally accepted mapping between ASCII and EBCDIC. # See the SHARE Inc. publication "ASCII and EBCDIC Character Set and # Code Issues in Systems Application Architecture" for more information # than you would ever want to have on this subject. # # The mapping of the first 128 characters defined below by Ascii128() # is the most commonly accepted mapping, even though it probably # is not exactly like the mapping used by your favorite PC to mainframe # file transfer utility. The mapping of the second 128 characters # is quite arbitrary, except that where an alternate translation of # ASCII char(n) is popular, this translation is assigned to # Ascii256()[n+129]. # # The behavior of all functions in this package is controlled solely # by the string literals in the _Eascii() procedure. Therefore you # may modify these strings to taste, and still obtain consistent # results, provided that each character appears exactly once in the # result of _Eascii(). # # Yes, it's really true that the EBCDIC "\n" (NL, char(16r15)) is not # the same as "\l" (LF, char(16r25)). How can that be? "Don't blame # me, man, I didn't do it." # ############################################################################ procedure _Eascii() static EinAorder initial EinAorder := # NUL SOH STX ETX EOT ENQ ACK BEL BS HT NL VT FF CR SO SI "\x00\x01\x02\x03\x37\x2d\x2e\x2f\x16\x05\x15\x0b\x0c\x0d\x0e\x0f"|| # DLE DC1 DC2 DC3 DC4 NAK SYN ETB CAN EM SUB ESC FS GS RS US "\x10\x11\x12\x13\x3c\x3d\x32\x26\x18\x19\x3f\x27\x1c\x1d\x1e\x1f"|| # sp ! " # $ % & ' ( ) * + , - . / "\x40\x5a\x7f\x7b\x5b\x6c\x50\x7d\x4d\x5d\x5c\x4e\x6b\x60\x4b\x61"|| # 0 1 2 3 4 5 6 7 8 9 : ; < = > ? "\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\x7a\x5e\x4c\x7e\x6e\x6f"|| # @ A B C D E F G H I J K L M N O "\x7c\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xd1\xd2\xd3\xd4\xd5\xd6"|| # P Q R S T U V W X Y Z $< \ $> ^ _ "\xd7\xd8\xd9\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xad\xe0\xbd\x5f\x6d"|| # ` a b c d e f g h i j k l m n o "\x79\x81\x82\x83\x84\x85\x86\x87\x88\x89\x91\x92\x93\x94\x95\x96"|| # p q r s t u v w x y z $( | $) ~ DEL "\x97\x98\x99\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xc0\x4f\xd0\xa1\x07"|| "\x04\x06\x08\x09\x0a\x14\x17\x1a\x1b\x20\x25\x21\x22\x23\x24\x28_ \x29\x2a\x2b\x2c\x30\x31\x33\x34\x35\x36\x38\x39\x3a\x3b\x3e\xff_ \x41\x42\x43\x44\x4a\x45\x46\x47\x48\x49\x51\x52\x53\x54\x55\x56_ \x57\x58\x59\x62\x63\x64\x65\x66\x67\x68\x69\x70\x71\x72\x73\x74_ \x75\x76\x77\x78\x80\x8a\x8c\x8d\x8e\x8f\x90\x9a\x9c\x9d\x9e\x9f_ \xa0\xaa\xab\xac\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9_ \xba\xbb\xbc\xbe\xbf\xca\xcb\xcc\xcd\xce\xcf\xda\xdb\xdc\xdd\xde_ \xdf\xe1\xea\xeb\xec\xed\xee\xef\xfa\xfb\xfc\x8b\x6a\x9b\xfd\xfe" return EinAorder end procedure Ascii128() if "\l" == "\n" then return string(&ascii) return _Eascii()[1+:128] end procedure Ascii256() if "\l" == "\n" then return string(&cset) return _Eascii() end procedure Ebcdic() if "\l" ~== "\n" then return &cset return map(&cset, _Eascii(), &cset) end procedure AsciiChar(i) if "\l" == "\n" then return char(i) return _Eascii()[0 < i+1] | runerr(205,i) end procedure AsciiOrd(c) if "\l" == "\n" then return ord(c) return ord(MapEtoA(c)) end procedure EbcdicChar(i) if "\l" ~== "\n" then return char(i) return map(char(i), _Eascii(), &cset) end procedure EbcdicOrd(c) if "\l" ~== "\n" then return ord(c) return ord(MapAtoE(c)) end procedure MapEtoA(s) return map(s, _Eascii(), &cset) end procedure MapAtoE(s) return map(s, &cset, _Eascii()) end procedure Control(c) return AsciiChar(iand(AsciiOrd(c),16r1f)) end icon-9.4.3/ipl/procs/conffile.icn0000664000175000017500000003452307450115327016210 0ustar chrishchrish############################################################################# # # File: conffile.icn # # Subject: Procedures to read initialization directives # # Author: David A. Gamey # # Date: March 25, 2002 # ############################################################################# # # Thanks to Clint Jeffery for suggesting the Directive wrapper and # making defining a specification much cleaner looking and easier! # ############################################################################# # # This file is in the public domain. # ############################################################################# # # Description: # # At Some point certain procedures become indispensable. Anyone who # has used 'options' from the Icon program library will probably agree. # I found a need to be able to quickly, change the format and # interpretation of a set of configuration and rules files. And so, I # hope this collection of procedures will become similarly indispensable. # # # Directive( p1, p2, i1, i2 ) : r1 # # returns a specification record for a table required by ReadDirectives # # p1 is the build procedure used to extract the data from the file. # The table below describes the build procedures and the default # minimum and maximum number of arguments for each. If the included # procedures don't meet your needs then you can easily add your own # and still use Directive to build the specification. # # build procedure minargs maxargs # # Directive_table_of_sets 2 - # Directive_table 2 - # Directive_value 1 1 # Directive_set 1 - # Directive_list 1 - # < user defined > 1 - # Directive_exists 0 0 # Directive_ignore 0 - # Directive_warning 0 - # # p2 is an edit procedure that allows you to preprocess the data or null # i1 is the minimum number of arguments for this directive, default is 1 # i2 is the maximum number of arguments for this directive # # Run-time Errors: # - 123 if p1 isn't a procedure # - 123 if p2 isn't null or a procedure # - 101 if i1, i2 aren't integers and not ( 0 <= i1 <= i2 ) after defaults # # # ReadDirectives( l1, t1, s1, s2, c1, c2, p1 ) : t2 # # returns a table containing parsed directives for the specified file # # l1 is a list of file names or open files, each element of l1 is tried # in turn until a file is opened or an open file is encountered. # # For example: [ "my/rules", "/etc/rules", &input ] # # t1 is a table of specifications for parsing and handling each directive # s1 the comment character, default "#" # s2 the continuation character, default "_" # c1 the escape character, default "\" # c2 the cset of whitespace, default ' \b\t\v\f\r' # p1 stop | an error procedure to be called, fail if null # # t2 is a table containing the parsed results keyed by tag # # Notes: # - the special key "*file*" is a list containing the original # text of input file with interspersed diagnostic messages. # - the comment, escape, continuation and whitespace characters # must not overlap (unpredictable) # - the end of a directive statement will forcibly close an open # quote (no warning) # - the end of file will forcibly close a continuation (no warning) # # Run-time Errors: # - 103, 104, 107, 108, 500 # 500 errors occur if: # - arguments are too big/small # - the specification table is improper # # Directive file syntax: # # - blank lines are ignored # - all syntactic characters are parameterized # - everything after a comment character is ignored (discarded) # - to include a comment character in the directive, # precede it with an escape # - to continue a directive, # place a continue character at the end of the line (before comments) # - trailing whitespace is NOT ignored in continuations # - quoted strings are supported, # - to include a quote within a quoted string, # precede the enclosed quote with an escape # # Usage: # # -- Config file, example: -- # # # comment line # # var1 "This string, w/o quotes, will be in cfgspec[\"var\"]" # cset1 "abcdefffffffffffff" # type of quotes isn't important # int1 12345 # lcase1 "Hello There THIs iS CasE inSENsITive" # list1 one two three _ # continues # four five one three zero # set1 one one one two three 3 'a b c' # one two three 3 'a b c' # table1 k1 v1 # table1 k2 v2 # t/set1 key1 v1 v2 v3 v4 # t/set1 key2 v5 v6 # t/set1 key3 "1 2 \#3" # comment # warn1 this will produce _ # a warning # # -- Coding example: -- # # # 1. Define a specification table using Directive. # # Directive has four fields: # # - the procedure to handle the tag # # - an optional edit procedure to preprocess the data # # - the minimum number of values following the tag, # # default is dependent on the &null is treated as 0 # # - the maximum number of values following the tag, # # &null is treated as unlimited # # The table's keys are the directives of the configuration file # # The default specification should be either warning of ignore # # cfgspec := table( Directive( Directive_warning ) ) # cfgspec["var1"] := Directive( Directive_value ) # cfgspec["cset1"] := Directive( Directive_value, cset ) # cfgspec["int1"] := Directive( Directive_value, integer ) # cfgspec["lcase1"] := Directive( Directive_value, map ) # cfgspec["list1"] := Directive( Directive_list ) # cfgspec["set1"] := Directive( Directive_set ) # cfgspec["table1"] := Directive( Directive_table ) # cfgspec["t/set1"] := Directive( Directive_table_of_sets ) # # # 2. Read, parse and build a table based upon the spec and the file # # cfg := ReadDirectives( ["my.conf",&input], cfgspec ) # # # 3. Process the output # # write("Input:\n") # every write(!cfg["*file*"]) # write("\nBuilt:\n") # every k :=key(cfg) do # if k ~== "*file*" then write(k, " := ",ximage(cfg[k])) # # -- Output: -- # # Input: # # # comment line # # var1 "This string, w/o quotes, will be in cfgspec[\"var\"]" # cset1 "abcdefffffffffffff" # type of quotes isn't important # int1 12345 # lcase1 "Hello There THIs iS CasE inSENsITive" # list1 one two three _ # continues # four five one three zero # set1 one one one two three 3 'a b c' # one two three 3 'a b c' # table1 k1 v1 # table1 k2 v2 # t/set1 key1 v1 v2 v3 v4 # t/set1 key2 v5 v6 # t/set1 key3 "1 2 \#3" # comment # warn This will produce a _ # warning # -- Directive isn't defined in specification. # # Built: # # set1 := S1 := set() # insert(S1,"3") # insert(S1,"a b c") # insert(S1,"one") # insert(S1,"three") # insert(S1,"two") # cset1 := 'abcdef' # t/set1 := T4 := table(&null) # T4["key1"] := S2 := set() # insert(S2,"v1") # insert(S2,"v2") # insert(S2,"v3") # insert(S2,"v4") # T4["key2"] := S3 := set() # insert(S3,"v5") # insert(S3,"v6") # T4["key3"] := S4 := set() # insert(S4,"1 2 #3") # list1 := L12 := list(8) # L12[1] := "one" # L12[2] := "two" # L12[3] := "three" # L12[4] := "four" # L12[5] := "five" # L12[6] := "one" # L12[7] := "three" # L12[8] := "zero" # lcase1 := "hello there this is case insensitive" # int1 := 12345 # var1 := "This string, w/o quotes, will be in cfgspec[\"var\"]" # table1 := T3 := table(&null) # T3["k1"] := "v1" # T3["k2"] := "v2" # ############################################################################# link lastc record _DirectivesSpec_(classproc,editproc,minargs,maxargs) procedure Directive(p,e,mi,mx) #: Wrapper to build directive specification if type(p) ~== "procedure" then runerr(123,p) if type(\e) ~== "procedure" then runerr(123,e) else /e := 1 case p of { Directive_table | Directive_table_of_sets: /mi := 2 Directive_value : { /mi := 1 ; /mx := 1 } Directive_exists : { /mi := 0 ; /mx := 0 } default : /mi := 1 } if not ( integer(mi) >= 0 ) then runerr(101,mi) if \mx & not ( integer(mx) >= mi ) then runerr(101,mx) return _DirectivesSpec_(p,e,mi,mx) end procedure ReadDirectives( #: Builds icon data structures from a config file fnL,spec,comment,continue,escape,quotes,whitespace,errp) local notescape, eof, line, wip, x, y, q, s, d local sL, sLL, f, fn, fL, action, tag, DirectiveT # 1. defaults, type checking and setup /comment := "#" /continue := "_" /escape := '\\' /quotes := '\'"' /whitespace := ' \b\t\v\f\r' if not ( comment := string(comment) ) then runerr(103,comment) if *comment ~= 1 then runerr(500,comment) if not ( continue := string(continue) ) then runerr(103,continue) if *continue ~= 1 then runerr(500,continue) if not ( escape := cset(escape) ) then runerr(104,escape) if *escape ~= 1 then runerr(500,escape) notescape := ~escape if not ( quotes := cset(quotes) ) then runerr(104,quotes) if *quotes = 0 then runerr(500,quotes) if not ( whitespace := cset(whitespace) ) then runerr(104,whitespace) if *whitespace = 0 then runerr(500,whitespace) if type(fnL) ~== "list" then runerr(108,fnL) if type(spec) ~== "table" then runerr(124,spec) fL := [] # list of original config file sL := [] # list of lists corresponding to each directive DirectiveT := table() # results # 2. locate (and open) a file every fn := !fnL do { if /fn then next if type(fn) == "file" then break f := fn if f := open(fn) then break } if /f then { write(&errout,"ReadDirectives: no open(able) files in: ",every image(!fnL) ) \errp() | fail } # 3. input, tokenizing and processing of directives while /eof do { # 3.1 gather complete directive statements wip := "" repeat { if not ( line := read(f) ) then eof := line := "" else { put(fL,line) # save original line line ?:= 2( tab(many(whitespace)), tab(0) ) # discard leading w/s line ?:= tab(findp(notescape,comment)) # discard comment line := trim(line,whitespace) } wip ||:= line if wip[-1] == continue then { wip := wip[1:-1] next } else break } # 3.2 tokenize directive put( sL, sLL := [] ) # start a list of words wip ? repeat { tab( many(whitespace) ) # kill leading white space if pos(0) then break # deal with trailing whitespace here ( q := tab(any(quotes)), ( x := 1( tab(findp(notescape,q)), =q ) | tab(0) ) ) | ( x := tab(upto(whitespace) | 0) ) y := "" x ? # strip imbedded escape characters { while y ||:= tab(upto(escape)) do move(1) y ||:= tab(0) } put( sLL, y ) # save token } if *sLL = 0 then # remove and skip null lines pull(sL) & next # 3.3 process directive action := get(sLL) # peel off the action tag d := spec[action] if /d | /d.classproc then runerr(500,d) if *sLL < \d.minargs then put( fL, "-- Fewer arguments than spec allows.") if *sLL > \d.maxargs then put( fL, "-- More arguments than spec allows.") (d.classproc)(fL,DirectiveT,action,sLL,d.editproc) # call build procedure } DirectiveT["*file*"] := fL # save original text return DirectiveT end # Build support procedures procedure Directive_table_of_sets( #: build table of sets: action key value(s) fileL,DirectiveT,action,argL,editproc) local tag if *argL < 2 then put(fileL,"-- Too few arguments for (table_of_sets): action key value(s)") /DirectiveT[action] := table() /DirectiveT[action][tag := get(argL) ] := set() while insert(DirectiveT[action][tag],editproc(get(argL)) ) return end procedure Directive_table( #: build table: action key value fileL,DirectiveT,action,argL,editproc) if *argL ~= 2 then put(fileL,"-- Wrong number of arguments for (table): action key value") /DirectiveT[action] := table() DirectiveT[action][get(argL)] := editproc(get(argL)) return end procedure Directive_set( #: build set: action value(s) fileL,DirectiveT,action,argL,editproc) if *argL < 1 then put(fileL,"-- Too few arguments for (set): action value(s)") /DirectiveT[action] := set() while insert( DirectiveT[action], editproc(get(argL)) ) return end procedure Directive_list( #: build list: action value(s) fileL,DirectiveT,action,argL,editproc) if *argL < 1 then put(fileL,"-- Too few arguments for (list): action value(s)") /DirectiveT[action] := [] while put( DirectiveT[action], editproc(get(argL)) ) return end procedure Directive_value( #: build value: action value fileL,DirectiveT,action,argL,editproc) if *argL = 0 then DirectiveT[action] := &null else DirectiveT[action] := editproc(get(argL)) return end procedure Directive_exists( #: build existence flag: action fileL,DirectiveT,action,argL,editproc) if *argL = 0 then DirectiveT[action] := 1 else DirectiveT[action] := editproc(get(argL)) return end procedure Directive_ignore( #: quietly ignore any directive fileL,DirectiveT,action,argL,editproc) return end procedure Directive_warning( #: flag directive with a warning fileL,DirectiveT,action,argL,editproc) put(fileL,"-- Directive isn't defined in specification." ) return end icon-9.4.3/ipl/procs/tab2rec.icn0000664000175000017500000000155007631301750015735 0ustar chrishchrish############################################################################ # # File: tab2rec.icn # # Subject: Procedure to put tab-separated strings in records # # Author: Ralph E. Griswold # # Date: July 6, 2002 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # This procedure to takes tab-separated strings and inserts them # into fields of a record. # # Vertical tabs in strings are converted to carriage returns. # # (Works for lists too.) # ############################################################################ procedure tab2rec(s, rec) local i i := 0 s ? { while rec[i +:= 1] := map(tab(upto('\t') | 0), "\v", "\n") do move(1) | break } return end icon-9.4.3/ipl/procs/lists.icn0000664000175000017500000007015707631511544015566 0ustar chrishchrish############################################################################ # # File: lists.icn # # Subject: Procedures to manipulate lists # # Author: Ralph E. Griswold # # Date: March 5, 2003 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # Contributor: Richard L. Goerwitz # ############################################################################ # # file2lst(s) create list from lines in file # # imag2lst(s) convert limage() output to list # # l_Bscan(e1) begin list scanning # # l_Escan(l_OuterEnvir, e2) # end list scanning # # l_any(l1,l2,i,j) # any() for list scanning # # l_bal(l1,l2,l3,l,i,j # bal() for list scanning # # l_find(l1,l2,i,j) # find() for list scanning # # l_many(l1,l2,i,j) # many() for list scanning # # l_match(l1,l2,i,j) # match() for list scanning # # l_move(i) move() for list scanning # # l_pos(i) pos() for list scanning # # l_tab(i) tab() for list scanning # # l_upto(l1,l2,i,j) # upto() for list scanning # # lclose(L) close open palindrome # # lcomb(L,i) list combinations # # lcompact(L) compact list, mapping out missing values # # ldecollate(I, L) # list decollation # # ldelete(L, spec) # list deletion # # ldupl(L, i) list term duplication # # lequiv(L1, L2) list equivalence # # levate(L, m, n) list elevation # # lextend(L, i) list extension # # lfliph(L) list horizontal flip (reversal) # # lflipv(L) list vertical flip # # limage(L) unadorned list image # # lindex(L, x) # generate indices of L whose values are x # # lcollate(L1, L2, ...) # list collation; like linterl() except stops on # short list # # lconstant(L) succeeds and returns element if all are the same # # linterl(L1, L2) list interleaving # # llayer(L1, L2, ...) # layer and interleave L1, L2, ... # # llpad(L, i, x) list padding at left # # lltrim(L, S) list left trimming # # lmap(L1,L2,L3) list mapping # # lpalin(L, x) list palindrome # # lpermute(L) list permutations # # lreflect(L, i) returns L concatenated with its reversal to produce # palindrome; the values of i determine "end # conditions" for the reversal: # # 0 omit first and last elements; default # 1 omit first element # 2 omit last element # 3 don't omit element # # lremvals(L, x1, x2, ...) # remove values from list # # lrepl(L, i) list replication # # lresidue(L, m, i) # list residue # # lreverse(L) list reverse # # lrotate(L, i) list rotation # # lrpad(L, i, x) list right padding # # lrundown(L1, L2, L3) # list run down # # lrunup(L1, L2, L3) # list run up # # lrtrim(L, S) list right trimming # # lshift(L, i) shift list terms # # lst2str(L) string from concatenated values in L # # lswap(L) list element swap # # lunique(L) keep only unique list elements # # lmaxlen(L, p) returns the size of the largest value in L. # If p is given, it is applied to each string as # as a "length" procedure. The default for p is # proc("*", 1). # # lminlen(L, p) returns the size of the smallest value in L. # If p is given, it is applied to each string as # as a "length" procedure. The default for p is # proc("*", 1). # # sortkeys(L) returns list of keys from L, where L is the # result of sorting a table with option 3 or 4. # # sortvalues(L) return list of values from L, where L is the # result of sorting a table with option 3 or 4. # # str2lst(s, i) creates list with i-character lines from s. The # default for i is 1. # ############################################################################ # # About List Mapping # # The procedure lmap(L1,L2,L3) maps elements of L1 according to L2 # and L3. This procedure is the analog for lists of the built-in # string-mapping function map(s1,s2,s3). Elements in L1 that are # the same as elements in L2 are mapped into the corresponding ele- # ments of L3. For example, given the lists # # L1 := [1,2,3,4] # L2 := [4,3,2,1] # L3 := ["a","b","c","d"] # # then # # lmap(L1,L2,L3) # # produces a new list # # ["d","c","b","a"] # # Lists that are mapped can have any kinds of elements. The # operation # # x === y # # is used to determine if elements x and y are equivalent. # # All cases in lmap are handled as they are in map, except that # no defaults are provided for omitted arguments. As with map, lmap # can be used for transposition as well as substitution. # # Warning: # # If lmap is called with the same lists L2 and L3 as in # the immediately preceding call, the same mapping is performed, # even if the values in L2 and L3 have been changed. This improves # performance, but it may cause unexpected effects. # # This ``caching'' of the mapping table based on L2 and L3 # can be easily removed to avoid this potential problem. # ############################################################################ # # About List Scanning by Richard L. Goerwitz # # PURPOSE: String scanning is terrific, but often I am forced to # tokenize and work with lists. So as to make operations on these # lists as close to corresponding string operations as possible, I've # implemented a series of list analogues to any(), bal(), find(), # many(), match(), move(), pos(), tab(), and upto(). Their names are # just like corresponding string functions, except with a prepended # "l_" (e.g. l_any()). Functionally, the list routines parallel the # string ones closely, except that in place of strings, l_find and # l_match accept lists as their first argument. L_any(), l_many(), # and l_upto() all take either sets of lists or lists of lists (e.g. # l_tab(l_upto([["a"],["b"],["j","u","n","k"]])). Note that l_bal(), # unlike the builtin bal(), has no defaults for the first four # arguments. This just seemed appropriate, given that no precise # list analogue to &cset, etc. occurs. # # The default subject for list scans (analogous to &subject) is # l_SUBJ. The equivalent of &pos is l_POS. Naturally, these # variables are both global. They are used pretty much like &subject # and &pos, except that they are null until a list scanning # expression has been encountered containing a call to l_Bscan() (on # which, see below). # # Note that environments cannot be maintained quite as elegantly as # they can be for the builtin string-scanning functions. One must # use instead a set of nested procedure calls, as explained in the # _Icon Analyst_ 1:6 (June, 1991), p. 1-2. In particular, one cannot # suspend, return, or otherwise break out of the nested procedure # calls. They can only be exited via failure. The names of these # procedures, at least in this implementation, are l_Escan and # l_Bscan. Here is one example of how they might be invoked: # # suspend l_Escan(l_Bscan(some_list_or_other), { # l_tab(10 to *l_SUBJ) & { # if l_any(l1) | l_match(l2) then # old_l_POS + (l_POS-1) # } # }) # # Note that you cannot do this: # # l_Escan(l_Bscan(some_list_or_other), { # l_tab(10 to *l_SUBJ) & { # if l_any(l1) | l_match(l2) then # suspend old_l_POS + (l_POS-1) # } # }) # # Remember, it's no fair to use suspend within the list scanning # expression. l_Escan must do all the suspending. It is perfectly OK, # though, to nest well-behaved list scanning expressions. And they can # be reliably used to generate a series of results as well. # ############################################################################ # # Here's another simple example of how one might invoke the l_scan # routines: # # procedure main() # # l := ["h","e","l","l","o"," ","t","t","t","h","e","r","e"] # # l_Escan(l_Bscan(l), { # hello_list := l_tab(l_match(["h","e","l","l","o"])) # every writes(!hello_list) # write() # # # Note the nested list-scanning expressions. # l_Escan(l_Bscan(l_tab(0)), { # l_tab(l_many([[" "],["t"]]) - 1) # every writes(!l_tab(0)) # write() # }) # }) # # end # # The above program simply writes "hello" and "there" on successive # lines to the standard output. # ############################################################################ # # PITFALLS: In general, note that we are comparing lists here instead # of strings, so l_find("h", l), for instance, will yield an error # message (use l_find(["h"], l) instead). The point at which I # expect this nuance will be most confusing will be in cases where # one is looking for lists within lists. Suppose we have a list, # # l1 := ["junk",[["hello"]," ",["there"]],"!","m","o","r","e","junk"] # # and suppose, moreover, that we wish to find the position in l1 at # which the list # # [["hello"]," ",["there"]] # # occurs. If, say, we assign [["hello"]," ",["there"]] to the # variable l2, then our l_find() expression will need to look like # # l_find([l2],l1) # ############################################################################ # # Extending scanning to lists is really very difficult. What I think # (at least tonight) is that scanning should never have been # restricted to strings. It should have been designed to operate on # all homogenous one-dimensional arrays (vectors, for you LISPers). # You should be able, in other words, to scan vectors of ints, longs, # characters - any data type that seems useful. The only question in # my mind is how to represent vectors as literals. Extending strings # to lists goes beyond the bounds of scanning per-se. This library is # therefore something of a stab in the dark. # ############################################################################ # # Links: equiv, indices, numbers # ############################################################################ link equiv link indices link numbers procedure file2lst(s) #: create list from lines in file local input, result input := open(s) | fail result := [] every put(result, !input) close(input) return result end procedure imag2lst(seqimage) #: convert limage() output to list local seq, term seq := [] seqimage[2:-1] ? { if pos(0) then return seq tab(many(' ')) while term := tab(bal(',', '[', ']') | 0) do { term := numeric(term) # special interest put(seq, term) move(1) | break tab(many(' ')) } } return seq end global l_POS global l_SUBJ record l_ScanEnvir(subject,pos) procedure l_Bscan(e1) #: begin list scanning # # Prototype list scan initializer. Based on code published in # the _Icon Analyst_ 1:6 (June, 1991), p. 1-2. # local l_OuterEnvir initial { l_SUBJ := [] l_POS := 1 } # # Save outer scanning environment. # l_OuterEnvir := l_ScanEnvir(l_SUBJ, l_POS) # # Set current scanning environment to subject e1 (arg 1). Pos # defaults to 1. Suspend the saved environment. Later on, the # l_Escan procedure will need this in case the scanning expres- # sion as a whole sends a result back to the outer environment, # and the outer environment changes l_SUBJ and l_POS. # l_SUBJ := e1 l_POS := 1 suspend l_OuterEnvir # # Restore the saved environment (plus any changes that might have # been made to it as noted in the previous run of comments). # l_SUBJ := l_OuterEnvir.subject l_POS := l_OuterEnvir.pos # # Signal failure of the scanning expression (we're done producing # results if we get to here). # fail end procedure l_Escan(l_OuterEnvir, e2) #: end list scanning local l_InnerEnvir # # Set the inner scanning environment to the values assigned to it # by l_Bscan. Remember that l_SUBJ and l_POS are global. They # don't need to be passed as parameters from l_Bscan. What # l_Bscan() needs to pass on is the l_OuterEnvir record, # containing the values of l_SUBJ and l_POS before l_Bscan() was # called. l_Escan receives this "outer environment" as its first # argument, l_OuterEnvir. # l_InnerEnvir := l_ScanEnvir(l_SUBJ, l_POS) # # Whatever expression produced e2 has passed us a result. Now we # restore l_SUBJ and l_POS, and send that result back to the outer # environment. # l_SUBJ := l_OuterEnvir.subject l_POS := l_OuterEnvir.pos suspend e2 # # Okay, we've resumed to (attempt to) produce another result. Re- # store the inner scanning environment (the one we're using in the # current scanning expression). Remember? It was saved in l_Inner- # Envir just above. # l_SUBJ := l_InnerEnvir.subject l_POS := l_InnerEnvir.pos # # Fail so that the second argument (the one that produced e2) gets # resumed. If it fails to produce another result, then the first # argument is resumed, which is l_Bscan(). If l_Bscan is resumed, it # will restore the outer environment and fail, causing the entire # scanning expression to fail. # fail end procedure l_any(l1,l2,i,j) #: any() for list scanning # # Like any(c,s2,i,j) except that the string & cset arguments are # replaced by list arguments. l1 must be a list of one-element # lists, while l2 can be any list (l_SUBJ by default). # local x, sub_l /l1 & stop("l_any: Null first argument!") if type(l1) == "set" then l1 := sort(l1) /l2 := l_SUBJ if \i then { if i < 1 then i := *l2 + (i+1) } else i := \l_POS | 1 if \j then { if j < 1 then j := *l2 + (j+1) } else j := *l_SUBJ+1 (i+1) > j & i :=: j every sub_l := !l1 do { if not (type(sub_l) == "list", *sub_l = 1) then stop("l_any: Elements of l1 must be lists of length 1.") # Let l_match check to see if i+1 is out of range. if x := l_match(sub_l,l2,i,i+1) then return x } end procedure l_bal(l1,l2,l3,l,i,j) #: bal() for list scanning local default_val, l2_count, l3_count, x, position /l1 & stop("l_bal: Null first argument!") if type(l1) == "set" then l1 := sort(l1) # convert to a list if type(l2) == "set" then l1 := sort(l2) if type(l3) == "set" then l1 := sort(l3) if /l2 := l_SUBJ then default_val := \l_POS | 1 else default_val := 1 if \i then { if i < 1 then i := *l2 + (i+1) } else i := default_val if \j then { if j < 1 then j := *l2 + (j+1) } else j := *l_SUBJ+1 l2_count := l3_count := 0 every x := i to j-1 do { if l_any(l2, l, x, x+1) then { l2_count +:= 1 } if l_any(l3, l, x, x+1) then { l3_count +:= 1 } if l2_count = l3_count then { if l_any(l1,l,x,x+1) then suspend x } } end procedure l_comp(l1,l2) # list comparison # # List comparison routine basically taken from Griswold & Griswold # (1st ed.), p. 174. # local i /l1 | /l2 & stop("l_comp: Null argument!") l1 === l2 & (return l2) if type(l1) == type(l2) == "list" then { *l1 ~= *l2 & fail every i := 1 to *l1 do l_comp(l1[i],l2[i]) | fail return l2 } end procedure l_find(l1,l2,i,j) #: find() for list scanning # # Like the builtin find(s1,s2,i,j), but for lists. # local x, old_l_POS, default_val /l1 & stop("l_find: Null first argument!") if /l2 := l_SUBJ then default_val := \l_POS | 1 else default_val := 1 if \i then { if i < 1 then i := *l2 + (i+1) } else i := default_val if \j then { if j < 1 then j := *l2 + (j+1) } else j := *l_SUBJ+1 # # See l_upto() below for a discussion of why things have to be done # in this manner. # old_l_POS := l_POS suspend l_Escan(l_Bscan(l2[i:j]), { l_tab(1 to *l_SUBJ) & { if l_match(l1) then old_l_POS + (l_POS-1) } }) end procedure l_many(l1,l2,i,j) #: many() for list scanning local x, old_l_POS, default_val /l1 & stop("l_many: Null first argument!") if type(l1) == "set" then l1 := sort(l1) if /l2 := l_SUBJ then default_val := \l_POS | 1 else default_val := 1 if \i then { if i < 1 then i := *l2 + (i+1) } else i := default_val if \j then { if j < 1 then j := *l2 + (j+1) } else j := *l_SUBJ+1 # # L_many(), like many(), is not a generator. We can therefore # save one final result in x, and then later return (rather than # suspend) that result. # old_l_POS := l_POS l_Escan(l_Bscan(l2[i:j]), { while l_tab(l_any(l1)) x := old_l_POS + (l_POS-1) }) # # Fails if there was no positional change (i.e. l_any() did not # succeed even once). # return old_l_POS ~= x end procedure l_match(l1,l2,i,j) #: match() for list scanning # # Analogous to match(s1,s2,i,j), except that s1 and s2 are lists, # and l_match returns the next position in l2 after that portion # (if any) which is structurally identical to l1. If a match is not # found, l_match fails. # local default_val if /l1 then stop("l_match: Null first argument!") if type(l1) ~== "list" then stop("l_match: Call me with a list as the first arg.") if /l2 := l_SUBJ then default_val := \l_POS | 1 else default_val := 1 if \i then { if i < 1 then i := *l2 + (i+1) } else i := default_val if \j then { if j < 1 then j := *l2 + (j+1) } else j := *l_SUBJ+1 i + *l1 > j & i :=: j i + *l1 > j & fail if l_comp(l1,l2[i+:*l1]) then return i + *l1 end procedure l_move(i) #: move() for list scanning /i & stop("l_move: Null argument.") if /l_POS | /l_SUBJ then stop("l_move: Call l_Bscan() first.") # # Sets l_POS to l_POS+i; suspends that portion of l_SUBJ extending # from the old l_POS to the new one. Resets l_POS if resumed, # just the way matching procedures are supposed to. Fails if l_POS # plus i is larger than l_SUBJ+1 or if l_POS+i is less than 1. # suspend l_SUBJ[.l_POS:l_POS <- (0 < (*l_SUBJ+1 >= l_POS+i))] end procedure l_pos(i) #: pos() for list scanning local x if /l_POS | /l_SUBJ then stop("l_move: Call l_Bscan() first.") if i <= 0 then x := 0 < (*l_SUBJ+1 >= (*l_SUBJ+1)+i) | fail else x := 0 < (*l_SUBJ+1 >= i) | fail if x = l_POS then return x else fail end procedure l_tab(i) #: tab() for list scanning /i & stop("l_tab: Null argument.") if /l_POS | /l_SUBJ then stop("l_tab: Call l_Bscan() first.") if i <= 0 then suspend l_SUBJ[.l_POS:l_POS <- 0 < (*l_SUBJ+1 >= (*l_SUBJ+1)+i)] else suspend l_SUBJ[.l_POS:l_POS <- 0 < (*l_SUBJ+1 >= i)] end procedure l_upto(l1,l2,i,j) #: upto() for list scanning # # See l_any() above. This procedure just moves through l2, calling # l_any() for each member of l2[i:j]. # local old_l_POS, default_val /l1 & stop("l_upto: Null first argument!") if type(l1) == "set" then l1 := sort(l1) if /l2 := l_SUBJ then default_val := \l_POS | 1 else default_val := 1 if \i then { if i < 1 then i := *l2 + (i+1) } else i := default_val if \j then { if j < 1 then j := *l2 + (j+1) } else j := *l_SUBJ+1 # # Save the old pos, then try arb()ing through the list to see if we # can do an l_any(l1) at any position. # old_l_POS := l_POS suspend l_Escan(l_Bscan(l2[i:j]), { l_tab(1 to *l_SUBJ) & { if l_any(l1) then old_l_POS + (l_POS-1) } }) # # Note that it WILL NOT WORK if you say: # # l_Escan(l_Bscan(l2[i:j]), { # l_tab(1 to *l_SUBJ) & { # if l_any(l1) then # suspend old_l_POS + (l_POS-1) # } # }) # # If we are to suspend a result, l_Escan must suspend that result. # Otherwise scanning environments are not saved and/or restored # properly. # end procedure lblock(L1, L2) local L3, i, j if *L1 < *L2 then L1 := lextend(L1, *L2) | fail else if *L2 < *L1 then L2 := lextend(L2, *L1) | fail L3 := [] every i := 1 to *L1 do every j := 1 to L2[i] do put(L3, L2[i]) return L3 end procedure llayer(args[]) #: interleave lists with layering local offsets, offset, seq, arg, lists, k lists := [] every put(lists, lcompact(!args)) offsets := [] offset := 0 every arg := !lists do { put(offsets, offset) offset +:= max ! arg } seq := [] repeat { every k := 1 to *lists do { arg := lists[k] put(seq, get(arg) + offsets[k]) | break break } } return seq end procedure lcompact(seq) #: compact sequence local unique, target unique := set(seq) target := [] every put(target, 1 to *unique) return lmap(seq, sort(unique), target) end procedure lclose(L) #: close open palindrome if equiv(L, lreverse(L)) then return L else { L := copy(L) put(L, L[1]) return L } end procedure lcomb(L,i) #: list combinations local j if i < 1 then fail suspend if i = 1 then [!L] else [L[j := 1 to *L - i + 1]] ||| lcomb(L[j + 1:0],i - 1) end procedure ldecollate(indices, L) #: list decollation local result, i, x result := list(max ! indices) # list of lists to return every !result := [] # initially empty every x := !L do { i := get(indices) | fail put(indices, i) put(result[i], x) } return result end procedure ldelete(L, spec) #: delete specified list elements local i, tmp tmp := indices(spec, *L) | fail # bad specification while i := pull(tmp) do L := L[1+:i - 1] ||| L[i + 1:0] return L end procedure ldupl(L1, L2) #: list term duplication local L3, i, j if integer(L2) then L2 := [L2] L3 := [] every i := !L2 do every j := !L1 do every 1 to i do put(L3, j) return L3 end procedure lequiv(x,y) #: compare lists for equivalence local i if x === y then return y if type(x) == type(y) == "list" then { if *x ~= *y then fail every i := 1 to *x do if not lequiv(x[i],y[i]) then fail return y } end procedure levate(seq, m, n) #: elevate values local shafts, reseq, i, j, k shafts := list(m) every !shafts := [] every i := 1 to m do every put(shafts[i], i to n by m) reseq := [] while j := get(seq) do { i := j % m + 1 k := get(shafts[i]) put(reseq, k) put(shafts[i], k) } return reseq end procedure lextend(L, i) #: list extension local result if *L = 0 then fail result := copy(L) until *result >= i do result |||:= L result := result[1+:i] return result end procedure lfliph(L) #: list horizontal flip (reversal) lfliph := lreverse return lfliph(L) end procedure lflipv(L) #: list vertical flip local L1, m, i m := max ! L L1 := [] every i := !L do put(L1, residue(-i + 1, m, 1)) return L1 end procedure limage(L) #: list image local result if type(L) ~== "list" then stop("*** invalid type to limage()") result := "" every result ||:= image(!L) || "," return ("[" || result[1:-1] || "]") | "[]" end procedure lcollate(args[]) #: generalized list collation local seq, arg, lists, k lists := [] every put(lists, copy(!args)) seq := [] repeat { every k := 1 to *lists do { arg := lists[k] put(seq, get(arg)) | break break } } return seq end procedure lconstant(L) #: test list for all terms equal if *set(L) = 1 then return L[1] else fail end procedure lindex(lst, x) #: generate indices for items matching x local i every i := 1 to *lst do if lst[i] === x then suspend i end procedure linterl(L1, L2) #: list interleaving local L3, i if *L1 < *L2 then L1 := lextend(L1, *L2) | fail else if *L2 < *L1 then L2 := lextend(L2, *L1) | fail L3 := [] every i := 1 to *L1 do put(L3, L1[i], L2[i]) return L3 end procedure llpad(L, i, x) #: list padding at left L := copy(L) while *L < i do push(L, x) return L end procedure lrunup(L1, L2, L3) #: list run up local L4 /L3 := [1] # could be /L3 := 1 ... L4 := [] every put(L4, !L1 to !L2 by !L3) return L4 end procedure lrundown(L1, L2, L3) #: list run up local L4 /L3 := [1] # could be /L3 := 1 ... L4 := [] every put(L4, !L1 to !L2 by -!L3) return L4 end procedure lltrim(L, S) #: list left trimming L := copy(L) while member(S, L[1]) do get(L) return L end procedure lmap(L1,L2,L3) #: list mapping static lmem2, lmem3, lmaptbl, tdefault local i, a initial tdefault := [] if type(a := L1 | L2 | L3) ~== "list" then runerr(108,a) if *L2 ~= *L3 then runerr(208,L2) L1 := copy(L1) if not(lmem2 === L2 & lmem3 === L3) then { # if an argument is new, rebuild lmem2 := L2 # save for future reference lmem3 := L3 lmaptbl := table(tdefault) # new mapping table every i := 1 to *L2 do # build the map lmaptbl[L2[i]] := L3[i] } every i := 1 to *L1 do # map the values L1[i] := (tdefault ~=== lmaptbl[L1[i]]) return L1 end procedure lresidue(L, m, i) #: list residue local result /i := 0 result := [] every put(result, residue(!L, m, i)) return result end procedure lpalin(L, x) #: list palindrome L |||:= lreverse(L) if /x then pull(L) return L end procedure lpermute(L) #: list permutations local i if *L = 0 then return [] suspend [L[i := 1 to *L]] ||| lpermute(L[1:i] ||| L[i+1:0]) end procedure lreflect(L, i) #: list reflection local L1 /i := 0 if i > 3 then stop("*** invalid argument to lreflect()") if i < 3 then L1 := copy(L) return L ||| lreverse( case i of { 0: {get(L1); pull(L1); L1} 1: {get(L1); L1} 2: {pull(L1); L1} 3: L } ) end procedure lremvals(L, x[]) #: remove values from list local result, y result := [] every y := !L do if y === !x then next else put(result, y) return result end procedure lrepl(L, i) #: list replication local j, k i := (0 < integer(i)) | stop("*** invalid replication factor in lrepl()") L := copy(L) j := *L every 1 to i - 1 do every k := 1 to j do put(L, L[k]) return L end procedure lreverse(L) #: list reverse local i L := copy(L) every i := 1 to *L / 2 do L[i] :=: L[-i] return L end procedure lrotate(L, i) #: list rotation /i := 1 L := copy(L) if i > 0 then every 1 to i do put(L, get(L)) else every 1 to -i do push(L, pull(L)) return L end procedure lrpad(L, i, x) #: list right padding L := copy(L) while *L < i do put(L, x) return L end procedure lrtrim(L, S) #: list right trimming L := copy(L) while member(S, L[-1]) do pull(L) return L end procedure lshift(L, i) #: shift list terms L := copy(L) every !L +:= i return L end procedure lst2str(L) #: convert list to string local str str := "" every str ||:= !L return str end procedure lswap(L) #: list element swap local i L := copy(L) every i := 1 to *L by 2 do L[i] :=: L[i + 1] return L end procedure lunique(L) #: keep only unique list elements local result, culls, x result := [] culls := set(L) every x := !L do if member(culls, x) then { delete(culls, x) put(result, x) } return result end procedure lmaxlen(L, p) #: size of largest list entry local i /p := proc("*", 1) i := p(L[1]) | fail every i <:= p(!L) return i end procedure lminlen(L, p) #: size of smallest list entry local i /p := proc("*", 1) i := p(L[1]) | fail every i >:= p(!L) return i end procedure sortkeys(L) #: extract keys from sorted list local result result := [] every put(result, L[1 to *L by 2]) return result end procedure sortvalues(L) #: extract values from sorted list local result result := [] every put(result, L[2 to *L by 2]) return result end procedure str2lst(s, i) #: list from string local L /i := 1 L := [] s ? { while put(L, move(i)) if not pos(0) then put(L, tab(0)) } return L end icon-9.4.3/ipl/procs/rewrap.icn0000664000175000017500000001103007140713037015705 0ustar chrishchrish############################################################################ # # File: rewrap.icn # # Subject: Procedures for advanced line rewrap # # Author: Richard L. Goerwitz # # Date: March 3, 1996 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # Version: 1.4 # ############################################################################ # # The procedure rewrap(s,i), included in this file, reformats text # fed to it into strings < i in length. Rewrap utilizes a static # buffer, so it can be called repeatedly with different s arguments, # and still produce homogenous output. This buffer is flushed by # calling rewrap with a null first argument. The default for # argument 2 (i) is 70. # ############################################################################ # # Here's a simple example of how rewrap could be used. The following # program reads the standard input, producing fully rewrapped output. # # procedure main() # every write(rewrap(!&input)) # write(rewrap()) # end # # Naturally, in practice you would want to do things like check for in- # dentation or blank lines in order to wrap only on a paragraph-by para- # graph basis, as in # # procedure main() # while line := read(&input) do { # if line == "" then { # write("" ~== rewrap()) # write(line) # } else { # if match("\t", line) then { # write(rewrap()) # write(rewrap(line)) # } else { # write(rewrap(line)) # } # } # } # end # # Fill-prefixes can be implemented simply by prepending them to the # output of rewrap: # # i := 70; fill_prefix := " > " # while line := read(input_file) do { # line ?:= (f_bit := tab(many('> ')) | "", tab(0)) # write(fill_prefix || f_bit || rewrap(line, i - *fill_prefix)) # etc. # # Obviously, these examples are fairly simplistic. Putting them to # actual use would certainly require a few environment-specific # modifications and/or extensions. Still, I hope they offer some # indication of the kinds of applications rewrap might be used in. # # Note: If you want leading and trailing tabs removed, map them to # spaces first. Rewrap only fools with spaces, leaving tabs intact. # This can be changed easily enough, by running its input through the # Icon detab() function. # ############################################################################ # # See also: wrap.icn # ############################################################################ procedure rewrap(s,i) local extra_bit, line static old_line initial old_line := "" # Default column to wrap on is 70. /i := 70 # Flush buffer on null first argument. if /s then { extra_bit := old_line old_line := "" return "" ~== extra_bit } # Prepend to s anything that is in the buffer (leftovers from the last s). s ?:= { tab(many(' ')); old_line || trim(tab(0)) } # If the line isn't long enough, just add everything to old_line. if *s < i then old_line := s || " " & fail s ? { # While it is possible to find places to break s, do so. while any(' -',line := EndToFront(i),-1) do { # Clean up and suspend the last piece of s tabbed over. line ?:= (tab(many(' ')), trim(tab(0))) if *&subject - &pos + *line > i then suspend line else { old_line := "" return line || tab(0) } } # Keep the extra section of s in a buffer. old_line := tab(0) # If the reason the remaining section of s was unrewrapable was # that it was too long, and couldn't be broken up, then just return # the thing as-is. if *old_line > i then { old_line ? { if extra_bit := tab(upto(' -')+1) || (tab(many(' ')) | "") then old_line := tab(0) else extra_bit := old_line & old_line := "" return trim(extra_bit) } } # Otherwise, clean up the buffer for prepending to the next s. else { # If old_line is blank, then don't mess with it. Otherwise, # add whatever is needed in order to link it with the next s. if old_line ~== "" then { # If old_line ends in a dash, then there's no need to add a # space to it. if old_line[-1] ~== "-" then old_line ||:= " " } } } end procedure EndToFront(i) # Goes with rewrap(s,i) *&subject+1 - &pos >= i | fail suspend &subject[.&pos:&pos <- &pos+i to &pos by -1] end icon-9.4.3/ipl/procs/unsigned.icn0000664000175000017500000000250107140713037016224 0ustar chrishchrish############################################################################ # # File: unsigned.icn # # Subject: Procedure to put bits unsigned integer # # Author: Robert J. Alexander # # Date: April 2, 1990 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # unsigned() -- Puts raw bits of characters of string s into an # integer. The value is taken as unsigned. # # If large integers are supported, this routine will work for integers # of arbitrary size. # # If large integers are not supported, the following are true: # # If the size of s is the same as or greater than the size of an # integer in the Icon implementation, the result will be negative or # positive depending on the value of the integer's sign bit. # # If the size of s is less than the size of an integer, the bytes are # put into the low order part of the integer, with the remaining high # order bytes filled with zero. If the string is too large, the most # significant bytes will be lost. # # This procedure is normally used for processing of binary data read # from a file. # procedure unsigned(s) local i i := 0 every i := ior(ord(!s),ishift(i,8)) return i end icon-9.4.3/ipl/procs/mapbit.icn0000664000175000017500000000322307140713037015666 0ustar chrishchrish############################################################################ # # File: mapbit.icn # # Subject: Procedures to map string into bit representation # # Author: Ralph E. Griswold # # Date: December 5, 1995 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # The procedure mapbit(s) produces a string of zeros and ones # corresponding to the bit patterns for the characters of s. For # example, mapbit("Axe") produces "010000010111100001100101". # ############################################################################ # # Links: strings # ############################################################################ link strings procedure bilit(text,alpha,first,second) return collate(map(text,alpha,first),map(text,alpha,second)) end procedure mapbit(s) static all, base16, hex1, hex2, quad1, quad2, pair1, pair2 # The following is a bit ornate, but then ... . It could be # made more compact (and cryptic) by using lists of templates # and parameterizing the initialization. initial { all := string(&cset) base16 := "0123456789ABCDEF" hex1 := "" every hex1 ||:= repl(!base16,16) hex2 := repl(base16,16) quad1 := "" every quad1 ||:= repl(!left(base16,4),4) quad2 := repl(left(base16,4),4) pair1 := "" every pair1 ||:= repl(!left(base16,2),2) pair2 := repl(left(base16,2),2) } s := bilit(bilit(bilit(s,all,hex1,hex2),base16,quad1,quad2),left(base16,4), pair1,pair2) return s end icon-9.4.3/ipl/procs/reduce.icn0000664000175000017500000000155607140713040015662 0ustar chrishchrish############################################################################ # # File: reduce.icn # # Subject: Procedure to perform operation on list of arguments # # Author: Ralph E. Griswold # # Date: January 14, 1995 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # reduce(op, init, args[]) applies the binary operation op to all the # values in args, using init as the initial value. For example, # # reduce("+", 1, args[]) # # produces the sum of the values in args. # ############################################################################ procedure reduce(op, init, args[]) op := proc(op, 2) | stop("*** invalid operator for reduce()") every init := op(init, !args) return init end icon-9.4.3/ipl/procs/filenseq.icn0000664000175000017500000000265607274076347016247 0ustar chrishchrish############################################################################ # # File: filenseq.icn # # Subject: Procedure to get highest numbered filename in a sequence # # Author: David A. Gamey # # Date: May 2, 2001 # ########################################################################### # # This file is in the public domain. # ############################################################################ # # This procedure is useful when you need to create the next file # in a series of files (such as successive log files). # # Usage: # # fn := nextseqfilename( ".", "$", "log") # # returns the (non-existent) filename next in the sequence .\$*.log # (where the * represents 1, 2, 3, ...) or fails # # ############################################################################ # # Requires: MS-DOS or another congenial operating system # ############################################################################ # # Links: io # ############################################################################ link io procedure nextseqfilename(dir,pre,ext) local s,f,n,wn static wf initial wf := 8 # filename width dir ||:= ( dir[-1] ~== "\\" ) s := set( dosdirlist( dir, pre || "*." || ext || " /a:-d" ) ) n := integer( repl( '9', wn := wf - *pre ) ) every f := map( dir || pre || right( 1 to n, wn,"0") || "." || ext ) do if not member(s,f) then return f end icon-9.4.3/ipl/procs/fastfncs.icn0000664000175000017500000000275507140713040016224 0ustar chrishchrish############################################################################ # # File: fastfncs.icn # # Subject: Procedures for integer functions using fastest method # # Author: Ralph E. Griswold # # Date: December 26, 1995 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # These procedures implement integer-valued using the fastest # method known to the author. "Fastest" does not mean "fast". # # acker(i, j) Ackermann's function # fib(i) Fibonacci sequence # g(k, i) Generalized Hofstader nested recurrence # q(i) "Chaotic" sequence # robbins(i) Robbins numbers # ############################################################################ # # See also: iterfncs.icn, memrfncs.icn, recrfncs.icn # ############################################################################ # # Links: factors, memrfncs # ############################################################################ link factors link memrfncs procedure g(k, n) local value static psi initial psi := 1.0 / &phi if n = 0 then return 0 value := 0 value +:= floor(psi * floor((seq(0) \ k + n) / real(k)) + psi) return value end procedure robbins(n) local numer, denom, i numer := denom := 1 every i := 0 to n - 1 do { numer *:= factorial(3 * i + 1) denom *:= factorial(n + i) } return numer / denom end icon-9.4.3/ipl/procs/getpaths.icn0000664000175000017500000000330507140713036016231 0ustar chrishchrish############################################################################ # # File: getpaths.icn # # Subject: Procedure to generate elements in path # # Author: Richard L. Goerwitz # # Date: August 14, 1996 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # Version: 1.3 # ############################################################################ # # Suspends, in turn, the paths supplied as args to getpaths(), # then all paths in the PATH environment variable. A typical # invocation might look like: # # open(getpaths("/usr/local/lib/icon/procs") || filename) # # Note that getpaths() will be resumed in the above context until # open succeeds in finding an existing, readable file. Getpaths() # can take any number of arguments. # ############################################################################ # # Requires: UNIX or MS-DOS # ############################################################################ procedure getpaths(base_paths[]) local paths, p static sep, trailer, trimmer initial { if find("UNIX", &features) then { sep := ":" trailer := "/" trimmer := cset(trailer || " ") } else if find("MS-DOS", &features) then { sep := ";" trailer := "\\" trimmer := cset(trailer || " ") } else stop("getpaths: OS not supported.") } suspend !base_paths paths := getenv("PATH") \paths ? { tab(match(sep)) while p := 1(tab(find(sep)), move(1)) do suspend ("" ~== trim(p,trimmer)) || trailer return ("" ~== trim(tab(0),trimmer)) || trailer } end icon-9.4.3/ipl/procs/lindstrp.icn0000664000175000017500000000441407450115327016256 0ustar chrishchrish############################################################################ # # File: lindstrp.icn # # Subject: Procedure to interpret L-system output as striped pattern # # Author: Ralph E. Griswold # # Date: March 25, 2002 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # Lindenmayer systems are usually are interpreted as specifications # for drawing plant-like objects, fractals, or other geometric designs. # This procedure illustrates that L-systems can be interpreted in other # ways -- as striped patterns, for example. # # The procedure is called as lindstrp(prod, band_tbl) where prod is a # "production" that is interpreted as being a sequence of one-character # symbols, and band_tbl is a table with these symbols as keys whose # corresponding values are specifications for bands of the form # "color:width". An example of a table for the symbols A, B, and C is: # # band_tbl := table() # # band_tbl["A"] := "blue:3" # band_tbl["B"] := "red:10" # band_tbl["C"] := "black:5" # # With a table default of null, as above, symbols in prod that are not # table keys are effectively ignored. Other table defaults # can be used to produce different behaviors for such symbols. # # An example of a production is: # # "ABCBABC" # # The result is a string of band specifications for the striped pattern # represented by prod. It can be converted to an image by using # strplang.icn, but graphics are not necessary for the use of this # procedure itself. # # One thing this procedure is useful for is developing an understanding # of how to construct L-systems for specific purpose: L-systems for # plant-like objects and fractals are require specialized knowledge and # are difficult to construct, while stripes are simple enough for # anyone to understand and develop L-systems for. # ############################################################################ # # See also linden.icn and lindsys.icn. # ############################################################################ procedure lindstrp(prod, band_tbl) local result result := "" every result ||:= \band_tbl[!prod] || ";" return result end icon-9.4.3/ipl/procs/ddfread.icn0000664000175000017500000002343507332360637016021 0ustar chrishchrish############################################################################ # # File: ddfread.icn # # Subject: Procedures for reading ISO 8211 DDF files # # Author: Gregg M. Townsend # # Date: August 2, 2001 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # These procedures read DDF files ("Data Descriptive Files", # ISO standard 8211) such as those specified by the US Geological # Survey's "Spatial Data Transfer Standard" for digital maps. # ISO8211 files from other sources may contain additional data # encodings not recognized by these procedures. # # ddfopen(filename) opens a file and returns a handle. # ddfdda(handle) returns a list of header records. # ddfread(handle) reads the next data record. # ddfclose(handle) closes the file. # ############################################################################ # # ddfopen(filename) opens a DDF file, decodes the header, and # returns an opaque handle for use with subsequent calls. It # fails if any problems are encountered. Instead of a filename, # an already-open file can be supplied. # ############################################################################ # # ddfdda(handle) returns a list of records containing data # from the Data Descriptive Area (DDA) of the file header. # Each record contains the following fields: # # tag DDR entry tag # control field control data # name field name # labels list of field labels # format data format # # The records may also contain other fields used internally. # ############################################################################ # # ddfread(handle) reads the next data record from the file. # It returns a list of lists, with each sublist containing # a tag name followed by the associated data values, already # decoded according to the specification given in the header. # ############################################################################ # # ddfclose(handle) closes a DDF file. # ############################################################################ $define RecSep "\x1E" # ASCII Record Separator $define UnitSep "\x1F" # ASCII Unit Separator $define EitherSep '\x1E\x1F' # either separator, as cset $define LabelSep "!" # label separator $define AnySep '!\x1E\x1F' # any separator, as cset record ddf_info( # basic DDF file handle file, # underlying file header, # last header dlist, # DDA list (of ddf_dde records) dtable # DDA table (indexed by tag) ) record ddf_header( # DDF header information hcode, # header code (R if to reuse) dlen, # data length ddata, # dictionary data (as a string) tsize, # size of tag field in dictionary lsize, # size of length field psize, # size of position field s # header string ) record ddf_dde( # data description entry tag, # record tag control, # field control name, # field name rep, # non-null if labels repeat to end of record labels, # list of labels format, # format dlist # decoder list ) record ddf_decoder( # field decoder record proc, # decoding procedure arg # decoder argument ) ######################### PUBLIC PROCEDURES ######################### # ddfopen(filename) -- open DDF file for input # # Opens a DDF file, decodes the header, and returns an opaque handle h # for use with ddfread(h). Fails if any problems are found. procedure ddfopen(fname) #: open DDF file local f, h, p, l, t, e if type(fname) == "file" then f := fname else f := open(fname, "ru") | fail h := ddf_rhdr(f) | fail p := ddf_rdata(f, h) | fail l := dda_list(p) | fail t := table() every e := !l do t[e.tag] := e return ddf_info(f, h, l, t) end # ddfdda(handle) -- return list of DDAs # # Returns a list of Data Descriptive Area records containing the # following fields: # # tag DDR entry tag # control field control data # name field name # labels list of field labels # format data format # # (There may be other fields present for internal use.) procedure ddfdda(handle) return handle.dlist end # ddfread(handle) -- read DDF record # # Reads the next record using a handle returned by ddfopen(). # Returns a list of lists, each sublist consisting of a # tag name followed by the associated data values procedure ddfread(handle) #: read DDF record local h, p, dlist, code, data, drec, sublist, e, n h := handle.header if h.hcode ~== "R" then h := handle.header := ddf_rhdr(handle.file) | fail p := ddf_rdata(handle.file, h) | fail dlist := list() while code := get(p) do { data := get(p) drec := \handle.dtable[code] | next # ignore unregistered code put(dlist, sublist := [code]) data ? { n := -1 while *sublist > n do { # bail out when no more progress n := *sublist every e := !drec.dlist do # crack according to format every put(sublist, e.proc(e.arg)) if pos(-1) then =RecSep if pos(0) then # quit more likely here break } } } return dlist end # ddfclose(handle) -- close DDF file procedure ddfclose(handle) #: close DDF file close(\handle.file) every !handle := &null return end ######################### INTERNAL PROCEDURES ######################### # ddf_rhdr(f) -- read DDF header record procedure ddf_rhdr(f) local s, t, tlen, hcode, off, nl, np, nx, nt, ddata s := reads(f, 24) | fail *s = 24 | fail s ? { tlen := integer(move(5)) | fail move(1) hcode := move(1) move(5) off := integer(move(5)) | fail move(3) | fail nl := integer(move(1)) | fail np := integer(move(1)) | fail nx := move(1) | fail nt := integer(move(1)) | fail } ddata := reads(f, off - 24) | fail *ddata = off - 24 | fail return ddf_header(hcode, tlen - off, ddata, nt, nl, np, s) end # ddf_rdata(f, h) -- read data, returning code/value pairs in list procedure ddf_rdata(f, h) local tag, len, posn, data, a, d d := reads(f, h.dlen) | fail if *d < h.dlen then fail a := list() h.ddata ? while not pos(0) do { if =RecSep then break tag := move(h.tsize) | fail len := move(h.lsize) | fail posn := move(h.psize) | fail data := d[posn + 1 +: len] | fail put(a, tag, data) } return a end # dda_list(pairs) -- build DDA list from tag/data pairs procedure dda_list(p) local l, labels, tag, spec, control, name, format, d, rep l := list() while tag := get(p) do { labels := list() spec := get(p) | fail spec ? { control := move(6) | fail name := tab(upto(EitherSep) | 0) move(1) rep := ="*" while put(labels, tab(upto(AnySep))) do { if =LabelSep then next move(1) break } format := tab(upto(EitherSep) | 0) move(1) pos(0) | fail } d := ddf_dtree(format) | fail put(l, ddf_dde(tag, control, name, rep, labels, format, d)) } return l end # ddf_dtree(format) -- return tree of decoders for format # # keeps a cache to remember & share decoder lists for common formats procedure ddf_dtree(format) static dcache initial { dcache := table() dcache[""] := [ddf_decoder(ddf_str, EitherSep)] } /dcache[format] := ddf_fcrack(format[2:-1]) return dcache[format] end # ddf_fcrack(s) -- crack format string procedure ddf_fcrack(s) local dlist, n, d dlist := list() s ? while not pos(0) do { if (any(&digits)) then n := tab(many(&digits)) else n := 1 d := &null d := case move(1) of { ",": next "A": ddf_oneof(ddf_str, ddf_strn) "B": ddf_oneof(&null, ddf_binn, 8) "I": ddf_oneof(ddf_int, ddf_intn) "R": ddf_oneof(ddf_real, ddf_realn) "(": ddf_decoder(ddf_repeat, ddf_fcrack(tab(bal(')')), move(1))) } if /d then fail every 1 to n do put(dlist, d) } return dlist end # ddf_oneof(tabproc, moveproc, quantum) -- select one of two procs procedure ddf_oneof(tabproc, moveproc, quantum) local d, n if not ="(" then return ddf_decoder(tabproc, EitherSep) if any(&digits) then { /quantum := 1 n := integer(tab(many(&digits))) n % quantum = 0 | fail d := ddf_decoder(moveproc, n / quantum) } else { d := ddf_decoder(\tabproc, move(1) ++ EitherSep) | fail } =")" | fail return d end ######################### DECODING PROCEDURES ######################### procedure ddf_str(cs) # delimited string return 1(tab(upto(cs)), move(1)) end procedure ddf_strn(n) # string of n characters return move(n) end procedure ddf_int(cs) # delimited integer local s s := tab(upto(cs)) move(1) return integer(s) | 0 end procedure ddf_intn(n) # integer of n digits local s s := move(n) return integer(s) | 0 end procedure ddf_real(cs) # delimited real local s s := tab(upto(cs)) move(1) return real(s) | 0.0 end procedure ddf_realn(n) # real of n digits local s s := move(n) return real(s) | 0.0 end procedure ddf_binn(n) # binary value of n bytes local v, c v := c := ord(move(1)) every 2 to n do v := 256 * v + ord(move(1)) if c < 128 then # if sign bit unset in first byte return v else return v - ishift(1, 8 * n) end procedure ddf_repeat(lst) # repeat sublist to EOR local e repeat { every e := !lst do { if (=RecSep | &null) & pos(0) then fail else suspend e.proc(e.arg) } } end icon-9.4.3/ipl/procs/curves.icn0000664000175000017500000002577407450115327015742 0ustar chrishchrish############################################################################ # # File: curves.icn # # Subject: Procedures to generate points on plain curves # # Author: Ralph E. Griswold # # Date: March 25, 2002 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # This file links procedure files that generate traces of points on various # plain curves. # # The first two parameters determine the defining position of the # curve: # # x x coordinate # y y coordinate # # The meaning of "definition position" depends on the curve. In some # cases it is the position at which plotting starts. In others, it # is a "center" for the curve. # # The next arguments vary and generally refer to parameters of the # curve. There is no practical way to describe these here. If they # are not obvious, the best reference is # # A Catalog of Special Plane Curves, J. Dennis Lawrence, # Dover Publications, Inc., New York, 1972. # # This book, which is in print at the time of this writing, is a # marvelous source of information about plane curves and is inexpensive # as well. # # The trailing parameters give the number of steps and the end points # (generally in angles) of the curves: # # steps number of points, default varies # lo beginning of plotting range, default varies # hi end of plotting range, default varies # # Because of floating-point roundoff, the number of steps # may not be exactly the number specified. # # Note: Some of the curves may be "upside down" when plotted on # coordinate systems in which the y axis increases in a downward direction. # # Caution: Some of these procedures generate very large values # in portions of their ranges. These may cause run-time errors when # used in versions of Icon prior to 8.10. One work-around is to # turn on error conversion in such cases. # # Warning: The procedures that follow have not been tested thoroughly. # Corrections and additions are most welcome. # # These procedures are, in fact, probably most useful for the parametric # equations they contain. # ############################################################################ # # Links: gobject, math, step # ############################################################################ link gobject link math link step procedure bullet_nose(x, y, a, b, steps, lo, hi) local incr, theta /steps := 300 lo := dtor(\lo) | -&pi hi := dtor(\hi) | &pi incr := (hi - lo) / steps every theta := step(lo, hi, incr) do suspend Point( x + a * cos(theta), y + b * tan(&pi / 2 - theta), 0 ) end procedure cardioid(x, y, a, steps, lo, hi) local incr, theta, fact /steps := 300 lo := dtor(\lo) | -&pi hi := dtor(\hi) | &pi incr := (hi - lo) / steps every theta := step(lo, hi, incr) do { fact := 2 * a * (1 + cos(theta)) suspend Point( x + cos(theta) * fact, y + sin(theta) * fact, 0 ) } end procedure cissoid_diocles(x, y, a, steps, lo, hi) local incr, theta, radius /steps := 300 lo := dtor(\lo) | (-2 * &pi) hi := dtor(\hi) | (2 * &pi) incr := (hi - lo) / steps every theta := step(lo, hi, incr) do { radius := a * sin(theta) * cos(theta) suspend Point( x + radius * cos(theta), y + radius * sin(theta), 0 ) } end procedure cross_curve(x, y, a, b, steps, lo, hi) local incr, theta /steps := 300 lo := dtor(\lo) | -&pi hi := dtor(\hi) | &pi incr := (hi - lo) / steps every theta := step(lo, hi, incr) do suspend Point( x + a / cos(theta), y + b / sin(theta), 0 ) end procedure cycloid(x, y, a, b, steps, lo, hi) local incr, theta /steps := 100 lo := dtor(\lo) | 0 hi := dtor(\hi) | (8 * &pi) incr := (hi - lo) / steps every theta := step(lo, hi, incr) do suspend Point( x + a * theta - b * sin(theta), y + a - b * cos(theta), 0 ) end procedure deltoid(x, y, a, steps, lo, hi) local incr, theta /steps := 300 lo := dtor(\lo) | -&pi hi := dtor(\hi) | &pi incr := (hi - lo) / steps every theta := step(lo, hi, incr) do suspend Point( x + a * (2 * cos(theta) + cos(2 * theta)), y + a * (2 * sin(theta) - sin(2 * theta)), 0 ) end procedure ellipse(x, y, a, b, steps, lo, hi) local incr, theta /steps := 300 lo := dtor(\lo) | -&pi hi := dtor(\hi) | &pi incr := (hi - lo) / steps every theta := step(lo, hi, incr) do suspend Point( x + a * cos(theta), y + b * sin(theta), 0 ) end procedure ellipse_evolute(x, y, a, b, steps, lo, hi) local incr, theta /steps := 300 lo := dtor(\lo) | -&pi hi := dtor(\hi) | &pi incr := (hi - lo) / steps every theta := step(lo, hi, incr) do suspend Point( x + a * cos(theta) ^ 3, y + b * sin(theta) ^ 3, 0 ) end procedure epitrochoid(x, y, a, b, h, steps, lo, hi) local incr, theta, sum, fact /steps := 300 lo := dtor(\lo) | -&pi hi := dtor(\hi) | &pi incr := (hi - lo) / steps sum := a + b fact := sum / b every theta := step(lo, hi, incr) do suspend Point( x + sum * cos(theta) - h * cos(fact * theta), y + sum * sin(theta) - h * sin(fact * theta), 0 ) end procedure folium(x, y, a, b, steps, lo, hi) local incr, theta, radius /steps := 300 lo := dtor(\lo) | -&pi hi := dtor(\hi) | &pi incr := (hi - lo) / steps every theta := step(lo, hi, incr) do { radius := (3 * a * sin(theta) * cos(theta)) / (sin(theta) ^ 2 + cos(theta) ^ 2) suspend Point( x + radius * cos(theta), y + radius * sin(theta), 0 ) } end procedure hippopede(x, y, a, b, steps, lo, hi) local incr, theta, mul /steps := 300 lo := dtor(\lo) | -&pi hi := dtor(\hi) | &pi incr := (hi - lo) / steps every theta := step(lo, hi, incr) do { mul := a * b - b ^ 2 * sin(theta) ^ 2 if mul < 0 then next mul := 2 * sqrt(mul) suspend Point( x + mul * cos(theta), y + mul *sin(theta), 0 ) } end procedure kampyle_exodus(x, y, a, b, steps, lo, hi) local incr, theta, fact /steps := 300 lo := dtor(\lo) | (-&pi / 2) hi := dtor(\hi) | (3 * &pi / 2) incr := (hi - lo) / steps every theta := step(lo, hi, incr) do { fact := a / cos(theta) suspend Point( x + fact, y + fact * tan(theta), 0 ) } end procedure kappa(x, y, a, b, steps, lo, hi) local incr, theta, fact /steps := 300 lo := dtor(\lo) | 0 hi := dtor(\hi) | (2 * &pi) incr := (hi - lo) / steps every theta := step(lo, hi, incr) do { fact := a * cos(theta) suspend Point( x + fact / (0 ~= tan(theta)), y + fact, 0 ) } end procedure lemniscate_bernoulli(x, y, a, steps, lo, hi) local incr, theta, fact /steps := 300 lo := dtor(\lo) | -&pi hi := dtor(\hi) | &pi incr := (hi - lo) / steps every theta := step(lo, hi, incr) do { fact := a * cos(theta) / (1 + sin(theta) ^ 2) suspend Point( x + fact, y + fact * sin(theta), 0 ) } end procedure lemniscate_gerono(x, y, a, b, steps, lo, hi) local incr, theta, fact /steps := 300 lo := dtor(\lo) | -&pi hi := dtor(\hi) | &pi incr := (hi - lo) / steps every theta := step(lo, hi, incr) do { fact := a * cos(theta) suspend Point( x + fact, y + sin(theta) * fact, 0 ) } end procedure limacon_pascal(x, y, a, b, steps, lo, hi) local incr, theta, fact /steps := 300 lo := dtor(\lo) | -&pi hi := dtor(\hi) | &pi incr := (hi - lo) / steps every theta := step(lo, hi, incr) do { fact := b + 2 * a * cos(theta) suspend Point( x + fact * cos(theta), y + fact * sin(theta), 0 ) } end procedure line(x, y, x1, y1, steps) local xincr, yincr /steps := 100 xincr := (x1 - x) / (steps - 1) yincr := (y1 - y) / (steps - 1) every 1 to steps do { suspend Point(x, y, 0) x +:= xincr y +:= yincr } end procedure lissajous(x, y, a, b, r, delta, steps, lo, hi) local incr, theta /steps := 300 lo := dtor(\lo) | 0 hi := dtor(\hi) | (16 * &pi) incr := (hi - lo) / steps r := dtor(r) every theta := step(lo, hi, incr) do suspend Point( x + a * sin(r * theta + delta), y + b * sin(theta), 0 ) end procedure nephroid(x, y, a, steps, lo, hi) local incr, theta /steps := 300 lo := dtor(\lo) | -&pi hi := dtor(\hi) | &pi incr := (hi - lo) / steps every theta := step(lo, hi, incr) do suspend Point( x + a * (3 * cos(theta) - cos(3 * theta)), y + a * (3 * sin(theta) - sin(3 * theta)), 0 ) end # Needs to be checked out procedure parabola(x, y, a, steps, lo, hi) local incr, theta, denom, radius /steps := 300 lo := dtor(\lo) | -&pi hi := dtor(\hi) | &pi incr := (hi - lo) / steps every theta := step(lo, hi, incr) do { denom := 1 - cos(theta) if denom = 0 then next radius := 2 * a / denom suspend Point( radius * cos(theta), radius * sin(theta), 0 ) } end procedure piriform(x, y, a, b, steps, lo, hi) local incr, theta, fact /steps := 300 lo := dtor(\lo) | (-&pi / 2) hi := dtor(\hi) | (3 * &pi / 2) incr := (hi - lo) / steps every theta := step(lo, hi, incr) do { fact := 1 + sin(theta) suspend Point( x + a * fact, y + b * cos(theta) * fact, 0 ) } end procedure trisectrix_catalan(x, y, a, steps, lo, hi) local incr, theta, radius /steps := 300 lo := dtor(\lo) | (-2 * &pi) hi := dtor(\hi) | (2 * &pi) incr := (hi - lo) / steps every theta := step(lo, hi, incr) do { radius := a / cos(theta / 3) ^ 3 suspend Point( x + radius * cos(theta), y + radius * sin(theta), 0 ) } end procedure trisectrix_maclaurin(x, y, a, b, steps, lo, hi) local incr, theta, fact /steps := 300 lo := dtor(\lo) | (-&pi / 2) hi := dtor(\hi) | (&pi / 2) incr := (hi - lo) / steps every theta := step(lo, hi, incr) do { fact := a * (1 - 4 * cos(theta) ^ 2) suspend Point( x + fact, y + fact * tan(theta), 0 ) } end procedure witch_agnesi(x, y, a, steps, lo, hi) local incr, theta, fact /steps := 300 lo := dtor(\lo) | (-&pi /2) hi := dtor(\hi) | (&pi / 2) incr := (hi - lo) / steps fact := 2 * a every theta := step(lo, hi, incr) do suspend Point( x + fact * tan(theta), y - fact * cos(theta) ^ 2, 0 ) end icon-9.4.3/ipl/procs/senten1.icn0000664000175000017500000002133207140713037015770 0ustar chrishchrish############################################################################ # # File: senten1.icn # # Subject: Procedure to generate sentences # # Author: Peter A. Bigot # # Date: August 14, 1996 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # sentence(f) generates the English sentences encountered in a file. # ############################################################################ # # The following rules describe what a 'sentence' is. # # * A sentence begins with a capital letter. # # * A sentence ends with one or more of '.!?', subject to other # constraints. # # * If a period is immediately followed by: # - a digit # - a letter # - one of ',;:' # it is not a sentence end. # # * If a period is followed (with intervening space) by a lower case # letter, it is not a sentence end (assume it's part of an abbreviation). # # * The sequence '...' does not end a sentence. The sequence '....' does. # # * If a sentence end character appears after more opening parens than # closing parens in a given sequence, it is not the end of that # particular sentence. (I.e., full sentences in a parenthetical remark # in an enclosing sentence are considered part of the enclosing # sentence. Their grammaticality is in question, anyway.) (It also # helps with attributions and abbreviations that would fail outside # the parens.) # # * No attempt is made to ensure balancing of double-quoted (") material. # # * When scanning for a sentence start, material which does not conform is # discarded. # # * Corollary: Quotes or parentheses which enclose a sentence are not # considered part of it. # # * An end-of-line on input is replaced by a space unless the last # character of the line is 'a-' (where 'a' is any letter), in which case # the hyphen is deleted. # # * Leading and trailing space (tab, space, newline) chars are removed # from each line of the input. # # * If a blank line is encountered on input while scanning a sentence, # the scan is aborted and search for a new sentence begins (rationale: # ignore section and chapter headers separated from text by newlines). # # * Most titles before names would fail the above constraints. They are # special-cased. # # * This does NOT handle when a person uses their middle initial. To do # so would rule out sentences such as 'It was I.', Six of one, half-dozen # of the other--I made my choice. # # * Note that ':' does not end a sentence. This is a stylistic choice, # and can be modified by simply adding ':' to sentend below. # ############################################################################ procedure sentence (infile) local line, # Line read from input, beginning could be sent. sentence, # A possible sentence lstend, # Position in line of last checked sentence end possentp, # Boolean: non-null if line mod context = sent. spaceskip, # Spaces betwen EOSent and next char (context) nextch, # Next char after EOSent cnt, # Balanced count of parens in possible sent. t, newline static sentend, # Cset for sentence end chars wspace, # White space characters noperend, # Chars which, after period, don't end sentence titles # Titles that can appear before names. initial { sentend := '.?!' # Initial value for sentend wspace := ' \t\n' # Space chars noperend := &digits ++ &letters ++ ',:;' # No-end after period chars titles := ["Mr.", "Mrs.", "Ms.", "Dr.", "Prof.", "Pres."] } line := "" # Repeat scanning for and suspending sentences until input fails. repeat { # Try to find the start of a sentence in the current input string. # If there are none, read more from file; fail if file exhausted. # Trim trailing space from line (leading skipped by sentence start) while not (line ?:= (tab (upto (&ucase)) & tab (0))) do { line := trim (read (infile), wspace) | fail } # Find the sentence end. If there's no viable candidate, read more # from input. Set the last end position to the first char in the # sentence. lstend := 1 possentp := &null repeat { line ? { # Skip up to new stuff (scanned in previous lines). sentence := tab (lstend) while sentence ||:= tab (upto (sentend)) do { sentence ||:= tab (many (sentend)) # Verify end-of-sentence. Assume it doesn't pass. possentp := &null # Check for sentence end conformance. See what follows it: put # that in nextch, and the intervening space before it in # spaceskip. # Note hack to scan in remainder of line w/o changing &pos. nextch := &null every tab (0) ? { spaceskip := tab (many (wspace)) | "" nextch := move (1) } if /nextch then { # Don't have enough context to ensure a proper sentence end. # Read more, but let readers know that this could be a # sentence end (e.g., in case of EOF on input). possentp := 1 break } # Save position of last checked sentence end, so we don't try to # recheck this one. lstend := &pos # . doesn't end a sentence. if (sentence [-1] == '.' & spaceskip == "" & any (noperend, nextch)) then { next } # . doesn't end sentence if (sentence [-1] == '.' & any (&lcase, nextch)) then { next } # ... doesn't end sentence. .... does. if (sentence [-3:0] == "..." & sentence [-4] ~== ".") then { next } # Number of ')' must be >= number '(' in sentence. sentence ? { cnt := 0 while tab (upto ('()')) do { if ="(" then { cnt +:= 1 } else { =")" cnt -:= 1 } } } if (cnt > 0) then { next } # Special case titles that appear before names (otherwise look # like sentence ends). every t := ! titles do { if (t == sentence [- *t:0]) then { # Break every, next in sentence-end search repeat break next } } # This is a sentence. Replace the line with what follows the # sentence, and break out of the sentence-end-search loop. line := tab (0) break break } } # There is no valid sentence end so far. Remove a trailing hyphen # from the current line, or add a word-separating space. if line [-1] == '-' & any (&letters, line [-2]) then { line := line [1:-1] } else { line ||:= " " } # Read another line. If can't, then fail--but suspend sentence first # if it _could_ be a sentence end. Trim leading and trailing spaces # from the new line--if it's empty, toss the line so far and restart; # otherwise, tack it onto the end of the current line. if not (newline := read (infile)) then { if \possentp then { suspend (sentence) } fail } if any (wspace, newline) then { newline ?:= (tab (many (wspace)), tab (0)) } newline := trim (newline, wspace) if (*newline = 0) then { if \possentp then { suspend (sentence) } line := "" # Break EOS check, next beginning-of-sent scan break next } line ||:= newline } # Suspend the sentence, then loop back for more. suspend sentence } end # procedure sentence icon-9.4.3/ipl/procs/memrfncs.icn0000664000175000017500000000300607140713037016223 0ustar chrishchrish############################################################################ # # File: memrfncs.icn # # Subject: Procedures for recursive functions using memory # # Author: Ralph E. Griswold # # Date: February 4, 1995 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # These procedures implement commonly referenced ``text-book'' # recursively defined functions using memory to avoid redundant calls. # # acker(i, j) Ackermann's function # fib(i) Fibonacci sequence # q(i) "Chaotic" sequence # ############################################################################ # # See also: fastfncs, iterfncs.icn, and recrfncs.icn # ############################################################################ procedure acker(i, j) static memory initial { memory := table() every memory[0 to 100] := table() } if i = 0 then return j + 1 if j = 0 then /memory[i][j] := acker(i - 1, 1) else /memory[i][j] := acker(i - 1, acker(i, j - 1)) return memory[i][j] end procedure fib(i) static memory initial { memory := table() memory[1] := memory[2] := 1 } /memory[i] := fib(i - 1) + fib(i - 2) return memory[i] end procedure q(i) static memory initial { memory := table() memory[1] := memory[2] := 1 } /memory[i] := q(i - q(i - 1)) + q(i - q(i - 2)) return memory[i] end icon-9.4.3/ipl/procs/equiv.icn0000664000175000017500000000522607140713036015547 0ustar chrishchrish############################################################################ # # File: equiv.icn # # Subject: Procedure to compare structures # # Author: Ralph E. Griswold # # Date: February 20, 1996 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # equiv(s,y) compare arbitrary structures x and y # ############################################################################ # # The procedure equiv() tests for the "equivalence" of two values. For types # other than structures, it does the same thing as x1 === x2. For structures, # the test is for "shape". For example, # # equiv([],[]) # # succeeds. # # It handles loops, but does not recognize them as such. For example, # given # # L1 := [] # L2 := [] # put(L1,L1) # put(L2,L1) # # equiv(L1,L2) # # succeeds. # # The concept of equivalence for tables and sets is not quite right # if their elements are themselves structures. The problem is that there # is no concept of order for tables and sets, yet it is impractical to # test for equivalence of their elements without imposing an order. Since # structures sort by "age", there may be a mismatch between equivalent # structures in two tables or sets. # # Note: # The procedures equiv and ldag have a trailing argument that is used on # internal recursive calls; a second argument must not be supplied # by the user. # ############################################################################ procedure equiv(x1,x2,done) #: compare values for equivalence local code, i if x1 === x2 then return x2 # Covers everything but structures. if type(x1) ~== type(x2) then fail # Must be same type. if type(x1) == ("procedure" | "file" | "window") then fail # Leave only those with sizes (null # taken care of by first two tests). if *x1 ~= *x2 then fail # Skip a lot of possibly useless work. # Structures (and others) remain. /done := table() # Basic call. (/done[x1] := set()) | # Make set of equivalences if new. (if member(done[x1],x2) then return x2) # Records complicate things. image(x1) ? (code := (="record" | type(x1))) case code of { "list" | "record": every i := 1 to *x1 do if not equiv(x1[i],x2[i],done) then fail "table": if not equiv(sort(x1,3),sort(x2,3),done) then fail "set": if not equiv(sort(x1),sort(x2),done) then fail default: fail # Vaues of other types are different. } insert(done[x1],x2) # Equivalent; add to set. return x2 end icon-9.4.3/ipl/procs/gettext.icn0000664000175000017500000002045007274062401016077 0ustar chrishchrish############################################################################ # # File: gettext.icn # # Subject: Procedures for gettext (simple text-base routines) # # Author: Richard L. Goerwitz # # Date: May 2, 2001 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # History: # Version 1.19: December 28, 1993 (plt) # Tested with DOS, DOS-386, OS/2, ProIcon, UNIX # Modified link and OS statements. # Open index file in untranslated mode for # MS-DOS and OS/2 -- ignored by UNIX and Amiga # Handle multiple, indexed citations. # Change delimiter from to char(255). # Simplified binary search. # Version 1.20: August 5, 1995 (plt) # Replace link statement with preprocessor include. # Retrieve text for multiple keys on the same line. # Correct debug printout of indexed and sequential # search values. # ############################################################################ # # Version: 1.19 December 28, 1993 - Phillip Lee Thomas # Version: 1.20 August 5, 1995 - plt # ############################################################################ # # Gettext() and associated routines allow the user to maintain a file # of KEY/value combinations such that a call to gettext(KEY, FNAME) # will produce value. Gettext() fails if no such KEY exists. # Returns an empty string if the key exists, but has no associated # value in the file, FNAME. # # The file format is simple. Keys belong on separate lines, marked # as such by an initial colon+colon (::). Values begin on the line # following their respective keys, and extend up to the next # colon+colon-initial line or EOF. E.g. # # ::sample.1 # or: # ::sample.1 ::sample.2 # # Notice how the key above, sample.1, has :: prepended to mark it # out as a key. The text you are now reading represents that key's # value. To retrieve this text, you would call gettext() with the # name of the key passed as its first argument, and the name of the # file in which this text is stored as its second argument (as in # gettext("sample.1","tmp.idx")). # ::next.key # etc... # # For faster access, an indexing utility is included, idxtext. Idxtext # creates a separate index for a given text-base file. If an index file # exists in the same directory as FNAME, gettext() will make use of it. # The index becomes worthwhile (at least on my system) after the text- # base file becomes longer than 5 kilobytes. # # Donts: # 1) Don't nest gettext text-base files. # 2) In searches, surround phrases with spaces or tabs in # key names with quotation marks: "an example" # 3) Don't modify indexed files in any way other than to append # additional keys/values (unless you want to re-index). # # This program is intended for situations where keys tend to have # very large values, and use of an Icon table structure would be # unwieldy. # # BUGS: Gettext() relies on the Icon runtime system and the OS to # make sure the last text/index file it opens gets closed. # ############################################################################ # # Links: adjuncts # ############################################################################ # # Invoke set_OS() before first call to gettext() or # sequential_search() # # Tested with UNIX, OS/2, DOS, DOS-386, ProIcon # ############################################################################ link adjuncts global _slash, _baselen, _delimiter procedure gettext(KEY,FNAME) #: search database by indexed term local line, value static last_FNAME, intext, inidx, off_set, off_sets (/KEY | /FNAME) & stop("error (gettext): null argument") if FNAME == \last_FNAME then { seek(intext, 1) seek(\inidx, 1) } else { # We've got a new text-base file. Close the old one. every close(\intext | \inidx) # Try to open named text-base file. intext := open(FNAME) | stop("gettext: file \"",FNAME,"\" not found") # Try to open index file. inidx := open(Pathname(FNAME) || getidxname(FNAME),"ru") | &null } last_FNAME := FNAME # Find offsets, if any, for key KEY in index file. # Then seek to the end and do a sequential search # for any key/value entries that have been added # since the last time idxtext was run. if off_sets := get_offsets(KEY, inidx) then { off_sets ? { while off_set := (move(1),tab(many(&digits))) do { seek(intext, off_set) # Find key. Should be right there, unless the user has appended # key/value pairs to the end without re-indexing, or else has not # bothered to index in the first place. In this case we're # supposed to start a sequential search for KEY upto EOF. while line := (read(intext) | fail) do { line ? { if (="::",KEY) then break } } # Collect all text upto the next colon+colon line (::) # or EOF. value := "" while line := read(intext) do { find("::",line) & break value ||:= line || "\n" } # Note that a key with an empty value returns an empty string. suspend trim(value, '\n') || " (" || off_set || "-i)" } } } # Find additional values appended to file since last indexing. seek(intext, \firstline - _OS_offset) while value := sequential_search(KEY, intext) do suspend trim(value,'\n') #|| " (" || off_set || "-s)" end procedure get_offsets(KEY, inidx) #: binary search of index local incr, bottom, top, loc, firstpart, offset, line # Use these to store values likely to be reused. static old_inidx, SOF, EOF # If there's no index file, then fail. if /inidx then fail # First line contains offset of last indexed byte in the main # text file. We need this later. Save it. Start the binary # search routine at the next byte after this line. seek(inidx, 1) if not (inidx === \old_inidx) then { # Get first line. firstline := !inidx # Set "bottom." SOF := 1 # How big is this file? seek(inidx, 0) EOF := where(inidx) old_inidx := inidx } # SOF, EOF constant for a given inidx file. bottom := SOF ; top := EOF # If bottom gets bigger than top, there's no such key. until bottom >= top do { loc := (top+bottom) / 2 seek(inidx, loc) # Move past next newline. If at EOF, break. read(inidx) if (where(inidx) > EOF) | (loc = bottom) | (loc = top) then { break } # Check to see if the current line contains KEY. if line := read(inidx) then { line ? { # .IDX file line format is KEYoffset firstpart := tab(upto(_delimiter)) if KEY == firstpart then { # return offset and addresses for any added material return tab(1 - _OS_offset) } # Ah, this is what all binary searches do. else { if KEY >> firstpart then bottom := loc else top := loc } } } else top := loc # Too far, move back } end # Perform sequential search of intext for all instances of KEY. procedure sequential_search(KEY, intext) #: brute-force database search local line, value, off_set # Collect all text upto the next colon+colon line (::) # or EOF. off_set := where(intext) while (line := read(intext)) | fail do { line ? { if =("::" || KEY) & (match(" " | "\t") | pos(0)) then break else off_set := where(intext) } } value := "" while line := read(intext) do { find("::", line) & break value ||:= line || "\n" } # Debug information for sequential searching: value := value[1:-1] || " (" || off_set || "-s)\n" # Back up to allow for consecutive instances of KEY. seek(intext, where(intext) - *line - 2) suspend trim(value || "\n") end icon-9.4.3/ipl/procs/escapesq.icn0000664000175000017500000000655507140713037016231 0ustar chrishchrish############################################################################ # # File: escapesq.icn # # Subject: Procedures to deal with character string escapes # # Author: Robert J. Alexander # # Date: May 13, 1994 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # Procedure kit for dealing with escape sequences in Icon character # string representations. Note that Icon escape sequences are # very similar to C escapes, so this works for C strings, too. # # escapeseq() -- a matching procedure for Icon string escape sequences # # escchar() -- produces the character value of an Icon string escape sequence # # escape() -- converts a string with escape sequences (as in Icon string # representation) to the string it represents with escape # # quotedstring() -- matching routine for a quoted string. # ############################################################################ procedure escapeseq() # s # # Matching routine for Icon string escape sequence. # static oct,hex initial { oct := '01234567' hex := '0123456789ABCDEFabcdef' } return ( ="\\" || ( tab(any('bdeflnrtvBDEFLNRTV\'"\\')) | tab(any(oct)) || (tab(any(oct)) | "") || (tab(any(oct)) | "") | tab(any('xX')) || tab(any(hex)) || (tab(any(hex)) | "") | ="^" || move(1) ) ) end procedure escchar(s1) # s2 # # Character value of Icon string escape sequence s1. # local c s1 ? { ="\\" return case c := map(move(1)) of { "b": "\b" # backspace "d": "\d" # delete (rubout) "e": "\e" # escape (altmode) "f": "\f" # formfeed "l": "\l" # linefeed (newline) "n": "\n" # newline (linefeed) "r": "\r" # carriage return "t": "\t" # horizontal tab "v": "\v" # vertical tab "x": escchar_convert(16,2) # hexadecimal code "^": char(ord(move(1)) % 32) | &fail # control code default: { # either octal code or non-escaped character if any('01234567',c) then { # if octal digit move(-1) escchar_convert(8,3) } else c # else return escaped character } } } end procedure escchar_convert(r,max) # # Private utility procedure used by escchar -- performs conversion # of numeric character strings of radix "r", where 2 <= r <= 16. # The procedure operates in a string scanning context, and will # consume a maximum of "max" characters. # local n,d,i,c d := "0123456789abcdef"[1:r + 1] n := 0 every 1 to max do { c := move(1) | break if not (i := find(map(c),d) - 1) then { move(-1) break } n := n * r + i } return char(n) end procedure escape(s1) # s2 # # Returns string s1 with escape sequences (as in Icon string # representation) converted. # local esc s1 ? { s1 := "" while s1 ||:= tab(find("\\")) do { if esc := escapeseq() then s1 ||:= escchar(esc) else move(1) } s1 ||:= tab(0) } return s1 end procedure quotedstring() # s # # Matching routine for a quoted string. # suspend ="\"" || 1(tab(find("\"") + 1),&subject[&pos - 2] ~== "\\") end icon-9.4.3/ipl/procs/rational.icn0000664000175000017500000001171507311036343016226 0ustar chrishchrish############################################################################ # # File: rational.icn # # Subject: Procedures for arithmetic on rational numbers # # Author: Ralph E. Griswold # # Date: June 10, 2001 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # Contributor: Gregg M. Townsend # ############################################################################ # # These procedures perform arithmetic on rational numbers (fractions): # # addrat(r1,r2) Add rational numbers r1 and r2. # # divrat(r1,r2) Divide rational numbers r1 and r2. # # medrat(r1,r2) Form mediant of r1 and r2. # # mpyrat(r1,r2) Multiply rational numbers r1 and r2. # # negrat(r) Produce negative of rational number r. # # rat2real(r) Produce floating-point approximation of r # # rat2str(r) Convert the rational number r to its string # representation. # # real2rat(v,p) Convert real to rational with precision p. # The default precision is 1e-10. # (Too much precision gives huge, ugly factions.) # # reciprat(r) Produce the reciprocal of rational number r. # # str2rat(s) Convert the string representation of a rational number # (such as "3/2") to a rational number. # # subrat(r1,r2) Subtract rational numbers r1 and r2. # ############################################################################ # # Links: numbers # ############################################################################ link numbers record rational(numer, denom, sign) procedure addrat(r1, r2) #: sum of rationals local denom, numer, div r1 := ratred(r1) r2 := ratred(r2) denom := r1.denom * r2.denom numer := r1.sign * r1.numer * r2.denom + r2.sign * r2.numer * r1.denom if numer = 0 then return rational (0, 1, 1) div := gcd(numer, denom) return rational(abs(numer / div), abs(denom / div), numer / abs(numer)) end procedure divrat(r1, r2) #: divide rationals. r1 := ratred(r1) r2 := ratred(r2) return mpyrat(r1, reciprat(r2)) end procedure medrat(r1, r2) #: form rational mediant local numer, denom, div r1 := ratred(r1) r2 := ratred(r2) numer := r1.numer + r2.numer denom := r1.denom + r2.denom div := gcd(numer, denom) return rational(numer / div, denom / div, r1.sign * r2.sign) end procedure mpyrat(r1, r2) #: multiply rationals local numer, denom, div r1 := ratred(r1) r2 := ratred(r2) numer := r1.numer * r2.numer denom := r1.denom * r2.denom div := gcd(numer, denom) return rational(numer / div, denom / div, r1.sign * r2.sign) end procedure negrat(r) #: negative of rational r := ratred(r) return rational(r.numer, r.denom, -r.sign) end procedure rat2real(r) #: floating-point approximation of rational r := ratred(r) return (real(r.numer) * r.sign) / r.denom end procedure rat2str(r) #: convert rational to string r := ratred(r) return "(" || (r.numer * r.sign) || "/" || r.denom || ")" end procedure ratred(r) #: reduce rational to lowest terms local div if r.denom = 0 then runerr(501) if abs(r.sign) ~= 1 then runerr(501) if r.numer = 0 then return rational(0, 1, 1) if r.numer < 0 then r.sign *:= -1 if r.denom < 0 then r.sign *:= -1 r.numer := abs(r.numer) r.denom := abs(r.denom) div := gcd(r.numer, r.denom) return rational(r.numer / div, r.denom / div, r.sign) end # real2rat(v, p) -- convert real to rational with precision p # # Originally based on a calculator algorithm posted to usenet on August 19, # 1987, by Joseph D. Rudmin, Duke University Physics Dept. (duke!dukempd!jdr) $define MAXITER 40 # maximum number of iterations $define PRECISION 1e-10 # default conversion precision procedure real2rat(r, p) #: convert to rational with precision p local t, d, i, j static x, y initial { x := list(MAXITER); y := list(MAXITER + 2) } t := abs(r) /p := PRECISION every i := 1 to MAXITER do { x[i] := integer(t) y[i + 1] := 1 y[i + 2] := 0 every j := i to 1 by -1 do y[j] := x[j] * y[j + 1] + y[j + 2] if abs(y[1] / real(y[2]) - r) < p then break d := t - integer(t) if d < p then break t := 1.0 / d } return rational(y[1], y[2], if r >= 0 then 1 else -1) end procedure reciprat(r) #: reciprocal of rational r := ratred(r) return rational(r.denom, r.numer, r.sign) end procedure str2rat(s) # convert string to rational local div, numer, denom, sign s ? { ="(" & numer := integer(tab(upto('/'))) & move(1) & denom := integer(tab(upto(')'))) & pos(-1) } | fail return ratred(rational(numer, denom, 1)) end procedure subrat(r1, r2) #: difference of rationals r1 := ratred(r1) r2 := ratred(r2) return addrat(r1, negrat(r2)) end icon-9.4.3/ipl/procs/ftype.icn0000664000175000017500000000144607140713037015546 0ustar chrishchrish############################################################################ # # File: ftype.icn # # Subject: Procedure to produce type for file # # Author: Ralph E. Griswold # # Date: March 10, 1998 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # This procedure returns the file identification produced by file(1). # ############################################################################ # # Requires: UNIX # ############################################################################ procedure ftype(file) read(open("file " || file, "p")) ? { tab(upto('\t')) tab(many('\t')) return tab(0) } end icon-9.4.3/ipl/procs/capture.icn0000664000175000017500000001510007450115326016053 0ustar chrishchrish############################################################################# # # File: capture.icn # # Subject: Procedures to echo output to a second file # # Author: David A. Gamey # # Date: March 25, 2002 # ############################################################################# # # This file is in the public domain. # ############################################################################# # # Version: 1.0 # ############################################################################# # # Capture is initially called by the user with one argument, the open file # to contain the echoed output. Then it places itself and several shadow # procedures between all calls to write, writes & stop. The user never # need call capture again. # # Subsequently, during calls to write, writes, and stop, the appropriate # shadow procedure gains control and calls capture internally. Capture # then constructs a list of only those elements that direct output to # &output and calls the original builtin function via the saved name. # Upon return the shadow routine calls the the original builtin function # with the full list. # # A series of uncaptured output functions have been added to allow output # to be directed only to &output. These are handy for placing progress # messages and other comforting information on the screen. # # Example: # # otherfile := open(...,"w") # # capfile := capture(open(filename,"w")) # # write("Hello there.",var1,var2," - this should be echoed", # otherfile,"This should appear once in the other file only") # # uncaptured_writes("This will appear once only.") # # every i := 1 to 10000 do # if ( i % 100 ) = 0 then # # uncaptured_writes("Progress is ",i,"\r") # # close(capfile) # close(otherfile) # ############################################################################# # # Notes: # # 1. stop must be handled specially in its shadow function # 2. capture is not designed to be turned off # 3. This may be most useful in systems other than Unix # (i.e. that don't have a "tee" command) # 4. Display has not been captured because # a) display is usually a debugging aid, and capture was # originally intended to capture screen output to a file # where a record or audit trail might be required # b) the display output would be 'down a level' showing the # locals at the display_capture_ level, although the depth # argument could easily be incremented to adjust for this # c) write, writes, and stop handle arguments the same way # 5. An alternative to having two calls would be to have capture # call the desired procedure with : # push(&output,x) ; return p!(y ||| x ) # While this would remove the complexity with stop it would # probably be slower # ############################################################################# # # History: # # 10Jun94 - D.Gamey - added uncaptured i/o routines # 05Oct94 - D.Gamey - temporarily suspend tracing # 20Oct94 - D.Gamey - fix no output for f(&null) # - eliminated global variable and select procedure # ############################################################################# procedure capture(p,x) local keepxi # used in list copy to keep/discard arguments local xi # equivalent to x[i] local y # list to hold what needs be echoed static f # alternate file to echo to case type(p) of { "procedure" : { # Internal use, support for (write|writes|stop)_capture_ procedures runerr(/f & 500) # ensure capture(f) called first keepxi := 1 # default is to keep elements y := [] # list for captured elements every xi := !x do { if xi === &output then keepxi := 1 # copying arguments after &output else if type(xi) == "file" then keepxi := &null # ignore arguments after non-&output else if \keepxi then # if copying ... put(y,xi) # append data element from x to y } if ( *y > 0 ) | ( *x = 0 ) then { push(y,f) # target output to second file return 1( p!y, y := &null ) # write it & trash list } } "null" : { # Internal use, succeeds if capture is active, fails otherwise if /f then fail else return } "file" : { # This case is called externally to establish the capture # and switch places with the regular routines. # Normally this is called only once, however # it can be called subsequently to switch the capture file if /f then # swap procedures first time only { write :=: write_capture_ writes :=: writes_capture_ stop :=: stop_capture_ } return f := p # save file for future use } } end #subtitle Support procedures to intercept write, writes, and stop # these procedures get capture to echo text destined for &output # then call the original routine. procedure write_capture_(x[]) local tr tr := &trace ; &trace := 0 # suspend tracing capture(write_capture_,x) return 1( write_capture_!x, &trace := tr ) end procedure writes_capture_(x[]) local tr tr := &trace ; &trace := 0 # suspend tracing capture(writes_capture_,x) return 1( writes_capture_!x, &trace := tr ) end procedure stop_capture_(x[]) local tr tr := &trace ; &trace := 0 # suspend tracing capture(write_capture_,x) # write, otherwise we stop too soon return 1( stop_capture_!x, &trace := tr ) # restore trace just in case 'stop' is changed end #subtitle Support procedures to provide uncaptured output procedure uncaptured_write(x[]) local tr tr := &trace ; &trace := 0 # suspend tracing return 1( ((capture() & write_capture_) | write)!x, &trace := tr ) end procedure uncaptured_writes(x[]) local tr tr := &trace ; &trace := 0 # suspend tracing return 1( ((capture() & writes_capture_) | writes)!x, &trace := tr ) end procedure uncaptured_stop(x[]) local tr tr := &trace ; &trace := 0 # suspend tracing return 1( ((capture() & stop_capture_) | stop)!x, &trace := tr ) # j.i.c. end icon-9.4.3/ipl/procs/dijkstra.icn0000664000175000017500000001412107765412374016241 0ustar chrishchrish############################################################################ # # File: dijkstra.icn # # Subject: Procedures for Dijkstra's "Discipline" control structures # # Author: Frank J. Lhota # # Date: December 9, 2003 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # The procedures do_od and if_fi implement the "do ... od" and "if ... fi" # control structures used in the book "A Discipline of Programming" by # Edsger W. Dijkstra. This book uses a programming language designed to # delay implementation details, such as the order in which tests are # performed. # # Dijkstra's programming language uses two non-ASCII characters, a box and # a right arrow. In the following discussion, the box and right arrow # characters are represented as "[]" and "->" respectively. # # The "if ... fi" control structure is similar to multi-branch "if" statements # found in many languages, including the Bourne shell (i.e. the # "if / elif / fi" construct). The major difference is that in Dijkstra's # notation, there is no specified order in which the "if / elif" tests are # performed. The "if ... fi" structure has the form # # if # Guard1 -> List1 # [] Guard2 -> List2 # [] Guard3 -> List3 # ... # [] GuardN -> ListN # fi # # where # # Guard1, Guard2, Guard3 ... GuardN are boolean expressions, and # List1, List2, List3 ... ListN are lists of statements. # # When this "if ... fi" statement is performed, the guard expressions are # evaluated, in some order not specified by the language, until one of the # guard expressions evaluates to true. Once a true guard is found, the list # of statements following the guard is evaluated. It is a fatal error # for none of the guards in an "if ... fi" statement to be true. # # The "do ... od" control is a "while" loop structure, but with multiple # loop conditions, in style similar to "if ... fi". The form of a Dijkstra # "do" statement is # # do # Guard1 -> List1 # [] Guard2 -> List2 # [] Guard3 -> List3 # ... # [] GuardN -> ListN # od # # where # # Guard1, Guard2, Guard3 ... GuardN are boolean expressions, and # List1, List2, List3 ... ListN are lists of statements. # # To perform this "do ... od" statement, the guard expressions are # evaluated, in some order not specified by the language, until either a # guard evaluates to true, or all guards have been evaluated as false. # # - If all the guards are false, we exit the loop. # - If a guard evaluates to true, then the list of statements following this # guard is performed, and then we loop back to perform this "do ... od" # statement again. # # The procedures if_fi{} and do_od{} implement Dijkstra's "if ... fi" and # "do ... od" control structures respectively. In keeping with Icon # conventions, the guard expressions are arbitrary Icon expressions. A guard # is considered to be true precisely when it succeeds. Similarly, a statement # list can be represented by a single Icon expression. The Icon call # # if_fi{ # Guard1, List1, # Guard2, List2, # ... # GuardN, ListN # } # # suspends with each result produced by the expression following the true # guard. If none of the guards succeed, runerr() is called with an appropriate # message. # # Similarly, the Icon call # # do_od{ # Guard1, List1, # Guard2, List2, # ... # GuardN, ListN # } # # parallels the "do ... od" statement. As long as at least one guard # succeeds, another iteration is performed. When all guards fail, we exit # the loop and do_od fails. # # The test section of this file includes a guarded command implementation of # Euclid's algorithm for calculating the greatest common denominator. Unlike # most implementations of Euclid's algorithm, this version handles its # parameters in a completely symmetrical fashion. # ############################################################################ # # Links: none # ############################################################################ ############################################################################ # # Produces a set of the indices of all the guard expressions in exp. # ############################################################################ procedure __Dijkstra_guard_index_set(exp) local result result := set() every insert(result, 1 to *exp by 2) return result end # __Dijkstra_guard_index_set ############################################################################ procedure do_od(exp) #: Dijkstra's do_od construct local all_guards, curr_guard all_guards := __Dijkstra_guard_index_set(exp) # Remember to use refreshed co-expressions so that they can be evaluated # more than once! while @^exp[ curr_guard := !all_guards ] do @^exp[ curr_guard + 1 ] end # do_od ############################################################################ procedure if_fi(exp) #: Dijkstra's if_fi construct local all_guards, curr_guard all_guards := __Dijkstra_guard_index_set(exp) if @exp[ curr_guard := !all_guards ] then suspend | @exp[ curr_guard + 1 ] else runerr(500, "if_fi: no guards succeeded") end # if_fi $ifdef TEST ############################################################################ # # Dijkstra version of the familiar Euclidean algorithm for gcd. # ############################################################################ procedure gcd(x, y) # Use static variables so that co-expressions can share them static lx, ly lx := abs(x) ly := abs(y) do_od{ lx >= ly > 0, lx %:= ly, ly >= lx > 0, ly %:= lx } return if_fi{ lx = 0, ly, ly = 0, lx } end # gcd procedure main(arg) local a, b a := integer(arg[1]) | 1836311903 b := integer(arg[2]) | 1134903170 return write("gcd(", a, ",", b,")=",gcd(a, b)) end # main $endif icon-9.4.3/ipl/procs/step.icn0000664000175000017500000000263707140713037015375 0ustar chrishchrish############################################################################ # # File: step.icn # # Subject: Procedure to generate in real increments # # Author: Ralph E. Griswold # # Date: April 6, 1993 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # step(r1, r2, r3) generates real values from r1 to r2 in increments of # r3 (default 1.0). It is the real equivalent of i to j by k. # If r2 is null, the sequence is infinite and is the real equivalent # of seq(). # # Beware the usual problems of floating-point precision. # ############################################################################ procedure step(r1, r2, r3) r1 := real(r1) | stop("*** invalid argument to step()") \r2 := real(r2) | stop("*** invalid argument to step()") /r3 := 1.0 (r3 := real(r3)) ~= 0.0 | stop("*** invalid argument to step()") r2 +:= 1E-6 # stab at avoiding underrun if \r2 then { # bounded sequence if r3 > 0.0 then { while r1 <= r2 do { suspend r1 r1 +:= r3 } } else { while r1 >= r2 do { suspend r1 r1 +:= r3 } } } else { # bounded sequence repeat { suspend r1 r1 +:= r3 } } end icon-9.4.3/ipl/procs/list2tab.icn0000664000175000017500000000156507140713037016145 0ustar chrishchrish############################################################################ # # File: list2tab.icn # # Subject: Procedure to write list as tab-separated string # # Author: Ralph E. Griswold # # Date: May 21, 1992 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # This procedure writes a list as a tab-separated string. # Carriage returns in files are converted to vertical tabs. # ############################################################################ # # See also: tab2list.icn, tab2rec.icn, rec2tab.icn # ############################################################################ procedure list2tab(L) every writes(map(L[1 to *L - 1], "\n", "\v"),"\t") write(map(L[-1], "\n", "\v")) return end icon-9.4.3/ipl/procs/readcpt.icn0000664000175000017500000000260007140713040016024 0ustar chrishchrish############################################################################ # # File: readcpt.icn # # Subject: Procedure to read produce "carpet" from file # # Author: Ralph E. Griswold # # Date: August 7, 1997 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # This procedure reads a "carpet" file and returns a corresponding matrix. # ############################################################################ # # Links: matrix # ############################################################################ # # See also: writecpt.icn # ############################################################################ link matrix procedure read_cpt(input) #: convert numerical carpet to matrix local carpet, width, height, i, j, line read(input) ? { ="width=" & width := integer(tab(many(&digits))) & =" height=" & height := integer(tab(many(&digits))) } | stop("*** invalid carpet file") carpet := create_matrix(height, width) every j := 1 to height do { line := read(input) | stop("*** short carpet data") i := 0 line ? { while carpet[j, i +:= 1] := tab(upto(' ')) do move(1) | stop("*** narrow carpet data") } } return carpet end icon-9.4.3/ipl/procs/sets.icn0000664000175000017500000000544207140717301015373 0ustar chrishchrish############################################################################ # # File: sets.icn # # Subject: Procedures for set manipulation # # Author: Alan Beale # # Date: August 7, 1999 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # Contributor: Ralph E. Griswold # ############################################################################ # # cset2set(c) returns a set that contains the individual # characters in cset c. # # domain(T) returns the domain of the function defined by the # table T. # # inverse(T, x) returns the inverse of the function defined by the # table T. If x is null, it's the functional inverse. # If x is an empty list, it's the relational inverse. # If x is an empty set, it the relational inverse, but # with each table member as a set instead of a list. # # pairset(T) converts the table T to an equivalent set of ordered # pairs. # # range(T) returns the range of the function defined by the # table T. # # seteq(S1, S2) tests equivalence of sets S1 and S2. # # setlt(S1, S2) tests inclusion of set S1 in S2. # # simage(S) string image of set # ############################################################################ procedure cset2set(cs) #: set of characters local result result := set() every insert(result, !cs) return result end procedure pairset(T) #: set of table pairs return set(sort(T)) end procedure domain(T) #: domain of table local dom dom := set() every insert(dom, key(T)) return dom end procedure range(T) #: range of table local ran ran := set() every insert(ran, !T) return ran end procedure inverse(T, Default) #: inverse of table function local inv, delem, relem inv := table(Default) every delem := key(T) do { if type(Default) == "list" then if member(inv, relem := T[delem]) then put(inv[relem], delem) else inv[relem] := [delem] else if type(Default) == "set" then if member(inv, relem := T[delem]) then insert(inv[relem], delem) else inv[relem] := set([delem]) else inv[T[delem]] := delem } return inv end procedure seteq(set1, set2) #: set equivalence local x if *set1 ~= *set2 then fail every x := !set1 do if not member(set2, x) then fail return set2 end procedure setlt(set1, set2) #: set inclusion local x if *set1 >= *set2 then fail every x := !set1 do if not member(set2, x) then fail return set2 end procedure simage(set) #: string image of set local result result := "" every result ||:= image(!set) || ", " return "{ " || result[1:-2] || " }" end icon-9.4.3/ipl/procs/inbits.icn0000664000175000017500000000261607140713036015706 0ustar chrishchrish############################################################################ # # File: inbits.icn # # Subject: Procedure to read variable-length characters # # Author: Richard L. Goerwitz # # Date: November 3, 1991 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # Version: 1.2 # ############################################################################ # # This procedure, inbits(), re-imports data converted into writable # form by outbits(). See the file outbits.icn for all the whys and # hows. # ############################################################################ # # See also: outbits.icn # ############################################################################ procedure inbits(f, len) local i, byte, old_byte_mask static old_byte, old_len, byte_length initial { old_byte := old_len := 0 byte_length := 8 } old_byte_mask := (0 < 2^old_len - 1) | 0 old_byte := iand(old_byte, old_byte_mask) i := ishift(old_byte, len-old_len) len -:= (len > old_len) | { old_len -:= len return i } while byte := ord(reads(f)) do { i := ior(i, ishift(byte, len-byte_length)) len -:= (len > byte_length) | { old_len := byte_length-len old_byte := byte return i } } end icon-9.4.3/ipl/procs/evallist.icn0000664000175000017500000000255507140713040016236 0ustar chrishchrish############################################################################ # # File: evallist.icn # # Subject: Procedure to produce a list generated by expression # # Author: Ralph E. Griswold # # Date: July 15, 1995 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # This procedure takes an expression, produces a program encapsulating it, # and puts the results written by the program in a list. # # It is called as evallist(expr, n, ucode, ...) where expr is an expression # (normally a generator), n is the maximum size of the list, and the # trailing arguments are ucode files to link with the expression. # ############################################################################ # # Requires: system(), /tmp, pipes # ############################################################################ # # Links: exprfile # ############################################################################ link exprfile procedure evallist(expr, n, ucode[]) #: list of values generated by Icon expression local input, result push(ucode, expr) # put expression first input := exprfile ! ucode | fail result := [] every put(result, !input) \ n exprfile() # clean up return result end icon-9.4.3/ipl/procs/kmap.icn0000664000175000017500000000205407140713040015335 0ustar chrishchrish############################################################################ # # File: kmap.icn # # Subject: Procedure to map keyboard letter forms into letters # # Author: Ralph E. Griswold # # Date: July 15, 1995 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # This procedure maps uppercase letters and the control modifier key # in combination with letters into the corresponding lowercase letters. # # It is intended for use with graphic applications in which the modifier # keys for shift and control are encoded in keyboard events. # ############################################################################ procedure kmap(s) #: map letter with modifier key to lowercase static in, out initial { in := "\^A\^B\^C\^D\^E\^F\^G\^H\^I\^J\^K\^L\^M\^N\^O\^P_ \^Q\^R\^S\^T\^U\^V\^W\^X\^Y\^Z" || &ucase out := &lcase || &lcase } return map(s, in, out) end icon-9.4.3/ipl/procs/wrap.icn0000664000175000017500000000645107140713037015371 0ustar chrishchrish############################################################################ # # File: wrap.icn # # Subject: Procedures to wrap output lines # # Author: Robert J. Alexander # # Date: December 5, 1989 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # wrap(s,i) -- Facilitates accumulation of small strings into longer # output strings, outputting when the accumulated string would # exceed a specified length (e.g. outputting items in multiple # columns). # # s -- string to accumulate # i -- width of desired output string # # Wrap fails if the string s did not necessitate output of the buffered # output string; otherwise the output string is returned (which never # includes s). # # s defaults to the empty string (""), causing nothing to be # accumulated; i defaults to 0, forcing output of any buffered string. # Note that calling wrap() with no arguments produces the buffer (if it # is not empty) and clears it. # # Wrap does no output to files. # # # Here's how wrap is normally used: # # wrap() # Initialize (not really necessary unless # # a previous use might have left stuff in # # the buffer). # # every i := 1 to 100 do # Loop to process strings to output -- # write(wrap(x[i],80)) # only writes when 80-char line filled. # # write(wrap()) # Output what's in buffer -- only outputs # # if something to write. # # # wraps(s,i) -- Facilitates managing output of numerous small strings # so that they do not exceed a reasonable line length (e.g. # outputting items in multiple columns). # # s -- string to accumulate # i -- maximum width of desired output string # # If the string "s" did not necessitate a line-wrap, the string "s" is # returned. If a line-wrap is needed, "s", preceded by a new-line # character ("\n"), is returned. # # "s" defaults to the empty string (""), causing nothing to be # accumulated; i defaults to 0, forcing a new line if anything had been # output on the current line. Thus calling wraps() with no arguments # reinitializes it. # # Wraps does no output to files. # # # Here's how wraps is normally used: # # wraps() # Initialize (not really necessary unless # # a previous use might have left it in an # # unknown condition). # # every i := 1 to 100 do # Loop to process strings to output -- # writes(wraps(x[i],80))# only wraps when 80-char line filled. # # writes(wraps()) # Only outputs "\n" if something written # # on last line. # ############################################################################ procedure wrap(s,i) local t static line initial line := "" /s := "" ; /i := 0 if *(t := line || s) > i then return "" ~== (s :=: line) line := t end procedure wraps(s,i) local t static size initial size := 0 /s := "" ; /i := 0 t := size + *s if t > i & size > 0 then { size := *s return "\n" || s } size := t return s end icon-9.4.3/ipl/procs/hexcvt.icn0000664000175000017500000000303007140713036015706 0ustar chrishchrish############################################################################ # # File: hexcvt.icn # # Subject: Procedures for hexadecimal conversion # # Author: Robert J. Alexander # # Date: June 7, 1994 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # hex(s) -- Converts string of hex digits into an integer. # # hexstring(i,n,lc) -- Returns a string that is the hexadecimal # representation of the argument. If n is supplied, a minimum # of n digits appear in the result; otherwise there is no minimum, # and negative values are indicated by a minus sign. If lc is # non-null, lowercase characters are used instead of uppercase. # ############################################################################ procedure hex(s) local a,c a := 0 every c := !map(s) do a := ior(find(c,"0123456789abcdef") - 1,ishift(a,4)) | fail return a end procedure hexstring(i,n,lowercase) local s,hexchars,sign i := integer(i) | runerr(101,i) sign := "" if i = 0 then s := "0" else { if /n & i < 0 then { sign := "-" i := -i } hexchars := if \lowercase then "0123456789abcdef" else "0123456789ABCDEF" s := "" until i = (0 | -1) do { s := hexchars[iand(i,15) + 1] || s i := ishift(i,-4) } } if \n > *s then s := right(s,n,if i >= 0 then "0" else hexchars[16]) return sign || s end icon-9.4.3/ipl/procs/labeler.icn0000664000175000017500000000253407140713037016024 0ustar chrishchrish############################################################################ # # File: labeler.icn # # Subject: Procedure to produce successive labels # # Author: Gregg M. Townsend # # Date: April 9, 1993 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # This procedure produces a new label in sequence each time it's called. # The labels consist of all possible combinations of the characters given # in the argument the first time it is called. See star(s) in gener.icn # for a generator that does the same thing (and much more concisely). # ############################################################################ # # Increment a counter and convert to a label. procedure label(chars) static s, abet local i initial { abet := string(chars) # initialize alphabet s := abet[1] # initialize string return s } i := *s # start with last `digit' while s[i] == abet[*abet] do { # while need to `carry' s[i] := abet[1] # reset digit i -:= 1 # move left one digit if i = 0 then # if no more digits return s := abet[1] || s # lengthen string } s[i] := abet[find(s[i],abet)+1] # normal case: incr one digit return s end icon-9.4.3/ipl/procs/permutat.icn0000664000175000017500000000315107310767020016253 0ustar chrishchrish############################################################################ # # File: permutat.icn # # Subject: Procedures for permutations # # Author: Ralph E. Griswold # # Date: June 10, 2001 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # Links: lists, seqops # ############################################################################ link lists link seqops procedure multireduce(i, j) #: multi-reduction permutation local indexes, result, parts /j := 2 indexes := [] every put(indexes, 1 to j) parts := ldecollate(indexes, srun(1, i)) result := [] every result |||:= !parts return result end procedure permperiod(p) #: period of permutation local lengths lengths := [] every put(lengths, *!cycles(p)) return lcml ! lengths end procedure cycles(p) #: permutation cycles local indices, cycle, cycles, i cycles := [] # list of cycles indices := set() every insert(indices, 1 to *p) repeat { i := !indices | break delete(indices, i) cycle := set() insert(cycle, i) repeat { i := integer(p[i]) delete(indices, i) if member(cycle, i) then break # done with cycle else insert(cycle, i) # new member of cycle } put(cycles, sort(cycle)) } return cycles end procedure mutate(seq, mutation) #: mutate sequence local result result := [] every put(result, seq[!mutation]) return result end icon-9.4.3/ipl/procs/zipread.icn0000664000175000017500000000425207140717301016051 0ustar chrishchrish############################################################################ # # File: zipread.icn # # Subject: Procedures for reading files from ZIP archives # # Author: Gregg M. Townsend # # Date: March 5, 2000 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # These Unix procedures read files from ZIP format archives by # opening pipes to the "unzip" utility. It is assumed that # "unzip" is in the shell search path. # # iszip(zname) succeeds if zname is a ZIP archive. # zipdir(zname) opens a ZIP archive directory. # zipfile(zname, fname) opens a member of a ZIP archive. # ############################################################################ # # iszip(zname) succeeds if the named file appears to be # a ZIP format archive file. # ############################################################################ # # zipdir(zname) returns a pipe from which the members of the # ZIP archive can be read, one per line, as if reading a # directory. It is assumed that zname is a ZIP archive. # ############################################################################ # # zipfile(zname, fname) returns a pipe from which the # file fname within the ZIP archive zname can be read. # It is assumed that zname and fname are valid. # ############################################################################ # # Requires: UNIX with "unzip" utility. # ############################################################################ # iszip(zname) -- succeed if zname is a ZIP archive file procedure iszip(fname) #: check for ZIP archive local f, s f := open(fname, "ru") | fail s := reads(f, 4) close(f) return s === "PK\03\04" end # zipdir(zname) -- returns a file representing the ZIP directory procedure zipdir(zname) #: open ZIP directory return open("unzip -l " || zname || " | sed -n 's/.*:.. //p'", "rp") end # zipfile(zname, fname) -- open file fname inside archive zname procedure zipfile(zname, fname) #: open member of ZIP archive return open("unzip -p " || zname || " " || fname, "rp") end icon-9.4.3/ipl/procs/varsub.icn0000664000175000017500000000452507140713037015722 0ustar chrishchrish############################################################################ # # File: varsub.icn # # Subject: Procedure to perform UNIX-shell-style substitution # # Author: Robert J. Alexander # # Date: November 2, 1995 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # Variable values are obtained from the supplied procedure, "varProc", # which returns the value of its variable-name argument or fails if # there is no such variable. "varProc" defaults to the procedure, # "getenv". # # As with the UNIX Bourne shell and C shell, variable names are # preceded by $. Optionally, the variable name can additionally be # surrounded by curly braces {}, which is usually done when necessary # to isolate the variable name from surrounding text. # # As with the C-shell, the special symbol ~ is handled. # Username can be omitted, in which case the value of the variable # "HOME" is substituted. If username is supplied, the /etc/passwd file # is searched to supply the home directory of username (this action is # obviously not portable to non-UNIX environments). # ############################################################################ procedure varsub(s,varProc) local var,p,user,pw,i,c,line static nameChar initial nameChar := &letters ++ &digits ++ "_" /varProc := getenv s ? { s := "" while s ||:= tab(upto('$~')) do { p := &pos s ||:= case move(1) of { "$": { if c := tab(any('{(')) then var := tab(find(map(c,"{(","})"))) & move(1) else var := tab(many(nameChar)) | "" "" ~== varProc(\var) | &subject[p:&pos] } "~": { if user := tab(many(nameChar)) || ":" then { if pw := open("/etc/passwd") then { (while line := read(pw) do if match(user,line) then break) | (line := &null) close(pw) if \line then { every i := find(":",line)\5 i +:= 1 line[i:find(":",line,i)] } else &subject[p:&pos] } else &subject[p:&pos] } else getenv("HOME") } } } s ||:= tab(0) } return s end icon-9.4.3/ipl/procs/graphpak.icn0000664000175000017500000000576007274062401016217 0ustar chrishchrish############################################################################ # # File: graphpak.icn # # Subject: Procedures for manipulating directed graphs # # Author: Ralph E. Griswold # # Date: May 2, 2001 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # The procedures here use sets to represent directed graphs. See # The Icon Programming Language, second edition, pp. 195-198. # # A value of type "graph" has two components: a list of nodes and # a two-way lookup table. The nodes in turn contain pointers to # other nodes. The two-way table maps a node to its name and # vice-versa. # # Graph specifications are give in files in which the first line # is a white-space separated list of node names and subsequent lines # give the arcs, as in # # Tucson Phoenix Bisbee Douglas Flagstaff # Tucson->Phoenix # Tucson->Bisbee # Bisbee->Bisbee # Bisbee->Douglas # Douglas->Phoenix # Douglas->Tucson # ############################################################################ record graph(nodes, lookup) # Construct a graph from the specification given in file f. Error checking # is minimal. procedure read_graph(f) #: read graph local node, nodes, node_list, lookup, arc, from_name, to_name nodes := [] # list of the graph nodes lookup := table() # two-way table of names and nodes node_list := read(f) | stop("*** empty specification file") node_list ? { # process list of node names while name := tab(upto('\t ') | 0) do { node := set() # create a new node put(nodes, node) # add node to the list lookup[name] := node # name to node lookup[node] := name # node to name tab(many(' \t')) | break } } while arc := read(f) do { # process arcs arc ? { from_name := tab(find("->")) | stop("*** bad arc specification") move(2) to_name := tab(0) insert(\lookup[from_name], \lookup[to_name]) | stop("*** non-existent node") } } return graph(nodes, lookup) # now put the pieces together end # Write graph g to file f. procedure write_graph(g, f) #: write graph local name_list, node name_list := "" # initialize every node := !g.nodes do # construct the list of names name_list ||:= g.lookup[node] || " " write(f, name_list[1:-1]) every node := !g.nodes do # write the arc specifications every write(f, g.lookup[node], "->", g.lookup[!node]) return end # Transitive closure of node. Called as closure(node) without second argument procedure closure(node, close) #: transitive closure of graph local n /close := set() # initialize closure insert(close, node) # add the node itself every n := !node do # process all the arcs # if not member, recurse member(close, n) | closure(n, close) return close end icon-9.4.3/ipl/procs/procname.icn0000664000175000017500000000312507274076347016235 0ustar chrishchrish############################################################################ # # File: procname.icn # # Subject: Procedure to produce name of procedure # # Author: Ralph E. Griswold # # Date: May 2, 2001 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # procname(p, x) produces the name of a procedure from a procedure value. # Here, the term "procedure" includes functions, operators, and # record constructors. # # If x is null, the result is derived from image() is a relatively # straightforward way. In the case of operators, the number of # arguments is appended to the operator symbol. # # If x is nonnull, the result is put in a form that resembles an Icon # expression. # # procname() fails if p is not of type procedure. # ############################################################################ procedure procname(p, x) local result image(p) ? { =("function " | "procedure " | "record constructor ") if /x then return if any(&letters) then tab(0) else tab(0) || args(p) else result := tab(0) if any(&letters, result) then return result || "()" else return case args(p) of { 0: result 1: result || "e" 2: if result == "[]" then "e1[e2]" else "e1 " || result || " e2" 3: case result of { "...": "e1 to e2 by e3" "[:]": "e1[e2:e3]" default: "<<< ... " || result || "... >>>" } } } end icon-9.4.3/ipl/procs/bold.icn0000664000175000017500000000304107450115326015331 0ustar chrishchrish############################################################################ # # File: bold.icn # # Subject: Procedures to embolden and underscore text # # Author: Ralph E. Griswold # # Date: March 25, 2002 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # These procedures produce text with interspersed characters suit- # able for printing to produce the effect of boldface (by over- # striking) and underscoring (using backspaces). # # bold(s) bold version of s # # uscore(s) underscored version of s # ############################################################################ procedure bold(s) local c static labels, trans, max initial { labels := "1" trans := repl("1\b",4) || "1" max := *labels trans := bold(string(&lcase)) labels := string(&lcase) max := *labels } if *s <= max then return map(left(trans,9 * *s),left(labels,*s),s) else return bold(left(s,*s - max)) || map(trans,labels,right(s,max)) end procedure uscore(s) static labels, trans, max initial { labels := "1" trans := "_\b1" max := *labels trans := uscore(string(&lcase)) labels := string(&lcase) max := *labels } if *s <= max then return map(left(trans,3 * *s),left(labels,*s),s) else return uscore(left(s,*s - max)) || map(trans,labels,right(s,max)) end icon-9.4.3/ipl/procs/models.icn0000664000175000017500000000461707140713037015705 0ustar chrishchrish############################################################################ # # File: models.icn # # Subject: Procedure to model Icon functions # # Author: Ralph E. Griswold # # Date: May 1, 1993 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # These procedures model built-in Icon functions. Their purpose is # primarily pedagogical. # # See Icon Analyst 11, pp. 5-7. # ############################################################################ procedure tab(i) suspend .&subject[.&pos : &pos <- i] end procedure upto(c, s, i, j) local k if /s := &subject then { # handle defaults /i := &pos } else { s := string(s) | runerr(103, s) /i := 1 } i := integer(i) | runerr(101, i) i := cvpos(i, s) | fail if not(/j := *s + 1) then { j := integer(j) | runerr(101, j) j := cvpos(j, s) | fail if i > j then i :=: j } every k := i to j do if !c == s[k] then suspend k # perform the actual mapping # The following is faster, but not as clear. # # every k := i to j do # if any(c, s[k]) then suspend k fail end procedure map(s1, s2, s3) local i, result static last_s2, last_s3, map_array initial map_array := list(256) s1 := string(s1) | runerr(103, s1) # check types s2 := def_str(s2, string(&ucase)) | runerr(103, s2) # default null values s3 := def_str(s3, string(&lcase)) | runerr(103, s3) if *s2 ~= *s3 then runerr(208) # See if mapping array needs to be rebuilt if (s2 ~=== last_s2) | (s3 ~=== last_s3) then { last_s2 := s2 last_s3 := s3 every i := 1 to 256 do map_array[i] := char(i - 1) every i := 1 to *s2 do map_array[ord(s2[i]) + 1] := s3[i] } result := "" # every result ||:= map_array[ord(!s1) + 1] # do actual mapping every i := 1 to *s1 do # do actual mapping result ||:= map_array[ord(s1[i]) + 1] return result end # Support procedures # Produce the positive equivalent of i with respect to s. procedure cvpos(i, s) if i <= 0 then i +:= *s + 1 if i <= i <= *s + 1 then return i else fail end # Default the null value to a specified string. procedure def_str(s1, s2) if /s1 then return s2 else return string(s1) # may fail end icon-9.4.3/ipl/procs/polyseq.icn0000664000175000017500000000266107424067417016124 0ustar chrishchrish############################################################################ # # File: polyseq.icn # # Subject: Procedure to generate Dietz sequence # # Author: Ralph E. Griswold # # Date: September 19, 2001 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # The procedure poly2seq(str) generates the Dietz sequence for the # polynomial str. See Ada Dietz, "Algebraic Expressions in Handweaving". # ############################################################################ # # Links: polynom, strings # ############################################################################ link polynom link strings procedure poly2seq(str) local vars str := deletec(str, ' ') # delete blanks vars := &letters ** cset(str) suspend !map(poly2profile(eval(str)), vars, &digits[2+:*vars]) end procedure eval(str) while str ?:= 2(="(", tab(bal(')')), =")", pos(0)) return oper(str) | str2poly(str) end procedure oper(str) return str ? form(tab(bal('-+*^%')), move(1), tab(0)) end procedure form(str1, op, str2) return case op of { "+" : polyadd(eval(str1), eval(str2)) "-" : polysub(eval(str1), eval(str2)) "*" : polymul(eval(str1), eval(str2)) "^" : polyexp(eval(str1), str2) "%" : polymod(eval(str1), str2) } end icon-9.4.3/ipl/procs/xrotate.icn0000664000175000017500000000152507140713037016103 0ustar chrishchrish############################################################################ # # File: xrotate.icn # # Subject: Procedure to rotate values in list or record # # Author: Ralph E. Griswold # # Date: April 30, 1993 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # xrotate(X, i) rotates the values in X right by one position. It works # for lists and records. # # This procedure is mainly interesting as a recursive version of # # x1 :=: x2 :=: x3 :=: ... xn # # since a better method for lists is # # push(L, pull(L)) # ############################################################################ procedure xrotate(X, i) /i := 1 X[i] :=: xrotate(X, i + 1) return X[i] end icon-9.4.3/ipl/procs/printf.icn0000664000175000017500000001767310267544316015740 0ustar chrishchrish############################################################################ # # File: printf.icn # # Subject: Procedures for printf-style formatting # # Author: William H. Mitchell # # Date: July 20, 2005 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # Contributors: Cheyenne Wills, Phillip Lee Thomas, Michael Glass # ############################################################################ # # This procedure behaves somewhat like the standard printf. # Supports d, e, s, o, and x formats like printf. An "r" format # prints real numbers in a manner similar to that of printf's "f", # but will produce a result in an exponential format if the number # is larger than the largest integer plus one. Though "e" differs # from printf in some details, it always produces exponential format. # # Left or right justification and field width control are pro- # vided as in printf. %s, %r, and %e handle precision specifications. # # The %r format is quite a bit of a hack, but it meets the # author's requirements for accuracy and speed. Code contributions # for %f, %e, and %g formats that work like printf are welcome. # # Possible new formats: # # %t -- print a real number as a time in hh:mm # %R -- roman numerals # %w -- integers in English # %b -- binary # ############################################################################ procedure sprintf(format, args[]) return _doprnt(format, args) end procedure fprintf(file, format, args[]) writes(file, _doprnt(format, args)) return end procedure printf(format, args[]) writes(&output, _doprnt(format, args)) return end procedure _doprnt(format, args) local out, v, just, width, conv, prec, pad out := "" format ? repeat { (out ||:= tab(upto('%'))) | (out ||:= tab(0) & break) v := get(args) move(1) just := right width := conv := prec := pad := &null ="-" & just := left width := tab(many(&digits)) (\width)[1] == "0" & pad := "0" ="." & prec := tab(many(&digits)) conv := move(1) ##write("just: ",image(just),", width: ", width, ", prec: ", ## prec, ", conv: ", conv) case conv of { "d": { v := string(integer(v)) } "s": { v := string(v[1:(\prec+1)|0]) } "x": v := hexstr(v) "o": v := octstr(v) "i": v := image(v) "r": v := fixnum(v,prec) "e": v := eformatstr(v, prec, width) default: { push(args, v) v := conv } } if \width & *v < width then { v := just(v, width, pad) } out ||:= v } return out end procedure hexstr(n) local h, neg static BigNeg, hexdigs, hexfix initial { BigNeg := -2147483647-1 hexdigs := "0123456789abcdef" hexfix := "89abcdef" } n := integer(n) if n = BigNeg then return "80000000" h := "" if n < 0 then { n := -(BigNeg - n) neg := 1 } repeat { h := hexdigs[n%16+1]||h if (n /:= 16) = 0 then break } if \neg then { h := right(h,8,"0") h[1] := hexfix[h[1]+1] } return h end procedure octstr(n) local h, neg static BigNeg, octdigs, octfix initial { BigNeg := -2147483647-1 octdigs := "01234567" octfix := "23" } n := integer(n) if n = BigNeg then return "20000000000" h := "" if n < 0 then { n := -(BigNeg - n) neg := 1 } repeat { h := octdigs[n%8+1]||h if (n /:= 8) = 0 then break } if \neg then { h := right(h,11,"0") h[1] := octfix[h[1]+1] } return h end procedure fixnum(x, prec) local int, frac, f1, f2, p10 /prec := 6 x := real(x) | return image(x) int := integer(x) | return image(x) frac := image(x - int) if find("e", frac) then { frac ?:= { f1 := tab(upto('.')) & move(1) & f2 := tab(upto('e')) & move(1) & p10 := -integer(tab(0)) & repl("0",p10-1) || f1 || f2 } } else frac ?:= (tab(upto('.')) & move(1) & tab(0)) frac := adjustfracprec(frac, prec) int +:= if int >= 0 then frac[2] else -frac[2] return int || "." || frac[1] end # e-format: [-]m.dddddde(+|-)xx # # Differs from C and Fortran E formats primarily in the # details, among them: # # - Single-digit exponents are not padded out to two digits. # # - The precision (number of digits after the decimal point) # is reduced if needed to make the number fit in the available # width, if possible. The precision is never reduced-to-fit # below 1 digit after the decimal point. # procedure eformatstr(x, prec, width) local signpart, wholepart, fracpart, exppart local choppart, shiftcount, toowide local rslt, s /prec := 6 /width := prec + 7 # Separate string representation of x into parts # s := string(real(x)) | return image(x) s ? { signpart := (=("-" | "+") | "") wholepart := 1(tab(many(&digits)), any('.eE')) | return image(x) fracpart := ((=".", tab(many(&digits))) | "") exppart := integer((=("e"|"E"), tab(0)) | 0) } # When the integer part has more than 1 digit, shift it # right into fractional part and scale the exponent # if *wholepart > 1 then { exppart +:= *wholepart -1 fracpart := wholepart[2:0] || fracpart wholepart := wholepart[1] } # If the the number is unnormalized, shift the fraction # left into the whole part and scale the exponent # if wholepart == "0" then { if shiftcount := upto('123456789', fracpart) then { exppart -:= shiftcount wholepart := fracpart[shiftcount] fracpart := fracpart[shiftcount+1:0] } } # Adjust the fractional part to the requested precision. # If the carry causes the whole part to overflow from # 9 to 10 then renormalize. # fracpart := adjustfracprec(fracpart, prec) wholepart +:= fracpart[2] fracpart := fracpart[1] if *wholepart > 1 then { wholepart := wholepart[1] exppart +:= 1 } # Assemble the final result. # - Leading "+" dropped in mantissa # - Leading "+" obligatory in exponent # - Decimal "." included iff fractional part is non-empty # wholepart := (signpart == "-", "-") || wholepart exppart := (exppart > 0, "+") || exppart fracpart := (*fracpart > 0, ".") || fracpart rslt := wholepart || fracpart || "e" || exppart # Return the result. # -- If too short, pad on the left with blanks (not zeros!). # -- If too long try to shrink the precision # -- If shrinking is not possible return a field of stars. # return (*rslt <= width, right(rslt, width)) | (*rslt - width < prec, eformatstr(x, prec + width - *rslt, width)) | repl("*", width) end # Zero-extend or round the fractional part to 'prec' digits. # # Returns a list: # # [ fracpart, carry ] # # where the fracpart has been adjusted to the requested # precision, and the carry (result of possible rounding) # is to be added into the whole number. # procedure adjustfracprec(fracpart, prec) local choppart, carryout # Zero-extend if needed. if *fracpart < prec then return [left(fracpart, prec, "0"), 0] # When the fractional part has more digits than the requested # precision, chop off the extras and round. # carryout := 0 if *fracpart > prec then { choppart := fracpart[prec+1:0] fracpart := fracpart[1+:prec] # If rounding up is needed... # if choppart[1] >>= "5" then { # When the fractional part is .999s or the precision is 0, # then round up overflows into the whole part. # if (prec = 0) | (string(cset(fracpart)) == "9") then { fracpart := left("0", prec, "0") carryout := 1 } # In the usual case, round up simply increments the # fractional part. (We put back any trailing # zeros that got lost.) else { fracpart := left(integer(fracpart)+1, prec, "0") } } } return [fracpart, carryout] end icon-9.4.3/ipl/procs/writecpt.icn0000664000175000017500000000173707140713040016255 0ustar chrishchrish############################################################################ # # File: writecpt.icn # # Subject: Procedure to write a "carpet" file # # Author: Ralph E. Griswold # # Date: August 7, 1997 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # write_cpt(output, carpet) writes the carpet with heading information to # the specified file. # ############################################################################ # # Links: matrix # ############################################################################ link matrix procedure write_cpt(output, carpet) #: convert matrix to numerical carpet local min, max, i, j, width, height width := matrix_width(carpet) height := matrix_height(carpet) write(output, "width=", width, " height=", height) write_matrix(output, carpet) return end icon-9.4.3/ipl/procs/sername.icn0000664000175000017500000000330207140713037016042 0ustar chrishchrish############################################################################ # # File: sername.icn # # Subject: Procedure to produce serialized names # # Author: Ralph E. Griswold # # Date: June 27, 1997 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # sername(p, s, n, i) produces a series of names of the form # ps. If n is given it determines the number of digits in # . If i is given it resets the sequence to start with i. is # an right-adjusted integer padded with zeros. # # Ordinarily, the arguments only are given on the first call. Subsequent # calls without arguments give the next name. # # For example, sername("image", ".gif", 3, 0) produces "image000.gif", # and subsequently, sername() produces "image001.gif", image002.gif", # and so on. # # The defaults, if sername() is first called without any arguments is # as for the call sername("file", 3, 0, ""). # # If any argument changes on subsequent calls, all non-null arguments are # reset. # ############################################################################ procedure sername(p, s, n, i) static prefix, suffix, cols, serial, name, first initial { prefix := "file" suffix := "" cols := 3 serial := 0 first := serial } # See if anything has changed. if not(p === prefix & s === suffix & n === cols & first === i) then { prefix := \p suffix := \s cols := \n first := serial := \i } name := prefix || right(serial, cols, "0") || suffix serial +:= 1 return name end icon-9.4.3/ipl/procs/convert.icn0000664000175000017500000000304407140713037016073 0ustar chrishchrish############################################################################ # # File: convert.icn # # Subject: Procedures for various conversions # # Author: Ralph E. Griswold # # Date: March 19, 1998 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # exbase10(i, j) converts base-10 integer i to base j. # # inbase10(s, i) convert base-i integer s to base 10. # # radcon(s, i, j) convert base-i integer s to base j. # # There are several other procedures related to conversion that are # not yet part of this module. # ############################################################################ procedure exbase10(i, j) #: convert base 10 to arbitrary base local s, d, sign static digits initial digits := &digits || &lcase || &ucase if not(2 <= j <= *digits) then stop("*** base out of range") if i = 0 then return 0 if i < 0 then { sign := "-" i := -i } else sign := "" s := "" while i > 0 do { d := i % j if d > 9 then d := digits[d + 1] s := d || s i /:= j } return sign || s end procedure inbase10(s, i) #: convert arbitrary base to base 10 if i > 36 then stop("*** base too large for inbase10()") if s[1] == "-" then return "-" || integer(i || "r" || s[2:0]) else return integer(i || "r" || s) end procedure radcon(s, i, j) #: convert between bases return exbase10(inbase10(s,i),j) end icon-9.4.3/ipl/procs/itrcline.icn0000664000175000017500000000151707140713037016227 0ustar chrishchrish############################################################################ # # File: itrcline.icn # # Subject: Procedure to filter out non-trace lines # # Author: Ralph E. Griswold # # Date: July 14, 1997 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # itrcline(f) generates lines from the file f that are Icon # trace messages. It can, of course, be fooled. # ############################################################################ procedure itrcline(f) #: generate trace messages in file local line while line := read(f) do line ? { if (=" :" & move(6) & ="main") | (move(12) & ": |") then suspend line } end icon-9.4.3/ipl/procs/lastc.icn0000664000175000017500000000423107450115327015522 0ustar chrishchrish############################################################################# # # File: lastc.icn # # Subject: Procedures for string scanning # # Author: David A. Gamey # # Date: March 25, 2002 # ############################################################################# # # This file is in the public domain. # ############################################################################# # # Descriptions: # # lastc( c, s, i1, i2 ) : i3 # # succeeds and produces i1, provided either # - i1 is 1, or # - s[i1 - 1] is in c and i2 is greater than i1 # # defaults: same as for any # errors: same as for any # # findp( c, s1, s2, i1, i2 ) : i3, i4, ..., in # # generates the sequence of positions in s2 at which s1 occurs # provided that: # - s2 is preceded by a character in c, # or is found at the beginning of the string # i1 & i2 limit the search as in find # # defaults: same as for find # errors: same as for find & lastc # # findw( c1, s1, c2, s2, i1, i2 ) : i3, i4, ..., in # # generates the sequence of positions in s2 at which s1 occurs # provided that: # - s2 is preceded by a character in c1, # or is found at the beginning of the string; # and # - s2 is succeeded by a character in c2, # or the end of the string # i1 & i2 limit the search as in find # # defaults: same as for find # errors: same as for find & lastc # ############################################################################# procedure lastc( c, s, i1, i2 ) if /s := &subject then /i1 := &pos /i1 := 1 /i2 := 0 suspend ( ( i1 = 1 ) | any( c, s, 0 < ( i1 - 1 ), i2 ) ) end procedure findp( c, s1, s2, i1, i2 ) if /s2 := &subject then /i1 := &pos /i1 := 1 /i2 := 0 suspend lastc( c, s2, find( s1, s2, i1, i2 ), i2 ) end procedure findw( c1, s1, c2, s2, i1, i2 ) local csr,csr2 if /s2 := &subject then /i1 := &pos /i1 := 1 /i2 := 0 suspend 1( csr := findp( c1, s1, s2, i1, i2 ), csr2 := csr + *s1, ( csr2 = ( *s2 + 1 ) ) | any( c2, s2, csr2, i2 ) ) end icon-9.4.3/ipl/procs/exprfile.icn0000664000175000017500000000615407140713037016236 0ustar chrishchrish############################################################################ # # File: exprfile.icn # # Subject: Procedures to produce programs on the fly # # Author: Ralph E. Griswold # # Date: August 5, 1997 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # exprfile(exp, link, ...) # produces a pipe to a program that writes all the # results generated by exp. The trailing arguments # name link files needed for the expression. # # exprfile() closes any previous pipe it opened # and deletes its temporary file. Therefore, # exprfile() cannot be used for multiple expression # pipes. # # If the expression fails to compile, the global # expr_error is set to 1; otherwise 0. # # exec_expr(expr_list, links[]) # generates the results of executing the expression # contained in the lists expr_list with the specified # links. # # plst2pstr(L) converts the list of Icon programs lines in L to a # string with separating newlines. # # pstr2plst(s) converts the string of Icon program lines (separated # by newlines) to a list of lines. # # ucode(file) produces a ucode file from the Icon program in file. # ############################################################################ # # Requires: system(), pipes, /tmp # ############################################################################ # # Links: io # ############################################################################ link io global expr_error procedure exprfile(exp, links[]) #: pipe for Icon expression local output static name, input expr_error := &null remove(\name) # remove former executable close(\input) # and close last pipe output := tempfile("expr", ".icn", "/tmp") image(output) ? { ="file(" name := tab(find(".icn")) } write(output, "invocable all") every write(output, "link ", image(!links)) write(output, "procedure main(args)") write(output, " every write(", exp, ")") write(output, "end") close(output) if system("icont -o " || name || " -s " || name || " >/dev/null 2>/dev/null") ~= 0 then { expr_error := 1 remove(name || ".icn") fail } remove(name || ".icn") # remove source code file # Return a pipe for the executable. Error messages are discarded. return input := open(name || " 2>/dev/null", "p") end procedure exec_expr(expr_list, links[]) #: execute expression in lists suspend !(exprfile ! push(links, plst2pstr(expr_list))) end procedure plst2pstr(L) #: convert program list to string local result result := "" every result ||:= !L || "\n" return result end procedure pstr2plst(s) #: convert program string to list local result result := [] s ? { while put(result, tab(upto('\n'))) do move(1) if not pos(0) then put(result, tab(0)) } return result end procedure ucode(file) #: create ucode file if system("icont -s -c " || file) ~= 0 then fail return end icon-9.4.3/ipl/procs/showtbl.icn0000664000175000017500000000615307450115327016103 0ustar chrishchrish############################################################################ # # File: showtbl.icn # # Subject: Procedure to show contents of a table # # Author: Ralph E. Griswold # # Date: March 25, 2002 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # # showtbl(title, tbl, sort_type, limit, sort_order, posit, # w1, w2, gutter, f1, f2) displays tbl according to the arguments given. # # The arguments are: # # position name meaning default/alternative # # 1 title heading title "" # 2 tbl table to be shown # 3 sort_type type of sorting "ref"/"val" # 4 limit lines of table output essentially infinite # 5 sort_order increasing/decreasing "incr"/"decr" # 6 posit first column "val"/"ref" # 7 w1 width of 1st column 10 # 8 w2 width of 2nd column 10 # 9 gutter width between columns 3 # 10 f1 function of 1st column left # 11 f2 function of 2nd column right # # showtbl() returns a record with the first element being a count of # the size of the table and the second element the number of lines # written. # ############################################################################ # # This procedure just grew. It needs rewriting. # And it has far too many arguments. # ############################################################################ # # Deficiencies: Several features are not yet implemented. sort_order # and posit have no effect. In the case of sort_type # "val", the sorting order is decreasing. # ############################################################################ procedure showtbl(title, tbl, sort_type, #: show table contents limit, sort_order, posit, w1, w2, gutter, f1, f2) local count, lst, i, number /title := "" if type(tbl) ~== "table" then stop("*** invalid table argument to showtbl()") sort_type := case sort_type of { "ref" | &null: 3 "val": 4 default: stop("*** invalid sort type in showtbl()") } /limit := 2 ^ 30 # essentially infinite sort_order := case sort_order of { "incr" | &null: "incr" "decr": "decr" default: stop("*** invalid sort order in showtbl()") } posit := case posit of { "val" | &null: "val" "ref": "ref" default: stop("*** invalid column position in showtbl()") } /w1 := 10 /w2 := 10 /gutter := repl(" ", 3) /f1 := left /f2 := right number := 0 count := 0 every count +:= !tbl write("\n", title, ":\n") lst := sort(tbl, sort_type) if sort_type = 3 then { every i := 1 to *lst - 1 by 2 do { number +:= 1 if number > limit then break else write(f1(lst[i], w1), gutter, trim(f2(lst[i + 1], w2))) } } else { every i := *lst to 1 by -2 do { number +:= 1 if number > limit then break else write(f1(lst[i - 1], w1), gutter, trim(f2(lst[i], w2))) } } return [count, number] end icon-9.4.3/ipl/procs/mset.icn0000664000175000017500000000551507140713037015370 0ustar chrishchrish############################################################################ # # File: mset.icn # # Subject: Procedures for multi-sets # # Author: Jan P. de Ruiter # # Date: January 3, 1994 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # The idea of the mset type is that no two identical data-structures can be # present in a set, where identity is defined as "containing the same # elements". # # Definitions implicit in the procedure same_value(..,..): # # TYPE IDENTITY TEST # # all types === and if this test fails... # # integer = # real = # cset, string == # record all fields have same value # list all elements are the same, including ordering # table same keys, and every key has the same associated value # set contain the same elements # ############################################################################ # # This is the core routine. # It succeeds if two things have the same value(s). # procedure same_value(d1,d2) if d1 === d2 then return # same object else if type(d1) ~== type(d2) then fail # not the same type else if *d1 ~= *d2 then fail # not the same size else case type(d1) of { # the same type and size ("set" | "table" ) : return same_elements(sort(d1,1),sort(d2,1)) ("list") : return same_elements(d1,d2) ("real" | "integer") : return(d1 = d2) ("cset" | "string" ) : return(d1 == d2) default : return same_elements(d1,d2) # user defined type } end # # used in same_value: # procedure same_elements(l1,l2) local i if l1 === l2 then return # same objects else if *l1 ~= *l2 then fail # not the same size else { if *l1 = 0 then return # both lists empty else { every(i := 1 to *l1) do if not same_value(l1[i],l2[i]) then fail # recursion return } } end # # The new insert operation. Insert2 always succeeds # procedure insert2(S,el) every (if same_value(el,!S) then return) return insert(S,el) end # # The new member operation, that also detects equal-valued elements # procedure member2(S,el) every(if same_value(!S,el) then return) fail end # # The new delete operation, that detects equal-valued elements. # Always succeeds # procedure delete2(S,el) local t every(t := !S) do if same_value(t,el) then return delete(S,t) return end # # conversion of standard icon set into new mset. # procedure reduce2(iset) local temp temp := set() every(insert2(temp,!iset)) return temp end icon-9.4.3/ipl/procs/parscond.icn0000664000175000017500000000170707140713037016230 0ustar chrishchrish############################################################################ # # File: parscond.icn # # Subject: Procedure to condense parse tree # # Author: Ralph E. Griswold # # Date: March 31, 1992 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # Procedure to condense a parse tree produced by the output of pargen.icn # and produce the string that was parsed. # # The necessary record declaration is provided by the program with which # is linked. # ############################################################################ # # See also: parsgen.icn # ############################################################################ procedure parscond(R) local result, x result := "" every x := !(R.alts) do result ||:= string(x) | parscond(x) return result end icon-9.4.3/ipl/procs/adlutils.icn0000664000175000017500000000745207140713036016242 0ustar chrishchrish############################################################################ # # File: adlutils.icn # # Subject: Procedures to process address lists # # Author: Ralph E. Griswold # # Date: January 3, 1994 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # Procedures used by programs that process address lists: # # nextadd() get next address # writeadd(add) write address # get_country(add) get country # get_state(add) get state (U.S. addresses only) # get_city(add) get city (U.S. addresses only) # get_zipcode(add) get ZIP code (U.S. addresses only) # get_lastname(add) get last name # get_namepfx(add) get name prefix # get_title(add) get name title # format_country(s) format country name # ############################################################################ # # Links: lastname, io, namepfx, title # ############################################################################ link lastname, io, namepfx, title record label(header, text, comments) procedure nextadd() local comments, header, line, text initial { # Get to first label. while line := Read() do line ? { if ="#" then { PutBack(line) break } } } header := Read() | fail comments := text := "" while line := Read() do line ? { if pos(0) then next # Skip empty lines. else if ="*" then comments ||:= "\n" || line else if ="#" then { # Header for next label. PutBack(line) break # Done with current label. } else text ||:= "\n" || line } every text | comments ?:= { # Strip off leading newline, if any. move(1) tab(0) } return label(header, text, comments) end procedure writeadd(add) if *add.text + *add.comments = 0 then return write(add.header) if *add.text > 0 then write(add.text) if *add.comments > 0 then write(add.comments) return end procedure get_country(add) trim(add.text) ? { while tab(upto('\n')) do move(1) if tab(0) ? { tab(-1) any(&digits) } then return "U.S.A." else return tab(0) } end procedure get_state(add) trim(add.text) ? { while tab(upto('\n')) do move(1) ="APO" while tab(upto(',')) do move(1) tab(many(' ')) return (tab(any(&ucase)) || tab(any(&ucase))) | "XX" } end procedure get_city(add) # only works for U.S. addresses local result result := "" trim(add.text) ? { while tab(upto('\n')) do move(1) result := ="APO" result ||:= tab(upto(',')) return result } end procedure get_zipcode(add) local zip trim(add.text) ? { while tab(upto('\n')) do move(1) # get to last line while tab(upto(' ')) do tab(many(' ')) # get to last field zip := tab(0) if *zip = 5 & integer(zip) then return zip else if *zip = 10 & zip ? { integer(move(5)) & ="-" & integer(tab(0)) } then return zip else return "9999999999" # "to the end of the universe" } end procedure get_lastname(add) return lastname(add.text ? tab(upto('\n') | 0)) end procedure get_namepfx(add) return namepfx(add.text ? tab(upto('\n') | 0)) end procedure get_title(add) return title(add.text ? tab(upto('\n') | 0)) end procedure format_country(s) local t, word s := map(s) t := "" s ? while tab(upto(&lcase)) do { word := tab(many(&lcase)) if word == "of" then t ||:= word else t ||:= { word ? { map(move(1),&lcase,&ucase) || tab(0) } } t ||:= move(1) } return t end icon-9.4.3/ipl/procs/colmize.icn0000664000175000017500000000656007140713036016062 0ustar chrishchrish############################################################################ # # File: colmize.icn # # Subject: Procedures to arrange data into columns # # Author: Robert J. Alexander # # Date: June 15, 1990 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # colmize() -- Arrange data into columns. # # Procedure to arrange a number of data items into multiple columns. # Items are arranged in column-wise order, that is, the sequence runs # down the first column, then down the second, etc. # # This procedure goes to great lengths to print the items in as few # vertical lines as possible. # ############################################################################ procedure colmize(entries,maxcols,space,minwidth,tag,tagspace,tagminwidth,rowwise,distribute) local mean,cols,lines,width,i,x,wid,extra,t,j,first_tagfield,tagfield # # Process arguments -- provide defaults. # # entries: a list of items to be columnized /maxcols := 80 # max width of output lines /space := 2 # min nbr of spaces between columns /minwidth := 0 # min column width # tag: a label to be placed on the first line of output /tagminwidth := 0 /tagspace := 2 # rowwise: if nonnull, entries are listed in rowwise order rather than # columnwise # # # Process the tag field information. The tag will appear on the # first line to the left of the data. # if \tag then { tagminwidth <:= *tag + tagspace maxcols -:= tagminwidth first_tagfield := left(tag, tagminwidth - tagspace) || repl(" ",tagspace) tagfield := repl(" ",tagminwidth) } else tagfield := first_tagfield := "" # Starting with a trial number-of-columns that is guaranteed # to be too wide, successively reduce the number until the # items can be packed into the allotted width. # mean := 0 every mean +:= *!entries mean := mean / (0 ~= *entries) | 1 every cols := (maxcols + space) * 2 / (mean + space) to 1 by -1 do { lines := (*entries + cols - 1) / cols width := list(cols,minwidth) i := 0 if /rowwise then { # if column-wise every x := !entries do { width[i / lines + 1] <:= *x + space i +:= 1 } } else { # else row-wise every x := !entries do { width[i % cols + 1] <:= *x + space i +:= 1 } } wid := 0 every x := !width do wid +:= x if wid <= maxcols + space then break } # # Now output the data in columns. # extra := (\distribute & (maxcols - wid) / (0 < cols - 1)) | 0 if /rowwise then { # if column-wise every i := 1 to lines do { if i = 1 then t := first_tagfield else t := tagfield every j := 0 to cols - 1 do t ||:= left(entries[i + j * lines],width[j + 1] + extra) suspend trim(t) } } else { # else row-wise every i := 0 to lines - 1 do { if i = 0 then t := first_tagfield else t := tagfield every j := 1 to cols do t ||:= left(entries[j + i * cols],width[j] + extra) suspend trim(t) } } end icon-9.4.3/ipl/procs/filedim.icn0000664000175000017500000000201107140713036016014 0ustar chrishchrish############################################################################ # # File: filedim.icn # # Subject: Procedure to compute file dimensions # # Author: Ralph E. Griswold # # Date: April 30, 1993 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # filedim(s, p) computes the number of rows and maximum column width # of the file named s. The procedure p, which defaults to detab, i # applied to each line. For example, to have lines left as is, use # # filedim(s, 1) # ############################################################################ record textdim(cols, rows) procedure filedim(s, p) local input, rows, cols, line /p := detab input := open(s) | stop("*** cannot open ", s) rows := cols := 0 while line := p(read(input)) do { rows +:= 1 cols <:= *line } close(input) return textdim(cols, rows) end icon-9.4.3/ipl/procs/datetime.icn0000664000175000017500000004253007144343440016213 0ustar chrishchrish############################################################################ # # File: datetime.icn # # Subject: Procedures for date and time operations # # Author: Robert J. Alexander and Ralph E. Griswold # # Date: August 9, 2000 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # Notes: # - the default value for function parameters named # "hoursFromGmt" is the value of global variable # "HoursFromGmt" if nonnull, or environment variable # "HoursFromGmt" if set, or 0. # - The base year from which the "seconds" representation # of a date is calculated is by default 1970 (the ad hoc # standard used by both Unix and MS-Windows), but can be # changed by either setting the global variable # "DateBaseYear" or environment variable "DateBaseYear". # - There are some procedures not mentioned in this summary # that are useful: DateRecToSec(), SecToDateRec(). See the # source code for details. # # ClockToSec(seconds) # converts a time in the format of &clock to seconds past # midnight. # # DateLineToSec(dateline,hoursFromGmt) # converts a date in &dateline format to seconds since start of # dateBaseYear. # # DateToSec(date,hoursFromGmt) # converts a date string in Icon &date format (yyyy/mm/dd) # to seconds past DateBaseYear. # # SecToClock(seconds) # converts seconds past midnight to a string in the format of # &clock. # # SecToDate(seconds,hoursFromGmt) # converts seconds past DateBaseYear to a string in Icon # &date format (yyyy/mm/dd). # # SecToDateLine(seconds,hoursFromGmt) # produces a date in the same format as Icon's &dateline. # # SecToUnixDate(seconds,hoursFromGmt) # returns a date and time in typical UNIX format: # Jan 14 10:24 1991. # # IsLeapYear(year) # succeeds if year is a leap year, otherwise fails. # # calendat(j) # returns a record with the month, day, and year corresponding # to the Julian Date Number j. # # date() natural date in English. # # dayoweek(day, month, year) # produces the day of the week for the given date. # Note carefully the parameter order. # # full13th(year1, year2) # generates records giving the days on which a full moon occurs # on Friday the 13th in the range from year1 though year2. # # julian(m, d, y) # returns the Julian Day Number for the specified # month, day, and year. # # pom(n, phase) # returns record with the Julian Day number of fractional # part of the day for which the nth such phase since # January, 1900. Phases are encoded as: # # 0 - new moon # 1 - first quarter # 2 - full moon # 3 - last quarter# # # GMT is assumed. # # saytime() # computes the time in natural English. If an argument is # supplied it is used as a test value to check the operation # the program. # # walltime() # produces the number of seconds since midnight. Beware # wrap-around when used in programs that span midnight. # ############################################################################ # # See also: datefns.icn # ############################################################################ # # Acknowledgement: Some of these procedures are based on an algorithm # given in "Numerical Recipes; The Art of Scientific Computing"; # William H. Press, Brian P. Flannery, Saul A. Teukolsky, and William # T. Vetterling;# Cambridge University Press, 1986. # ############################################################################ record date1(month, day, year) record date2(month, year, fraction) record jdate(number, fraction) record DateRec(year,month,day,hour,min,sec,weekday) global Months,Days,DateBaseYear,HoursFromGmt procedure ClockToSec(seconds) #: convert &date to seconds # # Converts a time in the format of &clock to seconds past midnight. # seconds ? return ( (1(tab(many(&digits)),move(1)) * 60 + 1(tab(many(&digits)),move(1) | &null)) * 60 + (tab(many(&digits)) | 0) ) end procedure DateInit() # # Initialize the date globals -- done automatically by calls to date # procedures. # initial { Months := ["January","February","March","April","May","June", "July","August","September","October","November","December"] Days := ["Sunday","Monday","Tuesday","Wednesday","Thursday", "Friday","Saturday"] /DateBaseYear := integer(getenv("DateBaseYear")) | 1970 /HoursFromGmt := integer(getenv("HoursFromGmt")) | 0 } return end procedure DateLineToSec(dateline,hoursFromGmt) #: convert &dateline to seconds # # Converts a date in long form to seconds since start of DateBaseYear. # local day,halfday,hour,min,month,sec,year static months initial { DateInit() months := table() months["jan"] := 1 months["feb"] := 2 months["mar"] := 3 months["apr"] := 4 months["may"] := 5 months["jun"] := 6 months["jul"] := 7 months["aug"] := 8 months["sep"] := 9 months["oct"] := 10 months["nov"] := 11 months["dec"] := 12 } map(dateline) ? { tab(many(' \t')) =("sun" | "mon" | "tue" | "wed" | "thu" | "fri" | "sat") & tab(many(&letters)) | &null & tab(many(' \t,')) | &null month := 1(tab(many(&letters)),tab(many(' \t')) | &null) day <- integer(1(tab(many(&digits)),tab(many(' \t,')) | &null)) | &null & year <- integer(1(tab(many(&digits)),tab(many(' \t')) | &null)) | &null & (hour <- integer(tab(many(&digits))) & ((=":" & min <- integer(tab(many(&digits)))) & ((=":" & sec <- integer(tab(many(&digits)))) | &null) | &null) & tab(many(' \t')) | &null & halfday := =("am" | "pm") | &null & tab(many(' \t')) | &null) | &null & pos(0) } \month := \months[month[1+:3]] | fail if not /(halfday | hour) then { if hour = 12 then hour := 0 if halfday == "pm" then hour +:= 12 } return DateRecToSec(DateRec(year,month,day,hour,min,sec),hoursFromGmt) end procedure DateRecToSec(dateRec,hoursFromGmt) # # Converts a DateRec to seconds since start of DateBaseYear. # local day,hour,min,month,sec,secs,year,yr static days initial { DateInit() days := [ 0, 2678400, 5097600, 7776000, 10368000, 13046400, 15638400, 18316800, 20995200, 23587200, 26265600, 28857600 ] } /hoursFromGmt := HoursFromGmt hoursFromGmt := integer(hoursFromGmt) | runerr(101,hoursFromGmt) year := \dateRec.year | +&date[1+:4] month := \dateRec.month | +&date[6+:2] day := \dateRec.day | +&date[9+:2] hour := \dateRec.hour | 0 min := \dateRec.min | 0 sec := \dateRec.sec | 0 secs := 0 every yr := DateBaseYear to year - 1 do { secs +:= if IsLeapYear(yr) then 31622400 else 31536000 } if month > 2 & IsLeapYear(year) then secs +:= 86400 return secs + days[month] + (day - 1) * 86400 + (hour - hoursFromGmt) * 3600 + min * 60 + sec end procedure DateToSec(date,hoursFromGmt) #: convert &date to seconds # # Converts a date in Icon &date format (yyyy/mm/dd) do seconds # past DateBaseYear. # date ? return DateRecToSec(DateRec(+1(tab(find("/")),move(1)), +1(tab(find("/")),move(1)),+tab(0)),hoursFromGmt) end procedure SecToClock(seconds) #: convert seconds to &clock # # Converts seconds past midnight to a string in the format of &clock. # local sec sec := seconds % 60 seconds /:= 60 return right(seconds / 60,2,"0") || ":" || right(seconds % 60,2,"0") || ":" || right(sec,2,"0") end procedure SecToDate(seconds,hoursFromGmt) #: convert seconds to &date # # Converts seconds past DateBaseYear to a &date in Icon date format # (yyyy,mm,dd). # local r r := SecToDateRec(seconds,hoursFromGmt) return right(r.year,4,"0") || "/" || right(r.month,2,"0") || "/" || right(r.day,2,"0") end procedure SecToDateLine(seconds,hoursFromGmt) #: convert seconds to &dateline # # Produces a date in the same format as Icon's &dateline. # local d,hour,halfday d := SecToDateRec(seconds,hoursFromGmt) if (hour := d.hour) < 12 then { halfday := "am" } else { halfday := "pm" hour -:= 12 } if hour = 0 then hour := 12 return Days[d.weekday] || ", " || Months[d.month] || " " || d.day || ", " || d.year || " " || hour || ":" || right(d.min,2,"0") || " " || halfday end procedure SecToDateRec(seconds,hoursFromGmt) # # Produces a date record computed from the seconds since the start of # DateBaseYear. # local day,hour,min,month,secs,weekday,year initial DateInit() seconds := integer(seconds) | runerr(101,seconds) /hoursFromGmt := HoursFromGmt hoursFromGmt := integer(hoursFromGmt) | runerr(101,hoursFromGmt) seconds +:= hoursFromGmt * 3600 weekday := (seconds / 86400 % 7 + 4) % 7 + 1 year := DateBaseYear repeat { secs := if IsLeapYear(year) then 31622400 else 31536000 if seconds < secs then break year +:= 1 seconds -:= secs } month := 1 every secs := 2678400 | (if IsLeapYear(year) then 2505600 else 2419200) | 2678400 | 2592000 | 2678400 | 2592000 | 2678400 | 2678400 | 2592000 | 2678400 | 2592000 | 2678400 do { if seconds < secs then break month +:= 1 seconds -:= secs } day := seconds / 86400 + 1 seconds %:= 86400 hour := seconds / 3600 seconds %:= 3600 min := seconds / 60 seconds %:= 60 return DateRec(year,month,day,hour,min,seconds,weekday) end procedure SecToUnixDate(seconds,hoursFromGmt) #: convert seconds to UNIX time # # Returns a date and time in UNIX format: Jan 14 10:24 1991 # local d d := SecToDateRec(seconds,hoursFromGmt) return Months[d.month][1+:3] || " " || d.day || " " || d.hour || ":" || right(d.min,2,"0") || " " || d.year end procedure IsLeapYear(year) #: determine if year is leap # # Fails unless year is a leap year. # return year % 4 = 0 & (year % 100 ~= 0 | year % 400 = 0) & &null end procedure calendat(julian) #: Julian date local ja, jalpha, jb, jc, jd, je, gregorian local month, day, year gregorian := 2299161 if julian >= gregorian then { jalpha := integer(((julian - 1867216) - 0.25) / 36524.25) ja := julian + 1 + jalpha - integer(0.25 * jalpha) } else ja := julian jb := ja + 1524 jc := integer(6680.0 + ((jb - 2439870) - 122.1) / 365.25) jd := 365 * jc + integer(0.25 * jc) je := integer((jb - jd) / 30.6001) day := jb - jd - integer(30.6001 * je) month := je - 1 if month > 12 then month -:= 12 year := jc - 4715 if month > 2 then year -:= 1 if year <= 0 then year -:= 1 return date1(month, day, year) end procedure date() #: date in natural English &dateline ? { tab(find(", ") + 2) return tab(find(" ")) } end procedure dayoweek(day, month, year) #: day of the week # # The method used was adapted from a Web page by Mark Dettinger. # URL as of 7 August 2000 was: # http://www.informatik.uni-ulm.de/pm/mitarbeiter/mark/day_of_week.html # static d_code, c_code, m_code, ml_code, y, C, M, Y initial { d_code := ["Saturday", "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday"] c_code := table() c_code[16] := c_code[20] := 0 c_code[17] := c_code[21] := 6 c_code[18] := c_code[22] := 4 c_code[19] := c_code[23] := 2 m_code := table() m_code[1] := m_code["January"] := 1 m_code[2] := m_code["February"] := 4 m_code[3] := m_code["March"] := 4 m_code[4] := m_code["April"] := 0 m_code[5] := m_code["May"] := 2 m_code[6] := m_code["June"] := 5 m_code[7] := m_code["July"] := 0 m_code[8] := m_code["August"] := 3 m_code[9] := m_code["September"] := 6 m_code[10] := m_code["October"] := 1 m_code[11] := m_code["November"] := 4 m_code[12] := m_code["December"] := 6 ml_code := copy(m_code) ml_code[1] := ml_code["January"] := 0 ml_code[2] := ml_code["February"] := 3 } # This can be fixed to go back to October 15, 1582. if year < 1600 then stop("*** can't compute day of week that far back") # This can be fixed to go indefinitely far into the future; the day of # of the week repeats every 400 years. if year > 2299 then stop("*** can't compute day of week that far ahead") C := c_code[(year / 100) + 1] y := year % 100 Y := (y / 12) + (y % 12) + ((y % 12) / 4) month := integer(month) M := if (year % 4) = 0 then ml_code[month] else m_code[month] return d_code[(C + Y + M + day) % 7 + 1] end procedure full13th(year1, year2) #: full moons on Friday 13ths local time_zone, jd, jday, fraction, jul local year, month, julday, n, icon, day_of_week, c time_zone := -5.0 / 24.0 every year := year1 to year2 do { every month := 1 to 12 do { jday := julian(month, 13, year) day_of_week := (jday + 1) % 7 if day_of_week = 5 then { n := integer(12.37 * (year - 1900 + integer((month - 0.5) / 12.0))) icon := 0 repeat { jul := pom(n,2) jd := jul.number fraction := 24.0 * (jul.fraction + time_zone) if (fraction < 0.0) then { jd -:= 1 fraction +:= 24.0 } if fraction > 12.0 then { jd +:= 1 fraction -:= 12.0 } else fraction +:= 12.0 if jd = jday then { suspend date2(month, year, fraction) break } else { c := if jday >= jd then 1 else -1 if c = -icon then break icon := c n +:= c } } } } } end procedure julian(month, day, year) #: Julian date local jul, gregorian, ja, julian_year, julian_month gregorian := (15 + 31 * (10 + 12 * 1582)) if year = 0 then fail if year < 0 then year +:= 1 if month > 2 then { julian_year := year julian_month := month + 1 } else { julian_year := year - 1 julian_month := month + 13 } jul := (integer(365.25 * julian_year) + integer(30.6001 * julian_month) + day + 1720995) if day + 31 * (month + 12 * year) >= gregorian then { ja := integer(0.01 * julian_year) jul +:= 2 - ja + integer(0.25 * ja) } return jul end procedure pom(n, nph) #: phase of moon local i, jd, fraction, radians local am, as, c, t, t2, extra radians := &pi / 180 c := n + nph / 4.0 t := c / 1236.85 t2 := t * t as := 359.2242 + 29.105356 * c am := 306.0253 + 385.816918 * c + 0.010730 * t2 jd := 2415020 + 28 * n + 7 * nph extra := 0.75933 + 1.53058868 * c + ((1.178e-4) - (1.55e-7) * t) * t2 if nph = (0 | 2) then extra +:= (0.1734 - 3.93e-4 * t) * sin(radians * as) - 0.4068 * sin(radians * am) else if nph = (1 | 3) then extra +:= (0.1721 - 4.0e-4 * t) * sin(radians * as) - 0.6280 * sin(radians * am) else fail if extra >= 0 then i := integer(extra) else i := integer(extra - 1.0) jd +:= i fraction := extra - i return jdate(integer(jd), fraction) end procedure saytime(time) #: time in natural English local hour,min,mod,near,numbers,out,sec # # Extract the hours, minutes, and seconds from the time. # /time := &clock time ? { hour := integer(tab(find(":") | 0)) | fail move(1) min := tab(find(":") | 0) move(1) sec := tab(0) } min := integer(min) | 0 sec := integer(sec) | 0 # # Now start the processing in earnest. # near := ["just gone","just after","nearly","almost"] if sec > 29 then min +:= 1 # round up minutes mod := min % 5 # where we are in 5 minute bracket out := near[mod] || " " | "" # start building the result if min > 32 then hour +:= 1 # we are TO the hour min +:= 2 # shift minutes to straddle the 5-minute point # # Now special-case the result for Noon and Midnight hours. # if hour % 12 = 0 & min % 60 <= 4 then { return if hour = 12 then out || "noon" else out || "midnight" } min -:= min % 5 # find the nearest 5 mins if hour > 12 then hour -:= 12 # get rid of 25-hour clock else if hour = 0 then hour := 12 # .. and allow for midnight # # Determine the phrase to use for each 5-minute segment. # case min of { 0: {} # add "o'clock" later 60: min=0 # ditto 5: out ||:= "five past" 10: out ||:= "ten past" 15: out ||:= "a quarter past" 20: out ||:= "twenty past" 25: out ||:= "twenty-five past" 30: out ||:= "half past" 35: out ||:= "twenty five to" 40: out ||:= "twenty to" 45: out ||:= "a quarter to" 50: out ||:= "ten to" 55: out ||:= "five to" } numbers := ["one","two","three","four","five","six", "seven","eight","nine","ten","eleven","twelve"] out ||:= (if *out = 0 then "" else " ") || numbers[hour] # add the hour number if min = 0 then out ||:= " o'clock" # .. and o'clock if exact return out # return the final result end procedure walltime() #: time since midnight local seconds &clock ? { seconds := tab(upto(':')) * 3600 # seconds in a hour move(1) seconds +:= tab(upto(':')) * 60 # seconds in a minute move(1) return seconds + tab(0) } end icon-9.4.3/ipl/procs/matchlib.icn0000664000175000017500000000222107140713037016172 0ustar chrishchrish############################################################################ # # File: matchlib.icn # # Subject: Procedures for lexical matching # # Author: Ralph E. Griswold # # Date: September 2, 1991 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # These procedures perform low-level "lexical" matching for # recursive-descent pattern matchers. # # rb_() match right bracket # lb_() match left bracket # rp_() match right parenthesis # lp_() match left parenthesis # vb_() match vertical bar # nl_() match newline # empty_() match empty string # ############################################################################ # # See also: parsgen.icn # ############################################################################ procedure rb_() suspend =">" end procedure lb_() suspend ="<" end procedure rp_() suspend =")" end procedure lp_() suspend =")" end procedure vb_() suspend ="|" end procedure nl_() suspend ="\n" end procedure empty_() suspend "" end icon-9.4.3/ipl/procs/created.icn0000664000175000017500000000146207450115327016026 0ustar chrishchrish############################################################################ # # File: created.icn # # Subject: Procedure to determine number of structures created # # Author: Ralph E. Griswold # # Date: March 25, 2002 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # This program returns the number of structures of a given type that have # been created. # ############################################################################ # # Links: serial # ############################################################################ link serial procedure created(kind) #: number of structures created return serial(proc(kind)()) fail end icon-9.4.3/ipl/procs/geodat.icn0000664000175000017500000011400307142170760015656 0ustar chrishchrish############################################################################ # # File: geodat.icn # # Subject: Procedures for geodetic datum conversion # # Authors: William S. Evans and Gregg M. Townsend # # Date: July 31, 2000 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # These procedures provide "projections" that convert among geodetic # datums, which relate locations on the earth's surface to longitude # and latitude coordinates. As measurement techniques improve, # newer datums typically give slightly different values from older # ones. The values returned here are used with the project() # procedure of cartog.icn. # # geodat(s1, s2) defines a geodetic datum conversion. # molodensky() performs an algorithmic datum conversion. # nadcon(s1, s2) uses data files for more precise conversion. # # ellipsoid(s) return the parameters of the named ellipsoid. # ############################################################################ # # geodat(f, t) returns a projection from longitude and latitude # in datum f to longitude and latitude in datum t. # f and t are strings. If f and t equal "NAD83", "NAD27", # "HARN", or "HPGN", geodat returns a nadcon projection. # Failing that, geodat returns a molodensky projection. # # The input to the projection is a list of signed numeric values, # angles measured in degrees, with each pair representing one # location; longitude precedes latitude. The output is a list # with the same form and length as the input list. # ############################################################################ # # nadcon(f, t) returns a projection from longitude and latitude # in datum f to longitude and latitude in datum t. The strings # f and t must each be one of "NAD83", "NAD27", "HARN", or "HPGN". # The projection uses our implementation of the National Oceanic # and Atmospheric Administration's (NOAA's) North American Datum # Conversion Utility (NADCON); for more information, see # http://www.ngs.noaa.gov/TOOLS/Nadcon/Nadcon.html # # nadcon() requires data grid (.loa and .laa) files, which must be # found in the current directory or along the space-separated path # given by the environment variable DPATH. These files can be # downloaded from: # http://www.cs.arizona.edu/icon/ftp/data/nadcon/ # ftp://ftp.cs.arizona.edu/icon/data/nadcon/ # # The projection's input and output are lists of signed numbers. # Output is properly rounded and so may not agree exactly with # the equivalent NOAA programs. # ############################################################################ # # molodensky(dx, dy, dz, ain, fin, aout, fout) returns a projection # from input longitude and latitude to output longitude and latitude. # The projection uses the standard Molodensky transformation. # The input datum is specified by an ellipsoid with parameters # ain, the equatorial radius in metres, and fin, the flattening; # and by three shift values dx, dy, and dz. The output datum is # specified by an ellipsoid with parameters aout and fout. # # If dz is null, then dx and dy are interpreted as the names of # an input and output datum. The names are the ID codes # specified in NIMA TR 8350.2. # # The projection's input and output are lists of signed numbers. # ############################################################################ # # ellipsoid(s) return a list [a, 1/f] containing the defining # parameters of the standard ellipsoid model named s; a is the # equatorial radius and 1/f is the flattening factor. Names are # listed in the code; the default is "WGS84". # ############################################################################ # # Ellipsoid and datum parameters are from: # # Department of Defense World Geodetic System 1984 # National Imagery and Mapping Agency # Technical Report TR8350.2 # Third Edition, Amendment 1 (3 January 2000) # ftp://ftp.nima.mil/pub/gg/tr8350.2/ # ############################################################################ # # Links: cartog, io # ############################################################################ link cartog link io # Procedures and globals named with a "gdt_" prefix are # not intended for access outside this file. global gdt_datum_ptab # table of gdt_datum_rec's, keyed by code ###################### Geodat Conversion ################################# procedure geodat(f, t) #: define geodetic conversion return nadcon(f, t) | molodensky(f, t) | fail end ###################### NADCON Conversion ################################# record gdt_nadcon( # nadcon conversion record proj, # projection procedure inv, # invert myself grids # list of gdt_nadcon_grid records to search ) record gdt_nadcon_grid( # information about a .loa and .laa file name, # name of file offset, # offset in file to start of grid data termLen, # number of chars in line termination (1 or 2) nc, nr, nz, # number of rows, columns in file (nz = ??) xmin, xmax, dx, # dimension of coverage ymin, ymax, dy, # angle # ?? ) procedure nadcon(f, t) #: define NAD data conversion local d, ft ft := (gdt_nadcon_datum(f) || "-" || gdt_nadcon_datum(t)) | fail d := gdt_nadcon() d.inv := gdt_nadcon_inv case ft of { "NAD27-NAD83"|"NAD83-NAD27": # more specific grids should precede less specific ones d.grids := gdt_nadcon_initGrids( ["hawaii","prvi","stlrnc", "stgeorge","stpaul","alaska","conus"]) "NAD83-HPGN"|"HPGN-NAD83": d.grids := gdt_nadcon_initGrids( ["alhpgn","azhpgn","cnhpgn","cohpgn","cshpgn","emhpgn","ethpgn", "flhpgn","gahpgn","hihpgn","inhpgn","kshpgn","kyhpgn","lahpgn", "mdhpgn","mehpgn","mihpgn","mshpgn","nbhpgn","ndhpgn","nehpgn", "nmhpgn","nvhpgn","nyhpgn","ohhpgn","okhpgn","pvhpgn","sdhpgn", "tnhpgn","uthpgn","vahpgn","wihpgn","wmhpgn","wohpgn","wthpgn", "wvhpgn","wyhpgn"]) "NAD27-HPGN": return compose(nadcon("NAD27", "NAD83"), nadcon("NAD83", "HPGN")) "HPGN-NAD27": return compose(nadcon("HPGN", "NAD83"), nadcon("NAD83", "NAD27")) default: # identity conversion d.grids := [] } case ft of { "NAD27-NAD83"|"NAD83-HPGN": d.proj := gdt_nadcon_fwd "NAD83-NAD27"|"HPGN-NAD83": d.proj := gdt_nadcon_bck default: d.proj := gdt_identity } return d end procedure gdt_nadcon_fwd(p, L) local i, a a := [] every i := 1 to *L by 2 do { gdt_nadcon_fwdPoint(p, a, L[i], L[i+1]) | fail } return a end procedure gdt_nadcon_bck(p, L) local i, a a := [] every i := 1 to *L by 2 do { gdt_nadcon_bckPoint(p, a, L[i], L[i+1]) | fail } return a end procedure gdt_identity(p, L) return L end procedure gdt_nadcon_inv(p) local q q := copy(p) case p.proj of { gdt_nadcon_bck : q.proj := gdt_nadcon_fwd gdt_nadcon_fwd : q.proj := gdt_nadcon_bck gdt_identity : q.proj := gdt_identity } return q end procedure gdt_nadcon_datum(x) case x of { "NAD27": return "NAD27" "NAD83": return "NAD83" "HARN" | "HPGN": return "HPGN" } end procedure gdt_nadcon_initGrids(names) local grids, latf, lonf, a1, a2, b1, b2, g grids := [] every name := !names do { close(\lonf) close(\latf) g := gdt_nadcon_grid() g.name := name lonf := dopen(name || ".loa") | &null latf := dopen(name || ".laa") | &null if /lonf | /latf then next # filename unreadable a1 := read(lonf) | &null a2 := read(lonf) | &null b1 := read(latf) | &null b2 := read(latf) | &null if /a1 | /a2 | /b1 | /b2 | a1 ~== b1 | a2 ~== b2 then { write(&errout, g.name, " incompatible or corrupt files.") next } g.offset := where(lonf) if g.offset = 141 then g.termLen := 2 else g.termLen := 1 a2 ? { g.nc := integer(move(4)) g.nr := integer(move(4)) g.nz := integer(move(4)) g.xmin := real(move(12)) g.dx := real(move(12)) g.xmax := g.xmin + (g.nc - 1) * g.dx g.ymin := real(move(12)) g.dy := real(move(12)) g.ymax := g.ymin + (g.nr - 1) * g.dy g.angle := real(move(12)) put(grids, g) } } close(\lonf) close(\latf) if *grids = 0 then { write(&errout, "No valid NADCON conversion files found.") fail } return grids end procedure gdt_nadcon_findGrid(grids, xpt, ypt) local g every g := !grids do { if (g.xmin < xpt < g.xmax & g.ymin < ypt < g.ymax) then return g } fail end procedure gdt_nadcon_box(f, g, xcol, yrow) # This procedure is very sensitive to the format of the .loa & .laa # files. In particular, it assumes: # 1) each line contains 6 numbers (except, possibly, the # last line of a row, which contains (nc % 6) numbers, # 2) each number is 12 chars long, local charsPerRow, pos, t1, t2, t3, t4 charsPerRow := (72 + g.termLen) * integer(g.nc / 6) if (g.nc % 6) > 0 then charsPerRow +:= g.termLen + 12 * (g.nc % 6) pos := g.offset + charsPerRow * (yrow - 1) + (72 + g.termLen) * integer((xcol - 1) / 6) + 12 * ((xcol - 1) % 6) seek(f, pos) t1 := reads(f, 12) if (xcol % 6 = 0) then reads(f, g.termLen) # line termination t3 := reads(f, 12) seek(f, pos + 12 * g.nc + g.termLen * ceil(g.nc / 6.0)) t2 := reads(f, 12) if (xcol % 6 = 0) then reads(f, g.termLen) # line termination t4 := reads(f, 12) return [real(t1), real(t2), real(t3), real(t4)] end procedure gdt_nadcon_fwdPoint(p, a, xpt, ypt) local g, latf, lonf, xgrid, ygrid, xcol, yrow, t, dlas, dlos if not(g := gdt_nadcon_findGrid(p.grids, xpt, ypt)) then { runerr(205, [xpt, ypt]) # point not in available areas fail } lonf := dopen(g.name || ".loa") latf := dopen(g.name || ".laa") xgrid := (xpt - g.xmin) / g.dx + 1.0 ygrid := (ypt - g.ymin) / g.dy + 1.0 xcol := integer(xgrid) yrow := integer(ygrid) t := gdt_nadcon_box(lonf, g, xcol, yrow) dlos := t[1] + (t[3]-t[1]) * (xgrid-xcol) + (t[2]-t[1]) * (ygrid-yrow) + (t[4]-t[3]-t[2]+t[1]) * (xgrid-xcol) * (ygrid-yrow) t := gdt_nadcon_box(latf, g, xcol, yrow) dlas := t[1] + (t[3]-t[1]) * (xgrid-xcol) + (t[2]-t[1]) * (ygrid-yrow) + (t[4]-t[3]-t[2]+t[1]) * (xgrid-xcol) * (ygrid-yrow) close(lonf) close(latf) # Why is the range specified in +east and the correction in +west? put(a, xpt - dlos / 3600.0, ypt + dlas / 3600.0) return end $define CTG_NADCON_SMALL 0.000000001 # close enough for NADCON inverse procedure gdt_nadcon_bckPoint(p, a, xpt, ypt) local xguess, yguess, b, i, dx, dy xguess := xpt yguess := ypt b := [] every i:= 1 to 10 do { gdt_nadcon_fwdPoint(p, b, xguess, yguess) | fail dx := xpt - get(b) dy := ypt - get(b) if abs(dx) > CTG_NADCON_SMALL then xguess +:= dx if abs(dy) > CTG_NADCON_SMALL then yguess +:= dy if abs(dx) <= CTG_NADCON_SMALL & abs(dy) <= CTG_NADCON_SMALL then { put(a, xguess, yguess) return } } write(&errout, "Maximum iterations exceeded!!") fail end ################# Standard Molodensky Datum Transformation ################## # See NIMA TR 8350.2 # # ************************ WARNING ****************************************** # NIMA TR 8350.2 contains Molodensky parameters to convert # from an arbitrary datum to WGS84. To convert from datum A to datum B, # I call molodensky(Ax-Bx,Ay-By,Az-Bz,Aa,Af,Ba,Bf) where Ax,Ay,Az are the # shift to convert A to WGS84; Bx,By,Bz are the shift to convert B to WGS84; # Aa,Af,Ba,Bf are the ellipsoid parameters. # ************************ WARNING ****************************************** # # TODO: # 1) Add special conversion for North and South pole # 2) Add Multiple Regression Equations # 3) Add special WGS72 to WGS84 conversion # record gdt_molo( proj, # projection procedure (always gdt_molo_proj) inv, # invert myself (always gdt_molo_inv) dx, dy, dz, # x,y,z differences (output - input) ain, fin, # input ellipsoid specs aout, fout # output ellipsoid specs ) procedure molodensky(dx,dy,dz,ain,fin,aout,fout) #: define geodetic conversion local p, a, din, ein, dout, eout if /dx | /dy then fail if /dz then { din := gdt_datum_params(dx) | fail ein := ellipsoid(din.eps) | fail dout := gdt_datum_params(dy) | fail eout := ellipsoid(dout.eps) | fail a := [] put(a, din.dx - dout.dx, din.dy - dout.dy, din.dz - dout.dz) put(a, ein[1], ein[2], eout[1], eout[2]) return molodensky ! a } p := gdt_molo() p.proj := gdt_molo_proj p.inv := gdt_molo_inv p.dx := dx p.dy := dy p.dz := dz p.ain := ain p.fin := fin p.aout := aout p.fout := fout return p end procedure gdt_molo_proj(p, L) local e2, slam, clam, sphi, cphi, Rm, Rn, dlam, dphi local i, bbya, da, df, lam, phi, lllist da := p.aout - p.ain df := p.fout - p.fin e2 := p.fin * (2 - p.fin) bbya := 1. - p.fin lllist := [] every i := 1 to *L by 2 do { lam := dtor(L[i]) slam := sin(lam) clam := cos(lam) phi := dtor(L[i+1]) sphi := sin(phi) cphi := cos(phi) Rm := p.ain * (1 - e2) / (1 - e2 * sphi ^ 2) ^ (1.5) Rn := p.ain / sqrt(1 - e2 * sphi ^ 2) dlam := (-p.dx * slam + p.dy * clam) / (Rn * cphi) dphi := (-p.dx * sphi * clam - p.dy * sphi * slam + p.dz * cphi + da * (Rn * e2 * sphi * cphi) / p.ain + df * (Rm / bbya + Rn * bbya) * sphi * cphi) / Rm put(lllist, rtod(lam + dlam), rtod(phi + dphi)) } return lllist end procedure gdt_molo_inv(p) local q q := gdt_molo() q.proj := gdt_molo_proj q.inv := gdt_molo_inv q.dx := -p.dx q.dy := -p.dy q.dz := -p.dz q.ain := p.aout q.fin := p.fout q.aout := p.ain q.fout := p.fin return q end ###################### Ellipsoid Parameters ################################# procedure ellipsoid(name) #: return [a, 1/f] for named ellipsoid local f, line, w, i /name := "WGS84" return case name of { "Airy 1830"|"Airy"|"AA": [6377563.396, 1 / 299.3249646] "Australian National"|"AN": [6378160.0, 1 / 298.25] "Bessel 1841"|"BR": [6377397.155, 1 / 299.1528128] "Bessel 1841 (Namibia)"|"BN": [6377483.865, 1 / 299.1528128] "Clarke 1866"|"Clarke66"|"NAD27"|"CC": [6378206.4, 1 / 294.9786982] "Clarke 1880"|"CD": [6378249.145, 1 / 293.465] "Everest 1830"|"Everest"|"EA": [6377276.345, 1 / 300.8017] "Everest 1948"|"Modified Everest"|"EE": [6377304.063, 1 / 300.8017] "Everest 1956"|"EC": [6377301.243, 1 / 300.8017] "Everest 1969"|"ED": [6377295.664, 1 / 300.8017] "Everest (Pakistan)"|"EF": [6377309.613, 1 / 300.8017] "Everest (Sabah & Sarawak)"|"EB": [6377298.556, 1 / 300.8017] "Fischer 1960": [6378166.0, 1 / 298.3] "Fischer 1968": [6378150.0, 1 / 298.3] "GRS67": [6378160.0, 1 / 298.247167427] "GRS80"|"NAD83"|"RF": [6378137.0, 1 / 298.257222101] "Hayford": [6378388.0, 1 / 297.0] "Helmert 1906"|"HE": [6378200.0, 1 / 298.3] "Hough"|"HO": [6378270.0, 1 / 297.0] "Indonesian 1974"|"ID": [6378160.0, 1 / 298.247] "International 1924"|"IN": [6378388.0, 1 / 297.0] "Krassovsky 1940"|"KA": [6378245.0, 1 / 298.3] "Modified Airy"|"AM": [6377340.189, 1 / 299.3249646] "Modified Fischer 1960"|"FA": [6378155.0, 1 / 298.3] "South American 1969"|"SA": [6378160.0, 1 / 298.25] "WGS 1960"|"WGS 60"|"WGS60"|"W60"|"WA": [6378165.0, 1 / 298.3] "WGS 1966"|"WGS 66"|"WGS66"|"W66"|"WB": [6378145.0, 1 / 298.25] "WGS 1972"|"WGS 72"|"WGS72"|"W72"|"WD": [6378135.0, 1 / 298.26] "WGS 1984"|"WGS 84"|"WGS84"|"W84"|"WE": [6378137.0, 1 / 298.257223563] default: runerr(207, name) } end ###################### Datum Parameters ################################# record gdt_datum_rec( region, # major region of datum (e.g. "Africa") name, # datum code name area, # area of datum (e.g. "Cameroon") eps, # ellipsoid specification (e.g. "CD") dx, dy, dz, # x,y,z differences from WGS84 ex, ey, ez # x,y,z maximum error in converted point (unused) ) procedure gdt_datum_params(codename) initial gdt_datum_init() return \gdt_datum_ptab[codename] | runerr(207, codename) end procedure gdt_datum_add(key, fields[]) return gdt_datum_ptab[key] := gdt_datum_rec ! fields end procedure gdt_datum_init() gdt_datum_ptab := table() $define add gdt_datum_add # ----------------- AFRICA -------------------------------- add("ADI-M", "Africa", "Adindan","mean Ethiopia & Sudan","CD", -166,-15,204, 5,5,3 ) add("ADI-E", "Africa", "Adindan","Burkina Faso","CD", -118,-14,218, 25,25,25 ) add("ADI-F", "Africa", "Adindan","Cameroon","CD", -134,-2,210, 25,25,25 ) add("ADI-A", "Africa", "Adindan","Ethiopia","CD", -165,-11,206, 3,3,3 ) add("ADI-C", "Africa", "Adindan","Mali","CD", -123,-20,220, 25,25,25 ) add("ADI-D", "Africa", "Adindan","Senegal","CD", -128,-18,224, 25,25,25 ) add("ADI-B", "Africa", "Adindan","Sudan","CD", -161,-14,205, 3,5,3 ) add("AFG", "Africa", "Afgooye","Somalia","KA", -43,-163,45, 25,25,25 ) add("ARF-M", "Africa", "Arc 1950","mean","CD", -143,-90,-294, 20,33,20 ) add("ARF-A", "Africa", "Arc 1950","Botswana","CD", -138,-105,-289, 3,5,3 ) add("ARF-H", "Africa", "Arc 1950","Burundi","CD", -153,-5,-292, 20,20,20 ) add("ARF-B", "Africa", "Arc 1950","Lesotho","CD", -125,-108,-295, 3,3,8 ) add("ARF-C", "Africa", "Arc 1950","Malawi","CD", -161,-73,-317, 9,24,8 ) add("ARF-D", "Africa", "Arc 1950","Swaziland","CD", -134,-105,-295, 15,15,15 ) add("ARF-E", "Africa", "Arc 1950","Zaire","CD", -169,-19,-278, 25,25,25 ) add("ARF-F", "Africa", "Arc 1950","Zambia","CD", -147,-74,-283, 21,21,27 ) add("ARF-G", "Africa", "Arc 1950","Zimbabwe","CD", -142,-96,-293, 5,8,11 ) add("ARS-M", "Africa", "Arc 1960","mean Kenya & Tanzania","CD",-160,-6,-302, 20,20,20 ) add("ARS-A", "Africa", "Arc 1960","Kenya","CD", -157,-2,-299, 4,3,3 ) add("ARS-B", "Africa", "Arc 1960","Tanzania","CD", -175,-23,-303, 6,9,10 ) add("PHA", "Africa", "Ayabelle Lighthouse","Djibouti","CD", -79,-129,145, 25,25,25 ) add("BID", "Africa", "Bissau","Guinea-Bissau","IN", -173,253,27, 25,25,25 ) add("CAP", "Africa", "Cape","South Africa","CD", -136,-108,-292, 3,6,6 ) add("CGE", "Africa", "Carthage","Tunisia","CD", -263,6,431, 6,9,8 ) add("DAL", "Africa", "Dabola","Guinea","CD", -83,37,124, 15,15,15 ) add("EUR-F", "Africa", "European 1950","Egypt","IN", -130,-117,-151, 6,8,8 ) add("EUR-T", "Africa", "European 1950","Tunisia","IN", -112,-77,-145, 25,25,25 ) add("LEH", "Africa", "Leigon","Ghana","CD", -130,29,364, 2,3,2 ) add("LIB", "Africa", "Liberia 1964","Liberia","CD", -90,40,88, 15,15,15 ) add("MAS", "Africa", "Massawa","Eritrea (Ethiopia)","BR", 639,405,60, 25,25,25 ) add("MER", "Africa", "Merchich","Morocco","CD", 31,146,47, 5,3,3 ) add("MIN-A", "Africa", "Minna","Cameroon","CD", -81,-84,115, 25,25,25 ) add("MIN-B", "Africa", "Minna","Nigeria","CD", -92,-93,122, 3,6,5 ) add("MPO", "Africa", "M'Poraloko","Gabon","CD", -74,-130,42, 25,25,25 ) add("NSD", "Africa", "North Sahara 1959","Algeria","CD", -186,-93,310, 25,25,25 ) add("OEG", "Africa", "Old Egyptian 1907","Egypt","HE", -130,110,-13, 3,6,8 ) add("PTB", "Africa", "Point 58","mean Burkina Faso & Niger","CD",-106,-129,165, 25,25,25 ) add("PTN", "Africa", "Pointe Noire 1948","Congo","CD", -148,51,-291, 25,25,25 ) add("SCK", "Africa", "Schwarzeck","Namibia","BN", 616,97,-251, 20,20,20 ) add("SRL", "Africa", "Sierra Leone 1960","Sierra Leone","CD", -88,4,101, 15,15,15 ) add("VOR", "Africa", "Voirol 1960","Algeria","CD", -123,-206,219, 25,25,25 ) # ----------------- ASIA -------------------------------- add("AIN-A", "Asia", "Ain el Abd 1970","Bahrain","IN", -150,-250,-1, 25,25,25 ) add("AIN-B", "Asia", "Ain el Abd 1970","Saudi Arabia","IN", -143,-236,7, 10,10,10 ) add("BAT", "Asia", "Djakarta (Batavia)","Sumatra (Indonesia)","BR",-377,681,-50, 3,3,3 ) add("EUR-H", "Asia", "European 1950","Iran","IN", -117,-132,-164, 9,12,11 ) add("HKD", "Asia", "Hong Kong 1963","Hong Kong","IN", -156,-271,-189, 25,25,25 ) add("HTN", "Asia", "Hu-Tzu-Shan","Taiwan","IN", -637,-549,-203, 15,15,15 ) add("IND-B", "Asia", "Indian","Bangladesh","EA", 282,726,254, 10,8,12 ) add("IND-I", "Asia", "Indian","India & Nepal","EC", 295,736,257, 12,10,15 ) add("INF-A", "Asia", "Indian 1954","Thailand","EA", 217,823,299, 15,6,12 ) add("ING-A", "Asia", "Indian 1960","Vietnam (near 16N)","EA",198,881,317, 25,25,25 ) add("ING-B", "Asia", "Indian 1960","Con Son Island (Vietnam)","EA",182,915,344, 25,25,25 ) add("INH-A", "Asia", "Indian 1975","Thailand","EA", 209,818,290, 12,10,12 ) add("INH-A1", "Asia", "Indian 1975","Thailand","EA", 210,814,289, 3,2,3 ) add("IDN", "Asia", "Indonesian 1974","Indonesia","ID", -24,-15,5, 25,25,25 ) add("KAN", "Asia", "Kandawala","Sri Lanka","EA", -97,787,86, 20,20,20 ) add("KEA", "Asia", "Kertau 1948","West Malaysia & Singapore","EE",-11,851,5, 10,8,6 ) add("KGS", "Asia", "Korean Geodetic System 1995","South Korea","WE",0,0,0, 1,1,1 ) add("NAH-A", "Asia", "Nahrwan","Masirah Island (Oman)","CD", -247,-148,369, 25,25,25 ) add("NAH-B", "Asia", "Nahrwan","United Arab Emirates","CD", -249,-156,381, 25,25,25 ) add("NAH-C", "Asia", "Nahrwan","Saudi Arabia","CD", -243,-192,477, 20,20,20 ) add("FAH", "Asia", "Oman","Oman","CD", -346,-1,224, 3,3,9 ) add("QAT", "Asia", "Qatar National","Qatar","IN", -128,-283,22, 20,20,20 ) add("SOA", "Asia", "South Asia","Singapore","FA", 7,-10,-26, 25,25,25 ) add("TIL", "Asia", "Timbalai 1948","Brunei & East Malaysia (Sarawak & Sabah)","EB", -679,669,-48, 10,10,12 ) add("TOY-M", "Asia", "Tokyo","mean","BR", -148,507,685, 20,5,20 ) add("TOY-A", "Asia", "Tokyo","Japan","BR", -148,507,685, 8,5,8 ) add("TOY-C", "Asia", "Tokyo","Okinawa","BR", -158,507,676, 20,5,20 ) add("TOY-B", "Asia", "Tokyo","South Korea","BR", -146,507,687, 8,5,8 ) add("TOY-B1", "Asia", "Tokyo","South Korea","BR", -147,506,687, 2,2,2 ) # ----------------- AUSTRALIA -------------------------------- add("AUA", "Australia", "Australian Geodetic 1966","Australia & Tasmania","AN",-133,-48,148, 3,3,3 ) add("AUG", "Australia", "Australian Geodetic 1984","Australia & Tasmania","AN",-134,-48,149, 2,2,2 ) # ----------------- EUROPE -------------------------------- add("EST", "Europe", "Co-ordinate System 1937 of Estonia","Estonia","BN",374,150,588, 2,3,3 ) add("EUR-M", "Europe", "European 1950","mean","IN", -87,-98,-121, 3,8,5 ) add("EUR-A", "Europe", "European 1950","mean Western Europe","IN",-87,-96,-120, 3,3,3 ) add("EUR-E", "Europe", "European 1950","Cyprus","IN", -104,-101,-140, 15,15,15 ) add("EUR-G", "Europe", "European 1950","England & Channel Islands & Scotland & Shetland Islands","IN", -86,-96,-120, 3,3,3 ) add("EUR-K", "Europe", "European 1950","England & Ireland & Scotland & Shetland Islands","IN", -86,-96,-120, 3,3,3 ) add("EUR-B", "Europe", "European 1950","Greece","IN", -84,-95,-130, 25,25,25 ) add("EUR-I", "Europe", "European 1950","Sardinia (Italy)","IN",-97,-103,-120, 25,25,25 ) add("EUR-J", "Europe", "European 1950","Sicily (Italy)","IN", -97,-88,-135, 20,20,20 ) add("EUR-L", "Europe", "European 1950","Malta","IN", -107,-88,-149, 25,25,25 ) add("EUR-C", "Europe", "European 1950","Norway & Finland","IN",-87,-95,-120, 3,5,3 ) add("EUR-D", "Europe", "European 1950","Portugal & Spain","IN",-84,-107,-120, 5,6,3 ) add("EUS", "Europe", "European 1979","mean","IN", -86,-98,-119, 3,3,3 ) add("HJO", "Europe", "Hjorsey 1955","Iceland","IN", -73,46,-86, 3,3,6 ) add("IRL", "Europe", "Ireland 1965","Ireland","AM", 506,-122,611, 3,3,3 ) add("OGB-M", "Europe", "Ordnance Survey Great Britain 1936","mean","AA",375,-111,431, 10,10,15 ) add("OGB-A", "Europe", "Ordnance Survey Great Britain 1936","England","AA",371,-112,434, 5,5,6 ) add("OGB-B", "Europe", "Ordnance Survey Great Britain 1936","England & Isle of Man & Wales","AA", 371,-111,434, 10,10,15 ) add("OGB-C", "Europe", "Ordnance Survey Great Britain 1936","Scotland & Shetland Islands","AA", 384,-111,425, 10,10,10 ) add("OGB-D", "Europe", "Ordnance Survey Great Britain 1936","Wales","AA",370,-108,434, 20,20,20 ) add("MOD", "Europe", "Rome 1940","Sardinia","IN", -225,-65,9, 25,25,25 ) add("SPK-A", "Europe", "S-42 (Pulkovo 1942)","Hungary","KA", 28,-121,-77, 2,2,2 ) add("SPK-B", "Europe", "S-42 (Pulkovo 1942)","Poland","KA", 23,-124,-82, 4,2,4 ) add("SPK-C", "Europe", "S-42 (Pulkovo 1942)","Czechoslavakia","KA",26,-121,-78, 3,3,2 ) add("SPK-D", "Europe", "S-42 (Pulkovo 1942)","Latvia","KA", 24,-124,-82, 2,2,2 ) add("SPK-E", "Europe", "S-42 (Pulkovo 1942)","Kazakhstan","KA",15,-130,-84, 25,25,25 ) add("SPK-F", "Europe", "S-42 (Pulkovo 1942)","Albania","KA", 24,-130,-92, 3,3,3 ) add("SPK-G", "Europe", "S-42 (Pulkovo 1942)","Romania","KA", 28,-121,-77, 3,5,3 ) add("CCD", "Europe", "S-JTSK","Czechoslavakia (Prior 1 Jan 1993)","BR",589,76,480, 4,2,3 ) # ----------------- NORTH AMERICA -------------------------------- add("CAC", "North America", "Cape Canaveral","mean Bahamas & Florida","CC",-2,151,181, 3,3,3 ) gdt_datum_ptab["NAD27"] := add("NAS-C", "North America", "North American 1927","mean CONUS","CC",-8,160,176, 5,5,6 ) add("NAS-B", "North America", "North American 1927","mean West CONUS","CC",-8,159,175, 5,3,3 ) add("NAS-A", "North America", "North American 1927","mean East CONUS","CC",-9,161,179, 5,5,8 ) add("NAS-D", "North America", "North American 1927","Alaska (minus Aleutian Islands)","CC", -5,135,172, 5,9,5 ) add("NAS-V", "North America", "North American 1927","Aleutian Islands East of 180W","CC", -2,152,149, 6,8,10 ) add("NAS-W", "North America", "North American 1927","Aleutian Islands West of 180W","CC", 2,204,105, 10,10,10 ) add("NAS-Q", "North America", "North American 1927","Bahamas (minus San Salvador Island)","CC", -4,154,178, 5,3,5 ) add("NAS-R", "North America", "North American 1927","San Salvador Island","CC",1,140,165, 25,25,25 ) add("NAS-E", "North America", "North American 1927","mean Canada","CC",-10,158,187, 15,11,6 ) add("NAS-F", "North America", "North American 1927","Albert & British Columbia (Canada)","CC", -7,162,188, 8,8,6 ) add("NAS-G", "North America", "North American 1927","Eastern Canada","CC",-22,160,190, 6,6,3 ) add("NAS-H", "North America", "North American 1927","Manitoba & Ontario (Canada)","CC",-9,157,184, 9,5,5 ) add("NAS-I", "North America", "North American 1927","Northwest Territories & Saskatchewan (Canada)","CC", 4,159,188, 5,5,3 ) add("NAS-J", "North America", "North American 1927","Yukon (Canada)","CC",-7,139,181, 5,8,3 ) add("NAS-O", "North America", "North American 1927","Canal Zone","CC",0,125,201, 20,20,20 ) add("NAS-P", "North America", "North American 1927","mean Caribbean","CC",-3,142,183, 3,9,12 ) add("NAS-N", "North America", "North American 1927","mean Central America","CC",0,125,194, 8,3,5 ) add("NAS-T", "North America", "North American 1927","Cuba","CC", -9,152,178, 25,25,25 ) add("NAS-U", "North America", "North American 1927","Greenland (Hayes Peninsula)","CC",11,114,195, 25,25,25 ) add("NAS-L", "North America", "North American 1927","Mexico","CC", -12,130,190, 8,6,6 ) add("NAR-A", "North America", "North American 1983","Alaska (minus Aleutian Islands)","RF",0,0,0, 2,2,2 ) add("NAR-E", "North America", "North American 1983","Aleutian Islands","RF",-2,0,4, 5,2,5 ) add("NAR-B", "North America", "North American 1983","Canada","RF", 0,0,0, 2,2,2 ) gdt_datum_ptab["NAD83"] := add("NAR-C", "North America", "North American 1983","CONUS","RF", 0,0,0, 2,2,2 ) add("NAR-H", "North America", "North American 1983","Hawaii","RF", 1,1,-1, 2,2,2 ) add("NAR-D", "North America", "North American 1983","Mexico & Central America","RF",0,0,0, 2,2,2 ) # ----------------- SOUTH AMERICA -------------------------------- add("BOO", "South America", "Bogota Observatory","Colombia","IN", 307,304,-318, 6,5,6 ) add("CAI", "South America", "Campo Inchauspe 1969","Argentina","IN",-148,136,90, 5,5,5 ) add("CHU", "South America", "Chua Astro","Paraguay","IN", -134,229,-29, 6,9,5 ) add("COA", "South America", "Corrego Alegre","Brazil","IN", -206,172,-6, 5,3,5 ) add("PRP-M", "South America", "Provisional South American 1956","mean","IN",-288,175,-376, 17,27,27 ) add("PRP-A", "South America", "Provisional South American 1956","Bolivia","IN",-270,188,-388, 5,11,14 ) add("PRP-B", "South America", "Provisional South American 1956","Northern Chile","IN", -270,183,-390, 25,25,25 ) add("PRP-C", "South America", "Provisional South American 1956","Southern Chile","IN", -305,243,-442, 20,20,20 ) add("PRP-D", "South America", "Provisional South American 1956","Colombia","IN",-282,169,-371, 15,15,15 ) add("PRP-E", "South America", "Provisional South American 1956","Ecuador","IN",-278,171,-367, 3,5,3 ) add("PRP-F", "South America", "Provisional South American 1956","Guyana","IN",-298,159,-369, 6,14,5 ) add("PRP-G", "South America", "Provisional South American 1956","Peru","IN",-279,175,-379, 6,8,12 ) add("PRP-H", "South America", "Provisional South American 1956","Venezuela","IN",-295,173,-371, 9,14,15 ) add("HIT", "South America", "Provisional South Chilean 1963","Southern Chile","IN",16,196,93, 25,25,25 ) add("SAN-M", "South America", "South American 1969","mean","SA", -57,1,-41, 15,6,9 ) add("SAN-A", "South America", "South American 1969","Argentina","SA", -62,-1,-37, 5,5,5 ) add("SAN-B", "South America", "South American 1969","Bolivia","SA", -61,2,-48, 15,15,15 ) add("SAN-C", "South America", "South American 1969","Brazil","SA", -60,-2,-41, 3,5,5 ) add("SAN-D", "South America", "South American 1969","Chile","SA", -75,-1,-44, 15,8,11 ) add("SAN-E", "South America", "South American 1969","Colombia","SA", -44,6,-36, 6,6,5 ) add("SAN-F", "South America", "South American 1969","Ecuador (minus Galapagos Islands)","SA", -48,3,-44, 3,3,3 ) add("SAN-J", "South America", "South American 1969","Baltra & Galapagos Islands (Ecuador)","SA", -47,26,-42, 25,25,25 ) add("SAN-G", "South America", "South American 1969","Guyana","SA", -53,3,-47, 9,5,5 ) add("SAN-H", "South America", "South American 1969","Paraguay","SA", -61,2,-33, 15,15,15 ) add("SAN-I", "South America", "South American 1969","Peru","SA", -58,0,-44, 5,5,5 ) add("SAN-K", "South America", "South American 1969","Trinidad & Tobago","SA",-45,12,-33, 25,25,25 ) add("SAN-L", "South America", "South American 1969","Venezuela","SA", -45,8,-33, 3,6,3 ) add("SIR", "South America", "South American Geocentric Reference System (SIRGAS)","South America","RF", 0,0,0, 1,1,1 ) add("ZAN", "South America", "Zanderij","Suriname","IN", -265,120,-358, 5,5,8 ) # ----------------- ATLANTIC OCEAN -------------------------------- add("AIA", "Atlantic Ocean", "Antigua Island Astro 1943","Antigua & Leeward Islands","CD", -270,13,62, 25,25,25 ) add("ASC", "Atlantic Ocean", "Ascension Island 1958","Ascension Island","IN",-205,107,53, 25,25,25 ) add("SHB", "Atlantic Ocean", "Astro DOS 71/4","St Helena Island","IN",-320,550,-494, 25,25,25 ) add("BER", "Atlantic Ocean", "Bermuda 1957","Bermuda","CC", -73,213,296, 20,20,20 ) add("DID", "Atlantic Ocean", "Deception Island","Deception Island & Antarctica","CD",260,12,-147, 20,20,20 ) add("FOT", "Atlantic Ocean", "Fort Thomas 1955","Nevis & St. Kitts & Leeward Islands","CD", -7,215,225, 25,25,25 ) add("GRA", "Atlantic Ocean", "Graciosa Base SW 1948", "Faial & Graciosa & Pico & Sao Jorge & Terceira Islands (Azores)","IN", -104,167,-38, 3,3,3 ) add("ISG", "Atlantic Ocean", "ISTS 061 Astro 1968","South Georgia Island","IN",-794,119,-298, 25,25,25 ) add("LCF", "Atlantic Ocean", "L. C. 5 Astro 1961","Cayman Brac Island","CC",42,124,147, 25,25,25 ) add("ASM", "Atlantic Ocean", "Montserrat Island Astro 1958","Montserrat & Leeward Islands","CD", 174,359,365, 25,25,25 ) add("NAP", "Atlantic Ocean", "Naparima BWI","Trinidad & Tobago","IN",-10,375,165, 15,15,15 ) add("FLO", "Atlantic Ocean", "Observatorio Meteorologico 1939","Corvo & Flores Islands (Azores)","IN", -425,-169,81, 20,20,20 ) add("PLN", "Atlantic Ocean", "Pico de las Nieves","Canary Islands","IN",-307,-92,127, 25,25,25 ) add("POS", "Atlantic Ocean", "Porto Santo 1936","Porto Santo & Madeira Islands","IN",-499,-249,314, 25,25,25 ) add("PUR", "Atlantic Ocean", "Puerto Rico","Puerto Rico & Virgin Islands","CC",11,72,-101, 3,3,3 ) add("QUO", "Atlantic Ocean", "Qornoq","South Greenland","IN", 164,138,-189, 25,25,32 ) add("SAO", "Atlantic Ocean", "Sao Braz","Sao Miguel & Santa Maria Islands","IN",-203,141,53, 25,25,25 ) add("SAP", "Atlantic Ocean", "Sapper Hill 1943","East Falkland Island","IN",-355,21,72, 1,1,1 ) add("SGM", "Atlantic Ocean", "Selvagem Grande 1938","Salvage Islands","IN",-289,-124,60, 25,25,25 ) add("TDC", "Atlantic Ocean", "Tristan Astro 1968","Tristan da Cunha","IN",-632,438,-609, 25,25,25 ) # ----------------- INDIAN OCEAN -------------------------------- add("ANO", "Indian Ocean", "Anna 1 Astro 1965","Cocos Islands","AN",-491,-22,435, 25,25,25 ) add("GAA", "Indian Ocean", "Gan 1970","Republic of Maldives","IN", -133,-321,50, 25,25,25 ) add("IST", "Indian Ocean", "ISTS 073 Astro 1969","Diego Garcia","IN",208,-435,-229, 25,25,25 ) add("KEG", "Indian Ocean", "Kerguelen Island 1949","Kerguelen Island","IN",145,-187,103, 25,25,25 ) add("MIK", "Indian Ocean", "Mahe 1971","Mahe Island","CD", 41,-220,-134, 25,25,25 ) add("REU", "Indian Ocean", "Reunion","Mascarene Islands","IN", 94,-948,-1262, 25,25,25 ) # ----------------- PACIFIC OCEAN -------------------------------- add("AMA", "Pacific Ocean", "American Samoa 1962","American Samoa Islands","CC",-115,118,426, 25,25,25 ) add("ATF", "Pacific Ocean", "Astro Beacon E 1945","Iwo Jima","IN", 145,75,-272, 25,25,25 ) add("TRN", "Pacific Ocean", "Astro Tern Island (FRIG) 1961","Tern Island","IN",114,-116,-333, 25,25,25 ) add("ASQ", "Pacific Ocean", "Astronomical Station 1952","Marcus Island","IN",124,-234,-25, 25,25,25 ) add("IBE", "Pacific Ocean", "Bellevue (IGN)","Efate & Erromango Islands","IN",-127,-769,472, 20,20,20 ) add("CAO", "Pacific Ocean", "Canton Astro 1966","Phoenix Islands","IN",298,-304,-375, 15,15,15 ) add("CHI", "Pacific Ocean", "Chatham Island Astro 1971","Chatham Island (New Zealand)","IN", 175,-38,113, 15,15,15 ) add("GIZ", "Pacific Ocean", "DOS 1968","Gizo Island (New Georgia Islands)","IN",230,-199,-752, 25,25,25 ) add("EAS", "Pacific Ocean", "Easter Island 1967","Easter Island","IN",211,147,111, 25,25,25 ) add("GEO", "Pacific Ocean", "Geodetic Datum 1949","New Zealand","IN",84,-22,209, 5,3,5 ) add("GUA", "Pacific Ocean", "Guam 1963","Guam","CC", -100,-248,259, 3,3,3 ) add("DOB", "Pacific Ocean", "GUX 1 Astro","Guadalcanal Island","IN",252,-209,-751, 25,25,25 ) add("JOH", "Pacific Ocean", "Johnston Island 1961","Johnston Island","IN",189,-79,-202, 25,25,25 ) add("KUS", "Pacific Ocean", "Kusaie Astro 1951","Caroline Islands & Fed. States of Micronesia","IN", 647,1777,-1124, 25,25,25 ) add("LUZ-A", "Pacific Ocean", "Luzon","Philippines (minus Mindanao Island)","CC",-133,-77,-51, 8,11,9 ) add("LUZ-B", "Pacific Ocean", "Luzon","Mindanao Island (Philippines)","CC",-133,-79,-72, 25,25,25 ) add("MID", "Pacific Ocean", "Midway Astro 1961","Midway Islands","IN",912,-58,1227, 25,25,25 ) add("OHA-M", "Pacific Ocean", "Old Hawaiian","mean","CC", 61,-285,-181, 25,20,20 ) add("OHA-A", "Pacific Ocean", "Old Hawaiian","Hawaii","CC", 89,-279,-183, 25,25,25 ) add("OHA-B", "Pacific Ocean", "Old Hawaiian","Kauai","CC", 45,-290,-172, 20,20,20 ) add("OHA-C", "Pacific Ocean", "Old Hawaiian","Maui","CC", 65,-290,-190, 25,25,25 ) add("OHA-D", "Pacific Ocean", "Old Hawaiian","Oahu","CC", 58,-283,-182, 10,6,6 ) add("OHI-M", "Pacific Ocean", "Old Hawaiian Int","mean","IN", 201,-228,-346, 25,20,20 ) add("OHI-A", "Pacific Ocean", "Old Hawaiian Int","Hawaii","IN", 229,-222,-348, 25,25,25 ) add("OHI-B", "Pacific Ocean", "Old Hawaiian Int","Kauai","IN", 185,-233,-337, 20,20,20 ) add("OHI-C", "Pacific Ocean", "Old Hawaiian Int","Maui","IN", 205,-233,-355, 25,25,25 ) add("OHI-D", "Pacific Ocean", "Old Hawaiian Int","Oahu","IN", 198,-226,-347, 10,6,6 ) add("PIT", "Pacific Ocean", "Pitcairn Astro 1967","Pitcairn Island","IN",185,165,42, 25,25,25 ) add("SAE", "Pacific Ocean", "Santo (DOS) 1965","Espirito Santo Island","IN",170,42,84, 25,25,25 ) add("MVS", "Pacific Ocean", "Viti Levu 1916","Viti Levu Island (Fiji Islands)","CD",51,391,-36, 25,25,25 ) add("ENW", "Pacific Ocean", "Wake-Eniwetok 1960","Marshall Islands","HO",102,52,-38, 3,3,3 ) add("WAK", "Pacific Ocean", "Wake Island Astro 1952","Wake Atoll","IN",276,-57,149, 25,25,25 ) # ----------------- WORLD-WIDE DATUM ---------------------------- gdt_datum_ptab["WGS66"] := add("W66", "World-wide Datum", "WGS 1966","Global Definition I","WB", 0,0,0, 0,0,0 ) gdt_datum_ptab["WGS72"] := add("W72", "World-wide Datum", "WGS 1972","Global Definition I","WD", 0,0,0, 3,3,3 ) gdt_datum_ptab["WGS84"] := add("W84", "World-wide Datum", "WGS 1984","Global Definition II","WE", 0,0,0, 0,0,0 ) # ----------------- MISC. NON-SATELLITE DERIVED ---------------------------- # Error bounds of zero mean unknown error. add("BUR", "Misc. Non-satellite derived", "Bukit Rimpah","Bangka & Belitung Islands (Indonesia)","BR",-384,664,-48, 0,0,0 ) add("CAZ", "Misc. Non-satellite derived", "Camp Area Astro","Camp McMurdo Area (Antarctica)","IN",-104,-129,239, 0,0,0 ) add("EUR-S", "Misc. Non-satellite derived", "European 1950","mean Near East","IN", -103,-106,-141, 0,0,0 ) add("GSE", "Misc. Non-satellite derived", "Gunung Segara","Kalimantan (Indonesia)","BR",-403,684,41, 0,0,0 ) add("HEN", "Misc. Non-satellite derived", "Herat North","Afghanistan","IN", -333,-222,114, 0,0,0 ) add("HER", "Misc. Non-satellite derived", "Hermannskogel", "Yugoslavia (Prior to 1990) Slovenia & Croatia & Bosnia & Herzegovina & Serbia", "BN", 682,-203,480, 0,0,0 ) add("IND-P", "Misc. Non-satellite derived", "Indian","Pakistan","EF", 283,682,231, 0,0,0 ) add("PUK", "Misc. Non-satellite derived", "Pulkovo 1942","Russia","KA", 28,-130,-95, 0,0,0 ) add("TAN", "Misc. Non-satellite derived", "Tananarive Observatory 1925","Madagascar","IN",-189,-242,-91, 0,0,0 ) add("VOI", "Misc. Non-satellite derived", "Voirol 1874","Tunisia & Algeria","CD", -73,-247,227,0,0,0 ) add("YAC", "Misc. Non-satellite derived", "Yacare","Uruguay","IN", -155,171,37, 0,0,0 ) return end icon-9.4.3/ipl/procs/numbers.icn0000664000175000017500000003245407311036343016073 0ustar chrishchrish############################################################################ # # File: numbers.icn # # Subject: Procedures related to numbers # # Author: Ralph E. Griswold # # Date: June 10, 2001 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # Contributors: Robert J. Alexander, Richard Goerwitz # Tim Korb, and Gregg M. Townsend # ############################################################################ # # These procedures deal with numbers in various ways: # # adp(i) additive digital persistence of i # # adr(i) additive digital root of i (same as digred()) # # amean ! L returns arithmetic mean of numbers in L. # # ceil(r) returns nearest integer to r away from 0. # # commas(s) inserts commas in s to separate digits into groups of # three. # # decimal(i, j) decimal expansion of i / j; terminates when expansion # terminates or the end of a recurring period is reached. # The format of the returned value is ., # where is a string a decimal digits if the # expansion is finite but
[] if it
#			is not, where 
 is a string of decimal digits
#			(possibly empty) before the recurring part.
#
#	decipos(r, i, j)
#			positions decimal point at i in real number r in
#			field of width j.
#
#	digprod(i)	product of digits of i
#
#	digred(i)	reduction of number by adding digits until one digit is
#			reached.
#
#	digroot(i)	same as digred().
#
#	digsum(i)	sum of digits in i.
#
#	distseq(i, j)	generates i to j in distributed order.
#
#	div(i, j)	produces the result of real division of i by j.
#
#	fix(i, j, w, d)	formats i / j as a real (floating-point) number in
#			a field of width w with d digits to the right of
#			the decimal point, if possible. j defaults to 1,
#			w to 8, and d to 3. If w is less than 3 it is set
#			to 3. If d is less than 1, it is set to 1. The
#			function fails if j is 0 or if the number cannot
#			be formatted.
#
# 	floor(r)	nearest integer to r toward 0.
#
#	frn(r, w, d)    format real number r into a string with d digits
#			after the decimal point; a result narrower than w
#			characters is padded on the left with spaces.
#			Fixed format is always used; there is no exponential
#			notation.  Defaults:  w 0, d  0
#
#	gcd(i, j)	returns greatest common divisor of i and j.
#
#	gcdl ! L	returns the greatest common division of the integers
#			list L.
#
#	gmean ! L	returns geometric mean of numbers in L.
#
#	hmean ! L	returns harmonic mean of numbers in L.
#
#	large(i)	succeeds if i is a large integer but fails otherwise.
#
#	lcm(i, j)	returns the least common multiple of i and j.
#
#	lcml ! L	returns the least common multiple of the integers
#			in the list L.
#
#	mantissa(r)	mantissa (fractional part) of r.
#
#	max ! L		produces maximum of numbers in L.
#
#	mdp(i)		multiplicative digital persistence of i
#
#	mdr(i)		multiplicative digital root of i
#
#	min ! L		produces minimum of numbers in L.	
#
#	mod1(i, m)	residue for 1-based indexing.
#
#	npalins(n)	generates palindromic n-digit numbers.
#
#	residue(i, m, j)
#			residue for j-based indexing.
#
#	roman(i)	converts i to Roman numerals.
#
#	round(r)	returns nearest integer to r.
#
#	sigma(i)	synonym for digroot(i)
#
#	sign(r)		returns sign of r.
#
#	spell(i)	spells out i in English.
#
#	sum ! L		sum of numbers in list L
#
#	trunc(r)	returns nearest integer to r toward 0
#
#	unroman(s)	converts Roman numerals to integers.
#
############################################################################
#
#	Links:  factors, strings
#	
############################################################################

link factors
link strings

procedure adp(i)		#: additive digital persistence
   local j

   j := 0

   until *i = 1 do {
      i := digsum(i)
      j +:= 1
      }

   return j

end

procedure adr(i)		#: additive digital root

   until *i = 1 do
      i := digsum(i)

   return i

end

procedure amean(L[])		#: arithmetic mean
   local m

   if *L = 0 then fail

   m := 0.0
   every m +:= !L

   return m / *L

end

procedure ceil(r)		#: ceiling

   if integer(r) = r then return integer(r)

   if r > 0 then return integer(r) + 1 else return -(integer(-r) + 1)

end

procedure commas(s)		#: insert commas in number

   local s2, sign

   # Don't bother if s is already comma-ized.
   if type(s) == "string" & find(",",  s) then fail

   # Take sign.  Save chars after the decimal point (if present).
   if s := abs(0 > s)
   then sign := "-" else sign := ""
   s ? {
      s := tab(find(".")) & ="." &
      not pos(0) & s2 := "." || tab(0)
      }

   /s2 := ""
   integer(s) ? {
      tab(0)
      while s2 := "," || move(-3) || s2
      if pos(1)
      then s2 ?:= (move(1), tab(0))
      else s2 := tab(1) || s2
      }

   return sign || s2

end

procedure decimal(i, j)		#: decimal expansion of rational
   local head, tail, numers, count

   head := (i / j) || "."
   tail := ""
   numers := table()

   i %:= j
   count := 0

   while i > 0 do {
      numers[i] := count
      i *:= 10
      tail ||:= i / j
      i %:= j
      if \numers[i] then	# been here; done that
	 return head || (tail ? (move(numers[i]) || "[" || tab(0) || "]"))
      count +:= 1
      }

   return head || tail

end

procedure decipos(r, i, j)	#: position decimal point
   local head, tail

   /i := 3
   /j := 5

   r := real(r) | stop("*** non-numeric in decipos()")

   if i < 1 then fail

   r ? {
      head := tab(upto('.eE')) | fail
      move(1)
      tail := tab(0)
      return left(right(head, i - 1) || "." || tail, j)
      }

end

procedure digred(i)		#: sum digits of integer repeated to one digit

   digred := digroot

   return digred(i)

end

procedure digroot(i)		#: digital root

   if i = 0 then return 1

   i %:= 9
   
   return if i = 0 then 9 else i

end

procedure digprod(i)		#: product of digits
   local j

   if upto('0', i) then return 0

   else j := 1

   every j *:= !i

   return j

end

procedure digsum(i)		#: sum of digits
   local j

   i := integer(i) | fail

   repeat {
      j := 0
      every j +:= !i
      suspend j
      if *j > 1 then i := j else fail
      }

end

#  distseq() generates a range of integers in a deterministic order that is
#  "most uniformly distributed" in Knuth's terminology (vol3, 1/e, p. 511).
#  Each integer in the range is produced exactly once.

procedure distseq(low, high)		#: generate low to high nonsequentially
   local n, start, incr, range

   low := integer(low) | runerr(101, low)
   high := integer(high) | runerr(101, high)
   if low > high then fail
   range := high - low + 1
   start := n := range / 2

   suspend low + n

   incr := integer(range / &phi ^ 2 + 0.5)
   if incr <= 1 then 
      incr := 1
   else while gcd(incr, range) > 1 do
      incr +:= 1

   repeat {
      n := (n + incr) % range
      if n = start then fail
      suspend low + n
      }

end

procedure div(i, j)		#: real division

   return i / real(j)

end

procedure fix(i, j, w, d)	#: format real number
   local r, int, dec, sign

   /j := 1
   /w := 8
   /d := 3
   if j = 0 then fail
   w <:= 3
   d <:= 1
   r := real(i) / j
   if r < 0 then {
      r  := -r
      sign := "-"
      }
   else sign:=""

   int := dec := "0"  # prepare for small number

   if not(r < ("0." || repl("0", d - 1) || "1")) then { # formats as zero
      string(r) ? {
         if upto('eE') then fail # can't format
         if int := tab(find(".")) then {
            move(1)
            dec := tab(0)
            }
         }
      }

   return right(sign || int || "." || left(dec, d, "0"), w)
end

procedure floor(r)		#: floor

   if r > 0 then return integer(r) else return -integer(-r)

end

$define MAXDECIMALS 25

procedure frn(r, w, d)		#: format real number

   local s
   static mlist
   initial every put(mlist := list(), 10.0 ^ (0 to MAXDECIMALS))

   r := real(r) | runerr(102, r)
   (/d := 0) | (d >:= MAXDECIMALS)
   if r >= 0.0 then {
      s := string(integer(r * mlist[d + 1] + 0.5))
      s := right(s, *s < d + 1, "0")
      }
   else {
      s := string(integer(-r * mlist[d + 1] + 0.5))
      s := right(s, *s < d + 1, "0")
      s := "-" || s
      }
   s := right(s, *s < (\w - 1))

   return s ? (tab(-d) || "." || tab(0))

end

procedure gcd(i,j)		#: greatest common divisor
   local r

   if (i | j) < 1 then runerr(501)

   repeat {
      r := i % j
      if r = 0 then return j
      i := j
      j := r
      }
end

procedure gcdl(L[])		#: greatest common divisor of list
   local i, j

   i := get(L) | fail

   while j := get(L) do
      i := gcd(i, j)

   return i

end
   
procedure gmean(L[])		#: geometric mean
   local m

   if *L = 0 then fail

   m := 1.0
   every m *:= !L
   m := abs(m)
   if m > 0.0 then
      return exp (log(m) / *L)
   else
      fail
end
   
procedure hmean(L[])		#: harmonic mean
   local m, r

   if *L = 0 then fail

   m := 0.0

   every r := !L do {
      if r = 0.0 then fail
      else m +:= 1.0 / r
      }

   return *L / m

end

#
#  At the source-language level, "native" integers and "large"
#  integers have the same type, "integer".  The creation of a large
#  integer causes storage allocation, which this procedure detects.
#

procedure large(i)		#: detect large integers
   local mem

   mem := &allocated
   i +:= 0
   if &allocated > mem then return i
   else fail

end

procedure lcm(i, j)		#: least common multiple

   if (i =  0) | (j = 0) then return 0	# ???

   return abs(i * j) / gcd(i, j)

end

procedure lcml(L[])		#: least common multiple of list
   local i, j

   i := get(L) | fail

   while j := get(L) do
      i := lcm(i, j)

   return i

end

procedure mantissa(r)		#: mantissa (fractional part)
   local fpart

   r := real(r)

   fpart := r - floor(r)

   fpart ?:= {
      tab(upto('.') + 1)
      tab(0)
      }

   fpart ? {
      if fpart := tab(upto('Ee')) then {
         move(1)
         if = "+" then fpart := "0"
         else {
            move(1)
            fpart := repl("0", tab(0) - 1) || fpart
            }
         }
      }

   return "." || fpart

end

procedure max(values[])		#: maximum value
   local maximum

   maximum := get(values) | fail
   every maximum <:= !values

   return maximum

end

procedure mdp(i)		#: multiplicative digital persistence
   local j

   j := 0

   until *i = 1 do {
      i := digprod(i)
      j +:= 1
      }

   return j

end

procedure mdr(i)		#: multiplicative digital root

   until *i = 1 do
      i := digprod(i)

   return i

end

procedure min(values[])		#: minimum value
   local minimum

   minimum := get(values) | fail
   every minimum >:= !values

   return minimum

end

procedure mod1(i, m)		#: modulus for 1-based integers

   i %:= m

   if i < 1 then i +:= m

   return i

end

procedure npalins(n)		#: palindromic numbers
   local i

   every i := palins(&digits, n) do
      if i[1] ~== "0" then suspend i	# can't start with zero

end

procedure residue(i, m, j)		#: residue for j-based integers

   /j := 0

   i %:= m

   if i < j then i +:= m

   return i

end

#  This procedure is based on a SNOBOL4 function written by Jim Gimpel.
#
procedure roman(n)		#: convert integer to Roman numeral
   local arabic, result
   static equiv

   initial equiv := ["","I","II","III","IV","V","VI","VII","VIII","IX"]

   integer(n) > 0 | fail
   result := ""
   every arabic := !n do
      result := map(result,"IVXLCDM","XLCDM**") || equiv[arabic + 1]
   if find("*",result) then fail else return result

end

procedure round(r)		#: round real

   if r > 0 then return integer(r + 0.5) else return -integer(0.5 - r)

end

procedure sigma(i)		#: synonym for digroot()

   sigma := digroot

   return sigma(i)

end

procedure sign(r)		#: sign

   if r = 0 then return 0
   else if r < 0 then return -1
   else return 1

end

procedure spell(n)		#: spell out integer
   local m

   n := integer(n) | stop(image(n)," is not an integer")
   if n <= 12 then return {
      "0zero,1one,2two,3three,4four,5five,6six,7seven,8eight,_
         9nine,10ten,11eleven,12twelve," ? {
            tab(find(n))
            move(*n)
            tab(find(","))
            }
      }
   else if n <= 19 then return {
      spell(n[2] || "0") ?
         (if ="for" then "four" else tab(find("ty"))) || "teen"
      }
   else if n <= 99 then return {
      "2twen,3thir,4for,5fif,6six,7seven,8eigh,9nine," ? {
         tab(find(n[1]))
         move(1)
         tab(find(",")) || "ty" ||
            (if n[2] ~= 0 then "-" || spell(n[2]) else "")
         }
      }
   else if n <= 999 then return {
      spell(n[1]) || " hundred" ||
         (if (m := n[2:0]) ~= 0 then " and " || spell(m) else "")
      }
   else if n <= 999999 then return {
      spell(n[1:-3]) || " thousand" ||
         (if (m := n[2:0]) ~= 0 then " and " || spell(m) else "")
      }
   else if n <= 999999999 then return {
      spell(n[1:-6]) || " million" ||
         (if (m := n[2:0]) ~= 0 then " and " || spell(m) else "")
      }
   else fail

end

procedure sum(values[])		#: sum of numbers
   local result

   result := 0

   every result +:= !values

   return result

end

procedure trunc(r)		#: truncate real

   return integer(r)

end

procedure unroman(s)		#: convert Roman numeral to integer
   local nbr,lastVal,val

   nbr := lastVal := 0

   s ? {
      while val := case map(move(1)) of {
	 "m": 1000
	 "d": 500
	 "c": 100
	 "l": 50
	 "x": 10
	 "v": 5
	 "i": 1
	 } do {
	 nbr +:= if val <= lastVal then val else val - 2 * lastVal
	 lastVal := val
	 }
      }
   return nbr

end
icon-9.4.3/ipl/procs/vrml1lib.icn0000664000175000017500000000625507140713037016152 0ustar  chrishchrish############################################################################
#
#	File:     vrml1lib.icn
#
#	Subject:  Procedures to support construction of VRML 1.0 files
#
#	Author:   Ralph E. Griswold
#
#	Date:     November 19, 1997
#
############################################################################
#
#  This file is in the public domain.
#
############################################################################
#
#  This file contains record declarations for VRML 1.0 nodes.
#
#  Note: Although VRML 1.0 allows node fields to be given in any order,
#  they must be specified in the order given in the record declarations
#  that follow.
#
#  Omitted (null-valued) fields are ignored on output.
#
#  Group nodes require list arguments for lists of nodes.
#  
############################################################################
#
#  See also:  vrml2lib.icn, vrml.icn
#
############################################################################

record AsciiText(
   string,
   spacing,
   justification,
   width
   )

record Color(
   color
   )

record Comment(
   text
   )

record Cone(
   height,
   bottomRadius,
   parts
   )

record Coordinate3(
   point
   )

record Cube(
   width,
   height,
   depth
   )

record Cylinder(
   radius,
   height,
   parts
   )

record DEF(
   name,
   node
   )

record DirectionalLight(
   on,
   intensity,
   color,
   direction
   )

record FontStyle(
   family,
   style,
   size
   )

record Group(
   list
   )

record Info(
   string
   )

record Include(
   name
   )

record IndexedFaceSet(
   coordIndex,
   materialIndex,
   normalIndex,
   textureCoordIndex
   )

record IndexedLineSet(
   coordIndex,
   materialIndex,
   normalIndex,
   textureCoordIndex
   )

record LOD(
   center,
   range
   )

record Material(
   diffuseColor,
   ambientColor,
   emissiveColor,
   shininess,
   specularColor,
   transparency
   )

record MaterialBinding(
   value
   )

record MatrixTransform(
   matrix
   )

record Normal(
   vector
   )

record NormalBinding(
   value
   )

record OrthographicCamera(
   position,
   orientation,
   focalDistance,
   height
   )

record PerspectiveCamera(
   position,
   orientation,
   focalDistance,
   heightAngle,
   nearDistance,
   farDistance
   )

record PointLight(
   on,
   location,
   radius,
   color
   )

record PointSet(
   startIndex,
   numPoints
   )

record Rotation(
   rotation
   )

record Scale(
   scaleFactor
   )

record Separator(
   list,
   renderCulling
   )

record ShapeHints(
   vertexOrdering,
   shapeType,
   faceType,
   creaseAngle
   )

record Sphere(
   radius
   )

record SpotLight(
   on,
   location,
   direction,
   intensity,
   color,
   dropOffRate,
   cutOffAngle
   )

record Switch(
   whichChild,
   children
   )

record Texture2Transform(
   translation,
   rotation,
   scaleFactor,
   center
   )
record TextureCoordinate2(
   point
   )

record Transform(
   translation,
   rotation,
   scaleFactor,
   scaleOrientation,
   center
   )

record TransformSeparator(
   children
   )

record Translation(
   translation
   )

record USE(
   name
   )

record WWWAnchor(
   name,
   description,
   map
   )

record WWWInline(
   name,
   bboxSize,
   bboxCenter
   )
icon-9.4.3/ipl/procs/digitcnt.icn0000664000175000017500000000164407140713040016216 0ustar  chrishchrish############################################################################
#
#	File:     digitcnt.icn
#
#	Subject:  Procedure to count number of digits in file
#
#	Author:   Ralph E. Griswold
#
#	Date:     July 15, 1995
#
############################################################################
#
#   This file is in the public domain.
#
############################################################################
#
#  This procedure counts the number of each digit in a file and returns
#  a ten-element list with the counts.
#
############################################################################

procedure digitcnt(file)	#: count digits in file
   local result

   /file := &input

   result := list(10, 0)

   #  If the file contains only digits, remove the # on the next line and add
   # to the following one.

#  every result[!!file + 1] +:= 1
   every result[integer(!!file) + 1] +:= 1

   return result

end
icon-9.4.3/ipl/procs/plural.icn0000664000175000017500000000350407140713037015713 0ustar  chrishchrish############################################################################
#
#	File:     plural.icn
#
#	Subject:  Procedures to produce plural of English noun
#
#	Author:   Ralph E. Griswold
#
#	Date:     July 15, 1995
#
############################################################################
#
#   This file is in the public domain.
#
############################################################################
#
#     This procedure produces the plural form of a singular English noun.
#  The procedure here is rudimentary and does not work in all cases.
#
############################################################################

procedure plural(word)		#: produce plural of word
   local lcword
   static plural_map, plural_id, plural_s

   initial {
      plural_map := table()
      plural_map["mouse"] := "mice"
      plural_map["louse"] := "lice"
      plural_map["goose"] := "geese"
      plural_map["datum"] := "data"

      plural_id := set()
      every insert(plural_id,"chassis" | "fish" | "sheep" | "semantics")

      plural_s := set()
      every insert(plural_s,"roman" | "norman" | "human" | "shaman" |
         "german" | "talisman" | "superhuman")
      }
   
   lcword := map(word)

   if member(plural_id,lcword) then return word

   if member(plural_s,lcword) then return word || "s"

   (lcword := \plural_map[lcword]) | {
      lcword ?:= {
         (tab(-3) || (match("man") & "men")) |
         (tab(-3) || (match("sis") & "ses")) |
         (tab(-2) || =("ch" | "sh" | "ss") || "es") |
         (tab(-3) || (="tus" & "ti")) |
         (tab(-2) || tab(any('cbdghmnprstvxz')) || (match("y") & "ies")) |
         (tab(-1) || tab(any('xz')) || "es") |
         (tab(0) || "s")
         }
      }

   if word ? any(&ucase) then lcword ?:= {
      map(move(1),&lcase,&ucase) || tab(0)
      }

   return lcword
         
end
icon-9.4.3/ipl/procs/noncase.icn0000664000175000017500000000254507274062401016046 0ustar  chrishchrish############################################################################
#
#	File:     noncase.icn
#
#	Subject:  Procedures for case-independent matching
#
#	Author:   Robert J. Alexander
#
#	Date:     May 2, 2001
#
############################################################################
#
#   This file is in the public domain.
#
############################################################################
#
# Kit of case-independent versions of Icon's built-in string-analysis
# procedures.
#
############################################################################

procedure c_any(c,s,i1,i2)
  return any(c_cset(c),s,i1,i2)
end

procedure c_find(s1,s2,i1,i2)
  local scanPos,endPos
  scanPos := match("",s2,i1,i2)
  endPos := many(&cset,s2,i1,i2) | scanPos
  suspend scanPos - 1 + find(map(s1),
      map((if \s2 then s2 else &subject)[scanPos:endPos]))
end

procedure c_many(c,s,i1,i2)
  return many(c_cset(c),s,i1,i2)
end

procedure c_match(s1,s2,i1,i2)
  local scanPos,endPos
  scanPos := match("",s2,i1,i2)
  endPos := scanPos + *s1
  return (map(s1) == map((if \s2 then s2 else &subject)[scanPos:endPos]),endPos)
end

procedure c_upto(c,s,i1,i2)
  suspend upto(c_cset(c),s,i1,i2)
end

procedure c_cset(c)
  static lstring,ustring
  initial {
    lstring := string(&lcase)
    ustring := string(&ucase)
  }
  return cset(map(c) || map(c,lstring,ustring))
end
icon-9.4.3/ipl/procs/bitint.icn0000664000175000017500000000176707140713036015715 0ustar  chrishchrish############################################################################
#
#	File:     bitint.icn
#
#	Subject:  Procedures to convert integers and bit strings
#
#	Author:   Ralph E. Griswold
#
#	Date:     May 25, 1994
#
############################################################################
#
#   This file is in the public domain.
#
############################################################################
#
#   int2bit(i) produces a string with the bit representation of i.
#
#   bit2int(s) produces an integer corresponding to the bit representation i.
#
############################################################################

procedure int2bit(i)
   local s, sign

   if i = 0 then return 0
   if i < 0 then {
      sign := "-"
      i := -i
      }
   else sign := ""
   s := ""
   while i > 0 do {
      s := (i % 2) || s
      i /:= 2
      }
   return sign || s
end

procedure bit2int(s)
   if s[1] == "-" then return "-" || integer("2r" || s[2:0])
   else return integer("2r" || s)
end
icon-9.4.3/ipl/procs/ximage.icn0000664000175000017500000001231307140713037015664 0ustar  chrishchrish############################################################################
#
#	File:     ximage.icn
#
#	Subject:  Procedures to produce string image of structured data
#
#	Author:   Robert J. Alexander
#
#	Date:     May 19, 1996
#
############################################################################
#
#   This file is in the public domain.
#
############################################################################
#
#  ximage(x) : s
#
#  Produces a string image of x.  ximage() differs from image() in that
#  it outputs all elements of structured data types.  The output
#  resembles Icon code and is thus familiar to Icon programmers.
#  Additionally, it indents successive structural levels in such a way
#  that it is easy to visualize the data's structure.  Note that the
#  additional arguments in the ximage procedure declaration are used for
#  passing data among recursive levels.
#
#  xdump(x1,x2,...,xn) : xn
#
#  Using ximage(), successively writes the images of x1, x2, ..., xn to
#  &errout.
#
#  Some Examples:
#
#  The following code:
#	...
#	t := table() ; t["one"] := 1 ; t["two"] := 2
#	xdump("A table",t)
#	xdump("A list",[3,1,3,[2,4,6],3,4,3,5])
#
#  Writes the following output (note that ximage() infers the
#  predominant list element value and avoids excessive output):
#
#	"A table"
#	T18 := table(&null)
#	   T18["one"] := 1
#	   T18["two"] := 2
#	"A list"
#	L25 := list(8,3)
#	   L25[2] := 1
#	   L25[4] := L24 := list(3)
#	      L24[1] := 2
#	      L24[2] := 4
#	      L24[3] := 6
#	   L25[6] := 4
#	   L25[8] := 5
#


procedure ximage(x,indent,done)		#: string image of value
   local i,s,ss,state,t,xtag,tp,sn,sz
   static tr, name

   initial name := proc("name", 0)	# REG: in case name is a global

   #
   #  If this is the outer invocation, do some initialization.
   #
   if /(state := done) then {
      tr := &trace ; &trace := 0    # postpone tracing while in here
      indent := ""
      done := table()
      }
   #
   #  Determine the type and process accordingly.
   #
   indent := (if indent == "" then "\n" else "") || indent || "   "
   ss := ""
   tp := type(x)
   s := if xtag := \done[x] then xtag else case tp of {
      #
      #  Unstructured types just return their image().
      #
      "integer": x
      "null" | "string" | "real" | "cset" | "window" |
	    "co-expression" | "file" | "procedure" | "external": image(x)
      #
      #  List.
      #
      "list": {
	 image(x) ? {
	    tab(6)
	    sn := tab(find("("))
	    sz := tab(0)
	    }
	 done[x] := xtag := "L" || sn
	 #
	 #  Figure out if there is a predominance of any object in the
	 #  list.  If so, make it the default object.
	 #
	 t := table(0)
	 every t[!x] +:= 1
	 s := [,0]
	 every t := !sort(t) do if s[2] < t[2] then s := t
	 if s[2] > *x / 3 & s[2] > 2 then {
	    s := s[1]
	    t := ximage(s,indent || "   ",done)
	    if t ? (not any('\'"') & ss := tab(find(" :="))) then
		  t := "{" || t || indent || "   " || ss || "}"
	    }
	 else s := t := &null
	 #
	 #  Output the non-defaulted elements of the list.
	 #
	 ss := ""
	 every i := 1 to *x do if x[i] ~=== s then {
	    ss ||:= indent || xtag || "[" || i || "] := " ||
		  ximage(x[i],indent,done)
	    }
	 s := tp || sz
	 s[-1:-1] := "," || \t
	 xtag || " := " || s || ss
	 }
      #
      #  Set.
      #
      "set": {
	 image(x) ? {
	    tab(5)
	    sn := tab(find("("))
	    }
	 done[x] := xtag := "S" || sn
	 every i := !sort(x) do {
	    t := ximage(i,indent || "   ",done)
	    if t ? (not any('\'"') & s := tab(find(" :="))) then
		  t := "{" || t || indent || "   " || s || "}"
	    ss ||:= indent || "insert(" || xtag || "," || t || ")"
	    }
	 xtag || " := " || "set()" || ss
	 }
      #
      #  Table.
      #
      "table": {
	 image(x) ? {
	    tab(7)
	    sn := tab(find("("))
	    }
	 done[x] := xtag := "T" || sn
	 #
	 #  Output the table elements.  This is a bit tricky, since
	 #  the subscripts might be structured, too.
	 #
	 every i := !sort(x) do {
	    t := ximage(i[1],indent || "   ",done)
	    if t ? (not any('\'"') & s := tab(find(" :="))) then
		  t := "{" || t || indent || "   " || s || "}"
	    ss ||:= indent || xtag || "[" ||
		  t || "] := " ||
		  ximage(i[2],indent,done)
	    }
	 #
	 #  Output the table, including its default value (which might
	 #  also be structured).
	 #
	 t := ximage(x[[]],indent || "   ",done)
	 if t ? (not any('\'"') & s := tab(find(" :="))) then
	       t := "{" || t || indent || "   " || s || "}"
	 xtag || " := " || "table(" || t || ")" || ss
	 }
      #
      #  Record.
      #
      default: {
	 image(x) ? {
	    move(7)
	    t := ""
	    while t ||:= tab(find("_")) || move(1)
	    t[-1] := ""
	    sn := tab(find("("))
	    }
	 done[x] := xtag := "R_" || t ||  "_" || sn
	 every i := 1 to *x do {
	    name(x[i]) ? (tab(find(".")),sn := tab(0))
	    ss ||:= indent || xtag || sn || " := " ||
		  ximage(\x[i],indent,done)
	    }
	 xtag || " := " || t || "()" || ss
	 }
      }
   #
   #  If this is the outer invocation, clean up before returning.
   #
   if /state then {
      &trace := tr                        # restore &trace
      }
   #
   #  Return the result.
   #
   return s
end


#
#  Write ximages of x1,x1,...,xn.
#
procedure xdump(x[])		#: write images of values
   every write(&errout,ximage(!x))
   return x[-1] | &null
end
icon-9.4.3/ipl/procs/argparse.icn0000664000175000017500000000161507140713036016220 0ustar  chrishchrish############################################################################
#
#	File:     argparse.icn
#
#	Subject:  Procedure to parse pseudo-command-line
#
#	Author:   Ralph E. Griswold
#
#	Date:     November 14, 1991
#
############################################################################
#
#   This file is in the public domain.
#
############################################################################
#
#  argparse(s) parses s as if it were a command line and puts the components in
#  in a list, which is returned.
#
#  At present, it does not accept any escape conventions.
#
############################################################################

procedure argparse(s)
   local arglist
   static nonblank

   initial nonblank := &cset -- ' \t\n'

   arglist := []

   s ? {
     while tab(upto(nonblank)) do
        put(arglist, tab(many(nonblank)))
     }

   return arglist

end
icon-9.4.3/ipl/procs/currency.icn0000664000175000017500000000322607140713036016246 0ustar  chrishchrish############################################################################
#
#	File:     currency.icn
#
#	Subject:  Procedures for formatting currency
#
#	Author:   Robert J. Alexander
#
#	Date:     September 21, 1993
#
############################################################################
#
#   This file is in the public domain.
#
############################################################################
#
#  currency() -- Formats "amount" in standard American currency format.
#  "amount" can be a real, integer, or numeric string.  "width" is the
#  output field width, in which the amount is right adjusted.  The
#  returned string will be longer than "width" if necessary to preserve
#  significance.  "minus" is the character string to be used for
#  negative amounts (default "-"), and is placed to the right of the
#  amount.
#
############################################################################

procedure currency(amount,width,minus,decPlaces,minDollarDigits,
      currencySign,decimalPoint,comma)
   local sign,p
   amount := real(amount) | fail
   /width := 0
   /minus := "-"
   /decPlaces := 2
   /minDollarDigits := 1
   /currencySign := "$"
   /decimalPoint := "."
   /comma := ","
   if amount < 0.0 then {
      sign := minus
      amount := -amount
      }
   else sign := repl(" ",*minus)
   amount := (integer(amount * 10.0 ^ (decPlaces + 1)) + 5)[1:-1]
   amount := right(amount,*amount < decPlaces + minDollarDigits,"0")
   p := *amount - decPlaces + 1
   amount[p:p] := decimalPoint
   while (p -:= 3) > 1 do amount[p:p] := comma
   amount := currencySign || amount || sign
   amount := right(amount,*amount < width)
   return amount
end
icon-9.4.3/ipl/procs/adjuncts.icn0000664000175000017500000000546107140717301016231 0ustar  chrishchrish############################################################################
#
#	File:     adjuncts.icn
#
#	Subject:  Procedures for gettext and idxtext
#
#	Author:   Richard L. Goerwitz
#
#	Date:     June 21, 2000
#
############################################################################
#
#   This file is in the public domain.
#
############################################################################
#
#  Version:  1.4  December 28, 1993  Phillip Lee Thomas
#                 _delimiter added to global list.
#                 OS conventions moved to Set_OS() from
#                    idxtext.icn and gettext.icn.
#  Version:  1.5  August 5, 1995 Add MS-DOS/386 to features check.
#
############################################################################
#  
#  Pretty mundane stuff.  Set_OS(), Basename(), Pathname(), Strip(), and
#     a utility for creating index filenames.
#
############################################################################
#
#  See also: gettext.icn, idxtext,icn
#
############################################################################


global _slash, _baselen, _delimiter, _OS_offset, firstline

procedure Set_OS()                   #: set global OS features

      # delimiter for indexed values      
      _delimiter := char(255)

      # Initialize filename and line termination conventions.
      # _baselen:   number of characters in filename base.
      # _OS_offset: number of characters marking newline.

      if find("UNIX"|"Amiga", &features) then {
         _slash := "/"
         _baselen := 10
         _OS_offset := 1
         }
      else if find("MS-DOS"|"MS-DOS/386"|"OS/2"|"MS Windows NT", &features) then {
         _slash := "\\"
         _baselen := 8
         _OS_offset := 2
         }
      else if find("Macintosh", &features) then {
         _slash := ":"
         _baselen := 15
         _OS_offset := 1
         }
      else stop("gettext:  OS not supported")
      return
end

procedure Basename(s)                  #: obtain base filename

   # global _slash
   s ? {
      while tab(find(_slash)+1)
      return tab(0)
      }
end


procedure Pathname(s)                  #: obtain path of filename

   local s2
   # global _slash

   s2 := ""
   s ? {
      while s2 ||:= tab(find(_slash)+1)
      return s2
      }
end


procedure getidxname(FNAME)     #: obtain index from datafile name

   #
   # Discard path component.  Cut basename down to a small enough
   # size that the OS will be able to handle addition of the ex-
   # tension ".IDX"
   #

   # global _slash, _baselen
   return right(Strip(Basename(FNAME,_slash),'.'), _baselen, "x") || ".IDX"
end


procedure Strip(s,c)                   #: remove chars from string

   local s2

   s2 := ""
   s ? {
      while s2 ||:= tab(upto(c))
         do tab(many(c))
      s2 ||:= tab(0)
      }
   return s2
end
icon-9.4.3/ipl/procs/opsyms.icn0000664000175000017500000000371007140713037015745 0ustar  chrishchrish############################################################################
#
#	File:     opsyms.icn
#
#	Subject:  Procedures to produce table to map opcodes to symbols
#
#	Author:   Ralph E. Griswold
#
#	Date:     July 10, 1992
#
############################################################################
#
#   This file is in the public domain.
#
############################################################################
#
#  opsyms() produces a table that maps virtual-machine instruction numbers
#  for operators to operator symbols.  The suffixes 1 and 2 are used
#  for symbols that have both a unary and binary meaning.
#
############################################################################

procedure opsyms()
   local opmap

   initial {
      opmap := table()

      opmap[1] := ":="
      opmap[2] := "!1"
      opmap[3] := "||"
      opmap[4] := "~"
      opmap[5] := "--"
      opmap[6] := "/1"
      opmap[7] := "==="
      opmap[8] := "**"
      opmap[9] := "|||"
      opmap[10] := "=="
      opmap[11] := ">=="
      opmap[12] := ">>"
      opmap[13] := "<=="
      opmap[14] := "<<"
      opmap[15] := "~=="
      opmap[16] := "-2"
      opmap[17] := "%"
      opmap[18] := "*2"
      opmap[19] := "-1"
      opmap[20] := "~==="
      opmap[21] := "\\1"
      opmap[22] := "/1"
      opmap[23] := "+1"
      opmap[24] := "=2"
      opmap[25] := ">="
      opmap[26] := ">"
      opmap[27] := "<="
      opmap[28] := "<"
      opmap[29] := "~="
      opmap[30] := "+2"
      opmap[31] := "^2"
      opmap[32] := "?1"
      opmap[33] := "<-"
      opmap[34] := "^1"
      opmap[35] := "<->"
      opmap[36] := "[:]"
      opmap[37] := "*1"
      opmap[38] := "[]"
      opmap[39] := ":=:"
      opmap[40] := "=1"
      opmap[41] := "..."
      opmap[42] := "++"
      opmap[43] := ".1"
      opmap[44] := "?2"
      opmap[47] := "@"
      opmap[57] := ".2"
      opmap[62] := "&"
      opmap[63] := "\\2"
      opmap[65] := "[...]"
      }

   return opmap

end
icon-9.4.3/ipl/procs/popen.icn0000664000175000017500000000403207140713037015532 0ustar  chrishchrish############################################################################
#    
#	File:     popen.icn
#	
#	Subject:  Procedures for pipes
#	
#	Author:   Ronald Florence
#
#	Date:     September 28, 1992
#
############################################################################
#
#   This file is in the public domain.
#
############################################################################
#
#	Version:  1.0
#
############################################################################
#
#  Contents:
#
#  popen(command, mode)
#	mode == "w" writes to a pipe
#	mode == "r" reads from a pipe
#
#  pclose(pipe)
#
#  On systems without real pipes (ms-dos), popen and pclose imitate
#  pipes; pclose must be called after popen.  The code should run
#  faster on ms-dos if dir in tempfile() points to a directory on a
#  virtual disk.
#
#  On systems with real pipes, popen & pclose open and close a pipe.
# 
############################################################################

global PIPE_cmd, PIPE_fname

procedure popen(cmd, mode)
  local tfn, p

  initial ("pipes" == &features) | {
    PIPE_cmd := table()
    PIPE_fname := table()
  }
  (type(PIPE_fname) ~== "table") & return open(cmd, mode || "p")
  tfn := tempfile("pipe.")
  upto('r', mode) & system(cmd || " > " || tfn)
  p := open(tfn, mode)
  PIPE_fname[p] := tfn
  upto('w', mode) & PIPE_cmd[p] := cmd
  return p
end


procedure pclose(pipe)
  local status

  (type(PIPE_fname) ~== "table") & return close(pipe)
  if \PIPE_cmd[pipe] then {
    close(pipe) 
    PIPE_cmd[pipe] ||:= " < " || PIPE_fname[pipe]
    status := system(PIPE_cmd[pipe])
  }
  else status := close(pipe)
  remove(PIPE_fname[pipe])
  PIPE_cmd[pipe] := PIPE_fname[pipe] := &null
  return status
end

	# Richard Goerwitz's ever-useful generator.

procedure tempfile(template)
  local temp_name
  static dir

  initial {
    if "UNIX" == &features then dir := "/tmp/"
    else dir := ""
  }
  every temp_name := dir || template || right(1 to 999,3,"0") do {
    close(open(temp_name)) & next
    suspend \temp_name
  }
end
icon-9.4.3/ipl/procs/signed.icn0000664000175000017500000000264407140713037015671 0ustar  chrishchrish############################################################################
#
#	File:     signed.icn
#
#	Subject:  Procedure to put bits into signed integer
#
#	Author:   Robert J. Alexander
#
#	Date:     April 2, 1990
#
############################################################################
#
#   This file is in the public domain.
#
############################################################################
#
#  signed(s,n) -- Puts raw bits of characters of string s into an
#  integer.  The value is taken as signed.
#
#  If large integers are supported, this routine will work for integers
#  of arbitrary size.
#
#  If large integers are not supported, the following are true:
#
#    If the size of s is the same as or greater than the size of an
#    integer in the Icon implementation, the result will be negative or
#    positive depending on the value of the integer's sign bit.
#
#    If the size of s is less than the size of an integer, the bytes are
#    put into the low order part of the integer, with the remaining high
#    order bytes filled with sign bits (the high order bit of the first
#    character of the string).  If the string is too large, the most
#    significant bytes will be lost.
#
#  This procedure is normally used for processing of binary data read
#  from a file.
#

procedure signed(s)
   local i
   i := if ord(s[1]) >= 128 then -1 else 0
   every i := ior(ord(!s),ishift(i,8))
   return i
end
icon-9.4.3/ipl/procs/rec2tab.icn0000664000175000017500000000161407631301746015743 0ustar  chrishchrish############################################################################
#
#	File:     rec2tab.icn
#
#	Subject:  Procedure to write record as string
#
#	Author:   Ralph E. Griswold
#
#	Date:     July 6, 2002
#
############################################################################
#
#   This file is in the public domain.
#
############################################################################
#
#  This procedure writes fields of a record as tab-separated string.
#  Carriage returns in files are converted to vertical tabs.
#  (Works for lists too.)
#
############################################################################

procedure rec2tab(rec, output)
   local i, x

   i := *rec - 1
   every i := 1 to *rec - 1 do {
      x := rec[i]
      /x := ""
      writes(output, map(x, "\n", "\v"),"\t")
      }
   write(output, map(\rec[-1], "\n", "\v")) | write(output)

   return

end
icon-9.4.3/ipl/progs/0002775000175000017500000000000010336137164013727 5ustar  chrishchrishicon-9.4.3/ipl/progs/based.icn0000664000175000017500000003350307140713041015473 0ustar  chrishchrish############################################################################
#
#	File:     based.icn
#
#	Subject:  Program to do BASIC-style editing
#
#	Author:   Chris Tenaglia
#
#	Date:     February 18, 1996
#
############################################################################
#
#   This file is in the public domain.
#
############################################################################
#
#  This program models a line editor for BASIC.
#
############################################################################

global chars,program,cmd,token,name

procedure main(param)
  local ff, old

  if find("p",map(param[1])) then ff := "\014"
                             else ff := "\e[2J\e[H"
  chars   := &cset -- '\t '
  program := list()
  name    := &null
  write("Basic Line Editor V1.3 by Tenaglia 910104.1700")
  write(&host," ",&dateline,"\n")

  repeat
    {
    writes(">")
    (cmd   := read()) | { quit() ; next }
    if cmd == "!!" then
      {
      cmd := old
      write("> ",cmd)
      }
    token := parse(cmd)
    if integer(token[1]) then
      {
      entry(token[1])
      token[1] := ""
      }
    old := cmd
#EJECT
    case map(token[1]) of
      {
      ""       : "ignore this case"
      "load"   : write(load())
      "save"   : write(save())
      "resave" : write(resave())
      "read"   : write(basread())
      "write"  : write(baswrite())                   
      "merge"  : write(merge())
      "new"    : write(new())
      "list"   : write(print())
      "renum"  : write(renum())
      "del"    : write(del())
      "dir"    : write(dir())
      "size"   : write("Buffer contains ",*program," lines.")
      "find"   : write(search())
      "cls"    : write(ff)
      "compile": write(compile())
      "build"  : write(build())
      "test"   : write(build(),run())
      "run"    : write(run())
      "ver"    : write("Basic Line Editor V1.3 by Tenaglia 910104.1700")
      "date"   : write(&host," ",&dateline)
      "time"   : write(&host," ",&dateline)
      "help"   : write(help())
      "?"      : write(help())
      "$"      : write(shell())
      "exit"   : break
      "quit"   : break
      default  : write("\007What ?")
      }
     }

  write("Returning to operating system")
  write(&host," ",&dateline)
end

procedure quit()           # allows CTRL_Z exit under VMS
  local test

  writes("QUIT! Are you sure? Y/N :")
  (test := read()) | stop("Returning to operating system\n",&host," ",&dateline)
  if map(test)[1] == "y" then stop("Returning to operating system\n",&host," ",&dateline)
  return
  end
  
#SUB LOAD, SAVE, AND RESAVE COMMANDS
#EJECT
procedure load()
  local file, in, lnum

  if not(token[2]) then
    {
    writes("_file:")
    if (file := string(read())) == "" then return
    } else file := token[2]
  lnum  := 0
  (in   := open(file)) | return ("Can't open " || file)
  name  := file
  program := []
  while put(program,((lnum+:=10) || " " || read(in))) do
    not(find("00",lnum)) | (writes("."))
  close(in)
  return ("\n" || file || " loaded.")
end

procedure save()
  local file, i, line, lnum, out, text

  if not(token[2]) then
    {
    writes("_file:")
    if (file := string(read())) == "" then return
    } else file := token[2]
  (out  := open(file,"w")) | return ("Can't open " || file)
  name  := file
  every line := !program do
    {
    i    := upto(' \t',line)
    lnum := line[1:i]
    text := line[i+1:0]
    write(out,text)
    not(find("00",lnum)) | (writes("."))
    }
  close(out)
  return ("\n" || file || " saved.")
end

procedure resave()
  local i, line, lnum, out, text

  if not(string(name)) then return("Nothing LOADed to resave.")
  (out  := open(name,"w")) | return ("Can't open " || name)
  every line := !program do
    {
    i    := upto(' \t',line)
    lnum := line[1:i]
    text := line[i+1:0]
    write(out,text)
    not(find("00",lnum)) | (writes("."))
    }
  close(out)
  return ("\n" || name || " resaved.")
end
#SUB READ, WRITE, AND MERGE COMMANDS
#EJECT
procedure basread()
  local file, in, line, lnum, test

  if not(token[2]) then
    {
    writes("_file:")
    if (file := string(read())) == "" then return
    } else file := token[2]
  lnum  := 0
  (in   := open(file)) | return ("Can't open " || file)
  name  := file
  program := []
  while line := read(in) do
    {
    test := (line[1:upto(' \t',line)]) | ""
    if integer(test) then put(program,line)
    not(find("00",(lnum+:=10))) | (writes("."))
    }
  close(in)
  return ("\n" || file || " read in.")
end

procedure baswrite()
  local file, lnum, out

  if not(token[2]) then
    {
    writes("_file:")
    if (file := string(read())) == "" then return
    } else file := token[2]
  (out  := open(file,"w")) | return ("Can't open " || file)
  name  := file ; lnum := 0
  every write(out,!program) do
    not(find("00",(lnum+:=10))) | (writes("."))
  close(out)
  return ("\n" || file || " writen out.")
end

procedure merge()
  local file, i, in, line, lnum

  if not(token[2]) then
    {
    writes("_file:")
    if (file := string(read())) == "" then return
    } else file := token[2]                    
  (in  := open(file)) | return ("Can't open " || file)
  every line := !in do
    {
    (lnum := integer(line[1:(i:=upto(' \t',line))])) | next
    cmd   := line
    entry(lnum)
    not(find("00",lnum)) | writes(".")
    }
  close(in)
  return (file || " merged in current buffer.")
end
#SUB DIR, DEL, AND NEW COMMANDS
#EJECT   
procedure dir()
  local spec

  spec  := (token[2]) | ("")
  if &host == "MS-DOS" then
    {
    system(("dir/w " || spec))
    return ""
    }
  if find("nix",map(&host)) then
   system(("ls -l " || spec || " | more")) else
   system(("dir " || spec))
  return ""
end

procedure del()
  local From, To, element, lnum, num, other

  if (From := integer(token[2])) & (To := integer(token[3])) then
    {
    other := []
    every element := !program do
      {
      lnum := element[1:upto(' \t',element)]
      if (lnum >= From) & (lnum <= To) then next
      put(other,element)
      }
    program := copy(other)
    return ("Lines " || From || " - " || To || " deleted.")
    }

  if not(num := integer(token[2])) then
    {
    writes("_line:")
    (num := integer(read())) | (return ("Not a line number."))
    }
  other := []
  every element := !program do
    {
    lnum := element[1:upto(' \t',element)]
    if lnum = num then next
    put(other,element)
    }
  program := copy(other)
  return ("Line " || num || " deleted.")
end

procedure new()                 
  program := []
  name    := &null
  return ("Buffer cleared.")
end
#SUB FIND COMMAND
#EJECT
procedure search()
  local From, To, delta, diff, i, item, j, k, l, line, lnum

  if (From := token[2]) & (To := token[3]) then
    {
    diff    := (*token[3]) - (*token[2])
    every i := 1 to *program do
      {
      line := program[i]
      l    := upto(' \t',line) + 1
      delta:= 0
      every j := find(From,line,l) do
        {
        k := j + delta
        line[k+:*From]      := ""
        line[((k-1)|(1))] ||:= To
        delta +:= diff
        writes(".")
        }
      program[i] := line
      }
    return ""
    }

  if not(item := token[2]) then
    {
    writes("_string:")
    if (item := read()) == "" then return ""
    }
  every i := 1 to *program do
    {
    line := program[i]
    l    := upto(' \t',line) + 1
    if find(item,line,l) then
      {
      lnum := line[1:l-1]
      writes(lnum,",")
      }
    }
  return ""
end
#SUB COMPILATION AND RUNNING ROUTINES
#EJECT
procedure compile()       # compile only
  local fid, opt
  local i, ext, command, val

  find(".",name) | return "Can't compile! Language &or Filename not recognized"
  i   := last(".",name)               
  fid := map(name[1:i])
  ext := map(name[i:0])
  command := case ext of
    {
    ".icn" : "icont -c " || name
    ".c"   : "cc " || opt || " " || name
    ".f"   : "f77 "|| opt || " " || name
    ".asm" : "asm "|| opt || " " || name
    ".p"   : "pc " || opt || " " || name
    ".for" : "fortran " || name
    ".bas" : "basic "   || name
    ".cob" : "cobol "   || name
    ".mar" : "macro "   || name
    ".pas" : "pascal "  || name
    default: return "Can't compile! Language &or Filename not recognized"
    }
  write("Issuing -> ",command)
  val := system(command)
  return " Completion Status = " || val
  end

procedure build()         # compile and link
  local i, ext, command, val1, val2, fid

  find(".",name) | return "Can't compile! Language &or Filename not recognized"
  i   := last(".",name)
  fid := map(name[1:i])
  ext := map(name[i:0])
  command := case ext of
    {
    ".icn" : ["icont "   || name]
    ".c"   : ["cc "      || name]
    ".f"   : ["f77 "     || name]
    ".asm" : ["asm "     || name]
    ".p"   : ["pc "      || name]
    ".for" : ["fortran " || name, "link " || fid]
    ".bas" : ["basic "   || name, "link " || fid]
    ".cob" : ["cobol "   || name, "link " || fid]
    ".mar" : ["macro "   || name, "link " || fid]
    ".pas" : ["pascal "  || name, "link " || fid]
    default: return "Can't compile! Language &or Filename not recognized"
    }
  write("Issuing -> ",command[1])
  val1 := system(command[1])
  val2 := if *command = 2 then
    {
    write("And Issuing -> ",command[2])
    system(command[2])
    } else -1
  return " Completion status = " || val1 || " and " || val2
  end
  
procedure run()           # run built ware
  local i, ext, command, val, fid

  find(".",name) | return "Can't compile! Language &or Filename not recognized"
  i   := last(".",name)
  fid := map(name[1:i])
  ext := map(name[i:0])
  command := case ext of
    {
    ".icn" : "iconx " || fid
    ".c"   : fid
    ".f"   : fid
    ".asm" : fid
    ".p"   : fid
    ".com" : "@"    || name
    ".for" : "run " || fid       
    ".bas" : "run " || fid
    ".cob" : "run " || fid
    ".mar" : "run " || fid
    ".pas" : "run " || fid
    default: return "Can't Run ! Language &or Filename not recognized"
    }
  write("Issuing -> ",command)
  val := system(command)
  return " Completion status = " || val
  end
#SUB LIST AND RENUM COMMANDS
#EJECT
procedure print()          
  local From, To, items, line

  if *token = 1 then
    {
    every write(!program)
    return ""
    }
  if not(numeric(token[2])) then return proc_list()
  From := integer(token[2])
  To   := integer(token[3])
  if not(integer(To)) then
    {
    every line := !program do
      {
      items := parse(line)
      if items[1] > From then return ""
      if items[1] = From then
        {
        write(line)
        return ""
        }
      }
    return ""
    }
  every line := !program do
    {
    items := parse(line)
    if items[1] < From then next
    if items[1] > To   then return ""
    write(line)
    }
  return ""
end
#
procedure proc_list()
  local flag, line

  flag := 0
  every line := !program do
    {
    if find("procedure",line) & find(token[2],line) then flag := 1
    if flag = 1 then write(line)
    if (parse(line)[2] == "end") & (flag = 1) then
      {
      write("")
      flag := 0
      }
    }
  return ""
  end
#
procedure renum()
  local inc, line, lnum, other

  (lnum := integer(token[2])) | (lnum := 10)
  (inc  := integer(token[3])) | (inc  := 10)
  other := list()
  every line := !program do
    {
    line[1:upto(' \t',line)] := lnum
    put(other,line)
    not(find("00",lnum)) | (writes("."))
    lnum +:= inc
    }
  program := copy(other)
  return ("\nProgram renumbered.")
end
#SUB ON LINE HELP DISPLAY
#EJECT
procedure help()
  write("Basic Line Editor V1.3 by Tenaglia")
  write("     This editor works on the same principle as basic interpreter")
  write("     environments.  The lines are all prefixed with line numbers.")
  write("     These line numbers  are used to reference lines in the file.")
  write("     The line numbers are not written to, or read from  the file.")
  write("     This editor is designed to work on a hard copy terminal like")
  write("     a teletype or decwriter as well as a crt.")
  write("Command Summary : (parameters are space delimited)")
  write("  NEW       - erase buffer        | CLS        - clear screen or form feed")
  write("  LOAD file - load file           | SAVE file  - save file")
  write("  READ file - read w/line numbers | WRITE file - write w/line numbers")
  write("  RESAVE    - resave current file | MERGE file - insert w/line numbers")
  write("  DIR [spec]- list directory      | SIZE       - lines in editing buffer")
  write("  RENUM     - renumber the lines  | VER        - current version number")
  write("  COMPILE   - current source      | BUILD      - compile & link")
  write("  TEST      - compile,link, & run | RUN        - run last compiled")
  write("  $ - command to system (shell)   | HELP or ?  - this help screen")
  write("  TIME or DATE - displays time    | !!         - repeat last command")
  write("*---------------------------------+--------------------------------------*")
  write("  LIST or DEL [from [to]]  - list or delete line(s)")
  write("  FIND str [repl]  - find or replace string")
  return "  EXIT or QUIT     - return to operating system"
end
#SUB LINE ENTRY AND HANDY PARSER PROCEDURE
#EJECT
procedure entry(stuff)
  local element, finish, flag, lnum, other

  other  := list()
  flag   := "i"
  finish := 9999999
  every element := !program do
    {
    lnum := integer(element[1:upto(' \t',element)])
    if stuff = lnum then
      {
      put(other,cmd)
      stuff := finish
      next
      }
    if stuff < lnum then
      {                                  
      put(other,cmd)
      stuff := finish
      }
    put(other,element)
    }
  if stuff ~= finish then put(other,cmd)
  program := copy(other)
  end
            
procedure shell()
  local command
  command := cmd[find(" ",cmd):0]
  if trim(detab(command))=="" then return "No shell command"
  system(command)
  return "\nReturn to editor"
  end

procedure parse(line)
  local tokens
  tokens := []
  line ? while tab(upto(chars)) do put(tokens,tab(many(chars)))
  return tokens
  end
                                
procedure last(substr,str)
  local  i
  every  i := find(substr,str)
  return i
  end
icon-9.4.3/ipl/progs/ibar.icn0000664000175000017500000000161407140713041015330 0ustar  chrishchrish############################################################################
#
#	File:     ibar.icn
#
#	Subject:  Program to equalize comment bars in Icon programs
#
#	Author:   Ralph E. Griswold
#
#	Date:     June 8, 1994
#
############################################################################
#
#   This file is in the public domain.
#
############################################################################
#
#  This program replaces comment bars in Icon programs by bars 76 characters
#  long -- the program library standard.
#
############################################################################

procedure main()
   local bar, short_bar, line, notcom

   bar := repl("#", 76)
   short_bar := repl("#", 60)
   notcom := ~'#'

   while line := read() do
      line ? {
         if =short_bar & not(upto(notcom)) & *line ~= 76 then write(bar)
         else write(line)
         }

end
icon-9.4.3/ipl/progs/mtf3.icn0000664000175000017500000004116507140713041015271 0ustar  chrishchrish############################################################################
#
#	File:     mtf3.icn
#
#	Subject:  Program to map tar file
#
#	Author:   Richard Goerwitz
#
#	Date:     June 3, 1991
#
############################################################################
#
#   This file is in the public domain.
#
############################################################################
#
#	Version:  3.4
#
############################################################################
#
#  PURPOSE: Maps 15+ char. filenames in a tar archive to 14 chars.
#  Handles both header blocks and the archive itself.  Mtf is intended
#  to facilitate installation of tar'd archives on systems subject to
#  the System V 14-character filename limit.
#
#  USAGE:  mtf inputfile [-r reportfile] [-e .extensions] [-x exceptions]
#
#  "Inputfile" is a tar archive.  "Reportfile" is file containing a
#  list of files already mapped by mtf in a previous run (used to
#  avoid clashes with filenames in use outside the current archive).
#  The -e switch precedes a list of filename .extensions which mtf is
#  supposed to leave unscathed by the mapping process
#  (single-character extensions such as .c and .o are automatically
#  preserved; -e allows the user to specify additional extensions,
#  such as .pxl, .cpi, and .icn).  The final switch, -x, precedes a
#  list of strings which should not be mapped at all.  Use this switch
#  if, say, you have a C file with a structure.field combination such
#  as "thisisveryverybig.hashptr" in an archive that contains a file
#  called "thisisveryverybig.h," and you want to avoid mapping that
#  portion of the struct name which matches the name of the overlong
#  file (to wit, "mtf inputfile -x thisisveryverybig.hashptr").  To
#  prevent mapping of any string (including overlong filenames) begin-
#  ning, say, with "thisisvery," use "mtf inputfile -x thisisvery."
#  Be careful with this option, or you might end up defeating the
#  whole point of using mtf in the first place.
#
#  OUTPUT FORMAT:  Mtf writes a mapped tar archive to the stdout.
#  When finished, it leaves a file called "map.report" in the current
#  directory which records what filenames were mapped and how.  Rename
#  and save this file, and use it as the "reportfile" argument to any
#  subsequent runs of mtf in this same directory.  Even if you don't
#  plan to run mtf again, this file should still be examined, just to
#  be sure that the new filenames are acceptable, and to see if
#  perhaps additional .extensions and/or exceptions should be
#  specified.
#
#  BUGS:  Mtf only maps filenames found in the main tar headers.
#  Because of this, mtf cannot accept nested tar archives.  If you try
#  to map a tar archive within a tar file, mtf will abort with a nasty
#  message about screwing up your files.  Please note that, unless you
#  give mtf a "reportfile" to consider, it knows nothing about files
#  existing outside the archive.  Hence, if an input archive refers to
#  an overlong filename in another archive, mtf naturally will not
#  know to shorten it.  Mtf will, in fact, have no way of knowing that
#  it is a filename, and not, say, an identifier in a C program.
#  Final word of caution:  Try not to use mtf on binaries.  It cannot
#  possibly preserve the correct format and alignment of strings in an
#  executable.  Same goes for compressed files.  Mtf can't map
#  filenames that it can't read!
#
############################################################################


global filenametbl, chunkset, short_chunkset   # see procedure mappiece(s)
global extensions, no_nos                      # ditto

record hblock(name,junk,size,mtime,chksum,     # tar header struct;
              linkflag,linkname,therest)       # see readtarhdr(s)


procedure main(a)
    local usage, intext, i, current_list

    usage := "usage:  mtf inputfile [-r reportfile] " ||
	     "[-e .extensions] [-x exceptions]"

    *a = 0 & stop(usage)

    intext := open_input_file(a[1]) & pop(a)

    i := 0
    extensions := []; no_nos := []
    while (i +:= 1) <= *a do {
	case a[i] of {
	    "-r"    :    readin_old_map_report(a[i+:=1])
	    "-e"    :    current_list := extensions
	    "-x"    :    current_list := no_nos
	    default :    put(current_list,a[i])
	}
    }

    every !extensions ?:= (=".", tab(0))
    
    # Run through all the headers in the input file, filling
    # (global) filenametbl with the names of overlong files;
    # make_table_of_filenames fails if there are no such files.
    make_table_of_filenames(intext) | {
	write(&errout,"mtf:  no overlong path names to map") 
	a[1] ? (tab(find(".tar")+4), pos(0)) |
	  write(&errout,"(Is ",a[1]," even a tar archive?)")
 	exit(1)
    } 

    # Now that a table of overlong filenames exists, go back
    # through the text, remapping all occurrences of these names
    # to new, 14-char values; also, reset header checksums, and
    # reformat text into correctly padded 512-byte blocks.  Ter-
    # minate output with 512 nulls.
    seek(intext,1)
    every writes(output_mapped_headers_and_texts(intext))

    close(intext)
    write_report()   # Record mapped file and dir names for future ref.
    exit(0)
    
end



procedure open_input_file(s)
    local intext

    intext := open("" ~== s,"r") |
	stop("mtf:  can't open ",s)
    find("UNIX",&features) |
	stop("mtf:  I'm not tested on non-UNIX systems.")
    s[-2:0] == ".Z" &
        stop("mtf:  sorry, can't accept compressed files")
    return intext
end



procedure readin_old_map_report(s)
    local mapfile, line, chunk, lchunk

    initial {
	filenametbl := table()
	chunkset := set()
	short_chunkset := set()
    }

    mapfile := open_input_file(s)
    while line := read(mapfile) do {
	line ? {	
	    if chunk := tab(many(~' \t')) & tab(upto(~' \t')) &
		lchunk := move(14) & pos(0) then {
		filenametbl[chunk] := lchunk
		insert(chunkset,chunk)
		insert(short_chunkset,chunk[1:16])
	    }
	if /chunk | /lchunk
	then stop("mtf:  report file, ",s," seems mangled.")
	}
    }

end



procedure make_table_of_filenames(intext)

    local header # chunkset is global

    # search headers for overlong filenames; for now
    # ignore everything else
    while header := readtarhdr(reads(intext,512)) do {
	# tab upto the next header block
	tab_nxt_hdr(intext,trim_str(header.size),1)
	# record overlong filenames in several global tables, sets
	fixpath(trim_str(header.name))
    }
    *\chunkset ~= 0 | fail
    return &null

end



procedure output_mapped_headers_and_texts(intext)

    # Remember that filenametbl, chunkset, and short_chunkset
    # (which are used by various procedures below) are global.
    local header, newtext, full_block, block, lastblock

    # Read in headers, one at a time.
    while header := readtarhdr(reads(intext,512)) do {

	# Replace overlong filenames with shorter ones, according to
	# the conversions specified in the global hash table filenametbl
	# (which were generated by fixpath() on the first pass).
      	header.name := left(map_filenams(header.name),100,"\x00")
	header.linkname := left(map_filenams(header.linkname),100,"\x00")

	# Use header.size field to determine the size of the subsequent text.
	# Read in the text as one string.  Map overlong filenames found in it
 	# to shorter names as specified in the global hash table filenamtbl.
	newtext := map_filenams(tab_nxt_hdr(intext,trim_str(header.size)))

	# Now, find the length of newtext, and insert it into the size field.
	header.size := right(exbase10(*newtext,8) || " ",12," ")

	# Calculate the checksum of the newly retouched header.
	header.chksum := right(exbase10(get_checksum(header),8)||"\x00 ",8," ")

	# Finally, join all the header fields into a new block and write it out
	full_block := ""; every full_block ||:= !header
	suspend left(full_block,512,"\x00")

	# Now we're ready to write out the text, padding the final block
	# out to an even 512 bytes if necessary; the next header must start
	# right at the beginning of a 512-byte block.
	newtext ? {
	    while block := move(512)
	    do suspend block
	    pos(0) & next
            lastblock := left(tab(0),512,"\x00")
	    suspend lastblock
	}
    }
    # Write out a final null-filled block.  Some tar programs will write
    # out 1024 nulls at the end.  Dunno why.
    return repl("\x00",512)

end



procedure trim_str(s)

    # Knock out spaces, nulls from those crazy tar header
    # block fields (some of which end in a space and a null,
    # some just a space, and some just a null [anyone know
    # why?]).
    return s ? {
	(tab(many(' ')) | &null) &
	    trim(tab(find("\x00")|0))
    }

end 



procedure tab_nxt_hdr(f,size_str,firstpass)

    # Tab upto the next header block.  Return the bypassed text
    # as a string if not the first pass.

    local hs, next_header_offset

    hs := integer("8r" || size_str)
    next_header_offset := (hs / 512) * 512
    hs % 512 ~= 0 & next_header_offset +:= 512
    if 0 = next_header_offset then return ""
    else {
	# if this is pass no. 1 don't bother returning a value; we're
	# just collecting long filenames;
	if \firstpass then {
	    seek(f,where(f)+next_header_offset)
	    return
	}
	else {
	    return reads(f,next_header_offset)[1:hs+1] |
		stop("mtf:  error reading in ",
		     string(next_header_offset)," bytes.")
	}
    }

end



procedure fixpath(s)
    local s2, piece

    # Fixpath is a misnomer of sorts, since it is used on
    # the first pass only, and merely examines each filename
    # in a path, using the procedure mappiece to record any
    # overlong ones in the global table filenametbl and in
    # the global sets chunkset and short_chunkset; no fixing
    # is actually done here.

    s2 := ""
    s ? {
	while piece := tab(find("/")+1)
	do s2 ||:= mappiece(piece) 
	s2 ||:= mappiece(tab(0))
    }
    return s2

end



procedure mappiece(s)
    local chunk, i, lchunk

    # Check s (the name of a file or dir as recorded in the tar header
    # being examined) to see if it is over 14 chars long.  If so,
    # generate a unique 14-char version of the name, and store
    # both values in the global hashtable filenametbl.  Also store
    # the original (overlong) file name in chunkset.  Store the
    # first fifteen chars of the original file name in short_chunkset.
    # Sorry about all of the tables and sets.  It actually makes for
    # a reasonably efficient program.  Doing away with both sets,
    # while possible, causes a tenfold drop in execution speed!
    
    # global filenametbl, chunkset, short_chunkset, extensions
    local j, ending

    initial {
	/filenametbl := table()
	/chunkset := set()
	/short_chunkset := set()
    }
   
    chunk := trim(s,'/')
    if chunk ? (tab(find(".tar")+4), pos(0)) then {
	write(&errout, "mtf:  Sorry, I can't let you do this.\n",
	               "      You've nested a tar archive within\n",
	               "      another tar archive, which makes it\n",
	               "      likely I'll f your filenames ubar.")
	exit(2)
    }
    if *chunk > 14 then {
	i := 0

	if /filenametbl[chunk] then {
	# if we have not seen this file, then...
	    repeat {
		# ...find a new unique 14-character name for it;
		# preserve important suffixes like ".Z," ".c," etc.
		# First, check to see if the original filename (chunk)
		# ends in an important extension...
		if chunk ?
		    (tab(find(".")),
		     ending := move(1) || tab(match(!extensions)|any(&ascii)),
		     pos(0)
		     )
		# ...If so, then leave the extension alone; mess with the
		# middle part of the filename (e.g. file.with.extension.c ->
		# file.with001.c).
		then {
		    j := (15 - *ending - 3)
		    lchunk:= chunk[1:j] || right(string(i+:=1),3,"0") || ending
		}
		# If no important extension is present, then reformat the
		# end of the file (e.g. too.long.file.name -> too.long.fi01).
		else lchunk := chunk[1:13] || right(string(i+:=1),2,"0")

		# If the resulting shorter file name has already been used...
		if lchunk == !filenametbl
		# ...then go back and find another (i.e. increment i & try
		# again; else break from the repeat loop, and...
		then next else break
	    }
            # ...record both the old filename (chunk) and its new,
	    # mapped name (lchunk) in filenametbl.  Also record the
	    # mapped names in chunkset and short_chunkset.
	    filenametbl[chunk] := lchunk
	    insert(chunkset,chunk)
	    insert(short_chunkset,chunk[1:16])
	}
    }

    # If the filename is overlong, return lchunk (the shortened
    # name), else return the original name (chunk).  If the name,
    # as passed to the current function, contained a trailing /
    # (i.e. if s[-1]=="/"), then put the / back.  This could be
    # done more elegantly.
    return (\lchunk | chunk) || ((s[-1] == "/") | "")

end



procedure readtarhdr(s)
    local this_block

    # Read the silly tar header into a record.  Note that, as was
    # complained about above, some of the fields end in a null, some
    # in a space, and some in a space and a null.  The procedure
    # trim_str() may (and in fact often _is_) used to remove this
    # extra garbage.

    this_block := hblock()
    s ? {
	this_block.name     := move(100)    # <- to be looked at later
	this_block.junk     := move(8+8+8)  # skip the permissions, uid, etc.
	this_block.size     := move(12)     # <- to be looked at later
	this_block.mtime    := move(12)
	this_block.chksum   := move(8)      # <- to be looked at later
	this_block.linkflag := move(1)
	this_block.linkname := move(100)    # <- to be looked at later
	this_block.therest  := tab(0)
    }
    integer(this_block.size) | fail  # If it's not an integer, we've hit
                                     # the final (null-filled) block.
    return this_block

end



procedure map_filenams(s)
    local el, ch

    # Chunkset is global, and contains all the overlong filenames
    # found in the first pass through the input file; here the aim
    # is to map these filenames to the shortened variants as stored
    # in filenametbl (GLOBAL).

    local s2, tmp_chunk_tbl, tmp_lst
    static new_chunklist
    initial {

        # Make sure filenames are sorted, longest first.  Say we
        # have a file called long_file_name_here.1 and one called
        # long_file_name_here.1a.  We want to check for the longer
        # one first.  Otherwise the portion of the second file which
        # matches the first file will get remapped.
        tmp_chunk_tbl := table()
        every el := !chunkset
        do insert(tmp_chunk_tbl,el,*el)
        tmp_lst := sort(tmp_chunk_tbl,4)
        new_chunklist := list()
        every put(new_chunklist,tmp_lst[*tmp_lst-1 to 1 by -2])

    }

    s2 := ""
    s ? {
	until pos(0) do {
	    # first narrow the possibilities, using short_chunkset
	    if member(short_chunkset,&subject[&pos:&pos+15])
            # then try to map from a long to a shorter 14-char filename
	    then {
		if match(ch := !new_chunklist) & not match(!no_nos)
		then s2 ||:= filenametbl[=ch]
		else s2 ||:= move(1)
	    }
	    else s2 ||:= move(1)
	}
    }
    return s2

end


#  From the IPL.  Thanks, Ralph -
#  Author:  Ralph E. Griswold
#  Date:  June 10, 1988
#  exbase10(i,j) convert base-10 integer i to base j
#  The maximum base allowed is 36.

procedure exbase10(i,j)

   static digits
   local s, d, sign
   initial digits := &digits || &lcase
   if i = 0 then return 0
   if i < 0 then {
      sign := "-"
      i := -i
      }
   else sign := ""
   s := ""
   while i > 0 do {
      d := i % j
      if d > 9 then d := digits[d + 1]
      s := d || s
      i /:= j
      }
   return sign || s

end

# end IPL material


procedure get_checksum(r)
    local sum, field
 
    # Calculates the new value of the checksum field for the
    # current header block.  Note that the specification say
    # that, when calculating this value, the chksum field must
    # be blank-filled.

    sum := 0
    r.chksum := "        "
    every field := !r
    do every sum +:= ord(!field)
    return sum

end



procedure write_report()

    # This procedure writes out a list of filenames which were
    # remapped (because they exceeded the SysV 14-char limit),
    # and then notifies the user of the existence of this file.

    local outtext, stbl, i, j, mapfile_name

    # Get a unique name for the map.report (thereby preventing
    # us from overwriting an older one).
    mapfile_name := "map.report"; j := 1
    until not close(open(mapfile_name,"r"))
    do mapfile_name := (mapfile_name[1:11] || string(j+:=1))

    (outtext := open(mapfile_name,"w")) |
	open(mapfile_name := "/tmp/map.report","w") |
	     stop("mtf:  Can't find a place to put map.report!")
    stbl := sort(filenametbl,3)
    every i := 1 to *stbl -1 by 2 do {
	match(!no_nos,stbl[i]) |
	    write(outtext,left(stbl[i],35," ")," ",stbl[i+1])
    }
    write(&errout,"\nmtf:  ",mapfile_name," contains the list of changes.")
    write(&errout,"      Please save this list!")
    close(outtext)
    return &null

end
icon-9.4.3/ipl/progs/textcnt.icn0000664000175000017500000000264207274076350016123 0ustar  chrishchrish############################################################################
#
#	File:     textcnt.icn
#
#	Subject:  Program to tabulate properties of text file
#
#	Author:   Ralph E. Griswold
#
#	Date:     May 2, 2001
#
############################################################################
#
#   This file is in the public domain.
#
############################################################################
#
#     This program tabulates the number of characters, "words", and
#  lines in standard input and gives the maximum and minimum line length.
#  
############################################################################

procedure main()
   local chars, words, lines, name, infile, max, min, line

   chars := words := lines := 0
   max := 0
   min := 2 ^ 30			# larger than possible line length
   
     while line := read(infile) do {
        max <:= *line
        min >:= *line
        lines +:= 1
        chars +:= *line + 1
        line ? while tab(upto(&letters)) do {
           words +:= 1
           tab(many(&letters))
           }
        }
   
     if min = 2 ^ 30 then
        write("empty file")
     else {
        write("number of lines:     ",right(lines,8))
        write("number of words:     ",right(words,8))
        write("number of characters:",right(chars,8))
        write()
        write("longest line:        ",right(max,8))
        write("shortest line:       ",right(min,8))
        }

end
icon-9.4.3/ipl/progs/patchu.icn0000664000175000017500000000752107140713041015702 0ustar  chrishchrish############################################################################
#
#	File:     patchu.icn
#
#	Subject:  Program to implement UNIX-like patch
#
#	Author:   Rich Morin
#
#	Date:     June 18, 1990
#
############################################################################
#
#   This file is in the public domain.
#
############################################################################
#
#  This program reads a source file and a diff file, producing an
#  updated file.  The diff file may be generated by the UNIX diff(1)
#  utility, or by diffu.icn, which uses dif.icn for the hard work.
#
#  The original patch(1) utility, written by Larry Wall, is widely
#  used in the UNIX community.
#
#  The diff file contains edit lines, separators, and text lines.
#  Edit lines may take the forms:
#
#	#a#[,#]			<- add    lines
#	#[,#]c#[,#]		<- change lines
#	#[,#]d#			<- delete lines
#
#  Change lines contain only the string "---".  All other lines are
#  text lines.  See diff(1) in any UNIX manual for more details.
#
############################################################################
#
#  Requires:  co-expressions
#
############################################################################
#
#  Links:  options, patch
#
############################################################################

link options, patch

record diff_rec(pos, diffs)

global n1, n2, n3, n4

procedure main(arg)
   local t, rev, source, dfile, diffs

  t := options(arg, "r")
  rev := t["r"]

  if *arg ~= 2 then
    zot("usage: patchu source diffs")

  source := open(arg[1]) | zot("cannot open " || arg[1])
  dfile  := open(arg[2]) | zot("cannot open " || arg[2])

# every write(patch(source, get_diff(dfile))) # ? shouldn't need diffs ?

  diffs := []
  every put(diffs, get_diff(dfile))
  every write(patch(source, diffs, rev))

end


procedure get_diff(dfile)		# get diff record
  local ef, i1, i2, l1, l2, i, line

  repeat {
    if ef := get_edit(dfile) then {
#     write(">>> ",n1,", ",n2,", ",ef,", ",n3,", ",n4)
      if ef == "a" then i1 := n1+1 else i1 := n1
      if ef == "d" then i2 := n3+1 else i2 := n3
      l1 := []
      l2 := []
      if ef == !"cd" then {
        every i := n1 to n2 do {
          line := !dfile | zot("unexpected end of edit data(1)")
          if line[1:3] ~== "< " then
            zot("bad edit data(1): " || line)
          put(l1, line[3:0])
        }
      }

      if ef == "c" then {
        line := !dfile | zot("unexpected end of edit data(2)")
        if line ~== "---" then
          zot("bad edit data(2): " || line)
      }

      if ef == !"ac" then {
        every i := n3 to n4 do {
          line := !dfile | zot("unexpected end of edit data(3)")
          if line[1:3] ~== "> " then
            zot("bad edit data(3): " || line)
          put(l2, line[3:0])
        }
      }
      suspend [diff_rec(i1,l1), diff_rec(i2,l2)]
    }
    else
      fail
  }

end


procedure get_edit(dfile)		# get edit parameters
  local edit, i1, i2, ef, i3, i4

  edit := !dfile | fail
  i1 := i2 := many(&digits, edit) | zot("bad edit spec(1): " || edit)
  n1 := n2 := edit[1:i1]
  if edit[i1] == "," then {
    i2 := many(&digits, edit, i1+1) | zot("bad edit spec(2): " || edit)
    n2 := edit[i1+1:i2]
  }

  if edit[i2] == !"acd" then {
    ef := edit[i2]
    i3 := i4 := many(&digits, edit, i2+1) | zot("bad edit spec(3): " || edit)
    n3 := n4 := edit[i2+1:i3]
    if edit[i3] == "," then {
      i4 := many(&digits, edit, i3+1) | zot("bad edit spec(4): " || edit)
      n4 := edit[i3+1:i4]
    }
  }
  else
    zot("bad edit spec(5): " || edit)

  if i4 ~= *edit+1 then 
    zot("bad edit spec(6): " || edit)

  if not 0 <= n3 <= n4 then
    zot("bad edit spec(7): " || edit)

  if not 0 <= n1 <= n2 then
    zot("bad edit spec(8): " || edit)

  return ef

end    


procedure zot(msg)				# exit w/message
  write(&errout, "patchu: " || msg)
  exit(1)
end
icon-9.4.3/ipl/progs/farb2.icn0000664000175000017500000000405207140713040015405 0ustar  chrishchrish############################################################################
#
#	File:     farb2.icn
#
#	Subject:  Program to generate Farberisms
#
#	Author:   Alan Beale
#
#	Date:     June 14, 1994
#
############################################################################
#
#   This file is in the public domain.
#
############################################################################
#
#     Dave Farber, co-author of the original SNOBOL programming
#  language, is noted for his creative use of the English language.
#  Hence the terms ``farberisms'' and ``to farberate''.  This pro-
#  gram produces a randomly selected farberism.
#
#  Notes: Not all of the farberisms contained in this program were
#  uttered by the master himself; others have learned to emulate
#  him.  A few of the farberisms may be objectionable to some per-
#  sons.  ``I wouldn't marry her with a twenty-foot pole.''
#
############################################################################
#
#     This program obtains its farberisms from the farber.sen file to
#  allow additional farberisms to be added without recompilation or
#  straining the limits of the Icon translator.  It builds an index file
#  farber.idx to allow for efficient access to the sentences file.  The
#  use of untranslated I/O for the index file is necessary for correct
#  behavior on some systems (e.g., MVS).
#
############################################################################
#
#  Links:  random
#
############################################################################

link random

procedure main(argv)
   local f, ix, n

   f := open("farber.sen", "r") | stop("*** cannot open \"farber.sen\"")
   if not (ix := open("farber.idx", "ru")) then {
      ix := open("farber.idx", "bcu")
      n := 0;
      repeat {
         writes(ix, left(where(f), 10))
         if not read(f) then break
         n +:= 1
      }
      seek(ix, -10)
      writes(ix, left(n, 10))
   }
   seek(ix, -10)
   randomize()
   seek(ix,10*(?numeric(reads(ix,10))-1))
   seek(f,numeric(reads(ix,10)))
   write(read(f))
end
icon-9.4.3/ipl/progs/declchck.icn0000664000175000017500000000512707140713042016157 0ustar  chrishchrish############################################################################
#
#	File:     declchck.icn
#
#	Subject:  Program to detect possible declaration errors
#
#	Author:   Ralph E. Griswold
#
#	Date:     August 14, 1996
#
############################################################################
#
#   This file is in the public domain.
#
############################################################################
#
#  This program examines ucode files and reports declared identifiers
#  that may conflict with function names.
#
############################################################################
#
#  Requires:  UNIX
#
############################################################################

procedure main(args)
   local fset, u1, u2, line, name, base, flag, proc, files, file

   fset := set()
   every insert(fset,function())

   files := open("ls *.icn", "p")

   while file := read(files) do {
      system("cp " || file || " xxxxxx.icn")
      system("icont -c -s xxxxxx.icn")
      write(base := (file ? tab(upto('.'))))
      write("   locals")
      u1 := open("xxxxxx.u1") | {
         write("cannot open .u1 file for ", image(file))
         next
         }
      u2 := open("xxxxxx.u2") | {
         write("cannot open .u1 file for ", image(file))
         next
         }
      while line := read(u1) do {
         line ? {
            if ="proc " then {
               proc := tab(0)
               write("\t", proc)
               while line := read(u1) do {
                  line ? {
                     if ="\tdeclend" then break next
                     else if ="\tlocal\t" then {
                        move(2)
                        flag := tab(many(&digits))
                        if flag == ("001000" | "000020") then {
                           move(1)
                           name := tab(0)
                           if member(fset, name) then
                              write("\t\tpotential local conflict: ", name)
                           }
                        }
                     }
                  }
               }
            }
         }
      write("   globals")
      while line := read(u2) do { 
         line ? {
            if ="global" then break
            }
         }
      while line := read(u2) do {
         line ? {
            if tab(upto(',') + 1) & ="000001," then {
               name := tab(upto(','))
               if member(fset, name) then
                  write("\t\tpotential global conflict: ", name)
               }
            }
         }
      system("rm -f xxxxxx.*")
      close(u1)
      close(u2)
      write()
      }

end
icon-9.4.3/ipl/progs/countlst.icn0000664000175000017500000000356207140713040016271 0ustar  chrishchrish############################################################################
#
#	File:     countlst.icn
#
#	Subject:  Program to count items in a list
#
#	Author:   Ralph E. Griswold
#
#	Date:     December 30, 1991
#
############################################################################
#
#   This file is in the public domain.
#
############################################################################
#
#     This program counts the number times each line of input occurs and
#  writes a summary.
#
#     With no option, the output is sorted first by decreasing count and within
#  each count, alphabetically. With the option -a, the output is sorted
#  alphabetically.
#
#  The option -t prints a total at the end.
#
############################################################################
#
#  Links: adlutils, options
#
############################################################################

link adlutils, options

procedure main(args)
   local line_count, counter, lines, opts, sort_method, line, total, count

   line_count := table(0)		# counts for each line
   counter := table()			# lists of lines for each count
   total := 0				# total number of lines

   opts := options(args,"at")
   sort_method := opts["a"]

   while line_count[read()] +:= 1 do
      total +:= 1
       
   if \sort_method then {		# alphabetical sort
      line_count := sort(line_count,3)
      while write(get(line_count),"\t",get(line_count))
      }
   else { 				# numerical sort, then alpha
      line_count := sort(line_count,4)
   
      while count := pull(line_count) do {
         /counter[count] := []
         put(counter[count],pull(line_count))
         }
   
      counter := sort(counter,3)
   
      while lines := sort(pull(counter)) do {
         count := pull(counter)
         every write(!lines,"\t",count)
         }
     }

   if \opts["t"] then write("\ntotal\t",total)

end
icon-9.4.3/ipl/progs/diffn.icn0000664000175000017500000000422207140713040015476 0ustar  chrishchrish############################################################################
#
#	File:     diffn.icn
#
#	Subject:  Program to show differences among files
#
#	Author:   Robert J. Alexander
#
#	Date:     January 3, 1994
#
############################################################################
#
#   This file is in the public domain.
#
############################################################################
#  
#   This program shows the differences between n files. Is is invoked as
#
#        diffn file1 file2 ... filen
#  
############################################################################
#
#  Links: dif
#
############################################################################
#
#  Most of the work is done by an external procedure, dif().  This
#  program analyzes the command line arguments, sets up a call to
#  dif(), and displays the results.
#


link dif
global f1,f2
record dfile(file,linenbr)

invocable all

procedure main(arg)
  local f, i, files, drec, status
  #
  #  Analyze command line arguments, open the files, and output
  #  some initial display lines.
  #
  if *arg < 2 then stop("usage: diffn file file ...")
  f := list(*arg)
  every i := 1 to *arg do
    	f[i] := dfile(open(arg[i]) | stop("Can't open ",arg[i]),0)
  files := list(*arg)
  every i := 1 to *arg do {
    write("File ",i,": ",arg[i])
    files[i] := diff_proc(myread,f[i])
  }
  #
  #  Invoke dif() and display its generated results.
  #
  every drec := dif(files) do {
    status := "diffs"
    write("==================================")
    every i := 1 to *drec do {
      write("---- File ",i,", ",
      		 (drec[i].pos > f[i].linenbr & "end of file") |
		 "line " || drec[i].pos,
		 " ---- (",arg[i],")")
      listrange(drec[i].diffs,drec[i].pos)
    }
  }
  if /status then write("==== Files match ====")
  return
end


#
#  listrange() -- List a range of differing lines, each preceded by its
#  line number.
#
procedure listrange(dlist,linenbr)
  local x
  every x := !dlist do {
    write(x); linenbr +:= 1
  }
  return
end


#
#  myread() -- Line-reading procedure to pass to dif().
#
procedure myread(x)
  return x.linenbr <- x.linenbr + 1 & read(x.file)
end

icon-9.4.3/ipl/progs/queens.icn0000664000175000017500000000552507140713041015720 0ustar  chrishchrish############################################################################
#
#	File:     queens.icn
#
#	Subject:  Program to generate solutions to the n-queens problem
#
#	Author:   Stephen B. Wampler
#
#	Date:     June 10, 1988
#
############################################################################
#
#   This file is in the public domain.
#
############################################################################
#  
#     This program displays the solutions to the non-attacking n-
#  queens problem: the ways in which n queens can be placed on an
#  n-by-n chessboard so that no queen can attack another. A positive
#  integer can be given as a command line argument to specify the
#  number of queens. For example,
#  
#          iconx queens -n8
#  
#  displays the solutions for 8 queens on an 8-by-8 chessboard.  The
#  default value in the absence of an argument is 6.  One solution
#  for six queens is:
#  
#         -------------------------
#         |   | Q |   |   |   |   |
#         -------------------------
#         |   |   |   | Q |   |   |
#         -------------------------
#         |   |   |   |   |   | Q |
#         -------------------------
#         | Q |   |   |   |   |   |
#         -------------------------
#         |   |   | Q |   |   |   |
#         -------------------------
#         |   |   |   |   | Q |   |
#         -------------------------
#  
#  Comments: There are many approaches to programming solutions to
#  the n-queens problem.  This program is worth reading for
#  its programming techniques.
#  
############################################################################
#
#  Links: options
#
############################################################################

link options

global n, solution

procedure main(args)
   local i, opts

   opts := options(args,"n+")
   n := \opts["n"] | 6
   if n <= 0 then stop("-n needs a positive numeric parameter")

   solution := list(n)		# ... and a list of column solutions
   write(n,"-Queens:")
   every q(1)			# start by placing queen in first column
end

# q(c) - place a queen in column c.
#
procedure q(c)
   local r
   static up, down, rows
   initial {
      up := list(2*n-1,0)
      down := list(2*n-1,0)
      rows := list(n,0)
      }
   every 0 = rows[r := 1 to n] = up[n+r-c] = down[r+c-1] &
      rows[r] <- up[n+r-c] <- down[r+c-1] <- 1 do {
         solution[c] := r	# record placement.
         if c = n then show()
         else q(c + 1)		# try to place next queen.
         }
end

# show the solution on a chess board.
#
procedure show()
   static count, line, border
   initial {
      count := 0
      line := repl("|   ",n) || "|"
      border := repl("----",n) || "-"
      }
   write("solution: ", count+:=1)
   write("  ", border)
   every line[4*(!solution - 1) + 3] <- "Q" do {
      write("  ", line)
      write("  ", border)
      }
   write()
end
icon-9.4.3/ipl/progs/adllist.icn0000664000175000017500000000401307140713040016042 0ustar  chrishchrish############################################################################
#
#	File:     adllist.icn
#
#	Subject:  Program to list address list fields
#
#	Author:   Ralph E. Griswold
#
#	Date:     November 19, 1997
#
############################################################################
#
#   This file is in the public domain.
#
############################################################################
#
#    This program lists entries in address lists. The options are:
#
#	-c	by country
#	-n	by name
#	-C	by city (U.S. only)
#	-s	by state (U.S. only)
#	-z	by ZIP code (U.S. only)
#
# 	The default is -n.  If more than one option is specified, the
#	order of dominance is -n -z -s -c -C.
#
############################################################################
#
#  See also: address.doc, adlcheck.icn, adlcount.icn, adlfiltr.icn, 
#     adlsort,icn, labels.icn
#
#  Links: adlutils, options
#
############################################################################

link adlutils, options

procedure main(args)
   local item, item_lists, opts, list_method, get_item, add

   item_lists := table()

   list_method := "n"			# The default is sorting by name.
   get_item := get_lastname

   opts := options(args,"cnszC")

   if \opts["C"] then {			# If more than one given, last applies.
      list_method := "C"
      get_item := get_city
      }
   if \opts["c"] then {			# If more than one given, last applies.
      list_method := "c"
      get_item := get_country
      }
   if \opts["s"] then {
      list_method := "s"
      get_item := get_state
      }
   if \opts["z"] then {
      list_method := "z"
      get_item := get_zipcode
      }
   if \opts["n"] then {
      list_method := "n"
      get_item := get_lastname
      }

   case list_method of {
      "s" | "z" | "C": while add := nextadd() do
         write(get_item(add))
      "c" : while add := nextadd() do
         write(format_country(get_item(add)))
      "n" : while add := nextadd() do
         write(get_namepfx(add)," ",get_item(add))
      }
       
end
icon-9.4.3/ipl/progs/lisp.icn0000664000175000017500000002331707140713041015366 0ustar  chrishchrish############################################################################
#
#	File:     lisp.icn
#
#	Subject:  Program to interpret LISP programs
#
#	Author:   Stephen B. Wampler, modified by Phillip Lee Thomas
#
#	Date:     February 4, 1991
#
############################################################################
#
#   This file is in the public domain.
#
############################################################################
#
#     This program is a simple interpreter for pure Lisp. It takes the
#  name of the Lisp program as a command-line argument.
#
#     The syntax and semantics are based on EV-LISP, as described in
#  Laurent Siklossy's "Let's Talk LISP" (Prentice-Hall, 1976, ISBN
#  0-13-532762-8).  Functions that have been predefined match those
#  described in Chapters 1-4 of the book.
#
#     No attempt at improving efficiency has been made, this is
#  rather an example of how a simple LISP interpreter might be
#  implemented in Icon.
#
#     The language implemented is case-insensitive.
#
#     It only reads enough input lines at one time to produce at least
#   one LISP-expression, but continues to read input until a valid
#   LISP-expression is found.
#
#     Errors:
#
#        Fails on EOF; fails with error message if current
#     input cannot be made into a valid LISP-expression (i.e. more
#     right than left parens).
#
############################################################################
#
#  Syntax:
#    (quote (a b c))           ==> (A B C)
#    (setq a (quote (A B C)))  ==> (A B C)
#    (car a)                   ==> (A)
#    (cdr a)                   ==> (B C)
#    (cons (quote d) a)        ==> (D A B C)
#    (eq (car a) (car a))      ==> T
#    (atom (quote ()))         ==> T
#    (atom a)                  ==> NIL
#    (null (car (car a)))      ==> T
#    (eval (quote a))          ==> (A B C)
#    (print a)                 ==> (A B C)
#                                  (A B C)
#    (define (quote (
#            (cadr (quote (lambda (l) (car (cdr l)))))
#            (cddr (quote (lambda (l) (cdr (cdr l)))))
#            )))               ==> (CADR CDDR)
#    (trace (quote (cadr)))    ==> NIL
#    (untrace (quote (cadr)))  ==> NIL
#    (itraceon)                ==> T [turns on icon tracing]
#    (itraceoff)               ==> NIL [turns off icon tracing]
#    (exit)                    ==> [exit gracefully from icon]
#
############################################################################

global words,     # table of variable atoms
       T, NIL,    # universal constants
       infile     # command line library files

global trace_set  # set of currently traced functions

record prop(v,f)  # abbreviated propery list

### main interpretive loop
#
procedure main(f) 
local sexpr, source
   initialize()
   while infile := open(source := (pop(f) | "CON")) do {
      write("Reading: ", source)
      every sexpr := bstol(getbs()) do  {
            PRINT([EVAL([sexpr])])
            writes("> ")
            }
      }

end

## (EVAL e) - the actual LISP interpreter
#
procedure EVAL(l)
local fn, arglist, arg
   l := l[1]
   if T === ATOM([l]) then {                 # it's an atom
      if T === l then return .T
      if EQ([NIL,l]) === T then return .NIL
      return .((\words[l]).v | NIL)
      }
   if glist(l) then {                        # it's a list
      if T === ATOM([l[1]]) then
         case l[1] of {
         "QUOTE" : return .(l[2] | NIL)
         "COND"  : return COND(l[2:0])
         "SETQ"  : return SET([l[2]]|||evlis(l[3:0]))
         "ITRACEON"  : return (&trace := -1,T)
         "ITRACEOFF" : return (&trace := 0,NIL)
         "EXIT"      : exit(0)
         default : return apply([l[1]]|||evlis(l[2:0])) | NIL
         }
      return apply([EVAL([l[1]])]|||evlis(l[2:0])) | NIL
      }
   return .NIL
end

## apply(fn,args) - evaluate the function

procedure apply(l)
local fn, arglist, arg, value, fcn
   fn := l[1]
   if member(trace_set, string(fn)) then {
      write("Arguments of ",fn)
      PRINT(l[2:0])
      }
   if value := case string(fn) of {
      "CAR"     : CAR([l[2]]) | NIL
      "CDR"     : CDR([l[2]]) | NIL
      "CONS"    : CONS(l[2:0]) | NIL
      "ATOM"    : ATOM([l[2]]) | NIL
      "NULL"    : NULL([l[2]]) | NIL
      "EQ"      : EQ([l[2],l[3]]) | NIL
      "PRINT"   : PRINT([l[2]]) | NIL
      "EVAL"    : EVAL([l[2]]) | NIL
      "DEFINE"  : DEFINE(l[2]) | NIL
      "TRACE"   : TRACE(l[2]) | NIL
      "UNTRACE" : UNTRACE(l[2]) | NIL
      } then {
         if member(trace_set, string(fn)) then {
            write("value of ",fn)
            PRINT(value)
            }
         return value
         }
   fcn := (\words[fn]).f | return NIL
   if type(fcn) == "list" then
      if fcn[1] == "LAMBDA" then {
         value :=  lambda(l[2:0],fcn[2],fcn[3])
         if member(trace_set, string(fn)) then {
            write("value of ",fn)
            PRINT(value)
            }
         return value
         }
      else
         return EVAL([fn])
   return NIL
end

## evlis(l) - evaluate everything in a list
#
procedure evlis(l)
local arglist, arg
   arglist := []
   every arg := !l do
      put(arglist,EVAL([arg])) | fail
   return arglist
end


### Initializations

## initialize() - set up global values
#
procedure initialize()
   words := table()
   trace_set := set()
   T     := "T"
   NIL   := []
end

### Primitive Functions

## (CAR l)
#
procedure CAR(l)
   return glist(l[1])[1] | NIL
end

## (CDR l)
#
procedure CDR(l)
   return glist(l[1])[2:0] | NIL
end

## (CONS l)
#
procedure CONS(l)
   return ([l[1]]|||glist(l[2])) | NIL
end

## (SET a l)
#
procedure SET(l)
   (T === ATOM([l[1]])& l[2]) | return NIL
   /words[l[1]] := prop()
   if type(l[2]) == "prop" then
      return .(words[l[1]].v := l[2].v)
   else
      return .(words[l[1]].v := l[2])
end

## (ATOM a)
#
procedure ATOM(l)
   if type(l[1]) == "list" then
      return (*l[1] = 0 & T) | NIL
   return T
end

## (NULL l)
#
procedure NULL(l)
   return EQ([NIL,l[1]])
end

## (EQ a1 a2)
#
procedure EQ(l)
   if type(l[1]) == type(l[2]) == "list" then
      return (0 = *l[1] = *l[2] & T) | NIL
   return (l[1] === l[2] & T) | NIL
end

## (PRINT l)
#
procedure PRINT(l)
   if type(l[1]) == "prop" then
      return PRINT([l[1].v])
   return write(strip(ltos(l)))
end

## COND(l) - support routine to eval
#                 (for COND)
procedure COND(l)
local pair
   every pair := !l do {
      if type(pair) ~== "list" |
              *pair ~= 2 then {
         write(&errout,"COND: ill-formed pair list")
         return NIL
         }
      if T === EVAL([pair[1]]) then
         return EVAL([pair[2]])
      }
   return NIL
end

## (TRACE l)
#
procedure TRACE(l)
   local fn

   every fn := !l do {
      insert(trace_set, fn)
      }
   return NIL
end

## (UNTRACE l)
#
procedure UNTRACE(l)
   local fn

   every fn := !l do {
      delete(trace_set, fn)
      }
   return NIL
end

## glist(l) - verify that l is a list
#
procedure glist(l)
   if type(l) == "list" then return l
end

## (DEFINE fname definition)
#
# This has been considerable rewritten (and made more difficult to use!)
#  in order to match EV-LISP syntax.
procedure DEFINE(l)
   local fn_def, fn_list

   fn_list := []
   every fn_def := !l do {
      put(fn_list, define_fn(fn_def))
      }

   return fn_list
end

## Define a single function (called by 'DEFINE')
#
procedure define_fn(fn_def)
   /words[fn_def[1]] := prop(NIL)
   words[fn_def[1]].f := fn_def[2]
   return fn_def[1]
end

## lambda(actuals,formals,def)
#
procedure lambda(actuals, formals, def)
local save, act, form, pair, result, arg, i
   save := table()
   every arg := !formals do
      save[arg] := \words[arg] | prop(NIL)
   i := 0
   every words[!formals] := (prop(actuals[i+:=1]|NIL)\1)
   result := EVAL([def])
   every pair := !sort(save) do
      words[pair[1]] := pair[2]
   return result
end

#  Date: June 10, 1988
#
procedure getbs()
static tmp
   initial tmp := ("" ~== |Map(read(infile))) || " "

   repeat {
      while not checkbal(tmp) do {
         if more(')','(',tmp) then break
         tmp ||:= (("" ~== |Map(read(infile))) || " ") | break
         }
      suspend balstr(tmp)
      tmp := (("" ~== |Map(read(infile))) || " ") | fail
      }
end

## checkbal(s) - quick check to see if s is
#       balanced w.r.t. parentheses
#
procedure checkbal(s)
   return (s ? 1(tab(bal()),pos(-1)))
end

## more(c1,c2,s) - succeeds if any prefix of
#       s has more characters in c1 than
#       characters in c2, fails otherwise
#
procedure more(c1,c2,s)
local cnt
   cnt := 0
   s ? while (cnt <= 0) & not pos(0) do {
         (any(c1) & cnt +:= 1) |
         (any(c2) & cnt -:= 1)
         move(1)
         }
   return cnt >= 0
end

## balstr(s) - generate the balanced disjoint substrings
#               in s, with blanks or tabs separating words
#
#       errors:
#          fails when next substring cannot be balanced
#
#
procedure balstr(s)
static blanks
   initial blanks := ' \t'
   (s||" ") ? repeat {
          tab(many(blanks))
          if pos(0) then break
          suspend (tab(bal(blanks))\1 |
                  {write(&errout,"ill-formed expression")
                    fail}
                  ) \ 1
          }
end

## bstol(s) - convert a balanced string into equivalent
#       list representation.
#
procedure bstol(s)
static blanks
local l
   initial blanks := ' \t'
   (s||" ") ? {tab(many(blanks))
               l := if not ="(" then s else []
              }
   if not string(l) then
      every put(l,bstol(balstr(strip(s))))
   return l
end

## ltos(l) - convert a list back into a string
#
#
procedure ltos(l)
   local tmp

   if type(l) ~== "list" then return l
   if *l = 0 then return "NIL"
   tmp := "("
   every tmp ||:= ltos(!l) || " "
   tmp[-1] := ")"
   return tmp
end

procedure strip(s)
   s ?:= 2(="(", tab(bal()), =")", pos(0))
   return s
end

procedure Map(s)
   return map(s, &lcase, &ucase)
end
icon-9.4.3/ipl/progs/diffu.icn0000664000175000017500000000357407140713040015516 0ustar  chrishchrish############################################################################
#
#	File:     diffu.icn
#
#	Subject:  Program to show differences in files
#
#	Author:   Rich Morin
#
#	Date:     January 3, 1993
#
############################################################################
#
#   This file is in the public domain.
#
############################################################################
#
#  This program exercises the dif() procedure, making it act like the
#  UNIX diff(1) file difference command.
#
#  Usage: diffu f1 f2
#
#	3d2
#	< c
#	7,8c6,7
#	< g
#	< h
#	---
#	> i
#	> j
#
############################################################################
#
#  Links:  dif
#
############################################################################

link dif

invocable all

procedure main(arg)
  local f1, f2, ldr, n1, p1, n2, p2, h

  if *arg ~= 2 then
    zot("usage: diffu f1 f2")

  f1 := open(arg[1]) | zot("cannot open " || arg[1])
  f2 := open(arg[2]) | zot("cannot open " || arg[2])

  every ldr := dif([f1,f2]) do {
    n1 := *ldr[1].diffs; p1 := ldr[1].pos
    n2 := *ldr[2].diffs; p2 := ldr[2].pos

    if n1 = 0 then {			# add lines
      h := p1-1 || "a" || p2
      if n2 > 1 then
        h ||:= "," || (p2 + n2 - 1)
      write(h)
      every write("> " || !ldr[2].diffs)
    }
    else if n2 = 0 then {		# delete lines
      h := p1
      if n1 > 1 then
        h ||:= "," || (p1 + n1 - 1)
      h ||:= "d" || p2-1
      write(h)
      every write("< " || !ldr[1].diffs)
    }
    else {				# change lines
      h := p1
      if n1 > 1 then
        h ||:= "," || (p1 + n1 - 1)
      h ||:= "c" || p2
      if n2 > 1 then
        h ||:= "," || (p2 + n2 - 1)
      write(h)
      every write("< " || !ldr[1].diffs)
      write("---")
      every write("> " || !ldr[2].diffs)
    }
  }
end


procedure zot(msg)				# exit w/message
  write(&errout, "diff: " || msg)
  exit(1)
end
icon-9.4.3/ipl/progs/adlfirst.icn0000664000175000017500000000237007140713040016222 0ustar  chrishchrish############################################################################
#
#	File:     adlfirst.icn
#
#	Subject:  Program to write first line of addresses
#
#	Author:   Ralph E. Griswold
#
#	Date:     November 19, 1997
#
############################################################################
#
#   This file is in the public domain.
#
############################################################################
#
#     This program writes the first lines of entries in an address list file.
#  If an argument is given, it counts only those that have designators
#  with characters in the argument. Otherwise, it counts all entries.
#
############################################################################
#
#  See also: address.doc, adlcheck.icn, adlfiltr.icn, adllist.icn,
#     adlsort,icn, labels.icn
#
############################################################################

procedure main(arg)
   local s, line

   s := cset(arg[1]) | &cset

   while line := read() do
      line ? {
         if any('#') & upto(s) then {
            while line := read() | exit() do
               if line[1] == ("*" | "#" ) then next
               else {
                  write(line)
                  break
                  }
            }
         }

end
icon-9.4.3/ipl/progs/ilnkxref.icn0000664000175000017500000000541107142325673016250 0ustar  chrishchrish############################################################################
#
#	File:     ilnkxref.icn
#
#	Subject:  Program to produce Icon link cross reference
#
#	Author:   Robert J. Alexander
#
#	Date:     August 3, 2000
#
############################################################################
#
#   This file is in the public domain.
#
############################################################################
#
#  Utility to create cross reference of library files used in Icon
#  programs (i.e., those files named in "link" declarations).
#
#	ilnkxref [-options] ...
#
#	options:
#
#		-p	sort by "popularity"
#		-v	report progress information
#
############################################################################
#
#  Requires: UNIX
#
############################################################################
#
#  Links: wrap, options, sort
#
############################################################################

link wrap, options, sort

procedure main(arg)
local comma, f, fill, fn, head, heads, i, libname, line, linesize, maxfile,
   maxlib, opt, p, popularity, proctable, root, sep, spaces, verbose, x
   #
   #  Initialize
   #
   opt := options(arg,"pv")
   popularity := opt["p"]	# sort by popularity
   verbose := opt["v"]		# report progress
   if *arg = 0 then {
      p := open("ls *.icn","rp")
      while put(arg,read(p))
      close(p)
      }
   spaces := ' \t'
   sep := ' \t,'
   proctable := table()
   maxlib := maxfile := 0
   #
   # Gather information from files.
   #
   every fn := !arg do {
      if \verbose then write(&errout,"File: ",fn)
      f := open(fn) | stop("Can't open ",fn)
      i := 0
      every i := find("/",fn)
      root := fn[1:find(".",fn,i + 1) | 0]
      comma := &null
      while line := read(f) do {
	 line ? {
	    tab(many(spaces))
	    if \comma | ="link " then {
	       if \verbose then write(&errout,"    ",line)
	       comma := &null
	       tab(many(spaces))
	       until pos(0) | match("#") do {
		  libname := tab(upto(sep) | 0)
		  put(\proctable[libname],root) | (proctable[libname] := [root])
		  maxlib <:= *libname
		  maxfile <:= *root
		  tab(many(spaces))
		  comma := &null
		  if comma := ="," then tab(many(spaces))
		  }
	       }
	    }
	 }
      close(f)
      }
   #
   #  Print the cross reference table.
   #
   write()
   proctable := sort(proctable)
   if \popularity then proctable := isort(proctable,popproc)
   every x := !proctable do {
      head := left(x[1],maxlib + 3)
      heads := [left("(" || *x[2] || ")",maxlib + 3),
            fill := repl(" ",*head)]
      linesize := 78 - *head
      every x := !sort(x[2]) do
	 if write(head,wrap(left(x,maxfile + 2),linesize)) then
	    head := get(heads)
      write(head,wrap())
      }
end

procedure popproc(x)
  return -*x[2]
end
icon-9.4.3/ipl/progs/duplfile.icn0000664000175000017500000000310107140713041016210 0ustar  chrishchrish############################################################################
#
#	File:     duplfile.icn
#
#	Subject:  Program to find directories with same files
#
#	Author:   Ralph E. Griswold
#
#	Date:     June 10, 1994
#
############################################################################
#
#   This file is in the public domain.
#
############################################################################
#
#  This program lists the file names that occur in more than one
#  subdirectory and the subdirectories in which the names occur.
#
#  This program should be used with caution on large directory
#  structures.
#
############################################################################
#
#  Requires:  UNIX
#
############################################################################

procedure main(args)
   local ext, posit, files, names, name, dir, temp, dirs

   ext := args[1] | ""
   posit := -*ext

   names := table()

   files := open("ls -R", "p")

   while name := read(files) do
      name ? {
         if dir <- tab(-1) & =":" then {
            next
            }
         else if tab(posit) & =ext then {
            /names[name] := []
            put(names[name], dir)
            }
         }

   names := sort(names, 3)

   while name := get(names) do {
      dirs := get(names)
      if *name = 0 then next
      if *dirs > 1 then {
         write("file: ", image(name), " occurs in the following directories")
         every write("\t", image(fix(!sort(dirs))))
         write()
         }
      }

end

procedure fix(s)

   /s := "."

   return s

end
icon-9.4.3/ipl/progs/applyfnc.icn0000664000175000017500000000136607140713042016234 0ustar  chrishchrish############################################################################
#
#	File:     applyfnc.icn
#
#	Subject:  Program to apply function to lines of a file
#
#	Author:   Ralph E. Griswold
#
#	Date:     November 25, 1996
#
############################################################################
#
#   This file is in the public domain.
#
############################################################################
#
#  This program applies a function specified on the command line to the
#  lines of a file.
#
############################################################################

procedure main(args)
   local func

   func := args[1] | stop("*** no function specified")

   while args[1] := read() do
      every write(func ! args)

end
icon-9.4.3/ipl/progs/mkpasswd.icn0000664000175000017500000000213707140713041016245 0ustar  chrishchrish############################################################################
#
#	File:     mkpasswd.icn
#
#	Subject:  Program to make passwords
#
#	Author:   Jere K{pyaho
#
#	Date:     August 14, 1996
#
############################################################################
#
#   This file is in the public domain.
#
############################################################################
#
#  This program creates a list of randomly generated passwords.
#
#  Passwords consist of eight random characters [A-Z][0-9].
#
#  Number of passwords to generate is given as the first argument; default 1.
#
############################################################################
 
procedure main(Args)
   local count, i
 
        count := integer(Args[1]) | 1
        
        every i := 1 to count do
                write( genpasswd() )
 
end
 
#
# genpasswd: generate and return an 8-character password
#
procedure genpasswd()
        
        local i, s, ucalnum
 
        s := ""
        ucalnum := &ucase ++ &digits
        every i := 1 to 8 do
                s := s || ?ucalnum
 
        return s
 
end
icon-9.4.3/ipl/progs/getcol.icn0000664000175000017500000000245207450115330015672 0ustar  chrishchrish############################################################################
#
#	File:     getcol.icn
#
#	Subject:  Program to extract column from data
#
#	Author:   Ralph E. Griswold
#
#	Date:     March 26, 2002
#
############################################################################
#
#  This file is in the public domain.
#
############################################################################
#
#   This program extracts a column from multi-column data.
#
#   The supported options are:
#
#	-n i	column number, default 1
#	-c s	column-separation characters, default ' \t'
#
############################################################################
#
#  Links:  options
#
############################################################################

link options

procedure main(args)
   local i, chars, col, line, opts

   opts := options(args, "n+c:")

   i := \opts["n"] | 1
   if i < 1 then stop("*** invalid column specifications")

   chars := cset(\opts["c"]) | ' \t'
   if *chars = 0 then stop("*** invalid character-separation specification")

   while line := read() do {
      line ? {
         every 1 to i - 1 do {
            tab(upto(chars)) | stop("*** column missing")
            tab(many(chars))
            }
         write(tab(upto(chars) | 0))
         }
      }
            
end
icon-9.4.3/ipl/progs/geddump.icn0000664000175000017500000000620307140713042016040 0ustar  chrishchrish############################################################################
#
#	File:     geddump.icn
#
#	Subject:  Program to dump contents of GEDCOM file
#
#	Author:   Gregg M. Townsend
#
#	Date:     July 3, 1998
#
############################################################################
#
#   This file is in the public domain.
#
############################################################################
#
#	usage:  geddump [file]
#
#	This program prints the genealogical information contained
#	in a GEDCOM file.  Individuals are printed alphabetically,
#	with sequence numbers to assist cross-referencing.
#
#	Marriages are noted for both partners.  Children are listed
#	under the father, or under the mother if no father is known.
#
############################################################################
#
#  Links:  gedcom
#
############################################################################

link gedcom

record person(n, k, r)	# number, sort key, gedrec node


global ptab		# person number table, indexed by gedrec node


procedure main(args)
   local f, g, i, n, p, r, plist, fam, husb, sp, b, d, byr, dyr

   if *args > 0 then
      f := open(args[1]) | stop("can't open ", args[1])
   else
      f := &input

   g := gedload(f)
   close(f)

   plist := []
   ptab := table()
   every r := !g.ind do
      put(plist, ptab[r] := person(0, sortkey(r), r))

   plist := sortf(plist, 2)

   n := 0
   every (!plist).n := (n +:= 1)

   every p := !plist do {
      b := gedsub(p.r, "BIRT") | &null
      d := gedsub(p.r, "DEAT") | &null

      write()
      writes("[", p.n, "] ", gedlnf(p.r))
      byr := gedyear(\b) | &null
      dyr := gedyear(\d) | &null
      if \byr | \dyr then 
         writes("  (", byr, " - ", dyr, ")")
      write()

      if fam := gedref(p.r, "FAMC") then {
         refto("father", gedref(fam, "HUSB"))
         refto("mother", gedref(fam, "WIFE"))
         }

      event("b.", \b)

      r := &null
      every fam := gedref(p.r, "FAMS") do {		# for every family
         r := event("m.", gedsub(fam, "MARR"))
         r := refto("  husb", p.r ~=== gedref(fam, "HUSB"))
         r := refto("  wife", p.r ~=== gedref(fam, "WIFE"))
         # if had earlier kids and did not indicate remarriage, do so now
         if \r then
            write("   m.")
         # print children under husband, or under wife if no husband
         if (p.r === gedref(fam, "HUSB")) | (not gedref(fam, "HUSB")) then {
            every r := gedref(fam, "CHIL") do {
               case (gedval(r, "SEX") | "") of {
                  "M":		refto("   son", r)
                  "F":		refto("   dau", r)
                  default:	refto(" child", r)
                  }
               }
            }
         }

      event("d.", \d)
      }
end

procedure event(label, r)
   local date, place

   date := ("" ~== geddate(r))
   place := ("" ~== gedval(r, "PLAC"))
   if /place then
      write("   ", label, " ", \date)
   else
      write("   ", label, " ", \date | "            ", "  ", place)
   return
end

procedure refto(label, r)
   write("   ", label, " [", ptab[r].n, "] ", gedfnf(r))
   return
end

procedure sortkey(r)
   return map(gedlnf(r))
end
icon-9.4.3/ipl/progs/lsysmap.icn0000664000175000017500000000433107140713042016103 0ustar  chrishchrish############################################################################
#
#	File:     lsysmap.icn
#
#	Subject:  Program to map L-system symbols
#
#	Author:   Ralph E. Griswold
#
#	Date:     June 18, 1998
#
############################################################################
#
#  This file is in the public domain.
#
############################################################################
#
#  This program maps the symbols in L-Systems.
#
#  The following options are supported:
#
#	-i s	input symbols for mapping; default &ucase
#	-o s	output symbols for mapping; default &ucase
#	-a	put symbols for axiom production in alphabetical
#		  order (ignores -i and -o)
#	
#  symbol strings are given on the command line, as in
#
#	lsysmap -i ABCD -o DCBA ") then symbols ++:= move(1)
         }
      }

   isyms := deletec(isyms, &cset -- symbols)
   isyms := ochars(isyms)
   osyms := csort(isyms)

   every i := 1 to *defs do {
      defs[i] ?:= {
         (="axiom:" || map(move(1), isyms, osyms)) |
         (find("->") & map(tab(0), isyms, osyms)) |
         tab(0)
         }
      }
         
   every write(!defs)

end
icon-9.4.3/ipl/progs/recgen.icn0000664000175000017500000001131107140713041015651 0ustar  chrishchrish############################################################################
#
#	File:     recgen.icn
#
#	Subject:  Program to generate context-free recognizer
#
#	Author:   Ralph E. Griswold
#
#	Date:     January 28, 1991
#
############################################################################
#
#   This file is in the public domain.
#
############################################################################
#
#     This program reads a context-free BNF grammar and produces an Icon
#  program that is a recognizer for the corresponding language.
#
#     Nonterminal symbols are are enclosed in angular brackets. Vertical
#  bars separate alternatives.  All other characters are considered to
#  be terminal symbols.  The nonterminal symbol on the first line is
#  taken to be the goal.
#
#     An example is:
#
#	::=|+
#	::=|*
#	::=x|y|z|()
#
#     Characters in nonterminal names are limited to letters and underscores.
#  An underscore is appended for the recognizing procedure name to avoid
#  possible collisions with Icon function names.
#
#     Lines beginning with an = are passed through unchanged. This allows
#  Icon code to be placed in the recognizer.
#
############################################################################
#
#  Limitations:
#
#     Left recursion in the grammar may cause the recognizer to loop.
#  There is no check that all nonterminal symbols that are referenced
#  are defined or for duplicate definitions.
#
############################################################################
#
#  Reference:
#
#     The Icon Programming Language, Second Edition, Ralph E. and Madge T.
#     Griswold, Prentice-Hall, 1990. pp. 180-187.
#
############################################################################
#
#  See also:  pargen.icn
#
############################################################################

global call			# name suffix and parens
global goal			# nonterminal goal name
global nchars			# characters allowed in a nonterminal name

procedure main()
   local line			# a line of input

   call := "_()"
   nchars := &letters ++ '_'

   while line := read() do {		# process lines of input
      line ? {
         case move(1) of {		# action depends on first character
            "<":  tab(0) ? transprod()	# transform the production
            "=":  write(tab(0))		# pass through
            default: error()
            }				# end case
         }				# end scan
      }					# end while

   write("procedure main()")		# write out the main procedure
   write("   while line := read() do {")
   write("      writes(image(line))")
   write("      if line ? (",goal,call," & pos(0)) then ")
   write("         write(\": accepted\")")
   write("      else write(\": rejected\")")
   write("      }")
   write("end")

end

#
#  Transform a production.
#

procedure transprod()
   local sym				# the symbol being defined

   {
					# begin the procedure declaration
      write("procedure ",sym := tab(many(nchars)),call) &
      =">::="				# skip definition symbols
      } | error()				# catch syntactic error
   write("   suspend {")		# begin the suspend expression
   transalts()				# transform the alternatives
   write("      }")			# end the suspend expression
   write("end")				# end the procedure declaration
   write()				# space between declarations
   /goal := sym				# first symbol is goal

end

#
#  Transform a sequence of alternatives.
#
procedure transalts()
   local alt				# an alternative

   writes("      ")			# write indentation
   while alt := tab(upto('|') | 0) do {	# process alternatives
      writes(" (")			# open parenthesis for alternative
      alt ? transseq()			# transform the symbols
      if move(1) then writes(") |")	# if there's more, close the parentheses
					# and add the alternation.
      else {
         write(")")			# no more, so just close the parentheses
         break
         }				# end else
      }					# end while

end

#
#  Transform a sequence of symbols.
#
procedure transseq()

   repeat {
      transsym()			# process a symbols
      if not pos(0) then writes(",")	# if there's more, provide concatenation
      else break			# else get out and return
      }					# end while

end

#
#  Transform a symbol.
#
procedure transsym()

   if ="<" then {			# if it's a nonterminal
      {					# write it with suffix.
         writes(tab(many(nchars)),call) &
         =">"				# get rid of closing bracket
         } | error()			# or catch the error
      }					# end then
					# otherwise transform nonterminal string
   else writes("=",image(tab(upto('<') | 0)))

   return

end

#
#  Issue error message and terminate execution.
#
procedure error()

   stop("*** malformed definition: ",tab(0))

end
icon-9.4.3/ipl/progs/chkhtml.icn0000664000175000017500000003532107140713041016047 0ustar  chrishchrish############################################################################
#
#	File:     chkhtml.icn
#
#	Subject:  Program to check HTML files
#
#	Author:   Robert J. Alexander
#
#	Date:     November 15, 1994
#
############################################################################
#
#   This file is in the public domain.
#
############################################################################
#
# Program to check an HTML file.
#
# Errors detected:
#
#   - Reference to undefined anchor name.
#   - Duplicated anchor name.
#   - Warning for unreferenced anchor name.
#   - Unknown tag.
#   - Badly formed tag.
#   - Improper tag nesting.
#   - Unescaped <, >, ", or &.
#   - Bad escape string.
#   - Improper embedding of attributes.
#   - Bad (non-ascii) characters
#
# Advises on:
#   - Use of ,  tags.
#

procedure Usage(s)
  write(&errout,\s)
  stop(
       "Usage: ChkHTML -options file..._
      \n  -u     supress warnings for unreferenced anchor names_
      \n  -q     supress errors for \"\\\"\" (quote) character in open text_
      \n  -g     supress errors for \">\" character in open text_
      \n  -l n   level of HTML (default 2)")
end

global SupressUnrefNames,SupressOpenQuot,SupressOpenGT,HTMLLevel

procedure Init(arg)
  local opt,f
  ListTypes := ["UL","OL","MENU","DIR"]

  opt := options(arg,"uqgl+",Usage)
  if *arg = 0 then Usage()
  SupressUnrefNames := opt["u"]
  SupressOpenQuot := opt["q"]
  SupressOpenGT := opt["g"]
  HTMLLevel := \opt["l"] | 2
  return opt
end

link options

global FileName,LineNbr,TagStack,HRefList,NameSet,NameRefSet,ErrorCount,
    SeenSet,PlainText,Tagless,Msg,ListTypes

procedure main(arg)
  SetMsg()
  Init(arg)
  every CheckHTML(!arg)
end

procedure CheckHTML(fn)
  local f,line,c
  static badChars,scanChars
  initial {
    badChars := ~(&cset[33:128] ++ '\t')
    scanChars := '<>"&' ++ badChars
  }
  #
  # Open the input file.
  #
  f := open(fn) | {
    write(&errout,"Can't open \"",fn,"\"")
    fail
  }
  FileName := fn
  write(&errout)
  Msg("Checking HTML format...")
  ErrorCount := 0
  LineNbr := 0
  TagStack := []
  NameSet := set()
  NameRefSet := set()
  HRefList := []
  SeenSet := set()
  PlainText := &null
  while line := read(f) do line ? {
    LineNbr +:= 1
    while tab(upto(scanChars)) do {
      case c := move(1) of {
	"<": ProcessTag(f) | break
	">": if /Tagless & /SupressOpenGT then Error("\">\" in open text")
	"\"": if /Tagless & /SupressOpenQuot then Error("\"\\\"\" (quote) in open text")
	"&": if /Tagless then ProcessEscape() | Error("\"&\" in open text")
	default: Error("Bad character: ",image(c))
      }
    }
  }
  close(f)
  CheckStack()
  CheckHRefs()
  FileName := fn
  LineNbr := &null
  GiveAdvice()
  Msg((if ErrorCount > 0 then string(ErrorCount) else "No")
      ," error",(if ErrorCount = 1 then "" else "s"),
      " detected")
  return
end

procedure CheckHRefs()
  local x
  every x := !HRefList do {
    if not member(NameSet,x.value) then {
      FileName := x.fileName
      LineNbr := x.lineNbr
      Error("Anchor name referenced but not defined: ",image(x.value))
    }
  }
  if /SupressUnrefNames then {
    LineNbr := &null
    every x := !(NameSet -- NameRefSet) do {
      Msg("Warning: Anchor name not referenced: ",image(x))
    }
  }
  return
end

procedure CheckStack()
local tag
  every tag := pop(TagStack) do
      Error(pop(TagStack),"Unterminated tag: <",tag,">")
  return
end

procedure ProcessTag(f)
  local tag,subLine,upTag,endFlag,popCount,tagLines,listType
  #
  # Scan to the end of the tag (which might be multiple lines).
  #
  tag := ""
  tagLines := 0
  if ="!--" then {
    #
    # Comment tag.
    #
    until tab(find("-->") + 3) do {
      &subject := read(f) | {
	Error("Unclosed HTML comment (\"  ")
      repeat
        { tasto:=getch()
          if find(tasto,"aAbBcCdDeEfFgGhHiIxX") then
             break }
      righe(3)
      case tasto of {
        "a"|"A": copiafile(1)
        "b"|"B": copiafile(2)
        "c"|"C": copiafile(3)
        "d"|"D": copiafile(4)
        "e"|"E": copiafile(5)
        "f"|"F": copiafile(6)
        "g"|"G": copiafile(7)
        "h"|"H": copiafile(8)        
        "i"|"I": copiafile(9)
        "x"|"X": break } }                    # fine del repeat
end
##############################################################################


##############################################################################
procedure sceglinumero(messaggio)             # introduzione di un numero

local quale

write()
writes(messaggio||"  ")
repeat
     { quale:=read()
       if numeric(quale) then
          if (quale > 0) then
               break }
write()
return quale
end
##############################################################################


##############################################################################
procedure cambiadir()

local nomedir

write()
writes("Passare alla directory ")
if not chdir(nomedir:=read()) then
      write(char(7)||"DIRECTORY NON ESISTENTE O NOME NON VALIDO")
end
##############################################################################


##############################################################################
procedure copiafile(switch)

local origine,dest,nome1,nome2,dati,dati2,car,x,vecchio,nuovo,quantispazi,acc

acc:=''            # set dei caratteri accentati
write()
write("SCELTA FILE O DEVICE DI ORIGINE ")
nome1:=dainome()
write()
write("SCELTA FILE O DEVICE DI DESTINAZIONE")
nome2:=dainome()
write()
if (origine:=open(nome1,"ru")) & (dest:=open(nome2,"wu")) then     # apre i file   { while dati:=reads(origine,1000) do
   { case switch of {
     3: { vecchio:=sceglinumero("CODICE ASCII DEL CARATTERE DA SOSTITUIRE: ")
          nuovo:=sceglinumero("CODICE ASCII DEL NUOVO CARATTERE") }
     4: { quantispazi:=sceglinumero("QUANTI SPAZI PER UNA TABULAZIONE ? ") } }
     while dati:=reads(origine,40000) do
     { case switch of {
         2:  every x:=(dati ? find(char(10)|char(13))) do
                   dati[x]:=" "
         3: { every x:=(dati ? find(char(vecchio))) do
                   dati[x]:=char(nuovo) }
         4: { dati2:=""
              dati ? { while car:=move(1) do
                         { if (car == "\t") then
                              car:=repl(" ",quantispazi)
                           dati2:=dati2||car } }
              dati:=dati2 }
         5: { dati2:=""
              dati ? { while car:=move(1) do
                         { if (ord(car) < 32) then
                              car:=""
                           dati2:=dati2||car } }
              dati:=dati2 }
         6: { dati2:=""
              dati ? { while car:=move(1) do
                         { if (ord(car) > 126) then
                              car:=""
                           dati2:=dati2||car } }
              dati:=dati2 }
         7: { dati2:=""
              dati ? { while car:=move(1) do
                         { if ((ord(car) > 126)|(ord(car) < 32)) then
                              car:=""
                           dati2:=dati2||car } }
              dati:=dati2 }
         8: { dati2:=""
              dati ? { while car:=move(1) do
                         { if ((ord(car) > 126) & (not find(car,acc))) then
                              car:=""
                           dati2:=dati2||car } }
              dati:=dati2 }
         9: { dati2:=""                                                
              dati ? { while car:=move(1) do
                         { if (ord(car) < 32) & ((ord(car) ~= 10) & (ord(car) ~= 13)) then
                              car:=""
                           dati2:=dati2||car } }
              dati:=dati2 } }
     writes(dest,dati) }                             # while dati:=
     close(origine)
     close(dest) }
else
   { write()
     write(char(7)||"IMPOSSIBILE APRIRE I FILE DI INPUT E/O OUTPUT") }
end
##############################################################################


##############################################################################
procedure stampa()                               # stampa o duplica il file

local origine,dest,nome1,nome2,riga,contarighe,lungh,marg,nriga,comp

write("SCELTA FILE O DEVICE DI ORIGINE ")
nome1:=dainome()
write()
write("SCELTA FILE O DEVICE DI DESTINAZIONE")
nome2:=dainome()
write()
if (origine:=open(nome1,"r")) & (dest:=open(nome2,"w")) then     # apre i file
      { lungh:=lpag()                         # sceglie la lunghezza pagina
        nriga:=numriga()                      # stampa numeri di riga
        if (not find(nriga,"sS")) then
            marg:=margs()                     # scostamento dal margine
	comp:=compresso()                            # stampa compressa
	if find(comp,"sS") then                      
   { write(dest,char(27)||char(120)||"0")     # imposta il draft
     write(dest,char(27)||char(77))           # imposta l'elite
	    write(dest,char(15)) }                   # imposta il compresso
     contarighe:=1
        while riga:=read(origine) do
          { if nriga == ("s"|"S") then
               marg:=contarighe||" "
            write(dest,marg||riga)
            if (lungh ~= 0) & ((contarighe % lungh) = 0) then
               write(dest,char(12))           # manda un salto pagina
            contarighe+:=1 }                  # while riga
        write(dest,char(12))                  # salto pagina alla file
	write(dest,char(18))                  # annulla il compresso
        close(origine)
        close(dest)
        write()
        write("SCRITTE "||contarighe||" righe di "||nome1||" su "||nome2)
        writes(" Invio per continuare ...")
        read() }                              # if dest ...
else
   { write()
     write("IMPOSSIBILE APRIRE I FILE DI INPUT E/O OUTPUT") }
end
##############################################################################


##############################################################################
procedure dimmelo()

local quale

   quale:=""
   writes("Stringa da cercare  >>  ")
   while quale == "" do
      quale:=read()
   return quale
end
##############################################################################


##############################################################################
procedure cerca()                               # ricerca di testo

local origine,dest,nome1,nome2,riga,posizione,contatrova,testo

write("SCELTA FILE O DEVICE DI ORIGINE ")
nome1:=dainome()
write()
write("SCELTA FILE O DEVICE DI DESTINAZIONE")
nome2:=dainome()
write()                                                       
testo:=dimmelo()                                  # testo da cercare
contatrova:=0
righe(25)
if (origine:=open(nome1,"r")) & (dest:=open(nome2,"w")) then     # apre i file
    { while riga:=reads(origine,40000) do
      { every posizione:=(riga ? find(testo,riga)) do
        { contatrova+:=1       
          write(char(7)||riga[posizione-38:posizione+38])
          write(dest,"Occorrenza "||string(contatrova)||" di "||testo)
          write(dest,riga[posizione-38|1:posizione+38|(*riga-posizione)])
          write(dest,"------------------------------------------")
          write(dest)                                } }   #scrive                          
      close(origine)
      close(dest)
      righe(4)                                                        
      write("Ricerca di "||testo||" nel file "||nome1)
      write("Trovate "||string(contatrova)||" occorrenze")
      write() 
      writes(" Invio per continuare ...")
      read() }                              # if dest ...
else
   { righe(2)
     write("IMPOSSIBILE APRIRE I FILE DI INPUT E/O OUTPUT") }
end
##############################################################################


##############################################################################
procedure faivedere(nfile)                     # fa vedere il file

local testo,riga,conta,x, count

if testo:=open(nfile,"r") then              # apre il file per la lettura
  { count:=0
     while riga:=read(testo) do                # ciclo lettura file
      { write(riga)
        count+:=1
        if (count % 21) = 0 then               # fine pagina
           { write()
             write("")
             writes("   >> UN TASTO PER CONTINUARE   X PER USCIRE  ")
             x:=getch()
             if find(x,"xX") then
	        break  } }
     close(testo)
     write()
     write()
     write("   >>> RIGHE SCRITTE "||count)
     writes("  Invio per continuare ...  ")
     read() }
   else                                       # l'apertura fallisce
      { write()
        write("IMPOSSIBILE APRIRE IL FILE !!") }
   write()
end
#############################################################################
icon-9.4.3/ipl/progs/textcvt.icn0000664000175000017500000000707507140713041016123 0ustar  chrishchrish############################################################################
#
#	File:     textcvt.icn
#
#	Subject:  Program to convert text file formats
#
#	Author:   Robert J. Alexander
#
#	Date:     November 21, 1996
#
############################################################################
#
#   This file is in the public domain.
#
############################################################################
#
#
#  Program to convert text file(s) among various platforms' formats.
#
#  The supported text file types are UNIX, MS-DOS, and Macintosh.  A
#  universal input text reading algorithm is used, so only the output
#  file format must be specified.
#
#  The files are either converted in-place by converting to a temporary
#  file and copying the result back to the original, or are copied to a
#  separate new file, depending on the command line options.  If the
#  conversion is interrupted, the temporary file might still remain as
#  .temp (or, for MS-DOS, .tmp.
#
############################################################################
#
#  Links:  io, options
#
############################################################################

link io
link options

procedure Usage(s)
  write(&errout,\s)
  stop("Usage: textcvt [-options] - textfile..._
       \n  options:_
       \n    f   output file name if different from input_
       \n    o    output filename prefix (e.g. directory)_
       \n    c              copy first file to second file_
       \n  :_
       \n    u: UNIX_
       \n    d: MS-DOS_
       \n    m: Macintosh")
end

procedure Options(arg)
  local opt
  opt := options(arg,"udmo:f:c",Usage)
  OutEnder :=
      if \opt["u"] then "\x0a"
      else if \opt["d"] then "\x0d\x0a"
      else if \opt["m"] then "\x0d"
      else Usage()
  OutDir := opt["o"]
  if OutFile := \opt["f"] then {
    if *arg > 1 then Usage("Only one input file allowed with -f")
  }
  else if \opt["c"] then {
    if *arg ~= 2 then Usage("Exactly two files required for -c")
    OutFile := pull(arg)
  }
  return opt
end


global OutEnder,OutDir,OutFile

procedure main(arg)
  local oldName,old,newName,tmp,notInPlace,tmpName
  Options(arg)
  notInPlace := \(OutFile | OutDir)
  every oldName := !arg do {
    old := open(oldName,"ru") | {
      write(&errout,"Can't open ",oldName)
      next
    }
    if \notInPlace then {
      tmpName := (\OutDir | "") || (\OutFile | tail(oldName)[2])
      tmp := open(tmpName,"wu") | {
        write(&errout,"Can't open output file ",tmpName)
    close(old)
    next
      }
      writes(&errout,"Converting ",oldName," -> ",tmpName," -- ")
    }
    else {
      tmpName := if match("MS_DOS",&host) then suffix(oldName)[1] || ".tmp"
          else oldName || ".temp"
      tmp := open(tmpName,"wu") | {
        write(&errout,"Can't open work file ",tmpName)
    close(old)
    next
      }
      writes(&errout,"Converting ",oldName," -- ")
    }
    flush(&errout)
    ConvertText(old,tmp)
    close(tmp)
    close(old)
    if \notInPlace then {
      write(&errout,"done.")
    }
    else {
      (fcopy(tmpName,oldName) & write(&errout,"done.")) |
          write(&errout,"done.")
      remove(tmpName)
    }
  }
end

procedure ConvertText(old,new)
  local buf,c,trail
  while buf := reads(old,2000) do {
    if buf[-1] == "\x0d" then buf ||:= reads(old)
    buf ? {
      while writes(new,tab(upto('\x0a\x0d')),OutEnder) do {
        c := move(1)
    if c == "\x0d" then ="\x0a"
      }
      writes(new,trail := tab(0))
    }
  }
  if *\trail > 0 then writes(new,OutEnder)
  return
end
icon-9.4.3/ipl/progs/cwd.icn0000664000175000017500000000170707140713041015173 0ustar  chrishchrish############################################################################
#
#	File:     cwd.icn
#
#	Subject:  Program to write current working directory
#
#	Author:   Ralph E. Griswold
#
#	Date:     June 10, 1994
#
############################################################################
#
#   This file is in the public domain.
#
############################################################################
#
#  This program write the current working directory, shorn of it's
#  path specification.
#
#  For appropriately named directories, it can be used as, for example,
#
#	ftp `cwd`
#
############################################################################
#
#  Requires:  UNIX
#
############################################################################

procedure main()
   local i

   read(open("pwd", "p")) ? {
      i := 0				# for safety
      every i := upto('/')		# expect full path
      tab(i + 1)
      write(tab(0))
      }

end
      
icon-9.4.3/ipl/progs/maccvt.icn0000664000175000017500000000132607140713042015671 0ustar  chrishchrish############################################################################
#
#	File:     maccvt.icn
#
#	Subject:  Program to convert Macintosh special characters to ASCII
#
#	Author:   Ralph E. Griswold
#
#	Date:     September 18, 1998
#
############################################################################
#
#  This file is in the public domain.
#
############################################################################
#
#  This program maps the Macintosh characters for quotation and various
#  minus signs into their ASCII equivalents.
#
############################################################################

procedure main()

   while write(map(read(), "\xd0\xd1\xd2\xd3\xd4\xd5", "--\"\"''"))

end
icon-9.4.3/ipl/progs/latexidx.icn0000664000175000017500000001201207140713041016227 0ustar  chrishchrish############################################################################
#
#	File:     latexidx.icn
#
#	Subject:  Program to process LaTeX idx file
#
#	Author:   David S. Cargo
#
#	Date:     April 19, 1989
#
############################################################################
#
#   This file is in the public domain.
#
############################################################################
#
#  Input:
#
#     A latex .idx file containing the \indexentry lines.
#
#  Output:
#
#     \item lines sorted in order by entry value,
#  with page references put into sorted order.
#
# Processing:
#
#     While lines are available from standard input
#         Read a line containing an \indexentry
#         Form a sort key for the indexentry
#         If there is no table entry for it
#         Then create a subtable for it and assign it an initial value
#         If there is a table entry for it,
#         But not an subtable entry for the actual indexentry
#         Then create an initial page number set for it
#         Otherwise add the page number to the corresponding page number set
#    Sort the table of subtables by sort key value
#    For all subtables in the sorted list
#         Sort the subtables by indexentry values
#         For all the indexentries in the resulting list
#             Sort the set of page references
#             Write an \item entry for each indexentry and the page references
#
#  Limitations:
#
#     Length of index handled depends on implementation limits of memory alloc.
#  Page numbers must be integers (no roman numerals).  Sort key formed by
#  mapping to lower case and removing leading articles (a separate function
#  is used to produce the sort key, simplifying customization) -- otherwise
#  sorting is done in ASCII order.
#
############################################################################

procedure main()                       # no parameters, reading from stdin
    local key_table, s, page_num, itemval, key, item_list, one_item
    local page_list, refs

    key_table := table()               # for items and tables of page sets
    while s := read() do               # read strings from standard input
        {
        # start with s = "\indexentry{item}{page}"
        # save what's between the opening brace and the closing brace,
        # and reverse it
        s := reverse(s[upto('{',s)+1:-1])
        # giving s = "egap{}meti"

        # reversing allows extracting the page number first, thereby allowing
        # ANYTHING to be in the item field

        # grab the "egap", reverse it, convert to integer, convert to set
        # in case of conversion failure, use 0 as the default page number
        page_num := set([integer(reverse(s[1:upto('{',s)])) | 0])

        # the reversed item starts after the first closing brace
        # grab the "meti", reverse it
        itemval := reverse(s[upto('}', s)+1:0])

        # allow the sort key to be different from the item
        # reform may be customized to produce different equivalence classes
        key := reform(itemval)

        # if the assigned value for the key is null
        if /key_table[key]
        then
            {
            # create a subtable for the key and give it its initial value
            key_table[key] := table()
            key_table[key][itemval] := page_num
            }

        # else if the assigned value for the itemval is null
        # (e. g., when the second itemval associated with a key is found)
        else if /key_table[key][itemval]

        # give it its initial value
        then key_table[key][itemval] := page_num

        # otherwise just add it to the existing page number set
        else key_table[key][itemval] ++:= page_num
        }

    # now that all the input has been read....
    # sort keys and subtables by key value
    key_table := sort(key_table, 3)

    # loop, discarding the sort keys
    while get(key_table) do
        {
        # dequeue and sort one subtable into a list
        # sort is strictly by ASCII order within the equivalence class
        item_list := sort(get(key_table), 3)

        # loop, consuming the item and the page number sets as we go
        while one_item := get(item_list) do
            {
            # convert the page number set into a sorted list
            page_list := sort(get(item_list))

            # dequeue first integer and convert to string
            refs := string(get(page_list))

            # dequeue rest of page nums and append
            while (refs ||:= ", " || string(get(page_list)))

            write("\\item ", one_item, " ", refs)
            }
        }
    return
end

# reform - modify the item to enforce sort order appropriately
# This could do much more. For example it could strip leading braces,
# control sequences, quotation marks, etc.  It doesn't.  Maybe later.
procedure reform(item)
   item := map(item)		# map to lowercase
# drop leading article if present
   if match("a ",   item) then return item[3:0]
   if match("an ",  item) then return item[4:0]
   if match("the ", item) then return item[5:0]
   return item
end
icon-9.4.3/ipl/progs/iprofile.icn0000664000175000017500000002352707274062402016241 0ustar  chrishchrish############################################################################
#
#	File:     iprofile.icn
#
#	Subject:  Program to profile Icon procedure usage
#
#	Author:   Richard L. Goerwitz
#
#	Date:     May 2, 2001
#
############################################################################
#
#  This file is in the public domain.
#
############################################################################
#
#	Version:  1.5
#
############################################################################
#
#  This very simple profiler takes a single argument - an Icon program
#  compiled with the -t option.  Displays stats on which procedures
#  were called the most often, and from what lines in what files they
#  were called.  Use this program to figure out what procedures are
#  getting worked the hardest and why.  Counts only invocations and
#  resumptions; not suspensions, returns, failures.
#
#  If you are running a program that reads from a file, be sure to
#  protect the redirection symbol from the shell (i.e. "profile
#  'myprog < input'" instead of "profile myprog < input").  If a given
#  program normally reads &input, please redirect stdin to read from
#  another tty than the one you are running profile from.  If you
#  forget to do this, the results might be very interesting....  Also,
#  don't redirect stderr, as this contains the trace that profile will
#  be reading and using to obtain run-time statistics.  Profile
#  automatically redirects stdout to /dev/null.
#
#  Currently runs only under UNIX, but with some tweaking could be
#  made to run elsewhere as well.
#
#  The display should be pretty much self-explanatory.  Filenames and
#  procedures get truncated at nineteen characters (if the display
#  gets too wide, it can become hard to read).  A star is prepended to
#  procedures whose statistics have changed since the last screen
#  update.
#
############################################################################
#
#  Requires:  co-expressions, keyboard functions, pipes, UNIX
#
############################################################################
#
#  Links:  itlib, iscreen
#
############################################################################

link itlib
link iscreen
global CM, LI, CO, CE

procedure main(a)

    local whitespace, firstidchars, idchars, usage, in_data,
	cmd, line, filename, linenum, procname, t, threshhold

    whitespace   := '\t '
    firstidchars := &letters ++ '_'
    idchars      := &digits ++ &letters ++ '_'
    usage        := "usage:  profile filename _
		     (filename = Icon program compiled with -t option)"

    #
    # If called with a program name as the first argument, open it,
    # and pipe the trace output back to this program.  Assume the
    # user knew enough to compile it with the "-t" option.
    #
    if *a > 0 then {
	if find("UNIX", &features) then {
	    cmd := ""; every cmd ||:= !a || " "
	    if find("2>", cmd) then
		stop("profile:  Please don't redirect stderr!")
	    in_data := open(cmd || " 2>&1 1> /dev/null", "pr") |
		stop("profile:  Can't find or execute ", cmd, ".")
	} else stop("profile:  Your OS is not (yet) supported.")
    }
    else stop(usage)

    # clear screen, set up global variables; initialize table
    setup_screen()
    t := table()

    threshhold := 0
    while line := read(in_data) do {
	threshhold +:= 1
	#
	# Break each line down into a file name, line number, and
	# procedure name.
	#
	line ? {
	    tab(many(whitespace))
	    match(":") & next
	    { 
		filename := trim(tab(find(":"))) &
		  tab(many(whitespace ++ ':')) &
		  linenum  := tab(many(&digits)) &
		  tab(many(whitespace ++ '|')) &
		  procname := tab(any(firstidchars)) || tab(many(idchars))
	    } | next
	    tab(many(whitespace))
	    # Count only invocations and resumptions.
	    match("suspended"|"failed"|"returned") & next
	}

	#
	# Enter statistics into table.
	#
	/t[procname] := table()
	/t[procname][filename] := table(0)
	 t[procname][filename][linenum] +:= 1

	#
	# Display stats interactively.
	#
	if threshhold > 90 then {
	    threshhold := 0
	    display_stats(t)
	}
    }

    display_stats(t)
    # Write a nice exit message.
    goodbye()

end


#
# display_stats:  display the information in t interactively
#
procedure display_stats(t)

    local l, input, c
    static top, len, firstline
	# sets global variables CM, LI, CO, and CE
    initial {
	top := 1
	# The first line we can write data to on the screen.
	firstline := 3
	len := LI - 4 - firstline
    }

    #
    # Structure the information in t into a list.  Note that to obtain
    # the number of procedures, one must divide l in half.
    #
    l := sort_table(t)

    #
    # Check for user input.
    #
    while kbhit() do {
	iputs(igoto(CM, 1, LI-1))
	writes("Press j/k/^/$/p/q:  ")
	iputs(CE)
	writes(input := map(getch()))
	case input of {
	    # Increase or decrease top by 4; don't go beyond 0 or
	    # *l; no even numbers for top (the 4 also must be even).
	    "j"    : top := (*l > (top+2) | *l-1)
	    "\r"   : top := (*l > (top+2) | *l-1)
	    "\n"   : top := (*l > (top+2) | *l-1)
	    "k"    : top := (0  < (top-2) | 1)
	    "\x02" : top := (0  < (top-4) | 1)
	    "\x15": top := (0  < (top-4) | 1)
	    " "    : top := (*l > (top+4) | *l-1)
	    "\x06" : top := (*l > (top+4) | *l-1)
	    "\x04" : top := (*l > (top+4) | *l-1)
	    "^"    : top := 1
	    "$"    : top := *l-1
	    "p"    : {
		iputs(igoto(CM, 1, LI-1))
		writes("Press any key to continue: "); iputs(CE)
		until kbhit() & getch() do delay(500)
	    }
            "q"    : goodbye()
            "\x0C" : setup_screen()
	    "\x012": setup_screen()
	    default: {
		if any(&digits, input) then {
		    while c := getche() do {
			if c == ("\n"|"\r") then {
			    if not (input <:= 1) then
				input +:= input % 2 - 1
			    top := (0  < input | 1)
			    top := (*l > input | *l-1)
			    break
			} else {
			    if any(&digits, c)
			    then input ||:= c & next
			    else break
			}
		    }
		}
	    }
	}
	iputs(igoto(CM, 1, LI-1))
	writes("Press j/k/^/$/p/q:  ")
	iputs(CE)
    }

    #
    # Display the information contained in table t via list l2.
    #
    write_list(l, top, len, firstline)
    return

end


#
# sort_table:  structure the info in t into a list
#
#     What a mess.  T is a table, keys = procedure names, values =
#     another table.  These other tables are tables where keys = file
#     names and values = yet another table.  These yet other tables
#     are structured as follows: keys = line numbers, values = number
#     of invocations.  The idea is to collapse all of these tables
#     into sorted lists, and at the same time count up the total
#     number of invocations for a given procedure name (going through
#     all its invocations at every line in every file).  A new table
#     is then created where keys = procedure names and values = total
#     number of invocations.  Yet another sort is done on the basis of
#     total number of invocations.
#
procedure sort_table(t)

    local t2, total_t, k, total, i, l, l2
    static old_totals
    initial old_totals := table()

    t2 := copy(t)
    total_t := table()
    every k := key(t2) do {
	t2[k] := sort(t2[k], 3)
	total := 0
	every i := 2 to *t2[k] by 2 do {
	    every total +:= !t2[k][i]
	    t2[k][i] := sort(t2[k][i], 3)
	}
	insert(total_t, k, total)
    }
    l2 := list(); l := sort(total_t, 4)
    every i := 1 to *l-1 by 2 do {
	push(l2, t2[l[i]])
	if not (total_t[l[i]] <= \old_totals[l[i]]) then
	    l[i] := "*" || l[i]
	push(l2, l[i])
    }

    old_totals := total_t
    return l2

end


#
# write_list:  write statistics in the upper part of the screen
#
procedure write_list(l, top, len, firstline)

    local   i, j, k, z, w
    static  last_i
    #global CM, CE
    initial last_i := 2

    # Arg1, l, is a sorted table of sorted tables of sorted tables!
    # Firstline is the first line on the screen we can write data to.
    #
    i := firstline
    iputs(igoto(CM, 1, i)); iputs(CE)
    every j := top to *l by 2 do {
	writes(left(l[j], 19, " "))
	every k := 1 to *l[j+1]-1 by 2 do {
	    iputs(igoto(CM, 20, i))
	    writes(left(l[j+1][k], 19, " "))
	    every z := 1 to *l[j+1][k+1]-1 by 2 do {
		iputs(igoto(CM, 40, i))
		writes(left(l[j+1][k+1][z], 7, " "))
		iputs(igoto(CM, 48, i))
		writes(l[j+1][k+1][z+1])
		if (i +:= 1) > (firstline + len) then
		    break break break
		else iputs(igoto(CM, 1, i)) & iputs(CE)
	    }
	}
    }

    # Clear the remaining lines down to the status line.
    #
    every w := i to last_i do {
	iputs(igoto(CM, 1, w))
	iputs(CE)
    }
    last_i := i

    return

end


#
# setup_screen: clear screen, set up status line.
#
procedure setup_screen()

    # global CM, LI, CO, CE
    initial {
	CM := getval("cm") |
	    stop("setup_screen:  No cm capability!")
	LI := getval("li")
	CO := getval("co")
	CE := getval("ce")
	# UNIX-specific command to disable character echo.
	system("stty -echo")
    }

    clear()
    iputs(igoto(CM, 1, 1))
    emphasize()
    writes(left(left("procedure name", 19, " ") ||
		left("source file", 20, " ") ||
		left("line", 8, " ") ||
		"number of invocations/resumptions",
		CO, " "))
    normal()
    status_line("- \"Profile,\" by Richard Goerwitz -")
    iputs(igoto(CM, 1, LI-1))
    writes("J or CR=down; k=up; ^=begin; $=end; p=pause; q=quit: ")
    iputs(CE)

    return

end

#
# goodbye: exit, say something nice
#
procedure goodbye()

    # UNIX-specific command.
    system("stty echo")

    status_line("- \"Profile,\" by Richard Goerwitz -")
    every boldface() | emphasize() | normal() |
	  boldface() | emphasize() | normal()
    do {
	delay(50)
	iputs(igoto(CM, 1, LI-1))
	writes("Hope you enjoyed using profile! ")
	normal(); iputs(CE)
    }
    exit()

end


#
# stop_profile:  graceful exit after error
# 
procedure stop_profile(s)

    # UNIX-specific command.
    system("stty echo")

    status_line("- \"Profile,\" by Richard Goerwitz -")
    iputs(igoto(CM, 1, LI-1))
    writes(s); iputs(CE)
    iputs(igoto(CM, 1, LI))
    stop()

end
icon-9.4.3/ipl/progs/iplindex.icn0000664000175000017500000000670607140713042016237 0ustar  chrishchrish############################################################################
#
#	File:     iplindex.icn
#
#	Subject:  Program to produce indexed listing of the program library
#
#	Author:   Ralph E. Griswold
#
#	Date:     March 3, 1996
#
###########################################################################
#
#   This file is in the public domain.
#
############################################################################
#
#  The following options are supported:
#
#	-k i	width keyword field, default 16
#	-p i	width of field for program name, default 12
#
#     Some noise words are omitted (see "exceptions" in the program text).
#  If a file named except.wrd is open and readable in the current directory,
#  the words in it are used instead.
#
#     This program is pretty simple.  Possible extensions include ways
#  of specifying words to be omitted, more flexible output formatting, and
#  so on.  Another "embellisher's delight".
#
#     This program was derived from kwic.icn by Steve Wampler.
#
#     The format of the output was suggested by Gregg Townsend.
#
############################################################################
#
#  Links:  options
#
############################################################################

link options

global line, loc, exceptions, key_width,  program_width, tag

record pair(name, line)

procedure main(args)
   local exceptfile, opts

   opts := options(args, "k+p+")
   key_width := \opts["k"] | 16
   program_width := \opts["p"] | 12

   if exceptfile := open("except.wrd") then {
      exceptions := set()
      every insert(exceptions, lcword(exceptfile))
      close(exceptfile)
      }
   else
      exceptions := set(["and", "for", "into", "all", "from", "get", "put",
         "compute", "perform", "apply", "model", "value", "model", "operator",
         "out", "problem", "produce", "such", "use", "operation",
         "between", "data", "different", "down", "miscellaneous", "non",
         "obtaining", "using", "value", "values", "various", "with",
         "begin", "end", "not", "way", "possible", "required", "until",
         "that", "within", "once", "the"
         ])

   write(left("keyword", key_width), left("location", program_width),
      "description")
   write()

   every write(filter(indexer(&input)))

end

procedure indexer(file)
   local index, word

#  Each word, in lowercase form, is a key in the table "index".
#  The corresponding values are lists of the lines for that word.

   index := table()

   every word := lcword(file) do {
      if not member(exceptions,word) then {
         /index[word] := []
         index[word] := put(index[word],line)
         }
      }

   index := sort(index,3)

#  while get(index) do
#     suspend !get(index)

   while name := get(index) do
      suspend pair(name, !get(index))

end

procedure lcword(file)
   local name, word
   static chars

   initial {
      chars := &letters ++ &digits
      tag := table()
      }

   every line := !file do {
      line ?:= {
         name := tab(find(": "))	# program name
         move(2)			# skip trash
         tab(0)				# rest is now line
         }
      tag[line] := name			# name for the line
      line ? {
         while tab(loc := upto(chars)) do {
            word := map(tab(many(chars)))
            if *word > 2 & not(any('(')) then suspend word
            }
          }
      }
end

procedure filter(result)

   return left(result.name, key_width) ||
      left(tag[result.line], program_width) || result.line

end
icon-9.4.3/ipl/progs/isrcline.icn0000664000175000017500000000244307140713041016224 0ustar  chrishchrish############################################################################
#
#	File:     isrcline.icn
#
#	Subject:  Program to count code lines in Icon program
#
#	Author:   Ralph E. Griswold
#
#	Date:     November 7, 1997
#
############################################################################
#
#   This file is in the public domain.
#
############################################################################
#
#  This program counts the number of lines in a Icon program that actually
#  contain code, as opposed to being comments or blank lines.
#
#  Note:  preprocessor directives are counted as code lines.
#
############################################################################
#
#  Links:  numbers
#
############################################################################

link numbers

procedure main()
   local total, chaff, code, line

   total := chaff := 0

   while line := read() do {
      total +:= 1
      line ? {
         tab(many(' \t'))
         if ="#" | pos(0) then chaff +:= 1
         }
      }

   code := total - chaff

   write(left("total lines:", 17), right(total, 6))
   write(left("code lines:", 17), right(code, 6))
   write(left("non-code lines:", 17), right(chaff, 6))
   write()
   write(left("percentage code:", 17), fix(100 * code, total, 7, 2))

end
icon-9.4.3/ipl/progs/gediff.icn0000664000175000017500000000402507140713041015636 0ustar  chrishchrish############################################################################
#
#	File:	  gediff.icn
#
#	Subject:  Program to "diff" for use with ged
#
#	Author:	  Robert J. Alexander
#
#	Date:	  July 9, 1993
#
############################################################################
#
#   This file is in the public domain.
#
############################################################################
#
#  Program to produce diff output in a format for use with ged's
#  "FindFileAndLine" (esc-S) command.  It causes the "diffed" files
#  to be open in the editor with the differing portions selected.
#
############################################################################
#
#  Links: options, word
#
############################################################################
#
#  Requires: pipes, a "diff" command in the environment
#
############################################################################
#
#  See also: diffn.icn (a diff-type program)
#
############################################################################

link options,word

global Diff,ArgStr

procedure Options(arg)
   local opt,c
   opt := options(arg,"dbitwrsS:")
   Diff := \opt["d"] | "diff"
   ArgStr := ""
   ArgStr ||:= " -S " || \opt["S"]
   every c := !"bitwrs" do {     # single-character options passed to diff
      if \opt[c] then ArgStr ||:= " -" || c
      }
   return opt
end

procedure main(arg)
   local argstr,fn1,fn2,p,dargs,cmd
   Options(arg)
   every ArgStr ||:= " " || !arg
   fn1 := arg[-2]
   fn2 := arg[-1]
   cmd := Diff || ArgStr
   #write(&errout,cmd)
   p := open(cmd,"pr")
   while read(p) ? {
      if any(&digits) then {
	 write(fn1,":",tab(upto(&letters)))
	 move(1)
	 write(fn2,":",tab(0))
	 }
      else if ="diff" & tab(many(' \t')) then {
	 write(&subject)
	 dargs := []
	 while put(dargs,word_dequote(tab(word()))) do tab(many(' \t'))
	 fn1 := dargs[-2]
	 fn2 := dargs[-1]
	 while match("./",fn1) do fn1[1+:2] := ""
	 while match("./",fn2) do fn2[1+:2] := ""
	 }
      else write(tab(0))
      {}
      }
   exit(close(p))
end
icon-9.4.3/ipl/progs/lam.icn0000664000175000017500000000534207140713041015166 0ustar  chrishchrish############################################################################
#
#	File:     lam.icn
#
#	Subject:  Program to laminate files
#
#	Author:   Thomas R. Hicks
#
#	Date:     June 10, 1988
#
############################################################################
#
#   This file is in the public domain.
#
############################################################################
#  
#     This program laminates files named on the command line onto
#  the standard output, producing a concatenation of corresponding
#  lines from each file named.  If the files are different lengths,
#  empty lines are substituted for missing lines in the shorter
#  files.  A command line argument of the form - s causes the string
#  s to be inserted between the concatenated file lines.
#  
#     Each command line argument is placed in the output line at the
#  point that it appears in the argument list.  For example, lines
#  from file1 and file2 can be laminated with a colon between each
#  line from file1 and the corresponding line from file2 by the com-
#  mand
#  
#          lam file1 -: file2
#  
#     File names and strings may appear in any order in the argument
#  list.  If - is given for a file name, standard input is read at
#  that point.  If a file is named more than once, each of its lines
#  will be duplicated on the output line, except that if standard
#  input is named more than once, its lines will be read alter-
#  nately.  For example, each pair of lines from standard input can
#  be joined onto one line with a space between them by the command
#  
#          lam - "- " -
#  
#  while the command
#  
#          lam file1 "- " file1
#  
#  replicates each line from file1.
#  
############################################################################
#
#  Links: usage
#
############################################################################

link usage

global fndxs

procedure main(a)
   local bufs, i
   bufs := list(*a)
   fndxs := []
   if (*a = 0) | a[1] == "?" then Usage("lam file [file | -string]...")
   every i := 1 to *a do {
      if a[i] == "-" then {
         a[i] := &input
            put(fndxs,i)
            }
      else if match("-",a[i]) then {
         bufs[i] := a[i][2:0]
         a[i] := &null
         }
      else {
         if not (a[i] := open(a[i])) then
            stop("Can't open ",a[i])
         else put(fndxs,i)
         }
     }
   if 0 ~= *fndxs then lamr(a,bufs) else Usage("lam file [file | -string]...")
end

procedure lamr(args,bufs)
   local i, j
   every i := !fndxs do
      bufs[i] := (read(args[i]) | &null)
   while \bufs[!fndxs] do {
      every j := 1 to *bufs do
         writes(\bufs[j])
      write()
      every i := !fndxs do
         bufs[i] := (read(args[i]) | &null)
     }
end
icon-9.4.3/ipl/progs/pack.icn0000664000175000017500000000224607140713041015333 0ustar  chrishchrish############################################################################
#
#	File:     pack.icn
#
#	Subject:  Program to package multiple files
#
#	Author:   Ralph E. Griswold
#
#	Date:     July 1, 1997
#
############################################################################
#
#   This file is in the public domain.
#
############################################################################
#
#     This programs takes a list of file names on the command line and
#  packages the files into a single file, which is written to standard
#  output.
#
#     Files are separated by a header, ##########, followed by the file
#  name.  This simple scheme does not work if a file contains such a header
#  itself, and it's problematical for files of binary data.
#
############################################################################
#
#  See also:  unpack.icn
#
############################################################################

procedure main(args)
   local in, name

   every name := !args do {
      close(\in)
      in := open(name) | stop("cannot open input file: ",name)
      write("##########")
      write(name)
      while write(read(in))
      }

end
icon-9.4.3/ipl/progs/interpe.icn0000664000175000017500000000343407140713040016062 0ustar  chrishchrish############################################################################
#
#	File:     interpe.icn
#
#	Subject:  Program to interpret Icon expressions
#
#	Author:   Ralph E. Griswold
#
#	Date:     December 30, 1991
#
############################################################################
#
#   This file is in the public domain.
#
############################################################################
#
#    This program is a crude but effective interpreter for Icon expressions.
#  Each line entered from standard input is presumed to be an Icon
#  expression, is wrapped with a main procedure, and written to a pipe
#  that compiles and executes the resulting program.
#
#    If the expression is a generator, all its results are produced.
#  If the command-line option -e is given, the expression is echoed.
#
#    This technique is, of course, inefficient and may be painfully
#  slow except on the fastest platforms. This technique is, however,
#  completely general and as correct as Icon itself.
#
#    Note:  This programs creates files with the names stdin, stdin.u1,
#  and stdin.u2. It removes them before terminating, but, of course,
#  overwrites any pre-existing files by these names.
#
############################################################################
#
#  Requires: UNIX
#
#  See also:  interpp.icn
#
############################################################################

procedure main(args)
   local line, run, echo

   if args[1] == "-e" then echo := 1

   while line := read() do {
      run := open("icont -s - -x","pw")
      write(run,"procedure main()")
      if \echo then write(run,"   write(",image(line),")")
      write(run,"   every write(image(",line,"))")
      write(run,"end")
      close(run)
      }

   system("rm -f stdin stdin.u1 stdin.u2")

end
icon-9.4.3/ipl/progs/ifilter.icn0000664000175000017500000000472007140713042016053 0ustar  chrishchrish############################################################################
#
#	File:     ifilter.icn
#
#	Subject:  Program to filter lines of file
#
#	Author:   Ralph E. Griswold
#
#	Date:     January 21, 1999
#
############################################################################
#
#   This file is in the public domain.
#
############################################################################
#
#  This program applies the operation given as a command-line argument
#  to each line of standard input, writing out the results.  For example,
#
#	ifilter reverse