diff --git a/FST/Alex.hs b/FST/Alex.hs
new file mode 100644
--- /dev/null
+++ b/FST/Alex.hs
@@ -0,0 +1,377 @@
+{------------------------------------------------------------------------------
+				 SCANNING TEXT
+
+This module provides the run-time interface to the `Alex' package.  The
+functions in this module take the raw tables generated by `lx' and constructs
+scanners, functions for cutting input text into tokens.
+
+Many scanners need to maintain the location of the tokens in the input text for
+diagnostics generation and for parsing layout-sensitive languages like Haskell.
+Thus the first section defines `Posn' type for locating tokens in the input
+text.
+
+Two scanning packages are given.  The first, `scan', generates simple stateless
+scanners that generate streams of tokens.  The second, `gscan', provides
+general scanners with access to the scanner's internal state, hooks for
+application-specific state and no restriction on the return type of the
+scanner.
+
+`gscan' should be adequate for most application but, if it isn't, the
+components used to assemble it are available at the end of the module for
+reassembly into a suitable configuration.
+
+Chris Dornan, Aug-95, 10-Jul-96, 29-Sep-97
+------------------------------------------------------------------------------}
+
+module FST.Alex where
+
+import Data.Array
+
+{------------------------------------------------------------------------------
+				Token Positions
+------------------------------------------------------------------------------}
+
+
+
+-- `Posn' records the location of a token in the input text.  It has three
+-- fields: the address (number of chacaters preceding the token), line number
+-- and column of a token within the file. `start_pos' gives the position of the
+-- start of the file and `eof_pos' a standard encoding for the end of file.
+-- `move_pos' calculates the new position after traversing a given character,
+-- assuming the usual eight character tab stops.
+
+data Posn = Pn !Int !Int !Int
+	deriving (Eq,Show)
+
+start_pos:: Posn
+start_pos = Pn 0 1 1
+
+eof_pos:: Posn
+eof_pos = Pn (-1) (-1) (-1)
+
+move_pos:: Posn -> Char -> Posn
+move_pos (Pn a l c) '\t' = Pn (a+1)  l     (((c+7) `div` 8)*8+1)
+move_pos (Pn a l c) '\n' = Pn (a+1) (l+1)   1
+move_pos (Pn a l c) _    = Pn (a+1)  l     (c+1)
+
+
+
+{------------------------------------------------------------------------------
+				     scan
+------------------------------------------------------------------------------}
+
+
+
+-- The @Scan@ package generates simple scanners that convert input text to
+-- streams of tokens.  The scanners are stateless as each token generated is a
+-- function of its textual content and location.
+--
+-- The token actions take the form of an association list associating each
+-- token name with an action function that constructs the token from the text
+-- matched and its location.  The stop action is invoked when no more input can
+-- be tokenised; it takes the residual input and its position and generates the
+-- remaining stream of tokens, usually the empty list or an end-of-file token
+-- if the empty string is passed, an error token otherwise.
+
+type Actions t = ([(String,TokenAction t)], StopAction t)
+
+type TokenAction t = Posn -> String -> t
+
+type StopAction t = Posn -> String -> [t]
+
+
+-- @load_scan@ combines the actions with the dump generated by \lx\ to produce
+-- a @Scan@ structure that can be passed to @scan@.  @scan@ takes the scanner
+-- and the input text and generates a stream of tokens.  It assumes that the
+-- text is at the start of the input with the position set to @start_pos@ (see
+-- above) and sets the last character read to newline (the last character read
+-- is used to resolve leading context specifications); @scan'@ can be used to
+-- override these defaults.
+
+load_scan:: Actions t -> DFADump -> Scan t
+scan:: Scan t -> String -> [t]
+scan':: Scan t -> Posn -> Char -> String -> [t]
+
+
+-- `Scan' is an straightforward construction on `GScan'.
+
+type Scan t = GScan () [t]
+
+load_scan (al,s_a) dmp = load_gscan (al',s_a') dmp
+	where
+	al' = [(nm,mk_act f)|(nm,f)<-al]
+
+	mk_act f = \p _ inp len cont sc_s -> f p (take len inp):cont sc_s
+
+	s_a' p _ inp _ = s_a p inp
+
+scan scr inp = scan' scr start_pos '\n' inp
+
+scan' scr p c inp = gscan' scr p c inp (0,())
+
+
+
+{------------------------------------------------------------------------------
+				    gscan
+------------------------------------------------------------------------------}
+
+
+
+-- The @gscan@ package generates general-purpose scanners for converting input
+-- text into a return type determined by the application.  Access to the
+-- scanner's internal state, start codes and some application-specific state is
+-- provided.
+--
+-- The token actions take the form of an association list associating each
+-- token name with an action function that constructs the result from the
+-- length of the token, the scanner's state (including the remaining input from
+-- the start of the token) and a continuation function that scans the remaining
+-- input.
+--
+-- More specifically, each token action takes as arguments the position of the
+-- token, the last character read before the token (used to resolve leading
+-- context), the whole input text from the start of the token, the length of
+-- the token, the continuation function and the visible state (as distinct from
+-- the scanner's internal state) including the current start code and the
+-- application specific state.  The stop action is invoked when no more input
+-- can be scanned; it takes the same parameters as the token actions, except
+-- the token length and the continuation function.
+
+type GScan s r = (DFA (GTokenAction s r), GStopAction s r)
+
+type GActions s r = ([(String, GTokenAction s r)], GStopAction s r)
+
+type GTokenAction s r =
+	Posn -> Char -> String -> Int ->
+		((StartCode,s)->r) -> (StartCode,s) -> r
+
+type GStopAction s r = Posn -> Char -> String -> (StartCode,s) -> r
+
+
+-- @load_gscan@ combines the actions with the dump generated by lx to produce a
+-- @GScan@ structure that can be passed to @gscan@.  @gscan@ takes the scanner,
+-- the application-specific state and the input text as parameters.  It assumes
+-- that the text is at the start of the input with the position set to
+-- @start_pos@ (see above) and sets the last character read to new-line and the
+-- start code to 0; @gscan'@ can be used to override these defaults.
+
+load_gscan:: GActions s r -> DFADump -> GScan s r
+gscan:: GScan s r -> s -> String -> r
+gscan':: GScan s r -> Posn -> Char -> String -> (StartCode,s) -> r
+
+load_gscan (al,s_a) dmp = (load_dfa al df dmp,s_a)
+	where
+	df = \_ _ _ _ cont s -> cont s
+
+gscan scr s inp = gscan' scr start_pos '\n' inp (0,s)
+
+gscan' scr@(dfa,s_a) p c inp sc_s =
+	case scan_token dfa sc_s p c inp of
+	  Nothing -> s_a p c inp sc_s
+	  Just (p',c',inp',len,Acc _ _ t_a _ _ _) ->
+				t_a p c inp len (gscan' scr p' c' inp') sc_s
+
+
+
+{------------------------------------------------------------------------------
+				SCAN INTERNALS
+
+The internals of the Scan module follow.  They shouldn't be required by most
+applications.
+------------------------------------------------------------------------------}
+
+
+
+{------------------------------------------------------------------------------
+				  scan_token
+------------------------------------------------------------------------------}
+
+
+
+-- `scan_token' picks out the next token from the input.  It takes the DFA and
+-- the usual parameters and returns the `Accept' structure associated with the
+-- highest priority token matching the longest input sequence, nothing if no
+-- token matches.  Associated with `Accept' in `Sv' is the length of the token
+-- as well as the position, previous character and remaining input at the end
+-- of accepted token (i.e., the start of the next token).
+
+type Sv t = (Posn,Char,String,Int,Accept t)
+
+scan_token:: DFA f -> (StartCode,s) -> Posn -> Char -> String -> Maybe (Sv f)
+scan_token dfa sc_s p c inp =
+	case dropWhile (check_ctx dfa sc_s c) (scan_tkn dfa p c inp 0 0 []) of
+	  [] -> Nothing
+	  sv:_ -> Just sv
+
+-- This function takes the DFA, scanner state, last character read and an `Sv'
+-- structure and determines whether the token has the right context to be
+-- accepted.  It may have some leading or trailing context or be restricted to
+-- certain start codes.
+--
+-- Note that the trailing context is checked by invoking `scan_tkn' with the
+-- given state in the DFA corresponding to the regular expression specifying
+-- the trailing context; while this may be inefficient, trailing context is
+-- rarely used and it avoids well-known infidelities arrising from the more
+-- efficient method used by Lex and Flex.
+
+check_ctx:: DFA f -> (StartCode,s) -> Char -> Sv f -> Bool
+check_ctx dfa sc_s c (p',c',inp',_,acc) =
+	case acc of
+	  Acc _ _ _ [] Nothing Nothing -> False
+	  Acc _ _ _ scs lctx rctx ->
+		chk_scs sc_s scs || chk_lctx lctx || chk_rctx p' c' inp' rctx
+	where
+	chk_scs (sc,_) [] = False
+	chk_scs (sc,_) scs = sc `notElem` scs
+
+	chk_lctx Nothing = False
+	chk_lctx (Just st) = not(st c)
+
+	chk_rctx p' c' inp' Nothing = False
+	chk_rctx p' c' inp' (Just sn) = null(scan_tkn dfa p' c' inp' 0 sn [])
+
+-- This function performs most of the work of `scan_token'.  It pushes the
+-- input through the DFA, remembering the accepting states it encounters on a
+-- stack.  No context is checked here.  A space leak could result from a long
+-- token with many valid prefixes, leading to a large stack.  This space leak
+-- is avoided in most cases by discarding the stack if an unconditional state
+-- is pushed on (no state below an unconditional state will be needed).
+
+scan_tkn:: DFA f -> Posn -> Char -> String -> Int -> SNum -> [Sv f] -> [Sv f]
+scan_tkn dfa p c inp len s stk =
+	if s>=0
+	   then case inp of
+		  [] -> stk'
+		  c':inp' -> scan_tkn dfa p' c' inp' (len+1) s' stk'
+			where
+			p' = move_pos p c'
+			s' = if inRange (bounds out) c' then out!c' else df
+	   else stk
+	where
+	stk' =	if clr then svs else svs ++ stk
+	svs  =	[(p,c,inp,len,acc)| acc<-accs]
+
+	St clr accs df out = dfa!s
+
+
+
+{------------------------------------------------------------------------------
+				     DFAs
+------------------------------------------------------------------------------}
+
+
+
+-- (This section should logically belong to the DFA module but it has been
+-- placed here to make this module self-contained.)
+--
+-- `DFA' provides an alternative to `Scanner' (described in the RExp module);
+-- it can be used directly to scan text efficiently.  Additionally it has an
+-- extra place holder for holding action functions for generating
+-- application-specific tokens.  When this place holder is not being used, the
+-- unit type will be used.
+--
+-- Each state in the automaton consist of a list of `Accept' values, descending
+-- in priority, and an array mapping characters to new states.  As the array
+-- may only cover a sub-range of the characters, a default state number is
+-- given in the third field.  By convention, all transitions to the -1 state
+-- represent invalid transitions.
+--
+-- A list of accept states is provided for as the original specification may
+-- have been ambiguous, in which case the highest priority token should be
+-- taken (the one appearing earliest in the specification); this can not be
+-- calculated when the DFA is generated in all cases as some of the tokens may
+-- be associated with leading or trailing context or start codes.
+--
+-- `scan_token' (see above) can deal with unconditional accept states more
+-- efficiently than those associated with context; to save it testing each time
+-- whether the list of accept states contains an unconditional state, the flag
+-- in the first field of `St' is set to true whenever the list contains an
+-- unconditional state.
+--
+-- The `Accept' structure contains the priority of the token being accepted
+-- (lower numbers => higher priorities), the name of the token, a place holder
+-- that can be used for storing the `action' function for constructing the
+-- token from the input text and thge scanner's state, a list of start codes
+-- (listing the start codes that the scanner must be in for the token to be
+-- accepted; empty => no restriction), the leading and trailing context (both
+-- `Nothing' if there is none).
+--
+-- The leading context consists simply of a character predicate that will
+-- return true if the last character read is acceptable.  The trailing context
+-- consists of an alternative starting state within the DFA; if this `sub-dfa'
+-- turns up any accepting state when applied to the residual input then the
+-- trailing context is acceptable (see `scan_token' above).
+
+type DFA a = Array SNum (State a)
+
+type SNum = Int
+
+data State a = St Bool [Accept a] SNum (Array Char SNum)
+
+data Accept a = Acc Int String a [StartCode] (Maybe(Char->Bool)) (Maybe SNum)
+
+type StartCode = Int
+
+
+-- `DFADump' is the format used to encode DFAs by lx.  `dump_dfa' will encode
+-- the DFA (ignoring any action functions), `recover_dfa' will recover it again
+-- and `load_dfa' will additionally combine the action functions specified in
+-- an association list.
+
+type DFADump = [(Bool,[AcceptDump],SNum,ArrDump Int)]
+
+type AcceptDump  = (Int,String,[StartCode],Maybe(ArrDump Bool),Maybe SNum)
+
+type ArrDump a = ((Char,Char),[(Char,a)])
+
+
+dump_dfa:: DFA a -> DFADump
+dump_dfa dfa = map dp_st (elems dfa)
+	where
+	dp_st (St cl accs df out) = (cl,map dp_acc accs,df,dp_out df out)
+
+	dp_acc (Acc n nm _ scs lctx rctx) =
+				(n,nm,scs,dp_lctx lctx,rctx)
+
+	dp_lctx Nothing = Nothing
+	dp_lctx (Just st) =
+		case as of
+		  [] -> Just (('1','0'),[])
+		  _  -> Just ((fst(head as),fst(last as)),as)
+		where
+		as = [(c,True)| c<-dfa_alphabet, st c]
+
+	dp_out df ar = (bounds ar,[(c,n)| (c,n)<-assocs ar, n/=df])
+
+load_dfa:: [(String,f)] -> f -> DFADump -> DFA f
+load_dfa al df dmp = fmap f (recover_dfa dmp)
+	where
+	f (St clr accs dflt ar) = St clr (map g accs) dflt ar
+
+	g (Acc n nm _ scs lctx rctx) = Acc n nm t_a scs lctx rctx
+		where
+		t_a =	case dropWhile (\(nm',_)->nm/=nm') al of
+			  []        -> df
+			  (_,t_a):_ -> t_a
+
+recover_dfa:: DFADump -> DFA ()
+recover_dfa l = listArray bds [rc_st cl accs df out| (cl,accs,df,out)<-l]
+	where
+	bds = (0,length l-1)
+
+	rc_st cl accs df out = St cl (rc_accs accs) df (rc_arr df out)
+
+	rc_accs accs = map rc_acc accs
+
+	rc_acc (n,nm,scs,lctx,rctx) =
+			Acc n nm () scs (rc_lctx lctx) rctx
+
+	rc_lctx Nothing = Nothing
+	rc_lctx (Just ad) = Just (tst(rc_arr False ad))
+		where
+		tst arr c = if inRange (bounds arr) c then arr!c else False
+
+	rc_arr df (bs,as) = listArray bs [df|_<-range bs] // [(c,y)|(c,y)<-as]
+
+dfa_alphabet:: [Char]
+dfa_alphabet = ['\0'..'\255']
diff --git a/FST/Arguments.hs b/FST/Arguments.hs
new file mode 100644
--- /dev/null
+++ b/FST/Arguments.hs
@@ -0,0 +1,180 @@
+{-
+   **************************************************************
+   * Filename      : Arguments.hs                               *
+   * Author        : Markus Forsberg                            *
+   *                 d97forma@dtek.chalmers.se                  *
+   * Last Modified : 6 July, 2001                               *
+   * Lines         : -                                          *
+   **************************************************************
+-}
+
+module FST.Arguments ( parseInteractive,
+                   InteractiveCommand(..),
+                   isFST,
+                   isDAT,
+                   isNET,
+                   isTHIS,
+                   parseBatch,
+                   inputB,
+                   outputB,
+                   isUpB
+                 ) where
+
+import FST.GetOpt
+
+data InteractiveCommand = BuildTransducer                |
+                          BuildNTransducer               |
+                          Minimize                       |
+                          Determinize                    |
+			  StdInReg String                |
+			  Load FilePath                  |
+                          LUnion FilePath FilePath       |
+                          LProduct FilePath FilePath     |
+                          LStar FilePath                 |
+                          LComposition FilePath FilePath |
+			  Save FilePath                  |
+			  ApplyDown                      |
+			  ApplyUp                        |
+			  ApplyD [String]                |
+			  ApplyU [String]                |
+			  ViewReg                        |
+			  ViewInput                      |
+			  ViewOutput                     |
+                          ViewTransducer                 |
+			  Help                           |
+			  ClearMemory                    |
+			  Quit                           |
+			  NoCommand
+
+parseInteractive :: [String] -> InteractiveCommand
+parseInteractive ["b"]                   = BuildTransducer
+parseInteractive ["bn"]                  = BuildNTransducer
+parseInteractive ["m"]                   = Minimize
+parseInteractive ["det"]                 = Determinize
+parseInteractive ("r":xs)                = StdInReg (unwords xs)
+parseInteractive ["d"]                   = ApplyDown
+parseInteractive ["u"]                   = ApplyUp
+parseInteractive ("d":xs)                = ApplyD xs
+parseInteractive ("u":xs)                = ApplyU xs
+parseInteractive ["l",file]              = Load file
+parseInteractive ["l",file1,"|",file2]   = LUnion file1 file2
+parseInteractive ["l",file1," ",file2]   = LProduct file1 file2
+parseInteractive ["l",file, "*"]         = LStar file
+parseInteractive ["l",file1,".o.",file2] = LComposition file1 file2
+parseInteractive ["s",file]              = Save file
+parseInteractive ["vt"]                  = ViewTransducer
+parseInteractive ["vi"]                  = ViewInput
+parseInteractive ["vo"]                  = ViewOutput
+parseInteractive ["vr"]                  = ViewReg
+parseInteractive ["h"]                   = Help
+parseInteractive ["q"]                   = Quit
+parseInteractive ["c"]                   = ClearMemory
+parseInteractive _                       = NoCommand
+
+isFST :: String -> Bool
+isFST str = case (reverse str) of
+	     ('t':'s':'f':'.':_)  -> True
+	     _                    -> False
+
+isDAT :: String -> Bool
+isDAT str = case (reverse str) of
+	     ('t':'a':'d':'.':_)  -> True
+	     _                    -> False
+
+isNET :: String -> Bool
+isNET str = case (reverse str) of
+             ('t':'e':'n':'.':_) -> True
+             _                 -> False
+
+isTHIS :: String -> Bool
+isTHIS = (== "*")
+
+isApplyUp :: [String] -> Bool
+isApplyUp = elem "-u"
+
+data BatchCommand = DownB                   |
+		    UpB                     |
+		    InvalidCommand          |
+		    Input String            |
+		    Output String           |
+		    HelpB
+ deriving Show
+
+batchOptions :: [OptDescr BatchCommand]
+batchOptions = [Option ['u'] ["up"]     (NoArg UpB)             "apply the transducer up (default is down)",
+                Option ['d'] ["down"]   (NoArg DownB)           "apply the transducer down (default)",
+                Option ['i'] ["input"]  (ReqArg Input "FILE")  "read input from FILE",
+                Option ['o'] ["output"] (ReqArg Output "FILE") "write output to FILE"]
+
+parseBatch :: [String] -> Either String (FilePath,[BatchCommand])
+parseBatch cmdline = case getOpt Permute batchOptions cmdline of
+                      (o,[file],[]) -> Right (file,o)
+                      (_,_,errs)    -> Left $ concat errs ++ usageInfo header batchOptions
+ where header = "Usage: fst [FILE.net or FILE.fst] [OPTIONS...]"
+
+inputB :: [BatchCommand] -> Maybe FilePath
+inputB               [] = Nothing
+inputB ((Input file):_) = return file
+inputB (_:xs)           = inputB xs
+
+outputB :: [BatchCommand] -> Maybe FilePath
+outputB []                = Nothing
+outputB ((Output file):_) = return file
+outputB (_:xs)            = outputB xs
+
+isUpB :: [BatchCommand] -> Bool
+isUpB []      = False
+isUpB (UpB:_) = True
+isUpB (_:xs)  = isUpB xs
+
+{-
+-----------------------------------------------------------------------------------------
+-- and here a small and hopefully enlightening example:
+
+data Flag = Verbose | Version | Name String | Output String | Arg String   deriving Show
+
+options :: [OptDescr Flag]
+options =
+   [Option ['v']     ["verbose"]           (NoArg Verbose)      "verbosely list files",
+    Option ['V','?'] ["version","release"] (NoArg Version)      "show version info",
+    Option ['o']     ["output"]            (OptArg out "FILE")  "use FILE for dump",
+    Option ['n']     ["name"]              (ReqArg Name "USER") "only dump USER's files"]
+
+out :: Maybe String -> Flag
+out Nothing  = Output "stdout"
+out (Just o) = Output o
+
+test :: ArgOrder Flag -> [String] -> String
+test order cmdline = case getOpt order options cmdline of
+                        (o,n,[]  ) -> "options=" ++ show o ++ "  args=" ++ show n ++ "\n"
+                        (_,_,errs) -> concat errs ++ usageInfo header options
+   where header = "Usage: foobar [OPTION...] files..."
+
+-- example runs:
+-- putStr (test RequireOrder ["foo","-v"])
+--    ==> options=[]  args=["foo", "-v"]
+-- putStr (test Permute ["foo","-v"])
+--    ==> options=[Verbose]  args=["foo"]
+-- putStr (test (ReturnInOrder Arg) ["foo","-v"])
+--    ==> options=[Arg "foo", Verbose]  args=[]
+-- putStr (test Permute ["foo","--","-v"])
+--    ==> options=[]  args=["foo", "-v"]
+-- putStr (test Permute ["-?o","--name","bar","--na=baz"])
+--    ==> options=[Version, Output "stdout", Name "bar", Name "baz"]  args=[]
+-- putStr (test Permute ["--ver","foo"])
+--    ==> option `--ver' is ambiguous; could be one of:
+--          -v      --verbose             verbosely list files
+--          -V, -?  --version, --release  show version info
+--        Usage: foobar [OPTION...] files...
+--          -v        --verbose             verbosely list files
+--          -V, -?    --version, --release  show version info
+--          -o[FILE]  --output[=FILE]       use FILE for dump
+--          -n USER   --name=USER           only dump USER's files
+-----------------------------------------------------------------------------------------
+
+test :: ArgOrder BatchCommand -> [String] -> String
+test order cmdline = case getOpt order batchOptions cmdline of
+                        (o,n,[]  ) -> "options=" ++ show o ++ "  args=" ++ show n ++ "\n"
+                        (_,_,errs) -> concat errs ++ usageInfo header batchOptions
+   where header = "Usage: fst [OPTION...] files..."
+-}
diff --git a/FST/Automaton.hs b/FST/Automaton.hs
new file mode 100644
--- /dev/null
+++ b/FST/Automaton.hs
@@ -0,0 +1,96 @@
+{-
+   **************************************************************
+   * Filename      : Automaton.hs                               *
+   * Author        : Markus Forsberg                            *
+   *                 d97forma@dtek.chalmers.se                  *
+   * Last Modified : 6 July, 2001                               *
+   * Lines         : 120                                        *
+   **************************************************************
+-}
+
+module FST.Automaton ( module FST.AutomatonTypes,
+                   Automaton, -- data type for an automaton
+                   construct, -- construct an automaton.
+                   Convertable, -- type class for conversion to
+                                -- an from an 'Automaton'.
+                   decode, -- from an automaton to an structure.
+                   encode, -- from a structure to an Automaton.
+                   rename,
+                   showAutomaton
+                  ) where
+
+import FST.AutomatonTypes
+import FST.Utils (tagging)
+
+import Data.Maybe (fromJust)
+
+-- data type for an automaton
+data Automaton a = Automaton {
+                              stateTrans     :: TransitionTable a,
+                              initialStates  :: InitialStates,
+                              finalStates    :: FinalStates,
+                              alpha          :: Sigma a,
+                              firstS         :: FirstState,
+                              lastS          :: LastState
+                             }
+ deriving (Show,Read)
+
+-- | Construct an automaton
+construct :: (FirstState,LastState) -> TransitionTable a ->
+             Sigma a -> InitialStates -> FinalStates -> Automaton a
+construct bs table sigma inits fs = Automaton {
+                                             stateTrans    = table,
+                                             initialStates = inits,
+                                             finalStates   = fs,
+                                             alpha         = sigma,
+                                             firstS        = fst bs,
+                                             lastS         = snd bs
+                                             }
+
+-- |Instance of AutomatonFunctions
+instance AutomatonFunctions Automaton where
+ states                 = (map fst).stateTrans
+ isFinal auto s         = elem s (finalStates auto)
+ initials               = initialStates
+ finals                 = finalStates
+ transitionTable        = stateTrans
+ transitionList auto s  = case (lookup s (stateTrans auto)) of
+                           Just tl -> tl
+                           _       -> []
+ transitions auto (s,a) = map snd $ filter (\(b,_) -> b == a) $ transitionList auto s
+ firstState             = firstS
+ lastState              = lastS
+ alphabet               = alpha
+
+-- | Convert automaton labelled with something other than
+--   states to an 'Automaton'.
+rename :: Eq b => [(b,[(a,b)])] -> Sigma a -> [b] -> [b] ->
+                                         State -> Automaton a
+rename tTable sigma initS fs s
+  = let (maxS,table) = tagging (map fst tTable) s
+        nI           = map (\b  -> lookupState b table) initS
+        nfs          = map (\b -> lookupState b table) fs
+        nTrans       = renameTable tTable table
+     in construct (s,maxS) nTrans sigma nI nfs
+ where lookupState st tab = fromJust $ lookup st tab
+       renameTable [] _ = []
+       renameTable ((b,tl):tll) table
+        = let s1  = lookupState b table
+              ntl = map (\(a,b1) -> (a,lookupState b1 table)) tl
+           in (s1,ntl):renameTable tll table
+
+-- | Type class Convertable
+class Convertable f where
+ encode :: Eq a => f a -> Automaton a
+ decode :: Eq a => Automaton a -> f a
+
+-- | Display the automaton
+showAutomaton :: Show a => Automaton a -> String
+showAutomaton auto
+  = "\n>>>> Automaton Construction <<<<" ++
+    "\n\nTransitions:\n"       ++ aux  (stateTrans auto)     ++
+    "\nNumber of States   => " ++ show (length (stateTrans auto)) ++
+    "\nInitials           => " ++ show (initials auto)       ++
+    "\nFinals             => " ++ show (finals auto)         ++ "\n"
+  where aux []          = []
+        aux ((s,tl):xs) = show s ++" => " ++ show tl ++ "\n" ++ aux xs
diff --git a/FST/AutomatonInterface.hs b/FST/AutomatonInterface.hs
new file mode 100644
--- /dev/null
+++ b/FST/AutomatonInterface.hs
@@ -0,0 +1,58 @@
+{-
+   **************************************************************
+   * Filename      : AutomatonInterface.hs                      *
+   * Author        : Markus Forsberg                            *
+   *                 d97forma@dtek.chalmers.se                  *
+   * Last Modified : 6 July, 2001                               *
+   * Lines         : 58                                         *
+   **************************************************************
+-}
+
+module FST.AutomatonInterface ( compileNFA,
+                            minimize,
+                            complete,
+                            determinize,
+                            compile,
+                            Automaton,
+                            states,
+                            isFinal,
+                            initial,
+                            finals,
+                            transitionList,
+                            transitions,
+                            showAutomaton,
+                            module FST.RegTypes,
+                            module FST.AutomatonTypes,
+                            numberOfStates,
+                            numberOfTransitions
+                          ) where
+
+import FST.Automaton
+import FST.AutomatonTypes
+import qualified FST.MinimalBrzozowski as M
+import FST.Complete
+import qualified FST.Deterministic as D
+import qualified FST.LBFA as L
+import FST.RegTypes
+
+compileNFA :: Ord a => Reg a -> Sigma a -> State -> Automaton a
+compileNFA reg sigma s = L.compileToAutomaton reg sigma s
+
+minimize :: Ord a => Automaton a -> Automaton a
+minimize automaton = M.minimize automaton
+
+determinize :: Ord a => Automaton a -> Automaton a
+determinize automaton = D.determinize automaton
+
+compile :: Ord a => Reg a -> Sigma a -> State -> Automaton a
+compile reg sigma s = minimize $ L.compileToAutomaton reg sigma s
+
+initial :: Automaton a -> State
+initial automaton = head $ initials automaton
+
+numberOfStates :: Ord a => Automaton a -> Int
+numberOfStates auto = length $ states auto
+
+numberOfTransitions :: Ord a => Automaton a -> Int
+numberOfTransitions auto = sum [length (transitionList auto s) |
+                                s <- states auto]
diff --git a/FST/AutomatonTypes.hs b/FST/AutomatonTypes.hs
new file mode 100644
--- /dev/null
+++ b/FST/AutomatonTypes.hs
@@ -0,0 +1,63 @@
+{-
+   **************************************************************
+   * Filename      : AutomatonTypes.hs                          *
+   * Author        : Markus Forsberg                            *
+   *                 d97forma@dtek.chalmers.se                  *
+   * Last Modified : 6 July, 2001                               *
+   * Lines         : 71                                         *
+   **************************************************************
+-}
+
+module FST.AutomatonTypes ( State,          -- State.
+                        FirstState,     -- the first state.
+                        LastState,      -- the last state.
+                        InitialStates,  -- the initial states.
+                        FinalStates,    -- set of final states.
+                        Transitions,    -- set of transitions.
+                        TransitionTable, -- table of transitions.
+                        Sigma,           -- the alphabet of an automaton.
+                        AutomatonFunctions, -- Type class of automaton
+                                            -- functions.
+                        states,  -- get the states of an automaton.
+                        isFinal, -- is the given state a final state?
+                        initials, -- get the initial states of an automaton.
+                        finals,  -- get the final states of an automaton.
+                        transitionTable, -- get the transitionTable.
+                        transitionList, -- get the transitions w.r.t. a state.
+                        transitions, -- get the transitions
+                                     -- w.r.t. a state and a symbol.
+                        firstState,
+                        lastState, -- get the maximum state of a automaton.
+                        alphabet -- get the alphabet of an automaton.
+                       ) where
+
+-- Types for Automaton
+
+type State = Int
+
+type FirstState = Int
+
+type LastState = Int
+
+type InitialStates = [State]
+
+type FinalStates = [State]
+
+type Transitions a = [(a,State)]
+
+type TransitionTable a = [(State,Transitions a)]
+
+type Sigma a = [a]
+
+-- | Class of AutomatonFunctions
+class AutomatonFunctions f where
+ states          :: f a -> [State]
+ isFinal         :: f a -> State -> Bool
+ finals          :: f a -> FinalStates
+ initials        :: f a -> InitialStates
+ transitionList  :: f a -> State -> Transitions a
+ transitionTable :: f a -> TransitionTable a
+ transitions     :: Eq a => f a -> (State, a) -> [State]
+ firstState      :: Eq a => f a -> State
+ lastState       :: Eq a => f a -> State
+ alphabet        :: f a -> Sigma a
diff --git a/FST/Complete.hs b/FST/Complete.hs
new file mode 100644
--- /dev/null
+++ b/FST/Complete.hs
@@ -0,0 +1,28 @@
+{-
+   **************************************************************
+   * Filename      : Complete.hs                                *
+   * Author        : Markus Forsberg                            *
+   *                 d97forma@dtek.chalmers.se                  *
+   * Last Modified : 6 July, 2001                               *
+   * Lines         : 29                                         *
+   **************************************************************
+-}
+
+module FST.Complete ( complete -- Makes a automaton complete (transition on every symbol at every state)
+                ) where
+
+import FST.Automaton
+import Data.List ( (\\) )
+
+complete :: Eq a => Automaton a -> Automaton a
+complete auto = let sink     = lastState auto + 1
+                    sinkTr   = (sink,map (\a -> (a,sink)) (alphabet auto))
+                    newTrans = sinkTr:completeStates auto sink (states auto) []
+                 in construct (firstState auto,sink) newTrans (alphabet auto) (initials auto) (finals auto)
+
+completeStates :: Eq a => Automaton a -> State -> [State] -> [(State,Transitions a)] -> [(State,Transitions a)]
+completeStates _    _    []     trans = trans
+completeStates auto sink (s:sts) trans
+ = let tr   = transitionList auto s
+       nTr  = map (\a -> (a,sink)) ((alphabet auto) \\ (map fst tr))
+    in completeStates auto sink sts ((s,tr++nTr):trans)
diff --git a/FST/Deterministic.hs b/FST/Deterministic.hs
new file mode 100644
--- /dev/null
+++ b/FST/Deterministic.hs
@@ -0,0 +1,73 @@
+{-
+   **************************************************************
+   * Filename      : Deterministic.hs                           *
+   * Author        : Markus Forsberg                            *
+   *                 d97forma@dtek.chalmers.se                  *
+   * Last Modified : 6 July, 2001                               *
+   * Lines         : 78                                         *
+   **************************************************************
+-}
+
+module FST.Deterministic ( determinize  -- Makes an automaton deterministic and usefulS.
+                     ) where
+
+import FST.Automaton
+
+import Data.List (sort, nub)
+
+{- *************************************
+   * Types for subsets.                *
+   *************************************
+-}
+
+newtype SubSet  = SubSet [State] -- a subset is an ordered set
+                                 -- without duplication.
+type    SubSets = [SubSet]
+type    Done    = SubSets
+type    UnDone  = SubSets
+type    SubTransitions a = [(SubSet, [(a,SubSet)])]
+
+instance Eq (SubSet) where
+ (SubSet xs) == (SubSet ys) = xs == ys
+
+sub :: [State] -> SubSet
+sub sts = SubSet $ sort $ nub sts
+
+containsFinal :: Automaton a -> SubSet -> Bool
+containsFinal automaton (SubSet xs) = or $ map (isFinal automaton) xs
+
+{- ************************************************
+   * Construct a deterministic, usefulS automaton. *
+   ************************************************
+-}
+
+determinize :: Ord a => Automaton a -> Automaton a
+determinize automaton = let inS = sub $ initials automaton in
+                            det automaton ([],[inS]) []
+
+det :: Ord a => Automaton a -> (Done,UnDone) ->
+                SubTransitions a -> Automaton a
+det auto (done,[]) trans = rename (reverse trans)
+                                  (alphabet auto) [sub (initials auto)]
+                                  (filter (containsFinal auto) done)
+                                  (firstState auto)
+det auto (done,subset:undone) trans
+ | elemSS done subset = det auto (done,undone) trans
+ | otherwise = let (subs,nTrans) = getTransitions auto subset trans
+                   nsubs         = filter (not.(elemSS (subset:done))) subs
+                in det auto (subset:done,undone++nsubs) nTrans
+ where elemSS subs sub = elem sub subs
+
+getTransitions :: Ord a => Automaton a -> SubSet ->
+                           SubTransitions a -> (SubSets, SubTransitions a)
+getTransitions auto subset@(SubSet xs) trans
+   = let tr = groupBySymbols (concat $ map (transitionList auto) xs) [] in
+         (map snd tr, ((subset,tr):trans))
+
+groupBySymbols :: Eq a => [(a,State)] -> [(a,[State])] -> [(a,SubSet)]
+groupBySymbols []         tr = map (\(a,xs) -> (a,sub xs)) tr
+groupBySymbols ((a,s):xs) tr = groupBySymbols xs (ins (a,s) tr)
+ where ins (a1,s1) [] = [(a1,[s1])]
+       ins (a1,s1) ((b,ys):zs)
+        | a1 == b    = (b,s1:ys):zs
+        | otherwise = (b,ys): ins (a,s) zs
diff --git a/FST/DeterministicT.hs b/FST/DeterministicT.hs
new file mode 100644
--- /dev/null
+++ b/FST/DeterministicT.hs
@@ -0,0 +1,75 @@
+{-
+   **************************************************************
+   * Filename      : DeterministicT.hs                          *
+   * Author        : Markus Forsberg                            *
+   *                 d97forma@dtek.chalmers.se                  *
+   * Last Modified : 6 July, 2001                               *
+   * Lines         : 78                                         *
+   **************************************************************
+-}
+
+module FST.DeterministicT ( determinize,  -- Makes an transducer deterministic
+                                      -- and usefulS.
+                      ) where
+
+import FST.Transducer
+
+import Data.List (sort, nub)
+
+
+{- *************************************
+   * Types for subsets.                *
+   *************************************
+-}
+
+newtype SubSet  = SubSet [State] -- a subset is an ordered set
+                                 -- without duplication.
+type    SubSets = [SubSet]
+type    Done    = SubSets
+type    UnDone  = SubSets
+type    SubTransitions a = [(SubSet, [(Relation a,SubSet)])]
+
+instance Eq (SubSet) where
+ (SubSet xs) == (SubSet ys) = xs == ys
+
+sub :: [State] -> SubSet
+sub sts = SubSet $ sort $ nub sts
+
+containsFinal :: Transducer a -> SubSet -> Bool
+containsFinal automaton (SubSet xs) = or $ map (isFinal automaton) xs
+
+{- ************************************************
+   * Construct a deterministic, usefulS automaton. *
+   ************************************************
+-}
+
+determinize :: Ord a => Transducer a -> Transducer a
+determinize automaton = let inS = sub $ initials automaton in
+                            det automaton ([],[inS]) []
+
+det :: Ord a => Transducer a -> (Done,UnDone) ->
+                SubTransitions a -> Transducer a
+det auto (done,[]) trans = rename (reverse trans)
+                                  (alphabet auto) [sub (initials auto)]
+                                  (filter (containsFinal auto) done)
+                                  (firstState auto)
+det auto (done,subset:undone) trans
+ | elemSS done subset = det auto (done,undone) trans
+ | otherwise = let (subs,nTrans) = getTransitions auto subset trans
+                   nsubs         = filter (not.(elemSS (subset:done))) subs
+                in det auto (subset:done,undone++nsubs) nTrans
+ where elemSS subs sub = elem sub subs
+
+getTransitions :: Ord a => Transducer a -> SubSet ->
+                           SubTransitions a -> (SubSets, SubTransitions a)
+getTransitions auto subset@(SubSet xs) trans
+   = let tr = groupBySymbols (concat $ map (transitionList auto) xs) [] in
+         (map snd tr, ((subset,tr):trans))
+
+groupBySymbols :: Eq a => [(a,State)] -> [(a,[State])] -> [(a,SubSet)]
+groupBySymbols []         tr = map (\(a,xs) -> (a,sub xs)) tr
+groupBySymbols ((a,s):xs) tr = groupBySymbols xs (ins (a,s) tr)
+ where ins (a1,s1) [] = [(a1,[s1])]
+       ins (a1,s1) ((b,ys):zs)
+        | a1 == b    = (b,s1:ys):zs
+        | otherwise = (b,ys): ins (a,s) zs
diff --git a/FST/EpsilonFreeT.hs b/FST/EpsilonFreeT.hs
new file mode 100644
--- /dev/null
+++ b/FST/EpsilonFreeT.hs
@@ -0,0 +1,46 @@
+{-
+   **************************************************************
+   * Filename      : EpsilonFreeT.hs                            *
+   * Author        : Markus Forsberg                            *
+   *                 d97forma@dtek.chalmers.se                  *
+   * Last Modified : 7 July, 2001                               *
+   * Lines         : 46                                         *
+   **************************************************************
+-}
+
+module FST.EpsilonFreeT (epsilonfree -- construct an epsilonfree,
+                                 -- usefulS transducer.
+                    ) where
+
+import FST.Transducer
+import Data.List (partition)
+
+epsilonfree :: Eq a => Transducer a -> Transducer a
+epsilonfree transducer
+ = epsFree transducer ([],initials transducer) [] []
+
+epsFree :: Eq a => Transducer a -> ([State],[State]) -> FinalStates ->
+                   [(State,[(Relation a,State)])] -> Transducer a
+epsFree transducer (_,[]) fs table
+ = construct (firstState transducer, lastState transducer)
+             table (alphabet transducer) (initials transducer) fs
+epsFree transducer (done,(s:undone)) fs table
+ = let (newtl,fsB) = stateEpsRemove [] (transitionList transducer s)
+                                       ([],False)
+       newSts    = map snd $ filter (\(_,s1) -> not (elem s1 (s:done))) newtl
+    in epsFree transducer (s:done,newSts ++ undone)
+       (if (fsB || isFinal transducer s) then (s:fs) else fs)
+       ((s,newtl):table)
+ where epsTransitions = ( \ ((a,b),_) -> (a == Eps) && (b == Eps) )
+       stateEpsRemove _ [] (tl,fsB) = (tl,fsB)
+       stateEpsRemove history tlist (tl,fsB)
+        = case (partition epsTransitions tlist) of
+            (  [],ntl) -> (tl++ntl,fsB)
+            (epstl,ntl) -> let newSts  = map snd $
+                                 filter (\(_,s1) -> not (elem s1 history))
+                                                    epstl
+                               fsBnew  = or $ map (isFinal transducer) newSts
+                             in stateEpsRemove (newSts++history)
+                                  (concat (map (transitionList transducer)
+                                                newSts))
+                                           (ntl++tl,fsB || fsBnew)
diff --git a/FST/FileImport.hs b/FST/FileImport.hs
new file mode 100644
--- /dev/null
+++ b/FST/FileImport.hs
@@ -0,0 +1,24 @@
+{-
+   **************************************************************
+   * Filename      : FileImport.hs                              *
+   * Author        : Markus Forsberg                            *
+   *                 d97forma@dtek.chalmers.se                  *
+   * Last Modified : 6 July, 2001                               *
+   * Lines         : 25                                         *
+   **************************************************************
+-}
+
+module FST.FileImport (open,saveToFile) where
+import System.IO.Error (try)
+
+open :: FilePath -> IO (Either String String)
+open file = do res <- try (readFile file)
+	       case res of
+	        Right res -> return $ Right res
+	        Left res  -> return $ Left $ "\nError:\tUnable to open \"" ++ file ++"\".\n"
+
+saveToFile :: FilePath -> String -> IO (Either String ())
+saveToFile file str = do res <- try (writeFile file str)
+	                 case res of
+	                  Right res -> return $ Right ()
+	                  Left  res -> return $ Left $ "\nError:\tUnable to save to \"" ++ file ++"\".\n"
diff --git a/FST/GetOpt.hs b/FST/GetOpt.hs
new file mode 100644
--- /dev/null
+++ b/FST/GetOpt.hs
@@ -0,0 +1,154 @@
+-----------------------------------------------------------------------------------------
+-- A Haskell port of GNU's getopt library
+--
+-- Sven Panne <Sven.Panne@informatik.uni-muenchen.de> Oct. 1996; last change: Jul. 1998
+--
+-- Two rather obscure features are missing: The Bash 2.0 non-option hack (if you don't
+-- already know it, you probably don't want to hear about it...) and the recognition of
+-- long options with a single dash (e.g. '-help' is recognised as '--help', as long as
+-- there is no short option 'h').
+--
+-- Other differences between GNU's getopt and this implementation:
+--    * To enforce a coherent description of options and arguments, there are explanation
+--      fields in the option/argument descriptor.
+--    * Error messages are now more informative, but no longer POSIX compliant... :-(
+--
+-- And a final Haskell advertisement: The GNU C implementation uses well over 1100 lines,
+-- we need only 199 here, including a 46 line example! :-)
+-----------------------------------------------------------------------------------------
+
+module FST.GetOpt (
+   ArgOrder(..), OptDescr(..), ArgDescr(..), usageInfo, getOpt
+   ) where
+
+import Data.List (isPrefixOf)
+
+data ArgOrder a                        -- what to do with options following non-options:
+   = RequireOrder                      --    no option processing after first non-option
+   | Permute                           --    freely intersperse options and non-options
+   | ReturnInOrder (String -> a)       --    wrap non-options into options
+
+data OptDescr a =                      -- description of a single options:
+   Option [Char]                       --    list of short option characters
+          [String]                     --    list of long option strings (without "--")
+          (ArgDescr a)                 --    argument descriptor
+          String                       --    explanation of option for user
+
+data ArgDescr a                        -- description of an argument option:
+   = NoArg                   a         --    no argument expected
+   | ReqArg (String       -> a) String --    option requires argument
+   | OptArg (Maybe String -> a) String --    optional argument
+
+data OptKind a                         -- kind of cmd line arg (internal use only):
+   = Opt       a                       --    an option
+   | NonOpt    String                  --    a non-option
+   | EndOfOpts                         --    end-of-options marker (i.e. "--")
+   | OptErr    String                  --    something went wrong...
+
+usageInfo :: String                    -- header
+          -> [OptDescr a]              -- option descriptors
+          -> String                    -- nicely formatted decription of options
+usageInfo header optDescr = unlines (header:table)
+   where (ss,ls,ds)     = (unzip3 . map fmtOpt) optDescr
+         table          = zipWith3 paste (sameLen ss) (sameLen ls) (sameLen ds)
+         paste x y z    = "  " ++ x ++ "  " ++ y ++ "  " ++ z
+         sameLen xs     = flushLeft ((maximum . map length) xs) xs
+         flushLeft n xs = [ take n (x ++ repeat ' ') | x <- xs ]
+
+fmtOpt :: OptDescr a -> (String,String,String)
+fmtOpt (Option sos los ad descr) = (sepBy ", " (map (fmtShort ad) sos),
+                                    sepBy ", " (map (fmtLong  ad) los),
+                                    descr)
+   where sepBy _   []     = ""
+         sepBy _   [x]    = x
+         sepBy sep (x:xs) = x ++ sep ++ sepBy sep xs
+
+fmtShort :: ArgDescr a -> Char -> String
+fmtShort (NoArg  _   ) so = "-" ++ [so]
+fmtShort (ReqArg _ ad) so = "-" ++ [so] ++ " " ++ ad
+fmtShort (OptArg _ ad) so = "-" ++ [so] ++ "[" ++ ad ++ "]"
+
+fmtLong :: ArgDescr a -> String -> String
+fmtLong (NoArg  _   ) lo = "--" ++ lo
+fmtLong (ReqArg _ ad) lo = "--" ++ lo ++ "=" ++ ad
+fmtLong (OptArg _ ad) lo = "--" ++ lo ++ "[=" ++ ad ++ "]"
+
+getOpt :: ArgOrder a                   -- non-option handling
+       -> [OptDescr a]                 -- option descriptors
+       -> [String]                     -- the commandline arguments
+       -> ([a],[String],[String])      -- (options,non-options,error messages)
+getOpt _        _        []   =  ([],[],[])
+getOpt ordering optDescr args = procNextOpt opt ordering
+   where procNextOpt (Opt o)    _                 = (o:os,xs,es)
+         procNextOpt (NonOpt x) RequireOrder      = ([],x:rest,[])
+         procNextOpt (NonOpt x) Permute           = (os,x:xs,es)
+         procNextOpt (NonOpt x) (ReturnInOrder f) = (f x :os, xs,es)
+         procNextOpt EndOfOpts  RequireOrder      = ([],rest,[])
+         procNextOpt EndOfOpts  Permute           = ([],rest,[])
+         procNextOpt EndOfOpts  (ReturnInOrder f) = (map f rest,[],[])
+         procNextOpt (OptErr e) _                 = (os,xs,e:es)
+
+         (opt,rest) = getNext args optDescr
+         (os,xs,es) = getOpt ordering optDescr rest
+
+-- take a look at the next cmd line arg and decide what to do with it
+getNext :: [String] -> [OptDescr a] -> (OptKind a,[String])
+getNext (('-':'-':[]):rest) _        = (EndOfOpts,rest)
+getNext (('-':'-':xs):rest) optDescr = longOpt xs rest optDescr
+getNext (('-':x:xs)  :rest) optDescr = shortOpt x xs rest optDescr
+getNext (a           :rest) _        = (NonOpt a,rest)
+getNext []                  _        = error "getNext: impossible"
+
+-- handle long option
+longOpt :: String -> [String] -> [OptDescr a] -> (OptKind a,[String])
+longOpt xs rest optDescr = long ads arg rest
+   where (opt,arg) = break (=='=') xs
+         options   = [ o  | o@(Option _ ls _ _) <- optDescr, l <- ls, opt `isPrefixOf` l ]
+         ads       = [ ad | Option _ _ ad _ <- options ]
+         optStr    = ("--"++opt)
+
+         long (_:_:_)      _        rest1     = (errAmbig options optStr,rest1)
+         long [NoArg  a  ] []       rest1     = (Opt a,rest1)
+         long [NoArg  _  ] ('=':_)  rest1     = (errNoArg optStr,rest1)
+         long [ReqArg _ d] []       []        = (errReq d optStr,[])
+         long [ReqArg f _] []       (r:rest1) = (Opt (f r),rest1)
+         long [ReqArg f _] ('=':ys) rest1     = (Opt (f ys),rest1)
+         long [OptArg f _] []       rest1     = (Opt (f Nothing),rest1)
+         long [OptArg f _] ('=':ys) rest1     = (Opt (f (Just ys)),rest1)
+         long [_]          (_  :_)  _         = error "long: impossible"
+         long []           _        rest1     = (errUnrec optStr,rest1)
+
+-- handle short option
+shortOpt :: Char -> String -> [String] -> [OptDescr a] -> (OptKind a,[String])
+shortOpt x xs rest optDescr = short ads xs rest
+  where options = [ o  | o@(Option ss _ _ _) <- optDescr, s <- ss, x == s ]
+        ads     = [ ad | Option _ _ ad _ <- options ]
+        optStr  = '-':[x]
+
+        short (_:_:_)        _  rest1     = (errAmbig options optStr,rest1)
+        short (NoArg  a  :_) [] rest1     = (Opt a,rest1)
+        short (NoArg  a  :_) ys rest1     = (Opt a,('-':ys):rest1)
+        short (ReqArg _ d:_) [] []        = (errReq d optStr,[])
+        short (ReqArg f _:_) [] (r:rest1) = (Opt (f r),rest1)
+        short (ReqArg f _:_) ys rest1     = (Opt (f ys),rest1)
+        short (OptArg f _:_) [] rest1     = (Opt (f Nothing),rest1)
+        short (OptArg f _:_) ys rest1     = (Opt (f (Just ys)),rest1)
+        short []             [] rest1     = (errUnrec optStr,rest1)
+        short []             ys rest1     = (errUnrec optStr,('-':ys):rest1)
+
+-- miscellaneous error formatting
+
+errAmbig :: [OptDescr a] -> String -> OptKind a
+errAmbig ods optStr = OptErr (usageInfo header ods)
+   where header = "option `" ++ optStr ++ "' is ambiguous; could be one of:"
+
+errReq :: String -> String -> OptKind a
+errReq d optStr = OptErr ("option `" ++ optStr ++ "' requires an argument " ++ d ++ "\n")
+
+errUnrec :: String -> OptKind a
+errUnrec optStr = OptErr ("unrecognized option `" ++ optStr ++ "'\n")
+
+errNoArg :: String -> OptKind a
+errNoArg optStr = OptErr ("option `" ++ optStr ++ "' doesn't allow an argument\n")
+
+
diff --git a/FST/Info.hs b/FST/Info.hs
new file mode 100644
--- /dev/null
+++ b/FST/Info.hs
@@ -0,0 +1,122 @@
+{-
+   **************************************************************
+   * Filename      : Info.hs                                    *
+   * Author        : Markus Forsberg                            *
+   *                 d97forma@dtek.chalmers.se                  *
+   * Last Modified : 6 July, 2001                               *
+   * Lines         : 89                                         *
+   **************************************************************
+-}
+
+module FST.Info where
+
+import FST.TransducerInterface
+
+data Info = Info {
+                  transducer :: (Transducer String,Bool),
+		  expression :: (RReg String,Bool),
+		  input      :: ([String],Bool),
+		  outputs    :: ([String],Bool)
+		  }
+
+clearInfo :: Info -> Info
+clearInfo info = info { transducer = (emptyTransducer,False),
+                        expression = (empty,False),
+                        input      = ([],False),
+                        outputs    = ([],False) }
+
+emptyInfo :: Info
+emptyInfo = Info {
+                   transducer = (emptyTransducer,False),
+                   expression = (empty,False),
+                   input      = ([],False),
+                   outputs    = ([],False)
+                 }
+
+transducerBuilt :: Info -> Bool
+transducerBuilt info = snd $ transducer info
+
+expressionRead :: Info -> Bool
+expressionRead info = snd $ expression info
+
+inputRead :: Info -> Bool
+inputRead info = snd $ input info
+
+outputsRead :: Info -> Bool
+outputsRead info = snd $ outputs info
+
+updateTransducer :: Transducer String -> Info -> Info
+updateTransducer t info = info {transducer = (t,True)}
+
+updateExpression :: RReg String -> Info -> Info
+updateExpression r info = info {expression = (r,True)}
+
+updateInput :: [String] -> Info -> Info
+updateInput inp info = info {input = (inp,True)}
+
+updateOutputs :: [String] -> Info -> Info
+updateOutputs out info = info { outputs = (out,True)}
+
+getTransducer :: Info -> Transducer String
+getTransducer = fst.transducer
+
+getExpression :: Info -> RReg String
+getExpression = fst.expression
+
+getInput :: Info -> [String]
+getInput = fst.input
+
+getOutputs :: Info -> [String]
+getOutputs = fst.outputs
+
+noTransducer :: IO ()
+noTransducer = do putStrLn "No transducer has been loaded/built."
+
+noExpression :: IO ()
+noExpression = do putStrLn "No regular expression has been typed/loaded into fstStudio."
+
+noInput :: IO ()
+noInput = do putStrLn "No input has been loaded into fstStudio."
+
+noOutputs :: IO ()
+noOutputs = do putStrLn "No outputs has been produced."
+
+help :: IO ()
+help = do putStrLn "\nList of Commands:"
+          putStrLn "r <reg exp>    : read a regular relation from standard input."
+	  putStrLn "b              : build a deterministic, minimal transducer."
+	  putStrLn "bn             : build a possibly non-deterministic, non-minimal transducer."
+	  putStrLn "m              : minimize loaded/built transducer."
+          putStrLn "det            : determinize loaded/built transducer."
+	  putStrLn "s  <filename>  : save to file."
+	  putStrLn "l  <filename>  : load from file."
+	  putStrLn "l a | b        : load and union."
+	  putStrLn "l a b          : load and concatenate."
+	  putStrLn "l a *          : load and apply Kleene's star."
+	  putStrLn "l a .o. b      : load and compose."
+	  putStrLn "vt             : view loaded/built transducer."
+	  putStrLn "vr             : view typed/loaded regular relation."
+          putStrLn "vi             : view loaded input."
+          putStrLn "vo             : view produced output."
+          putStrLn "d              : apply transducer down with loaded input."
+          putStrLn "u              : apply transducer up with loaded input."
+	  putStrLn "d <symbols>    : apply transducer down with symbols."
+	  putStrLn "u <symbols>    : apply transducer up with symbols."
+	  putStrLn "c              : Clear memory."
+	  putStrLn "h              : display list of commands."
+	  putStrLn "q              : end session.\n"
+
+prompt :: IO ()
+prompt = do putStr ">"
+
+fstStudio :: IO ()
+fstStudio = do putStrLn "\n*****************************************************"
+	       putStrLn "* Welcome to Finite State Transducer Studio!        *"
+	       putStrLn "* Written purely in Haskell.                        *"
+	       putStrLn "* Version : 0.9                                     *"
+	       putStrLn "* Date    : 11 August 2001                          *"
+	       putStrLn "* Author  : Markus Forsberg                         *"
+	       putStrLn "* Please send bug reports/suggestions to:           *"
+	       putStrLn "* d97forma@dtek.chalmers.se                         *"
+	       putStrLn "*****************************************************\n"
+	       putStrLn "Type 'h' for help.\n"
diff --git a/FST/LBFA.hs b/FST/LBFA.hs
new file mode 100644
--- /dev/null
+++ b/FST/LBFA.hs
@@ -0,0 +1,266 @@
+{-
+   **************************************************************
+   * Filename      : LBFA.hs                                    *
+   * Author        : Markus Forsberg                            *
+   *                 d97forma@dtek.chalmers.se                  *
+   * Last Modified : 7 July, 2001                               *
+   * Lines         : 279                                        *
+   **************************************************************
+-}
+
+module FST.LBFA ( module FST.Automaton,
+             LBFA,          -- Data type for LBFA
+             states,        -- get the states of a LBFA
+             finals,        -- get the final states of a LBFA
+             isFinal,       -- check if a state is a final state.
+             transitionTable,
+             transitionList,   -- get the transitions of a state.
+             transitions,    -- get the transitions of a state and a symbol
+             alphabet,      -- get the alphabet of a LBFA.
+             initial,       -- get the initial state of a LBFA.
+             lastState,      -- get the max state of a LBFA.
+             compileToLBFA,
+             compileToAutomaton
+            ) where
+
+import FST.RegTypes
+import FST.StateMonad
+import FST.Automaton
+import FST.Deterministic
+import FST.Complete
+import FST.Utils (remove,merge)
+
+import Data.List (delete,nub,(\\))
+
+{- **********************************************************
+   * data type for a LBFA                                   *
+   **********************************************************
+-}
+
+data LBFA a = LBFA {
+                     trans   :: [(State, Transitions a)],
+                     initS   :: State,
+                     finalS  :: [State],
+                     alpha   :: Sigma a,
+                     lastS   :: State
+                   }
+
+{- **********************************************************
+   * LBFA functions                                         *
+   **********************************************************
+-}
+
+instance AutomatonFunctions LBFA where
+ states lbfa            = map fst $ trans lbfa
+ isFinal lbfa s         = elem s (finals lbfa)
+ initials lbfa          = [(initS lbfa)]
+ finals                 = finalS
+ transitionTable        = trans
+ transitionList lbfa s  = case(lookup s (trans lbfa)) of
+                           Just tl -> tl
+                           _       -> []
+ transitions lbfa (s,a) = map snd $ filter (\(b,_) -> a == b) $ transitionList lbfa s
+ firstState             = minimum.states
+ lastState              = lastS
+ alphabet               = alpha
+
+initial :: LBFA a -> State
+initial lbfa = (initS lbfa)
+
+acceptEpsilon :: LBFA a -> Bool
+acceptEpsilon lbfa = isFinal lbfa (initial lbfa)
+
+{- **********************************************************
+   * compile a regular expression to a LBFA                 *
+   **********************************************************
+-}
+
+compileToLBFA :: Ord a => Reg a -> Sigma a -> State -> LBFA a
+compileToLBFA reg sigma s = run (build reg (nub (sigma++symbols reg))) s
+
+{- ************************************************************************
+   * compile a regular expression to an minimal, useful and deterministic *
+   * Automaton, using the LBFA algorithm while building.                  *
+   ************************************************************************
+-}
+compileToAutomaton :: Ord a => Reg a -> Sigma a -> State -> Automaton a
+compileToAutomaton reg sigma s = encode $ compileToLBFA reg sigma s
+
+{- ************************************************************************
+   * Building a LBFA from a regular expression                            *
+   ************************************************************************
+-}
+
+build :: Ord a => Reg a -> Sigma a -> STM (LBFA a)
+build (Empty) sigma = do s <- fetchState
+                         return $ LBFA {
+                                         trans  = [(s,[])],
+                                         initS  = s,
+                                         finalS = [],
+                                         alpha  = sigma,
+                                         lastS   = s
+                                       }
+
+build (Epsilon) sigma = do s <- fetchState
+                           return $ LBFA {
+                                          trans  = [(s,[])],
+                                          initS  = s,
+                                          finalS = [s],
+                                          alpha  = sigma,
+                                          lastS   = s
+                                         }
+
+build (Symbol a) sigma = do s1 <- fetchState
+                            s2 <- fetchState
+                            return $ LBFA {
+                                          trans  = [(s1,[(a,s2)]),(s2,[])],
+                                          initS  = s1,
+                                          finalS = [s2],
+                                          alpha  = sigma,
+                                          lastS   = s2
+                                          }
+
+build (All) sigma = build (allToSymbols sigma) sigma
+
+build (r1 :.: r2) sigma
+ = do lbfa1 <- build r1 sigma
+      lbfa2 <- build r2 sigma
+      s <- fetchState
+      let transUnion  = (remove (initial lbfa1) (trans lbfa1)) ++
+                        (remove (initial lbfa2) (trans lbfa2))
+          transConc   = let t = (transitionList lbfa2 (initial lbfa2)) in
+                                [(f,t)| f <- (finals lbfa1)]
+          transInit   = [(s, transitionList lbfa1 (initial lbfa1) ++
+                        listEps lbfa1 (transitionList lbfa2 (initial lbfa2)))]
+          fs  = finals lbfa2 ++ listEps lbfa2 (finals lbfa1) ++
+                if (acceptEpsilon lbfa1 && acceptEpsilon lbfa2)
+                   then [s] else []
+      return $ LBFA {
+                     trans  = transInit ++ merge transConc transUnion,
+                     finalS = fs \\ [(initial lbfa1),(initial lbfa2)],
+                     alpha  = sigma,
+                     initS  = s,
+                     lastS   = s
+                     }
+
+build (r1 :|: r2) sigma
+ = do lbfa1 <- build r1 sigma
+      lbfa2 <- build r2 sigma
+      s <- fetchState
+      let transUnion  = (remove (initial lbfa1) (trans lbfa1)) ++
+                        (remove (initial lbfa2) (trans lbfa2))
+          transInit   = [(s, transitionList lbfa1 (initial lbfa1) ++
+                             transitionList lbfa2 (initial lbfa2))]
+          fs  = finals lbfa1 ++ finals lbfa2 ++
+                if (acceptEpsilon lbfa1 || acceptEpsilon lbfa2)
+                    then [s] else []
+      return $ LBFA {
+                     trans  = transInit ++ transUnion,
+                     finalS = fs \\ [(initial lbfa1),(initial lbfa2)],
+                     alpha = sigma,
+                     initS  = s,
+                     lastS   = s
+                    }
+
+build (Star r1) sigma
+ = do lbfa1 <- build r1 sigma
+      s <- fetchState
+      let transUnion  = remove (initial lbfa1) (trans lbfa1)
+          transLoop   = let t = transitionList lbfa1 (initial lbfa1) in
+                         (s,t): [(f,t) | f <- finals lbfa1]
+      return $ LBFA {
+                     trans  = merge transLoop transUnion,
+                     finalS = (s:(delete (initial lbfa1) (finals lbfa1))),
+                     alpha = sigma,
+                     initS  = s,
+                     lastS   = s
+                    }
+
+build (Complement r1) sigma
+ = do lbfa <- build r1 sigma
+      let lbfa1 = decode $ determinize $ complete $ encode lbfa
+      setState $ lastState lbfa1 +1
+      return $ LBFA {
+                     trans = trans lbfa1,
+                     finalS = (states lbfa1) \\ (finals lbfa1),
+                     alpha = sigma,
+                     initS  = initial lbfa1,
+                     lastS   = lastState lbfa1
+                    }
+
+build (r1 :&: r2) sigma
+ = do lbfa1 <- build r1 sigma
+      lbfa2 <- build r2 sigma
+      let minS1 = firstState lbfa1
+          minS2 = firstState lbfa2
+          name (s1,s2) = (lastState lbfa2 - minS2 +1) *
+                         (s1 - minS1) + s2 - minS2 + minS1
+          nS = name (lastState lbfa1,lastState lbfa2) +1
+          transInit = (nS,[(a,name (s1,s2)) | (a,s1) <- transitionList
+                                                     lbfa1 (initial lbfa1),
+                                                 (b,s2) <- transitionList
+                                                     lbfa2 (initial lbfa2),
+                                                 a == b])
+          transTable = [(name (s1,s2),[(a,name (s3,s4)) | (a,s3)   <- tl1,
+                                                          (b,s4)   <- tl2,
+                                                          a == b ]) |
+                                                          (s1,tl1) <- trans lbfa1,
+                                                          (s2,tl2) <- trans lbfa2,
+                                                          s1 /= initial lbfa1 ||
+                                                          s2 /= initial lbfa2
+                                                          ]
+          transUnion = transInit:transTable
+          fs  = (if (acceptEpsilon lbfa1 && acceptEpsilon lbfa2)
+                 then [nS] else []) ++
+                [name (f1,f2)| f1 <- finals lbfa1,
+                               f2 <- finals lbfa2]
+      setState $ nS +1
+      return LBFA {
+                   trans  = merge [(s,[]) | s <- fs] transUnion,
+                   finalS = fs,
+                   alpha  = sigma,
+                   initS  = nS,
+                   lastS   = nS
+                  }
+
+{- **********************************************************
+   * Instance of Convertable (LBFA a)                       *
+   **********************************************************
+-}
+
+instance Convertable LBFA where
+ encode lbfa = construct (firstState lbfa,lastState lbfa) (trans lbfa)
+                         (alphabet lbfa) (initials lbfa) (finals lbfa)
+ decode auto = LBFA {
+                    trans  = transitionTable auto,
+                    initS  = head (initials auto),
+                    finalS = finals auto,
+                    alpha  = alphabet auto,
+                    lastS   = lastState auto
+                    }
+
+{- **********************************************************
+   * Instance of Show (LBFA a)                              *
+   **********************************************************
+-}
+
+instance (Eq a,Show a) => Show (LBFA a) where
+ show auto = "\n>>>> LBFA Construction <<<<" ++
+             "\n\nTransitions:\n"         ++ aux  (trans auto)          ++
+             "\nNumber of States   => "   ++ show countStates   ++
+             "\nInitial            => "   ++ show (initial auto)        ++
+             "\nFinals             => "   ++ show (finals auto)  ++ "\n"
+        where aux []          = []
+              aux ((s,tl):xs) = show s ++" => " ++ show tl ++ "\n" ++ aux xs
+              countStates = length $ nub $ map fst (trans auto) ++
+                                           finals auto
+
+{- **********************************************************
+   * Auxiliary functions                                    *
+   **********************************************************
+-}
+
+listEps :: LBFA a -> [b] -> [b]
+listEps lbfa xs
+ | acceptEpsilon lbfa = xs
+ | otherwise          = []
diff --git a/FST/LBFT.hs b/FST/LBFT.hs
new file mode 100644
--- /dev/null
+++ b/FST/LBFT.hs
@@ -0,0 +1,276 @@
+{-
+   **************************************************************
+   * Filename      : LBFT.hs                                    *
+   * Author        : Markus Forsberg                            *
+   *                 d97forma@dtek.chalmers.se                  *
+   * Last Modified : 7 July, 2001                               *
+   * Lines         : 277                                        *
+   **************************************************************
+-}
+
+module FST.LBFT ( LBFT (..),
+              module FST.Transducer,
+              compileToLBFT,
+              compileToTransducer
+             ) where
+
+import Data.List (delete,nub,(\\))
+import FST.EpsilonFreeT
+import FST.RRegTypes
+import FST.StateMonad
+import FST.Transducer
+import FST.Utils (merge,remove)
+import qualified FST.AutomatonInterface as A
+
+{- **********************************************************
+   * data type for a LBFT                                   *
+   **********************************************************
+-}
+
+data LBFT a = LBFT {
+                     trans   :: TTransitionTable a,
+                     initS   :: State,
+                     finalS  :: [State],
+                     alpha   :: Sigma a,
+                     lastS   :: State
+                   }
+
+{- **********************************************************
+   * LBFT functions                                         *
+   **********************************************************
+-}
+
+instance TransducerFunctions LBFT where
+ states                  = (map fst).trans
+ isFinal t s             = elem s (finals t)
+ initials t              = [initS t]
+ finals                  = finalS
+ transitionTable         = trans
+ transitionList t s      = case (lookup s (trans t)) of
+                            Just xs -> xs
+                            _       -> []
+ transitionsU t (s,a)    = map (\((_,c),s1) -> (c,s1)) $
+                           filter (\((b,_),_) -> a == b) $ transitionList t s
+ transitionsD t (s,a)    = map (\((c,_),s1) -> (c,s1)) $
+                           filter (\((_,b),_) -> a == b) $ transitionList t s
+ lastState               = lastS
+ firstState              = minimum.states
+ alphabet                = alpha
+
+acceptEpsilon :: LBFT a -> Bool
+acceptEpsilon lbft = isFinal lbft (initialLBFT lbft)
+
+initialLBFT :: LBFT a -> State
+initialLBFT = initS
+
+{- **********************************************************
+   * compile a regular relation to a LBFT                   *
+   **********************************************************
+-}
+
+compileToLBFT :: Ord a => RReg a -> Sigma a -> LBFT a
+compileToLBFT reg sigma = run (build reg (nub (sigma++symbols reg))) 0
+
+{- ************************************************************************
+   * compile a regular relation to an minimal, useful and deterministic   *
+   * transducer, using the LBFT algorithm while building.                 *
+   ************************************************************************
+-}
+compileToTransducer :: Ord a => RReg a -> Sigma a -> Transducer a
+compileToTransducer reg sigma = encode $ compileToLBFT reg sigma
+
+{- ************************************************************************
+   * Building a LBFT from a regular relation                              *
+   ************************************************************************
+-}
+
+build :: Ord a => RReg a -> Sigma a -> STM (LBFT a)
+build (EmptyR) sigma = do s <- fetchState
+                          return $ LBFT {
+                                         trans  = [(s,[])],
+                                         initS  = s,
+                                         finalS = [],
+                                         alpha  = sigma,
+                                         lastS   = s
+                                       }
+
+build (Relation a b) sigma
+  = do s1 <- fetchState
+       s2 <- fetchState
+       return $ LBFT {
+                      trans  = [(s1,[((a,b),s2)]),(s2,[])],
+                      initS  = s1,
+                      finalS = [s2],
+                      alpha  = sigma,
+                      lastS   = s2
+                     }
+
+build (Identity r1) sigma
+  = do s <- fetchState
+       let auto = A.compileNFA r1 sigma s
+           nTrans = [(s1,map (\(a,s2) -> ((S a, S a),s2))
+                         (A.transitionList auto s1)) | s1 <- A.states auto]
+       setState (A.lastState auto+1)
+       return $ LBFT {
+                      trans  = nTrans,
+                      initS  = head (A.initials auto),
+                      finalS = A.finals auto,
+                      alpha  = sigma,
+                      lastS  = A.lastState auto
+                     }
+
+build (ProductR r1 r2) sigma
+ = do lbft1 <- build r1 sigma
+      lbft2 <- build r2 sigma
+      s <- fetchState
+      let transUnion  = (remove (initialLBFT lbft1) (trans lbft1)) ++
+                        (remove (initialLBFT lbft2) (trans lbft2))
+          transConc   = let t = (transitionList lbft2 (initialLBFT lbft2)) in
+                                [(f,t)| f <- (finals lbft1)]
+          transInit   = [(s, transitionList lbft1 (initialLBFT lbft1) ++
+                        listEps lbft1 (transitionList lbft2 (initialLBFT lbft2)))]
+          fs  = finals lbft2 ++ listEps lbft2 (finals lbft1) ++
+                if (acceptEpsilon lbft1 && acceptEpsilon lbft2)
+                   then [s] else []
+      return $ LBFT {
+                     trans  = transInit ++ merge transConc transUnion,
+                     finalS = fs \\ [(initialLBFT lbft1),(initialLBFT lbft2)],
+                     alpha  = sigma,
+                     initS  = s,
+                     lastS   = s
+                     }
+
+build (UnionR r1 r2) sigma
+ = do lbft1 <- build r1 sigma
+      lbft2 <- build r2 sigma
+      s <- fetchState
+      let transUnion  = (remove (initialLBFT lbft1) (trans lbft1)) ++
+                        (remove (initialLBFT lbft2) (trans lbft2))
+          transInit   = [(s, transitionList lbft1 (initialLBFT lbft1) ++
+                             transitionList lbft2 (initialLBFT lbft2))]
+          fs  = finals lbft1 ++ finals lbft2 ++
+                if (acceptEpsilon lbft1 || acceptEpsilon lbft2)
+                    then [s] else []
+      return $ LBFT {
+                     trans  = transInit ++ transUnion,
+                     finalS = fs \\ [(initialLBFT lbft1),(initialLBFT lbft2)],
+                     alpha = sigma,
+                     initS  = s,
+                     lastS   = s
+                    }
+
+build (StarR r1) sigma
+ = do lbft1 <- build r1 sigma
+      s <- fetchState
+      let transUnion  = remove (initialLBFT lbft1) (trans lbft1)
+          transLoop   = let t = transitionList lbft1 (initialLBFT lbft1) in
+                         (s,t): [(f,t) | f <- finals lbft1]
+      return $ LBFT {
+                     trans   = merge transLoop transUnion,
+                     finalS  = (s:(delete (initialLBFT lbft1) (finals lbft1))),
+                     alpha   = sigma,
+                     initS   = s,
+                     lastS   = s
+                    }
+
+build (Cross r1 r2) sigma =
+ do s <- fetchState
+    let auto1 = A.compileNFA r1 sigma s
+        auto2 = A.compileNFA r2 sigma s
+        (trTable,fs) = cross auto1 auto2
+                     ([],[(A.initial auto1,A.initial auto2)]) ([],[])
+        lbft = decode $ rename trTable sigma
+                         [(A.initial auto1,A.initial auto2)] fs s
+    setState $ lastState lbft + 1
+    return lbft
+  where cross _ _ (_,[]) result = result
+        cross auto1 auto2 (done,((s1,s2):undone)) (tr,fs) =
+         let tl = combine auto1 auto2 (A.transitionList auto1 s1)
+                                      (A.transitionList auto2 s2) (s1,s2)
+             nSts = (map snd tl) \\ ((s1,s2):done)
+          in cross auto1 auto2 ((s1,s2):done,nSts++undone) (((s1,s2),tl):tr,
+               if (A.isFinal auto1 s1 && A.isFinal auto2 s2) then
+                                ((s1,s2):fs) else fs)
+        combine _ _ [] [] _       = []
+        combine _ _ xs [] (_,s2)  = [((S a,Eps),(s1,s2)) | (a,s1) <- xs]
+        combine _ _ [] ys (s1,_)  = [((Eps,S b),(s1,s2)) | (b,s2) <- ys]
+        combine auto1 auto2 xs ys (s1,s2)
+         = [((S a, S b), (s3,s4)) | (a,s3) <- xs, (b,s4) <- ys] ++
+           (if (A.isFinal auto1 s1) then [((Eps,S b),(s1,s4)) | (b,s4) <- ys]
+             else []) ++
+           (if (A.isFinal auto2 s2) then [((S a,Eps),(s3,s2)) | (a,s3) <- xs]
+             else [])
+
+build (Comp r1 r2) sigma
+ = do lbft1 <- build r1 sigma
+      lbft2 <- build r2 sigma
+      let minS1 = firstState lbft1
+          minS2 = firstState lbft2
+          name (s1,s2) = (lastState lbft2 - minS2 +1) *
+                         (s1 - minS1) + s2 - minS2 + minS1
+          nS = name (lastState lbft1,lastState lbft2) +1
+          transInit = (nS,[((a,d),name (s1,s2)) |
+                                         ((a,b),s1) <- ((Eps,Eps),initialLBFT lbft1):transitionList
+                                                    lbft1 (initialLBFT lbft1),
+                                         ((c,d),s2) <- ((Eps,Eps),initialLBFT lbft2):transitionList
+                                                    lbft2 (initialLBFT lbft2),
+                                         ((a,b) /= (Eps,Eps)) || ((c,d) /= (Eps,Eps)),
+                                         b == c])
+          transTable = [(name (s1,s2),[((a,d),name (s3,s4)) | ((a,b),s3)   <- ((Eps,Eps),s1):tl1,
+                                                              ((c,d),s4)   <- ((Eps,Eps),s2):tl2,
+                                                              ((a,b) /= (Eps,Eps)) || ((c,d) /= (Eps,Eps)),
+                                                               b == c]) |
+                                              (s1,tl1) <- trans lbft1,
+                                              (s2,tl2) <- trans lbft2,
+                                              s1 /= initialLBFT lbft1 ||
+                                              s2 /= initialLBFT lbft2]
+          transUnion = transInit : transTable
+          fs  = (if (acceptEpsilon lbft1 && acceptEpsilon lbft2)
+                 then [nS] else []) ++
+                 [name (f1,f2)| f1 <- finals lbft1, f2 <- finals lbft2]
+      setState $ nS +1
+      return $ decode $ epsilonfree $ encode $
+               LBFT {trans  = merge [(s,[]) | s <- fs] transUnion
+                              ,finalS = fs,alpha  = sigma,
+                     initS  = nS,lastS   = nS}
+
+{- **********************************************************
+   * Instance of Convertable (LBFT a)                       *
+   **********************************************************
+-}
+
+instance TConvertable LBFT where
+ encode lbft = rename (trans lbft) (alphabet lbft) (initials lbft)
+                      (finals lbft) (firstState lbft)
+ decode t     = LBFT {
+                     trans  = transitionTable t,
+                     initS  = head (initials t),
+                     finalS = finals t,
+                     alpha  = alphabet t,
+                     lastS  = lastState t
+                    }
+
+{- **********************************************************
+   * Instance of Show (LBFT a)                              *
+   **********************************************************
+-}
+
+instance (Eq a,Show a) => Show (LBFT a) where
+ show t = "\n>>>> LBFT Construction <<<<" ++
+             "\n\nTransitions:\n"         ++ aux  (trans t)          ++
+             "\nNumber of States   => "   ++ show (length (trans t))   ++
+             "\nInitial            => "   ++ show (initialLBFT t)        ++
+             "\nFinals             => "   ++ show (finals t)  ++ "\n"
+        where aux []          = []
+              aux ((s,tl):xs) = show s ++" => " ++ show tl ++ "\n" ++ aux xs
+
+
+{- **********************************************************
+   * Auxiliary functions                                    *
+   **********************************************************
+-}
+
+listEps :: LBFT a -> [b] -> [b]
+listEps lbft xs
+ | acceptEpsilon lbft = xs
+ | otherwise          = []
diff --git a/FST/Lexer.hs b/FST/Lexer.hs
new file mode 100644
--- /dev/null
+++ b/FST/Lexer.hs
@@ -0,0 +1,226 @@
+
+module FST.Lexer where
+
+import FST.Alex
+
+semicolon (Pn _ l _) _   = TokenSemi l
+
+listEps (Pn _ l _) _   = TokenEps l
+
+hardOpenBracket (Pn _ l _) _   = TokenHOB l
+
+hardClosedBracket (Pn _ l _) _   = TokenHCB l
+
+softOpenBracket (Pn _ l _) _   = TokenSOB l
+
+softClosedBracket (Pn _ l _) _   = TokenSCB l
+
+union (Pn _ l _) _   = TokenUnion l
+
+equal (Pn _ l _) _   = TokenDef l
+
+relation (Pn _ l _) _  = TokenRelation l
+
+star (Pn _ l _) _ = TokenStar l
+
+plus (Pn _ l _) _   = TokenPlus l
+
+repeatSymbol (Pn _ l _) _   = TokenRepeat l
+
+complement (Pn _ l _) _ = TokenComplement l
+
+containment (Pn _ l _) _   = TokenContainment l
+
+minus (Pn _ l _) _ = TokenMinus l
+
+intersect (Pn _ l _) _ = TokenIntersect l
+
+zeroEps (Pn _ l _) _   = TokenEps l
+
+allSymbol (Pn _ l _) _ = TokenAll l
+
+crossproduct (Pn _ l _) _ = TokenCrossproduct l
+
+composition (Pn _ l _) _ = TokenComposition  l
+
+symbol   (Pn _ l _) s = TokenS (l,(init.tail) s)
+
+esymbol (Pn _ l _) s = TokenS (l,tail s)
+
+concatsymbols  (Pn _ l _) s = TokenConcatS (l,(init.tail) s)
+
+mainId (Pn _ l _) _   = TokenMain l
+
+definitions (Pn _ l _) s = let (name:param) = params ((init.tail) s) in TokenFun (l,(name,param))
+
+variable (Pn _ l _) s   = TokenVar   (l,s)
+
+litint (Pn _ l _) s = TokenNum (l,(read s))
+
+
+semicolon :: Posn -> String -> Token
+listEps :: Posn -> String -> Token
+hardOpenBracket :: Posn -> String -> Token
+hardClosedBracket :: Posn -> String -> Token
+softOpenBracket :: Posn -> String -> Token
+softClosedBracket :: Posn -> String -> Token
+union :: Posn -> String -> Token
+equal :: Posn -> String -> Token
+relation :: Posn -> String -> Token
+star :: Posn -> String -> Token
+plus :: Posn -> String -> Token
+repeatSymbol :: Posn -> String -> Token
+complement :: Posn -> String -> Token
+containment :: Posn -> String -> Token
+intersect :: Posn -> String -> Token
+minus :: Posn -> String -> Token
+zeroEps :: Posn -> String -> Token
+allSymbol :: Posn -> String -> Token
+composition :: Posn -> String -> Token
+crossproduct :: Posn -> String -> Token
+symbol :: Posn -> String -> Token
+concatsymbols :: Posn -> String -> Token
+mainId :: Posn -> String -> Token
+definitions :: Posn -> String -> Token
+variable :: Posn -> String -> Token
+litint :: Posn -> String -> Token
+
+params :: String -> [String]
+params []       = []
+params (',':xs) = let (zs,ys) = span (/= ',') xs
+                   in zs:params ys
+params xs       = let (zs,ys) = span (/= ',') xs
+                   in zs:params ys
+
+
+type Name   = String
+
+data Token = TokenSemi Int                  | -- ';'
+	     TokenHOB  Int                  | -- '['
+             TokenHCB  Int                  | -- ']'
+             TokenSOB  Int                  | -- '('
+             TokenSCB  Int                  | -- ')'
+	     TokenConcatS (Int,String)      | -- { s t r i n g }
+             TokenStar Int                  | -- '*'
+	     TokenComplement Int            | -- '~'
+	     TokenContainment Int           | -- '$'
+	     TokenMinus Int                 | -- '-'
+	     TokenIntersect Int             | -- '&'
+             TokenUnion Int                 | -- '|'
+	     TokenPlus Int                  | -- '+'
+             TokenEps Int                   | -- '0'
+             TokenAll Int                   | -- '?'
+             TokenS (Int,String)            | -- string
+	     TokenRelation Int              | -- ':'
+             TokenCrossproduct Int          | -- '.x.'
+             TokenComposition Int           | -- '.o.'
+             TokenRepeat Int                | -- '^'
+             TokenNum  (Int,Int)            | -- num
+	     TokenFun  (Int,(Name,[String]))| -- <id,param>
+	     TokenMain  Int                 | -- <main>
+	     TokenDef  Int                  | -- '::='
+	     TokenVar (Int,String)          | -- Variable
+	     Err String
+	deriving (Eq,Show)
+
+lexer :: String -> [Token]
+lexer inp = scan tokens_scan inp
+
+tokens_scan = load_scan (token_acts,stop_act) token_lx
+ where stop_act (Pn _ l _) ""  = []
+       stop_act (Pn _ l _) inp = [Err ("Parse error at line: "++show l ++
+                                       "\nUnable to recognize (tokenize): "
+                                       ++ head (lines inp))]
+
+
+token_acts = [("allSymbol",allSymbol),("complement",complement),("composition",composition),("concatsymbols",concatsymbols),("containment",containment),("crossproduct",crossproduct),("definitions",definitions),("equal",equal),("esymbol",esymbol),("hardClosedBracket",hardClosedBracket),("hardOpenBracket",hardOpenBracket),("intersect",intersect),("listEps",listEps),("litint",litint),("mainId",mainId),("minus",minus),("plus",plus),("relation",relation),("repeatSymbol",repeatSymbol),("semicolon",semicolon),("softClosedBracket",softClosedBracket),("softOpenBracket",softOpenBracket),("star",star),("symbol",symbol),("union",union),("variable",variable),("zeroEps",zeroEps)]
+
+token_lx :: [(Bool, [(Int,String,[Int],Maybe((Char,Char),[(Char,Bool)]),Maybe Int)], Int, ((Char,Char),[(Char,Int)]))]
+token_lx = [lx__0_0,lx__1_0,lx__2_0,lx__3_0,lx__4_0,lx__5_0,lx__6_0,lx__7_0,lx__8_0,lx__9_0,lx__10_0,lx__11_0,lx__12_0,lx__13_0,lx__14_0,lx__15_0,lx__16_0,lx__17_0,lx__18_0,lx__19_0,lx__20_0,lx__21_0,lx__22_0,lx__23_0,lx__24_0,lx__25_0,lx__26_0,lx__27_0,lx__28_0,lx__29_0,lx__30_0,lx__31_0,lx__32_0,lx__33_0,lx__34_0,lx__35_0,lx__36_0,lx__37_0,lx__38_0,lx__39_0,lx__40_0,lx__41_0,lx__42_0]
+lx__0_0 :: (Bool, [(Int,String,[Int],Maybe((Char,Char),[(Char,Bool)]),Maybe Int)], Int, ((Char,Char),[(Char,Int)]))
+lx__0_0 = (False,[],-1,(('\t','~'),[('\t',2),('\n',2),('\v',2),('\f',2),('\r',2),(' ',2),('"',27),('#',1),('$',17),('%',29),('&',19),('(',7),(')',8),('*',13),('+',14),('-',18),('.',22),('0',20),('1',42),('2',42),('3',42),('4',42),('5',42),('6',42),('7',42),('8',42),('9',42),(':',10),(';',3),('<',32),('?',21),('A',41),('B',41),('C',41),('D',41),('E',41),('F',41),('G',41),('H',41),('I',41),('J',41),('K',41),('L',41),('M',41),('N',41),('O',41),('P',41),('Q',41),('R',41),('S',41),('T',41),('U',41),('V',41),('W',41),('X',41),('Y',41),('Z',41),('[',4),(']',6),('^',15),('a',41),('b',41),('c',41),('d',41),('e',41),('f',41),('g',41),('h',41),('i',41),('j',41),('k',41),('l',41),('m',41),('n',41),('o',41),('p',41),('q',41),('r',41),('s',41),('t',41),('u',41),('v',41),('w',41),('x',41),('y',41),('z',41),('{',30),('|',9),('~',16)]))
+lx__1_0 :: (Bool, [(Int,String,[Int],Maybe((Char,Char),[(Char,Bool)]),Maybe Int)], Int, ((Char,Char),[(Char,Int)]))
+lx__1_0 = (True,[(0,"",[],Nothing,Nothing)],1,(('\n','\n'),[('\n',-1)]))
+lx__2_0 :: (Bool, [(Int,String,[Int],Maybe((Char,Char),[(Char,Bool)]),Maybe Int)], Int, ((Char,Char),[(Char,Int)]))
+lx__2_0 = (True,[(1,"",[],Nothing,Nothing)],-1,(('\t',' '),[('\t',2),('\n',2),('\v',2),('\f',2),('\r',2),(' ',2)]))
+lx__3_0 :: (Bool, [(Int,String,[Int],Maybe((Char,Char),[(Char,Bool)]),Maybe Int)], Int, ((Char,Char),[(Char,Int)]))
+lx__3_0 = (True,[(2,"semicolon",[],Nothing,Nothing)],-1,(('0','0'),[]))
+lx__4_0 :: (Bool, [(Int,String,[Int],Maybe((Char,Char),[(Char,Bool)]),Maybe Int)], Int, ((Char,Char),[(Char,Int)]))
+lx__4_0 = (True,[(4,"hardOpenBracket",[],Nothing,Nothing)],-1,((']',']'),[(']',5)]))
+lx__5_0 :: (Bool, [(Int,String,[Int],Maybe((Char,Char),[(Char,Bool)]),Maybe Int)], Int, ((Char,Char),[(Char,Int)]))
+lx__5_0 = (True,[(3,"listEps",[],Nothing,Nothing)],-1,(('0','0'),[]))
+lx__6_0 :: (Bool, [(Int,String,[Int],Maybe((Char,Char),[(Char,Bool)]),Maybe Int)], Int, ((Char,Char),[(Char,Int)]))
+lx__6_0 = (True,[(5,"hardClosedBracket",[],Nothing,Nothing)],-1,(('0','0'),[]))
+lx__7_0 :: (Bool, [(Int,String,[Int],Maybe((Char,Char),[(Char,Bool)]),Maybe Int)], Int, ((Char,Char),[(Char,Int)]))
+lx__7_0 = (True,[(6,"softOpenBracket",[],Nothing,Nothing)],-1,(('0','0'),[]))
+lx__8_0 :: (Bool, [(Int,String,[Int],Maybe((Char,Char),[(Char,Bool)]),Maybe Int)], Int, ((Char,Char),[(Char,Int)]))
+lx__8_0 = (True,[(7,"softClosedBracket",[],Nothing,Nothing)],-1,(('0','0'),[]))
+lx__9_0 :: (Bool, [(Int,String,[Int],Maybe((Char,Char),[(Char,Bool)]),Maybe Int)], Int, ((Char,Char),[(Char,Int)]))
+lx__9_0 = (True,[(8,"union",[],Nothing,Nothing)],-1,(('0','0'),[]))
+lx__10_0 :: (Bool, [(Int,String,[Int],Maybe((Char,Char),[(Char,Bool)]),Maybe Int)], Int, ((Char,Char),[(Char,Int)]))
+lx__10_0 = (True,[(10,"relation",[],Nothing,Nothing)],-1,((':',':'),[(':',11)]))
+lx__11_0 :: (Bool, [(Int,String,[Int],Maybe((Char,Char),[(Char,Bool)]),Maybe Int)], Int, ((Char,Char),[(Char,Int)]))
+lx__11_0 = (False,[],-1,(('=','='),[('=',12)]))
+lx__12_0 :: (Bool, [(Int,String,[Int],Maybe((Char,Char),[(Char,Bool)]),Maybe Int)], Int, ((Char,Char),[(Char,Int)]))
+lx__12_0 = (True,[(9,"equal",[],Nothing,Nothing)],-1,(('0','0'),[]))
+lx__13_0 :: (Bool, [(Int,String,[Int],Maybe((Char,Char),[(Char,Bool)]),Maybe Int)], Int, ((Char,Char),[(Char,Int)]))
+lx__13_0 = (True,[(11,"star",[],Nothing,Nothing)],-1,(('0','0'),[]))
+lx__14_0 :: (Bool, [(Int,String,[Int],Maybe((Char,Char),[(Char,Bool)]),Maybe Int)], Int, ((Char,Char),[(Char,Int)]))
+lx__14_0 = (True,[(12,"plus",[],Nothing,Nothing)],-1,(('0','0'),[]))
+lx__15_0 :: (Bool, [(Int,String,[Int],Maybe((Char,Char),[(Char,Bool)]),Maybe Int)], Int, ((Char,Char),[(Char,Int)]))
+lx__15_0 = (True,[(13,"repeatSymbol",[],Nothing,Nothing)],-1,(('0','0'),[]))
+lx__16_0 :: (Bool, [(Int,String,[Int],Maybe((Char,Char),[(Char,Bool)]),Maybe Int)], Int, ((Char,Char),[(Char,Int)]))
+lx__16_0 = (True,[(14,"complement",[],Nothing,Nothing)],-1,(('0','0'),[]))
+lx__17_0 :: (Bool, [(Int,String,[Int],Maybe((Char,Char),[(Char,Bool)]),Maybe Int)], Int, ((Char,Char),[(Char,Int)]))
+lx__17_0 = (True,[(15,"containment",[],Nothing,Nothing)],-1,(('0','0'),[]))
+lx__18_0 :: (Bool, [(Int,String,[Int],Maybe((Char,Char),[(Char,Bool)]),Maybe Int)], Int, ((Char,Char),[(Char,Int)]))
+lx__18_0 = (True,[(16,"minus",[],Nothing,Nothing)],-1,(('0','0'),[]))
+lx__19_0 :: (Bool, [(Int,String,[Int],Maybe((Char,Char),[(Char,Bool)]),Maybe Int)], Int, ((Char,Char),[(Char,Int)]))
+lx__19_0 = (True,[(17,"intersect",[],Nothing,Nothing)],-1,(('0','0'),[]))
+lx__20_0 :: (Bool, [(Int,String,[Int],Maybe((Char,Char),[(Char,Bool)]),Maybe Int)], Int, ((Char,Char),[(Char,Int)]))
+lx__20_0 = (True,[(18,"zeroEps",[],Nothing,Nothing)],-1,(('0','9'),[('0',42),('1',42),('2',42),('3',42),('4',42),('5',42),('6',42),('7',42),('8',42),('9',42)]))
+lx__21_0 :: (Bool, [(Int,String,[Int],Maybe((Char,Char),[(Char,Bool)]),Maybe Int)], Int, ((Char,Char),[(Char,Int)]))
+lx__21_0 = (True,[(19,"allSymbol",[],Nothing,Nothing)],-1,(('0','0'),[]))
+lx__22_0 :: (Bool, [(Int,String,[Int],Maybe((Char,Char),[(Char,Bool)]),Maybe Int)], Int, ((Char,Char),[(Char,Int)]))
+lx__22_0 = (False,[],-1,(('o','x'),[('o',25),('x',23)]))
+lx__23_0 :: (Bool, [(Int,String,[Int],Maybe((Char,Char),[(Char,Bool)]),Maybe Int)], Int, ((Char,Char),[(Char,Int)]))
+lx__23_0 = (False,[],-1,(('.','.'),[('.',24)]))
+lx__24_0 :: (Bool, [(Int,String,[Int],Maybe((Char,Char),[(Char,Bool)]),Maybe Int)], Int, ((Char,Char),[(Char,Int)]))
+lx__24_0 = (True,[(20,"crossproduct",[],Nothing,Nothing)],-1,(('0','0'),[]))
+lx__25_0 :: (Bool, [(Int,String,[Int],Maybe((Char,Char),[(Char,Bool)]),Maybe Int)], Int, ((Char,Char),[(Char,Int)]))
+lx__25_0 = (False,[],-1,(('.','.'),[('.',26)]))
+lx__26_0 :: (Bool, [(Int,String,[Int],Maybe((Char,Char),[(Char,Bool)]),Maybe Int)], Int, ((Char,Char),[(Char,Int)]))
+lx__26_0 = (True,[(21,"composition",[],Nothing,Nothing)],-1,(('0','0'),[]))
+lx__27_0 :: (Bool, [(Int,String,[Int],Maybe((Char,Char),[(Char,Bool)]),Maybe Int)], Int, ((Char,Char),[(Char,Int)]))
+lx__27_0 = (False,[],27,(('"','"'),[('"',28)]))
+lx__28_0 :: (Bool, [(Int,String,[Int],Maybe((Char,Char),[(Char,Bool)]),Maybe Int)], Int, ((Char,Char),[(Char,Int)]))
+lx__28_0 = (True,[(22,"symbol",[],Nothing,Nothing)],-1,(('0','0'),[]))
+lx__29_0 :: (Bool, [(Int,String,[Int],Maybe((Char,Char),[(Char,Bool)]),Maybe Int)], Int, ((Char,Char),[(Char,Int)]))
+lx__29_0 = (True,[(23,"esymbol",[],Nothing,Nothing)],29,(('\t',' '),[('\t',-1),('\n',-1),('\v',-1),('\f',-1),('\r',-1),(' ',-1)]))
+lx__30_0 :: (Bool, [(Int,String,[Int],Maybe((Char,Char),[(Char,Bool)]),Maybe Int)], Int, ((Char,Char),[(Char,Int)]))
+lx__30_0 = (False,[],30,(('}','}'),[('}',31)]))
+lx__31_0 :: (Bool, [(Int,String,[Int],Maybe((Char,Char),[(Char,Bool)]),Maybe Int)], Int, ((Char,Char),[(Char,Int)]))
+lx__31_0 = (True,[(24,"concatsymbols",[],Nothing,Nothing)],-1,(('0','0'),[]))
+lx__32_0 :: (Bool, [(Int,String,[Int],Maybe((Char,Char),[(Char,Bool)]),Maybe Int)], Int, ((Char,Char),[(Char,Int)]))
+lx__32_0 = (False,[],-1,(('A','z'),[('A',38),('B',38),('C',38),('D',38),('E',38),('F',38),('G',38),('H',38),('I',38),('J',38),('K',38),('L',38),('M',38),('N',38),('O',38),('P',38),('Q',38),('R',38),('S',38),('T',38),('U',38),('V',38),('W',38),('X',38),('Y',38),('Z',38),('a',38),('b',38),('c',38),('d',38),('e',38),('f',38),('g',38),('h',38),('i',38),('j',38),('k',38),('l',38),('m',33),('n',38),('o',38),('p',38),('q',38),('r',38),('s',38),('t',38),('u',38),('v',38),('w',38),('x',38),('y',38),('z',38)]))
+lx__33_0 :: (Bool, [(Int,String,[Int],Maybe((Char,Char),[(Char,Bool)]),Maybe Int)], Int, ((Char,Char),[(Char,Int)]))
+lx__33_0 = (False,[],39,(('0','z'),[('0',38),('1',38),('2',38),('3',38),('4',38),('5',38),('6',38),('7',38),('8',38),('9',38),('>',40),('A',38),('B',38),('C',38),('D',38),('E',38),('F',38),('G',38),('H',38),('I',38),('J',38),('K',38),('L',38),('M',38),('N',38),('O',38),('P',38),('Q',38),('R',38),('S',38),('T',38),('U',38),('V',38),('W',38),('X',38),('Y',38),('Z',38),('_',38),('a',34),('b',38),('c',38),('d',38),('e',38),('f',38),('g',38),('h',38),('i',38),('j',38),('k',38),('l',38),('m',38),('n',38),('o',38),('p',38),('q',38),('r',38),('s',38),('t',38),('u',38),('v',38),('w',38),('x',38),('y',38),('z',38)]))
+lx__34_0 :: (Bool, [(Int,String,[Int],Maybe((Char,Char),[(Char,Bool)]),Maybe Int)], Int, ((Char,Char),[(Char,Int)]))
+lx__34_0 = (False,[],39,(('0','z'),[('0',38),('1',38),('2',38),('3',38),('4',38),('5',38),('6',38),('7',38),('8',38),('9',38),('>',40),('A',38),('B',38),('C',38),('D',38),('E',38),('F',38),('G',38),('H',38),('I',38),('J',38),('K',38),('L',38),('M',38),('N',38),('O',38),('P',38),('Q',38),('R',38),('S',38),('T',38),('U',38),('V',38),('W',38),('X',38),('Y',38),('Z',38),('_',38),('a',38),('b',38),('c',38),('d',38),('e',38),('f',38),('g',38),('h',38),('i',35),('j',38),('k',38),('l',38),('m',38),('n',38),('o',38),('p',38),('q',38),('r',38),('s',38),('t',38),('u',38),('v',38),('w',38),('x',38),('y',38),('z',38)]))
+lx__35_0 :: (Bool, [(Int,String,[Int],Maybe((Char,Char),[(Char,Bool)]),Maybe Int)], Int, ((Char,Char),[(Char,Int)]))
+lx__35_0 = (False,[],39,(('0','z'),[('0',38),('1',38),('2',38),('3',38),('4',38),('5',38),('6',38),('7',38),('8',38),('9',38),('>',40),('A',38),('B',38),('C',38),('D',38),('E',38),('F',38),('G',38),('H',38),('I',38),('J',38),('K',38),('L',38),('M',38),('N',38),('O',38),('P',38),('Q',38),('R',38),('S',38),('T',38),('U',38),('V',38),('W',38),('X',38),('Y',38),('Z',38),('_',38),('a',38),('b',38),('c',38),('d',38),('e',38),('f',38),('g',38),('h',38),('i',38),('j',38),('k',38),('l',38),('m',38),('n',36),('o',38),('p',38),('q',38),('r',38),('s',38),('t',38),('u',38),('v',38),('w',38),('x',38),('y',38),('z',38)]))
+lx__36_0 :: (Bool, [(Int,String,[Int],Maybe((Char,Char),[(Char,Bool)]),Maybe Int)], Int, ((Char,Char),[(Char,Int)]))
+lx__36_0 = (False,[],39,(('0','z'),[('0',38),('1',38),('2',38),('3',38),('4',38),('5',38),('6',38),('7',38),('8',38),('9',38),('>',37),('A',38),('B',38),('C',38),('D',38),('E',38),('F',38),('G',38),('H',38),('I',38),('J',38),('K',38),('L',38),('M',38),('N',38),('O',38),('P',38),('Q',38),('R',38),('S',38),('T',38),('U',38),('V',38),('W',38),('X',38),('Y',38),('Z',38),('_',38),('a',38),('b',38),('c',38),('d',38),('e',38),('f',38),('g',38),('h',38),('i',38),('j',38),('k',38),('l',38),('m',38),('n',38),('o',38),('p',38),('q',38),('r',38),('s',38),('t',38),('u',38),('v',38),('w',38),('x',38),('y',38),('z',38)]))
+lx__37_0 :: (Bool, [(Int,String,[Int],Maybe((Char,Char),[(Char,Bool)]),Maybe Int)], Int, ((Char,Char),[(Char,Int)]))
+lx__37_0 = (True,[(25,"mainId",[],Nothing,Nothing)],-1,(('0','0'),[]))
+lx__38_0 :: (Bool, [(Int,String,[Int],Maybe((Char,Char),[(Char,Bool)]),Maybe Int)], Int, ((Char,Char),[(Char,Int)]))
+lx__38_0 = (False,[],39,(('0','z'),[('0',38),('1',38),('2',38),('3',38),('4',38),('5',38),('6',38),('7',38),('8',38),('9',38),('>',40),('A',38),('B',38),('C',38),('D',38),('E',38),('F',38),('G',38),('H',38),('I',38),('J',38),('K',38),('L',38),('M',38),('N',38),('O',38),('P',38),('Q',38),('R',38),('S',38),('T',38),('U',38),('V',38),('W',38),('X',38),('Y',38),('Z',38),('_',38),('a',38),('b',38),('c',38),('d',38),('e',38),('f',38),('g',38),('h',38),('i',38),('j',38),('k',38),('l',38),('m',38),('n',38),('o',38),('p',38),('q',38),('r',38),('s',38),('t',38),('u',38),('v',38),('w',38),('x',38),('y',38),('z',38)]))
+lx__39_0 :: (Bool, [(Int,String,[Int],Maybe((Char,Char),[(Char,Bool)]),Maybe Int)], Int, ((Char,Char),[(Char,Int)]))
+lx__39_0 = (False,[],39,(('>','>'),[('>',40)]))
+lx__40_0 :: (Bool, [(Int,String,[Int],Maybe((Char,Char),[(Char,Bool)]),Maybe Int)], Int, ((Char,Char),[(Char,Int)]))
+lx__40_0 = (True,[(26,"definitions",[],Nothing,Nothing)],-1,(('0','0'),[]))
+lx__41_0 :: (Bool, [(Int,String,[Int],Maybe((Char,Char),[(Char,Bool)]),Maybe Int)], Int, ((Char,Char),[(Char,Int)]))
+lx__41_0 = (True,[(27,"variable",[],Nothing,Nothing)],-1,(('0','z'),[('0',41),('1',41),('2',41),('3',41),('4',41),('5',41),('6',41),('7',41),('8',41),('9',41),('A',41),('B',41),('C',41),('D',41),('E',41),('F',41),('G',41),('H',41),('I',41),('J',41),('K',41),('L',41),('M',41),('N',41),('O',41),('P',41),('Q',41),('R',41),('S',41),('T',41),('U',41),('V',41),('W',41),('X',41),('Y',41),('Z',41),('_',41),('a',41),('b',41),('c',41),('d',41),('e',41),('f',41),('g',41),('h',41),('i',41),('j',41),('k',41),('l',41),('m',41),('n',41),('o',41),('p',41),('q',41),('r',41),('s',41),('t',41),('u',41),('v',41),('w',41),('x',41),('y',41),('z',41)]))
+lx__42_0 :: (Bool, [(Int,String,[Int],Maybe((Char,Char),[(Char,Bool)]),Maybe Int)], Int, ((Char,Char),[(Char,Int)]))
+lx__42_0 = (True,[(28,"litint",[],Nothing,Nothing)],-1,(('0','9'),[('0',42),('1',42),('2',42),('3',42),('4',42),('5',42),('6',42),('7',42),('8',42),('9',42)]))
+
diff --git a/FST/Main.hs b/FST/Main.hs
new file mode 100644
--- /dev/null
+++ b/FST/Main.hs
@@ -0,0 +1,346 @@
+{-
+   **************************************************************
+   * Filename      : Main.hs                                    *
+   * Author        : Markus Forsberg                            *
+   *                 d97forma@dtek.chalmers.se                  *
+   * Last Modified : 6 July, 2001                               *
+   * Lines         : 346                                        *
+   **************************************************************
+-}
+
+module Main where
+
+import FST.TransducerInterface
+import FST.FileImport
+import FST.RRegTypes
+import System.Environment (getArgs)
+
+import FST.Arguments
+import FST.Info
+
+main :: IO()
+main = do args <- getArgs
+          case args of
+           []  -> do fstStudio
+                     run emptyInfo
+           as -> batchMode as
+
+batchMode :: [String] -> IO ()
+batchMode cmdopt = case parseBatch cmdopt of
+                    Left  err        -> putStrLn err
+                    Right (file,cmd)
+                     | isFST file -> do res <- open file
+			                case res of
+			                 Right str -> case (parseProgram str) of
+			                               Left err   -> putStrLn err
+					               Right reg
+					                | isUpB cmd -> let tr = compile reg [] in
+					                                case inputB cmd of
+                                                                          Just file -> do res <- open file
+                                                                                          case res of
+                                                                                           Right str -> case outputB cmd of
+                                                                                                         Just f -> do res <- saveToFile f str
+                                                                                                                      case res of
+                                                                                                                       Left err -> putStrLn err
+                                                                                                                       _        -> return ()
+                                                                                                         _      -> putStrLn $ upB tr str
+                                                                                           Left  err -> putStrLn err
+                                                                          Nothing   -> do interact (upB tr)
+					                | otherwise -> let tr = compile reg [] in
+					                                case inputB cmd of
+                                                                         Just file -> do res <- open file
+                                                                                         case res of
+                                                                                          Right str -> case outputB cmd of
+                                                                                                        Just f -> do res <- saveToFile f str
+                                                                                                                     case res of
+                                                                                                                      Left err -> putStrLn err
+                                                                                                                      _        -> return ()
+                                                                                                        _      -> putStrLn $ downB tr str
+                                                                                          Left  err -> putStrLn err
+                                                                         Nothing   -> do interact (downB tr)
+			                 Left err -> do putStrLn err
+                     | isNET file -> do tr <- load file
+                                        case tr of
+                                         Right tr
+                                          | isUpB cmd -> case inputB cmd of
+                                                          Just file -> do res <- open file
+                                                                          case res of
+                                                                           Right str -> case outputB cmd of
+                                                                                         Just f -> do res <- saveToFile f str
+                                                                                                      case res of
+                                                                                                       Left err -> putStrLn err
+                                                                                                       _        -> return ()
+                                                                                         _      -> putStrLn $ upB tr str
+                                                                           Left  err -> putStrLn err
+                                                          Nothing   -> do interact (upB tr)
+                                          | otherwise ->  case inputB cmd of
+                                                          Just file -> do res <- open file
+                                                                          case res of
+                                                                           Right str -> case outputB cmd of
+                                                                                         Just f -> do res <- saveToFile f str
+                                                                                                      case res of
+                                                                                                       Left err -> putStrLn err
+                                                                                                       _        -> return ()
+                                                                                         _      -> putStrLn $ downB tr str
+                                                                           Left  err -> putStrLn err
+                                                          Nothing   -> do interact (downB tr)
+                                         Left err -> putStrLn err
+                     | otherwise  -> putStrLn "Input file must end with *.fst or *.net"
+
+upB :: Transducer String -> String -> String
+upB transducer str = case (applyUp transducer (words str)) of
+                      Just xs -> unlines $ map unwords xs
+                      Nothing -> []
+
+downB :: Transducer String -> String -> String
+downB transducer str = case (applyDown transducer (words str)) of
+                        Just xs -> unlines $ map unwords xs
+                        Nothing -> []
+
+run :: Info -> IO ()
+run info
+ = do prompt
+      com <- getLine
+      case (parseInteractive (words com)) of
+       BuildTransducer
+        | expressionRead info ->
+            do let tNew = compile (getExpression info) []
+               putStrLn ("\nBuilt a deterministic, minimal transducer with "
+                         ++ (show (numberOfStates tNew)) ++ " states and "
+                         ++ (show (numberOfTransitions tNew)) ++ " transitions.\n")
+               run $ updateTransducer tNew info
+        | otherwise ->
+            do noExpression
+               run info
+       BuildNTransducer
+        | expressionRead info ->
+           do let tNew = compileN (getExpression info) []
+              putStrLn ("\nBuilt a possibly non-deterministic, non-minimal transducer with "
+                        ++ (show (numberOfStates tNew)) ++ " states and "
+                        ++ (show (numberOfTransitions tNew)) ++ " transitions.\n")
+              run $ updateTransducer tNew info
+        | otherwise ->
+           do noExpression
+              run info
+       Minimize
+        | transducerBuilt info ->
+           do let tNew = minimize (getTransducer info)
+              putStrLn ("\nMinimized loaded/built transducer resulting in a transducer with "
+                        ++ (show (numberOfStates tNew)) ++ " states and "
+                        ++ (show (numberOfTransitions tNew)) ++ " transitions.\n")
+              run $ updateTransducer tNew info
+        | otherwise ->
+           do noTransducer
+              run info
+       Determinize
+        | transducerBuilt info ->
+           do let tNew = determinize (getTransducer info)
+              putStrLn ("\nDeterminized loaded/built transducer resulting in a transducer with "
+                        ++ (show (numberOfStates tNew)) ++ " states and "
+                        ++ (show (numberOfTransitions tNew)) ++ " transitions.\n")
+              run $ updateTransducer tNew info
+        | otherwise ->
+           do noTransducer
+              run info
+       ViewTransducer
+        | transducerBuilt info ->
+           do putStrLn (showTransducer (getTransducer info))
+              run info
+        | otherwise ->
+           do noTransducer
+              run info
+       Load file
+        | isFST file -> do res <- open file
+			   case (res) of
+			     Right str -> case (parseProgram str) of
+			                   Left err -> do putStrLn err
+                                                          run info
+					   Right reg -> do putStrLn ("\nLoaded a regular relation from " ++file ++".\n")
+					                   run $ updateExpression reg info
+			     Left err -> do putStrLn err
+				            run info
+        | isNET file -> do res <- load file
+                           case res of
+                            Right t -> do putStrLn ("\nLoaded transducer from file " ++ file ++".\n")
+                                          run $ updateTransducer t info
+                            Left err -> do putStrLn err
+                                           run info
+        | isDAT file -> do  res <- open file
+			    case (res) of
+			     Right str -> do putStrLn ("\nRead input from file "++file++".\n")
+			                     run $ updateInput (words str) info
+			     Left err -> do putStrLn err
+				            run info
+        | otherwise -> do putStrLn ("\nUnable to load from " ++ file ++ ". The filename must end with *.fst, *.net or *.dat.\n")
+                          run info
+       LUnion file1 file2
+        | isNET file1  && isNET file2  -> do res1 <- load file1
+                                             res2 <- load file2
+                                             case (res1,res2) of
+                                              (Left err,_) -> do putStrLn err
+                                                                 run info
+                                              (_,Left err) -> do putStrLn err
+                                                                 run info
+                                              (Right t1, Right t2) -> do putStrLn "\nLoaded and unified two transducers.\n"
+                                                                         run $ updateTransducer (unionT t1 t2) info
+        | transducerBuilt info && isNET file1  && isTHIS file2
+                                          -> do res <- load file1
+                                                case res of
+                                                 (Left err) -> do putStrLn err
+                                                                  run info
+                                                 (Right t1) -> do putStrLn "\nLoaded a transducer, and unified it with the interior transducer.\n"
+                                                                  run $ updateTransducer (unionT t1 (getTransducer info)) info
+        | transducerBuilt info && isTHIS file1 && isNET file2
+                                         -> do res <- load file2
+                                               case res of
+                                                 (Left err) -> do putStrLn err
+                                                                  run info
+                                                 (Right t1) -> do putStrLn "\nLoaded a transducer, and unified it with the interior transducer.\n"
+                                                                  run $ updateTransducer (unionT t1 (getTransducer info)) info
+        | otherwise -> do putStrLn $ "\nUnable to union " ++ file1 ++ " and " ++file2++".\n"
+                          run info
+       LProduct file1 file2
+        | isNET file1  && isNET file2  -> do res1 <- load file1
+                                             res2 <- load file2
+                                             case (res1,res2) of
+                                              (Left err,_) -> do putStrLn err
+                                                                 run info
+                                              (_,Left err) -> do putStrLn err
+                                                                 run info
+                                              (Right t1, Right t2) -> do putStrLn "\nLoaded and concatenated two transducers.\n"
+                                                                         run $ updateTransducer (productT t1 t2) info
+        | transducerBuilt info && isNET file1  && isTHIS file2
+                                          -> do res <- load file1
+                                                case res of
+                                                 (Left err) -> do putStrLn err
+                                                                  run info
+                                                 (Right t1) -> do putStrLn "\nLoaded a transducer, and concatenated it with the interior transducer.\n"
+                                                                  run $ updateTransducer (productT t1 (getTransducer info)) info
+        | transducerBuilt info && isTHIS file1 && isNET file2
+                                         -> do res <- load file2
+                                               case res of
+                                                 (Left err) -> do putStrLn err
+                                                                  run info
+                                                 (Right t1) -> do putStrLn "\nLoaded a transducer, and concatenated it with the interior transducer.\n"
+                                                                  run $ updateTransducer (productT t1 (getTransducer info)) info
+        | otherwise -> do putStrLn $ "\nUnable to concatenate " ++ file1 ++ " and " ++file2++".\n"
+                          run info
+       LStar file
+        | isNET file -> do res <- load file
+                           case res of
+                            (Left err) -> do putStrLn err
+                                             run info
+                            (Right t1) -> do putStrLn "\nLoaded a transducer, and applied Kleene's star.\n"
+                                             run $ updateTransducer (starT t1) info
+        | transducerBuilt info && isTHIS file -> do putStrLn "\nApplied Kleene's star on interior transducer.\n"
+                                                    run $ updateTransducer (starT (getTransducer info)) info
+        | otherwise -> do putStrLn $ "\nUnable to apply Kleene's star on " ++ file ++ ".\n"
+                          run info
+       LComposition file1 file2
+         | isNET file1  && isNET file2 -> do res1 <- load file1
+                                             res2 <- load file2
+                                             case (res1,res2) of
+                                              (Left err,_) -> do putStrLn err
+                                                                 run info
+                                              (_,Left err) -> do putStrLn err
+                                                                 run info
+                                              (Right t1, Right t2) -> do putStrLn "\nLoaded and composed two transducers.\n"
+                                                                         run $ updateTransducer (compositionT t1 t2) info
+        | transducerBuilt info && isNET file1  && isTHIS file2
+                                          -> do res <- load file1
+                                                case res of
+                                                 (Left err) -> do putStrLn err
+                                                                  run info
+                                                 (Right t1) -> do putStrLn "\nLoaded a transducer, and composed it with the interior transducer.\n"
+                                                                  run $ updateTransducer (compositionT t1 (getTransducer info)) info
+        | transducerBuilt info && isTHIS file1 && isNET file2
+                                         -> do res <- load file2
+                                               case res of
+                                                 (Left err) -> do putStrLn err
+                                                                  run info
+                                                 (Right t1) -> do putStrLn "\nLoaded a transducer, and composed it with the interior transducer.\n"
+                                                                  run $ updateTransducer (compositionT t1 (getTransducer info)) info
+        | otherwise -> do putStrLn $ "\nUnable to compose " ++ file1 ++ " and " ++file2++".\n"
+                          run info
+       Save file
+        | isNET file -> do res <- save file (getTransducer info)
+                           case res of
+                            Right t -> do putStrLn ("\nSaved transducer to file "++file++".\n")
+                                          run info
+                            Left err -> do putStrLn err
+                                           run info
+        | outputsRead info -> do res <- saveToFile file (unlines (getOutputs info))
+                                 case res of
+                                  Right _ -> do putStrLn ("\nSaved outputs to file " ++ file ++".\n")
+                                                run info
+                                  Left err -> do putStrLn err
+                                                 run info
+        | otherwise        -> do noOutputs
+                                 run info
+       StdInReg str -> case (parseExp str) of
+	  	        Left err -> do putStrLn err
+		 	  	       run info
+		        Right reg -> do putStrLn "\nRead a regular relation.\n"
+				        run $ updateExpression reg info
+       ViewReg
+        | expressionRead info -> do putStrLn ("\nExpression:\n" ++ (show (getExpression info)) ++ "\n")
+                                    run info
+        | otherwise           -> do noExpression
+                                    run info
+       Quit -> do putStr "\nDo you really want to quit? (y): "
+                  s <- getLine
+                  case s of
+                   "y" -> putStrLn "\nSession ended.\n"
+                   "Y" -> putStrLn "\nSession ended.\n"
+                   _   -> run info
+       ClearMemory -> do run $ clearInfo info
+       NoCommand   -> do putStrLn "\nInvalid Command. Type 'h' for help.\n"
+                         run info
+       ViewInput
+        | inputRead info -> do putStrLn ("\nInput: \n" ++ (unwords (getInput info)))
+                               run info
+        | otherwise      -> do noInput
+                               run info
+       ViewOutput
+        | outputsRead info -> do putStrLn ("\nOutputs : \n" ++ (unlines (getOutputs info)))
+                                 run info
+        | otherwise   -> do noOutputs
+                            run info
+       Help        -> do help
+                         run info
+       ApplyUp
+        | transducerBuilt info && inputRead info -> case (applyUp (getTransducer info) (getInput info)) of
+                                                     Just res -> do putStrLn "\nInput accepted. Type 'vo' to view outputs.\n"
+                                                                    run (updateOutputs (map unwords res) info)
+                                                     Nothing  -> do putStrLn "\nInput rejected.\n"
+                                                                    run info
+        | transducerBuilt  info  -> do noTransducer
+                                       run info
+        | otherwise              -> do noInput
+                                       run info
+       ApplyDown
+        | transducerBuilt info && inputRead info -> case (applyDown (getTransducer info) (getInput info)) of
+                                                     Just res -> do putStrLn "\nInput accepted. Type 'vo' to view outputs.\n"
+                                                                    run (updateOutputs (map unwords res) info)
+                                                     Nothing  -> do putStrLn "\nInput rejected.\n"
+                                                                    run info
+        | transducerBuilt info -> do noTransducer
+                                     run info
+        | otherwise          -> do noInput
+                                   run info
+       ApplyU inp
+        | transducerBuilt info -> case (applyUp (getTransducer info) inp) of
+                                   Just res -> do putStrLn "\nInput accepted. Type 'vo' to view outputs.\n"
+                                                  run (updateOutputs (map unwords res) info)
+                                   Nothing  -> do putStrLn "\nInput rejected.\n"
+                                                  run info
+        | otherwise  -> do noTransducer
+                           run info
+       ApplyD inp
+        | transducerBuilt info -> case (applyDown (getTransducer info) inp) of
+                                   Just res -> do putStrLn "\nInput accepted. Type 'vo' to view outputs.\n"
+                                                  run (updateOutputs (map unwords res) info)
+                                   Nothing  -> do putStrLn "\nInput rejected.\n"
+                                                  run info
+        | otherwise  -> do noTransducer
+                           run info
diff --git a/FST/MinimalBrzozowski.hs b/FST/MinimalBrzozowski.hs
new file mode 100644
--- /dev/null
+++ b/FST/MinimalBrzozowski.hs
@@ -0,0 +1,23 @@
+{-
+   **************************************************************
+   * Filename      : MinimalBrzozowski.hs                       *
+   * Author        : Markus Forsberg                            *
+   *                 d97forma@dtek.chalmers.se                  *
+   * Last Modified : 7 July, 2001                               *
+   * Lines         : 20                                         *
+   **************************************************************
+-}
+
+module FST.MinimalBrzozowski ( minimize -- minimize an automaton.
+                         ) where
+
+import FST.Automaton
+import FST.Reversal
+import FST.Deterministic
+
+{- An algorithm due to Brzozowski.
+   Note that the determinize function must construct a
+   automaton with the usefulS property. -}
+{-# SPECIALIZE minimize :: Automaton String -> Automaton String #-}
+minimize :: Ord a => Automaton a -> Automaton a
+minimize = determinize.reversal.determinize.reversal
diff --git a/FST/MinimalTBrzozowski.hs b/FST/MinimalTBrzozowski.hs
new file mode 100644
--- /dev/null
+++ b/FST/MinimalTBrzozowski.hs
@@ -0,0 +1,23 @@
+{-
+   **************************************************************
+   * Filename      : MinimalTBrzozowski.hs                      *
+   * Author        : Markus Forsberg                            *
+   *                 d97forma@dtek.chalmers.se                  *
+   * Last Modified : 7 July, 2001                               *
+   * Lines         : 20                                         *
+   **************************************************************
+-}
+
+module FST.MinimalTBrzozowski ( minimize -- minimize an automaton.
+                          ) where
+
+import FST.Transducer
+import FST.DeterministicT
+import FST.ReversalT
+
+{- An algorithm due to Brzozowski -}
+
+{-# SPECIALIZE minimize :: Transducer String -> Transducer String #-}
+
+minimize :: Ord a => Transducer a -> Transducer a
+minimize = determinize.reversal.determinize.reversal
diff --git a/FST/NReg.hs b/FST/NReg.hs
new file mode 100644
--- /dev/null
+++ b/FST/NReg.hs
@@ -0,0 +1,90 @@
+{-
+   **************************************************************
+   * Filename      : NReg.hs                                    *
+   * Author        : Markus Forsberg                            *
+   *                 d97forma@dtek.chalmers.se                  *
+   * Last Modified : 5 July, 2001                               *
+   * Lines         : 78                                         *
+   **************************************************************
+-}
+
+module FST.NReg ( NReg(..), -- Neutral Regular expression.
+              toRReg,   -- If possible, converts NReg to RReg
+              toReg,     -- If possible, converts NReg to Reg
+              nVarToSymbol
+             ) where
+
+import FST.RegTypes
+import FST.RRegTypes
+
+{- *******************************************
+   * Datatype for neutral regular expression *
+   *******************************************
+-}
+
+data NReg a = NCross      (NReg a) (NReg a) |
+	      NComp       (NReg a) (NReg a) |
+	      NUnion      (NReg a) (NReg a) |
+	      NProduct    (NReg a) (NReg a) |
+	      NStar       (NReg a)          |
+	      NIntersect  (NReg a) (NReg a) |
+	      NComplement (NReg a)          |
+	      NSymbol a                     |
+	      NRelation a a                 |
+	      NEpsilon                      |
+	      NEmptySet                     |
+	      NVar String                   |
+	      Fun String [NReg a]           |
+	      NAll
+
+{- **************************************
+   * Convert functions toRReg and toReg *
+   **************************************
+-}
+
+-- If possible, build a regular expression instead of a
+-- regular relation.
+
+toRReg :: Eq a => NReg a -> Maybe (RReg a)
+toRReg reg = maybe (nRReg reg) (return.idR) (toReg reg)
+ where nRReg (NEmptySet)     = return EmptyR
+       nRReg (NRelation a b) = return $ r a b
+       nRReg (NComp n1 n2)   = do r1 <- toRReg n1; r2 <- toRReg n2; return $ r1 <.> r2
+       nRReg (NCross n1 n2)  = do r1 <- toReg n1; r2 <- toReg n2; return $ r1 <*> r2
+       nRReg (NUnion n1 n2)  = case (toRReg n1,toRReg n2) of
+        (Just r1,Just r2)  -> return $ r1 <|> r2
+        _                  -> do r1 <- toReg n1; r2 <- toReg n2
+                                 return $ idR  $ r1 <|> r2
+       nRReg (NProduct n1 n2) = case (toRReg n1,toRReg n2) of
+        (Just r1,Just r2) -> return $ r1 |> r2
+        _                 -> do r1 <- toReg n1;r2 <- toReg n2; return $ idR $ r1 |> r2
+       nRReg (NStar n1) = case (toRReg n1) of
+        (Just r1) -> return $ star r1
+        _         -> do r1 <- toReg n1; return $ idR $ star r1
+       nRReg (NIntersect n1 n2) = do r1 <- toReg n1; r2 <- toReg n2
+                                     return $ idR $ r1 <&> r2
+       nRReg (NComplement n1) = do r1 <- toReg n1; return $ idR $ complement r1
+       nRReg _                = Nothing
+
+toReg :: Eq a => NReg a -> Maybe (Reg a)
+toReg (NEmptySet)         = return empty
+toReg (NEpsilon)          = return eps
+toReg (NSymbol a)         = return $ s a
+toReg (NAll)              = return allS
+toReg (NUnion n1 n2)      = do r1 <- toReg n1; r2 <- toReg n2; return $ r1 <|> r2
+toReg (NProduct n1 n2)    = do r1 <- toReg n1; r2 <- toReg n2; return $ r1 |> r2
+toReg (NStar n1)          = do r1 <- toReg n1; return $ star r1
+toReg (NIntersect n1 n2)  = do r1 <- toReg n1; r2 <- toReg n2; return $ r1 <&> r2
+toReg (NComplement n1)    = do r1 <- toReg n1; return $ complement r1
+toReg  _                  = Nothing
+
+nVarToSymbol :: NReg String -> NReg String
+nVarToSymbol (NCross n1 n2)     = NCross      (nVarToSymbol n1) (nVarToSymbol n2)
+nVarToSymbol (NComp n1 n2)      = NComp       (nVarToSymbol n1) (nVarToSymbol n2)
+nVarToSymbol (NUnion n1 n2)     = NUnion      (nVarToSymbol n1) (nVarToSymbol n2)
+nVarToSymbol (NProduct n1 n2)   = NProduct    (nVarToSymbol n1) (nVarToSymbol n2)
+nVarToSymbol (NStar n1)         = NStar       (nVarToSymbol n1)
+nVarToSymbol (NIntersect n1 n2) = NIntersect  (nVarToSymbol n1) (nVarToSymbol n2)
+nVarToSymbol (NComplement n1)   = NComplement (nVarToSymbol n1)
+nVarToSymbol (NVar str)         = NSymbol str
+nVarToSymbol n1                 = n1
diff --git a/FST/Parse.hs b/FST/Parse.hs
new file mode 100644
--- /dev/null
+++ b/FST/Parse.hs
@@ -0,0 +1,981 @@
+-- parser produced by Happy Version 1.10
+
+module FST.Parse where
+
+import FST.NReg
+import FST.RRegTypes (RReg)
+import FST.Lexer
+
+import Control.Monad (liftM,liftM2)
+
+data HappyAbsSyn t5 t6 t7
+	= HappyTerminal Token
+	| HappyErrorToken Int
+	| HappyAbsSyn5 t5
+	| HappyAbsSyn6 t6
+	| HappyAbsSyn7 t7
+
+action_0 (29) = happyShift action_5
+action_0 (30) = happyShift action_6
+action_0 (5) = happyGoto action_19
+action_0 (6) = happyGoto action_4
+action_0 _ = happyFail
+
+action_1 (9) = happyShift action_8
+action_1 (11) = happyShift action_9
+action_1 (13) = happyShift action_10
+action_1 (16) = happyShift action_11
+action_1 (17) = happyShift action_12
+action_1 (21) = happyShift action_13
+action_1 (22) = happyShift action_14
+action_1 (23) = happyShift action_15
+action_1 (29) = happyShift action_16
+action_1 (32) = happyShift action_17
+action_1 (33) = happyShift action_18
+action_1 (7) = happyGoto action_7
+action_1 _ = happyFail
+
+action_2 (29) = happyShift action_5
+action_2 (30) = happyShift action_6
+action_2 (5) = happyGoto action_3
+action_2 (6) = happyGoto action_4
+action_2 _ = happyFail
+
+action_3 (29) = happyShift action_5
+action_3 (30) = happyShift action_6
+action_3 (6) = happyGoto action_20
+action_3 _ = happyFail
+
+action_4 _ = happyReduce_3
+
+action_5 (31) = happyShift action_36
+action_5 _ = happyFail
+
+action_6 (31) = happyShift action_35
+action_6 _ = happyFail
+
+action_7 (9) = happyShift action_8
+action_7 (11) = happyShift action_9
+action_7 (13) = happyShift action_10
+action_7 (14) = happyShift action_27
+action_7 (15) = happyShift action_28
+action_7 (16) = happyShift action_11
+action_7 (17) = happyShift action_12
+action_7 (18) = happyShift action_29
+action_7 (19) = happyShift action_30
+action_7 (20) = happyShift action_31
+action_7 (21) = happyShift action_13
+action_7 (22) = happyShift action_14
+action_7 (23) = happyShift action_15
+action_7 (25) = happyShift action_32
+action_7 (26) = happyShift action_33
+action_7 (27) = happyShift action_34
+action_7 (29) = happyShift action_16
+action_7 (32) = happyShift action_17
+action_7 (33) = happyShift action_18
+action_7 (34) = happyAccept
+action_7 (7) = happyGoto action_26
+action_7 _ = happyFail
+
+action_8 (9) = happyShift action_8
+action_8 (11) = happyShift action_9
+action_8 (13) = happyShift action_10
+action_8 (16) = happyShift action_11
+action_8 (17) = happyShift action_12
+action_8 (21) = happyShift action_13
+action_8 (22) = happyShift action_14
+action_8 (23) = happyShift action_15
+action_8 (29) = happyShift action_16
+action_8 (32) = happyShift action_17
+action_8 (33) = happyShift action_18
+action_8 (7) = happyGoto action_25
+action_8 _ = happyFail
+
+action_9 (9) = happyShift action_8
+action_9 (11) = happyShift action_9
+action_9 (13) = happyShift action_10
+action_9 (16) = happyShift action_11
+action_9 (17) = happyShift action_12
+action_9 (21) = happyShift action_13
+action_9 (22) = happyShift action_14
+action_9 (23) = happyShift action_15
+action_9 (29) = happyShift action_16
+action_9 (32) = happyShift action_17
+action_9 (33) = happyShift action_18
+action_9 (7) = happyGoto action_24
+action_9 _ = happyFail
+
+action_10 _ = happyReduce_10
+
+action_11 (9) = happyShift action_8
+action_11 (11) = happyShift action_9
+action_11 (13) = happyShift action_10
+action_11 (16) = happyShift action_11
+action_11 (17) = happyShift action_12
+action_11 (21) = happyShift action_13
+action_11 (22) = happyShift action_14
+action_11 (23) = happyShift action_15
+action_11 (29) = happyShift action_16
+action_11 (32) = happyShift action_17
+action_11 (33) = happyShift action_18
+action_11 (7) = happyGoto action_23
+action_11 _ = happyFail
+
+action_12 (9) = happyShift action_8
+action_12 (11) = happyShift action_9
+action_12 (13) = happyShift action_10
+action_12 (16) = happyShift action_11
+action_12 (17) = happyShift action_12
+action_12 (21) = happyShift action_13
+action_12 (22) = happyShift action_14
+action_12 (23) = happyShift action_15
+action_12 (29) = happyShift action_16
+action_12 (32) = happyShift action_17
+action_12 (33) = happyShift action_18
+action_12 (7) = happyGoto action_22
+action_12 _ = happyFail
+
+action_13 _ = happyReduce_21
+
+action_14 _ = happyReduce_22
+
+action_15 (24) = happyShift action_21
+action_15 _ = happyReduce_24
+
+action_16 _ = happyReduce_6
+
+action_17 _ = happyReduce_25
+
+action_18 _ = happyReduce_26
+
+action_19 (29) = happyShift action_5
+action_19 (30) = happyShift action_6
+action_19 (34) = happyAccept
+action_19 (6) = happyGoto action_20
+action_19 _ = happyFail
+
+action_20 _ = happyReduce_2
+
+action_21 (23) = happyShift action_47
+action_21 _ = happyFail
+
+action_22 (7) = happyGoto action_26
+action_22 _ = happyReduce_17
+
+action_23 (7) = happyGoto action_26
+action_23 _ = happyReduce_16
+
+action_24 (9) = happyShift action_8
+action_24 (11) = happyShift action_9
+action_24 (12) = happyShift action_46
+action_24 (13) = happyShift action_10
+action_24 (14) = happyShift action_27
+action_24 (15) = happyShift action_28
+action_24 (16) = happyShift action_11
+action_24 (17) = happyShift action_12
+action_24 (18) = happyShift action_29
+action_24 (19) = happyShift action_30
+action_24 (20) = happyShift action_31
+action_24 (21) = happyShift action_13
+action_24 (22) = happyShift action_14
+action_24 (23) = happyShift action_15
+action_24 (25) = happyShift action_32
+action_24 (26) = happyShift action_33
+action_24 (27) = happyShift action_34
+action_24 (29) = happyShift action_16
+action_24 (32) = happyShift action_17
+action_24 (33) = happyShift action_18
+action_24 (7) = happyGoto action_26
+action_24 _ = happyFail
+
+action_25 (9) = happyShift action_8
+action_25 (10) = happyShift action_45
+action_25 (11) = happyShift action_9
+action_25 (13) = happyShift action_10
+action_25 (14) = happyShift action_27
+action_25 (15) = happyShift action_28
+action_25 (16) = happyShift action_11
+action_25 (17) = happyShift action_12
+action_25 (18) = happyShift action_29
+action_25 (19) = happyShift action_30
+action_25 (20) = happyShift action_31
+action_25 (21) = happyShift action_13
+action_25 (22) = happyShift action_14
+action_25 (23) = happyShift action_15
+action_25 (25) = happyShift action_32
+action_25 (26) = happyShift action_33
+action_25 (27) = happyShift action_34
+action_25 (29) = happyShift action_16
+action_25 (32) = happyShift action_17
+action_25 (33) = happyShift action_18
+action_25 (7) = happyGoto action_26
+action_25 _ = happyFail
+
+action_26 (14) = happyShift action_27
+action_26 (15) = happyShift action_28
+action_26 (16) = happyShift action_11
+action_26 (17) = happyShift action_12
+action_26 (27) = happyShift action_34
+action_26 (7) = happyGoto action_26
+action_26 _ = happyReduce_18
+
+action_27 _ = happyReduce_19
+
+action_28 _ = happyReduce_20
+
+action_29 (9) = happyShift action_8
+action_29 (11) = happyShift action_9
+action_29 (13) = happyShift action_10
+action_29 (16) = happyShift action_11
+action_29 (17) = happyShift action_12
+action_29 (21) = happyShift action_13
+action_29 (22) = happyShift action_14
+action_29 (23) = happyShift action_15
+action_29 (29) = happyShift action_16
+action_29 (32) = happyShift action_17
+action_29 (33) = happyShift action_18
+action_29 (7) = happyGoto action_44
+action_29 _ = happyFail
+
+action_30 (9) = happyShift action_8
+action_30 (11) = happyShift action_9
+action_30 (13) = happyShift action_10
+action_30 (16) = happyShift action_11
+action_30 (17) = happyShift action_12
+action_30 (21) = happyShift action_13
+action_30 (22) = happyShift action_14
+action_30 (23) = happyShift action_15
+action_30 (29) = happyShift action_16
+action_30 (32) = happyShift action_17
+action_30 (33) = happyShift action_18
+action_30 (7) = happyGoto action_43
+action_30 _ = happyFail
+
+action_31 (9) = happyShift action_8
+action_31 (11) = happyShift action_9
+action_31 (13) = happyShift action_10
+action_31 (16) = happyShift action_11
+action_31 (17) = happyShift action_12
+action_31 (21) = happyShift action_13
+action_31 (22) = happyShift action_14
+action_31 (23) = happyShift action_15
+action_31 (29) = happyShift action_16
+action_31 (32) = happyShift action_17
+action_31 (33) = happyShift action_18
+action_31 (7) = happyGoto action_42
+action_31 _ = happyFail
+
+action_32 (9) = happyShift action_8
+action_32 (11) = happyShift action_9
+action_32 (13) = happyShift action_10
+action_32 (16) = happyShift action_11
+action_32 (17) = happyShift action_12
+action_32 (21) = happyShift action_13
+action_32 (22) = happyShift action_14
+action_32 (23) = happyShift action_15
+action_32 (29) = happyShift action_16
+action_32 (32) = happyShift action_17
+action_32 (33) = happyShift action_18
+action_32 (7) = happyGoto action_41
+action_32 _ = happyFail
+
+action_33 (9) = happyShift action_8
+action_33 (11) = happyShift action_9
+action_33 (13) = happyShift action_10
+action_33 (16) = happyShift action_11
+action_33 (17) = happyShift action_12
+action_33 (21) = happyShift action_13
+action_33 (22) = happyShift action_14
+action_33 (23) = happyShift action_15
+action_33 (29) = happyShift action_16
+action_33 (32) = happyShift action_17
+action_33 (33) = happyShift action_18
+action_33 (7) = happyGoto action_40
+action_33 _ = happyFail
+
+action_34 (28) = happyShift action_39
+action_34 _ = happyFail
+
+action_35 (9) = happyShift action_8
+action_35 (11) = happyShift action_9
+action_35 (13) = happyShift action_10
+action_35 (16) = happyShift action_11
+action_35 (17) = happyShift action_12
+action_35 (21) = happyShift action_13
+action_35 (22) = happyShift action_14
+action_35 (23) = happyShift action_15
+action_35 (29) = happyShift action_16
+action_35 (32) = happyShift action_17
+action_35 (33) = happyShift action_18
+action_35 (7) = happyGoto action_38
+action_35 _ = happyFail
+
+action_36 (9) = happyShift action_8
+action_36 (11) = happyShift action_9
+action_36 (13) = happyShift action_10
+action_36 (16) = happyShift action_11
+action_36 (17) = happyShift action_12
+action_36 (21) = happyShift action_13
+action_36 (22) = happyShift action_14
+action_36 (23) = happyShift action_15
+action_36 (29) = happyShift action_16
+action_36 (32) = happyShift action_17
+action_36 (33) = happyShift action_18
+action_36 (7) = happyGoto action_37
+action_36 _ = happyFail
+
+action_37 (8) = happyShift action_49
+action_37 (9) = happyShift action_8
+action_37 (11) = happyShift action_9
+action_37 (13) = happyShift action_10
+action_37 (14) = happyShift action_27
+action_37 (15) = happyShift action_28
+action_37 (16) = happyShift action_11
+action_37 (17) = happyShift action_12
+action_37 (18) = happyShift action_29
+action_37 (19) = happyShift action_30
+action_37 (20) = happyShift action_31
+action_37 (21) = happyShift action_13
+action_37 (22) = happyShift action_14
+action_37 (23) = happyShift action_15
+action_37 (25) = happyShift action_32
+action_37 (26) = happyShift action_33
+action_37 (27) = happyShift action_34
+action_37 (29) = happyShift action_16
+action_37 (32) = happyShift action_17
+action_37 (33) = happyShift action_18
+action_37 (7) = happyGoto action_26
+action_37 _ = happyFail
+
+action_38 (8) = happyShift action_48
+action_38 (9) = happyShift action_8
+action_38 (11) = happyShift action_9
+action_38 (13) = happyShift action_10
+action_38 (14) = happyShift action_27
+action_38 (15) = happyShift action_28
+action_38 (16) = happyShift action_11
+action_38 (17) = happyShift action_12
+action_38 (18) = happyShift action_29
+action_38 (19) = happyShift action_30
+action_38 (20) = happyShift action_31
+action_38 (21) = happyShift action_13
+action_38 (22) = happyShift action_14
+action_38 (23) = happyShift action_15
+action_38 (25) = happyShift action_32
+action_38 (26) = happyShift action_33
+action_38 (27) = happyShift action_34
+action_38 (29) = happyShift action_16
+action_38 (32) = happyShift action_17
+action_38 (33) = happyShift action_18
+action_38 (7) = happyGoto action_26
+action_38 _ = happyFail
+
+action_39 _ = happyReduce_9
+
+action_40 (14) = happyShift action_27
+action_40 (15) = happyShift action_28
+action_40 (16) = happyShift action_11
+action_40 (17) = happyShift action_12
+action_40 (18) = happyShift action_29
+action_40 (19) = happyShift action_30
+action_40 (20) = happyShift action_31
+action_40 (27) = happyShift action_34
+action_40 (7) = happyGoto action_26
+action_40 _ = happyReduce_7
+
+action_41 (14) = happyShift action_27
+action_41 (15) = happyShift action_28
+action_41 (16) = happyShift action_11
+action_41 (17) = happyShift action_12
+action_41 (18) = happyShift action_29
+action_41 (19) = happyShift action_30
+action_41 (20) = happyShift action_31
+action_41 (27) = happyShift action_34
+action_41 (7) = happyGoto action_26
+action_41 _ = happyReduce_8
+
+action_42 (14) = happyShift action_27
+action_42 (15) = happyShift action_28
+action_42 (16) = happyShift action_11
+action_42 (17) = happyShift action_12
+action_42 (27) = happyShift action_34
+action_42 (7) = happyGoto action_26
+action_42 _ = happyReduce_13
+
+action_43 (14) = happyShift action_27
+action_43 (15) = happyShift action_28
+action_43 (16) = happyShift action_11
+action_43 (17) = happyShift action_12
+action_43 (27) = happyShift action_34
+action_43 (7) = happyGoto action_26
+action_43 _ = happyReduce_15
+
+action_44 (14) = happyShift action_27
+action_44 (15) = happyShift action_28
+action_44 (16) = happyShift action_11
+action_44 (17) = happyShift action_12
+action_44 (27) = happyShift action_34
+action_44 (7) = happyGoto action_26
+action_44 _ = happyReduce_14
+
+action_45 _ = happyReduce_12
+
+action_46 _ = happyReduce_11
+
+action_47 _ = happyReduce_23
+
+action_48 _ = happyReduce_4
+
+action_49 _ = happyReduce_5
+
+happyReduce_2 = happySpecReduce_2 5 happyReduction_2
+happyReduction_2 (HappyAbsSyn6  happy_var_2)
+	(HappyAbsSyn5  happy_var_1)
+	 =  HappyAbsSyn5
+		 (happy_var_2:happy_var_1
+	)
+happyReduction_2 _ _  = notHappyAtAll
+
+happyReduce_3 = happySpecReduce_1 5 happyReduction_3
+happyReduction_3 (HappyAbsSyn6  happy_var_1)
+	 =  HappyAbsSyn5
+		 ([happy_var_1]
+	)
+happyReduction_3 _  = notHappyAtAll
+
+happyReduce_4 = happyReduce 4 6 happyReduction_4
+happyReduction_4 (_ `HappyStk`
+	(HappyAbsSyn7  happy_var_3) `HappyStk`
+	_ `HappyStk`
+	_ `HappyStk`
+	happyRest)
+	 = HappyAbsSyn6
+		 (Main happy_var_3
+	) `HappyStk` happyRest
+
+happyReduce_5 = happyReduce 4 6 happyReduction_5
+happyReduction_5 (_ `HappyStk`
+	(HappyAbsSyn7  happy_var_3) `HappyStk`
+	_ `HappyStk`
+	(HappyTerminal (TokenFun  happy_var_1)) `HappyStk`
+	happyRest)
+	 = HappyAbsSyn6
+		 (Function (fst $ snd happy_var_1) (snd $ snd happy_var_1) happy_var_3
+	) `HappyStk` happyRest
+
+happyReduce_6 = happyMonadReduce 1 7 happyReduction_6
+happyReduction_6 ((HappyTerminal (TokenFun  happy_var_1)) `HappyStk`
+	happyRest)
+	 = happyThen ( case (parseList (snd $ snd happy_var_1) []) of
+				      FailE str -> failE $ "\nfstStudio failed to parse.\nParse error at line: "++ show (fst happy_var_1) ++"\n"
+				      Ok  list  -> returnE $ Fun (fst $ snd happy_var_1) list
+	) (\r -> happyReturn (HappyAbsSyn7 r))
+
+happyReduce_7 = happySpecReduce_3 7 happyReduction_7
+happyReduction_7 (HappyAbsSyn7  happy_var_3)
+	_
+	(HappyAbsSyn7  happy_var_1)
+	 =  HappyAbsSyn7
+		 (NComp happy_var_1 happy_var_3
+	)
+happyReduction_7 _ _ _  = notHappyAtAll
+
+happyReduce_8 = happySpecReduce_3 7 happyReduction_8
+happyReduction_8 (HappyAbsSyn7  happy_var_3)
+	_
+	(HappyAbsSyn7  happy_var_1)
+	 =  HappyAbsSyn7
+		 (NCross happy_var_1 happy_var_3
+	)
+happyReduction_8 _ _ _  = notHappyAtAll
+
+happyReduce_9 = happySpecReduce_3 7 happyReduction_9
+happyReduction_9 (HappyTerminal (TokenNum  happy_var_3))
+	_
+	(HappyAbsSyn7  happy_var_1)
+	 =  HappyAbsSyn7
+		 (foldr NProduct NEpsilon $ take ((snd happy_var_3)) $ repeat happy_var_1
+	)
+happyReduction_9 _ _ _  = notHappyAtAll
+
+happyReduce_10 = happySpecReduce_1 7 happyReduction_10
+happyReduction_10 (HappyTerminal (TokenConcatS happy_var_1))
+	 =  HappyAbsSyn7
+		 (foldr NProduct NEpsilon $ map (NSymbol.(:[])) (snd happy_var_1)
+	)
+happyReduction_10 _  = notHappyAtAll
+
+happyReduce_11 = happySpecReduce_3 7 happyReduction_11
+happyReduction_11 _
+	(HappyAbsSyn7  happy_var_2)
+	_
+	 =  HappyAbsSyn7
+		 (NUnion NEpsilon happy_var_2
+	)
+happyReduction_11 _ _ _  = notHappyAtAll
+
+happyReduce_12 = happySpecReduce_3 7 happyReduction_12
+happyReduction_12 _
+	(HappyAbsSyn7  happy_var_2)
+	_
+	 =  HappyAbsSyn7
+		 (happy_var_2
+	)
+happyReduction_12 _ _ _  = notHappyAtAll
+
+happyReduce_13 = happySpecReduce_3 7 happyReduction_13
+happyReduction_13 (HappyAbsSyn7  happy_var_3)
+	_
+	(HappyAbsSyn7  happy_var_1)
+	 =  HappyAbsSyn7
+		 (NUnion happy_var_1 happy_var_3
+	)
+happyReduction_13 _ _ _  = notHappyAtAll
+
+happyReduce_14 = happySpecReduce_3 7 happyReduction_14
+happyReduction_14 (HappyAbsSyn7  happy_var_3)
+	_
+	(HappyAbsSyn7  happy_var_1)
+	 =  HappyAbsSyn7
+		 (NIntersect happy_var_1 (NComplement happy_var_3)
+	)
+happyReduction_14 _ _ _  = notHappyAtAll
+
+happyReduce_15 = happySpecReduce_3 7 happyReduction_15
+happyReduction_15 (HappyAbsSyn7  happy_var_3)
+	_
+	(HappyAbsSyn7  happy_var_1)
+	 =  HappyAbsSyn7
+		 (NIntersect happy_var_1 happy_var_3
+	)
+happyReduction_15 _ _ _  = notHappyAtAll
+
+happyReduce_16 = happySpecReduce_2 7 happyReduction_16
+happyReduction_16 (HappyAbsSyn7  happy_var_2)
+	_
+	 =  HappyAbsSyn7
+		 (NComplement happy_var_2
+	)
+happyReduction_16 _ _  = notHappyAtAll
+
+happyReduce_17 = happySpecReduce_2 7 happyReduction_17
+happyReduction_17 (HappyAbsSyn7  happy_var_2)
+	_
+	 =  HappyAbsSyn7
+		 (NProduct (NProduct (NStar NAll) happy_var_2) (NStar NAll)
+	)
+happyReduction_17 _ _  = notHappyAtAll
+
+happyReduce_18 = happySpecReduce_2 7 happyReduction_18
+happyReduction_18 (HappyAbsSyn7  happy_var_2)
+	(HappyAbsSyn7  happy_var_1)
+	 =  HappyAbsSyn7
+		 (NProduct happy_var_1 happy_var_2
+	)
+happyReduction_18 _ _  = notHappyAtAll
+
+happyReduce_19 = happySpecReduce_2 7 happyReduction_19
+happyReduction_19 _
+	(HappyAbsSyn7  happy_var_1)
+	 =  HappyAbsSyn7
+		 (NStar happy_var_1
+	)
+happyReduction_19 _ _  = notHappyAtAll
+
+happyReduce_20 = happySpecReduce_2 7 happyReduction_20
+happyReduction_20 _
+	(HappyAbsSyn7  happy_var_1)
+	 =  HappyAbsSyn7
+		 (NProduct happy_var_1  (NStar happy_var_1 )
+	)
+happyReduction_20 _ _  = notHappyAtAll
+
+happyReduce_21 = happySpecReduce_1 7 happyReduction_21
+happyReduction_21 _
+	 =  HappyAbsSyn7
+		 (NEpsilon
+	)
+
+happyReduce_22 = happySpecReduce_1 7 happyReduction_22
+happyReduction_22 _
+	 =  HappyAbsSyn7
+		 (NAll
+	)
+
+happyReduce_23 = happySpecReduce_3 7 happyReduction_23
+happyReduction_23 (HappyTerminal (TokenS happy_var_3))
+	_
+	(HappyTerminal (TokenS happy_var_1))
+	 =  HappyAbsSyn7
+		 (NRelation (snd happy_var_1) (snd happy_var_3)
+	)
+happyReduction_23 _ _ _  = notHappyAtAll
+
+happyReduce_24 = happySpecReduce_1 7 happyReduction_24
+happyReduction_24 (HappyTerminal (TokenS happy_var_1))
+	 =  HappyAbsSyn7
+		 (NSymbol $ snd happy_var_1
+	)
+happyReduction_24 _  = notHappyAtAll
+
+happyReduce_25 = happySpecReduce_1 7 happyReduction_25
+happyReduction_25 (HappyTerminal (TokenVar happy_var_1))
+	 =  HappyAbsSyn7
+		 (NVar $ snd happy_var_1
+	)
+happyReduction_25 _  = notHappyAtAll
+
+happyReduce_26 = happyMonadReduce 1 7 happyReduction_26
+happyReduction_26 ((HappyTerminal (Err happy_var_1)) `HappyStk`
+	happyRest)
+	 = happyThen ( failE happy_var_1
+	) (\r -> happyReturn (HappyAbsSyn7 r))
+
+happyNewToken action sts stk [] =
+	action 34 34 (error "reading EOF!") (HappyState action) sts stk []
+
+happyNewToken action sts stk (tk:tks) =
+	let cont i = action i i tk (HappyState action) sts stk tks in
+	case tk of {
+	TokenSemi happy_dollar_dollar -> cont 8;
+	TokenHOB happy_dollar_dollar -> cont 9;
+	TokenHCB happy_dollar_dollar -> cont 10;
+	TokenSOB happy_dollar_dollar -> cont 11;
+	TokenSCB happy_dollar_dollar -> cont 12;
+	TokenConcatS happy_dollar_dollar -> cont 13;
+	TokenStar happy_dollar_dollar -> cont 14;
+	TokenPlus happy_dollar_dollar -> cont 15;
+	TokenComplement happy_dollar_dollar -> cont 16;
+	TokenContainment happy_dollar_dollar -> cont 17;
+	TokenMinus happy_dollar_dollar -> cont 18;
+	TokenIntersect happy_dollar_dollar -> cont 19;
+	TokenUnion happy_dollar_dollar -> cont 20;
+	TokenEps happy_dollar_dollar -> cont 21;
+	TokenAll happy_dollar_dollar -> cont 22;
+	TokenS happy_dollar_dollar -> cont 23;
+	TokenRelation happy_dollar_dollar -> cont 24;
+	TokenCrossproduct happy_dollar_dollar -> cont 25;
+	TokenComposition happy_dollar_dollar -> cont 26;
+	TokenRepeat happy_dollar_dollar -> cont 27;
+	TokenNum  happy_dollar_dollar -> cont 28;
+	TokenFun  happy_dollar_dollar -> cont 29;
+	TokenMain happy_dollar_dollar -> cont 30;
+	TokenDef  happy_dollar_dollar -> cont 31;
+	TokenVar happy_dollar_dollar -> cont 32;
+	Err happy_dollar_dollar -> cont 33;
+	}
+
+happyThen = (thenE)
+happyReturn = (returnE)
+happyThen1 m k tks = (thenE) m (\a -> k a tks)
+happyReturn1 = \a tks -> (returnE) a
+
+parse tks = happyThen (happyParse action_0 tks) (\x -> case x of {HappyAbsSyn5 z -> happyReturn z; _other -> notHappyAtAll })
+
+parseNReg tks = happyThen (happyParse action_1 tks) (\x -> case x of {HappyAbsSyn7 z -> happyReturn z; _other -> notHappyAtAll })
+
+happyError :: [Token] -> E a
+happyError _ = failE $ "\nfstStudio failed to parse.\n No useful message can be printed.\n"
+
+data E a =   Ok a
+	   | FailE String
+
+instance Monad (E) where
+ return = returnE
+ (>>=)  = thenE
+
+m `thenE` k = case m of
+	       Ok   a    -> k a
+	       FailE str -> FailE str
+
+returnE :: a -> E a
+returnE a = Ok a
+
+failE :: String -> E a
+failE str = FailE str
+
+data Def  = Main (NReg String) |
+            Function Name [String] (NReg String)
+
+functional (Ok def)     = case (getMain def) of
+                           Ok main   -> apply main def
+                           FailE str -> FailE str
+functional (FailE str)  = FailE str
+
+getMain []             = failE "\nfstStudio failed to parse.\nNo main function exists.\n"
+getMain ((Main n1):xs) = Ok n1
+getMain (_:xs)         = getMain xs
+
+apply :: NReg String -> [Def] -> E (NReg String)
+apply  (NCross n1 n2)     env = do liftM2 NCross      (apply n1 env) (apply n2 env)
+apply  (NComp  n1 n2)     env = do liftM2 NComp       (apply n1 env) (apply n2 env)
+apply  (NUnion n1 n2)     env = do liftM2 NUnion      (apply n1 env) (apply n2 env)
+apply  (NProduct n1 n2)   env = do liftM2 NProduct    (apply n1 env) (apply n2 env)
+apply  (NIntersect n1 n2) env = do liftM2 NIntersect  (apply n1 env) (apply n2 env)
+apply  (NStar n1)         env = do liftM  NStar       (apply n1 env)
+apply  (NComplement n1)   env = do liftM  NComplement (apply n1 env)
+apply  (Fun str ns)       env = do applyFun (str,ns) env env
+apply  n1                 _   = returnE n1
+
+applyFun (str,_) []   _      = failE $ "\nfstStudio failed to parse.\nFound a unidentified function: " ++ str ++ "\n"
+applyFun (str,ns) ((Function name vars n1):xs) env
+ | str == name               = do res <- (replace n1 (zip vars ns))
+				  apply res env
+ | otherwise                 = do applyFun (str,ns) xs env
+applyFun (str,ns) (_:xs) env = do applyFun (str,ns) xs env
+
+replace :: NReg String -> [(String,NReg String)] -> E (NReg String)
+replace (NCross n1 n2)      env  = do liftM2 NCross      (replace n1 env) (replace n2 env)
+replace (NComp n1 n2)       env  = do liftM2 NComp       (replace n1 env) (replace n2 env)
+replace (NUnion n1 n2)      env  = do liftM2 NUnion      (replace n1 env) (replace n2 env)
+replace (NProduct n1 n2)    env  = do liftM2 NProduct    (replace n1 env) (replace n2 env)
+replace (NStar n1)          env  = do liftM  NStar       (replace n1 env)
+replace (NIntersect n1 n2)  env  = do liftM2 NIntersect  (replace n1 env) (replace n2 env)
+replace (NComplement n1)    env  = do liftM NComplement  (replace n1 env)
+replace (NVar str)          env  = case (lookup str env) of
+				    Just n1 -> returnE n1
+				    Nothing -> failE $ "\nfstStudio failed to parse.\nFound a unidentified variable: " ++ str ++"\n"
+replace n1                  env  = returnE n1
+
+parseList :: [String] -> [NReg String] -> E ([NReg String])
+parseList [] res         = Ok (reverse res)
+parseList (str:list) res = case ((parseNReg.lexer) str) of
+			    FailE str -> FailE str
+			    Ok n1     -> parseList list (n1:res)
+
+parseExp :: String -> Either String (RReg String)
+parseExp str = case ((parseNReg.lexer) str) of
+                FailE str -> Left "\nfstStudio failed to parse given expression.\n"
+                Ok n1 -> case (toRReg (nVarToSymbol n1)) of
+                          Just rreg -> Right rreg
+                          Nothing -> Left "\nfstStudio failed to parse given expression.\n"
+
+parseProgram :: String -> Either String (RReg String)
+parseProgram str = case ((functional.parse.lexer) str) of
+                    FailE str -> Left str
+                    Ok n1     -> case (toRReg n1) of
+                                  Just rreg -> Right  rreg
+                                  Nothing   -> Left "\nfstStudio failed to parse.\nNo main function exists.\n"
+{-# LINE 1 "GenericTemplate.hs" -}
+{-# LINE 1 "GenericTemplate.hs" -}
+-- $Id: GenericTemplate.hs,v 1.11 2001/03/30 14:24:07 simonmar Exp $
+
+{-# LINE 15 "GenericTemplate.hs" -}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+infixr 9 `HappyStk`
+data HappyStk a = HappyStk a (HappyStk a)
+
+-----------------------------------------------------------------------------
+-- starting the parse
+
+happyParse start_state = happyNewToken start_state notHappyAtAll notHappyAtAll
+
+-----------------------------------------------------------------------------
+-- Accepting the parse
+
+happyAccept j tk st sts (HappyStk ans _) =
+
+					   (happyReturn1 ans)
+
+-----------------------------------------------------------------------------
+-- Arrays only: do the next action
+
+{-# LINE 127 "GenericTemplate.hs" -}
+
+
+-----------------------------------------------------------------------------
+-- HappyState data type (not arrays)
+
+
+
+newtype HappyState b c = HappyState
+        (Int ->                    -- token number
+         Int ->                    -- token number (yes, again)
+         b ->                           -- token semantic value
+         HappyState b c ->              -- current state
+         [HappyState b c] ->            -- state stack
+         c)
+
+
+
+-----------------------------------------------------------------------------
+-- Shifting a token
+
+happyShift new_state (1) tk st sts stk@(x `HappyStk` _) =
+     let i = (case x of { HappyErrorToken (i) -> i }) in
+--     trace "shifting the error token" $
+     new_state i i tk (HappyState (new_state)) ((st):(sts)) (stk)
+
+happyShift new_state i tk st sts stk =
+     happyNewToken new_state ((st):(sts)) ((HappyTerminal (tk))`HappyStk`stk)
+
+-- happyReduce is specialised for the common cases.
+
+happySpecReduce_0 i fn (1) tk st sts stk
+     = happyFail (1) tk st sts stk
+happySpecReduce_0 nt fn j tk st@((HappyState (action))) sts stk
+     = action nt j tk st ((st):(sts)) (fn `HappyStk` stk)
+
+happySpecReduce_1 i fn (1) tk st sts stk
+     = happyFail (1) tk st sts stk
+happySpecReduce_1 nt fn j tk _ sts@(((st@(HappyState (action))):(_))) (v1`HappyStk`stk')
+     = action nt j tk st sts (fn v1 `HappyStk` stk')
+
+happySpecReduce_2 i fn (1) tk st sts stk
+     = happyFail (1) tk st sts stk
+happySpecReduce_2 nt fn j tk _ ((_):(sts@(((st@(HappyState (action))):(_))))) (v1`HappyStk`v2`HappyStk`stk')
+     = action nt j tk st sts (fn v1 v2 `HappyStk` stk')
+
+happySpecReduce_3 i fn (1) tk st sts stk
+     = happyFail (1) tk st sts stk
+happySpecReduce_3 nt fn j tk _ ((_):(((_):(sts@(((st@(HappyState (action))):(_))))))) (v1`HappyStk`v2`HappyStk`v3`HappyStk`stk')
+     = action nt j tk st sts (fn v1 v2 v3 `HappyStk` stk')
+
+happyReduce k i fn (1) tk st sts stk
+     = happyFail (1) tk st sts stk
+happyReduce k nt fn j tk st sts stk = action nt j tk st1 sts1 (fn stk)
+       where sts1@(((st1@(HappyState (action))):(_))) = happyDrop k ((st):(sts))
+
+happyMonadReduce k nt fn (1) tk st sts stk
+     = happyFail (1) tk st sts stk
+happyMonadReduce k nt fn j tk st sts stk =
+        happyThen1 (fn stk) (\r -> action nt j tk st1 sts1 (r `HappyStk` drop_stk))
+       where sts1@(((st1@(HappyState (action))):(_))) = happyDrop k ((st):(sts))
+             drop_stk = happyDropStk k stk
+
+happyDrop (0) l = l
+happyDrop n ((_):(t)) = happyDrop (n - (1)) t
+
+happyDropStk (0) l = l
+happyDropStk n (x `HappyStk` xs) = happyDropStk (n - (1)) xs
+
+-----------------------------------------------------------------------------
+-- Moving to a new state after a reduction
+
+
+
+
+
+
+
+
+
+happyGoto action j tk st = action j j tk (HappyState action)
+
+
+-----------------------------------------------------------------------------
+-- Error recovery ((1) is the error token)
+
+-- parse error if we are in recovery and we fail again
+happyFail  (1) tk old_st _ stk =
+--	trace "failing" $
+    	happyError
+
+
+{-  We don't need state discarding for our restricted implementation of
+    "error".  In fact, it can cause some bogus parses, so I've disabled it
+    for now --SDM
+
+-- discard a state
+happyFail  (1) tk old_st (((HappyState (action))):(sts))
+						(saved_tok `HappyStk` _ `HappyStk` stk) =
+--	trace ("discarding state, depth " ++ show (length stk))  $
+	action (1) (1) tk (HappyState (action)) sts ((saved_tok`HappyStk`stk))
+-}
+
+-- Enter error recovery: generate an error token,
+--                       save the old token and carry on.
+happyFail  i tk (HappyState (action)) sts stk =
+--      trace "entering error recovery" $
+	action (1) (1) tk (HappyState (action)) sts ( (HappyErrorToken (i)) `HappyStk` stk)
+
+-- Internal happy errors:
+
+notHappyAtAll = error "Internal Happy error\n"
+
+-----------------------------------------------------------------------------
+-- Hack to get the typechecker to accept our action functions
+
+
+
+
+
+
+
+-----------------------------------------------------------------------------
+-- Don't inline any functions from the template.  GHC has a nasty habit
+-- of deciding to inline happyGoto everywhere, which increases the size of
+-- the generated parser quite a bit.
+
+
+
+
+
+
+
+
+
+{-# NOINLINE happyShift #-}
+{-# NOINLINE happySpecReduce_0 #-}
+{-# NOINLINE happySpecReduce_1 #-}
+{-# NOINLINE happySpecReduce_2 #-}
+{-# NOINLINE happySpecReduce_3 #-}
+{-# NOINLINE happyReduce #-}
+{-# NOINLINE happyMonadReduce #-}
+{-# NOINLINE happyGoto #-}
+{-# NOINLINE happyFail #-}
+
+-- end of Happy Template.
diff --git a/FST/RRegTypes.hs b/FST/RRegTypes.hs
new file mode 100644
--- /dev/null
+++ b/FST/RRegTypes.hs
@@ -0,0 +1,113 @@
+{-
+   **************************************************************
+   * Filename      : RRegTypes.hs                               *
+   * Author        : Markus Forsberg                            *
+   *                 d97forma@dtek.chalmers.se                  *
+   * Last Modified : 5 July, 2001                               *
+   * Lines         : 113                                        *
+   **************************************************************
+-}
+
+module FST.RRegTypes ( module FST.RegTypes,
+                   RReg(..), -- data type for regular relations.
+                   (<|>),    -- union combinator for regular relations.
+                   (|>),     -- product combinator for regular relations.
+                   star,     -- Kleene's star for regular relations.
+                   plus,     -- Kleene's plus for regular relations.
+                   empty,    -- The empty set of regular relations.
+                   (<*>),    -- Cross product opertor.
+                   (<.>),    -- Composition operator.
+                   idR,      -- Identity relation.
+                   r,        -- Relation.
+                   symbols   -- Collect the symbols in a regular relations.
+                 ) where
+
+import FST.RegTypes
+import FST.TransducerTypes (Symbol(..))
+
+import Data.List(nub)
+
+{- *************************************
+   * Datatype for a regular relations  *
+   *************************************
+-}
+
+data RReg a
+    =   Cross         (Reg a)      (Reg a)      {- *** Cross product     *** -}
+      | Comp          (RReg a)     (RReg a)     {- *** Composition       *** -}
+      | ProductR      (RReg a)     (RReg a)     {- *** Concatenation     *** -}
+      | UnionR        (RReg a)     (RReg a)     {- *** Union             *** -}
+      | StarR         (RReg a)                  {- *** Kleene star       *** -}
+      | Identity      (Reg a)                   {- *** Identity relation *** -}
+      | Relation      (Symbol a) (Symbol a)     {- *** (a:b)             *** -}
+      | EmptyR                                  {- *** Empty language    *** -}
+      deriving (Eq)
+
+{- *************************************
+   * Instance of Combinators (RReg a)  *
+   *************************************
+-}
+
+instance Eq a => Combinators (RReg a) where
+ EmptyR <|> r2     = r2      -- [ r1 | [] ] = r1
+ r1     <|> EmptyR = r1      -- [ [] | r2 ] = r2
+ r1     <|> r2
+  | r1 == r2       = r1      -- [ r1 | r1 ] = r1
+  | otherwise      = UnionR r1 r2
+ EmptyR  |> _      = EmptyR  -- [ [] r2 ] = []
+ _       |> EmptyR = EmptyR  -- [ r1 [] ] = []
+ r1      |> r2     = ProductR r1 r2
+ star (StarR r1)   = star r1 -- [ r1* ]* = r1*
+ star r1           = StarR r1
+ plus r1           = r1 |> star r1
+ empty             = EmptyR
+
+infixl 2 <*>
+infixl 1 <.>
+
+-- Cross product operator.
+(<*>) :: Eq a => Reg a -> Reg a -> RReg a
+(<*>) = Cross
+
+-- Composition operator
+(<.>) :: Eq a => RReg a -> RReg a -> RReg a
+(<.>) = Comp
+
+-- Identity relation.
+idR :: Eq a => Reg a -> RReg a
+idR = Identity
+
+r :: Eq a => a -> a -> RReg a
+r a b = Relation (S a) (S b)
+
+{- *************************************
+   * Instance of Symbols (RReg a)      *
+   *************************************
+-}
+
+instance Symbols RReg where
+ symbols (Cross r1 r2)    = nub $ symbols r1 ++ symbols r2
+ symbols (Comp r1 r2)     = nub $ symbols r1 ++ symbols r2
+ symbols (ProductR r1 r2) = nub $ symbols r1 ++ symbols r2
+ symbols (UnionR r1 r2)   = nub $ symbols r1 ++ symbols r2
+ symbols (StarR r1)       = symbols r1
+ symbols (Identity r1)    = symbols r1
+ symbols (Relation a b)   = let sym (S c) = [c]
+                                sym  _    = []
+                             in nub $ sym a ++ sym b
+ symbols _                = []
+
+{- *************************************
+   * Instance of Show (RReg a)         *
+   *************************************
+-}
+
+instance Show a => Show (RReg a) where
+ show (Cross r1 r2)   = "[ " ++ show r1 ++ " .x. " ++ show r2 ++ " ]"
+ show (Comp r1 r2)    = "[ " ++ show r1 ++ " .o. " ++ show r2 ++ " ]"
+ show (UnionR r1 r2)  = "[ " ++ show r1 ++ " | " ++ show r2 ++ " ]"
+ show (ProductR r1 r2)= "[ " ++ show r1 ++ " " ++ show r2 ++ " ]"
+ show (Identity r)    = show r
+ show (StarR r)       = "[ " ++ show r ++ " ]*"
+ show (Relation a b)  = "[ " ++ show a ++":"++show b ++" ]"
+ show (EmptyR)        = "[]"
diff --git a/FST/RegTypes.hs b/FST/RegTypes.hs
new file mode 100644
--- /dev/null
+++ b/FST/RegTypes.hs
@@ -0,0 +1,218 @@
+{-
+   **************************************************************
+   * Filename      : RegTypes.hs                                *
+   * Author        : Markus Forsberg                            *
+   *                 d97forma@dtek.chalmers.se                  *
+   * Last Modified : 5 July, 2001                               *
+   * Lines         : 219                                        *
+   **************************************************************
+-}
+
+module FST.RegTypes ( Reg(..),      -- data type for the regular expression
+                  Combinators,  -- Type class for Combinators.
+		  (<|>),        -- Union combinator
+		  (|>),         -- Concatenation combinator
+		  (<&>),        -- Intersection combinator
+		  (<->),        -- Minus combinator
+		  s,            -- Symbol
+		  eps,          -- Epsilon
+		  empty,        -- Empty
+		  complement,   -- Complement
+		  star,         -- Star
+		  plus,         -- Plus
+		  allS,         -- All Symbol
+		  allToSymbols, -- transform the 'all' symbol to union over
+		                -- alphabet.
+		  allFree,      -- free a regular expression from 'all'
+		                -- symbols.
+		  reversal,     -- reverse a regular expression.
+		  acceptEps,    -- Does the regular expression accept epsilon?
+		  Symbols,      -- Type class for Symbols.
+		  symbols       -- Collect the symbols in a
+		                -- regular expression.
+	        ) where
+
+import Data.List (nub)
+
+{- **********************************************************
+   * Data type for a regular expression.                    *
+   **********************************************************
+-}
+
+data Reg a = Empty              | -- []
+	     Epsilon            | -- 0
+	     All                | -- ?
+	     Symbol a           | -- a
+	     Reg a :|: Reg a    | -- [ r1 | r2 ]
+	     Reg a :.: Reg a    | -- [ r1 r2 ]
+	     Reg a :&: Reg a    | -- [ r1 & r2 ]
+	     Complement (Reg a) | -- ~[ r1 ]
+	     Star       (Reg a)   -- [ r2 ]*
+	deriving (Eq)
+
+{- **********************************************************
+   * Combinators.                                           *
+   * The regular expressions are simplified while combined. *
+   **********************************************************
+-}
+
+infixl 5  |>  -- Concatenation
+infixl 4 <|>  -- Union
+infixl 3 <&>  -- Intersection
+infixl 3 <->  -- Set minus
+
+class Combinators a where
+ (<|>) :: a -> a -> a -- Union
+ (|>)  :: a -> a -> a -- Concatenation
+ star  :: a -> a      -- Kleene's star
+ plus  :: a -> a      -- Kleene's plus
+ empty :: a
+
+instance Eq a => Combinators (Reg a) where
+ Empty <|> b = b                    -- [ [] | r1 ] = r1
+ a <|> Empty = a                    -- [ r1 | [] ] = r1
+ _ <|> (Star All) = Star All
+ (Star All) <|> _ = Star All
+ a1@(a :.: b) <|> a2@(c :.: d)
+  | a1 == a2  = a1
+  | a == c    = a |> (b <|> d)
+  | b == d    = (a <|> c) |> b
+  | otherwise = a1 :|: a2
+ a <|> b
+  | a == b = a                      -- [ r1 | r1 ] = r1
+  | otherwise = a :|: b
+
+ Empty |> _   = empty               -- [ [] r1 ] = []
+ _ |> Empty   = empty               -- [ r1 [] ] = []
+ Epsilon |> b = b                   -- [ 0 r1 ]  = r1
+ a |> Epsilon = a                   -- [ r1 0 ]  = r1
+ a |> b       = a :.: b
+
+ star (Star a)  = star a            -- [r1]**  = [r1]*
+ star (Epsilon) = eps               -- [0]*    = 0
+ star (Empty)   = eps               -- [ [] ]* = 0
+ star a         = Star a
+
+ plus a         = a |> star a
+
+ empty = Empty
+
+{- Intersection -}
+
+(<&>) :: Eq a => Reg a -> Reg a -> Reg a
+_ <&> Empty = Empty                 -- [ r1 & [] ] = []
+Empty <&> _ = Empty                 -- [ [] & r1 ] = []
+(Star All) <&> a = a
+a <&> (Star All) = a
+a <&> b
+ | a == b    = a                    -- [ r1 & r1 ] = r1
+ | otherwise = a :&: b
+
+{- Minus. Definition A - B = A & ~B -}
+
+(<->) :: Eq a => Reg a -> Reg a -> Reg a
+Empty <-> _ = empty                 -- [ [] - r1 ] = []
+a <-> Empty = a                     -- [ r1 - [] ] = r1
+a <-> b
+ | a == b    = empty                -- [ r1 - r1 ] = []
+ | otherwise = a <&> (complement b)
+
+s :: a -> Reg a
+s a = Symbol a
+
+eps :: Reg a
+eps = Epsilon
+
+allS :: Reg a
+allS = All
+
+complement :: Eq a => Reg a -> Reg a
+complement Empty   = star allS       -- ~[ [] ] = ?*
+complement Epsilon = plus allS       -- ~[ 0 ] = [? ?*]
+complement (Star All) = empty
+complement (Complement a) = a
+complement a       = Complement a
+
+{- *******************************************************************
+   * allToSymbols:  ? -> [a|..] with respect to an alphabet [a]      *
+   * allFreeReg: Construct a ?-free regular expression with respect  *
+   *             to an alphabet [a]                                  *
+   *******************************************************************
+-}
+
+allToSymbols :: Eq a => [a] -> Reg a
+allToSymbols sigma  = case sigma of
+ [] -> empty
+ ys -> foldr1 (:|:) [s a| a <- ys]
+
+allFree :: Eq a => Reg a -> [a] -> Reg a
+allFree (a :|: b)      sigma  = (allFree a sigma) :|: (allFree b sigma)
+allFree (a :.: b)      sigma  = (allFree a sigma) :.: (allFree b sigma)
+allFree (a :&: b)      sigma  = (allFree a sigma) :&: (allFree b sigma)
+allFree (Complement a) sigma  = Complement (allFree a sigma)
+allFree (Star a)       sigma  = Star       (allFree a sigma)
+allFree (All)          sigma  = allToSymbols sigma
+allFree r                  _  = r
+
+{- **********************************************************
+   * reversal: reverse the language denoted by the regular  *
+   *           expression.                                  *
+   **********************************************************
+-}
+
+reversal :: Eq a => Reg a -> Reg a
+reversal (a :|: b)      = (reversal a) :|: (reversal b)
+reversal (a :.: b)      = (reversal b) :.: (reversal a)
+reversal (a :&: b)      = (reversal a) :&: (reversal b)
+reversal (Complement a) = Complement (reversal a)
+reversal (Star a)       = Star (reversal a)
+reversal r              = r
+
+{- ***********************************************************
+   * acceptEps: Examines if a regular expression accepts     *
+   *            the empty string.                            *
+   ***********************************************************
+-}
+
+acceptEps :: Eq a => Reg a -> Bool
+acceptEps (Epsilon)             = True
+acceptEps (Star _)              = True
+acceptEps (a :|: b)             = acceptEps a || acceptEps b
+acceptEps (a :.: b)             = acceptEps a && acceptEps b
+acceptEps (a :&: b)             = acceptEps a && acceptEps b
+acceptEps (Complement a)        = not (acceptEps a)
+acceptEps _                     = False
+
+{- **********************************************************
+   * Symbols: type class for the collection of symbols in a *
+   * expression.                                            *
+   **********************************************************
+-}
+
+class Symbols f where
+ symbols :: Eq a => f a -> [a]
+
+instance Symbols Reg  where
+ symbols (Symbol a)          = [a]
+ symbols (a :.: b)           = nub $ (symbols a) ++ (symbols b)
+ symbols (a :|: b)           = nub $ (symbols a) ++ (symbols b)
+ symbols (a :&: b)           = nub $ (symbols a) ++ (symbols b)
+ symbols (Complement a)      = symbols a
+ symbols (Star a)            = symbols a
+ symbols _                   = []
+
+{- **********************************************************
+   * Instance of Show (Reg a)                               *
+   **********************************************************
+-}
+
+instance Show a => Show (Reg a) where
+ show (Empty)        = "[0 - 0]"
+ show (Epsilon)      = "0"
+ show (Symbol a)     = show a
+ show (All)          = "?"
+ show (Complement a) = "~" ++ "[" ++ show a ++ "]"
+ show (Star a)       = "[" ++ show a ++ "]* "
+ show (a :|: b)      = "[" ++ show a ++ " | " ++ show b ++ "]"
+ show (a :.: b)      = "[" ++ show a ++ " "   ++ show b ++ "]"
+ show (a :&: b)      = "[" ++ show a ++ " & " ++ show b ++ "]"
diff --git a/FST/Reversal.hs b/FST/Reversal.hs
new file mode 100644
--- /dev/null
+++ b/FST/Reversal.hs
@@ -0,0 +1,30 @@
+{-
+   **************************************************************
+   * Filename      : Reversal.hs                                *
+   * Author        : Markus Forsberg                            *
+   *                 d97forma@dtek.chalmers.se                  *
+   * Last Modified : 7 July, 2001                               *
+   * Lines         : 28                                         *
+   **************************************************************
+-}
+
+module FST.Reversal ( reversal  -- Reverse an automaton.
+                ) where
+
+import FST.Automaton
+
+import Data.Array
+
+reversal :: Eq a => Automaton a -> Automaton a
+reversal automaton  = reverseTrans (rename (transitionTable automaton)
+                                           (alphabet automaton)
+                                           (finals automaton)
+                                           (initials automaton)
+                                           (firstState automaton))
+
+reverseTrans :: Eq a => Automaton a -> Automaton a
+reverseTrans automaton = let bs    = (firstState automaton, lastState automaton)
+                             table = assocs $ accumArray (\tl1 tl2 -> tl1 ++ tl2) []
+                                      bs [(s1,[(a,s)]) | (s,tl) <- transitionTable automaton,
+                                                         (a,s1) <-  tl]
+                          in construct bs table (alphabet automaton) (initials automaton) (finals automaton)
diff --git a/FST/ReversalT.hs b/FST/ReversalT.hs
new file mode 100644
--- /dev/null
+++ b/FST/ReversalT.hs
@@ -0,0 +1,30 @@
+{-
+   **************************************************************
+   * Filename      : ReversalT.hs                               *
+   * Author        : Markus Forsberg                            *
+   *                 d97forma@dtek.chalmers.se                  *
+   * Last Modified : 7 July, 2001                               *
+   * Lines         : 30                                         *
+   **************************************************************
+-}
+
+module FST.ReversalT ( reversal  -- Reverse a transducer.
+                 ) where
+
+import FST.Transducer
+
+import Data.Array
+
+reversal :: Eq a => Transducer a -> Transducer a
+reversal transducer  = reverseTrans (rename (transitionTable transducer)
+                                           (alphabet transducer)
+                                           (finals transducer)
+                                           (initials transducer)
+                                           (firstState transducer))
+
+reverseTrans :: Eq a => Transducer a -> Transducer a
+reverseTrans transducer = let bs    = (firstState transducer, lastState transducer)
+                              table = assocs $ accumArray (\tl1 tl2 -> tl1 ++ tl2) []
+                                      bs [(s1,[(a,s)]) | (s,tl) <- transitionTable transducer,
+                                                         (a,s1) <-  tl]
+                          in construct bs table (alphabet transducer) (initials transducer) (finals transducer)
diff --git a/FST/RunTransducer.hs b/FST/RunTransducer.hs
new file mode 100644
--- /dev/null
+++ b/FST/RunTransducer.hs
@@ -0,0 +1,66 @@
+{-
+   **************************************************************
+   * Filename      : RunTransducer.hs                           *
+   * Author        : Markus Forsberg                            *
+   *                 d97forma@dtek.chalmers.se                  *
+   * Last Modified : 6 July, 2001                               *
+   * Lines         : 88                                         *
+   **************************************************************
+-}
+
+module FST.RunTransducer ( applyUp,
+                       applyDown
+                      ) where
+
+import FST.Transducer
+
+import Data.Maybe (catMaybes)
+
+type TransitionFunction a = (Transducer a -> (State,Symbol a) ->
+                                             [(Symbol a,State)])
+
+applyUp :: Eq a => Transducer a -> [a] -> Maybe [[a]]
+applyUp transducer input
+ = apply transducer transitionsD input (initial transducer) []
+
+applyDown :: Eq a => Transducer a -> [a] -> Maybe [[a]]
+applyDown transducer input
+ = apply transducer transitionsU input (initial transducer) []
+
+apply :: Eq a => Transducer a -> TransitionFunction a -> [a] -> State ->
+                 [Symbol a] -> Maybe [[a]]
+apply transducer transFun input s  result =
+ case (runEpsilon transducer transFun input s result,
+       runSymbol transducer transFun input s result) of
+   (Just xs, Just ys) -> Just $ xs ++ ys
+   (a, Nothing)       -> a
+   (Nothing, b)       -> b
+
+runEpsilon :: Eq a => Transducer a -> TransitionFunction a -> [a] -> State ->
+                 [Symbol a] -> Maybe [[a]]
+runEpsilon transducer transFun input s result =
+ case (transFun transducer (s,Eps)) of
+  [] -> Nothing
+  tl -> case (concat $ catMaybes $
+         map (\(a,s1) -> apply transducer transFun input s1 (a:result)) tl) of
+         [] -> Nothing
+         xs -> return xs
+
+runSymbol :: Eq a => Transducer a -> TransitionFunction a -> [a] -> State ->
+                 [Symbol a] -> Maybe [[a]]
+runSymbol transducer _ [] s result
+ | isFinal transducer s = return [transform result]
+ | otherwise            = Nothing
+runSymbol transducer transFun (i:input) s result =
+ case (transFun transducer (s,S i)) of
+  [] -> Nothing
+  tl -> case (concat $ catMaybes $
+         map (\(a,s1) -> apply transducer transFun input s1 (a:result)) tl) of
+         [] -> Nothing
+         xs -> return xs
+
+transform :: [Symbol a] -> [a]
+transform ys = transform' ys []
+ where transform' []         res = res
+       transform' ((S a):xs) res = transform' xs (a:res)
+       transform' ((_:xs))   res = transform' xs res
diff --git a/FST/StateMonad.hs b/FST/StateMonad.hs
new file mode 100644
--- /dev/null
+++ b/FST/StateMonad.hs
@@ -0,0 +1,46 @@
+{-
+   **************************************************************
+   * Filename      : StateMonad.hs                              *
+   * Author        : Markus Forsberg                            *
+   *                 d97forma@dtek.chalmers.se                  *
+   * Last Modified : 5 July, 2001                               *
+   * Lines         : 47                                         *
+   **************************************************************
+-}
+
+module FST.StateMonad ( STM(..),    -- type for the state monad.
+                    setState,   -- set the internal state.
+                    fetchState, -- fetch and increment the internal state.
+                    run         -- run the state monad.
+                    ) where
+
+import FST.AutomatonTypes (State)
+
+{- **********************************************************
+   * Type and instance of the State Monad                   *
+   **********************************************************
+-}
+
+newtype STM a = STM(State -> (a,State))
+
+instance Monad STM where
+ return   x       = STM(\s -> (x,s))
+ (STM m) >>=  f   = STM(\s -> let (a,s1) = m s in
+                          unSTM (f a) s1)
+
+unSTM :: STM a -> State -> (a,State)
+unSTM (STM f) = f
+
+{- **********************************************************
+   * Functions on the state monad.                          *
+   **********************************************************
+-}
+
+setState :: State -> STM ()
+setState s = STM (\_ -> ((),s))
+
+fetchState :: STM State
+fetchState = STM (\s -> (s,(s+1)))
+
+run :: STM a -> State -> a
+run stM s = let (a,_) = (unSTM stM) s in a
diff --git a/FST/Transducer.hs b/FST/Transducer.hs
new file mode 100644
--- /dev/null
+++ b/FST/Transducer.hs
@@ -0,0 +1,267 @@
+{-
+   **************************************************************
+   * Filename      : Transducer.hs                              *
+   * Author        : Markus Forsberg                            *
+   *                 d97forma@dtek.chalmers.se                  *
+   * Last Modified : 6 July, 2001                               *
+   * Lines         : 144                                        *
+   **************************************************************
+-}
+
+module FST.Transducer ( module FST.TransducerTypes,
+                    Transducer, -- data type for a transducer
+                    construct,  -- construct a transducer.
+                    TConvertable, -- type class for conversion to
+                                  -- an from a 'Transducer'.
+                    decode, -- from a transducer to an structure.
+                    encode, -- from a structure to a transducer.
+                    rename,
+                    initial,
+                    transitions,
+                    nullFirstState,
+                    productT,
+                    unionT,
+                    starT,
+                    compositionT,
+                    showTransducer
+                  ) where
+
+import FST.TransducerTypes
+import FST.Utils (tagging,remove,merge)
+
+import Data.Maybe (fromJust)
+import Data.List ((\\),nub,delete)
+
+{- **********************************************************
+   * data types for a transducer                            *
+   **********************************************************
+-}
+
+data Transducer a = Transducer {
+                                stateTrans  :: TTransitionTable a,
+                                initS       :: InitialStates,
+                                finalStates :: FinalStates,
+                                alpha       :: Sigma a,
+                                firstS      :: FirstState,
+                                lastS       :: LastState
+                               }
+ deriving (Show,Read)
+
+{- **********************************************************
+   * Instance of TransducerFunctions                        *
+   **********************************************************
+-}
+
+instance TransducerFunctions Transducer where
+ states                 = (map fst).stateTrans
+ isFinal a s            = elem s (finalStates a)
+ initials               = initS
+ finals                 = finalStates
+ transitionTable        = stateTrans
+ transitionList a s     = case (lookup s (stateTrans a)) of
+                           Just xs -> xs
+                           _       -> []
+ transitionsU auto (s,a) = map (\((_,c),s1) -> (c,s1)) $
+                        filter (\((b,_),_) -> a == b) (transitionList auto s)
+ transitionsD auto (s,a) = map (\((c,_),s1) -> (c,s1)) $
+                        filter (\((_,b),_) -> a == b) (transitionList auto s)
+ lastState              = lastS
+ firstState             = firstS
+ alphabet               = alpha
+
+initial :: Transducer a -> State
+initial = head.initials
+
+nullFirstState :: Transducer a -> Transducer a
+nullFirstState transducer = transducer {firstS = 0}
+
+transitions :: Eq a => Transducer a -> (State,Relation a) -> [State]
+transitions transducer (s,r) = map snd $ filter (\(r1,_) -> r == r1)
+                                          (transitionList transducer s)
+
+{- **********************************************************
+   * Construct a transducer                                 *
+   **********************************************************
+-}
+
+construct :: (State,State) -> TTransitionTable a -> Sigma a ->
+             InitialStates -> FinalStates -> Transducer a
+construct bs table sigma is fs = Transducer {
+                                            stateTrans  = table,
+                                            initS       = is,
+                                            finalStates = fs,
+                                            firstS      = fst bs,
+                                            lastS       = snd bs,
+                                            alpha       = sigma
+                                            }
+
+{- **********************************************************
+   * Type class TConvertable                                *
+   **********************************************************
+-}
+
+class TConvertable f where
+ encode :: Eq a => f a -> Transducer a
+ decode :: Eq a => Transducer a -> f a
+
+{- **********************************************************
+   * Convert automaton labelled with something other than   *
+   * states to an 'Automaton'.                              *
+   **********************************************************
+-}
+
+rename :: Eq b => [(b,[(Relation a,b)])] -> Sigma a -> [b] -> [b] ->
+                                          State -> Transducer a
+rename tTable sigma initS fs s
+  = let (maxS,table) = tagging (map fst tTable) s
+        nI           = map (\b  -> lookupState b table) initS
+        nfs          = map (\b -> lookupState b table) fs
+        nTrans       = renameTable tTable table
+     in construct (s,maxS) nTrans sigma nI nfs
+ where lookupState st tab = fromJust $ lookup st tab
+       renameTable [] _ = []
+       renameTable ((b,tl):tll) table
+        = let s1  = lookupState b table
+              ntl = map (\(a,b1) -> (a,lookupState b1 table)) tl
+           in (s1,ntl):renameTable tll table
+
+{- ***********************************************************
+   * Combine transducers                                     *
+   ***********************************************************
+-}
+
+renameT :: Transducer a -> Transducer a -> (Transducer a,Transducer a,State)
+renameT transducer1 transducer2 = let tr2 = rename
+                                            (transitionTable transducer2)
+                                            (alphabet transducer2)
+                                            (initials transducer2)
+                                            (finals transducer2)
+                                            (lastState transducer1 +1)
+                                    in (transducer1,tr2,lastState tr2 +1)
+
+productT :: Eq a => Transducer a -> Transducer a -> Transducer a
+productT transducer1 transducer2 = productT' $ renameT transducer1
+                                                       transducer2
+  where productT' (t1,t2,s) =
+          let transUnion  = (remove (initial t1) (transitionTable t1)) ++
+                            (remove (initial t2) (transitionTable t2))
+              transConc   = let t = (transitionList t2 (initial t2)) in
+                                     [(f,t)| f <- (finals t1)]
+              transInit   = [(s, transitionList t1 (initial t1) ++
+                            listEps t1 (transitionList t2 (initial t2)))]
+              fs  = finals t2 ++ listEps t2 (finals t1) ++
+                    if (acceptEpsilon t1 && acceptEpsilon t2)
+                     then [s] else []
+            in Transducer
+                     {
+                     stateTrans  = transInit ++ merge transConc transUnion,
+                     finalStates = fs \\ [(initial t1),(initial t2)],
+                     alpha  = nub $ alphabet t1 ++ alphabet t2,
+                     initS  = [s],
+                     firstS = firstState t1,
+                     lastS   = s
+                     }
+
+unionT :: Eq a => Transducer a -> Transducer a -> Transducer a
+unionT transducer1 transducer2 = unionT' $ renameT transducer1 transducer2
+ where unionT' (t1,t2,s) =
+        let transUnion  = (remove (initial t1) (transitionTable t1)) ++
+                        (remove (initial t2) (transitionTable t2))
+            transInit   = [(s, transitionList t1 (initial t1) ++
+                             transitionList t2 (initial t2))]
+            fs  = finals t1 ++ finals t2 ++
+                if (acceptEpsilon t1 || acceptEpsilon t2)
+                    then [s] else []
+         in Transducer
+                    {
+                     stateTrans  = transInit ++ transUnion,
+                     finalStates = fs \\ [(initial t1),(initial t2)],
+                     alpha = nub $ alphabet t1 ++ alphabet t2,
+                     initS  = [s],
+                     firstS = firstState t1,
+                     lastS   = s
+                    }
+
+starT :: Eq a => Transducer a -> Transducer a
+starT t1
+ = let s = lastState t1 +1
+       transUnion  = remove (initial t1) (transitionTable t1)
+       transLoop   = let t = transitionList t1 (initial t1) in
+                         (s,t): [(f,t) | f <- finals t1]
+    in Transducer  {
+                     stateTrans  = merge transLoop transUnion,
+                     finalStates = (s:(delete (initial t1) (finals t1))),
+                     alpha       = alphabet t1,
+                     initS       = [s],
+                     firstS      = firstState t1,
+                     lastS       = s
+                    }
+
+compositionT :: Eq a => Transducer a -> Transducer a -> Transducer a
+compositionT t1 t2 =
+      let minS1 = firstState t1
+          minS2 = firstState t2
+          name (s1,s2) = (lastState t2 - minS2 +1) *
+                         (s1 - minS1) + s2 - minS2 + minS1
+          nS = name (lastState t1,lastState t2) +1
+          transInit = (nS,[((a,d),name (s1,s2)) |
+                                         ((a,b),s1) <- ((Eps,Eps),initial t1):transitionList
+                                                    t1 (initial t1),
+                                         ((c,d),s2) <- ((Eps,Eps),initial t2):transitionList
+                                                    t2 (initial t2),
+                                         ((a,b) /= (Eps,Eps)) || ((c,d) /= (Eps,Eps)),
+                                         b == c])
+          transTable = [(name (s1,s2),[((a,d),name (s3,s4)) |  ((a,b),s3)   <- ((Eps,Eps),s1):tl1,
+                                                               ((c,d),s4)   <- ((Eps,Eps),s2):tl2,
+                                                               ((a,b) /= (Eps,Eps)) || ((c,d) /= (Eps,Eps)),
+                                                               b == c]) |
+                                              (s1,tl1) <- transitionTable t1,
+                                              (s2,tl2) <- transitionTable t2,
+                                              s1 /= initial t1 ||
+                                              s2 /= initial t2
+                                               ]
+          transUnion = transInit:transTable
+          fs  = (if (acceptEpsilon t1 && acceptEpsilon t2)
+                 then [nS] else []) ++
+                   [name (f1,f2)| f1 <- finals t1,
+                                  f2 <- finals t2]
+       in Transducer
+                           {
+                            stateTrans  = merge [(s,[]) | s <- fs] transUnion,
+                            finalStates = fs,
+                            alpha  = nub $ alphabet t1 ++ alphabet t2 ,
+                            initS  = [nS],
+                            firstS = min (firstState t1) (firstState t2),
+                            lastS  = nS
+                            }
+
+acceptEpsilon :: Transducer a -> Bool
+acceptEpsilon transducer = isFinal transducer (initial transducer)
+
+listEps :: Transducer a -> [b] -> [b]
+listEps transducer xs
+ | acceptEpsilon transducer = xs
+ | otherwise                = []
+
+{- ***********************************************************
+   * Display a transducer                                    *
+   ***********************************************************
+-}
+
+showTransducer :: Show a => Transducer a -> String
+showTransducer transducer
+  = "\n>>>> Transducer Construction <<<<" ++
+    "\n\nTransitions:\n"       ++ aux  (stateTrans transducer)     ++
+    "\nNumber of States      => " ++ show (length (transitionTable transducer)) ++
+    "\nNumber of Transitions => " ++ show (sum [length tl | (s,tl) <- transitionTable transducer]) ++
+    "\nAlphabet              => " ++ show (alphabet transducer)       ++
+    "\nInitials              => " ++ show (initials transducer)       ++
+    "\nFinals                => " ++ show (finals transducer)         ++ "\n"
+  where aux []          = []
+        aux ((s,tl):xs) = show s ++" => " ++ aux2 tl ++ "\n" ++ aux xs
+        aux2 [] = []
+        aux2 ((r,s):tl)  = "( " ++  showR r ++ " ," ++ show s ++") " ++ aux2 tl
+        showR (S a, S b) = "(" ++ show a ++":" ++ show b ++ ")"
+        showR (S a, Eps) = "(" ++ show a ++":eps)"
+        showR (Eps, S b) = "(eps:" ++ show b ++ ")"
+        showR (Eps, Eps) = "(eps:eps)"
diff --git a/FST/TransducerInterface.hs b/FST/TransducerInterface.hs
new file mode 100644
--- /dev/null
+++ b/FST/TransducerInterface.hs
@@ -0,0 +1,88 @@
+{-
+   **************************************************************
+   * Filename      : TransducerInterface.hs                     *
+   * Author        : Markus Forsberg                            *
+   *                 d97forma@dtek.chalmers.se                  *
+   * Last Modified : 6 July, 2001                               *
+   * Lines         : 85                                         *
+   **************************************************************
+-}
+
+module FST.TransducerInterface ( compile,
+                             compileN,
+                             minimize,
+                             determinize,
+                             Transducer,
+                             states,
+                             isFinal,
+                             initial,
+                             finals,
+                             transitions,
+                             transitionList,
+                             transitionsU,
+                             transitionsD,
+                             showTransducer,
+                             module FST.RRegTypes,
+                             module FST.TransducerTypes,
+                             numberOfStates,
+                             numberOfTransitions,
+                             applyUp,
+                             applyDown,
+                             load,
+                             save,
+                             emptyTransducer,
+                             parseProgram,
+                             parseExp,
+                             unionT,
+                             productT,
+                             starT,
+                             compositionT
+                           ) where
+
+import FST.Parse
+import FST.RRegTypes
+import FST.RunTransducer
+import FST.Transducer
+import FST.TransducerTypes
+import System.IO.Error (try)
+import qualified FST.DeterministicT as D
+import qualified FST.LBFT as L
+import qualified FST.MinimalTBrzozowski as M
+
+compileN :: Ord a => RReg a -> Sigma a -> Transducer a
+compileN reg sigma = L.compileToTransducer reg sigma
+
+determinize :: Ord a => Transducer a -> Transducer a
+determinize transducer = D.determinize transducer
+
+minimize :: Ord a => Transducer a -> Transducer a
+minimize transducer = M.minimize transducer
+
+compile :: Ord a => RReg a -> Sigma a -> Transducer a
+compile rreg sigma = M.minimize $ nullFirstState $ L.compileToTransducer rreg sigma
+
+numberOfStates :: Ord a => Transducer a -> Int
+numberOfStates transducer = length $ states transducer
+
+numberOfTransitions :: Ord a => Transducer a -> Int
+numberOfTransitions transducer = sum [length (transitionList transducer s) |
+                                      s <- states transducer]
+
+load :: FilePath -> IO (Either String (Transducer String))
+load file
+ = do res <- try (readFile file)
+      case res of
+       Right str -> return $ Right (read str)
+       Left  _   -> return $ Left $
+                             "\nError:\tUnable to open \"" ++ file ++"\".\n"
+
+save :: FilePath -> Transducer String -> IO (Either String ())
+save file auto
+ = do res <- try (writeFile file $ show auto)
+      case res of
+       Right _ -> return $ Right ()
+       Left  _   -> return $ Left $
+                             "\nError:\tUnable to save to \"" ++ file ++"\".\n"
+
+emptyTransducer :: Ord a => Transducer a
+emptyTransducer = compile EmptyR []
diff --git a/FST/TransducerTypes.hs b/FST/TransducerTypes.hs
new file mode 100644
--- /dev/null
+++ b/FST/TransducerTypes.hs
@@ -0,0 +1,74 @@
+{-
+   **************************************************************
+   * Filename      : TransducerTypes.hs                         *
+   * Author        : Markus Forsberg                            *
+   *                 d97forma@dtek.chalmers.se                  *
+   * Last Modified : 6 July, 2001                               *
+   * Lines         : 75                                         *
+   **************************************************************
+-}
+
+module FST.TransducerTypes ( State,
+                         FinalStates,
+                         FirstState,
+                         LastState,
+                         Sigma,
+                         Relation,
+                         Upper,
+                         Lower,
+                         Symbol (..),
+                         TTransitions,
+                         TTransitionTable,
+                         InitialStates,
+                         TransducerFunctions,
+                         states,
+                         isFinal,
+                         initials,
+                         finals,
+                         transitionTable,
+                         transitionList,
+                         transitionsU,
+                         transitionsD,
+                         firstState,
+                         lastState,
+                         alphabet
+                       ) where
+
+import FST.AutomatonTypes (State,FinalStates,Sigma,FirstState,LastState,
+                       InitialStates)
+
+{- **********************************************************
+   * Transducer types                                       *
+   **********************************************************
+-}
+
+type Relation a = (Upper a, Lower a)
+type Upper a = Symbol a
+type Lower a = Symbol a
+
+data Symbol a
+ =    S a   |
+      Eps
+    deriving (Show,Read,Eq)
+
+type TTransitions a = [(Relation a,State)]
+
+type TTransitionTable a = [(State,[(Relation a,State)])]
+
+{- **********************************************************
+   * Class of TransducerFunctions                           *
+   **********************************************************
+-}
+
+class TransducerFunctions f where
+ states         :: f a -> [State]
+ isFinal        :: f a -> State -> Bool
+ initials       :: f a -> InitialStates
+ finals         :: f a -> FinalStates
+ transitionTable :: f a -> TTransitionTable a
+ transitionList :: f a -> State -> TTransitions a
+ transitionsU    :: Eq a => f a -> (State, Symbol a) -> [(Symbol a, State)]
+ transitionsD    :: Eq a => f a -> (State, Symbol a) -> [(Symbol a, State)]
+ firstState     :: f a -> State
+ lastState      :: f a -> State
+ alphabet       :: f a -> Sigma a
diff --git a/FST/Utils.hs b/FST/Utils.hs
new file mode 100644
--- /dev/null
+++ b/FST/Utils.hs
@@ -0,0 +1,65 @@
+{-
+   **************************************************************
+   * Filename      : Utils.hs                                   *
+   * Author        : Markus Forsberg                            *
+   *                 d97forma@dtek.chalmers.se                  *
+   * Last Modified : 22 July, 2001                              *
+   * Lines         : 66                                         *
+   **************************************************************
+-}
+
+module FST.Utils (
+           cross, -- cross product of two lists.
+           insert,
+           merge,
+           remove,
+           tagging
+           ) where
+
+{- **********************************************************
+   * cross: cartesian product of two lists.                 *
+   **********************************************************
+-}
+
+{-# SPECIALIZE cross :: [Int] -> [Int] -> [(Int,Int)] #-}
+
+cross :: [a] -> [b] -> [(a,b)]
+cross as bs = [(a,b) | a <- as, b <- bs]
+
+{- **********************************************************
+   * insert, merge, remove: aux. functions for transition   *
+   * tables.                                                *
+   **********************************************************
+-}
+
+{-# SPECIALIZE insert :: (Int,[(String,Int)]) -> [(Int,[(String,Int)])] -> [(Int,[(String,Int)])] #-}
+
+insert :: Eq b => (b,[(a,b)]) -> [(b,[(a,b)])] -> [(b,[(a,b)])]
+insert (s,t1) [] = [(s,t1)]
+insert (s,t1) ((s1,t2):xs)
+ | s == s1    = (s1, t1++t2):xs
+ | otherwise  = (s1,t2):insert (s,t1) xs
+
+{-# SPECIALIZE merge :: [(Int,[(String,Int)])] -> [(Int,[(String,Int)])] -> [(Int,[(String,Int)])] #-}
+
+merge :: Eq b => [(b,[(a,b)])] -> [(b,[(a,b)])] -> [(b,[(a,b)])]
+merge [] table2 = table2
+merge (a:table1) table2 = merge table1 (insert a table2)
+
+{-# SPECIALIZE remove :: Int -> [(Int,[(String,Int)])] -> [(Int,[(String,Int)])] #-}
+
+remove :: Eq b => b -> [(b,[(a,b)])] -> [(b,[(a,b)])]
+remove _ [] = []
+remove s ((s1,tl):xs)
+  | s == s1 = xs
+  | otherwise = (s1,tl):remove s xs
+
+{- **********************************************************
+   * tagging: Tag a list of polymorphic type with integers. *
+   **********************************************************
+-}
+
+tagging :: [a] -> Int -> (Int,[(a,Int)])
+tagging xs s            = tag xs s []
+ where tag    []  s1 ys = ((s1-1),ys)
+       tag (a:zs) s1 ys = tag zs (s1+1) ((a,s1):ys)
diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,28 @@
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+
+1. Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright
+   notice, this list of conditions and the following disclaimer in the
+   documentation and/or other materials provided with the distribution.
+
+3. Neither the name of the author nor the names of his contributors
+   may be used to endorse or promote products derived from this software
+   without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR
+IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
diff --git a/Setup.hs b/Setup.hs
new file mode 100644
--- /dev/null
+++ b/Setup.hs
@@ -0,0 +1,5 @@
+#!/usr/bin/runhaskell
+
+import Distribution.Simple
+
+main = defaultMainWithHooks defaultUserHooks
diff --git a/doc/Interface0.9.ps b/doc/Interface0.9.ps
new file mode 100644
--- /dev/null
+++ b/doc/Interface0.9.ps
@@ -0,0 +1,655 @@
+%!PS-Adobe-2.0
+%%Creator: dvips(k) 5.86 Copyright 1999 Radical Eye Software
+%%Title: Interface0.9.dvi
+%%Pages: 3
+%%PageOrder: Ascend
+%%BoundingBox: 0 0 596 842
+%%EndComments
+%DVIPSWebPage: (www.radicaleye.com)
+%DVIPSCommandLine: dvips -f Interface0.9.dvi
+%DVIPSParameters: dpi=600, compressed
+%DVIPSSource:  TeX output 2001.10.01:1124
+%%BeginProcSet: texc.pro
+%!
+/TeXDict 300 dict def TeXDict begin/N{def}def/B{bind def}N/S{exch}N/X{S
+N}B/A{dup}B/TR{translate}N/isls false N/vsize 11 72 mul N/hsize 8.5 72
+mul N/landplus90{false}def/@rigin{isls{[0 landplus90{1 -1}{-1 1}ifelse 0
+0 0]concat}if 72 Resolution div 72 VResolution div neg scale isls{
+landplus90{VResolution 72 div vsize mul 0 exch}{Resolution -72 div hsize
+mul 0}ifelse TR}if Resolution VResolution vsize -72 div 1 add mul TR[
+matrix currentmatrix{A A round sub abs 0.00001 lt{round}if}forall round
+exch round exch]setmatrix}N/@landscape{/isls true N}B/@manualfeed{
+statusdict/manualfeed true put}B/@copies{/#copies X}B/FMat[1 0 0 -1 0 0]
+N/FBB[0 0 0 0]N/nn 0 N/IEn 0 N/ctr 0 N/df-tail{/nn 8 dict N nn begin
+/FontType 3 N/FontMatrix fntrx N/FontBBox FBB N string/base X array
+/BitMaps X/BuildChar{CharBuilder}N/Encoding IEn N end A{/foo setfont}2
+array copy cvx N load 0 nn put/ctr 0 N[}B/sf 0 N/df{/sf 1 N/fntrx FMat N
+df-tail}B/dfs{div/sf X/fntrx[sf 0 0 sf neg 0 0]N df-tail}B/E{pop nn A
+definefont setfont}B/Cw{Cd A length 5 sub get}B/Ch{Cd A length 4 sub get
+}B/Cx{128 Cd A length 3 sub get sub}B/Cy{Cd A length 2 sub get 127 sub}
+B/Cdx{Cd A length 1 sub get}B/Ci{Cd A type/stringtype ne{ctr get/ctr ctr
+1 add N}if}B/id 0 N/rw 0 N/rc 0 N/gp 0 N/cp 0 N/G 0 N/CharBuilder{save 3
+1 roll S A/base get 2 index get S/BitMaps get S get/Cd X pop/ctr 0 N Cdx
+0 Cx Cy Ch sub Cx Cw add Cy setcachedevice Cw Ch true[1 0 0 -1 -.1 Cx
+sub Cy .1 sub]/id Ci N/rw Cw 7 add 8 idiv string N/rc 0 N/gp 0 N/cp 0 N{
+rc 0 ne{rc 1 sub/rc X rw}{G}ifelse}imagemask restore}B/G{{id gp get/gp
+gp 1 add N A 18 mod S 18 idiv pl S get exec}loop}B/adv{cp add/cp X}B
+/chg{rw cp id gp 4 index getinterval putinterval A gp add/gp X adv}B/nd{
+/cp 0 N rw exit}B/lsh{rw cp 2 copy get A 0 eq{pop 1}{A 255 eq{pop 254}{
+A A add 255 and S 1 and or}ifelse}ifelse put 1 adv}B/rsh{rw cp 2 copy
+get A 0 eq{pop 128}{A 255 eq{pop 127}{A 2 idiv S 128 and or}ifelse}
+ifelse put 1 adv}B/clr{rw cp 2 index string putinterval adv}B/set{rw cp
+fillstr 0 4 index getinterval putinterval adv}B/fillstr 18 string 0 1 17
+{2 copy 255 put pop}for N/pl[{adv 1 chg}{adv 1 chg nd}{1 add chg}{1 add
+chg nd}{adv lsh}{adv lsh nd}{adv rsh}{adv rsh nd}{1 add adv}{/rc X nd}{
+1 add set}{1 add clr}{adv 2 chg}{adv 2 chg nd}{pop nd}]A{bind pop}
+forall N/D{/cc X A type/stringtype ne{]}if nn/base get cc ctr put nn
+/BitMaps get S ctr S sf 1 ne{A A length 1 sub A 2 index S get sf div put
+}if put/ctr ctr 1 add N}B/I{cc 1 add D}B/bop{userdict/bop-hook known{
+bop-hook}if/SI save N @rigin 0 0 moveto/V matrix currentmatrix A 1 get A
+mul exch 0 get A mul add .99 lt{/QV}{/RV}ifelse load def pop pop}N/eop{
+SI restore userdict/eop-hook known{eop-hook}if showpage}N/@start{
+userdict/start-hook known{start-hook}if pop/VResolution X/Resolution X
+1000 div/DVImag X/IEn 256 array N 2 string 0 1 255{IEn S A 360 add 36 4
+index cvrs cvn put}for pop 65781.76 div/vsize X 65781.76 div/hsize X}N
+/p{show}N/RMat[1 0 0 -1 0 0]N/BDot 260 string N/Rx 0 N/Ry 0 N/V{}B/RV/v{
+/Ry X/Rx X V}B statusdict begin/product where{pop false[(Display)(NeXT)
+(LaserWriter 16/600)]{A length product length le{A length product exch 0
+exch getinterval eq{pop true exit}if}{pop}ifelse}forall}{false}ifelse
+end{{gsave TR -.1 .1 TR 1 1 scale Rx Ry false RMat{BDot}imagemask
+grestore}}{{gsave TR -.1 .1 TR Rx Ry scale 1 1 false RMat{BDot}
+imagemask grestore}}ifelse B/QV{gsave newpath transform round exch round
+exch itransform moveto Rx 0 rlineto 0 Ry neg rlineto Rx neg 0 rlineto
+fill grestore}B/a{moveto}B/delta 0 N/tail{A/delta X 0 rmoveto}B/M{S p
+delta add tail}B/b{S p tail}B/c{-4 M}B/d{-3 M}B/e{-2 M}B/f{-1 M}B/g{0 M}
+B/h{1 M}B/i{2 M}B/j{3 M}B/k{4 M}B/w{0 rmoveto}B/l{p -4 w}B/m{p -3 w}B/n{
+p -2 w}B/o{p -1 w}B/q{p 1 w}B/r{p 2 w}B/s{p 3 w}B/t{p 4 w}B/x{0 S
+rmoveto}B/y{3 2 roll p a}B/bos{/SS save N}B/eos{SS restore}B end
+
+%%EndProcSet
+TeXDict begin 39158280 55380996 1000 600 600 (Interface0.9.dvi)
+@start
+%DVIPSBitmapFont: Fa cmtt10 10.95 52
+/Fa 52 125 df<EB07C0EB1FF0497E497E13FF803801FC7EEBF83EEBF03F00037F13E0A5
+5CA2143E91387E1FFF9026F0FE3F1380000113FC13F1EBF3F89026F7F01F130001FFEB07
+C06C13E0ECC00F02805BEC001F4892C7FC5B00035C486C133E5A48EB807ED83FCF137C90
+388FC0FCD87F075B007E13E101035B00FE13F338FC01FB6DB45AA26E5A023F1307923880
+0F80A26CEB7FC0007E9038FFE01FD87F0113F001879038FC3F00263FFFF9B5FC6C01F15B
+14E06C9038C03FFC6C9038001FF8D800F8EB03E0293A7DB830>38
+D<EA03C0EA0FF0A2EA1FF813FCA2EA0FFEA21203EA007EA513FE13FCA2120113F81203EA
+07F0120FEA1FE0EA7FC012FF13801300127C12380F1D70B730>I<141E147F14FF5BEB03
+FEEB07F8EB0FF0EB1FE0EB3FC0EB7F80EBFF005B485A485A5B12075B120F5B121F5B123F
+90C7FCA25A127EA412FE5AAB7E127EA4127F7EA27F121F7F120F7F12077F12037F6C7E6C
+7E7FEB7F80EB3FC0EB1FE0EB0FF0EB07F8EB03FEEB01FF7F147F141E184771BE30>I<12
+7812FE7E7F6C7EEA1FE06C7E6C7E6C7E6C7E6C7E7FEB3F80EB1FC0130F14E0130714F013
+0314F8130114FC1300A214FE147EA4147F143FAB147F147EA414FE14FCA2130114F81303
+14F0130714E0130F14C0131FEB3F80EB7F005B485A485A485A485A485AEA7FC0485A90C7
+FC5A1278184778BE30>I<14E0497EA70030EC0180007CEC07C000FFEC1FE00181133F01
+E113FF267FF9F313C0261FFDF713000007B512FC000114F06C5C013F1380D90FFEC7FC90
+383FFF8090B512E04880000714FC391FFDF7FF267FF9F313C026FFE1F013E00181133F01
+01131F007CEC07C00030EC0180000091C7FCA76D5A23277AAE30>I<EA07C0EA0FF0EA1F
+F8123F13FCA213FEA2121F120F1207EA007E13FE13FC1201A2EA07F8EA0FF0123FEAFFE0
+13C01380EA7E0012380F18708A30>44 D<003FB612E04815F0B712F8A36C15F06C15E025
+077B9E30>I<120EEA3F80EA7FC0EAFFE0A5EA7FC0EA3F80EA0E000B0B6E8A30>I<120EEA
+3F80EA7FC0EAFFE0A5EA7FC0EA3F80EA0E00C7FCB1120EEA3F80EA7FC0EAFFE0A5EA7FC0
+EA3F80EA0E000B276EA630>58 D<16E0ED01F0ED07F8150F153FEDFFF04A13E0020713C0
+4A1300EC3FFEEC7FF8903801FFE0495B010F90C7FC495AEB7FF8495A000313C0485BD81F
+FEC8FC485AEA7FF0485A138013E06C7EEA3FFC6C7E3807FF806C7FC613F06D7EEB1FFE6D
+7E010313C06D7F9038007FF8EC3FFEEC0FFF6E13C0020113E06E13F0ED3FF8150F1507ED
+01F0ED00E0252F7BB230>60 D<003FB612FE4881B81280A36C16006C5DCBFCA7003FB612
+FE4881B81280A36C16006C5D29157DA530>I<1238127CB4FC7F13E0EA7FF86C7E6CB4FC
+00077F6C13E0C67FEB3FFC6D7E903807FF806D7F010013F06E7EEC1FFE6E7E020313C06E
+13E09138007FF0ED3FF8150F153FED7FF0913801FFE04A13C0020F13004A5AEC7FF84A5A
+010313C0495BD91FFEC7FC495AEBFFF000035B481380001F90C8FCEA3FFC485AEAFFE013
+8090C9FC127C1238252F7BB230>I<007FB512F0B612FE6F7E82826C813A03F0001FF815
+076F7E1501150082167EA516FE5E15015E15074B5AED7FE090B65A5E4BC7FC6F7E16E082
+9039F0000FF8ED03FCED00FE167E167F82A2EE1F80A6163F17005EA2ED01FE1503ED0FFC
+007FB65AB7FC16E05E93C7FC6C14FC29387EB730>66 D<007FB512E015FCB67E6F7E6C81
+823A03F0007FF0ED1FF815076F7E6F7E1500167FA2EE3F80A2161F17C0A2160FA317E016
+07AB160F17C0A3161F1780163FA2EE7F00A216FE15014B5A1507ED1FF8ED7FF0007FB65A
+5EB75A93C7FC6C14FC15E02B387FB730>68 D<007FB612FEB8FCA47ED803F0C7123FA816
+1E93C7FCA4157815FCA490B5FCA6EBF000A4157892C8FCA5EE0780EE0FC0A9007FB7FCB8
+FCA46C16802A387DB730>I<007FB7128017C0B8FCA27EA2D801F8C7120FA8EE078093C7
+FCA5151E153FA490B6FCA69038F8003FA4151E92C8FCAE387FFFF080B5FCA27E5C2A387E
+B730>I<007FB512FEB7FCA46C14FE390007E000B3B3A8007FB512FEB7FCA46C14FE2038
+78B730>73 D<D87FF0EC7FF06D14FF00FF16F86D5B007F16F0A2D807DE903803DF00A301
+DF130701CF149FA2EC800FA201C7141FECC01FA201C3131EECE03EA201C1133CECF07CA3
+9038C0F8F8A3EC78F0147DA2EC3DE0143FA2EC1FC0A2EC0F80EC070091C7FCADD87FFC90
+3801FFF0A2486C4913F8A26C486D13F0A22D387FB730>77 D<D87FF890381FFFC0486C49
+13E0A27FA26C6C6D13C0D803EF903800F800A28013E7A28013E380A213E180A213E080A2
+147CA380A2141E141FA2801580A2EC07C0A3EC03E0A2140115F0A2140015F8A21578157C
+153CA2153E151EA2D87FFF131FB5EA800FA21507A26C496C5A2B387EB730>I<90383FFF
+E048B512FC000714FF4815804815C04815E09038F0007F01C0131F4848EB0FF090C71207
+A2007E1403A300FE15F8481401B3A96C1403A2007E15F0A3007F1407A26D130F6C6CEB1F
+E001F813FF90B6FC6C15C06C15806C1500000114FCD8003F13E0253A7BB830>I<007FB5
+12E0B612FC15FF16C016E06C15F03903F0003FED0FF8ED03FC1501ED00FEA2167E167F16
+3FA6167F167E16FEA2ED01FC1503ED0FF8ED3FF090B6FC16E016C0160015FC15E001F0C8
+FCB0387FFF80B57EA46C5B28387DB730>I<007FB5FCB612E015F815FE816C812603F001
+7F6E6C7E151F6F7E15071503821501A515035E1507150F4B5A157F4A485A90B65A93C7FC
+5D5D8181D9F0017FEC007FED1FC0150F821507A917F0EEE1F8A316F13A7FFF8003F3B500
+C0EBFFF0A26F13E0816C49EB7FC0C9EA1F002D397EB730>82 D<90390FF801C090397FFF
+03E048B512C34814F74814FF5A381FF007383FE001903880007F48C7123F007E141F12FE
+48140FA21507A46CEC03C0007E91C7FC127F6C7E13E0EA1FF86CB47E6C13F86CEBFF806C
+14F0D8003F13FC01077F9038007FFF020713809138007FC0153FED0FE0ED07F01503A216
+F80078140112FCA56C140316F06C14077F6DEB0FE001F0EB3FC001FE13FF90B612801600
+00FD5CD8F87F13F8011F13E0D870011380253A7BB830>I<007FB712C0B812E0A53AFC00
+1F8007A80078ED03C0C791C7FCB3B1010FB5FC4980A46D91C7FC2B387EB730>I<3B7FFF
+800FFFF0B56C4813F8A46C496C13F0D803F0C7EA7E00B3B16D14FE00015DA26D1301A26C
+6C495AA2017F495A90393FC01FE0ECF07F6DB55A6D5C6D91C7FC6D5B010013F8EC1FC02D
+397FB730>I<007FB5FCB61280A4150000FCC8FCB3B3B3A5B6FC1580A46C140019476DBE
+30>91 D<007FB5FCB61280A47EC7121FB3B3B3A5007FB5FCB6FCA46C140019477DBE30>
+93 D<EB3FF03801FFFE0007EBFFC04880488048809038C00FFCEC03FE1400157F6C487F
+0006C77FC8121FA4EC1FFF0103B5FC133F90B6FC1203000FEBFC1F381FFE00EA3FF013C0
+48C7FC12FE5AA4153F7E007F14FF6D5A263FE00FEBFF806CB712C0A26C14EF6C14870001
+D9FC00138026003FE090C7FC2A2A7BA830>97 D<EA7FF87F12FFA2127FA21200AAEC03F8
+EC1FFF027F13C091B57E90B612F8A29138F80FFC9138E003FE4AC67E4A7F91C7EA3F8049
+141F17C049140FA217E0A21607A7160FA26D15C0161FA26DEC3F80167F6EEBFF006E485A
+ECE0039138F80FFC91B55A01FD5C01FC5C6E13809026781FFEC7FC90380007F02B397FB7
+30>I<49B47E010F13F0013F13FC497F48B6FC4815803907FE007F13F8485A485A49EB3F
+004848130C90C9FC5A127EA212FE5AA87E127EA2127FED07806C6CEB0FC07F6C6C131F6C
+6C148001FC133F6CB4EBFF006C90B5FC6C5C6C5C013F13F0010F13C0D901FEC7FC222A79
+A830>I<913803FFC0825CA280A2EC0007AAEB01FC90380FFF87013F13E790B512F74814
+FF5A3807FE03380FF80049137F4848133F4848131F49130F48C7FC1507127E12FEA25AA7
+7E150F127EA2007F141F7E6D133F6C6C137F6D13FF380FF8012607FE07EBFFC06CB7FC6C
+02F713E06C14E76D01C713C0011F1303D903F8C8FC2B397DB730>I<EB01FE90380FFFC0
+013F13F090B57E488048803907FE01FFD9F80013804848133F4848EB1FC049130F484814
+E090C712075A127E16F000FE14035AB7FCA516E000FCC9FC7E127E127FA26C6CEB01E06D
+EB03F0121F01F013076C6CEB0FE0D807FE131F3A03FF807FC06C90B512806C15006D5B01
+1F5B010713F0010090C7FC242A7BA830>I<157F913803FFE0020F13F0143F4A13F8A2EC
+FF07EB01FE9138FC03F0903903F800C04A1300A8007FB612C0B712E0A46C15C0260003F0
+C7FCB3A9003FB6FCA2481580A26C1500A225397DB830>I<D903FC137F903A0FFF03FFC0
+013F13CF90B712E05A5AD9FE07EB07C03B07F801FE0380D9F00090C7FC4848137F497F00
+1F8149131FA66D133F000F92C7FC6D5B6C6C13FEEBF8013903FE07FC90B55A5A5D4814C0
+018F90C8FCEB83FC0180C9FCA27F12077F6CB512F015FF4815E0488148813A3FC0000FFC
+49EB00FE007EC8127F007C8100FC81178048150FA46C151F007EED3F00007F5D6C6C14FE
+01E01303D81FFEEB3FFC6CB65A6C5D000115C06C6C91C7FC011F13FC010113C02B3E7DA7
+30>I<EA7FF87F12FFA2127FA21200AAEC03F8EC1FFF027F7F91B57E01FD8090B6FC9138
+F80FF0ECE0074A6C7E1480EC0001A25BA25BB3A23B7FFFF83FFFF05DB500FC14F8A26C01
+F814F0812D387FB730>I<EB01C0EB07F0A2497EA36D5AA2EB01C090C9FCA9383FFFF048
+7FA47EEA0001B3A9007FB6128016C0B7FCA27E1680223979B830>I<EA7FF0487EA4127F
+1200AB0203B512805C17C0A21780809139001FC0004B5A03FFC7FC4A5A4A5A4A5AEC0FE0
+4A5A4A5A4AC8FC5C01F97F01FB7F90B57E14E7ECC3F0EC81F8EC00FC5B49137E497F6F7E
+A26F7E6F7E6F7EA23B7FFFF01FFFE0B56C5A17F0A217E06C497E2C387EB730>107
+D<387FFFF0B57EA47EEA0001B3B3A8007FB612E0B712F0A46C15E024387AB730>I<9039
+01F001F03A7F8FFC0FFC3AFFDFFE1FFE90B5487E92B51280A23A7FFE1FFE1F3B07FC0FFC
+0FC001F813F89039F007F00701E013E0A401C013C0B3A23B7FFC1FFC1FFC3BFFFE3FFE3F
+FEA43B7FFC1FFC1FFC2F2880A730>I<EC03F8397FF81FFFD9FC7F7F00FF90B57E01FD80
+6CB6FC9138F80FF0C6EBE0074A6C7E1480EC0001A25BA25BB3A23B7FFFF83FFFF05DB500
+FC14F8A26C01F814F0812D287FA730>I<EB01FC90380FFF80013F13E090B512F8488048
+803907FE03FF260FF800138049137FD81FC0EB1FC0A24848EB0FE090C712074815F0007E
+1403A200FE15F8481401A86C1403007E15F0A2007F1407A26C6CEB0FE06D131F6C6CEB3F
+C06D137F6C6CEBFF802607FE0313006CB55A6C5C6C5C013F13E0010F1380D903FEC7FC25
+2A7BA830>I<EC03F8397FF81FFFD9FC7F13C000FF90B57E90B612F87E9138F80FFCC690
+38E003FE4AC67E4A7F91C7EA3F8049141F17C049140FA217E0A21607A7160FA26D15C016
+1FA26DEC3F80167F6EEBFF006E485AECE0039138F80FFC91B55A01FD5C01FC5C6E1380DA
+1FFEC7FCEC07F091C9FCAD387FFFF8A2B57EA26C5BA22B3C7FA730>I<ED0FF0D87FFFEB
+7FFEB50081B5FC1487028F1480149F6C9038BFF07F39001FFFC09238003F004A130C4A90
+C7FC5C5C5CA25CA45CAF007FB512FCB6FC81A25D7E29287DA730>114
+D<90381FFC0E90B5129F000714FF5A5A5A387FE007EB800100FEC77E5A81A37E007F141E
+01C090C7FCEA3FF8381FFFE06C13FF000314C0C614F0010F13FC9038007FFEEC03FFEC00
+7F0078EC3F8000FC141FED0FC0A27EA27E151F01C0EB3F806D137F9039F803FF0090B6FC
+5D5D00F814F0013F13C0267007FEC7FC222A79A830>I<EB0780497EAA007FB612E0B712
+F0A46C15E026000FC0C7FCB2167816FCA5ECE001ED03F8903807F0079138FC0FF06DB512
+E07F16C06D1400EC3FFCEC07F026337EB130>I<D87FF8EBFFF06D8000FF5BA2007F7FA2
+00001401B3A41503A21507150F6D131F903A7F807FFFF091B6FC6D15F8A26D01F913F001
+0713E0010090C8FC2D287FA630>I<3B7FFF803FFFC0B56C4813E0A46C496C13C03B01F0
+0001F000A26D130300005DA2017C495AA36D495AA36D49C7FCA390380F803EA36D6C5AA2
+ECE0FC01035BA214F101015BA214FB01005BA214FF6E5AA3021FC8FC2B277EA630>I<3B
+7FFF800FFFF06E5AB515F8A26C16F04A7ED807C0C7EA1F00A26D5C0003153EA56D147E00
+01157CEC0FC0EC1FE0EC3FF0A32600F87F5BEC7DF8147CA214FC01786D5AA290387CF87C
+137D157D14F0013DEB3DE0013F133FA2ECE01FA2011F5C6D486C5A2D277FA630>I<263F
+FFC0B5FC48168014E1A214C06C16003A007E001F806D49C7FCEB1F80157E6D6C5A6D6C5A
+EB03F1903801F3F0ECFFE06D5B147F6E5A92C8FCA2814A7E4A7EEB01F3ECF1F0903803E0
+F849487E010F137C49487EEC003F496D7E017E6D7E4913073B7FFF803FFF806E4813C0B5
+FCA27E4A6C13802A277EA630>I<3B7FFF803FFFC06E4813E0B5FCA27E4A6C13C03B01F8
+0001F000120015036D5C137C4B5A7FA2013F495A7FA26E48C7FC130F14C00107133EA214
+E001035BA2EB01F05DA2EB00F85D1479147D5D143FA26E5AA36E5AA2141F92C8FCA25C14
+3EA2147E147C120F486C5AEA3FC113C3EB07F0495A13FF6C5B5C6C90C9FCEA07FCEA01F0
+2B3C7EA630>I<003FB612FC4815FEA416FC007EC7EA07F8ED0FF0ED1FE0ED3FC0ED7F80
+003CECFF00C7485AEC07FC4A5A4A5A4A5A4A5A4A5A4990C7FC495A495A495A495A495A49
+5A49C7121E4848143F485A485A485A485A485A48B7FCB8FCA46C15FE28277DA630>I<12
+38127C12FEB3B3B3AD127C123807476CBE30>124 D E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fb cmbx12 12 29
+/Fb 29 121 df<EA0780EA1FE0EA3FF0EA7FF8A2EAFFFCA4EA7FF8A2EA3FF0EA1FE0EA07
+800E0E788D1F>46 D<EC3FF849B5FC010F14E090393FF01FF890397FC007FC49486C7E48
+496C7E48486D13804848EC7FC0A24848EC3FE0A2001F16F0A2003F16F849141FA2007F16
+FCA600FF16FEB3A3007F16FCA5003F16F86D143FA2001F16F0A2000F16E06D147F000716
+C0A26C6CECFF806C6C4913006C6D485A6D6C485A90393FF01FF8010FB512E00103148090
+26003FF8C7FC2F427CC038>48 D<EC03C01407141F147FEB03FF133FB6FCA313C3EA0003
+B3B3AFB712FCA4264177C038>I<ECFFE0010F13FE013FEBFFC090B612F02603FE017F3A
+07F0007FFCD80FC0EB1FFF48486D138048C77E6F13C0D87FC015E06D7F486C15F06D7F17
+F8A46C5AA26C5A6C5AC913F0A25D17E0A24B13C017805D17004B5A4B5A5EED3FE04B5A4B
+5A93C7FCEC01FC4A5A4A5AEC0FC04A5A4AC71278147C5C494814F8494814F0495A49C8FC
+131E49140149140390B7FC4816E05A5A5A5A5A5AB812C0A42D417BC038>I<ECFFF00107
+13FF011F14C0D97F8013F09039FC001FF8D801F06D7ED803C080486C6D7ED80FF815807F
+6D15C0487EA56C5A17806C5A6C485BC814005E151F5E4B5A5EED7FC04A485ADA0FFEC7FC
+903807FFF85D15FF90C713C0ED1FF0ED0FFC6F7E826F138017C017E08117F0A217F8A2EA
+0FC0EA3FF0487EA2487EA217F0A3494913E0127F4915C06C4849138090C71400D81FC05B
+D80FF0EB1FFCD803FFEBFFF86C90B55A6C6C14C0011F49C7FC010113E02D427BC038>I<
+161F5EA25E5E5DA25D5D5D5DA25D5D92B5FCEC01F715E7EC03C7EC0787140FEC1F07141E
+143C147814F8EB01F014E0EB03C0EB0780130FEB1F00131E5B5B13F85B485A485A485A12
+0F90C7FC121E5A127C5AB91280A4C8000F90C7FCAC027FB61280A431417DC038>I<0003
+1503D807E0143F01FFEB07FF91B55A5E5E5E5E5E93C7FC5D15F815E04AC8FC01C0C9FCAA
+EC3FF001C1B5FC01C714C09039DFC03FF09039FE000FF801F86D7E496D7E496D7E491580
+6C4815C0C8FC6F13E0A217F0A317F8A21206EA1FC0487E487E12FF7FA217F05BA24915E0
+6C485B5B003CC714C0003E4A1380001E16006C6C495A6C6C495AD803F0EB3FF8D801FEEB
+FFF06CB65A013F1480010F01FCC7FC010113C02D427BC038>I<DCFFF81430031F01FF14
+704AB638E001F00207EDF803023F9039E003FE074A48C7EA7F0F902601FFF0EC1F9F4901
+C0EC07FF010F90C87E494815004948167F495A4948163F4849161F4A160F5A48491607A2
+4890CAFC481803A25B003F1801A3127F4994C7FCA312FFAC127FA37F003F19F0A3121F7F
+19016C19E06C7F19036C6D17C06C18076E17806C6DEE0F006D6C5E6D6C161E6D6C167C6D
+6C5E010301C0EC03F06D01F04A5A9026007FFEEC3F8091283FFFE001FFC7FC020790B512
+FC020115F0DA001F1480030001F8C8FC44467AC451>67 D<B712E0A4D8001F90C7FCB3B3
+B3A6B712E0A423447DC32A>73 D<B9FC18F018FE727ED8001F90C7001F13E005017F716C
+7E727E727E85721380A27213C0A31AE0A81AC0A34E1380A24E1300614E5AF0FFF84D5B05
+1F13C092B7C7FC18FC18C092CBFCB3A9B712E0A443447DC34D>80
+D<B812F8EFFFC018F818FED8001F90C7383FFF80050713E005017F716C7E727E85727EA2
+727FA286A762A26097C7FC61183F614E5A943801FFE005075B057F90C8FC92B612F818C0
+8492C713F8EF3FFCEF0FFF717F717F8583858385A785A61B0FA2727EA2063F141E857214
+3CB700E06D138072EBE0F80601EBFFF0DE003F13E0CC0003130050457DC354>82
+D<003FBA12E0A49026FE000FEB800301F0EE007FD87FC0EF1FF049170F90C71607007E18
+03007C1801A300781800A400F819F8481978A5C81700B3B3A40107B8FCA445437CC24E>
+84 D<903801FFE0011F13FE017F6D7E9039FF007FE0D801F0EB1FF0D803FC6D7E486C6D
+7E000F816D6D7EA283816C4881A26C5AEA00F090C7FCA4150F021FB5FC0103B6FC011F13
+8190387FF8013801FFC0481300485A485A485A485A127FA2485AA35DA36C6C1306150E6C
+6C4913F06C6C9039387FFFC0390FFF81F000039038FFE01FC6EC8007D90FFEC9FC322F7D
+AD36>97 D<EC3FFC49B512C0010F14F090391FF007F890397FC0007C9039FF8001FE4849
+487E4848158048485B120FA2485A003F6E1300A26F5A4848EB007893C7FCA312FFAA127F
+A37F123FEE03C0121F6DEC0780120F6C6CEC0F0012036C6C141E6C6D5BD97FE013F89039
+3FF807F0010FB512C0010391C7FC9038003FF82A2F7CAD32>99 D<EE03FEED07FFA4ED00
+1F160FB2EC3FF0903801FFFE010FEBFF8F90393FF80FEF90397FC001FF9039FF80007F48
+90C7123F4848141F4848140F120F485AA2123FA2485AA412FFAA127FA4123F7F121FA26C
+7E0007151F6D143F0003157F6C6C91B5FC28007FC003EF13FC90393FF01FCF010FB5120F
+010313FC9026007FE0EBF80036467CC43E>I<EC3FF849B5FC010F14C090393FF01FF090
+397FC007F849486C7E48496C7E48486D7E48481580000F157F484815C0163F003F16E0A2
+5B127FEE1FF0A212FFA390B7FCA301F0C9FCA5127FA36C7EA2001F16F0A26C7EEE01E06C
+6C14030003ED07C06C6CEC0F806C6DEB1F00D97FE0137E90391FF803FC0107B512F00100
+14C0DA1FFCC7FC2C2F7DAD33>I<4AB4FC021F13C0027F13F0903901FF83F8903903FE07
+FC90380FFC0F90391FF81FFEA2EB3FF0137F14E0ED0FFC01FFEB07F8ED03F0ED00C01600
+ABB612F8A4C601E0C7FCB3B2007FEBFFE0A427467DC522>I<DAFFE0137E010F9038FE03
+FF013FD9FF8F1380903BFFC07FFF3FC0489038001FF84848130F4848EB07FC000F9238FE
+1F80490103EB0F00001F6FC7FCA2003F82A7001F93C7FCA2000F5D6D130700075D6C6C49
+5A6C6C495A6C9038C07FE0D801BFB51280D8038F49C8FC48C613E091CAFC5AA37FA27F13
+F090B612C06C15FCEEFF806C16E0836C826C82831207D80FF0C76C7ED81FC01407484814
+01007F6F138090C9127F5AA56C6CEDFF00A26C6C4A5A6C6C4A5AD80FF8EC0FF8D807FEEC
+3FF03B01FFC001FFC06C6CB6C7FC010F14F8D9007F90C8FC32427DAC38>I<1378EA01FE
+487E481380A24813C0A46C1380A26C13006C5AEA007890C7FCABEB7FC0EA7FFFA412037E
+B3B1B6FCA418467CC520>105 D<EB7FC0B5FCA412037EB3B3B3A5B61280A419457CC420>
+108 D<90277F8003FEEC07FCB590261FFFC090383FFF80037F01F090B512E0923CF81FF8
+01F03FF0913D81C00FFC03801FF80003903D830007FE06000FFC6C01865D028C6E488002
+986D49130702B803F08002B05D14F04A5DA34A5DB3A8B60081B60003B512FEA4572D7CAC
+5E>I<90397F8007FEB590381FFF80037F13E0913981F03FF0913983C01FF80003903987
+000FFC6C138E028C800298130702B88014B014F05CA35CB3A8B60083B512FEA4372D7CAC
+3E>I<EC1FFC49B512C0010714F090391FF80FFC90397FC001FF49486C7F4890C76C7E48
+486E7E48486E7E000F8249140F001F82A2003F82491407007F82A400FF1780AA007F1700
+A46C6C4A5AA2001F5EA26C6C4A5A00075E6D143F6C6C4A5A6C6D495A6C6C6C4890C7FC90
+393FF80FFE010FB512F8010114C09026001FFCC8FC312F7DAD38>I<90397FC01FF8B590
+B5FC02C314C09139CFE03FF09139DF000FF8000301FCEB07FE6C01F06D7E4A1580824A6D
+13C018E0A2EF7FF0A218F8A2173FA218FCAA18F8A2177FA218F0A2EFFFE0A24C13C06E15
+804C13006E495A02FC495A02DE495A9139CFC07FF002C7B512C002C149C7FC9138C03FF0
+92C9FCAEB67EA436407DAC3E>I<90387F807FB53881FFC0028313F091388787F891388E
+0FFC0003138C6C90389C1FFE149814B814B09138F00FFC14E0ED07F8ED01E092C7FCA25C
+B3A7B612E0A4272D7DAC2E>114 D<90391FFC038090B51287000314FF3807F003380FC0
+0048C7123F48141F007E140FA2150712FEA27EA26D90C7FC13E013FE387FFFF014FF6C14
+C06C14F06C806C806C806C80D8003F1480010714C0EB003F1403020013E00070143F00F0
+141FA26C140FA36C15C0A27EED1F807E6DEB3F0001E0137E39FDFC03FC00F8B512F0D8F0
+3F5B26E007FEC7FC232F7CAD2C>I<EB01E0A51303A41307A2130FA2131FA2133F137F13
+FF1203000F90B51280B7FCA3C601E0C7FCB3A4ED01E0AA017FEB03C014F0133FED0780D9
+1FF8130090380FFC1E903803FFFC6D5B9038001FE023407EBE2C>I<D97FC049B4FCB501
+03B5FCA40003EC000F6C81B3AA5EA25E7E5E16376D6C01671380013FD901C713FE90391F
+F807876DB51207010313FE9026003FF0EBFC00372E7CAC3E>I<B500FE90383FFFF0A400
+0101E0903807F8006C6DEB03E06D6C495A013F4A5A6D6C49C7FC6E5B6D6C137E6DEB807C
+6D6D5A6DEBC1F0EDE3E06DEBF7C06EB45A806E90C8FC5D6E7E6E7F6E7FA24A7F4A7F8291
+381F3FFCEC3E1F027C7F4A6C7E49486C7F01036D7F49487E02C08049486C7F49C76C7E01
+3E6E7E49141FD801FE6E7EB500E090B512FCA4362C7EAB3B>120
+D E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fc cmr10 10.95 40
+/Fc 40 122 df<EC03FC91383FFF809138FE03C0903901F00060D907E07FD90F8013F849
+48487E491303133E137EA2496D5A6F5A93C7FCABED01FCB7FCA33900FC000315011500B3
+AC486C497E3B7FFFF87FFFF8A32D407EBF33>12 D<121E123FEA7F80EAFFC0A213E0A212
+7FEA3F60121E1200A513C0A3EA0180A2EA0300A21206A25A5A5A12200B1C79BE19>39
+D<121E123FEA7F80EAFFC0A213E0A2127FEA3F60121E1200A513C0A3EA0180A2EA0300A2
+1206A25A5A5A12200B1C798919>44 D<B512FEA517057F951E>I<121E123FEA7F80EAFF
+C0A4EA7F80EA3F00121E0A0A798919>I<14C013031307131F137FEA07FFB5FC139FEAF8
+1F1200B3B3ACEB7FF0B612F8A31D3D78BC2D>49 D<EB07FC90383FFF8090B512E03901F0
+1FF039038003FC48486C7E000C6D7E48EC7F8012380030EC3FC012700060EC1FE0A212FE
+6C15F07F150FA36CC7FC003E141F121CC813E0A3ED3FC0A2ED7F8016005D5D4A5A5D4A5A
+4A5A4A5A5D4AC7FC143E5C14F0495A5C495A49C8FC010E14305B5B5B4914605B485A48C8
+FC000615E0000FB6FC5A5A4815C0B7FCA3243D7CBC2D>I<EB07FC90383FFF809038F80F
+E03901C003F848C66C7E00066D7E48147F481580EA1F80486C14C06D133FA46C5A6C4813
+7F6CC71380C8FCA216005D5D5D4A5A5D4A5AEC0FC0023FC7FCEB1FFCECFF809038000FE0
+EC03F0EC01FC6E7E157F1680153F16C0A2ED1FE0A216F0A2120C123F487E487EA316E05B
+153F6CC713C012606CEC7F80003815006C14FE6C495A3907C003F83903F80FF0C6B55A01
+3F1380D907FCC7FC243F7CBC2D>I<B712FCEEFF8017E000019039C0001FF86C6C48EB03
+FEEE00FFEF3F80717E717E717E717E717EA2717E84841980183F19C0A3F01FE0A519F0AB
+19E0A4183F19C0A21980187FA2190018FEA24D5A4D5A17074D5A4D5A4D5A05FFC7FCEE03
+FE48486CEB1FF8B85A178004FCC8FC3C3E7DBD45>68 D<B912E0A3000101C0C7FC6C6C48
+141FEF07F01703170117001870A31830A418181618A41800A21638A2167816F8150391B5
+FCA3EC8003150016781638A21618A21806A3180C93C7FCA4181C1818A21838A21878A218
+F0170117031707171F48486CEB01FFB912E0A3373E7DBD3E>I<B91280A300019038C000
+036C6C48EB003FEF1FC017071703A21701A31700A41860A21630A31800A31670A216F015
+01150791B5FCA3EC8007150115001670A21630A693C8FCAF3801FFE0B612F0A3333E7DBD
+3B>I<B612F0A3C6EBF000EB3FC0B3B3B2EBFFF0B612F0A31C3E7EBD21>73
+D<B56C91387FFFF880A2C66C6C020313006EEC00FC016F1678D967F81530801363EB61FE
+8001607F147F6E7E81141F6E7E8114076E7E8114016E7E82157F6F7E82151F6F7E826F7E
+15036F7E8281EE7F8017C0163FEE1FE017F0160FEE07F817FC1603EE01FE17FF82EF7FB0
+18F0173F171F170FA217071703A201F01501486C1500EA07FEB500F015701830A23D3E7D
+BD44>78 D<B712F8EEFF8017E000019039C0001FF86C6C48EB03FC707EEE007FEF3F8018
+C0EF1FE0A218F0170F18F8A818F0171F18E0A2EF3FC01880EF7F00EE01FEEE07FCEE3FF0
+91B612C04CC7FC0280C9FCB3A73801FFE0B612C0A3353E7DBD3E>80
+D<D907FC131890381FFF80017FEBE0383A01FC03F0783903F0007CD807C0EB1EF8484813
+0748C712031501123E15005A1678A200FC1538A46C1518A37E6C6C14007F6C7E13F86CB4
+7E14F86CEBFF806C14F06C14FC6C14FF6C6C14806D14C0010714E0D9007F13F0020713F8
+EC007FED0FFC1507ED01FEA21500167F124012C0163FA47EA2163E7E167E6C157C7E16F8
+B4EC01F0D8FB8014E0D8F9E0EB03C0D8F0F8EB0F8090397F803F0039E01FFFFED8C00713
+F89038007FC028427BBF33>83 D<003FB91280A3903AE0007FE00090C76C48131F007EEF
+0FC0007C17070078170300701701A300601700A5481860A5C81600B3B14B7E4B7E0107B6
+12FEA33B3D7DBC42>I<B600C090387FFFF8A3000101E0C70003130026007F80EC00FC18
+781830B3B3A4013F5EA280011F16E060130F6E4A5A010715036D6C92C7FC6E1406010115
+0E6D6C5C027F147891391F8001F091390FF00FC00203B55A020049C8FCED1FF03D407DBD
+44>I<EB0FF8EB7FFE3901F01F8039038003E039060001F0390F8000F86D7F486C137C15
+7EA2816C5A6C5AC8FCA4EC0FFF0103B5FC90381FFC3FEB7F803801FC00EA03F0485A485A
+485A123F48C7FCEE018012FEA3157FA3007F14DFEC019F3B3F80038F83003A1FC0070FC7
+3A07F01C07FE3A01FFF803FC3A003FE001F0292A7DA82D>97 D<EA01F812FFA312071203
+1201B1EC07F8EC3FFF9138780FC09138C003E09039F98001F001FBC77E01FE147C498049
+143F1780161F17C0A2EE0FE0A317F0A917E0A2161F17C0A21780163F6D1500167E01F614
+7C5E01E3495A9039C1C007E09039C0F01F809026803FFEC7FCC7EA0FF02C407DBE33>I<
+49B4FC010F13E090383F00F8017C131C4913064848131F48485B0007EC7F80485A121F5B
+003FEC3F00151E007F91C7FC90C9FCA35AA97EA27F123F16C0121F6DEB0180120F6C6CEB
+0300A26C6C13066C6C5BD8007C133890383F01F090380FFFC0D901FEC7FC222A7DA828>
+I<ED03F815FFA3150715031501B114FF010713C190381F80F190387E003901F8130D4848
+1307485A0007140348481301121F5B123FA2127F90C7FCA25AA97EA36C7EA2121F7F000F
+140312076C6C13076C6CEB0DFC6C6CEB19FE017C903871FFF090383F01E190380FFF8190
+3A01FE01F8002C407DBE33>I<EB01FE90380FFFC090383F03F090387C00F801F0137C00
+038049133F48487F000F1580485AED0FC0123FA248C713E0A35AA290B6FCA290C9FCA67E
+A27F123F1660121F6D14C0120F6C6CEB018012036C6CEB03006C6C130E017E5B90381F80
+F0903807FFE0010090C7FC232A7EA828>I<EC1FC0ECFFF0903803F038903807C07C9038
+0F80FEEB1F01133F133E90387E00FC1578491300AFB6FCA3D800FCC7FCB3AE487E387FFF
+FEA31F407EBF1C>I<167C903903F801FF90391FFF0787903A7E0FCE0F809038F803F839
+01F001F03B03E000F8070000076EC7FCA24848137EA2001F147FA6000F147EA26C6C5BA2
+00035C6C6C485A6D485A39037E0FC0D91FFFC8FC380703F80006CAFCA2120EA2120F7E7F
+7F6CB512F015FE6C6E7E6C15E00003813A07C0001FF848C7EA03FC001E140048157E007C
+153E0078153F00F881A50078151E007C153E6C5D001E15786C5DD807C0EB03E0D803F0EB
+0FC0D800FE017FC7FC90383FFFFC010313C0293D7EA82D>I<EA01F812FFA31207120312
+01B1EC03F8EC1FFF91383C0F8091386007C04A6C7ED9F9807FEBFB0001FE1301825BA35B
+B3A6486C497EB500F0B512F0A32C3F7CBE33>I<EA01E0487E487E487EA46C5A6C5A6C5A
+C8FCACEA01F8127FA3120712031201B3AC487EB512E0A3133E7DBD19>I<EA01F812FFA3
+120712031201B292387FFF80A392381FF800ED0FE01680030EC7FC5D5D15605D4A5A4AC8
+FC140E5C143E147FECDF80EBF98F9038FB0FC09038FE07E0EBFC0301F07F6E7E14008115
+7E8181826F7E1507826F7E82486CEB07FEB539E03FFFE0A32B3F7EBE30>107
+D<EA01F812FFA3120712031201B3B3B1487EB512F0A3143F7DBE19>I<2703F003FCEB01
+FE00FF903B0FFF8007FFC0913B3C0FC01E07E0913B7003E03801F00007903BC001F06000
+F82603F1806D487F2601F300EBF98001F6D900FBC7127C04FF147E01FC5CA3495CB3A648
+6C496C14FFB528F07FFFF83F13FCA346287CA74D>I<3903F003F800FFEB1FFF91383C0F
+8091386007C00007496C7E2603F1807F3801F30001F613018213FCA35BB3A6486C497EB5
+00F0B512F0A32C287CA733>I<14FF010713E090381F81F890387E007E01F8131F4848EB
+0F804848EB07C04848EB03E0000F15F04848EB01F8A2003F15FCA248C812FEA44815FFA9
+6C15FEA36C6CEB01FCA3001F15F86C6CEB03F0A26C6CEB07E06C6CEB0FC06C6CEB1F80D8
+007EEB7E0090383F81FC90380FFFF0010090C7FC282A7EA82D>I<3901F807F800FFEB3F
+FF9138781FC09138C007E03A07F98001F02603FB007FD801FE6D7E49147E49147FEE3F80
+A2EE1FC0A217E0A2160F17F0A917E0161FA217C0A2EE3F80A26DEC7F00167E6D5C4B5A01
+FB495A9039F9C007E09039F8F01F80DA3FFEC7FCEC0FF091C9FCAD487EB512F0A32C3A7D
+A733>I<3903F007E000FFEB1FF0EC7878ECE0FC3907F181FE12033801F3019038F600FC
+A2153001FC1300A35BB3A5487EB512FCA31F287EA724>114 D<90387FC0603901FFF8E0
+3807C03D380E0007481303481301481300A212F01560A27EA27E007F140013C0EA3FFE38
+1FFFE06C13FC6C7F6C7FC61480010F13C09038007FE0EC0FF00040130300C0EB01F81400
+7E1578A37E15707E15E07E6CEB01C000F3EB038039E1E01F0038C0FFFCEB1FE01D2A7DA8
+24>I<1318A61338A41378A213F8A2120112031207001FB512C0B6FCA2D801F8C7FCB3A2
+1560A9000014C07F137CEC0180133E90381F8700EB07FEEB01F81B397EB723>I<D801F8
+EB03F800FF14FFA3000714070003140300011401B3A61503A300001407A2017CEB0DFCED
+19FE6D903831FFF090381F80E1903807FFC10100903801F8002C297CA733>I<B539C007
+FFE0A32707FC000113006C48EB007C0001157816707F00001560A2017E5CA2017F13016D
+5CA26D6C48C7FCA26E5A010F1306A26D6C5AA2ECF01C01031318A26D6C5AA2ECFC700100
+1360A2EC7EC0A2147F6E5AA26EC8FCA3140EA22B287EA630>I<B53BC3FFFE01FFF8A33D
+0FFC001FE0007FC0D803F06D48EB1F800307EC0E007F00016F130CA26D161C00004A6C13
+18150D017E5EED1DF815186D5EED307CA2D91F80017E5BED603EA2D90FC090383F0180ED
+C01FA2D907E00283C7FC9138E1800F02F11487010315C69138F3000702FB14CE6DB414EC
+4A1303010015F8A24A1301027C5C02781300A202385C023014603D287EA642>I<3B7FFF
+C00FFFE0A3000390390007FE00C648EB03F0017E6D5A6DEB03801480011F49C7FC90380F
+C00E903807E00C6E5A903803F83801015B6D6C5AEC7EC0EC7F80143F141F6E7E81141FEC
+3BF0EC71F8ECE1FC14C0903801807E01037FD907007F01066D7E49130F496D7E01386D7E
+017880EA01F8D80FFCEB07FEB590381FFFF8A32D277FA630>I<B539C007FFE0A32707FC
+000113006C48EB007C0001157816706C6C1460A27F017E5CA26D495AA2EC8003011F91C7
+FCA290380FC006A2ECE00E0107130CA26D6C5AA2ECF8380101133014FC01005BA2EC7EC0
+A2147F6E5AA26EC8FCA3140EA2140CA2141C1418A25CA2147000381360007C13E000FE5B
+13015C49C9FCEA7C07EA700EEA383CEA1FF8EA07E02B3A7EA630>I
+E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fd cmbx12 24.88 14
+/Fd 14 117 df[<EB1FE0EBFFF8000313FE486D7E48804880A248804880A281B6FC81A2
+81A416807EA37E7EA27E6C14BF6C143FC613FCEB1FE090C7FC157F1600A55D5DA214015D
+A214035D1407A24A5AA24A5AA24A5AA24A5A4AC7FC5B495A5C1307495A495A495AEBFFC0
+485B4890C8FC485A5B6C5A6C5A6C5A>33 70 111 270 65 39 D[<BC1280A9C7000103C0
+C8FCB3B3B3B3B3B3B0BC1280A9>73 142 121 269 87 73 D[<BE12F8F5FFF01EFF1FE0
+1FFCF7FF8020E020F820FEC7000392C9000781E2003F15C00B03810B00810C3F8078800C
+07807880788178818E8B8E8B8E8B8EA28EA28B8EA42380AC2300A46A67A26AA26A676A67
+6A9CB65A6A665492C7FC545C0C1F5C545C9BB612E00B075D0B3F5D0A07B648C8FC95BB12
+F820E0208055C9FC1FF09CCAFC1EF00BF8CBFC0680D0FCB3B3B2BB12FEA9>137
+142 120 269 159 80 D<93387FFFF8033FB612E00203B712FE021FEEFFC0027F17F049
+B912FC4918FF49912680007F14C04901E0C7000F80496D020314F8496D0200806F6F7F49
+6D6F7F738090B68173807380A27380A288856D4984A26D5B747F6D5B6D5B6D5B010090CA
+FC91CBFCAA0603B6FC050FB7FC0403B8FC167F0307B9FC153F4AB7C67E020F15C0023F02
+FCC7FC91B612C0010392C8FC010F14FC4914F04914C04991C9FC90B55A485C485C485C48
+5C5D5A485CA24891CAFCA3B6FC5CA397B5FCA461806C60F107EF6C6E150F6F16CF6CF03F
+8F6F037F806C6EDBFF0F14C06C02FCDA03FE15FC6C6E91260FFC0791B5FC6C6E6CD93FF8
+17806C923AF003FFF003013F91B6487E010FEF8000010394C77E010004FC141F021F03E0
+1407020192C96C1400DA000701F093C9FC695F79DD71>97 D<94387FFFF8040FB612E093
+B712FE0307EEFFC0031F17F092B912FC4A84020784021F9126F0000714804A0280D9007F
+13C04A49C8B512E049B500F85C494A4A14F0495C494A4A14F8495C93C8FC495B495B90B5
+FC5D5A484A6F14F0A2487214E05D487214C0741380487313004BEE07F897C8FC5AA4485C
+A5B6FCB07EA281A37EA36C80A37E6F18FE6CF201FFA26C6E5F1CFE6C801B076C6E18FC6D
+6D170FF31FF86D6EEE3FF06D6E167F6D6EEEFFE06D02F84B13C06D6E4B13806D02FF150F
+6D03C0023F1300023F02F0ECFFFC6E02FF010F5B020792B65A6E18C0020060033F4CC7FC
+030716F0030016C0040F02FCC8FCDC007F1380585F78DD67>99 D<94387FFFC0040FB6FC
+93B712E0030716FC031F16FF037F17C04AB912F00207DAF80380021F912680003F13FE4A
+49C7000F7F4A01F802038049B5486E804902C06E6C7F494A6F7F4991C9FC49727F494970
+7F4B84498490B548707F5A4B198048855D481CC086481CE05D5A871DF05AA25D5AA21DF8
+87A2B6FCA392BBFCA51DF00380CDFCA77EA4817EA37EA2817EA26CF307F06FF00FF87E81
+6C1B1F6F19F06C1B3F6D6DF07FE06D7FF4FFC06D6E4C13806D6E5E6D02F04C13006D6EEE
+1FFE6D6E4C5A6D6C01FFEEFFF86E02E002035B6E02FC021F5B02079126FFC003B55A6E92
+B7C7FC020060033F17F8030F17E003011780DB003F03FCC8FC040315C0DC000F01F8C9FC
+5D5F7ADD6A>101 D[<F03FFF050FB512E094B612FC040715FF043F168093B812E0030317
+F04BECF007031FDA000F13F84B01FC4913FC4B495B92B500E04913FE4A5C4A4A90B6FC4A
+91C7FCA24A5B5C5E5C5E4A7013FEA27313FCA291B5486E13F87313F0070313C007001300
+97C7FCB3A5BA12F8A9C702F8CAFCB3B3B3B3A2003FB812FEA9>80
+144 121 271 71 I<F57F80932607FFF892380FFFF04BB600E0023F13FC030F03FC49B5
+7E037F9238FF80070203B8D8F01F80020FDDFC3F15804A7148133F027FDA003F90B500E0
+14C091B500F001031580494A6DECFC00010702806D6C495B93C86C8149496F7F49496F6D
+158049496F6D7F1F0049746C5A90B5486F6E6C5AF500E0487590C7FCA2484A6F80A44887
+AB6C63A46C6E4B5CA26C63A26D6D4B5C6D97C9FCA26D6D4B5B6D6D4B5B6D6D4B5B705C01
+0102E049B512E06D6E495C4902FF013F5C4992B648CAFC62D907F317F090260FE07F1680
+030F03FCCBFC90261FC00115E0DB000701F8CCFC013F91CFFCA3137FA280A380A2808080
+6E7E15E092B812E06DF0FFE01BFEF3FFC06D1AF81CFE767E6D1BE06D87896D1BFE7F6D87
+6E876E8749BDFC010F88013F8890BEFC4802C0C9001F814891CB7E4801FC180748490601
+804849727E484985884849737F88A2B55A88A66E616C65A26E616C656C6D4F5B6E616C6D
+4F5B6C6D96B55A6C6D6C05035C6F5FC602F0051F49C7FC6D01FC057F5B6D01FF4CB55A01
+0F02F0031F14E06DDAFFC00107B65A010092B848C8FC023F19F8020719C002004EC9FC03
+1F17F003004CCAFC040192CBFC6A887ADD74>I<DB7FC0912601FFFCF0FFFE90B6033FD9
+FFE0041FEBFFF0B74AB600FC93B612FE060703FF03036F7E061F04C0020F16E0067F7002
+3F8295B800F84A16FC0503D9F8016E902701FFFC00804D902680007F6D4901C0013F7F4D
+48C76C4B90C77EDD1FF86E6DD90FFC6E80D8003FDB3FE06E9126801FF06E800107DB7F80
+F03FC04DC86C6E48486E806DDAC1FE4FC8FC4D6F6E486F80DCC3F8F0E1FCDCC7F0DEF3F8
+844D61DCCFC0F0F7E04D6F4B8104DF19FF04FFC94C84A24C97CAFCA24C61A34C61A44C61
+B3B3AFB900C0017FB800E0013FB812F0A9B45D77DCC3>109 D<DB7FC0913803FFF890B6
+033FEBFFC0B74AB612F8060715FE061F6F7E067F16E04DB87E4DD9F003804DD9800080DD
+0FFCC76C7FDD1FF080D8003F4B486E7F0107DB7F80804DC8816DDAC1FE844D81EEC3F8DC
+C7F0845FEECFC0DCDF8081A204FFC981A25EA25EA35EA45EB3B3AFB900C090B912C0A972
+5D77DC81>I<94381FFFF00407B612C0047F15FC0303B87E030F17E0037F17FC4ABAFC4A
+9126FC007F80020F02C0010714E04A49C880027F01F8033F13FC91B5486F7F4902C00307
+7F494A6F804991C96C80494970804949717F49874949717FA290B548717F48884B83481D
+80A2481DC04B83481DE0A2481DF0A3484A7114F8A4481DFCA5B61BFEAF6C1DFCA56C6E4D
+14F8A36C1DF0A36C1DE06F5F6C1DC0A26C6E4D1480A26C1D006F5F6C646D6D4D5B6F94B5
+FC6D636D6D4C5C6D6E4B5C6D6E4B5C6D02F0031F5C6D6E4B91C7FC6D6C01FE92B512FC6E
+D9FFC001075C6E02FC017F5C020791B812C0020196C8FC6E6C17FC031F17F003031780DB
+007F03FCC9FC040715C0DC001F01F0CAFC675F7ADD74>I<DB7F8049B47E90B6020F13F8
+B7027F13FE4DB67E4D15E0050F814D8194263FFE077F94387FF00FDEC01F7F4D48487FD8
+003F913881FE0001074B491480EE83F86DEC87F0A2EE8FE05F169F5F04BFC76C1400A273
+5B16FE735B4C6E5B735B9638007F804C92C8FCA45EA75EB3B3A9B912F8A9515D79DC5F>
+114 D<92260FFFF814F80203B638C001FC021FEDF80791B7EAFE0F0107EEFFBF4917FF01
+3F9038F0000F4990C8FCD9FFF8153F4849150F4801C015034849814890CAFC197F484817
+3FA24848171FA2007F180FA312FF19077FA27F80806E705A02F893C8FC14FEECFFC06C14
+FCEDFFE0EEFF806C16FCEFFFC06C17F86C17FF19C06C18F06C846C18FE6C846D846D846D
+840107840101846D6C83141F020383DA003F821503DB000F1680EE003F050115C0717E18
+1F1807007F050114E0486C8285856D83A2857F85A27F1BC07FA27F1B806D5FA26D19006E
+5E6E5F6E4C5A6E167F02FC4C5A6E03035B6E6C4A5B03E0023F5B03FE0103B55A01F990B8
+C7FCD9F07F16FCD9E01F5ED9800716C0D900014BC8FC48D9003F14F0007C020149C9FC4B
+5F78DD5C>I[<ED03FEA81507A5150FA4151FA3153FA2157FA215FFA25CA25C5CA25C5C5C
+5C91B5FC13035B131F017F91B712F00007BAFCBBFCA7C76C49C9FCB3B3AAF101FFB1616E
+17FE82A219076E17FC836EEE0FF871131F6EEE3FF06E02F0EB7FE07113FF6EDAFE0313C0
+6E91B612806F16006F5D030F5D03035D030015E0040F91C7FC040013F8>72
+132 124 258 90 I E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fe cmbx12 20.74 8
+/Fe 8 117 df<EE01F04C7E160F161F167FED01FF1507153F4AB5FC141F010FB6FCB8FC
+A44A7E14E0EBF000C8FCB3B3B3B3B0007FBA12F0A7447171F061>49
+D<96267FFFE01670063FB616F80503B700E01401053F04FC14034CB91407040706C0130F
+043F06F0131F93B626FE000F01FC133F030303809026007FFE137F030F02FCC8390FFF80
+FF4B02E0030313C1037F91CA13E392B500FCEF3FF7020302F071B5FC4A4A17074A028083
+4A91CB7E4A01FC844A498591B54885494A854988494A85495C93CD7E4988495B49885D90
+B51C7F5D481E3F485CA21F1F485CA2481E0F5D5AA21F075D5AA2F703F09CC7FC5AA392D1
+FCA2B6FCB27EA281A37EA3F701F06CF603F881A37E816C1E0720F06C80A36C6E1B0F6C1F
+E06F1B1F7F6F1CC06D1D3F6D6DF37F807F70F2FF006D6E626D6E19016D525A6D6E4F5A6E
+6D190F6E01FE4F5A6E6D4F5A6E6E4E5A6E02E04D485A6E6E4D90C7FC020002FCEF0FFE6F
+01FFEF3FFC031F02E0EEFFF06F02FC03075B0303DAFFC0023F1380030003FE0107B5C8FC
+043F91B712FC040718F0040118C0DC003F94C9FC050316F8DD003F1580DE007F01F0CAFC
+757A75F78C>67 D<92383FFFF8020FB612E0027F15FC0103B87E010F17E04983499026E0
+007F13FCD97FFCC7000F7F496C02037F486D6E806F6D6C7F86486E6E7F727F8684868486
+6C5CA26C91C86C806D5A6D5A6D5AEB03C090CAFCA80507B6FC041FB7FC0303B8FC157F02
+03B9FC021FECFE0391B612800103ECF800010F14C04991C7FC017F13FC90B512F04814C0
+485C4891C8FC485B485BA2485BA2485BA2B5FC5CA360A360806C5FA26C6D153E6E5D6C05
+FC806C01FFDA03F8806C6ED90FF014FC6C02E090263FE07FEBFFFC6C9128FC03FFC03F14
+FE6C91B61280013F4B487E010F4B1307010303F01301D9003F0280D9001F13FC020101F8
+CBFC57507ACE5E>97 D<EE3FFF0307B512F8033F14FF4AB712E0020716F8021F16FE027F
+D9F8037F49B526C0007F7F4991C76C13E04901FC020F7F49498049496E7F49496E7F4949
+6E7F90B55A48727E92C9FC48721380485B1BC048841BE0485BA27313F05AA25C5AA21BF8
+85A2B5FCA391BAFCA41BF002F8CCFCA67EA3807EA47E806CF101F0F203F86C7F1A076C6E
+17F06C190F6F17E06C6E161F6D6DEE3FC06D6D167F6D6DEEFF806D6D030313006D6D6C4A
+5A6D02E0EC1FFC6D02F8EC7FF86D913AFF8007FFF0023F91B65A020F178002034CC7FC02
+0016F8031F15C003014AC8FCDB000F13C04D507BCE58>101 D<903801FFFCB6FCA7C67E
+131F7FB3AE95380FFFE095B512FE05036E7E050F15E0053F15F84D819426FFF01F7F4CD9
+00077FDC07FC010180EE0FF0DC1FC06D804D82043EC87E5E04FC835EDBFDF0815E03FF84
+5EA25EA393C9FCA45DB3B3A7B8D8E003B81280A7617879F76C>104
+D<902601FFFCEC7FFEB60207B512F0053F14FE4CB712C0040716F0041F824C16FE4CD900
+7F7FC66C9026FDFFF0010F14C0011F90B500800103806D4AC76C804C6E6C7F04F06F7F4C
+6F7F5E4C6F7F93C96C14805D7414C01DE0861DF0A2861DF8A2871DFCA57513FEAF5113FC
+A41DF8A298B5FC1DF0A2621DE0A25014C01D80626F1900505B705D705F704B5B704B5B70
+92B55A04FE02035C706C010F91C7FC4B01E0013F5B93267FFC01B55A041FB712F07016C0
+040393C8FC040015F8051F14C0050301F0C9FC94CCFCB3A7B812E0A75F6F7ACD6C>112
+D<902601FFF8EB07FEB691383FFFC094B512F04C800407804C8093391FFC3FFF93263FE0
+7F1380C66C0380B512C0011F4A5A6DDAFC0114E0A2EDF9F816F015FB16E015FF4C6C14C0
+A24C6D1380721300725A93C76C5AF001E095C8FCA25DA55DB3B3A4B812F8A7434E7ACD4F
+>114 D<157FA75DA45CA45CA25CA25CA25CA25C5C91B5FC5B5B5B5B133F90B6FC000792
+B6FCBAFCA6D8000791C9FCB3B3A4F00FE0AE181F6D6E14C0A2183F6D178070137F6D1700
+705B6E6D485A6E9038FE07FC6E90B55A6E5D6E5D02015D6E6C5C031F49C7FC030013F03B
+6E7CEC4B>116 D E
+%EndDVIPSBitmapFont
+end
+%%EndProlog
+%%BeginSetup
+%%Feature: *Resolution 600dpi
+TeXDict begin
+%%PaperSize: A4
+
+%%EndSetup
+%%Page: 1 1
+1 0 bop 382 1171 a Fe(Chapter)65 b(1)382 1586 y Fd(Programmer's)74
+b(In)-6 b(terface)382 2031 y Fc(Imp)s(orting)33 b(the)i(mo)s(dule)e('T)
+-8 b(ransducerIn)m(terface.hs')35 b(giv)m(es)i(y)m(ou)e(access)h(to)g
+(the)f(fol-)382 2144 y(lo)m(wing)c(functions.)382 2385
+y Fb(1.0.1)112 b(Regular)37 b(expressions)382 2557 y
+Fc(F)-8 b(unctions)31 b(for)f(constructing)h(a)g(simpli\014ed)d
+(regular)j(expression.)382 2757 y Fa(s)477 b(::)47 b(a)h(->)f(Reg)g(a)
+668 b(--)47 b(symbol)382 2870 y(eps)381 b(::)47 b(Reg)g(a)907
+b(--)47 b(epsilon)382 2983 y(empty)285 b(::)47 b(Reg)g(a)907
+b(--)47 b(empty)f(set)382 3096 y(allS)333 b(::)47 b(Reg)g(a)907
+b(--)47 b(all)g(symbol)382 3209 y(star)333 b(::)47 b(Reg)g(a)g(->)h
+(Reg)f(a)477 b(--)47 b(kleene's)e(star)382 3322 y(plus)333
+b(::)47 b(Reg)g(a)g(->)h(Reg)f(a)477 b(--)47 b(kleene's)e(plus)382
+3435 y(complement)g(::)i(Reg)g(a)g(->)h(Reg)f(a)477 b(--)47
+b(complement)382 3548 y(\(<|>\))285 b(::)47 b(Reg)g(a)g(->)h(Reg)f(a)g
+(->)g(Reg)g(a)h(--)f(union)382 3660 y(\(|>\))333 b(::)47
+b(Reg)g(a)g(->)h(Reg)f(a)g(->)g(Reg)g(a)h(--)f(product)382
+3773 y(\(<&>\))285 b(::)47 b(Reg)g(a)g(->)h(Reg)f(a)g(->)g(Reg)g(a)h
+(--)f(intersection)382 3886 y(\(<->\))285 b(::)47 b(Reg)g(a)g(->)h(Reg)
+f(a)g(->)g(Reg)g(a)h(--)f(set)g(minus)382 3999 y(symbols)189
+b(::)47 b(Reg)g(a)g(->)h(a)668 b(--)47 b(collect)f(all)g(symbols.)382
+4241 y Fb(1.0.2)112 b(Regular)37 b(relations)382 4412
+y Fc(F)-8 b(unctions)31 b(for)f(constructing)h(a)g(simpli\014ed)d
+(regular)j(relation.)382 4613 y Fa(r)477 b(::)47 b(a)h(->)f(a)g(->)g
+(Reg)g(a)573 b(--)47 b(relation)382 4726 y(empty)285
+b(::)47 b(RReg)g(a)1002 b(--)47 b(empty)f(set)382 4839
+y(idR)381 b(::)47 b(Reg)g(a)95 b(->)47 b(RReg)g(a)525
+b(--)47 b(identity)382 4951 y(star)333 b(::)47 b(RReg)g(a)g(->)g(RReg)g
+(a)525 b(--)47 b(kleene's)e(star)382 5064 y(plus)333
+b(::)47 b(RReg)g(a)g(->)g(RReg)g(a)525 b(--)47 b(kleene's)e(plus)382
+5177 y(\(<|>\))285 b(::)47 b(RReg)g(a)g(->)g(RReg)g(a)g(->)h(RReg)e(a)i
+(--)f(union)382 5290 y(\(|>\))333 b(::)47 b(RReg)g(a)g(->)g(RReg)g(a)g
+(->)h(RReg)e(a)i(--)f(product)382 5403 y(\(<*>\))285
+b(::)47 b(Reg)g(a)95 b(->)47 b(Reg)g(a)95 b(->)48 b(RReg)e(a)i(--)f
+(cross)f(product)1854 5652 y Fc(1)p eop
+%%Page: 2 2
+2 1 bop 382 548 a Fa(\(<.>\))285 b(::)47 b(RReg)g(a)g(->)g(RReg)g(a)g
+(->)h(RReg)e(a)i(--)f(composition)382 661 y(symbols)189
+b(::)47 b(RReg)g(a)g(->)g(a)764 b(--)47 b(collect)f(all)h(symbols.)382
+904 y Fb(1.0.3)112 b(P)m(arsing)37 b(regular)g(relations)382
+1076 y Fc(F)-8 b(unctions)31 b(for)f(parsing)g(regular)g(relations.)523
+1189 y('parseProgram')36 b(tak)m(es)i(a)f(string)g(con)m(taining)h(a)f
+(fstStudio)f(program,)h(and)f(try)382 1302 y(to)c(parse)e(it)i(-)f(if)g
+(unsuccessful,)f(it)h(returns)f(a)h(error)g(message.)42
+b('parseExp')31 b(parses)f(a)382 1415 y(string)g(con)m(taining)i(a)f
+(regular)f(relation.)382 1740 y Fa(parseProgram)44 b(::)k(String)e(->)h
+(Either)f(String)g(\(RReg)g(String\))382 1853 y(parseExp)236
+b(::)48 b(String)e(->)h(Either)f(String)g(\(RReg)g(String\))382
+2096 y Fb(1.0.4)112 b(Construction)37 b(and)h(running)382
+2268 y Fc(F)-8 b(unctions)31 b(for)f(constructing)h(and)f(running)e(a)j
+(\014nite)f(state)i(transducer.)523 2381 y(The)40 b(function)h
+('compile')g(construct)g(a)g(deterministic,)j(epsilonfree,)f(minimal)
+382 2494 y(transducer,)22 b(and)d('compileN')i(construct)g(a)f
+(epsilonfree,)j(p)s(ossibly)d(non-deterministic,)382
+2607 y(non-minimal)31 b(transducer.)48 b(The)33 b('Sigma')g(t)m(yp)s(e)
+h(pro)m(vides)f(a)g(w)m(a)m(y)h(to)g(add)f(sym)m(b)s(ols)382
+2720 y(that)h(is)f(not)g(presen)m(t)g(in)g(the)g(regular)h(relation.)50
+b('applyDo)m(wn')34 b(and)e('applyUp')h(are)382 2833
+y(used)c(to)j(run)d(the)h(transducer.)382 3045 y Fa(type)47
+b(Sigma)f(a)h(=)h([a])382 3271 y(compile)428 b(::)47
+b(Ord)g(a)g(=>)g(RReg)g(a)g(->)h(Sigma)e(a)h(->)h(Transducer)d(a)382
+3384 y(compileN)380 b(::)47 b(Ord)g(a)g(=>)g(RReg)g(a)g(->)h(Sigma)e(a)
+h(->)h(Transducer)d(a)382 3497 y(determinize)236 b(::)47
+b(Ord)g(a)g(=>)g(Transducer)e(a)j(->)f(Transducer)e(a)382
+3610 y(minimize)380 b(::)47 b(Ord)g(a)g(=>)g(Transducer)e(a)j(->)f
+(Transducer)e(a)382 3723 y(unionT)476 b(::)47 b(Ord)g(a)g(=>)g
+(Transducer)e(a)j(->)f(Transducer)e(a)i(->)h(Transducer)d(a)382
+3836 y(productT)380 b(::)47 b(Ord)g(a)g(=>)g(Transducer)e(a)j(->)f
+(Transducer)e(a)i(->)h(Transducer)d(a)382 3948 y(starT)524
+b(::)47 b(Ord)g(a)g(=>)g(Transducer)e(a)j(->)f(Transducer)e(a)382
+4061 y(compositionT)188 b(::)47 b(Ord)g(a)g(=>)g(Transducer)e(a)j(->)f
+(Transducer)e(a)i(->)h(Transducer)d(a)382 4174 y(emptyTransducer)f(::)j
+(Transducer)e(a)382 4287 y(applyDown)332 b(::)47 b(Ord)g(a)g(=>)g
+(Transducer)e(a)j(->)f([a])g(->)g(Maybe)f([[a]])382 4400
+y(applyUp)428 b(::)47 b(Ord)g(a)g(=>)g(Transducer)e(a)j(->)f([a])g(->)g
+(Maybe)f([[a]])382 4513 y(load)572 b(::)47 b(FilePath)e(->)i(IO)h
+(\(Either)d(String)i(\(Transducer)d(String\)\))382 4626
+y(save)572 b(::)47 b(FilePath)e(->)i(Transducer)e(String)i(->)g(IO)g
+(\(Either)f(String)g(\(\)\))382 4869 y Fb(1.0.5)112 b(T)-9
+b(ransducer)38 b(Information)382 5041 y Fc(F)-8 b(unctions)31
+b(for)f(getting)i(information)e(ab)s(out)g(a)h(built)f(transducer.)382
+5253 y Fa(type)47 b(State)f(=)h(Int)1854 5652 y Fc(2)p
+eop
+%%Page: 3 3
+3 2 bop 382 548 a Fa(states)666 b(::)48 b(Transducer)d(a)i(->)g
+([State])382 661 y(isFinal)618 b(::)48 b(Transducer)d(a)i(->)g(State)g
+(->)g(Bool)382 774 y(initial)618 b(::)48 b(Transducer)d(a)i(->)g(State)
+382 887 y(finals)666 b(::)48 b(Transducer)d(a)i(->)g([State])382
+1000 y(transitionsU)378 b(::)48 b(Transducer)d(a)i(->)g(\(State,a\))f
+(->)h([\(a,State\)])382 1112 y(transitionsD)378 b(::)48
+b(Transducer)d(a)i(->)g(\(State,a\))f(->)h([\(a,State\)])382
+1225 y(showTransducer)282 b(::)48 b(Transducer)d(a)i(->)g(String)382
+1338 y(numberOfStates)282 b(::)48 b(Transducer)d(a)i(->)g(Int)382
+1451 y(numberOfTransitions)42 b(::)48 b(Transducer)d(a)i(->)g(Int)1854
+5652 y Fc(3)p eop
+%%Trailer
+end
+userdict /end-hook known{end-hook}if
+%%EOF
diff --git a/doc/fstMan0.9.ps b/doc/fstMan0.9.ps
new file mode 100644
--- /dev/null
+++ b/doc/fstMan0.9.ps
@@ -0,0 +1,1299 @@
+%!PS-Adobe-2.0
+%%Creator: dvips(k) 5.86 Copyright 1999 Radical Eye Software
+%%Pages: 8
+%%PageOrder: Ascend
+%%BoundingBox: 0 0 596 842
+%%EndComments
+%DVIPSWebPage: (www.radicaleye.com)
+%DVIPSCommandLine: dvips -f
+%DVIPSParameters: dpi=600, compressed
+%DVIPSSource:  TeX output 2001.08.28:0920
+%%BeginProcSet: texc.pro
+%!
+/TeXDict 300 dict def TeXDict begin/N{def}def/B{bind def}N/S{exch}N/X{S
+N}B/A{dup}B/TR{translate}N/isls false N/vsize 11 72 mul N/hsize 8.5 72
+mul N/landplus90{false}def/@rigin{isls{[0 landplus90{1 -1}{-1 1}ifelse 0
+0 0]concat}if 72 Resolution div 72 VResolution div neg scale isls{
+landplus90{VResolution 72 div vsize mul 0 exch}{Resolution -72 div hsize
+mul 0}ifelse TR}if Resolution VResolution vsize -72 div 1 add mul TR[
+matrix currentmatrix{A A round sub abs 0.00001 lt{round}if}forall round
+exch round exch]setmatrix}N/@landscape{/isls true N}B/@manualfeed{
+statusdict/manualfeed true put}B/@copies{/#copies X}B/FMat[1 0 0 -1 0 0]
+N/FBB[0 0 0 0]N/nn 0 N/IEn 0 N/ctr 0 N/df-tail{/nn 8 dict N nn begin
+/FontType 3 N/FontMatrix fntrx N/FontBBox FBB N string/base X array
+/BitMaps X/BuildChar{CharBuilder}N/Encoding IEn N end A{/foo setfont}2
+array copy cvx N load 0 nn put/ctr 0 N[}B/sf 0 N/df{/sf 1 N/fntrx FMat N
+df-tail}B/dfs{div/sf X/fntrx[sf 0 0 sf neg 0 0]N df-tail}B/E{pop nn A
+definefont setfont}B/Cw{Cd A length 5 sub get}B/Ch{Cd A length 4 sub get
+}B/Cx{128 Cd A length 3 sub get sub}B/Cy{Cd A length 2 sub get 127 sub}
+B/Cdx{Cd A length 1 sub get}B/Ci{Cd A type/stringtype ne{ctr get/ctr ctr
+1 add N}if}B/id 0 N/rw 0 N/rc 0 N/gp 0 N/cp 0 N/G 0 N/CharBuilder{save 3
+1 roll S A/base get 2 index get S/BitMaps get S get/Cd X pop/ctr 0 N Cdx
+0 Cx Cy Ch sub Cx Cw add Cy setcachedevice Cw Ch true[1 0 0 -1 -.1 Cx
+sub Cy .1 sub]/id Ci N/rw Cw 7 add 8 idiv string N/rc 0 N/gp 0 N/cp 0 N{
+rc 0 ne{rc 1 sub/rc X rw}{G}ifelse}imagemask restore}B/G{{id gp get/gp
+gp 1 add N A 18 mod S 18 idiv pl S get exec}loop}B/adv{cp add/cp X}B
+/chg{rw cp id gp 4 index getinterval putinterval A gp add/gp X adv}B/nd{
+/cp 0 N rw exit}B/lsh{rw cp 2 copy get A 0 eq{pop 1}{A 255 eq{pop 254}{
+A A add 255 and S 1 and or}ifelse}ifelse put 1 adv}B/rsh{rw cp 2 copy
+get A 0 eq{pop 128}{A 255 eq{pop 127}{A 2 idiv S 128 and or}ifelse}
+ifelse put 1 adv}B/clr{rw cp 2 index string putinterval adv}B/set{rw cp
+fillstr 0 4 index getinterval putinterval adv}B/fillstr 18 string 0 1 17
+{2 copy 255 put pop}for N/pl[{adv 1 chg}{adv 1 chg nd}{1 add chg}{1 add
+chg nd}{adv lsh}{adv lsh nd}{adv rsh}{adv rsh nd}{1 add adv}{/rc X nd}{
+1 add set}{1 add clr}{adv 2 chg}{adv 2 chg nd}{pop nd}]A{bind pop}
+forall N/D{/cc X A type/stringtype ne{]}if nn/base get cc ctr put nn
+/BitMaps get S ctr S sf 1 ne{A A length 1 sub A 2 index S get sf div put
+}if put/ctr ctr 1 add N}B/I{cc 1 add D}B/bop{userdict/bop-hook known{
+bop-hook}if/SI save N @rigin 0 0 moveto/V matrix currentmatrix A 1 get A
+mul exch 0 get A mul add .99 lt{/QV}{/RV}ifelse load def pop pop}N/eop{
+SI restore userdict/eop-hook known{eop-hook}if showpage}N/@start{
+userdict/start-hook known{start-hook}if pop/VResolution X/Resolution X
+1000 div/DVImag X/IEn 256 array N 2 string 0 1 255{IEn S A 360 add 36 4
+index cvrs cvn put}for pop 65781.76 div/vsize X 65781.76 div/hsize X}N
+/p{show}N/RMat[1 0 0 -1 0 0]N/BDot 260 string N/Rx 0 N/Ry 0 N/V{}B/RV/v{
+/Ry X/Rx X V}B statusdict begin/product where{pop false[(Display)(NeXT)
+(LaserWriter 16/600)]{A length product length le{A length product exch 0
+exch getinterval eq{pop true exit}if}{pop}ifelse}forall}{false}ifelse
+end{{gsave TR -.1 .1 TR 1 1 scale Rx Ry false RMat{BDot}imagemask
+grestore}}{{gsave TR -.1 .1 TR Rx Ry scale 1 1 false RMat{BDot}
+imagemask grestore}}ifelse B/QV{gsave newpath transform round exch round
+exch itransform moveto Rx 0 rlineto 0 Ry neg rlineto Rx neg 0 rlineto
+fill grestore}B/a{moveto}B/delta 0 N/tail{A/delta X 0 rmoveto}B/M{S p
+delta add tail}B/b{S p tail}B/c{-4 M}B/d{-3 M}B/e{-2 M}B/f{-1 M}B/g{0 M}
+B/h{1 M}B/i{2 M}B/j{3 M}B/k{4 M}B/w{0 rmoveto}B/l{p -4 w}B/m{p -3 w}B/n{
+p -2 w}B/o{p -1 w}B/q{p 1 w}B/r{p 2 w}B/s{p 3 w}B/t{p 4 w}B/x{0 S
+rmoveto}B/y{3 2 roll p a}B/bos{/SS save N}B/eos{SS restore}B end
+
+%%EndProcSet
+TeXDict begin 39158280 55380996 1000 600 600 () @start
+%DVIPSBitmapFont: Fa cmtt10 10.95 71
+/Fa 71 125 df<121C127FA2EAFF80B2EA7F00B1123EC7FCA9121C127FA2EAFF80A3EA7F
+00A2121C09396DB830>33 D<003C131E00FEEB3F80A26C137FA248133FB3007E1400007C
+7F003C131E191B75B830>I<147814FCA5EB03FF011F13E090B512FC4880000780481580
+261FFCFC13C001F0EB3FE0D83FC0130FD87F80EB07F001001303007E15F812FE5A1507A3
+ED03F07E007E91C7FC127FEA3F8013E0EA1FF8EA0FFF7E6CEBFF80C614F0013F7F010F13
+FE01007F168002FC13C0153FED0FE0ED07F0A21503007E15F81501B4FCA35A1503A2007E
+15F0007F1407ED0FE0D83FC0131FD81FE0EB7FC09039FCFDFF806CB612006C5C6C5CC614
+F0013F13C0D903FEC7FCEB00FCA6147825477BBE30>36 D<EA03C0EA0FF0A2EA1FF813FC
+A2EA0FFEA21203EA007EA513FE13FCA2120113F81203EA07F0120FEA1FE0EA7FC012FF13
+801300127C12380F1D70B730>39 D<141E147F14FF5BEB03FEEB07F8EB0FF0EB1FE0EB3F
+C0EB7F80EBFF005B485A485A5B12075B120F5B121F5B123F90C7FCA25A127EA412FE5AAB
+7E127EA4127F7EA27F121F7F120F7F12077F12037F6C7E6C7E7FEB7F80EB3FC0EB1FE0EB
+0FF0EB07F8EB03FEEB01FF7F147F141E184771BE30>I<127812FE7E7F6C7EEA1FE06C7E
+6C7E6C7E6C7E6C7E7FEB3F80EB1FC0130F14E0130714F0130314F8130114FC1300A214FE
+147EA4147F143FAB147F147EA414FE14FCA2130114F8130314F0130714E0130F14C0131F
+EB3F80EB7F005B485A485A485A485A485AEA7FC0485A90C7FC5A1278184778BE30>I<14
+E0497EA70030EC0180007CEC07C000FFEC1FE00181133F01E113FF267FF9F313C0261FFD
+F713000007B512FC000114F06C5C013F1380D90FFEC7FC90383FFF8090B512E048800007
+14FC391FFDF7FF267FF9F313C026FFE1F013E00181133F0101131F007CEC07C00030EC01
+80000091C7FCA76D5A23277AAE30>I<EA07C0EA0FF0EA1FF8123F13FCA213FEA2121F12
+0F1207EA007E13FE13FC1201A2EA07F8EA0FF0123FEAFFE013C01380EA7E0012380F1870
+8A30>44 D<120EEA3F80EA7FC0EAFFE0A5EA7FC0EA3F80EA0E000B0B6E8A30>46
+D<16E0ED01F0ED03F8A2150716F0150F16E0151F16C0153F1680A2157F16005D5D14015D
+14035D14075D140F5D141F5DA2143F5D147F92C7FC5C5C13015C13035C13075C130F5C13
+1F5CA2133F5C137F91C8FC5B5B12015B12035B12075B120F5BA2121F5B123F5B127F90C9
+FC5A5AA2127C123825477BBE30>I<EB01FCEB07FF011F13C0497F497F90B57E48EB07FC
+3903FC01FE48486C7E497F4848EB3F8049131F001F15C049130F003F15E090C71207A200
+7EEC03F0A548EC01F8AD6C1403007E15F0A3007F1407A26C15E06D130FA2001F15C06D13
+1F6C6CEB3F80A26C6CEB7F006D5B6C6C485A3901FF07FC6CEBFFF86D5B6D5B6D5B010790
+C7FCEB01FC253A7BB830>I<EB0380497EA2130FA2131F133FA2137FEA01FF5A127FB5FC
+A213CF138FEA7C0F1200B3B0007FB512F8A2B612FCA26C14F8A21E3976B830>I<EB07FC
+90383FFF8090B512F00003804814FE4880261FF8071380EBE000D83F80EB3FC048C7EA1F
+E0007E140FED07F000FE1403A26C15F81501A2127EA21218C8FCA2150316F0150716E015
+0F16C0151FED3F80ED7F005D4A5A4A5A4A5A4A5A4A5AEC7FC04A5A4990C7FC495AEB07F8
+495AEB3FE0495A495A4890C8FCD803FC14F04848EB01F8EA1FF0485A48B6FCB7FCA46C15
+F025397BB830>I<EB03FF011F13E090B512F84814FE4880481580260FFC0013C001F013
+3FD81FC0EB0FE06D130716F01503A26C5A6C5AC8FC150716E0A2150FED1FC0153FEDFF80
+02071300903807FFFE495B5D8115FF6D148090C713C0ED1FE0ED0FF0ED07F8150116FC15
+0016FE167EA21218127EB4FCA216FE16FC481401A2007FEC07F86DEB0FF0D83FE0131FD8
+1FFCEBFFE06CB612C06C15806C1500C614FC011F13E0010390C7FC273A7CB830>I<EC03
+FC4A7E140FA2141FEC3FBE153E147F147E14FEEB01FC14F81303EB07F014E0130F14C013
+1FEB3F8014005B13FE5B12015B1203485A5B120F485A5B123F90C7FC5A12FEB8FC1780A4
+6C1600C8003EC7FCAA91383FFFFE4A7FA46E5B29397DB830>I<000FB612804815C0A416
+800180C8FCAEEB81FF018F13E001BF13F890B57E8181D9FE0113809039F0007FC049131F
+49EB0FE04913076CC713F0C81203A216F81501A4123C127EB4FC150316F015074815E000
+7E140F007FEC1FC06D137FD83FE0EBFF80261FF80713006CB55A6C5C6C5C6C14E0D8003F
+1380D907F8C7FC25397BB730>I<EC0FF0ECFFFE01037F010F14804914C04914E090387F
+F00F9039FF8007F048EB000FEA03FC5B485A4848EB07E0ED03C0484890C7FC5B123F90C9
+FCA25A127E903803FF80011F13F0D8FE7F7F48B512FE00FD80B7FCD9FC00138001F0EB3F
+C001C0131F49EB0FE090C7EA07F0A248140316F81501A3127EA4127F6C14036D14F0A200
+1F14076DEB0FE06C6C131F6DEB3FC06C6CEB7F803A03FE01FF006CB6FC6C5C6D13F86D5B
+010F13C0D901FEC7FC253A7BB830>I<1278B712FC16FEA416FC00FCC7EA03F8ED07F0ED
+0FE00078EC1FC0C8EA3F80ED7F00157E15FE4A5A5D4A5A14075D140F5D4A5AA24AC7FCA2
+147EA214FE5C13015CA213035CA213075CA3130F5CA5131F5CA96DC8FCA2273A7CB830>
+I<49B4FC011F13F0017F13FC90B57E0003ECFF804815C04848C613E0D81FF8EB3FF001E0
+130F4848EB07F849130348C7EA01FC007E1400A5007F14016C15F86D13036C6CEB07F06C
+6CEB0FE0D807F8EB3FC03A03FF01FF806C90B512006C6C13FC011F13F0497F90B512FE48
+802607FE0013C0D80FF0EB1FE04848EB0FF0D83F80EB03F890C712014815FC007E140000
+FE15FE48157EA66C15FE007E15FC007F14016C6CEB03F86D13076C6CEB0FF001F8133FD8
+0FFEEBFFE06CB612C06C1580C6ECFE006D5B011F13F0010190C7FC273A7CB830>I<EB01
+FC90381FFF80017F13E090B512F8488048803807FE03390FF800FFD81FE0EB7F80484813
+3F49EB1FC048C7120F007E15E0150712FE4815F01503A416F8A37E127E007F1407A26C6C
+130F6C6C131F6D137F390FF801FF6CB6FC15FD6C14F9C614F36D13C390390FFE03F090C7
+FCA2150716E0150F16C0151F121E003FEC3F80486CEB7F005D4A5A4A5AEB000F393FC03F
+F890B55A6C5C6C14806C91C7FC000113F838003FC0253A7BB830>I<120EEA3F80EA7FC0
+EAFFE0A5EA7FC0EA3F80EA0E00C7FCB1120EEA3F80EA7FC0EAFFE0A5EA7FC0EA3F80EA0E
+000B276EA630>I<EA0380EA0FE0EA1FF0EA3FF8A5EA1FF0EA0FE0EA0380C7FCB1EA0780
+EA0FE0EA1FF0123F13F8A4121F120F12071201120313F0A21207EA0FE0121FEA7FC0EAFF
+8013005A127C12380D3470A630>I<16E0ED01F0ED07F8150F153FEDFFF04A13E0020713
+C04A1300EC3FFEEC7FF8903801FFE0495B010F90C7FC495AEB7FF8495A000313C0485BD8
+1FFEC8FC485AEA7FF0485A138013E06C7EEA3FFC6C7E3807FF806C7FC613F06D7EEB1FFE
+6D7E010313C06D7F9038007FF8EC3FFEEC0FFF6E13C0020113E06E13F0ED3FF8150F1507
+ED01F0ED00E0252F7BB230>I<003FB612FE4881B81280A36C16006C5DCBFCA7003FB612
+FE4881B81280A36C16006C5D29157DA530>I<1238127CB4FC7F13E0EA7FF86C7E6CB4FC
+00077F6C13E0C67FEB3FFC6D7E903807FF806D7F010013F06E7EEC1FFE6E7E020313C06E
+13E09138007FF0ED3FF8150F153FED7FF0913801FFE04A13C0020F13004A5AEC7FF84A5A
+010313C0495BD91FFEC7FC495AEBFFF000035B481380001F90C8FCEA3FFC485AEAFFE013
+8090C9FC127C1238252F7BB230>I<EB0FFE90B512E0000314F8000F14FE4880481580EB
+F0013A7F80003FC000FEC7EA1FE0150F6C1407A3007E140F151FC8EA3FC0EDFF805C0207
+13004A5AEC1FF84A5AEC7FC05D4AC7FC495A5C13035C13075CA86D5A90C9FCA9EB01C0EB
+07F0A2497EA36D5AA2EB01C023397AB830>I<EC1FE0ECFFF8010313FE010F7F49148049
+14C090397FE01FE09038FF800F3A01FE0007F0484813039039F801F9F83907E007FF000F
+131F494813FCEA1F80495A48EBFF0F003EEBFC03903901F801FE007EEBF000EA7C034A13
+7EA2EAFC0712F84A133EA86E137E12FCD87C03147CA26E13FCD87E0114F8003EEBF80190
+3900FC03F0003FEBFF0F6C90387FFFE06D6C13C0EA0FC06D6C13800007903807FE003903
+F801F86DC7127C6C6C14FE3900FF800390387FE00F6DB512FC6D14F86D14E0010314C001
+00EBFE00EC1FF0273A7CB830>I<EC3F804A7EA44A7EA214FBA201017FA214F1A201037F
+A414E001077FA490380FC07EA4011F137F4A7EA449486C7EA4498091B5FCA490B67EA290
+38FC0007A2000181491303A3000381491301A2D87FFF90381FFFC06E5AB515E0A26C16C0
+4A7E2B397EB830>I<007FB512F0B612FE6F7E82826C813A03F0001FF815076F7E150115
+0082167EA516FE5E15015E15074B5AED7FE090B65A5E4BC7FC6F7E16E0829039F0000FF8
+ED03FCED00FE167E167F82A2EE1F80A6163F17005EA2ED01FE1503ED0FFC007FB65AB7FC
+16E05E93C7FC6C14FC29387EB730>I<007FB512E015FCB67E6F7E6C81823A03F0007FF0
+ED1FF815076F7E6F7E1500167FA2EE3F80A2161F17C0A2160FA317E01607AB160F17C0A3
+161F1780163FA2EE7F00A216FE15014B5A1507ED1FF8ED7FF0007FB65A5EB75A93C7FC6C
+14FC15E02B387FB730>68 D<007FB7128017C0B8FCA27EA2D801F8C7120FA8EE078093C7
+FCA5151E153FA490B6FCA69038F8003FA4151E92C8FCAE387FFFF080B5FCA27E5C2A387E
+B730>70 D<3B7FFF803FFFC0B56C4813E0A46C496C13C03B03F00001F800B290B6FCA690
+38F00001B3A23B7FFF803FFFC0B56C4813E0A46C496C13C02B387EB730>72
+D<007FB512FEB7FCA46C14FE390007E000B3B3A8007FB512FEB7FCA46C14FE203878B730
+>I<D87FFFEB1FFF1780B56C5AA26C497E1700D803E0EB07E0A24B5A4B5A4BC7FC5D157E
+5D4A5A4A5AA24A5A4A5A4A5A143F92C8FC147E14FE13E18013E301E77F9038EFCFC014C7
+9038FF87E0140301FE7F140101FC7FEBF800497F49137C157E818182150F821507821503
+826F7E1500D87FFF903807FF8017C0B56C5AA26C497E17802A387EB730>75
+D<387FFFF8B5FC80A25C7ED801F8C9FCB3B0160FEE1F80A9007FB7FCB8FCA46C16002938
+7DB730>I<D87FF0EC7FF06D14FF00FF16F86D5B007F16F0A2D807DE903803DF00A301DF
+130701CF149FA2EC800FA201C7141FECC01FA201C3131EECE03EA201C1133CECF07CA390
+38C0F8F8A3EC78F0147DA2EC3DE0143FA2EC1FC0A2EC0F80EC070091C7FCADD87FFC9038
+01FFF0A2486C4913F8A26C486D13F0A22D387FB730>I<D87FF890381FFFC0486C4913E0
+A27FA26C6C6D13C0D803EF903800F800A28013E7A28013E380A213E180A213E080A2147C
+A380A2141E141FA2801580A2EC07C0A3EC03E0A2140115F0A2140015F8A21578157C153C
+A2153E151EA2D87FFF131FB5EA800FA21507A26C496C5A2B387EB730>I<90383FFFE048
+B512FC000714FF4815804815C04815E09038F0007F01C0131F4848EB0FF090C71207A200
+7E1403A300FE15F8481401B3A96C1403A2007E15F0A3007F1407A26D130F6C6CEB1FE001
+F813FF90B6FC6C15C06C15806C1500000114FCD8003F13E0253A7BB830>I<007FB512E0
+B612FC15FF16C016E06C15F03903F0003FED0FF8ED03FC1501ED00FEA2167E167F163FA6
+167F167E16FEA2ED01FC1503ED0FF8ED3FF090B6FC16E016C0160015FC15E001F0C8FCB0
+387FFF80B57EA46C5B28387DB730>I<90390FF801C090397FFF03E048B512C34814F748
+14FF5A381FF007383FE001903880007F48C7123F007E141F12FE48140FA21507A46CEC03
+C0007E91C7FC127F6C7E13E0EA1FF86CB47E6C13F86CEBFF806C14F0D8003F13FC01077F
+9038007FFF020713809138007FC0153FED0FE0ED07F01503A216F80078140112FCA56C14
+0316F06C14077F6DEB0FE001F0EB3FC001FE13FF90B61280160000FD5CD8F87F13F8011F
+13E0D870011380253A7BB830>83 D<007FB712C0B812E0A53AFC001F8007A80078ED03C0
+C791C7FCB3B1010FB5FC4980A46D91C7FC2B387EB730>I<D87FFE90380FFFC0B54913E0
+A46C486D13C0D807E0903800FC00A26D130100035DA36D130300015DA36D130700005DA3
+6D130F017E5CA3017F131F6D5CA3EC803F011F91C7FCA490380FC07EA46D6C5AA4903803
+F1F8A401015B14FBA301005B14FFA36E5AA36E5A2B397EB730>86
+D<D87FF8ECFFF0486C4913F8A46C486D13F0001FC8EA07C06C6CEC0F80A76D141F000716
+00A73A03E01FC03EEC3FE0A4EC7DF0A30001153C01F0147CECF8F8A59038F1F07C000015
+78A201F914F8A2ECE03CA201FB133E017B5CECC01EA4017F131FEC800FA2013F5CA2EC00
+07011E6D5A2D397FB730>I<007FB5FCB61280A4150000FCC8FCB3B3B3A5B6FC1580A46C
+140019476DBE30>91 D<007FB5FCB61280A47EC7121FB3B3B3A5007FB5FCB6FCA46C1400
+19477DBE30>93 D<1307EB1FC0497EEBFFF8000313FE000FEBFF80D81FFD13C0D87FF813
+F039FFE03FF8EB800FEB0007007CEB01F00070EB00701D0D77B730>I<EB3FF03801FFFE
+0007EBFFC04880488048809038C00FFCEC03FE1400157F6C487F0006C77FC8121FA4EC1F
+FF0103B5FC133F90B6FC1203000FEBFC1F381FFE00EA3FF013C048C7FC12FE5AA4153F7E
+007F14FF6D5A263FE00FEBFF806CB712C0A26C14EF6C14870001D9FC00138026003FE090
+C7FC2A2A7BA830>97 D<EA7FF87F12FFA2127FA21200AAEC03F8EC1FFF027F13C091B57E
+90B612F8A29138F80FFC9138E003FE4AC67E4A7F91C7EA3F8049141F17C049140FA217E0
+A21607A7160FA26D15C0161FA26DEC3F80167F6EEBFF006E485AECE0039138F80FFC91B5
+5A01FD5C01FC5C6E13809026781FFEC7FC90380007F02B397FB730>I<49B47E010F13F0
+013F13FC497F48B6FC4815803907FE007F13F8485A485A49EB3F004848130C90C9FC5A12
+7EA212FE5AA87E127EA2127FED07806C6CEB0FC07F6C6C131F6C6C148001FC133F6CB4EB
+FF006C90B5FC6C5C6C5C013F13F0010F13C0D901FEC7FC222A79A830>I<913803FFC082
+5CA280A2EC0007AAEB01FC90380FFF87013F13E790B512F74814FF5A3807FE03380FF800
+49137F4848133F4848131F49130F48C7FC1507127E12FEA25AA77E150F127EA2007F141F
+7E6D133F6C6C137F6D13FF380FF8012607FE07EBFFC06CB7FC6C02F713E06C14E76D01C7
+13C0011F1303D903F8C8FC2B397DB730>I<EB01FE90380FFFC0013F13F090B57E488048
+803907FE01FFD9F80013804848133F4848EB1FC049130F484814E090C712075A127E16F0
+00FE14035AB7FCA516E000FCC9FC7E127E127FA26C6CEB01E06DEB03F0121F01F013076C
+6CEB0FE0D807FE131F3A03FF807FC06C90B512806C15006D5B011F5B010713F0010090C7
+FC242A7BA830>I<157F913803FFE0020F13F0143F4A13F8A2ECFF07EB01FE9138FC03F0
+903903F800C04A1300A8007FB612C0B712E0A46C15C0260003F0C7FCB3A9003FB6FCA248
+1580A26C1500A225397DB830>I<D903FC137F903A0FFF03FFC0013F13CF90B712E05A5A
+D9FE07EB07C03B07F801FE0380D9F00090C7FC4848137F497F001F8149131FA66D133F00
+0F92C7FC6D5B6C6C13FEEBF8013903FE07FC90B55A5A5D4814C0018F90C8FCEB83FC0180
+C9FCA27F12077F6CB512F015FF4815E0488148813A3FC0000FFC49EB00FE007EC8127F00
+7C8100FC81178048150FA46C151F007EED3F00007F5D6C6C14FE01E01303D81FFEEB3FFC
+6CB65A6C5D000115C06C6C91C7FC011F13FC010113C02B3E7DA730>I<EA7FF87F12FFA2
+127FA21200AAEC03F8EC1FFF027F7F91B57E01FD8090B6FC9138F80FF0ECE0074A6C7E14
+80EC0001A25BA25BB3A23B7FFFF83FFFF05DB500FC14F8A26C01F814F0812D387FB730>
+I<EB01C0EB07F0A2497EA36D5AA2EB01C090C9FCA9383FFFF0487FA47EEA0001B3A9007F
+B6128016C0B7FCA27E1680223979B830>I<EA7FF0487EA4127F1200AB0203B512805C17
+C0A21780809139001FC0004B5A03FFC7FC4A5A4A5A4A5AEC0FE04A5A4A5A4AC8FC5C01F9
+7F01FB7F90B57E14E7ECC3F0EC81F8EC00FC5B49137E497F6F7EA26F7E6F7E6F7EA23B7F
+FFF01FFFE0B56C5A17F0A217E06C497E2C387EB730>107 D<387FFFF0B57EA47EEA0001
+B3B3A8007FB612E0B712F0A46C15E024387AB730>I<903901F001F03A7F8FFC0FFC3AFF
+DFFE1FFE90B5487E92B51280A23A7FFE1FFE1F3B07FC0FFC0FC001F813F89039F007F007
+01E013E0A401C013C0B3A23B7FFC1FFC1FFC3BFFFE3FFE3FFEA43B7FFC1FFC1FFC2F2880
+A730>I<EC03F8397FF81FFFD9FC7F7F00FF90B57E01FD806CB6FC9138F80FF0C6EBE007
+4A6C7E1480EC0001A25BA25BB3A23B7FFFF83FFFF05DB500FC14F8A26C01F814F0812D28
+7FA730>I<EB01FC90380FFF80013F13E090B512F8488048803907FE03FF260FF8001380
+49137FD81FC0EB1FC0A24848EB0FE090C712074815F0007E1403A200FE15F8481401A86C
+1403007E15F0A2007F1407A26C6CEB0FE06D131F6C6CEB3FC06D137F6C6CEBFF802607FE
+0313006CB55A6C5C6C5C013F13E0010F1380D903FEC7FC252A7BA830>I<EC03F8397FF8
+1FFFD9FC7F13C000FF90B57E90B612F87E9138F80FFCC69038E003FE4AC67E4A7F91C7EA
+3F8049141F17C049140FA217E0A21607A7160FA26D15C0161FA26DEC3F80167F6EEBFF00
+6E485AECE0039138F80FFC91B55A01FD5C01FC5C6E1380DA1FFEC7FCEC07F091C9FCAD38
+7FFFF8A2B57EA26C5BA22B3C7FA730>I<903901FC01E090390FFF83F0013F13E390B512
+F34814FB4814FF481301380FF80049133F4848131F4848130F5B48C71207A2127E150312
+FE5AA77E1507127E127F150F6C7E151F6C6C133F6D137FD80FF813FF3807FE036CB6FC6C
+14FB6C14F36D13C3011F1303EB03F890C7FCAD4AB512E04A14F0A46E14E02C3C7CA730>
+I<ED0FF0D87FFFEB7FFEB50081B5FC1487028F1480149F6C9038BFF07F39001FFFC09238
+003F004A130C4A90C7FC5C5C5CA25CA45CAF007FB512FCB6FC81A25D7E29287DA730>I<
+90381FFC0E90B5129F000714FF5A5A5A387FE007EB800100FEC77E5A81A37E007F141E01
+C090C7FCEA3FF8381FFFE06C13FF000314C0C614F0010F13FC9038007FFEEC03FFEC007F
+0078EC3F8000FC141FED0FC0A27EA27E151F01C0EB3F806D137F9039F803FF0090B6FC5D
+5D00F814F0013F13C0267007FEC7FC222A79A830>I<EB0780497EAA007FB612E0B712F0
+A46C15E026000FC0C7FCB2167816FCA5ECE001ED03F8903807F0079138FC0FF06DB512E0
+7F16C06D1400EC3FFCEC07F026337EB130>I<D87FF8EBFFF06D8000FF5BA2007F7FA200
+001401B3A41503A21507150F6D131F903A7F807FFFF091B6FC6D15F8A26D01F913F00107
+13E0010090C8FC2D287FA630>I<3B7FFF803FFFC0B56C4813E0A46C496C13C03B01F000
+01F000A26D130300005DA2017C495AA36D495AA36D49C7FCA390380F803EA36D6C5AA2EC
+E0FC01035BA214F101015BA214FB01005BA214FF6E5AA3021FC8FC2B277EA630>I<3B7F
+FF800FFFF06E5AB515F8A26C16F04A7ED807C0C7EA1F00A26D5C0003153EA56D147E0001
+157CEC0FC0EC1FE0EC3FF0A32600F87F5BEC7DF8147CA214FC01786D5AA290387CF87C13
+7D157D14F0013DEB3DE0013F133FA2ECE01FA2011F5C6D486C5A2D277FA630>I<263FFF
+C0B5FC48168014E1A214C06C16003A007E001F806D49C7FCEB1F80157E6D6C5A6D6C5AEB
+03F1903801F3F0ECFFE06D5B147F6E5A92C8FCA2814A7E4A7EEB01F3ECF1F0903803E0F8
+49487E010F137C49487EEC003F496D7E017E6D7E4913073B7FFF803FFF806E4813C0B5FC
+A27E4A6C13802A277EA630>I<3B7FFF803FFFC06E4813E0B5FCA27E4A6C13C03B01F800
+01F000120015036D5C137C4B5A7FA2013F495A7FA26E48C7FC130F14C00107133EA214E0
+01035BA2EB01F05DA2EB00F85D1479147D5D143FA26E5AA36E5AA2141F92C8FCA25C143E
+A2147E147C120F486C5AEA3FC113C3EB07F0495A13FF6C5B5C6C90C9FCEA07FCEA01F02B
+3C7EA630>I<1238127C12FEB3B3B3AD127C123807476CBE30>124
+D E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fb cmmi10 10.95 3
+/Fb 3 98 df<17035F5FA25F5FA24D7EA217FF5EA2EE037FA21606160E160C04187FA216
+30EE703F166016C0A2ED0180150316001506845D031C131F15185DA25DA25D4A5A844AC7
+FC170F4AB6FC5CA20218C7120FA25C5C845CA24948140749C8FCA21306A25B131C131801
+788213FCD807FEED1FFE267FFFE00107B512F8B5FC6C5B3D417DC044>65
+D<91B712F84916FF19E090260001FEC7EA3FF04BEC07F8727E727E854A4880A21A80A24A
+48157F19FFA34A481600606118034A485D4E5A180FF01FE04A484A5A4E5ADD01FEC7FCEF
+07F84AC7EA7FE092B6C8FC18E092C7EA07F802FEEC01FE717E727E727E495A85181FA249
+5A85A349485E183FA2614948157F6118FF4D90C7FC49485D17034D5AEF1FF049484A5AEF
+FFC0017F020790C8FC007FB712FCB812F06C93C9FC413E7DBD45>I<143F903801FFC090
+3903E0E0E090390F8031F090381F001B133E49EB0FE05B485A000314074848EB0FC0A248
+5AA2001FEC1F805B123FA248C7EA3F00A400FE147EA4EDFC01481503A3913801F806127C
+1403007E150C003E1307140C6C013813186CEB70783A0781C038703A03FF801FE03A007E
+000F8028297CA730>97 D E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fc cmsy10 10.95 4
+/Fc 4 107 df<D91FE01620D97FF816703801FFFE486D7E48804814F09026E01FF815F0
+391F8007FC273E0001FE15E0003CD9007F140148EC3FC0DB0FE0EB03C00070DA07F81307
+00F0DA03FEEB1F80923A01FF807F00486E90B5FC043F5B705B04075B040113E000409238
+007F803C157BA047>24 D<153FEC03FFEC0FE0EC3F00147E5C495A495AA2495AB3AA5C13
+0F5C131F49C7FC13FEEA03F8EA7FE048C8FCEA7FE0EA03F8EA00FE133F6D7E130F801307
+80B3AA6D7EA26D7E6D7E147E80EC0FE0EC03FFEC003F205B7AC32D>102
+D<127CEAFFC0EA07F0EA00FC137E7F6D7E6D7EA26D7EB3AA1303801301806D7E147FEC1F
+C0EC07FEEC00FFEC07FEEC1FC0EC7F0014FC495A5C13035C1307B3AA495AA2495A49C7FC
+137E5BEA07F0EAFFC0007CC8FC205B7AC32D>I<126012F0B3B3B3B3B11260045B76C319>
+106 D E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fd cmbx10 10.95 52
+/Fd 52 121 df<EDFFE0020F13FC027F13FF903A01FFC01F80903A07FC0007C04948497E
+D91FE0497E4948133F834948137FA249C7FCA2705AA2705AEE078093C8FCA6EE07F8B8FC
+A4C6903880001F160FB3AD003FD9FE03B512E0A433407EBF3A>12
+D<D80780130FD81FE0EB3FC0486CEB7FE0486CEBFFF0A2486C4813F8A201FE14FCA2007F
+7FA2003F147FD81FEEEB3FDCD8078EEB0F1CD8000E1300A2491438A4491470A24914E0A2
+49EB01C0000114034848EB07804848EB0F0048C7121E001E5C001C14380018143026207D
+BE37>34 D<143CA449B47E011F13F0017F13FC90B6FC3A03FE3C7FC0D807F0EB0FE0D80F
+E0EB03F0D81F801301ED00F8D83F001478163C007E15FCED03FE150712FE150FA27EA201
+80EB07FC01C0EB03F801E0EB01F001F090C7FCEA7FFEEBFFFC806CEBFFE015F86C806C14
+FF16806C15C06C15E0C6FC6D14F0131F010314F8EB003F16FCEC3C3F151FED0FFE001F14
+07D87FC013031501EAFFE01500A313C016FC1380EA7E000078EC01F8127C003C15F0003E
+14036CEC07E0D80FC0EB0FC0D807E0131FD803FEEBFF006CB55A6C6C13F8011F13E00103
+90C7FCEB003CA427497AC334>36 D<EC01FCEC07FF021F7F91387F83C09138FE01E09038
+01FC0049487F13071678495AA3131FA2167016F05E15016E485AA24B5A4BCAFC010F131E
+6E5A4B91381FFFFE5D6DB45A5D4B9138007F006D90C9123C6F157C616D6D5D4E5A496D14
+03495F496C6C4A5A011E6D140FD93C3F93C7FC01FC6D141E48486C6C143E00036D6C5C00
+076F137848486C5D001F6DEBC001003F6F485A6E6D485A007F6D01F85B6F6C48C8FC00FF
+6E6C5A031F133E6F6C5A6F5B6D6D49143C6F5B007F6E13F8706C14786C6C6F14F86C6C49
+B513016DD90FF39038C003F000079026807FE19038F80FE06C90B5D8807FB512C0C69126
+FE000F1480013F01F00103EBFE00010390C8EA3FF047417CBF51>38
+D<1407140F141E143C147CEB01F8EB03F014E0EB07C0130FEB1F80EB3F00A2137E13FE5B
+12015B12035B1207A2485AA3121F5BA2123FA3485AA612FFB0127FA66C7EA3121FA27F12
+0FA36C7EA212037F12017F12007F137E7FA2EB1F80EB0FC01307EB03E014F0EB01F8EB00
+7C143C141F140F1407185A76C329>40 D<126012F012787E123E6C7E6C7E12076C7E7F6C
+7E6C7EA2137E137F7F1480131F14C0130F14E0A2EB07F0A314F81303A214FCA3EB01FEA6
+14FFB014FEA6EB03FCA314F8A2130714F0A3EB0FE0A214C0131F1480133F14005B137E5B
+A2485A485A5B485A120F485A003EC7FC123C5A5A1260185A7AC329>I<14F8497EA2497E
+6D5AA4007CEC01F000FEEC03F839FF00F80701C0131F01E0133F01F0137F9038FCF9FF26
+3FFEFB13E00007B61200000114FCD8003F13E0010790C7FCA2013F13E048B512FC000714
+FF263FFEFB13E026FFFCF913F89038F0F87F01E0133F01C0131F0100130739FE01FC0300
+7CEC01F0000091C7FCA4497E6D5AA26D5A252879C334>I<16F04B7EB3AD007FBA12E0BB
+12F0A46C19E0C8D801F8C9FCB3AD6F5A44467AB951>I<B612E0A81B087F9723>45
+D<EA0780EA1FE0EA3FF0EA7FF8A2EAFFFCA4EA7FF8A2EA3FF0EA1FE0EA07800E0E798D1D
+>I<ECFFE0010713FC011F13FFD97FE013C09039FF803FE03A01FE000FF000038148486D
+7E491303000F81001F81A348486D1380A3007F16C0A500FF16E0B3A2007F16C0A5003F16
+80A26D5B001F1600A2000F5D6D130700075D6C6C495A6C6C495A6C6D485A90397FE0FFC0
+011FB5C7FC010713FC010013E02B3D7CBB34>48 D<141E143E14FE1303131FEA03FFB5FC
+A213E7EAFC071200B3B3AA007FB612F0A4243C78BB34>I<903803FF80011F13F090B512
+FE00036E7E2607FC077F260FE00113F0261F80007F48C76C7E6D133FD87FE06D7E7F00FF
+816D7F1780A46C5A6C5A6C5A0007C7FCC81400A25D5EA24B5A5E4B5A4B5A5E4A5B4A90C7
+FC5D4A5AEC0FF04A5A4A5A4AC8FC14FE4948EB0780495A5CD907C0EB0F00495A49C7FC13
+3E495C13F048B7FC485D5A5A5A5A5AA2B75AA3293C7BBB34>I<ECFFE0010F13FC013FEB
+FF80D9FF0113E03A01F8007FF0D803E06D7E48486D7E13F0486C807F486C80A5120F495C
+1207EA03F0C8485A5EA24B5A5E4B5A4A90C7FCEC0FFC903807FFF015FE6F7ED9000113E0
+9138007FF86F7E6F7E6F7EA217806F13C0A3D8078015E0EA1FE0487E487EA2487EA217C0
+A36C484913805B6C48150049495A001F143FD80FF0EB7FF83A07FE01FFF00001B65A6C15
+80011F01FCC7FC010113C02B3D7CBB34>I<ED01F0A215031507150F151FA2153F157F15
+FFA25C5C5CEC0FBF153F141E143C147C147814F0EB01E0130314C0EB0780EB0F005B133E
+133C5B5B12015B485A485A120F48C7FC121E5A5A12F8B812F8A4C8387FF000AB49B612F8
+A42D3C7DBB34>I<EA0780EA1FE0EA3FF0EA7FF8A2EAFFFCA4EA7FF8A2EA3FF0EA1FE0EA
+0780C7FCACEA0780EA1FE0EA3FF0EA7FF8A2EAFFFCA4EA7FF8A2EA3FF0EA1FE0EA07800E
+2879A71D>58 D<EB0FFF90B512F0000314FC390FF007FF261F80011380D83E0014C0003F
+6D13E0487E7F486C14F0A46C5A16E06C5A260E000113C0C7FC4A13804A1300EC0FFC15F0
+4A5A5D4A5A92C7FC147E147C5CA25CA213015CA990C9FCA8EB01E0EB07F8497E497EA249
+7EA46D5AA26D5A6D5AEB01E024407ABF31>63 D<16FCA24B7EA24B7EA34B7FA24B7FA34B
+7FA24B7FA34B7F157C03FC7FEDF87FA2020180EDF03F0203804B7E02078115C082020F81
+4B7E021F811500824A81023E7F027E81027C7FA202FC814A147F01018291B7FCA24982A2
+D907E0C7001F7F4A80010F835C83011F8391C87E4983133E83017E83017C8148B483B500
+FC91B612FCA4463F7CBE4F>65 D<B812F8EFFF8018F018FC26003FFCC7EA3FFEEF0FFF71
+13807113C019E08319F08319F8A719F05FA24D13E019C04D13804D13004D5AEFFFF891B7
+12E095C7FC18F002FCC7EA3FFE943807FF807113C07113E07113F0F07FF819FC183F19FE
+A219FFA819FEA2187F19FCF0FFF85F4D13F04D13E0053F13C0BA120018FC18F095C7FC40
+3E7DBD4A>I<BAFCA426003FFEC7001F138017031700187F183F181F180F19C01807A218
+03A2EE03C0A219E01801A3040790C7FCA2160F161F167F91B6FCA49138FE007F161F160F
+1607A20403143CA31978A393C8FCA219F819F0A21801A21803A21807F00FE0181F187FEF
+01FF171FBAFC19C0A33E3D7DBC45>69 D<B912FEA426003FFEC7EA3FFF17071701838484
+841980180FA21807A3EE078019C01803A395C7FC160FA2161F163F16FF91B6FCA44AC6FC
+163F161F160FA21607A693C9FCAEB712E0A43A3D7DBC42>I<922607FFC0130E92B500F8
+131E020702FF133E021FEDC0FE027F9038003FF1902601FFF0EB07FB010701C0EB00FF49
+90C8127FD93FFC153F4948150F49481507485B4A1503481701485B18004890CAFC48187E
+A25B003F183EA2127F5B96C7FCA212FFAB0407B612FC127FA27F93C7383FFE00123FA212
+1F7FA27E6C7FA26C7F6C7FA26C7F6D7ED93FFE157FD90FFF15FF6D01C05B010101F05B6D
+6CB4EB1FF1021F90B512C00207ED003E020002FC130E030701C090C7FC46407ABE52>I<
+B71280A426003FFEC7FCB3B3B2B71280A4213E7DBD28>73 D<B712E0A426003FFEC9FCB3
+AF181EA4183CA4187CA318FCA2EF01F8A217031707170F173F17FF1607B912F0A4373E7D
+BD3F>76 D<B500FE050FB512C06E5F6F5EA2D8003F97C7FC6F1677A2013E6D16E7A26E6C
+ED01C7A26E6CED0387A36E6CED0707A26E6C150EA26E6C151CA26E6D1438A36E6D1470A2
+6E6D14E0A26F6CEB01C0A26F6CEB0380A36F6CEB0700A26F6C130EA26F6C5BA26F6D5AA3
+6F6D5AA26F6D5AA293387FF1C0A293383FFB80A370B4C7FCA2705AA2705AA2705A137FB6
+0080031FB612C0705AA2705A5A3E7CBD63>I<ED3FFF0203B512F0021F14FE913A7FF807
+FF80902701FFC00013E0010790C7EA3FF8D90FFCEC0FFCD93FF86EB4FC49486E7F49486E
+7F48844A8048496F7E488491C9123F4884488449161FA2003F84A34848701380A400FF19
+C0AD007F19806D5EA3003F1900A26D5E6C60A26C6D4B5AA26C6D4B5A6C606E5C6C606C6D
+4A5B6D6C4A5BD93FFE021F90C7FC6D6C4A5A010701C0EBFFF80101D9F80713E06D90B65A
+021F4AC8FC020314F0DA003F90C9FC42407ABE4F>79 D<B812C017FCEFFF8018F028003F
+FC000113FC9338003FFE717E05077F717F85A2717FA285A761A24D5BA24D5B61DD1FFEC8
+FC4D5A933803FFF091B712C04DC9FCA2913AFC0007FF8004017F7013F0717E84173F8417
+1F84A685A5F20180F203C019C083A271EC078019E0B76D9038F00F000500EBF81E95387F
+FFFC060F5BCC13E04A3F7DBD4E>82 D<903A01FF8001C0011FEBF803017FEBFE0748B612
+8F489038007FDFD807F8EB0FFF484813034848130049147F003F153F49141F127F160F16
+0712FFA36D1403A27F7F01FC91C7FC6CB4FC14F8ECFF806C14FCEDFF806C15E0826C15FC
+6C816C816C16806C7E011F15C0010715E0EB007F020314F0EC003F1503030013F8167F16
+3F127000F0151FA2160FA36C16F0A36C16E06C151F6C16C07F6DEC3F8001F0147F01FCEC
+FF003AFEFFE007FED8FC3FB512F8D8F80F14E0D8F003148027E0001FFCC7FC2D407ABE3A
+>I<B600FE020FB512C0A4C66C90C9383FC000735A6D6D4BC7FC6D6D157EA26D6D5D6D6D
+4A5A816D4C5A6D6D4A5A816D4C5A6E6C4A5A6E7F4EC8FC6E6D137E6E7F606E6D485A6E13
+F84D5A6E6D485A6E13FE70485A6F495A6F139F05FFC9FC6F5B815F6F5B816F5B5FB3A302
+07B612F8A44A3E7EBD4F>89 D<B5FCA6EAFC00B3B3B3B3A7B5FCA6105B76C31D>91
+D<1304130E131FEB7FC0497E487F487F487F380FF1FE393FC07F80397F803FC039FE000F
+E04813070070EB01C00020EB00801B0F74BE34>94 D<903807FF80013F13F848B512FE3A
+03FC01FF803A07E0007FC0486C6D7E6D6D7E486C6D7EA28215076C4880A26C5AEA01C0C8
+FCA3EC3FFF0103B5FC131F9038FFFC074813E000071380380FFE00485A485A485AA25B12
+FFA3150FA2007F141F6D131D6C6C903839FF806C6C01F813FE390FFE03F00003B5EAC03F
+C6EC000FD90FFC90C7FC2F2B7DA933>97 D<EA01FE12FFA412071203B04AB47E020F13F0
+023F13FE91397F01FF809139F8007FC0D9FFE06D7E4A6D7E4A6D7E91C77F707EA2838218
+80A318C0AA1880A34C1300A25FA26E495A4C5A6E5C6E495AD9FCF8EBFFC09026F87E0390
+C7FC9039F03FFFFCD9E00F13F0C7000190C8FC32407CBE3A>I<EC7FF00103B5FC011F14
+C090393FE01FE09039FF8003F04890380007F84848130F0007EC1FFC485A121F5B003FEC
+0FF8A249EB07F0007FEC01C092C7FCA212FFAA127FA36C7E161E121F7F000F153C6C6C14
+7C16F8D801FFEB01F06C90388003E090397FE01FC0011FB512800107EBFC009038007FE0
+272B7DA92E>I<EE0FF0ED07FFA4ED003F161FB0EC3FF0903803FFFC010F13FF90393FF0
+1FDF9039FFC003FF48EB000148487F0007157F4848143F485AA2123FA2485AA312FFAA12
+7FA3123F7F121FA26C6C147F000715FF6C6C5B6C6C497F6C6D48EBFFC090397FE03FBF90
+391FFFFE3F010313F89026007FE0EBC00032407DBE3A>I<EC7FE0903807FFFC011F13FF
+90397FE07FC09039FF801FE048496C7E48486D7E48486D7E120F48486D7EA2003F815B00
+7F80A21780A212FFA290B7FCA301F0C9FCA4127FA46C7EEE0780121F120F6DEC0F000007
+5D6C6C143E6C6C5C6C9038C001F890393FF00FF0010FB512C0010391C7FC9038003FF029
+2B7DA930>I<EC0FF8EC7FFF49B51280903907FC1FC090390FF03FE0EB1FE090393FC07F
+F01480137FA29138003FE05BED0F8092C7FCABB612E0A4C60180C7FCB3AE003FEBFF80A4
+24407DBF20>I<903A03FF8007F0011F9038F03FF8017F9038FCFFFC3B01FF01FFF8FE48
+486C13C04848137F484890383FE0FC177C484890381FF000A2003F81A7001F5DA26C6C49
+5AA26C6C495A6C6C495A6D4890C7FCECFFFCD8079F13F00103138048CAFCA47F7F7F90B5
+12FE6CECFFE016FC6C15FF17806C16C04816E0120F271FE0000113F0D83F80EB001F48C8
+120FEE07F800FE1503A5007E16F0007F15076C6CEC0FE06D141F6C6CEC3FC0D80FF8ECFF
+803B03FF800FFE00C690B512F8011F14C0010101FCC7FC2F3D7DA834>I<EA01FE12FFA4
+12071203B0ED3FF0EDFFFE02036D7E91390FC07FC04AC66C7E143C4A804A131F5C6D4880
+A25CA291C7FCB3A6B5D8FC07B512E0A4333F7CBE3A>I<EA01E0EA07F8487E487EA2487E
+A46C5AA26C5A6C5AEA01E0C8FCA913FE12FFA412071203B3ADB512F0A414407BBF1E>I<
+EA01FE12FFA412071203B3B3B1B512F8A4153F7BBE1E>108 D<D801FED93FF049B47E00
+FFDAFFFE010713F002039026FF801F13FC913C0FC07FC07E03FE913C1F003FE0F801FF00
+07013CECE1E0000349DAF3C014804A90391FF780004A92C7FC6D4802FE15C0A24A5CA291
+C75BB3A6B5D8FC07B5D8E03F13FFA450297CA857>I<D801FEEB3FF000FFECFFFE02036D
+7E91390FC07FC04AC66C7E0007133C000349804A131F5C6D4880A25CA291C7FCB3A6B5D8
+FC07B512E0A433297CA83A>I<EC7FF0903803FFFE011FEBFFC090397FE03FF09039FF80
+0FF848496C7E48486D7E48486D7E48486D1380001F16C0A2003F16E049147F007F16F0A4
+00FF16F8AA007F16F0A46C6CECFFE0A2001F16C0000F16806D5B6C6C4913006C6C495A6C
+6D485A3A007FE03FF0011FB512C0010791C7FC9038007FF02D2B7DA934>I<3A01FE01FF
+8000FF010F13F0023F13FE91397F03FF80DAF8007F2607FFE06D7E6C496D7E4A6D7E91C7
+6C7E83A2707EA21880A28218C0AA18805EA21800A24C5AA26E495A5F6E495A6E495A02F8
+495ADA7E0790C7FC91383FFFFC020F13F0020190C8FC91CAFCADB512FCA4323B7CA83A>
+I<DA3FE01370902603FFFC13F0010FEBFE0190393FF81F839039FFC007C34890388003E7
+4890380001EF4848EB00FF000F157F485A163F485AA2127F161F5B12FFAA127F7FA2123F
+163F6C7E167F120F6C6C14FF6C6C5B6C6D5A6C6D5A90397FF03F3F90381FFFFE010313F8
+9038007FC091C7FCAD030FB512C0A4323B7DA837>I<3901FC03F800FFEB0FFF4A13C091
+383C1FE0EC783F00079038F07FF03803FDE014C0EBFF80ED3FE0A29138001FC0ED070092
+C7FCA25BB3A4B512FEA424297CA82B>I<90381FFC0E90B5123E000314FE380FE007381F
+8000003EC7127E153E5A151E12FCA27E7E6D90C7FC13E06CB47E14FC6CEBFF8015E06C80
+6C14FC000380C680133F01031480EB000F020113C00070EB007F00F0143F151F6C140FA3
+6C1580A27E6CEC1F006D133E6D137E9038F803FC00FCB512F0D8F83F13C026E007FEC7FC
+222B7DA929>I<EB0780A5130FA4131FA3133F137FA213FF5A1207001FEBFFFEB6FCA300
+01EB8000B3A2150FA96C141E14C0017F131C90383FE03CECF07890380FFFF0010313E090
+38007F80203B7EB929>I<01FFEC07F8B5EB07FFA40007EC003F6C151FB3A7163FA2167F
+7E16EF6CD980017F923903CFFFE090397FE01F8F011FB5120F010713FC010001E0EBF000
+332A7CA83A>I<B500F890381FFFC0A400030180903803F0006C6F5A6E13036C5E80017F
+4A5AA26E130F013F92C7FC6E5B011F141E6E133E010F143C6E137C010714786E13F86D5C
+15816D5C15C16DEBC3C0A215E7027F5B15FF6E90C8FCA26E5AA26E5AA26E5AA26E5AA26E
+5A32287EA737>I<B5D8F801B5FCA40001903980003FC06C6D91C7FC6D6C133E6D6C5B6E
+5B6D6C485A010F495A6D6C485A903803FF0F6DEB9F8003FFC8FC6D5B6E5A6E5A141F6E7E
+81814A7F5C027E7F91387C7FE04A6C7ED901F07F49486C7E49486C7E90380F8007011F6D
+7E49486C7F017E81017C6D7FD801FC6E7EB5D88003B512C0A432287EA737>120
+D E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fe cmr10 10.95 76
+/Fe 76 123 df<DA03FFEB0FE0021F9038C07FF8913AFE00F1F81CD901F890383BE03ED9
+07E090387FC07F49489038FF80FF49485AD93F005C013E167E017E163C6F48130049147E
+AEB91280A3D800FCC7007EC7FCB3AE486C14FF277FFFF83F13FFA338407FBF35>11
+D<EC03FC91383FFF809138FE03C0903901F00060D907E07FD90F8013F84948487E491303
+133E137EA2496D5A6F5A93C7FCABED01FCB7FCA33900FC000315011500B3AC486C497E3B
+7FFFF87FFFF8A32D407EBF33>I<DA03FEEB01FE913B1FFF801FFFC0913BFE01E07F01E0
+903C01F00070F80030D907E0D91BF07FD90F80D97FC0137C011F4A4813FE494848140101
+3E1500137EA2496D486D5A047E147896C7FCAB19FEBAFCA3D800FCC7387E00011800197E
+B3AC486C02FF14FF277FFFF83FD9FC3F13FCA346407EBF4C>14 D<001E130F003FEB1F80
+397F803FC039FFC07FE0A201E013F0A2007F133F393F601FB0001EEB0F3000001300A549
+1360A3484813C0A23903000180A20006EB0300A2481306485B485B002013101C1C7DBE2D
+>34 D<14E0A4EB07FC90383FFF804913E03901F8E3F03903E0E078D80780131CD80F007F
+001E8081481580007C14011278ED06C000F8140F151F153FA36CEC1F80ED0F0092C7FC12
+7E127FA2EA3FC013E0EA1FFE13FF6C13FC6C13FF6C14C06C806C6C7F011F7F01037F0100
+7F14E7ECE1FFECE07FED3F80151FA2ED0FC01218123C007E1407B4FCA35A5A00C0158012
+60150F16006C5C151E6C5C121C6C14F8390780E1F03903F0EFE0C6B51280D93FFEC7FCEB
+0FF8EB00E0A422497BC32D>36 D<EC0F80EC3FC0ECF06049487E49487EA2EB0780010F7F
+A3131F1400A314805DA35D5DA2010F5BECC180A202C3CAFC14C6D907EC91383FFFFC14F8
+A24A020313C00103923800FE0018786D6C157001031660496C15E0010C5E496C4A5AEB30
+7ED9607F4AC7FCD9E03F1406D801C07F0003011F5C01807F00076D6C5B000F01075CD81F
+007F486D6C5B48010114E06F5B6E6C485A48DA7F03C8FCA2ED3F86ED1FCCDB0FF814186D
+1307007F6E5A7014386F6C14306C6C496C1470001FDA0F7F14E06C6C90391E1FC0016C6C
+903AF80FE003C03D03FC07F007F80F806CB5D8C001B512006C6C90C7EA7FFCD90FF8EC0F
+F03E437CC047>38 D<121E123FEA7F80EAFFC0A213E0A2127FEA3F60121E1200A513C0A3
+EA0180A2EA0300A21206A25A5A5A12200B1C79BE19>I<1430147014E0EB01C0EB0380EB
+0700130EA25B5B1378137013F05B1201485AA2485AA348C7FCA35A121EA2123EA2123CA2
+127CA5127812F8B21278127CA5123CA2123EA2121EA2121F7EA36C7EA36C7EA26C7E1200
+7F1370137813387F7FA27FEB0380EB01C0EB00E014701430145A77C323>I<7E7E7E1270
+7E7E7EA27E6C7E7F12017F12007F1378A27FA37FA3131F7FA21480A21307A214C0A51303
+14E0B214C01307A51480A2130FA21400A25B131EA35BA35BA25B5B12015B12035B48C7FC
+120EA25A5A5A5A5A5A135A7AC323>I<EB03C0A2805CA600F0140F00FC143F00FE147F00
+FF14FF393FC3C3FC390FE187F03903F18FC03900FDBF00EB3FFCEB0FF0EB03C0EB0FF0EB
+3FFCEBFDBF3903F18FC0390FE187F0393FC3C3FC39FF03C0FF00FE147F00FC143F00F014
+0F00001400A6805CA220277AC32D>I<1506150FB3A9007FB912E0BA12F0A26C18E0C800
+0FC9FCB3A915063C3C7BB447>I<121E123FEA7F80EAFFC0A213E0A2127FEA3F60121E12
+00A513C0A3EA0180A2EA0300A21206A25A5A5A12200B1C798919>I<B512FEA517057F95
+1E>I<121E123FEA7F80EAFFC0A4EA7F80EA3F00121E0A0A798919>I<ED0180ED03C0A215
+071680A2150F1600A25D151EA2153E153CA2157C157815F85DA214015DA214035DA21407
+5DA2140F92C7FCA25C141EA2143E143CA2147C1478A214F85CA213015C13035CA213075C
+A2130F91C8FCA25B131EA2133E133CA2137C1378A213F85BA212015BA212035BA212075B
+120F90C9FCA25A121EA2123E123CA2127C1278A212F85AA21260225B7BC32D>I<EB01FE
+90380FFFC090383F03F090387C00F849137C48487F48487F4848EB0F80A2000F15C04848
+EB07E0A3003F15F0A290C712034815F8A64815FCB3A26C15F8A56C6CEB07F0A3001F15E0
+A36C6CEB0FC0A26C6CEB1F80000315006C6C133E6C6C5B017C5B90383F03F090380FFFC0
+D901FEC7FC263F7DBC2D>I<14C013031307131F137FEA07FFB5FC139FEAF81F1200B3B3
+ACEB7FF0B612F8A31D3D78BC2D>I<EB07FC90383FFF8090B512E03901F01FF039038003
+FC48486C7E000C6D7E48EC7F8012380030EC3FC012700060EC1FE0A212FE6C15F07F150F
+A36CC7FC003E141F121CC813E0A3ED3FC0A2ED7F8016005D5D4A5A5D4A5A4A5A4A5A5D4A
+C7FC143E5C14F0495A5C495A49C8FC010E14305B5B5B4914605B485A48C8FC000615E000
+0FB6FC5A5A4815C0B7FCA3243D7CBC2D>I<EB07FC90383FFF809038F80FE03901C003F8
+48C66C7E00066D7E48147F481580EA1F80486C14C06D133FA46C5A6C48137F6CC71380C8
+FCA216005D5D5D4A5A5D4A5AEC0FC0023FC7FCEB1FFCECFF809038000FE0EC03F0EC01FC
+6E7E157F1680153F16C0A2ED1FE0A216F0A2120C123F487E487EA316E05B153F6CC713C0
+12606CEC7F80003815006C14FE6C495A3907C003F83903F80FF0C6B55A013F1380D907FC
+C7FC243F7CBC2D>I<150EA2151E153EA2157E15FEA214011403157E1406140E140C1418
+14381430146014E014C0EB0180130314001306130E130C5B133813305B13E05B485A1203
+90C7FC1206120E120C5A123812305A12E0B8FCA3C8EAFE00AC4A7E49B6FCA3283E7EBD2D
+>I<00021403D807C0130F01F813FE90B55A5D5D5D158092C7FC38063FF890C9FCADEB01
+FE90380FFF8090383E03E090387001F09038C00078D80780137C90C77E153F0002EC1F80
+C8FC16C0A2ED0FE0A316F0A4123E127F5A7FA290C713E0A248141F006015C0A200701580
+0030143F003815000018147E000E5C6C495A3903C003F03901F00FE06CB55A013F90C7FC
+EB07F8243F7CBC2D>I<EC1FE0ECFFF8903803F01C903807800690381F0003013EEB0180
+49130F49EB1FC04848133FA2485A120749EB1F80000FEC0F0092C7FC485AA2123FA348C9
+FCA2EB01FE903807FF8090380E03E039FF1800F049137849137C8149133FED1F80A24914
+C0150F16E0A290C7FC16F0A47EA57E7F16E0A2121FED1FC0120F6D14800007EC3F007F00
+03147E6C6C137C6C6C485A90387E07F090383FFFC0010F5BD903FCC7FC243F7CBC2D>I<
+12301238123E003FB612FCA316F84815F0A216E00070C812C00060EC0180A2ED03001506
+5A5D5DA2C85A5D15E05D4A5A140392C7FC1406A2140E5CA2143C14381478A214F85CA213
+01A21303A3495AA4130FA6131FA96D5A6D5A26407BBD2D>I<EB03FC90381FFF8090383C
+03E09038E000F04848133C48C77E4880120EED07805AED03C0A2123CA3123EA2003FEC07
+807FD81FE014006D5B6C6C131E01FE131C6C6C5B6CEBC0F06CEBE1E06CEBFF806D48C7FC
+6D7E010F7F15E0497F017813FC9038E03FFE48486C7E3803800748486C1380000E010013
+C0001E147F48EC1FE00038140F00781407ED03F0481401A31500A416E01278ED01C07EED
+03807E6CEC07006C6C131ED803E0137C3901FC03F039007FFFE0011F1380D903FCC7FC24
+3F7CBC2D>I<121E123FEA7F80EAFFC0A4EA7F80EA3F00121EC7FCB3121E123FEA7F80EA
+FFC0A4EA7F80EA3F00121E0A2779A619>58 D<EB1FF890B5FC3903E01FC039070007F000
+0CEB01F84814FC4813004814FE127C00FE14FF7EA4127E003C14FEC7120115FC140315F8
+EC07E0EC0FC0EC1F801500143E143C5C147014F05C495AA35C1303A291C7FCA990C8FCA9
+EB0780497E497E497EA46D5A6D5A6D5A20407BBF2B>63 D<1507A34B7EA34B7EA24B7EA3
+4B7E156FA2EDEFF815C7A291380187FC1583A291380303FE1501A291380600FFA34A6D7E
+A34A6D7EA34A6D7EA20270800260130FA202E0804A1307A201018191B6FCA2498191C712
+01A201068182A2496F7EA3496F7EA3496F7EA21370717E13F0486C82D80FFEED3FFCB500
+E0010FB512F8A33D417DC044>65 D<B712FCEEFF8017F00001903980000FF86C6CC7EA03
+FEEE00FFEF7F80EF3FC018E0171F18F0170F18F8A31707170FA318F0171F18E0173F18C0
+EF7F80EFFF00EE03FCEE0FF8EE7FE091B6C7FC17E091C7EA03FCEE00FEEF7F80EF3FC0EF
+1FE0EF0FF018F8170718FC1703A218FEA718FC1707A2EF0FF8EF1FF0A2EF3FE0EFFFC04C
+138048486C90380FFE00B85A17E094C7FC373E7DBD40>I<DB3FF01306913803FFFE020F
+9038FF800E913A3FF007E01E9139FF8000F0D901FCC7EA383ED907F0EC0C7E4948140649
+48EC03FE4948140149C9FC13FE4848167E0003173E5B4848161E120FA24848160EA2123F
+5B1806127FA349160012FFAC127F7F1806A2123FA27F121F180C6C7EA2000717186C7E6D
+1638000117306C6C1660137F6D6C15C06D6CEC01806D6CEC03006D6C140ED901FC5C6DB4
+6C13F891393FF007F0020FB512C0020391C7FC9138003FF037427BBF42>I<B712FCEEFF
+8017E000019039C0001FF86C6C48EB03FEEE00FFEF3F80717E717E717E717E717EA2717E
+84841980183F19C0A3F01FE0A519F0AB19E0A4183F19C0A21980187FA2190018FEA24D5A
+4D5A17074D5A4D5A4D5A05FFC7FCEE03FE48486CEB1FF8B85A178004FCC8FC3C3E7DBD45
+>I<B912E0A3000101C0C7FC6C6C48141FEF07F01703170117001870A31830A418181618
+A41800A21638A2167816F8150391B5FCA3EC8003150016781638A21618A21806A3180C93
+C7FCA4181C1818A21838A21878A218F0170117031707171F48486CEB01FFB912E0A3373E
+7DBD3E>I<B91280A300019038C000036C6C48EB003FEF1FC017071703A21701A31700A4
+1860A21630A31800A31670A216F01501150791B5FCA3EC8007150115001670A21630A693
+C8FCAF3801FFE0B612F0A3333E7DBD3B>I<B6D8C01FB512F8A3000101E0C7383FFC0026
+007F80EC0FF0B3A691B7FCA30280C7120FB3A92601FFE0EC3FFCB6D8C01FB512F8A33D3E
+7DBD44>72 D<B612F0A3C6EBF000EB3FC0B3B3B2EBFFF0B612F0A31C3E7EBD21>I<B600
+C090381FFFFCA3000101E0C70007138026007F80913801FC0018F06018804DC7FC17065F
+5F5F5F5F4C5A4CC8FC16065E5E5E5E5E4B5A15074B7E4B7E153FED6FF0EDCFF8EC818791
+388303FC02867FEC8C0191389800FF02B08002E0137F4A6D7E4A80161F707E831607707E
+831601707E84177F717E717E84170F717E841703844D7E2601FFE04A13C0B600C090B6FC
+A3403E7DBD47>75 D<B612F8A3000101E0C9FC38007F80B3B0EF0180A517031800A45FA3
+5FA25F5F5F17FE160348486C133FB8FCA3313E7DBD39>I<B56C93387FFFC06E93B5FCA2
+0001F1E00026006FE0923801BF80A3D967F0ED033FA2D963F81506A3D961FC150CA3D960
+FE1518A2027F1530A36E6C1460A26E6C14C0A36E6CEB0180A36E6CEB0300A26E6C1306A3
+6E6C5BA36E6C5BA2037F5BA36F6C5AA36F6C5AA292380FE180A3DB07F3C7FCA2ED03FEA3
+6F5AA213F0486C6D5AD807FEEFFFE0B500F00170017FEBFFC0A34A3E7CBD53>I<B56C91
+387FFFF880A2C66C6C020313006EEC00FC016F1678D967F81530801363EB61FE8001607F
+147F6E7E81141F6E7E8114076E7E8114016E7E82157F6F7E82151F6F7E826F7E15036F7E
+8281EE7F8017C0163FEE1FE017F0160FEE07F817FC1603EE01FE17FF82EF7FB018F0173F
+171F170FA217071703A201F01501486C1500EA07FEB500F015701830A23D3E7DBD44>I<
+ED7FE0913807FFFE91391FC03F8091397E0007E0D901F8EB01F8D907F0EB00FED90FC014
+3F49486E7E49C86C7E017E6F7E01FE8248486F7E49150100038348486F7EA24848167FA2
+001F1880A24848EE3FC0A3007F18E049161FA300FF18F0AC007F18E06D163FA4003F18C0
+6D167F001F1880A26D16FF000F1800A26C6C4B5A00035F6D150300015F6C6C4B5A017F4B
+5A6D6C4A5A6D6C4A5A6D6C4AC7FC6D6C14FED901F8EB01F8D9007EEB07E091391FC03F80
+912607FFFEC8FC9138007FE03C427BBF47>I<B712F8EEFF8017E000019039C0001FF86C
+6C48EB03FC707EEE007FEF3F8018C0EF1FE0A218F0170F18F8A818F0171F18E0A2EF3FC0
+1880EF7F00EE01FEEE07FCEE3FF091B612C04CC7FC0280C9FCB3A73801FFE0B612C0A335
+3E7DBD3E>I<B712C016FCEEFF8000019039C0007FE06C6C48EB0FF0EE03FC707E707E71
+7E717EA284171F84A760173F6060177F4DC7FCEE01FC4C5AEE0FE0EEFF8091B500FCC8FC
+5E91388000FFEE3F80EE0FE0707E707E707EA283160083A684A61906A2EF7FC0A2053F13
+0C3801FFE0B600C0EB1FE0050F1318943803F870CA3801FFE09438003F803F407DBD43>
+82 D<D907FC131890381FFF80017FEBE0383A01FC03F0783903F0007CD807C0EB1EF848
+48130748C712031501123E15005A1678A200FC1538A46C1518A37E6C6C14007F6C7E13F8
+6CB47E14F86CEBFF806C14F06C14FC6C14FF6C6C14806D14C0010714E0D9007F13F00207
+13F8EC007FED0FFC1507ED01FEA21500167F124012C0163FA47EA2163E7E167E6C157C7E
+16F8B4EC01F0D8FB8014E0D8F9E0EB03C0D8F0F8EB0F8090397F803F0039E01FFFFED8C0
+0713F89038007FC028427BBF33>I<003FB91280A3903AE0007FE00090C76C48131F007E
+EF0FC0007C17070078170300701701A300601700A5481860A5C81600B3B14B7E4B7E0107
+B612FEA33B3D7DBC42>I<B600C090387FFFF8A3000101E0C70003130026007F80EC00FC
+18781830B3B3A4013F5EA280011F16E060130F6E4A5A010715036D6C92C7FC6E14060101
+150E6D6C5C027F147891391F8001F091390FF00FC00203B55A020049C8FCED1FF03D407D
+BD44>I<B6913807FFFEA3000301E0020013E0C60180ED3F80F01F00017F160E180C6E15
+1C013F1618A26D6C5DA280010F5EA26E15E001075EA26D6C4A5AA28001014BC7FCA26E5C
+6D150681027F5CA26F131C023F1418A26F1338021F143081020F5CA26F13E002075CA26E
+6C485AA215FE020149C8FCA26F5A6E1306A2ED7F8CA216CCED3FD8A216F86F5AA26F5AA3
+6F5AA36F5AA23F407EBD44>I<007FB5D8C003B512E0A3C66C48C7387FFC00D93FF8EC1F
+E06D48EC0F806D6C92C7FC170E6D6C140C6D6C5C17386D6C14306D6D5B17E06E6C5B023F
+495AEDE003DA1FF090C8FC020F1306EDF80E6E6C5A1618913803FE386E6C5A16606E13E0
+6F5AA26F7E6F7EA26F7E4B7EA2ED33FEED71FF156103C07F0201137F03807F4A486C7E5C
+02066D7E4A6D7E141C02186D7E4A6D7E147002606D7E4A6D7F13014A6E7E49C86C7E5B01
+066F7E010E6F7E133F496C812607FFC0EC3FFFB500F80103B512FEA33F3E7EBD44>88
+D<B66C49B51280A3000101F0C8383FF8006C6C48ED1FC0013F70C7FC180E6D6C150C181C
+6D6C15186D6C153818306D6C5D6E15E06D5E6D6D1301606E6C49C8FC6E6C5B17066E6C13
+0E170C6E6C5B6E7E5F6E6C13706F13606E14E06E6D5AEE8180ED7FC3DB3FE3C9FC16E7ED
+1FF616FC150F6F5AB3A4ED1FFC020FB512FCA3413E7FBD44>I<EAFFFCA4EAF000B3B3B3
+B3ABEAFFFCA40E5B77C319>91 D<6D1340000114C039030001800006EB0300481306A248
+5BA2485BA2485BA3485BA500CFEB678039DF806FC039FFC07FE001E013F0A2007F133FA2
+393FC01FE0391F800FC0390F0007801C1C73BE2D>I<EAFFFCA4EA003CB3B3B3B3ABEAFF
+FCA40E5B7FC319>I<1318133C137E13FF3801E7803803C3C0380781E0380F00F0001E13
+7848133C48131E00E0130700401302180D76BD2D>I<EB0FF8EB7FFE3901F01F80390380
+03E039060001F0390F8000F86D7F486C137C157EA2816C5A6C5AC8FCA4EC0FFF0103B5FC
+90381FFC3FEB7F803801FC00EA03F0485A485A485A123F48C7FCEE018012FEA3157FA300
+7F14DFEC019F3B3F80038F83003A1FC0070FC73A07F01C07FE3A01FFF803FC3A003FE001
+F0292A7DA82D>97 D<EA01F812FFA3120712031201B1EC07F8EC3FFF9138780FC09138C0
+03E09039F98001F001FBC77E01FE147C498049143F1780161F17C0A2EE0FE0A317F0A917
+E0A2161F17C0A21780163F6D1500167E01F6147C5E01E3495A9039C1C007E09039C0F01F
+809026803FFEC7FCC7EA0FF02C407DBE33>I<49B4FC010F13E090383F00F8017C131C49
+13064848131F48485B0007EC7F80485A121F5B003FEC3F00151E007F91C7FC90C9FCA35A
+A97EA27F123F16C0121F6DEB0180120F6C6CEB0300A26C6C13066C6C5BD8007C13389038
+3F01F090380FFFC0D901FEC7FC222A7DA828>I<ED03F815FFA3150715031501B114FF01
+0713C190381F80F190387E003901F8130D48481307485A0007140348481301121F5B123F
+A2127F90C7FCA25AA97EA36C7EA2121F7F000F140312076C6C13076C6CEB0DFC6C6CEB19
+FE017C903871FFF090383F01E190380FFF81903A01FE01F8002C407DBE33>I<EB01FE90
+380FFFC090383F03F090387C00F801F0137C00038049133F48487F000F1580485AED0FC0
+123FA248C713E0A35AA290B6FCA290C9FCA67EA27F123F1660121F6D14C0120F6C6CEB01
+8012036C6CEB03006C6C130E017E5B90381F80F0903807FFE0010090C7FC232A7EA828>
+I<EC1FC0ECFFF0903803F038903807C07C90380F80FEEB1F01133F133E90387E00FC1578
+491300AFB6FCA3D800FCC7FCB3AE487E387FFFFEA31F407EBF1C>I<167C903903F801FF
+90391FFF0787903A7E0FCE0F809038F803F83901F001F03B03E000F8070000076EC7FCA2
+4848137EA2001F147FA6000F147EA26C6C5BA200035C6C6C485A6D485A39037E0FC0D91F
+FFC8FC380703F80006CAFCA2120EA2120F7E7F7F6CB512F015FE6C6E7E6C15E00003813A
+07C0001FF848C7EA03FC001E140048157E007C153E0078153F00F881A50078151E007C15
+3E6C5D001E15786C5DD807C0EB03E0D803F0EB0FC0D800FE017FC7FC90383FFFFC010313
+C0293D7EA82D>I<EA01F812FFA3120712031201B1EC03F8EC1FFF91383C0F8091386007
+C04A6C7ED9F9807FEBFB0001FE1301825BA35BB3A6486C497EB500F0B512F0A32C3F7CBE
+33>I<EA01E0487E487E487EA46C5A6C5A6C5AC8FCACEA01F8127FA3120712031201B3AC
+487EB512E0A3133E7DBD19>I<EA01F812FFA3120712031201B292387FFF80A392381FF8
+00ED0FE01680030EC7FC5D5D15605D4A5A4AC8FC140E5C143E147FECDF80EBF98F9038FB
+0FC09038FE07E0EBFC0301F07F6E7E140081157E8181826F7E1507826F7E82486CEB07FE
+B539E03FFFE0A32B3F7EBE30>107 D<EA01F812FFA3120712031201B3B3B1487EB512F0
+A3143F7DBE19>I<2703F003FCEB01FE00FF903B0FFF8007FFC0913B3C0FC01E07E0913B
+7003E03801F00007903BC001F06000F82603F1806D487F2601F300EBF98001F6D900FBC7
+127C04FF147E01FC5CA3495CB3A6486C496C14FFB528F07FFFF83F13FCA346287CA74D>
+I<3903F003F800FFEB1FFF91383C0F8091386007C00007496C7E2603F1807F3801F30001
+F613018213FCA35BB3A6486C497EB500F0B512F0A32C287CA733>I<14FF010713E09038
+1F81F890387E007E01F8131F4848EB0F804848EB07C04848EB03E0000F15F04848EB01F8
+A2003F15FCA248C812FEA44815FFA96C15FEA36C6CEB01FCA3001F15F86C6CEB03F0A26C
+6CEB07E06C6CEB0FC06C6CEB1F80D8007EEB7E0090383F81FC90380FFFF0010090C7FC28
+2A7EA82D>I<3901F807F800FFEB3FFF9138781FC09138C007E03A07F98001F02603FB00
+7FD801FE6D7E49147E49147FEE3F80A2EE1FC0A217E0A2160F17F0A917E0161FA217C0A2
+EE3F80A26DEC7F00167E6D5C4B5A01FB495A9039F9C007E09039F8F01F80DA3FFEC7FCEC
+0FF091C9FCAD487EB512F0A32C3A7DA733>I<02FF13180107EBC03890381F80E090397E
+0030784913184848130C4848EB06F8485A000F1403485AA248481301A2127FA290C7FC5A
+A97E7FA2123FA26C7E15036C7E000714076C7E6C6C130D00001419017E137190383F81E1
+90380FFF81903801FE0190C7FCAD4B7E92B512F0A32C3A7DA730>I<3903F007E000FFEB
+1FF0EC7878ECE0FC3907F181FE12033801F3019038F600FCA2153001FC1300A35BB3A548
+7EB512FCA31F287EA724>I<90387FC0603901FFF8E03807C03D380E0007481303481301
+481300A212F01560A27EA27E007F140013C0EA3FFE381FFFE06C13FC6C7F6C7FC6148001
+0F13C09038007FE0EC0FF00040130300C0EB01F814007E1578A37E15707E15E07E6CEB01
+C000F3EB038039E1E01F0038C0FFFCEB1FE01D2A7DA824>I<1318A61338A41378A213F8
+A2120112031207001FB512C0B6FCA2D801F8C7FCB3A21560A9000014C07F137CEC018013
+3E90381F8700EB07FEEB01F81B397EB723>I<D801F8EB03F800FF14FFA3000714070003
+140300011401B3A61503A300001407A2017CEB0DFCED19FE6D903831FFF090381F80E190
+3807FFC10100903801F8002C297CA733>I<B539C007FFE0A32707FC000113006C48EB00
+7C0001157816707F00001560A2017E5CA2017F13016D5CA26D6C48C7FCA26E5A010F1306
+A26D6C5AA2ECF01C01031318A26D6C5AA2ECFC7001001360A2EC7EC0A2147F6E5AA26EC8
+FCA3140EA22B287EA630>I<B53BC3FFFE01FFF8A33D0FFC001FE0007FC0D803F06D48EB
+1F800307EC0E007F00016F130CA26D161C00004A6C1318150D017E5EED1DF815186D5EED
+307CA2D91F80017E5BED603EA2D90FC090383F0180EDC01FA2D907E00283C7FC9138E180
+0F02F11487010315C69138F3000702FB14CE6DB414EC4A1303010015F8A24A1301027C5C
+02781300A202385C023014603D287EA642>I<3B7FFFC00FFFE0A3000390390007FE00C6
+48EB03F0017E6D5A6DEB03801480011F49C7FC90380FC00E903807E00C6E5A903803F838
+01015B6D6C5AEC7EC0EC7F80143F141F6E7E81141FEC3BF0EC71F8ECE1FC14C090380180
+7E01037FD907007F01066D7E49130F496D7E01386D7E017880EA01F8D80FFCEB07FEB590
+381FFFF8A32D277FA630>I<B539C007FFE0A32707FC000113006C48EB007C0001157816
+706C6C1460A27F017E5CA26D495AA2EC8003011F91C7FCA290380FC006A2ECE00E010713
+0CA26D6C5AA2ECF8380101133014FC01005BA2EC7EC0A2147F6E5AA26EC8FCA3140EA214
+0CA2141C1418A25CA2147000381360007C13E000FE5B13015C49C9FCEA7C07EA700EEA38
+3CEA1FF8EA07E02B3A7EA630>I<001FB61280A29039E0003F0090C7127E001E14FE001C
+495A5D0018495A003813075D0030495A141F4A5A92C7FC147EC712FE495A5C495A13075C
+495A011FEB0180EB3F801400137E13FE485A491303485A000715005B48485B001F5C485A
+90C7123F007E49B4FCB7FCA221277EA628>I E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Ff cmbx12 14.4 37
+/Ff 37 122 df<EA03E0EA0FF8487E487E487EA2B51280A56C1300A26C5A6C5A6C5AEA03
+E01111769025>46 D<157815FC14031407141F14FF130F0007B5FCB6FCA2147F13F0EAF8
+00C7FCB3B3B3A6007FB712FEA52F4E76CD43>49 D<EC1FFC49B512E0010F14FC013F14FF
+90B712C048D9803F7F2703FC00077FD807F06D13FC484801007F4848147F48488101E06E
+1380D87FF8806D16C06D8000FF17E07FA27013F0A36C5AA26C5AA2EA0FF0D803C05CC914
+E0A34C13C0A218805E18004C5A5F16FF5F4B5B4B5B4B5B94C7FC4B5A4B5A4B5AED7FE05E
+4B5A4A90C8FCEC03FC4A5A4A48EB01F04A5A4A5A4A5A02FEC7EA03E0495A495A495A5C49
+48140749C8FC013E150F017FB7FC90B812C05A5A5A5A5A5A5AA2B91280A4344E79CD43>
+I<91380FFF8091B512FC010314FF010F15C090263FF00313F09026FF800013FC4848C76C
+7ED803F86E7E4980D807FC168001FF16C0487F82486D15E0A3805CA27E4A4913C07E6C90
+C7FCD800FC168090C85A18005F167F4C5A5F4B13E04B5B030F5BDB7FFEC7FC91B512F816
+C016FCEEFF80DA000713E0030013F8707E70B4FC7013807013C018E07013F0A218F88218
+FCA318FEEA01C0EA0FF8487E487E487EA2B57E18FCA44C13F86C90C7FC18F0495C6C4816
+E001F04A13C06C484A1380D80FF84A1300D807FE4A5A2703FFF0035BC690B612F0013F15
+C0010F92C7FC010114F8D9001F1380374F7ACD43>I<177C17FEA2160116031607160FA2
+161F163F167FA216FF5D5DA25D5DED1FBFED3F3F153E157C15FCEC01F815F0EC03E01407
+EC0FC01580EC1F005C147E147C5C1301495A495A5C495A131F49C7FC133E5B13FC485A5B
+485A1207485A485A90C8FC123E127E5ABA12C0A5C96C48C7FCAF020FB712C0A53A4F7CCE
+43>I<0003160ED807E0153E01FCEC03FED9FFE0137F91B65A5F5F5F5F5F94C7FC5E16F8
+5E16C04BC8FC15F801E090C9FC91CAFCABEC0FFF027F13F001E3B512FC01E714FF9026FF
+F80713C0DAC0017F49C713F8496E7E01F0143F496E7E49816C5AC9148018C082A218E0A3
+18F0A3EA07C0EA1FF0487E487EA2487EA318E0A25B18C06C485C49168013C0003EC81400
+003F5D6C6C5D6C6C4A5A6D4A5AD807F8495B6C6C01075B2701FFC03F5B6C90B6C7FC013F
+14FC010F14F0010314809026007FF8C8FC344F79CD43>I<ED0FFE92B512C0020714F002
+1F14FC91397FFC01FE9139FFE0007F01030180131F4990C7EA0F80D90FFCEC3FC0494814
+FF013F5C49484913E0495A48495BA25A485B7013C05A91C76C138070130048163C94C7FC
+5AA25BA2127F1508EDFFF8020313FF020F14C000FF498091393E007FF84AEB1FFC02706D
+7E02F06D7E6D4815804A6D13C0A24A15E0A27013F091C7FC18F8A34916FCA3127FA6123F
+A37F6C17F8A27E18F0A26C4B13E0806C17C06C7F4C13806C6D4913006D6C495AD93FFC49
+5A6DB4EBFFF8010790B512E06D5D010092C7FC023F13FC020313C0364F7ACD43>I<121F
+7F7FEBFF8091B81280A448180060A26060606060A2485F0180C86CC7FC007EC912FE5F00
+7C15014C5A4C5A4C5A4C5A485E163F4CC8FC16FEC8485A5E15034B5A150F5E4B5A153FA2
+4B5AA24BC9FCA25C5C5D1407A34A5AA2141FA3143FA34A5AA414FFA65BAB6D5B6E5A6E5A
+6E5A395279D043>I<913807FFC0027F13FC49B67E010715E090261FFC007FD93FC0EB3F
+FC4948EB0FFE49C76C7E48488048486E138082484816C0A2000FEE7FE0A3121F7FA27F7F
+6E15C002E014FF8002FC15806C01FF5BDBC00313006F485A6C02F85B9238FE0FF86C9138
+FF3FF06CEDFFE017806C4BC7FC7F6D6E7E010F15E06D81010115FC4981010F81013F1680
+EB7FC32601FF8015C048496C14E04848131F4848010714F0497F001F020014F84848143F
+160F48486E13FC1601824848157F173F171FA2170FA318F8A26C7E18F0171F6C6C16E0A2
+6C6CED3FC06DED7F806C6C15FF6C6C6C4913006C01E0EB0FFE6C01FCEB7FF86C6CB65A01
+1F15C0010792C7FC010014F8020F1380364F7ACD43>I<913807FF80027F13F00103B512
+FC010F14FF90261FFE0113C0903A7FF8007FE0D9FFE06D7E48496D7E48496D7E486F7E48
+90C77FA2486F1380A2484816C0A2007F17E0A28200FF17F0A418F8A618FCA2127F5EA312
+3F5E6C7EA26C5DA26C6D5B6C153D6C6D13396C6D13F990397FF801F1011FB512E16D02C1
+13F8010314019038007FFCEC00401500A218F05EA218E013F0EA03FC486C16C0486C5C18
+80487F18005E5F91C7485A4C5A6C48147F495DD807F049485A4B5B6C6C010F5B6CB4D93F
+FEC7FC6C90B55A6D14F0011F14C0010749C8FC010013E0364F7ACD43>I<BA12C019FEF1
+FFC01AF01AFCD8000701F0C7000313FFDE007F7F737F070F7F737F878587858785A287A8
+4F5BA263616361634F5B4F5B077F90C7FC4E485A060713F892B812E097C8FC861AF003F0
+C7000313FE9539003FFF80070F13E0737F07017F87737F747E1C807413C0A27413E0A31C
+F0A386A362A31CE0A2621CC0A250138097B5FC1C004F5B19074F5B073F13F04EB55ABC12
+8098C7FC1AF81AC007F8C8FC54527CD160>66 D<BC1280A5D8000701F8C7000114C0F000
+1F19071901851A7F1A3F1A1FA2F20FE0A21A07A31A03A318F81BF01A01A497C7FC1701A3
+17031707170F177F92B6FCA59238F8007F170F170717031701A317001B3EA31B7CA395C8
+FCA21BFCA21BF8A21A01A31A031BF01A071A0FA21A1F1A3FF27FE0F101FF1907191F0603
+B5FCBCFCA21BC0A34F517CD058>69 D<BB12FEA5D8000701F8C700077FF0007F191F1907
+85858586861B80A21A1FA31A0FA41BC006F81307A497C7FCA31701A317031707170F177F
+92B6FCA59238F8007F170F170717031701A31700A795C9FCB3B812F8A54A517CD055>I<
+B812C0A5D8000701F8C7FCB3B3B3B2B812C0A52A527CD132>73 D<B812F8A5D8000701F8
+CAFCB3B3A91A7CA41AFC1AF8A51901A31903A219071AF0190FA2191F193F197F19FF1803
+60183F4DB5FCBB12E0A546527CD151>76 D<B912F0F0FF8019F819FF1AC0D8000701F0C7
+14F0060F7F060113FE727F737F737F85737F87A2737FA387A863A2616363A24F5B4F5B4F
+90C8FC4F5A06035B060F13F095B512C092B8C9FC19F819E019F89226F0000313FE943900
+7FFF80061F7F727F727F86727F8486A2727FA887A71D1C1D3E8785A275137E73157C7315
+FC736D13F8B86C6DEBF801739038FE07F07390B512E0736C14C0080F1400CEEA7FFC5F53
+7CD164>82 D<91260FFF80130791B500F85B010302FF5B010FEDC03F013FEDF07F90267F
+F8006D5A2601FFC0EB07FD4890C70001B5FC48486E7E49814848150F48488183003F825B
+007F82A284A200FF83A27F84A27F7F7F6D93C7FC6C13C014F014FF6C14F0EDFF806C15F8
+EEFF806C16F017FC6C16FF6C836C17E06C836D82011F826D821303010082020F16801400
+030715C0ED007F1603DC007F13E083170F7113F08383127800F882A3187FA27E19E0A37E
+19C06C17FF6D17807F6D4B13006D5D6D5E01FE4B5AD9FFC0EC1FF802F84A5A903B1FFFC0
+03FFE0D8FE0790B65AD8FC0193C7FC486C6C14FC48010714E0489026003FFEC8FC3C5479
+D24B>I<EC3FFF0107B512F0011F14FE017F6E7E2701FFC0077F2703FC000113F001FF6D
+6C7E486D6D7E83486D131F707EA284A26C497F846C90C7FCEA00FC90C8FCA6033FB5FC02
+0FB6FC91B7FC01071407011F13E090387FFE003801FFF84813E0485B485B4890C7FC485A
+5B127FA2485AA45EA25E6C6C141D163D6C6C02797F6C6C02F113F86C9026C003E0EBFFE0
+6C9027F01FC07F13F06C90B5487EC64A487E011F01F8010713E0010001E090C8FC3C387C
+B641>97 D<913801FFF8021FEBFF8091B612E0010315F8010F9038800FFE4948C77ED93F
+F81303D9FFF0491380485B4A4913C0485B5A4890C7FCA2486F13805B003F6F1300EE00FC
+94C7FC485AA412FFAB127FA27FA2123FA2001FEE03E07F7E6EEC07C07E6EEC0F806C6D14
+1F6CEE3F006C6D147ED97FFC5CD91FFEEB03F8903A0FFFC01FF0010390B55A0100158002
+1F01FCC7FC020113E033387CB63C>99 D<4DB47E0407B5FCA5EE001F1707B3A4EDFFC002
+1F13FC91B6FC010315C7010F9038C01FE7903A1FFE0003F7D93FF86DB5FCD9FFF06D7E48
+49804849805C48824890C8FCA2485AA2123FA2485AA412FFAB127FA46C7EA3121FA26C7E
+6C5E6E5C6C7F6C5E6C6D49B5FCD97FF84914E06D6CD90FEFEBFF80903A0FFF807FCF0103
+90B5120F010014FE023F13F00203018049C7FC41547CD24B>I<913803FFC0023F13FC49
+B6FC010715C04901817F903A3FFC003FF0D97FF06D7E4948EB07FC48498048496D7E5A91
+C76C13805A486F13C05B003F17E0A2177F485A18F0A312FFA390B8FCA318E001FCCAFCA5
+127FA37F123FA2001F17E06DED01F07E17036C6D15E06C16076C6DEC0FC06C6DEC1F806D
+6CEC3F006D6C14FED91FFEEB03FC903A0FFFC03FF8010390B55A010015C0021F49C7FC02
+0113F034387CB63D>I<ED1FF84AB5FC020F14C0023F14E09139FFF81FF0499038C03FF8
+49EB807F49010013FC494813FF5C495AA2133F4AEB7FF8017FEC3FF0EE1FE0EE0FC093C7
+FCAEB712E0A526007FF8C8FCB3B3A7007FB512FEA52E547CD329>I<DA1FFF147F91B539
+E003FFC00107DAFC0F13E0011FECFF3F90263FFC079038FF1FF09026FFE00013F84849EB
+7FF04A133F4890C7D81FF813E0489338FC0FC0F0038048486E6CC7FCA3001F82A7000F5E
+A36C6C4A5AA26C5E6C6D495A6E137F6C6D495A90267FFC07138090B7C8FCD801E714FC01
+E014E02603C01F90C9FC91CBFC1207A37FA27F7F13FE90B7FC6C16F017FE717E6C17E084
+6C836D826D8248B9FC12074848C71201D81FF8DA001F1380484815074848817113C04848
+81A66C6C4B1380A26C6C4B1300A26C6C4B5AD80FFEED1FFC6C6C4B5A6C01C0ECFFF0C601
+FC010F13C0013FB7C7FC010F15FC010115E0D9000F01FCC8FC3C4F7CB543>I<EB3FF0B5
+FCA51203C6FCB3A4EE1FFC93B57E030314E0030F14F892391FC07FFC92393E001FFE5D03
+F06D7EECF1E0DAF3C0814B7F02F7C7FC02FF825CA25CA35CB3ADB6D8F807B612C0A54253
+7BD24B>I<137F497E487F487F487F487FA76C5B6C5B6C5B6C5B6DC7FC90C8FCADEB3FF0
+B5FCA512017EB3B3A6B612E0A51B547BD325>I<EB3FF0B5FCA512017EB3B3B3B1B612F0
+A51C537BD225>108 D<D93FF0D91FFCEDFFE0B591B56C010713FC030302E0011F13FF03
+0F02F8017F14C092271FC07FFCD9FE037F922A3E001FFE01F0007F00034A4B5AC602F090
+270FFF07806D7EDAF1E04BC7FCDAF3C0039E814B6D019C143F02F7C714B802FF04F8814A
+5EA24A5EA34A5EB3ADB6D8F807B6D8C03FB512FEA567367BB570>I<D93FF0EB1FFCB591
+B57E030314E0030F14F892391FC07FFC92393E001FFE00035CC602F06D7EECF1E0DAF3C0
+814B7F02F7C7FC02FF825CA25CA35CB3ADB6D8F807B612C0A542367BB54B>I<913801FF
+E0021F13FE91B612C0010315F0010F9038807FFC903A1FFC000FFED97FF0903803FF8049
+486D7F48496D7F48496E7EA24890C86C7E488349151F001F83A2003F834981A2007F1880
+A400FF18C0AC007F1880A36C6C4B1300A3001F5FA26C6C4B5AA26C6D4A5A6C5F6C6D4A5A
+6C6D495B6D6C495BD93FFC010F90C7FC903A0FFF807FFC6D90B55A010015C0023F91C8FC
+020113E03A387CB643>I<D93FF0EBFFE0B5010F13FE033F6D7E92B612E09126F1FE0113
+F8913AF7F0003FFE0003D9FFC06D7EC64A01077F92C76C7F4A824A6E7F4A8085727EA285
+183FA285A284A21A80AB1A0060A361A24E5AA24E5AA24D5B6E5E6E5C6E4A5B6F495B6F49
+48C7FC03F0EB7FFC913AFBFC03FFF002F8B65A033F91C8FC030F13FC0301138092CBFCB1
+B612F8A5414D7BB54B>I<90397FE001FCB590380FFF80033F13E04B13F09238FE1FF891
+39E1F03FFC0003EBE3E0C69138C07FFEECE780150014EF14EE02FEEB3FFC5CEE1FF8EE07
+E04A90C7FCA55CB3AAB612FCA52F367CB537>114 D<903901FFE007011FEBFC1F017FEB
+FF7F48B7FC3907FE001FD80FF01307D81FC01301497F003F8148C87EA34881A27FA27F01
+F091C7FC13FC387FFFC014FEECFFF06C14FEEDFFC06C816C15F86C810001816C81013F15
+80010715C01300020714E0EC001F1503030013F00078157F00F8153F161F7E160FA27E17
+E07EA26DEC1FC07F6DEC3F806DEC7F0001FCEB01FE9039FF800FFC013FB55AD8FC1F14E0
+D8F803148027E0007FF8C7FC2C387CB635>I<143EA6147EA414FEA21301A313031307A2
+130F131F133F13FF5A000F90B6FCB8FCA426003FFEC8FCB3A9EE07C0AB011FEC0F80807F
+EE1F006D1380EDC03E6D6D5A0100EBFFF86E5B021F5B020190C7FC2A4D7ECB34>I<D93F
+F8913801FFC0B50207B5FCA50003ED001FC61607B3AF5FA35F017F5D173B177B6D6C14F3
+011FDA01E313F06ED907C3EBFFC0903A0FFF801F83010390B512036D14FED9003F13F802
+0301C091C7FC42377BB54B>I<B600F00107B5FCA5000101F8C8EA7FC06C6DED3F00A201
+7F163E6E157E013F167C6E15FC6D5E6F13016D5E8117036D5E6F13076D5E6F130F6D5E6F
+131F6D93C7FC815F6E6C133E177E023F147C6F13FC6E5C16816E5C16C3A26EEBE3E016E7
+6E5C16FF6E5CA26E91C8FCA26F5AA36F5AA26F5AA26F5AA26F5A6F5A40367DB447>I<00
+7FB500F090387FFFFEA5C66C48C7000F90C7FC6D6CEC03F86D6D495A6D6D495A6D4B5A6F
+495A6D6D91C8FC6D6D137E6D6D5B91387FFE014C5A6E6C485A6EEB8FE06EEBCFC06EEBFF
+806E91C9FCA26E5B6E5B6F7E6F7EA26F7F834B7F4B7F92B5FCDA01FD7F03F87F4A486C7E
+4A486C7E020F7FDA1FC0804A486C7F4A486C7F02FE6D7F4A6D7F495A49486D7F01076F7E
+49486E7E49486E7FEBFFF0B500FE49B612C0A542357EB447>120
+D<B600F00107B5FCA5C601F8C8EA7FC06EED3F00A26D6C153E187E013F167C6E15FC6D5E
+6F13016D5E6F13036D5E8117076D6D5C170F6D6D5C171F6D93C7FC6F5B027F143E6F137E
+023F147C6F13FCA26E6D5A16816EEBC1F016C36E5C16E76E5C16FF6E5CA26E91C8FCA36F
+5AA26F5AA26F5AA26F5AA26F5AA35E150F5E151F93C9FC5DD81FC0133E486C137E486C13
+7C486C13FC5D14015D14034A5A6C48485A49485A263FC07FCAFCEB81FE6CB45A6C13F000
+035BC690CBFC404D7DB447>I E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fg cmbx12 24.88 15
+/Fg 15 118 df[<C21280A421C0A5C700030380C81201F40007F5007F0C1F14E01E071E
+018A1F3F8B8B8B7913F0A28B8BA2207FA3203F21F8201FA4200FA321FC2007A4F47FC0A3
+F803FEA49DC7FCA31CFFA463A263A26363631B7F50B5FC1A1F95B8FCA9953880001F1A01
+747E1B1F878787A287A287A41C7FAA99CBFCB3AFBC12F0A9>127
+141 120 268 146 70 D[<B96C0C3FB812E07266729BB9FC7265A37265A27265C70003A1
+01F8C8FC72F50FF7A2706DF51FE7A3706EF43FC7A2706EF47F87A2706EF4FF07A2706EF3
+01FEA3706EF303FCA2706EF307F8A2706EF30FF0A2716DF31FE0A3716EF23FC0A2716EF2
+7F80A2716EF2FF00A2716E4F5AA3716E4F5AA2716E4F5AA2716E4F5AA2726D4F5AA3726E
+4E5AA2726E4E5AA2726E4EC7FCA2726E4D5AA3726E4D5AA2726E4D5AA2726E4D5AA2736D
+4D5AA3736E4C5AA2736E4C5AA2736E4CC8FCA3736E4B5AA2736E4B5AA2736E4B5AA2736E
+4B5AA3746D4B5AA2746E4A5AA2746E4A5AA2746E4AC9FCA3746E495AA2746E495AA2746E
+495AA2746E495AA3756D495AA2756E485AA2756E485AA2756E48CAFCA375ECF1FEA275EC
+FBFCA275ECFFF8A2755DA3765CA2765CA2765CA27691CBFCA3765B4A7F49B500FE715BB9
+00FC51BB12E0765BA2765BA3775A775A775A>203 142 120 269
+220 77 D[<932607FFF8163E4BB600E0153F030F03FC5D037FDBFF805C4AB800F05B020F
+05FC5B4A05FF5B027FF0C00F91B526FC000FECF01F010302C0D9003F6D5A4949C800076D
+5A4901F8030090B6FC4901E0163F4949160F49498290B5CA12014A834849844849181F87
+484984A2484984874886A248498588A24887A388A2B58680A36E85A3806E85A28080816C
+6E725A03F096C7FC8115FE6F7E6C15F016FF17F86CEEFF8018FC6CEFFFC019FE6CF0FFE0
+6C19FEF2FFC06C1AF06C1AFC1BFF6D1AC06D866D1AF86D866D866D866D876D87023F866E
+8602078614016E6C85031F851503DB007F8404031980EE003F050118C0EF001F060017E0
+190FF1007F080F15F01A031A007514F81B1F87877514FC87A2007F86486C86A288A288A4
+6D86A31EF87FA37F1EF0A26D621EE07F7F6D5013C0A26E1B806E616E1B0002F896B5FC6E
+4E5B6E4E5B6E7E03E0050F5B6F4D5B03FE4D5B6F6C93B55A04F803035C496CD9FF80020F
+91C7FCD9FC1F02FF91B55AD9F80792B75A496C19F049C66C6049011F18804901074DC8FC
+90C817F048030F168048030003FCC9FC007C04011480>102 146
+115 271 129 83 D[<BB00FE040FB912C0A9C700030380CD001F02E0C7FC9E26007FF8C8
+FC7C5AB3B3B3B3B36E555AA38480585AA36F65726481696F9CC9FC72626F66721A0F6F53
+5AA26F6E505A6F6E505A6F1DFF724F5B706E4E5B706E60706E4E5B706E063F90CAFC706E
+4E5A7002FE4D485A706E6C04075B706C02E0043F5B7102F84BB512C0050FDAFF80021F5C
+7103FC0107B6CBFC050192B812FC716C19F0061F6106071980060006FCCCFC071F17F007
+011780DF001F03F8CDFCE0003F01FCCEFC>162 144 120 269 179
+85 D<93387FFFF8033FB612E00203B712FE021FEEFFC0027F17F049B912FC4918FF4991
+2680007F14C04901E0C7000F80496D020314F8496D0200806F6F7F496D6F7F738090B681
+73807380A27380A288856D4984A26D5B747F6D5B6D5B6D5B010090CAFC91CBFCAA0603B6
+FC050FB7FC0403B8FC167F0307B9FC153F4AB7C67E020F15C0023F02FCC7FC91B612C001
+0392C8FC010F14FC4914F04914C04991C9FC90B55A485C485C485C485C5D5A485CA24891
+CAFCA3B6FC5CA397B5FCA461806C60F107EF6C6E150F6F16CF6CF03F8F6F037F806C6EDB
+FF0F14C06C02FCDA03FE15FC6C6E91260FFC0791B5FC6C6E6CD93FF817806C923AF003FF
+F003013F91B6487E010FEF8000010394C77E010004FC141F021F03E01407020192C96C14
+00DA000701F093C9FC695F79DD71>97 D[<F57FC098B6FC4FB7FCA996C77E1B0FA287B3
+B294383FFF80040FB512F8047F14FF0303B712E0031F16F8037F16FE4AB9128702079126
+FC003F13C7021F02E0010313F74A91C890B6FC4A01FC153F49B548814902E01507494A81
+494A814991CAFC4949834B83498590B54883A2485C5AA2485CA25A5D5AA35AA25D5AA5B6
+FCB07EA57E81A37EA27EA2817EA26C806C62A26C6E5F636D6D94B6FC6D606D6D5E6D6D5E
+6D6E5D704B81010102F0157F6D6E92B712FC6E01FE020301EF91B5FC6E6D6C011F138F02
+0FDAF001B5120F020391B612FC6E17F8DA003F16E0030F16800301EDFC00DB001F14E004
+0001FCC702FCC7FC>112 144 120 270 129 100 D<94387FFFC0040FB6FC93B712E003
+0716FC031F16FF037F17C04AB912F00207DAF80380021F912680003F13FE4A49C7000F7F
+4A01F802038049B5486E804902C06E6C7F494A6F7F4991C9FC49727F4949707F4B844984
+90B548707F5A4B198048855D481CC086481CE05D5A871DF05AA25D5AA21DF887A2B6FCA3
+92BBFCA51DF00380CDFCA77EA4817EA37EA2817EA26CF307F06FF00FF87E816C1B1F6F19
+F06C1B3F6D6DF07FE06D7FF4FFC06D6E4C13806D6E5E6D02F04C13006D6EEE1FFE6D6E4C
+5A6D6C01FFEEFFF86E02E002035B6E02FC021F5B02079126FFC003B55A6E92B7C7FC0200
+60033F17F8030F17E003011780DB003F03FCC8FC040315C0DC000F01F8C9FC5D5F7ADD6A
+>I[<EC3FC0ECFFF0010313FC497F497F498049804980A290B67EA24881A86C5DA26D5CA2
+6D5C6D5C6D91C7FC6D5B6D5B010013F0EC3FC091C9FCB3A3ED3FE0017FB5FCB7FCA9EA00
+3F1307A27FB3B3B3B0B9FCA9>48 144 119 271 64 105 D[<ED3FE0017FB5FCB7FCA9EA
+003F1307A27FB3B3B3B3B3B3ACB91280A9>49 143 119 270 64
+108 D<DB7FC0913803FFF890B6033FEBFFC0B74AB612F8060715FE061F6F7E067F16E04D
+B87E4DD9F003804DD9800080DD0FFCC76C7FDD1FF080D8003F4B486E7F0107DB7F80804D
+C8816DDAC1FE844D81EEC3F8DCC7F0845FEECFC0DCDF8081A204FFC981A25EA25EA35EA4
+5EB3B3AFB900C090B912C0A9725D77DC81>110 D<94381FFFF00407B612C0047F15FC03
+03B87E030F17E0037F17FC4ABAFC4A9126FC007F80020F02C0010714E04A49C880027F01
+F8033F13FC91B5486F7F4902C003077F494A6F804991C96C80494970804949717F498749
+49717FA290B548717F48884B83481D80A2481DC04B83481DE0A2481DF0A3484A7114F8A4
+481DFCA5B61BFEAF6C1DFCA56C6E4D14F8A36C1DF0A36C1DE06F5F6C1DC0A26C6E4D1480
+A26C1D006F5F6C646D6D4D5B6F94B5FC6D636D6D4C5C6D6E4B5C6D6E4B5C6D02F0031F5C
+6D6E4B91C7FC6D6C01FE92B512FC6ED9FFC001075C6E02FC017F5C020791B812C0020196
+C8FC6E6C17FC031F17F003031780DB007F03FCC9FC040715C0DC001F01F0CAFC675F7ADD
+74>I<DB7F8049B47E90B6020F13F8B7027F13FE4DB67E4D15E0050F814D8194263FFE07
+7F94387FF00FDEC01F7F4D48487FD8003F913881FE0001074B491480EE83F86DEC87F0A2
+EE8FE05F169F5F04BFC76C1400A2735B16FE735B4C6E5B735B9638007F804C92C8FCA45E
+A75EB3B3A9B912F8A9515D79DC5F>114 D<92260FFFF814F80203B638C001FC021FEDF8
+0791B7EAFE0F0107EEFFBF4917FF013F9038F0000F4990C8FCD9FFF8153F4849150F4801
+C015034849814890CAFC197F4848173FA24848171FA2007F180FA312FF19077FA27F8080
+6E705A02F893C8FC14FEECFFC06C14FCEDFFE0EEFF806C16FCEFFFC06C17F86C17FF19C0
+6C18F06C846C18FE6C846D846D846D840107840101846D6C83141F020383DA003F821503
+DB000F1680EE003F050115C0717E181F1807007F050114E0486C8285856D83A2857F85A2
+7F1BC07FA27F1B806D5FA26D19006E5E6E5F6E4C5A6E167F02FC4C5A6E03035B6E6C4A5B
+03E0023F5B03FE0103B55A01F990B8C7FCD9F07F16FCD9E01F5ED9800716C0D900014BC8
+FC48D9003F14F0007C020149C9FC4B5F78DD5C>I[<ED03FEA81507A5150FA4151FA3153F
+A2157FA215FFA25CA25C5CA25C5C5C5C91B5FC13035B131F017F91B712F00007BAFCBBFC
+A7C76C49C9FCB3B3AAF101FFB1616E17FE82A219076E17FC836EEE0FF871131F6EEE3FF0
+6E02F0EB7FE07113FF6EDAFE0313C06E91B612806F16006F5D030F5D03035D030015E004
+0F91C7FC040013F8>72 132 124 258 90 I<DB1FF0F01FF0017FB5057FB5FCB793B7FC
+A9D8003FF0003F01071907A26D85B3B3B063A463A263A26D61A26398B6FC6D6E16FDF201
+F96E1703E007F1806E6DED1FE170DB3FC114FF6E6D03FFEEFFC06E02C0010313816E02F8
+011F13016E91B612FC020017F86F16F0030F16C003031600DB003F14F8040102800480C7
+FC725E77DC81>I E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fh cmbx12 20.74 8
+/Fh 8 117 df<EE01F04C7E160F161F167FED01FF1507153F4AB5FC141F010FB6FCB8FC
+A44A7E14E0EBF000C8FCB3B3B3B3B0007FBA12F0A7447171F061>49
+D<96267FFFE01670063FB616F80503B700E01401053F04FC14034CB91407040706C0130F
+043F06F0131F93B626FE000F01FC133F030303809026007FFE137F030F02FCC8390FFF80
+FF4B02E0030313C1037F91CA13E392B500FCEF3FF7020302F071B5FC4A4A17074A028083
+4A91CB7E4A01FC844A498591B54885494A854988494A85495C93CD7E4988495B49885D90
+B51C7F5D481E3F485CA21F1F485CA2481E0F5D5AA21F075D5AA2F703F09CC7FC5AA392D1
+FCA2B6FCB27EA281A37EA3F701F06CF603F881A37E816C1E0720F06C80A36C6E1B0F6C1F
+E06F1B1F7F6F1CC06D1D3F6D6DF37F807F70F2FF006D6E626D6E19016D525A6D6E4F5A6E
+6D190F6E01FE4F5A6E6D4F5A6E6E4E5A6E02E04D485A6E6E4D90C7FC020002FCEF0FFE6F
+01FFEF3FFC031F02E0EEFFF06F02FC03075B0303DAFFC0023F1380030003FE0107B5C8FC
+043F91B712FC040718F0040118C0DC003F94C9FC050316F8DD003F1580DE007F01F0CAFC
+757A75F78C>67 D<92383FFFF8020FB612E0027F15FC0103B87E010F17E04983499026E0
+007F13FCD97FFCC7000F7F496C02037F486D6E806F6D6C7F86486E6E7F727F8684868486
+6C5CA26C91C86C806D5A6D5A6D5AEB03C090CAFCA80507B6FC041FB7FC0303B8FC157F02
+03B9FC021FECFE0391B612800103ECF800010F14C04991C7FC017F13FC90B512F04814C0
+485C4891C8FC485B485BA2485BA2485BA2B5FC5CA360A360806C5FA26C6D153E6E5D6C05
+FC806C01FFDA03F8806C6ED90FF014FC6C02E090263FE07FEBFFFC6C9128FC03FFC03F14
+FE6C91B61280013F4B487E010F4B1307010303F01301D9003F0280D9001F13FC020101F8
+CBFC57507ACE5E>97 D<EE3FFF0307B512F8033F14FF4AB712E0020716F8021F16FE027F
+D9F8037F49B526C0007F7F4991C76C13E04901FC020F7F49498049496E7F49496E7F4949
+6E7F90B55A48727E92C9FC48721380485B1BC048841BE0485BA27313F05AA25C5AA21BF8
+85A2B5FCA391BAFCA41BF002F8CCFCA67EA3807EA47E806CF101F0F203F86C7F1A076C6E
+17F06C190F6F17E06C6E161F6D6DEE3FC06D6D167F6D6DEEFF806D6D030313006D6D6C4A
+5A6D02E0EC1FFC6D02F8EC7FF86D913AFF8007FFF0023F91B65A020F178002034CC7FC02
+0016F8031F15C003014AC8FCDB000F13C04D507BCE58>101 D<903801FFFCB6FCA7C67E
+131F7FB3AE95380FFFE095B512FE05036E7E050F15E0053F15F84D819426FFF01F7F4CD9
+00077FDC07FC010180EE0FF0DC1FC06D804D82043EC87E5E04FC835EDBFDF0815E03FF84
+5EA25EA393C9FCA45DB3B3A7B8D8E003B81280A7617879F76C>104
+D<902601FFFCEC7FFEB60207B512F0053F14FE4CB712C0040716F0041F824C16FE4CD900
+7F7FC66C9026FDFFF0010F14C0011F90B500800103806D4AC76C804C6E6C7F04F06F7F4C
+6F7F5E4C6F7F93C96C14805D7414C01DE0861DF0A2861DF8A2871DFCA57513FEAF5113FC
+A41DF8A298B5FC1DF0A2621DE0A25014C01D80626F1900505B705D705F704B5B704B5B70
+92B55A04FE02035C706C010F91C7FC4B01E0013F5B93267FFC01B55A041FB712F07016C0
+040393C8FC040015F8051F14C0050301F0C9FC94CCFCB3A7B812E0A75F6F7ACD6C>112
+D<902601FFF8EB07FEB691383FFFC094B512F04C800407804C8093391FFC3FFF93263FE0
+7F1380C66C0380B512C0011F4A5A6DDAFC0114E0A2EDF9F816F015FB16E015FF4C6C14C0
+A24C6D1380721300725A93C76C5AF001E095C8FCA25DA55DB3B3A4B812F8A7434E7ACD4F
+>114 D<157FA75DA45CA45CA25CA25CA25CA25C5C91B5FC5B5B5B5B133F90B6FC000792
+B6FCBAFCA6D8000791C9FCB3B3A4F00FE0AE181F6D6E14C0A2183F6D178070137F6D1700
+705B6E6D485A6E9038FE07FC6E90B55A6E5D6E5D02015D6E6C5C031F49C7FC030013F03B
+6E7CEC4B>116 D E
+%EndDVIPSBitmapFont
+end
+%%EndProlog
+%%BeginSetup
+%%Feature: *Resolution 600dpi
+TeXDict begin
+%%PaperSize: A4
+
+%%EndSetup
+%%Page: 1 1
+1 0 bop 382 1171 a Fh(Chapter)65 b(1)382 1586 y Fg(FstStudio)79
+b(User)e(Man)-6 b(ual)382 2067 y Ff(1.1)135 b(In)l(tro)t(duction)382
+2270 y Fe(FstStudio)39 b(\(Finite)g(State)h(T)-8 b(ransducer)37
+b(Studio\))i(is)f(a)h(program)f(for)g(construction)382
+2383 y(and)30 b(running)e(of)j(\014nite)f(state)i(transducers.)40
+b(If)30 b(y)m(ou're)h(not)g(familiar)f(with)g(the)h(con-)382
+2496 y(cept)g(of)f(transducers)g(and)g(regular)g(relations,)i(then)e
+(Xero)m(x's)h(fst)g(homepage)382 2609 y(h)m(ttp://www.xrce.xero)m
+(x.com/researc)m(h/mltt/fst/)382 2722 y(is)25 b(recommended)e(as)i(an)g
+(in)m(tro)s(duction)g(\(primarily)f(b)s(ecause)h(the)h(syn)m(tax)f(of)g
+(Xero)m(x's)382 2835 y(fst)30 b(program)f(has)h(functioned)g(as)h(an)f
+(inspiration)h(for)f(the)g(syn)m(tax)h(of)g(fstStudio\).)382
+3121 y Ff(1.2)135 b(Installation)382 3324 y Fe(If)23
+b(y)m(ou)h(ha)m(v)m(e)h(access)h(to)e(the)g(binary)f(\014le,)j(then)d
+(all)i(y)m(ou)f(ha)m(v)m(e)h(to)g(do)f(is)f(to)i(cop)m(y)g(the)f
+(\014le)382 3437 y(to)j(an)g(appropriate)f(library)g(and)g(run)f(the)i
+(program)e(according)j(to)f(the)g(instructions)382 3550
+y(b)s(elo)m(w.)42 b(If)30 b(y)m(ou)h(ha)m(v)m(e)h(access)f(to)h(the)f
+(source)f(co)s(de,)i(compile)e(the)h(system)f(b)m(y)g(t)m(yping)382
+3663 y(\\mak)m(e".)45 b(This)30 b(will)i(construct)g(a)g(\014le)g
+(named)e(\\fst")i(in)f(the)h(source)f(library)-8 b(.)44
+b(T)-8 b(o)32 b(b)s(e)382 3776 y(able)g(to)g(compile)f(the)h(system,)f
+(y)m(ou)h(m)m(ust)e(ha)m(v)m(e)j(ghc)e(installed)i(at)f(y)m(our)f
+(system.)43 b(If)382 3889 y(y)m(ou)35 b(don't)f(ha)m(v)m(e)i(it)f
+(already)-8 b(,)37 b(a)e(free)g(distribution)f(of)h(ghc)f(can)h(b)s(e)f
+(do)m(wnloaded)h(at)382 4002 y(h)m(ttp://www.hask)m(ell.org/ghc/.)59
+b(It)35 b(can)h(also)g(b)s(e)f(run)e(in)i(Hugs.)56 b(Load)35
+b('Main.hs')382 4114 y(and)30 b(t)m(yp)s(e)g('main'.)382
+4401 y Ff(1.3)135 b(Syn)l(tax)382 4604 y Fe(fstStudio)37
+b(tak)m(es)j(a)e(program)f(consisting)h(of)g(regular)h(relations)g
+(that)f(denotes)g(the)382 4717 y(relation)23 b(b)s(et)m(w)m(een)g(t)m
+(w)m(o)h(regular)f(languages)g(and)f(constructs)g(a)h(transducer.)37
+b(If)22 b(a)h(reg-)382 4830 y(ular)k(expression,)g(not)g(a)h(relation,)
+h(is)e(giv)m(en,)i(then)d(it)i(is)f(in)m(terpreted)g(as)g(the)g(iden)m
+(tit)m(y)382 4943 y(relation.)40 b(The)25 b(syn)m(tax)h(is)f(v)m(ery)h
+(similar)f(to)h(Xero)m(x's)h(\014nite)e(state)i(transducer)d(syn)m(tax)
+382 5055 y(with)33 b(t)m(w)m(o)j(fundamen)m(tal)c(di\013erences:)48
+b(a)34 b(distinction)h(is)f(made)f(b)s(et)m(w)m(een)h(functions)382
+5168 y(\(de\014nitions\))d(and)e(strings,)i(and)e(fststudio)i(allo)m
+(ws)g(functional)g(de\014nitions.)382 5381 y Fd("a")1854
+5652 y Fe(1)p eop
+%%Page: 2 2
+2 1 bop 609 548 a Fe(sym)m(b)s(ol.)609 661 y(Example:)40
+b(["b"])31 b(denotes)g(the)g(language)g Fc(f)p Fe("b")p
+Fc(g)p Fe(.)382 846 y Fd(a)609 959 y Fe(v)-5 b(ariable.)42
+b(A)30 b(sym)m(b)s(ol)f(without)i(quotes)g(is)f(a)h(v)-5
+b(ariable.)382 1256 y Fd("a":"b")609 1369 y Fe(Describ)s(es)43
+b(a)f(relation)i(b)s(et)m(w)m(een)f(the)g(sym)m(b)s(ol)e(a)i(and)e(b.)
+76 b(This)42 b(relation)i(is)609 1482 y(ordered)29 b(and)g(a)h(is)g
+(said)g(to)g(b)s(e)f(a)h(part)g(of)f(the)h(upp)s(er)e(language)j(and)e
+(b)g(is)h(said)609 1595 y(to)h(b)s(e)f(part)g(of)h(the)f(lo)m(w)m(er)i
+(language.)609 1708 y(Example:)40 b([)31 b("a":"b")h(])e(denotes)h(the)
+g(relation)g Fc(f)p Fe(\("a","b"\))p Fc(g)p Fe(.)382
+1893 y Fd(0)609 2006 y Fe(epsilon)j(sym)m(b)s(ol.)51
+b(The)33 b(epsilon)h(sym)m(b)s(ol)f(denotes)h(the)g(string)g(with)g(no)
+g(sym-)609 2118 y(b)s(ols.)609 2231 y(Example:)40 b([0])31
+b(denotes)g(the)g(language)g Fc(f)p Fe("")p Fc(g)p Fe(.)382
+2416 y Fd(?)609 2529 y Fe(all)40 b(sym)m(b)s(ol.)64 b(The)39
+b(all)g(sym)m(b)s(ol)f(denotes)h(the)g(union)f(of)h(all)h(sym)m(b)s
+(ols)d(in)h(the)609 2642 y(alphab)s(et.)609 2755 y(Example:)d([?])i
+(and)20 b(an)g(alphab)s(et)g Fc(f)p Fe(a,)k(b,)e(c)p
+Fc(g)f Fe(denotes)g(the)f(language)i Fc(f)p Fe(\\a","b","c")p
+Fc(g)p Fe(.)382 2940 y Fd("")609 3052 y Fe(quotes)31
+b(cancels)h(ev)m(ery)f(sp)s(ecial)g(meaning)e(of)i(the)f(sym)m(b)s
+(ols.)609 3165 y(Example:)40 b(["?)71 b(0"])32 b(denotes)f(the)f
+(language)i Fc(f)p Fe("?)72 b(0")p Fc(g)p Fe(.)382 3350
+y Fd([A)45 b Fe(])609 3463 y(brac)m(k)m(ets)32 b(are)f(used)e(to)i(c)m
+(hange)h(the)f(precedence)f(of)h(a)g(regular)f(relation.)382
+3648 y Fd(\(A\))609 3761 y Fe(paren)m(thesis)h(expresses)f(optionalit)m
+(y)-8 b(,)33 b(and)d(has)g(the)h(same)e(meaning)h(as)h([)p
+Fb(A)p Fc(j)p Fe(0].)382 3946 y Fd(A)70 b(B)609 4058
+y Fe(Concatenation)32 b(of)f(the)f(expressions)g(or)h(relations)g(A)g
+(and)e(B.)609 4171 y(Example:)39 b([[a)55 b(b])27 b([c)55
+b(d]])28 b(denotes)g(the)f(language)i Fc(f)p Fe("ac",)h("ad",)f("b)s
+(c",)g("b)s(d")p Fc(g)382 4356 y Fd(A)35 b(^)g(n)609
+4469 y Fe(Concatenation)d(of)f(A)f(n)g(times.)40 b(A^0)32
+b(is)e(de\014ned)f(as)i(the)f(empt)m(y)g(string.)609
+4582 y(Example:)40 b([a]^3)32 b(describ)s(es)e(the)g(language)i
+Fc(f)p Fe("aaa")p Fc(g)p Fe(.)382 4767 y Fd(A)70 b(B)609
+4880 y Fe(Union)30 b(of)h(the)f(languages)i(or)e(relations)i(A)e(and)g
+(B.)609 4992 y(Example:)40 b([a)61 b(b])30 b(describ)s(es)g(the)h
+(language)g Fc(f)p Fe(\\a",)i(\\b")p Fc(g)p Fe(.)382
+5177 y Fd(A)i(&)g(B)609 5290 y Fe(In)m(tersection)d(of)e(the)h
+(languages)h(A)e(and)g(B.)609 5403 y(Example:)40 b([a)61
+b(b])30 b(&)g([a])i(describ)s(es)d(the)i(language)h Fc(f)p
+Fe(\\a")p Fc(g)p Fe(.)1854 5652 y(2)p eop
+%%Page: 3 3
+3 2 bop 382 548 a Fd(A)35 b(-)f(B)609 661 y Fe(Min)m(us)e(of)h(the)f
+(languages)h(A)g(and)e(B,)i(and)f(has)g(the)g(same)g(meaning)f(as)h([A)
+h(&)609 774 y Fc(\030)10 b Fb(B)5 b Fe(])609 887 y(Example:)40
+b([a)61 b(b])30 b(-)h([a])g(describ)s(es)f(the)g(language)i
+Fc(f)p Fe(\\b")p Fc(g)p Fe(.)382 1073 y Fc(\030)p Fd(A)609
+1186 y Fe(Describ)s(es)25 b(the)f(complemen)m(t)g(of)g(an)h
+(expression,)g(and)f(has)g(the)h(same)e(meaning)609 1299
+y(as)k([?*)g(-)g(A].)g(Note)g(that)h(complemen)m(t)d(is)i(alw)m(a)m(ys)
+h(de\014ned)d(o)m(v)m(er)j(an)e(alphab)s(et)g(-)609 1412
+y(the)h(expression)g Fc(\030)10 b Fe([)p Fb(A)p Fe(])27
+b(is)g(only)g(unam)m(biguous)e(with)i(resp)s(ect)g(to)h(an)e(alphab)s
+(et.)609 1525 y(Example:)50 b Fc(\030)18 b Fe([)p Fb(a)p
+Fe(])35 b(denotes)h(the)f(language)i(that)f(do)s(esn't)f(con)m(tain)h
+(the)g(string)609 1638 y(\\a".)k(If)24 b(the)h(alphab)s(et)g(is)f
+Fc(f)p Fe(a,b)p Fc(g)p Fe(,)k(then)c Fc(\030)10 b Fe([)p
+Fb(a)p Fe(])25 b(denotes)g(the)g(language)h Fc(f)p Fe("",)h("b",)609
+1751 y("aa",)33 b("ba",)e(...)p Fc(g)382 1937 y Fd(A+)609
+2050 y Fe(Rep)s(etition)44 b(\(Kleenes)f(plus\).)77 b(A)42
+b(concatenated)j(with)d(itself)h(an)g(arbitrary)609 2163
+y(n)m(um)m(b)s(er)28 b(of)j(times,)f(including)g(zero)h(times.)609
+2276 y(Example:)40 b([a]+)31 b(denotes)g(the)f(in\014nite)g(language)i
+Fc(f)p Fe(\\a","aa","aaa")q(,...)q Fc(g)382 2463 y Fd(A*)609
+2575 y Fe(Kleene's)f(star:)41 b([A+)61 b(0].)609 2688
+y(Example:)40 b([a]*)32 b(denotes)f(the)f(in\014nite)g(language)i
+Fc(f)p Fe("","a","aa",...)p Fc(g)382 2875 y Fd($A)609
+2988 y Fe(Con)m(tainmen)m(t.)63 b(The)38 b(set)g(of)g(strings)g(where)f
+(A)h(app)s(ear)f(at)i(least)g(once)f(as)g(a)609 3101
+y(substring.)i(Con)m(tainmen)m(t)30 b(is)h(the)f(same)g(thing)g(as)h
+([?*)g(A)f(?*])382 3287 y Fd(A)35 b(.x.)47 b(B)609 3400
+y Fe(Cross)30 b(pro)s(duct)f(of)i(the)f(languages)i(A)e(and)g(B.)609
+3513 y(Example:)39 b([[a)56 b(b])27 b(.x.)40 b(c])29
+b(describ)s(es)e(the)h(relations)g Fc(f)p Fe(\("a",)j("c"\),)f(\(\\b",)
+f("c"\))p Fc(g)p Fe(.)382 3700 y Fd(A)35 b(.o.)47 b(B)609
+3813 y Fe(Comp)s(osition)30 b(of)g(the)h(relations)g(A)g(and)e(B.)609
+3925 y(Example:)40 b([a:b)61 b(c:)41 b(d])30 b(.o.)42
+b([d:e])31 b(describ)s(es)e(the)i(relation)g Fc(f)p Fe(\("c","e"\))p
+Fc(g)p Fe(.)523 4135 y(The)41 b(precedence)i(of)f(the)g(op)s(erators)g
+(is)g(as)g(follo)m(ws,)47 b(where)41 b(4)h(is)g(the)g(highest)382
+4248 y(precedence:)382 4433 y Fd(4)k Fc(\030)30 b Fe(^)g(*)h(+)f($)382
+4619 y Fd(3)46 b Fe(Concatenation)382 4806 y Fd(2)76
+b Fe(&)30 b(-)382 4992 y Fd(1)46 b Fe(.x.)41 b(.o.)523
+5177 y(A)31 b(\014le)g(con)m(taining)h(a)f(program)f(m)m(ust)f(end)h
+(with)h(*.fst,)g(and)g(an)f(input)g(\014le)h(m)m(ust)382
+5290 y(end)44 b(with)h(*.dat.)86 b(A)45 b(program)f(is)h(a)h
+(collection)h(of)f(functions)e(de\014ning)g(regular)382
+5403 y(relations.)39 b(A)22 b(function)h(with)f(zero)h(argumen)m(ts)e
+(is)i(called)g(a)g Fd(de\014nition)e Fe(or)h(a)h Fd(macro)p
+Fe(.)1854 5652 y(3)p eop
+%%Page: 4 4
+4 3 bop 523 548 a Fe(A)31 b(de\014nition,)f(or)g(a)h(macro,)f(can)h
+(for)f(example)g(lo)s(ok)h(lik)m(e)h(this:)382 848 y
+Fa(<digits>)45 b(::=)i("1")g(|)h("2")f(|)g("3")g(|)g("4")g(|)h("5")f(|)
+1002 961 y("6")g(|)h("7")f(|)g("8")g(|)g("9")g(|)h("0";)382
+1149 y Fe(and)30 b(a)g(function)g(can)h(lo)s(ok)g(lik)m(e)h(this:)382
+1450 y Fa(<swap,a,b>)45 b(::=)i(b)g(a)h(;)523 1637 y
+Fe(Note)29 b(that)g(strings)e(are)i(mark)m(ed)e(with)g(quotes,)i(and)f
+(v)-5 b(ariables)28 b(ha)m(v)m(e)h(no)f(quotes.)523 1750
+y(Ev)m(ery)42 b(program)e(m)m(ust)g(con)m(tain)j(a)e(main)g
+(de\014nition)g(\(a)h(program)e(without)h(a)382 1863
+y(main)29 b(de\014nition)h(will)h(result)f(in)g(a)h(parse)f(error\).)
+382 2164 y Fa(<main>)46 b(::=)h(...)g(;)523 2351 y Fe(The)26
+b(alphab)s(et)h(of)g(a)h(program)d(is)i(the)g(sym)m(b)s(ols)f(in)g(the)
+i(regular)f(relation)h(de\014ned)382 2464 y(in)i(the)h(program.)382
+2751 y Ff(1.4)135 b(Example)46 b(program)382 2953 y Fe(The)20
+b(example)g(w)m(as)g(found)f(at)i(h)m(ttp://www.xrce.xero)m
+(x.com/researc)m(h/mltt/fst/fsexamples.h)m(tml.)382 3066
+y(The)38 b(program)f(sim)m(ulates)i(a)f(so)s(da)h(mac)m(hine)f(and)g
+(tak)m(es)h(a)g(collection)i(of)e(sym)m(b)s(ols)382 3179
+y(that)32 b(sym)m(b)s(olises)e(di\013eren)m(t)i(coins.)43
+b(If)31 b(the)h(amoun)m(t)e(of)i(money)e(applied)h(to)h(the)f(ma-)382
+3292 y(c)m(hine)26 b(corresp)s(onds)e(to)j(65)f(cen)m(t,)i(then)d(the)h
+(mac)m(hine)f(pro)s(duces)g(a)h(PLONK)f(\(enough)382
+3405 y(money)k(has)h(b)s(een)g(put)g(in)m(to)h(the)g(mac)m(hine)f(to)h
+(get)g(a)g(so)s(da\).)382 3618 y Fa(<nickel>)93 b(::=)47
+b(["n")g(.x.)g("c"^5];)382 3731 y(<dime>)189 b(::=)47
+b(["d")g(.x.)g("c"^10];)382 3843 y(<quarter>)e(::=)i(["q")g(.x.)g
+("c"^25];)382 3956 y(<cent>)189 b(::=)47 b(["c")g(.x.)g("c"];)382
+4069 y(<money>)141 b(::=)47 b([)h(<nickel>)d(|)j(<dime>)e(|)h
+(<quarter>)e(|)j(<cent>]*;)382 4182 y(<drink>)141 b(::=)47
+b(["c"^65)f(.x.)h("PLONK"];)382 4295 y(<main>)189 b(::=)47
+b([)h(<money>)d(.o.)i(<drink>)f(];)382 4582 y Ff(1.5)135
+b(Running)45 b(FstStudio)382 4784 y Fe(fstStudio)30 b(can)g(b)s(e)g
+(run)f(in)h(t)m(w)m(o)i(mo)s(des,)d(batc)m(h)i(mo)s(de)e(and)h(in)m
+(teractiv)m(e)j(mo)s(de.)382 5071 y Ff(1.6)135 b(Batc)l(h)45
+b(mo)t(de)382 5274 y Fd(fst)609 5387 y Fe(Starts)31 b(fstStudio)e(in)i
+(in)m(teractiv)m(e)i(mo)s(de.)39 b(See)31 b(b)s(elo)m(w.)1854
+5652 y(4)p eop
+%%Page: 5 5
+5 4 bop 417 548 a Fd(fst)34 b(FILE)g([Options)45 b Fe(])609
+661 y(Run)24 b(fstStudio)g(in)g(batc)m(h)h(mo)s(de.)38
+b(FILE)24 b(m)m(ust)f(end)h(with)h(*.fst,)h(whic)m(h)f(de\014nes)609
+774 y(a)38 b(FstStudio)f(program,)i(or)e(*.net,)j(whic)m(h)d(de\014nes)
+g(a)h(sa)m(v)m(ed)g(transducer.)61 b(If)609 887 y(no)27
+b(options)g(is)g(giv)m(en,)h(then)f(input)f(is)h(tak)m(en)g(from)f
+(standard)g(input,)h(the)f(tran-)609 1000 y(ducer)f(is)h(applied)f(do)m
+(wn,)i(and)e(the)h(output,)g(if)g(an)m(y)-8 b(,)27 b(is)f(pro)s(duced)e
+(on)h(standard)609 1112 y(output.)p 523 1233 1549 4 v
+523 1250 V 521 1363 4 113 v 538 1363 V 589 1329 a Fd(Options)p
+996 1363 V 99 w(Meaning)p 2053 1363 V 2070 1363 V 523
+1366 1549 4 v 521 1479 4 113 v 538 1479 V 589 1445 a
+Fe(-u)p 996 1479 V 377 w(apply)30 b(the)h(transducer)e(up)p
+2053 1479 V 2070 1479 V 521 1592 V 538 1592 V 589 1558
+a(-d)p 996 1592 V 377 w(apply)h(the)h(transducer)e(up)p
+2053 1592 V 2070 1592 V 521 1705 V 538 1705 V 589 1671
+a(-i)i(FILE)p 996 1705 V 161 w(tak)m(e)h(input)d(from)g(FILE)p
+2053 1705 V 2070 1705 V 521 1818 V 538 1818 V 589 1784
+a(-o)j(FILE)p 996 1818 V 140 w(write)f(output)f(to)h(FILE)p
+2053 1818 V 2070 1818 V 523 1821 1549 4 v 523 1838 V
+382 2065 a Ff(1.7)135 b(In)l(teractiv)l(e)47 b(mo)t(de)382
+2268 y Fe(In)m(teractiv)m(e)33 b(mo)s(de)c(is)h(en)m(tered)h(b)m(y)f(t)
+m(yping)h(the)g(follo)m(wing)h(command:)382 2585 y Fa($)47
+b(fstStudio)f(<return>)382 2811 y(************************)o(****)o
+(***)o(****)o(****)o(***)o(****)o(****)o(***)382 2924
+y(*)h(Welcome)f(to)h(Finite)f(State)h(Transducer)e(Studio!)380
+b(*)382 3036 y(*)47 b(Written)f(purely)g(in)h(Haskell.)1144
+b(*)382 3149 y(*)47 b(Version)f(:)i(0.9)1765 b(*)382
+3262 y(*)47 b(Date)190 b(:)48 b(11)f(August)f(2001)1240
+b(*)382 3375 y(*)47 b(Author)94 b(:)48 b(Markus)e(Forsberg)1191
+b(*)382 3488 y(*)47 b(Please)f(send)h(bug)g(reports/suggestions)c(to:)
+524 b(*)382 3601 y(*)47 b(d97forma@dtek.chalmers.se)1187
+b(*)382 3714 y(************************)o(****)o(***)o(****)o(****)o
+(***)o(****)o(****)o(***)382 3940 y(Type)47 b('h')f(for)h(help.)382
+4166 y(>)382 4564 y Ff(1.8)135 b(List)46 b(of)f(commands)382
+4767 y Fd(r)35 b(REG)609 4879 y Fe(Read)g(a)h(regular)f(relation)h
+(from)d(standard)h(input.)54 b(If)34 b(a)i(regular)f(expression)609
+4992 y(is)c(t)m(yp)s(ed,)f(then)g(it)h(is)f(in)m(terpreted)h(as)g(the)f
+(iden)m(tit)m(y)i(relation.)382 5177 y Fd(b)609 5290
+y Fe(Build)20 b(a)h(epsilonfree,)i(deterministic,)f(minimal)d
+(transducer)g(from)g(a)i(loaded/t)m(yp)s(ed)609 5403
+y(regular)31 b(relation.)1854 5652 y(5)p eop
+%%Page: 6 6
+6 5 bop 382 548 a Fd(bn)609 661 y Fe(Build)47 b(a)g(epsilonfree,)k(p)s
+(ossibly)46 b(non-deterministic,)k(non-minimal)45 b(trans-)609
+774 y(ducer)30 b(from)f(a)i(load/t)m(yp)s(ed)g(regular)f(relation.)382
+961 y Fd(m)609 1074 y Fe(Minimize)h(a)f(built)h(transducer.)382
+1262 y Fd(det)609 1375 y Fe(Determinize)g(a)g(built)f(transducer)382
+1562 y Fd(s)35 b(FILE)609 1675 y Fe(Sa)m(v)m(e)k(to)e(FILE.)h(If)e
+(FILE)h(ends)f(with)h(*.net,)j(then)d(the)g(built)g(transducer)g(is)609
+1788 y(sa)m(v)m(ed.)55 b(An)m(y)34 b(other)h(su\016x,)g(sa)m(v)m(es)h
+(the)f(pro)s(duced)e(output)h(in)g(the)h(system)f(to)609
+1901 y(FILE,)d(if)f(an)m(y)-8 b(.)382 2089 y Fd(l)34
+b(FILE)609 2202 y Fe(Load)i(from)e(FILE.)h(FILE)h(m)m(ust)e(end)h(with)
+g(*.fst,)j(*.net)e(or)g(*.dat.)57 b(If)35 b(FILE)609
+2315 y(ends)28 b(with)g(*.fst,)h(then)f(a)h(FstStudio)f(program)f(is)h
+(loaded)h(in)m(to)g(FstStudio.)40 b(If)609 2428 y(FILE)33
+b(ends)g(with)g(*.net,)j(then)d(a)h(transducer)f(is)g(loaded)h(in)m(to)
+h(FstStudio.)50 b(If)609 2540 y(FILE)30 b(ends)g(with)g(*.dat,)i(then)e
+(input)f(is)h(loaded)h(in)m(to)h(FstStudio.)382 2728
+y Fd(l)i(ab)609 2841 y Fe(Load)c(and)e(union)g(t)m(w)m(o)j
+(transducers.)39 b(a)30 b(and)e(b)h(m)m(ust)f(either)i(b)s(e)e(a)i
+(\014le)f(ending)609 2954 y(with)22 b(*.net)h(or)g(the)f(sym)m(b)s(ol)f
+(*,)k(whic)m(h)d(refers)f(to)i(the)g(in)m(terior)g(transducer.)37
+b(The)609 3067 y(pro)s(duced)29 b(transducer)g(is)i(p)s(ossibly)e
+(non-deterministic)h(and)g(non-minimal.)382 3254 y Fd(l)k(a)g(b)609
+3367 y Fe(Load)44 b(and)g(concatenate)i(t)m(w)m(o)g(transducers.)80
+b(a)45 b(and)e(b)h(m)m(ust)e(either)j(b)s(e)e(a)609 3480
+y(\014le)f(ending)g(with)g(*.net)h(or)f(the)g(sym)m(b)s(ol)f(*,)k(whic)
+m(h)d(refers)g(to)h(the)f(in)m(terior)609 3593 y(transducer.)81
+b(The)43 b(pro)s(duced)f(transducer)h(is)h(p)s(ossibly)f
+(non-deterministic)609 3706 y(and)30 b(non-minimal.)382
+3894 y Fd(l)k(a)g(*)609 4007 y Fe(Load)41 b(and)g(apply)f(Kleene's)i
+(star)f(on)g(a)g(transducer.)72 b(a)42 b(m)m(ust)d(either)j(b)s(e)e(a)
+609 4120 y(\014le)i(ending)g(with)g(*.net)h(or)f(the)g(sym)m(b)s(ol)f
+(*,)k(whic)m(h)d(refers)g(to)h(the)f(in)m(terior)609
+4232 y(transducer.)81 b(The)43 b(pro)s(duced)f(transducer)h(is)h(p)s
+(ossibly)f(non-deterministic)609 4345 y(and)30 b(non-minimal.)382
+4533 y Fd(l)k(a)g(.o.)47 b(b)609 4646 y Fe(Load)42 b(and)g(comp)s(ose)f
+(t)m(w)m(o)j(transducers.)75 b(a)42 b(and)g(b)f(m)m(ust)g(either)i(b)s
+(e)e(a)i(\014le)609 4759 y(ending)32 b(with)g(*.net)i(or)e(the)h(sym)m
+(b)s(ol)e(*,)j(whic)m(h)e(refers)g(to)i(the)e(in)m(terior)i(trans-)609
+4872 y(ducer.)85 b(The)45 b(pro)s(duced)e(transducer)i(is)g(p)s
+(ossibly)f(non-deterministic)h(and)609 4985 y(non-minimal.)382
+5172 y Fd(vt)609 5285 y Fe(View)31 b(loaded/built)g(transducer.)1854
+5652 y(6)p eop
+%%Page: 7 7
+7 6 bop 382 548 a Fd(vr)609 661 y Fe(View)31 b(loaded/t)m(yp)s(ed)g
+(regular)g(relation.)382 847 y Fd(vi)609 960 y Fe(View)g(loaded)g
+(input.)382 1146 y Fd(v)m(o)609 1259 y Fe(View)g(pro)s(duced)e(output.)
+382 1445 y Fd(d)609 1558 y Fe(Apply)h(transducer)f(do)m(wn)h(with)g
+(loaded)h(input.)382 1744 y Fd(u)609 1857 y Fe(Apply)f(transducer)f(up)
+h(with)g(loaded)h(input.)382 2043 y Fd(d)k(SYMBOLS)609
+2156 y Fe(Apply)30 b(tranducer)g(do)m(wn)f(with)i(SYMBOLS.)382
+2342 y Fd(u)k(SYMBOLS)609 2455 y Fe(Apply)30 b(transducer)f(up)h(with)g
+(SYMBOLS.)382 2641 y Fd(c)609 2754 y Fe(Clear)h(memory)-8
+b(.)382 2940 y Fd(h)609 3053 y Fe(List)31 b(commands.)382
+3239 y Fd(q)609 3352 y Fe(End)e(session.)382 3637 y Ff(1.9)135
+b(Example)46 b(on)f(FstStudio)g(in)g(in)l(teractiv)l(e)i(mo)t(de)382
+3840 y Fe(First,)39 b(sa)m(v)m(e)g(example)e(program)e(ab)s(o)m(v)m(e)k
+(to)e(the)h(\014le)f('drink.fst'.)60 b(Then)36 b(start)i(Fst-)382
+3953 y(Studio)30 b(in)g(in)m(teractiv)m(e)j(mo)s(de.)382
+4161 y Fa(>l)47 b(drink.fst)382 4387 y(Loaded)f(a)h(regular)f(relation)
+g(from)g(drink.fst.)382 4613 y(>b)382 4839 y(Built)g(a)i
+(deterministic,)c(minimal)h(transducer)g(with)i(26)g(states)f(and)h(46)
+g(transitions.)382 5064 y(>u)g(PLONK)382 5290 y(Input)f(accepted.)g
+(Type)g('vo')h(to)g(view)g(outputs.)1854 5652 y Fe(7)p
+eop
+%%Page: 8 8
+8 7 bop 382 548 a Fa(>vo)382 774 y(...)382 887 y(q)47
+b(n)h(n)f(d)h(d)f(d)382 1000 y(q)g(n)h(n)f(d)h(d)f(n)h(n)382
+1112 y(q)f(n)h(n)f(d)h(n)f(n)h(d)382 1225 y(q)f(n)h(n)f(d)h(n)f(n)h(n)f
+(n)382 1338 y(q)g(n)h(n)f(d)h(n)f(d)h(n)382 1451 y(q)f(d)h(n)f(q)382
+1564 y(q)g(d)h(n)f(n)h(d)f(d)382 1677 y(q)g(d)h(n)f(n)h(d)f(n)h(n)382
+1790 y(q)f(d)h(n)f(n)h(n)f(n)h(d)382 1903 y(q)f(d)h(n)f(n)h(n)f(n)h(n)f
+(n)382 2016 y(q)g(d)h(n)f(n)h(n)f(d)h(n)382 2129 y(q)f(d)h(n)f(d)h(n)f
+(d)382 2242 y(q)g(d)h(n)f(d)h(n)f(n)h(n)382 2355 y(q)f(d)h(n)f(d)h(d)f
+(n)382 2467 y(q)g(d)h(q)f(n)382 2580 y(q)g(d)h(d)f(d)h(d)382
+2693 y(q)f(d)h(d)f(d)h(n)f(n)382 2806 y(q)g(d)h(d)f(n)h(n)f(d)382
+2919 y(q)g(d)h(d)f(n)h(n)f(n)h(n)382 3032 y(...)382 3258
+y(>s)f(drink.out)382 3484 y(Saved)f(outputs)g(to)h(file)g(drink.out.)
+382 3709 y(>q)382 3935 y(Do)g(you)g(really)f(want)h(to)g(quit?)f
+(\(y\):y)382 4161 y(Session)g(ended.)523 4374 y Fe(In)36
+b('drink.out')g(w)m(e)h(no)m(w)f(ha)m(v)m(e)i(all)f(p)s(ossible)f(w)m
+(a)m(ys)i(to)f(feed)f(the)h(so)s(da)f(mac)m(hine)382
+4487 y(with)d(coins,)i(with)f(regard)f(to)i(order,)f(in)f(suc)m(h)g(a)h
+(w)m(a)m(y)h(that)f(w)m(e)g(get)h(a)f(so)s(da.)50 b(There)382
+4599 y(are)31 b(634)g(di\013eren)m(t)g(w)m(a)m(ys.)1854
+5652 y(8)p eop
+%%Trailer
+end
+userdict /end-hook known{end-hook}if
+%%EOF
diff --git a/fst.cabal b/fst.cabal
new file mode 100644
--- /dev/null
+++ b/fst.cabal
@@ -0,0 +1,36 @@
+name:                fst
+version:             0.9
+synopsis:            Finite state transducers
+description:         Fst is an application for construction and running of
+                     finite state transducers. The application was written
+                     purely in Haskell, and is intended to be a tool for the
+                     Haskell programmer, especially for ones that develop language applications.
+category:            Compilers/Interpreters
+license:             BSD3
+license-file:        LICENSE
+author:              Markus Forsberg
+maintainer:          Markus Forsberg <markus@cs.chalmers.se>
+homepage:            http://www.cs.chalmers.se/~markus/fstStudio/
+build-type:          Simple
+build-depends:       base, haskell98
+Cabal-Version:       >= 1.2
+tested-with:         GHC==6.8.2
+
+data-files:          doc/fstMan0.9.ps, doc/Interface0.9.ps
+
+Library
+        Build-Depends:       base, haskell98, array
+        exposed-modules:     FST.Alex, FST.Arguments, FST.Automaton, FST.AutomatonInterface, FST.AutomatonTypes,
+                             FST.Complete, FST.Deterministic, FST.DeterministicT, FST.EpsilonFreeT, FST.FileImport,
+                             FST.GetOpt, FST.Info, FST.LBFA, FST.LBFT, FST.Lexer, FST.MinimalBrzozowski, FST.MinimalTBrzozowski,
+                             FST.NReg, FST.Parse, FST.RegTypes, FST.Reversal, FST.ReversalT, FST.RRegTypes, FST.RunTransducer,
+                             FST.StateMonad, FST.Transducer, FST.TransducerInterface, FST.TransducerTypes, FST.Utils
+        ghc-options:         -O2 -Wall -optl-Wl,-s
+        ghc-prof-options:    -prof -auto-all
+
+Executable fst
+        executable:          fst
+        main-is:             FST/Main.hs
+        ghc-options:         -O2 -Wall -optl-Wl,-s
+        ghc-prof-options:    -prof -auto-all
+
