Code of the original Jewish/Civil Calendar

#This is the code of the MSDOS version. I modified it for the WWW.
#You may use this code for your own purposes if you wish, but notification to me
#that you have done so, and appropriate acknowledgement that this your source,
#would be appreciated.
#The table at the end was created by a separate program, which I ran on a
#128 *kilobyte* Zenith MSDOS computer.
#
#Place this file until the "cut here" line in file called "calendar.icn".
#Place the section from the cut line until the next cut line in a file
#called "calendar.hlp".
#Place the section from the second cut line until the end in a file called
#"calendar.dat". This file must have as its first line the first line of
#data. Remove the cut line.
#The Icon Programming Language translator and executor may be obtained by
#anonymous ftp from cs.arizona.edu in the Icon area. The source code is
#translated by the icont file to a file which is then executed by the
#iconx file. It is available for various platforms. Reference:
#The Icon Programming Language by Griswold and Griswold. (Prentice-Hall)

#A VISUALLY EQUIVALENT JEWISH/CIVIL CALENDAR
#ALAN D. CORRE, University of Wisconsin-Milwaukee
#No guarantees are given or implied as to the correctness of information
#furnished by this program.
#If my math were longer this program would be shorter. Excuse me.
#This work is respectfully devoted to the authors of two books consulted
#with much profit: "A Guide to the Solar-Lunar Calendar" by B. Elihu Rothblatt
#published by our sister Hebrew Dept. in Madison, Wis., and "Kiddush HaHodesh"
#by Rabbenu Moses ben Maimon, on whom be peace.
#The Jewish year harmonizes the solar and lunar cycle, using the 19-year cycle
#of Meton (c. 432 BCE). It corrects so that certain dates shall not fall on
#certain days for religious convenience. The Jewish year has six possible
#lengths, 353,354,355,383,384,385 days, according to day and time of new
#year lunation and position in Metonic cycle. Time figures from 6pm previous
#night. The lunation of year 1 is calculated to be on a Monday (our Sunday
#night) at 11:11:20 pm. Our data table begins with a hypothetical year 0,
#corresponding to 3762 B.C.E. Calculations in this program are figured in
#the ancient Babylonian unit of halaqim "parts" of the hour = 1/1080 hour.
#Version given here should work without change under MS-DOS. Hints are given
#for modifying the code for other systems. Your MS-DOS should be sensitive to
#ANSI screen controls. On many machines you may achieve this by having the
#MS-DOS file ansi.sys available at boot time, and also a file called 
#config.sys which contains the statement DEVICE=ANSI.SYS  Hints are offered
#in case this is impossible. 
#Material consists of three sections separated by legend CUT HERE. This first
#section should be placed in a file called calendar.icn. and compiled with
#icont. Section two should be placed in a file called calendar.hlp.
#The absence of this file will not impede the program. The information in 
#this file is unsuitable for the Macintosh. 
#Section three should be placed in a file called calendar.dat. This file is
#essential, and must contain no extraneous matter at the beginning.
#Program is run under MS.DOS by entering the command:
# iconx calendar
#which may optionally be followed by the years desired in the form 5750
#for a Jewish year +1990 or 1990AD or 1990CE or -1990 or 1990BC or
#1990BCE for a civil year. On some systems iconx can be omitted.
#This program was written under version 7 of Icon recognizing system
#functions (getch() is used). It should work satisfactorily on the current
#version of Icon.

record date(yr,mth,day)
record molad(day,halaqim)
global cyr,jyr,days_in_jyr,current_molad,current_day,infolist

procedure main(cmd)
  clear()
#  banner("PERPETUAL JEWISH/CIVIL CALENDAR","","by","","ALAN D. CORRE")
  if *cmd = 0 then {
#putting an asterisk indicates that user might need help
    n := 1; put(cmd,"*")} else
    n := *cmd
    every p := 1 to n do {
  initialize(cmd[p])
  process()}
end

procedure banner(l[])
#Creates a banner to begin programs. If you don't have the extended ASCII
#character set, replace each char(n) with some character that you have
#such as " " or "-"
#Does not work well if your screen has variable spacing.
local n
  write();write();write()
  writes(char(24)) #top left right angle
  writes(repl(char(24),78)) #straight line
  writes(char(24)) #top right right angle
  writes(char(24)) #upright line at left
  writes(right(char(24,79))) #upright line at right
  every n := 1 to *l do {
    writes(char(24)) #upright line at left
    writes(center(l[n],78),char(24)) #string centered followed by upright line
    writes(char(24)) #upright line at left
    writes(right(char(24),79)) #upright line at right
    
}
  writes(char(24)) #bottom left right angle
  writes(repl(char(24),78)) #straight line
  write(char(24)) #bottom right right angle
  write()
return
end

procedure instructions(filename)
#Gives user access to a help file which is printed out in chunks.
local filvar,counter,line
  writes("Do you need instructions? y/n ")
  if upto('yY',read()) then {
#The following if-statement fails if the file is not available
  counter := 0
  if filvar := open(filename) then
#Read the help file. 
    while line := read(filvar) do {
#Write out a line and increment the counter
      write(line)
      counter +:= 1
#Now we have a screenful; ask if we should continue
      if counter >22 then {
        write()
        writes ("More? y/n ")
#User has had enough; break out of loop
        if upto('nN',read()) then break  else
#User wants more; reset counter and continue
          counter := 0}} else
#This else goes with the second if-statement; the attempt to open the
#help file failed:
      write("Sorry, instructions not available.")}
    write ("Press return to continue.")
    read()
#Close the file if it existed and was opened. If it was never opened
#the value of filvar will be null. This check has to be made because
#an attempt to use close() on a variable NOT valued at a file would
#cause an error. 
/filvar | close(filvar)
end

procedure clear()
#clears the screen. If you don't have ANSI omit the next line
  writes("\e[2J")
end

procedure initialize_list()
#while user views banner, put info of calendar.dat into a global list
local infile,n
  infolist := list(301)
  if not (infile := open("calendar.dat")) then
    stop("This program must have the file CALENDAR.DAT on line in order to _
          function properly.")    
#the table is arranged arbitrarily at twenty year intervals with 301 entries.
  every n := 1 to 301 do
    infolist[n] := read(infile)
  close(infile)
end

procedure initialize_variables()
#get the closest previous year in the table
local line,quotient
  quotient := jyr.yr / 20 + 1
#only 301 entries. Figure from last if necessary.
  if quotient > 301 then quotient := 301
#pull the appropriate info, put into global variables
  line := infolist[quotient]
  line ? { current_molad.day := tab(upto('%'))
         move(1)
	 current_molad.halaqim := tab(upto('%'))
	 move(1)
	 cyr.mth := tab(upto('%'))
	 move(1)
	 cyr.day := tab(upto('%'))
	 move(1)
	 cyr.yr := tab(upto('%'))
	 days_in_jyr := line[-3:0]
	 }
#begin at rosh hashana
  jyr.day := 1
  jyr.mth := 7
return
end

procedure initialize(yr)
local year
#initialize global variables
initial {  cyr := date(0,0,0)
  jyr := date(0,0,0)
  current_molad := molad(0,0)
  initialize_list()}
  clear()
#user may need help
  if yr == "*" then {
  instructions("calendar.hlp")
  clear()
  writes("Please enter the year. If you are entering a CIVIL year, precede _
         by + for \ncurrent era, - (the minus sign) for before current era. ")
  year := read()} else
  year := yr
  while not (jyr.yr := cleanup(year)) do {
    writes("I do not understand ",year,". Please try again ")
    year := read()}
  clear()
  initialize_variables()
return
end

procedure cleanup(str)
#tidy up the string. Bugs still possible.
  if upto('+',str,2) then fail
  if (not upto('.+-',str)) & integer(str) & (str > 0) then return str
  if upto('-bB',str) then return (0 < (3761 - checkstr(str)))
  if upto('+cCaA',str) then return (checkstr(str) + 3760)
fail
end

procedure checkstr(s)
#does preliminary work on string before cleanup() cleans it up
local letter,n,newstr
  newstr := ""
  every n := 1 to *s do
    if integer(s[n]) then
      newstr ||:= s[n]
  if (*newstr = 0) | (newstr = 0) then fail
return newstr
end

procedure process()
#gets out the information
local limit,dj,dc
#this contains a correction
#6039 is last year handled by the table in the usual way
#The previous line should read 6019. Code has been corrected to erase
#this mistake. 
  if jyr.yr <= 6019 then {
    limit := jyr.yr % 20 
    jyr.yr := ((jyr.yr / 20) * 20)} else {
#otherwise figure from 6020 and good luck
#This has been corrected to 6000
    limit := jyr.yr - 6000
    jyr.yr := 6000}
  ans := "y"
  establish_jyr()
  every 1 to limit do {
#tell user something is going on
    writes(" .")
#increment the years, establish the type of Jewish year
    cyr_augment()
    jyr_augment()
    establish_jyr()}
  clear()
  write()
  while upto('Yy',ans) do {
  yj := jyr.yr
  dj := days_in_jyr
  every n := 1 to 4 do {
    clear()
    every 1 to 3 do
      write_a_month()
    write("Press return to continue")
    write()
    writes(status_line(yj,dj))
#be sure that your version of Icon recognises the function getch()
    read()}
    if jyr.mth = 6 then {
      clear()
      write_a_month()
      every 1 to 15 do write()
      write(status_line(yj,dj))}
    write()
    writes("Do you wish to continue? Enter y or n and hit return.y/n ")
#be sure that your version of Icon recognises the function getch()
    ans := read()}
return
end

procedure cyr_augment()
#Make civil year a year later, we only need consider Aug,Sep,Oct.
local days,newmonth,newday
 if cyr.mth = 8 then
   days := 0 else
 if cyr.mth = 9 then
   days := 31 else
 if cyr.mth = 10 then
   days := 61 else
 stop("Error in cyr_augment")
  writes(" .")
  days := (days + cyr.day-365+days_in_jyr)
  if isleap(cyr.yr + 1) then days -:= 1
#cos it takes longer to get there
  if days <= 31 then {newmonth := 8; newday := days} else
  if days <= 61 then {newmonth := 9; newday := days-31} else
  {newmonth := 10; newday := days-61} 
  cyr.mth := newmonth
  cyr.day := newday
  cyr.yr +:= 1
  if cyr.yr = 0 then cyr.yr := 1
return
end


procedure header()
#creates the header for Jewish and English side. If ANSI not available,
#substitute "S" for "\e[7mS\e[0m" each time.
  write(repl(" ",7),"S",repl(" ",2),"M",repl(" ",2),"T",repl(" ",2),"W",
        repl(" ",2),"T",repl(" ",2),"F",repl(" ",2),"\e[7mS\e[0m",repl(" ",27),
        "S",repl(" ",2),"M",repl(" ",2),"T",repl(" ",2),"W",
        repl(" ",2),"T",repl(" ",2),"F",repl(" ",2),"\e[7mS\e[0m")
end

procedure write_a_month()
#writes a month on the screen
  header()
  every 1 to 5 do 
    write(make_a_line())
  if jyr.day ~= 1 then
    write(make_a_line())
  write()
return
end

procedure status_line(a,b)
#create the status line at the bottom of screen
local sline,c,d
  c := cyr.yr
  if (cyr.day = 1) & (cyr.mth = 1) then c -:= 1
  d := 365
  if isleap(c) then d := 366
#if ANSI not available omit "\e[7m" and "|| "\e[0m""
  sline := ("\e[7mYear of Creation: " || a || "  Days in year: " || b ||
    "  Civil year: " || c || "  Days in year: " || d || "\e[0m")
return sline
end

procedure make_a_line()
#make a single line of the months
local line,blanks1,blanks2,start_point,end_point,flag,fm

#consider the first line of the month
  if jyr.day = 1 then {
    line := mth_table(jyr.mth,1)
#setting flag means insert civil month at end of line    
    flag := 1 } else
    line := repl(" ",3)
#consider the case where first day of civil month is on Sunday    
  if (cyr.day = 1) & (current_day = 1) then flag := 1
#space between month name and beginning of calendar
  line ||:= repl(" ",2)
#measure indentation for first line
  line ||:= blanks1 := repl(" ",3*(current_day-1))
#establish start point for Hebrew loop
  start_point := current_day
#establish end point for Hebrew loop and run civil loop
  every end_point := start_point to 7 do {
    line ||:= right(jyr.day,3)
    if not j_augment() then {jyr_augment(); establish_jyr(); current_day -:= 1; if current_day = 0 then current_day := 7}
    d_augment()
    if jyr.day = 1 then break }
#measure indentation for last line
  blanks2 := repl(" ",3*(7-end_point))
  line ||:= blanks2; line ||:= repl(" ",25); line ||:= blanks1
  every start_point to end_point do {
    line ||:= right(cyr.day,3)
    if (cyr.day = 1) then flag := 1 
    augment()}
  line ||:= blanks2 ||:= repl(" ",3)
  fm := cyr.mth
  if cyr.day = 1 then
    if cyr.mth = 1 then fm := 12 else fm := cyr.mth - 1
  if \flag then line ||:= mth_table(fm,2) else
    line ||:= repl(" ",3)
return line
end

procedure mth_table(n,p)
#generates the short names of Jewish and Civil months. Get to civil side
#by adding 13 (=max no of Jewish months)
static corresp
initial corresp := ["NIS","IYA","SIV","TAM","AV ","ELU","TIS","HES","KIS",
"TEV","SHE","ADA","AD2","JAN","FEB","MAR","APR","MAY","JUN","JUL","AUG","SEP",
"OCT","NOV","DEC"]
  if (p ~= 1) & (p ~= 2) then stop("ERROR IN MTH-TABLE") else
    if p = 2 then n +:= 13
return corresp[n]
end

procedure d_augment()
#increment the day of the week
  current_day +:= 1
  if current_day = 8 then current_day := 1
return
end

procedure augment()
#increments civil day, modifies month and year if necessary, stores in
#global variable cyr
  if cyr.day < 28 then
    cyr.day +:= 1 else
  if cyr.day = 28 then {
    if (cyr.mth ~= 2) | ((cyr.mth = 2) & isleap(cyr.yr)) then
      cyr.day := 29 else {
        cyr.mth := 3
	cyr.day  := 1}} else
  if cyr.day = 29 then {
    if cyr.mth ~= 2 then
      cyr.day := 30 else {
      cyr.mth := 3
      cyr.day := 1}} else
  if cyr.day = 30 then {
    if is_31(cyr.mth) then
      cyr.day := 31 else {
      cyr.mth +:= 1
      cyr.day := 1}} else {
      cyr.day := 1
      if cyr.mth ~= 12 then
        cyr.mth +:= 1 else {
        cyr.mth := 1
        cyr.yr +:= 1
        if cyr.yr = 0
	  then cyr.yr := 1}}
return
end

procedure is_31(n)
#civil months with 31 days
return n = 1 | n = 3 | n = 5 | n = 7 | n = 8 | n = 10 | n = 12
end

procedure isleap(n)
#checks for civil leap year
  if n > 0 then
return (n % 400 = 0) | ((n % 4 = 0) & (n % 100 ~= 0)) else
return (n % 400 = -1) | ((n % 4 = -1) & (n % 100 ~= -1))
end

procedure j_augment()
#increments jewish day. months are numbered from nisan, adar sheni is 13.
#procedure fails at elul to allow determination of type of new year
  if jyr.day < 29 then
    jyr.day +:= 1 else
  if (jyr.day = 30) | always_29(jyr.mth) | ((jyr.mth = 8) & 
    (days_in_jyr % 5 ~= 0)) | ((jyr.mth = 9) & ((days_in_jyr = 353) |
    (days_in_jyr = 383))) then
    jyr.mth +:= jyr.day := 1 else
  if jyr.mth = 6 then fail else
  if ((jyr.mth = 12) & (days_in_jyr < 383)) | (jyr.mth = 13) then
    jyr.mth := jyr.day := 1 else
  jyr.day := 30
return
end

procedure always_29(n)
#uncomplicated jewish months with 29 days
return n = 2 | n = 4 | n = 10
end

procedure jyr_augment()
#determines the current time of lunation, using the ancient babylonian unit
#of 1/1080 of an hour. lunation of tishri determines type of year. allows
#for leap year. halaqim = parts of the hour
local days, halaqim
  days := current_molad.day + 4
  if days_in_jyr <= 355 then {
    halaqim :=  current_molad.halaqim + 9516
    days := ((days +:= halaqim / 25920) % 7)
    if days = 0 then days := 7
    halaqim := halaqim % 25920} else {
    days +:= 1
    halaqim := current_molad.halaqim + 23269
    days := ((days +:= halaqim / 25920) % 7)
    if days = 0 then days := 7
    halaqim := halaqim % 25920}
  current_molad.day := days
  current_molad.halaqim := halaqim
#reset the global variable which holds the current jewish date
  jyr.yr +:= 1 #increment year
  jyr.day := 1
  jyr.mth := 7
  establish_jyr()
return
end

procedure establish_jyr()
#establish the jewish year from get_rh
local res
  res := get_rh(current_molad.day,current_molad.halaqim,no_lunar_yr(jyr.yr))
  days_in_jyr := res[2]
  current_day := res[1]
return
end    

procedure isin1(i)
#the isin procedures are sets of years in the Metonic cycle
return i = (1 | 4 | 7 | 9 | 12 | 15 | 18)
end

procedure isin2(i)
return i = (2 | 5 | 10 | 13 | 16)
end

procedure isin3(i)
return i = (3 | 6 | 8 | 11 | 14 | 17 | 0)
end

procedure isin4(i)
return i = (1 | 2 | 4 | 5 | 7 | 9 | 10 | 12 | 13 | 15 | 16 | 18)
end

procedure isin5(i)
return i = (1 | 4 | 9 | 12 | 15)
end

procedure isin6(i)
return i = (2 | 5 | 7 | 10 | 13 | 16 | 18)
end

procedure no_lunar_yr(i)
#what year in the metonic cycle is it?
return i % 19
end

procedure get_rh(d,h,yr)
#this is the heart of the program. check the day of lunation of tishri
#and determine where breakpoint is that sets the new moon day in parts
#of the hour. return result in a list where 1 is day of rosh hashana and
#2 is length of jewish year
local c,result
  c := no_lunar_yr(yr)
  result := list(2)
  if d = 1 then {
  		result[1] := 2
                if (h < 9924) & isin4(c) then result[2] := 353 else
		if (h < 22091) & isin3(c) then result[2] := 383 else
		if (h > 9923) & (isin1(c) | isin2(c)) then result[2] := 355 else
		if (h > 22090) & isin3(c) then result[2] := 385
		} else
  if d = 2 then {
  		if ((h < 16789) & isin1(c)) |
		   ((h < 19440) & isin2(c)) then {
				                 result[1] := 2
					         result[2] := 355
					         } else
		if (h < 19440) & isin3(c) then  {
				                 result[1] := 2
					         result[2] := 385
					         } else
  		if ((h > 16788) & isin1(c)) |
		   ((h > 19439) & isin2(c)) then {
				                 result[1] := 3
					         result[2] := 354
					         } else
                if (h > 19439) & isin3(c) then  {
				                 result[1] := 3
					         result[2] := 384
					         }
		} else
  if d = 3 then {
  		if (h < 9924) & (isin1(c) | isin2(c)) then {
							   result[1] := 3
							   result[2] := 354
							   } else
		if (h < 19440) & isin3(c) then {
					       result[1] := 3
					       result[2] := 384
					       } else
		if (h > 9923) & isin4(c) then {
					      result[1] := 5
					      result[2] := 354
					      } else
		if (h > 19439) & isin3(c) then {
					       result[1] := 5
					       result[2] := 383}
		} else
  if d = 4 then {
  		result[1] := 5
		if isin4(c) then result[2] := 354 else
		if h < 12575 then result[2] := 383 else
		result[2] := 385
		} else
  if d = 5 then {
                if (h < 9924) & isin4(c) then {
					      result[1] := 5
					      result[2] := 354} else
		if (h < 19440) & isin3(c) then {
					       result[1] := 5
					       result[2] := 385
					       } else
		if (9923 < h < 19440) & isin4(c) then {
						      result[1] := 5
						      result[2] := 355
						      } else
		if h > 19439 then {
		  		  result[1] := 7
                		  if isin3(c) then result[2] := 383 else
		                    result[2] := 353
				  }
		} else
  if d = 6 then {
	        result[1] := 7
	        if ((h < 408) & isin5(c)) | ((h < 9924) & isin6(c)) then
	      					result[2] := 353 else
	        if ((h < 22091) & isin3(c)) then result[2] := 383 else
	        if ((h > 407) & isin5(c)) | ((h > 9923) & isin6(c)) then
	      					result[2] := 355 else
	        if (h > 22090) & isin3(c) then result[2] := 385
	        } else
  if d = 7 then	if (h < 19440) & (isin5(c) | isin6(c)) then {
							  result[1] := 7
							  result[2] := 355
							  } else
		if (h < 19440) & isin3(c) then {
					       result[1] := 7
					       result[2] := 385
					       } else {
					              result[1] := 2
						      if isin4(c) then
						        result[2] := 353 else
							result[2] := 383}
return result
end


#If the following help file doesnt quite look right try throwing in a
#few blank lines here or there, or take them out.
# [cut here]----------------------------------------------------------


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 return. At the end of the year you can indicate if
you wish the program to conclude, by hitting return 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. [Added note 2002: If you happen to be using the Opera browser,
you must use this format for CE dates. This is because the
Opera browser does not encode the plus sign, and so treats it as a
space. This appears to me to be a bug in the browser.]

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 the years you
wish to see on the command line. For example, if you call the program
		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 centuries before the current era 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


Note: this program was implemented for a z-29 terminal assuming ANSI mode.
This version is for MS-DOS obeying ANSI commands. It has lately been
modified slightly for CGI use on the World Wide Web. I have not published
the code of this latter version, since I have not bothered to tidy it up,
and it does not look pretty.

cut here------------------------------------------------------------------
3%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

More information on the Icon Programming Language?
Go back to Front Frame
Alan D. Corré
corre@uwm.edu