libcspm (empty) → 0.1
raw patch · 60 files changed
+9404/−0 lines, 60 filesdep +arraydep +basedep +containerssetup-changed
Dependencies added: array, base, containers, directory, filepath, graph-wrapper, libcspm, mtl, pretty
Files
- LICENSE.txt +25/−0
- README.md +68/−0
- Setup.hs +4/−0
- dist/build/CSPM/Parser/Lexer.hs +503/−0
- libcspm.cabal +105/−0
- src/CSPM.hs +187/−0
- src/CSPM/Compiler/Events.hs +33/−0
- src/CSPM/Compiler/Map.hs +32/−0
- src/CSPM/Compiler/Processes.hs +57/−0
- src/CSPM/Compiler/Set.hs +39/−0
- src/CSPM/DataStructures/Names.hs +19/−0
- src/CSPM/DataStructures/Syntax.hs +261/−0
- src/CSPM/DataStructures/Tokens.hs +199/−0
- src/CSPM/DataStructures/Types.hs +165/−0
- src/CSPM/Desugar.hs +179/−0
- src/CSPM/Evaluator.hs +50/−0
- src/CSPM/Evaluator/BuiltInFunctions.hs +95/−0
- src/CSPM/Evaluator/DeclBind.hs +120/−0
- src/CSPM/Evaluator/Environment.hs +13/−0
- src/CSPM/Evaluator/Exceptions.hs +32/−0
- src/CSPM/Evaluator/Expr.hs +342/−0
- src/CSPM/Evaluator/Expr.hs-boot +14/−0
- src/CSPM/Evaluator/Module.hs +21/−0
- src/CSPM/Evaluator/Monad.hs +75/−0
- src/CSPM/Evaluator/PatBind.hs +78/−0
- src/CSPM/Evaluator/ValueSet.hs +171/−0
- src/CSPM/Evaluator/ValueSet.hs-boot +9/−0
- src/CSPM/Evaluator/Values.hs +81/−0
- src/CSPM/Evaluator/Values.hs-boot +9/−0
- src/CSPM/Parser.hs +30/−0
- src/CSPM/Parser/Exceptions.hs +46/−0
- src/CSPM/Parser/Lexer.x +329/−0
- src/CSPM/Parser/Monad.hs +143/−0
- src/CSPM/Parser/Parser.hs +2383/−0
- src/CSPM/PrettyPrinter.hs +287/−0
- src/CSPM/TypeChecker.hs +62/−0
- src/CSPM/TypeChecker/BuiltInFunctions.hs +132/−0
- src/CSPM/TypeChecker/Common.hs +67/−0
- src/CSPM/TypeChecker/Compressor.hs +175/−0
- src/CSPM/TypeChecker/Decl.hs +341/−0
- src/CSPM/TypeChecker/Decl.hs-boot +7/−0
- src/CSPM/TypeChecker/Dependencies.hs +270/−0
- src/CSPM/TypeChecker/Environment.hs +33/−0
- src/CSPM/TypeChecker/Exceptions.hs +102/−0
- src/CSPM/TypeChecker/Expr.hs +367/−0
- src/CSPM/TypeChecker/InteractiveStmt.hs +24/−0
- src/CSPM/TypeChecker/Module.hs +21/−0
- src/CSPM/TypeChecker/Monad.hs +373/−0
- src/CSPM/TypeChecker/Pat.hs +60/−0
- src/CSPM/TypeChecker/Unification.hs +571/−0
- src/Util/Annotated.hs +133/−0
- src/Util/Annotated.hs-boot +14/−0
- src/Util/Exception.hs +103/−0
- src/Util/HierarchicalMap.hs +73/−0
- src/Util/List.hs +7/−0
- src/Util/Monad.hs +6/−0
- src/Util/PartialFunctions.hs +60/−0
- src/Util/Prelude.hs +28/−0
- src/Util/PrettyPrint.hs +57/−0
- tests/Main.hs +114/−0
+ LICENSE.txt view
@@ -0,0 +1,25 @@+Copyright (c) 2011, Thomas Gibson-Robinson+All rights reserved.++Redistribution and use in source and binary forms, with or without+modification, are permitted provided that the following conditions are met:+ * Redistributions of source code must retain the above copyright+ notice, this list of conditions and the following disclaimer.+ * 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.+ * Neither the name of the author nor the+ names of its contributors may be used to endorse or promote products+ derived from this software without specific prior written permission.++THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 THOMAS GIBSON-ROBINSON 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.+
+ README.md view
@@ -0,0 +1,68 @@+libcspm+========++This library provides a [FDR](http://www.fsel.com/software.html)-compliant+parser, type checker and (experimental) evaluator for machine CSP files.++There is also a program, `cspmchecker`, that makes use of this library to+provide command line type checking.++Installation+------------++The simplest method is to install via [Hackage](http://hackage.haskell.org/).+`cabal install cspmchecker` will install cspmchecker and its dependencies.++Otherwise, if you obtain a source distribution then the following commands +will install `libcspm`.++ cabal configure+ cabal build+ cabal install++To install `cspmchecker`, firstly install `libcspm` as above, then change+directory to `cspmchecker` and run the following commands.++ cabal configure+ cabal build+ cabal install++This should make `cspmchecker` available from your command line shell+(if not check that the location `cabal` installs binaries to is on your +`$PATH`).++Usage of cspmchecker+----------------------++From a command line shell simply do `cspmchecker file.csp` to type check+the files. Any error messages will be printed out. For example:++ $ cspmchecker ucsexamples/chapter04/abp.csp + Checking ucsexamples/chapter04/abp.csp.....+ ucsexamples/chapter04/abp.csp:80:36-39:+ Couldn't match expected type Int.Int with actual type Int+ In the expression: bit+ In the expression: ack == bit+ In the expression: (ack == bit)++Documentation of the type system is forthcoming.++Usage of libcspm+----------------++See http://tomgr.github.com/libcspm/doc/libcspm/index.html for documentation.++Testing+-------++To test `libcspm` run the following commands.++ cabal configure --enable-tests+ cabal build+ cabal test++Bug Reports+-----------++Please files bug reports at https://github.com/tomgr/libcspm/issues. Please+provide a minimal example script that exhibits the error (if possible).
+ Setup.hs view
@@ -0,0 +1,4 @@+#! /usr/bin/env runhaskell++import Distribution.Simple+main = defaultMain
+ dist/build/CSPM/Parser/Lexer.hs view
@@ -0,0 +1,503 @@+{-# LANGUAGE CPP,MagicHash #-}+{-# LINE 1 "src/CSPM/Parser/Lexer.x" #-}++{-# LANGUAGE DoAndIfThenElse #-}+{-# OPTIONS_GHC -fno-warn-lazy-unlifted-bindings #-}+module CSPM.Parser.Lexer where++import Data.List++import Control.Monad.Trans+import CSPM.DataStructures.Tokens+import CSPM.Parser.Exceptions+import CSPM.Parser.Monad+import Util.Annotated+import Util.Exception+++#if __GLASGOW_HASKELL__ >= 603+#include "ghcconfig.h"+#elif defined(__GLASGOW_HASKELL__)+#include "config.h"+#endif+#if __GLASGOW_HASKELL__ >= 503+import Data.Array+import Data.Char (ord)+import Data.Array.Base (unsafeAt)+#else+import Array+import Char (ord)+#endif+#if __GLASGOW_HASKELL__ >= 503+import GHC.Exts+#else+import GlaExts+#endif+alex_base :: AlexAddr+alex_base = AlexA# "\xf8\xff\xff\xff\x6d\x00\x00\x00\x72\x00\x00\x00\x00\x00\x00\x00\x77\x00\x00\x00\xba\x00\x00\x00\x2f\x01\x00\x00\xa4\x01\x00\x00\x19\x02\x00\x00\x8e\x02\x00\x00\x03\x03\x00\x00\x7b\x00\x00\x00\x7c\x00\x00\x00\xfc\xff\xff\xff\xfd\xff\xff\xff\xfe\xff\xff\xff\x7d\x00\x00\x00\x7e\x00\x00\x00\x7f\x00\x00\x00\x80\x00\x00\x00\x81\x00\x00\x00\x82\x00\x00\x00\x84\x00\x00\x00\x85\x00\x00\x00\x86\x00\x00\x00\x87\x00\x00\x00\xff\xff\xff\xff\x01\x00\x00\x00\x02\x00\x00\x00\xf4\x00\x00\x00\xe1\xff\xff\xff\x67\x00\x00\x00\x68\x00\x00\x00\x69\x00\x00\x00\xea\xff\xff\xff\xac\xff\xff\xff\x9a\xff\xff\xff\xf0\xff\xff\xff\xa1\xff\xff\xff\xa0\xff\xff\xff\xaa\xff\xff\xff\xa5\xff\xff\xff\xa3\xff\xff\xff\xad\xff\xff\xff\xa6\xff\xff\xff\x9e\xff\xff\xff\x00\x00\x00\x00\xe9\xff\xff\xff\x1d\x00\x00\x00\x33\x00\x00\x00\x27\x00\x00\x00\x00\x00\x00\x00\x37\x00\x00\x00\x3c\x00\x00\x00\x3a\x00\x00\x00\x2f\x00\x00\x00\x32\x00\x00\x00\x3f\x00\x00\x00\x38\x00\x00\x00\x95\x00\x00\x00\x50\x00\x00\x00\x45\x00\x00\x00\x53\x00\x00\x00\x54\x00\x00\x00\x00\x00\x00\x00\x55\x00\x00\x00\x48\x00\x00\x00\x57\x00\x00\x00\x58\x00\x00\x00\x00\x00\x00\x00\x56\x00\x00\x00\x4a\x00\x00\x00\x59\x00\x00\x00\x5d\x00\x00\x00\x52\x00\x00\x00\x6a\x00\x00\x00\x60\x00\x00\x00\xaf\x00\x00\x00\x66\x00\x00\x00\x5c\x00\x00\x00\x6b\x00\x00\x00\x6e\x00\x00\x00\x00\x00\x00\x00\x6f\x00\x00\x00\x62\x00\x00\x00\x71\x00\x00\x00\x73\x00\x00\x00\x00\x00\x00\x00\x61\x00\x00\x00\x78\x00\x00\x00\x70\x00\x00\x00\x94\x00\x00\x00\x97\x00\x00\x00\x96\x00\x00\x00\x9f\x00\x00\x00\x9e\x00\x00\x00\xe5\x00\x00\x00\xa0\x00\x00\x00\x98\x00\x00\x00\xa2\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xa5\x00\x00\x00\x9a\x00\x00\x00\xa4\x00\x00\x00\xa8\x00\x00\x00\x00\x00\x00\x00\xa9\x00\x00\x00\x9d\x00\x00\x00\xa6\x00\x00\x00\xa7\x00\x00\x00\xac\x00\x00\x00\xb3\x00\x00\x00\xaa\x00\x00\x00\xae\x00\x00\x00\xb5\x00\x00\x00\xc1\x00\x00\x00\x00\x00\x00\x00\x3d\x03\x00\x00\x07\x01\x00\x00\x1b\x01\x00\x00\xfa\x00\x00\x00\xed\x00\x00\x00\xcd\x00\x00\x00\x00\x00\x00\x00\xe7\x00\x00\x00\x00\x00\x00\x00\xcf\x00\x00\x00\x00\x00\x00\x00\xe9\x00\x00\x00\x00\x00\x00\x00\xd2\x00\x00\x00\x00\x00\x00\x00\xec\x00\x00\x00\x00\x00\x00\x00\xd7\x00\x00\x00\x00\x00\x00\x00\x03\x01\x00\x00\x69\x01\x00\x00\x6f\x01\x00\x00\x43\x03\x00\x00\x01\x01\x00\x00\x36\x01\x00\x00\x38\x01\x00\x00\x18\x01\x00\x00\x77\x01\x00\x00\xde\x01\x00\x00\x0a\x01\x00\x00\x3e\x01\x00\x00\x40\x01\x00\x00\x1e\x01\x00\x00\xe4\x01\x00\x00\xec\x01\x00\x00\x0f\x01\x00\x00\x43\x01\x00\x00\x47\x01\x00\x00\x25\x01\x00\x00\x53\x02\x00\x00\x59\x02\x00\x00\x33\x01\x00\x00\x4c\x01\x00\x00\x4d\x01\x00\x00\x44\x01\x00\x00\x61\x02\x00\x00\xc8\x02\x00\x00\x41\x01\x00\x00\x73\x01\x00\x00\x75\x01\x00\x00\x58\x01\x00\x00\xce\x02\x00\x00\xd6\x02\x00\x00\x55\x01\x00\x00\x7c\x01\x00\x00\x7d\x01\x00\x00\x5b\x01\x00\x00\x4b\x03\x00\x00\x7a\x03\x00\x00\x54\x01\x00\x00\x89\x01\x00\x00\x90\x01\x00\x00\x72\x01\x00\x00\x81\x03\x00\x00\x96\x01\x00\x00\x97\x01\x00\x00\x78\x01\x00\x00\xab\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7b\x01\x00\x00\x86\x03\x00\x00\x00\x00\x00\x00\x84\x03\x00\x00\x48\x01\x00\x00\xd8\x03\x00\x00\x46\x01\x00\x00\x2c\x04\x00\x00\x49\x01\x00\x00\x80\x04\x00\x00\x3d\x01\x00\x00\xd4\x04\x00\x00\x1f\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x73\x05\x00\x00\x4b\x01\x00\x00\xc7\x05\x00\x00\x45\x01\x00\x00\x1b\x06\x00\x00\x56\x01\x00\x00\x6f\x06\x00\x00\xba\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x02\x00\x00\xaf\x01\x00\x00\x2c\x07\x00\x00\x80\x07\x00\x00\xd4\x07\x00\x00\x28\x08\x00\x00\x7c\x08\x00\x00\xd0\x08\x00\x00\x24\x09\x00\x00\x39\x07\x00\x00\x96\x09\x00\x00\xb4\x01\x00\x00\xb5\x01\x00\x00\x93\x01\x00\x00\x9b\x09\x00\x00\xa0\x09\x00\x00\xa5\x09\x00\x00\x4a\x01\x00\x00\xb7\x01\x00\x00\xb8\x01\x00\x00\x9a\x01\x00\x00\xca\x09\x00\x00\xcf\x09\x00\x00\xd4\x09\x00\x00\xb9\x01\x00\x00\xc2\x01\x00\x00\xbf\x01\x00\x00\xdb\x09\x00\x00\xfa\x09\x00\x00\x00\x0a\x00\x00\xdb\x01\x00\x00\xdc\x01\x00\x00\xc5\x01\x00\x00\x05\x0a\x00\x00\x0a\x0a\x00\x00\xe9\x01\x00\x00\xea\x01\x00\x00\xcd\x01\x00\x00\x31\x0a\x00\x00\x36\x0a\x00\x00\xf1\x01\x00\x00\xf2\x01\x00\x00\xd0\x01\x00\x00\x3b\x0a\x00\x00\x40\x0a\x00\x00\xfc\x01\x00\x00\xfd\x01\x00\x00\xe1\x01\x00\x00\x65\x0a\x00\x00\xfe\x01\x00\x00\x05\x02\x00\x00\xe7\x01\x00\x00\x6a\x0a\x00\x00\x6f\x0a\x00\x00\x0b\x02\x00\x00\x0c\x02\x00\x00\xed\x01\x00\x00\x74\x0a\x00\x00\x99\x0a\x00\x00\x0d\x02\x00\x00\x12\x02\x00\x00\xf0\x01\x00\x00\x00\x00\x00\x00\x8a\x0a\x00\x00\xb0\x01\x00\x00\xde\x0a\x00\x00\xc3\x01\x00\x00\x32\x0b\x00\x00\x7d\x0b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd1\x0b\x00\x00\xb6\x01\x00\x00\x25\x0c\x00\x00\x70\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc4\x0c\x00\x00\xc0\x01\x00\x00\x18\x0d\x00\x00\xba\x01\x00\x00\x6c\x0d\x00\x00\xb7\x0d\x00\x00\x00\x00\x00\x00\x29\x0e\x00\x00\x2e\x0e\x00\x00\x33\x0e\x00\x00\x26\x02\x00\x00\x27\x02\x00\x00\x06\x02\x00\x00\x38\x0e\x00\x00\x5d\x0e\x00\x00\x62\x0e\x00\x00\x28\x02\x00\x00\x2a\x02\x00\x00\x08\x02\x00\x00\x68\x0e\x00\x00\x6d\x0e\x00\x00\x87\x0e\x00\x00\x34\x02\x00\x00\x2c\x02\x00\x00\x2d\x02\x00\x00\x0e\x02\x00\x00\x99\x0e\x00\x00\x9f\x0e\x00\x00\xfb\x01\x00\x00\x32\x02\x00\x00\x37\x02\x00\x00\x2e\x02\x00\x00\x00\x00\x00\x00\xb1\x0e\x00\x00\xc9\x0e\x00\x00\xce\x0e\x00\x00\x50\x02\x00\x00\x5d\x02\x00\x00\x5e\x02\x00\x00\x5f\x02\x00\x00\x65\x02\x00\x00\x66\x02\x00\x00\x45\x02\x00\x00\xd7\x0e\x00\x00\x4e\x02\x00\x00\xe7\x0e\x00\x00\xf3\x0e\x00\x00\x72\x02\x00\x00\x73\x02\x00\x00\x56\x02\x00\x00\x00\x00\x00\x00\xff\x0e\x00\x00\x04\x0f\x00\x00\x7a\x02\x00\x00\x7f\x02\x00\x00\x62\x02\x00\x00\x00\x00\x00\x00\x0d\x0f\x00\x00\x80\x02\x00\x00\x82\x02\x00\x00\x64\x02\x00\x00\x00\x00\x00\x00\x1c\x0f\x00\x00\x2a\x0f\x00\x00\x88\x02\x00\x00\x89\x02\x00\x00\x6f\x02\x00\x00\x00\x00\x00\x00\x34\x0f\x00\x00\x39\x0f\x00\x00\x42\x0f\x00\x00\x93\x02\x00\x00\x94\x02\x00\x00\x74\x02\x00\x00\x51\x0f\x00\x00\x5f\x0f\x00\x00\x95\x02\x00\x00\x96\x02\x00\x00\x75\x02\x00\x00\x69\x0f\x00\x00\x99\x02\x00\x00\x9a\x02\x00\x00\x78\x02\x00\x00\x6e\x0f\x00\x00\x9c\x02\x00\x00\x9d\x02\x00\x00\x7b\x02\x00\x00\x77\x0f\x00\x00\x9f\x02\x00\x00\xa0\x02\x00\x00\x7e\x02\x00\x00\x93\x0f\x00\x00\x9c\x0f\x00\x00\xa2\x02\x00\x00\xa3\x02\x00\x00\x83\x02\x00\x00\xa1\x0f\x00\x00\xab\x0f\x00\x00\xb9\x0f\x00\x00\xa7\x02\x00\x00\xab\x02\x00\x00\xa9\x02\x00\x00\xc8\x0f\x00\x00\xac\x02\x00\x00\xc5\x02\x00\x00\xaf\x02\x00\x00\xd1\x0f\x00\x00\xd6\x0f\x00\x00\xc6\x02\x00\x00\xd3\x02\x00\x00\xb1\x02\x00\x00\xe0\x0f\x00\x00\xda\x02\x00\x00\xdb\x02\x00\x00\xb9\x02\x00\x00\xee\x0f\x00\x00\xfc\x0f\x00\x00\xdd\x02\x00\x00\xe6\x02\x00\x00\xc4\x02\x00\x00\x06\x10\x00\x00\x0b\x10\x00\x00\xe8\x02\x00\x00\xee\x02\x00\x00\xcc\x02\x00\x00\x14\x10\x00\x00\x23\x10\x00\x00\xf4\x02\x00\x00\xf5\x02\x00\x00\xd4\x02\x00\x00\x31\x10\x00\x00\xf6\x02\x00\x00\xfa\x02\x00\x00\xd9\x02\x00\x00\x3c\x10\x00\x00\x41\x10\x00\x00\x4a\x10\x00\x00\xfd\x02\x00\x00\xfe\x02\x00\x00\xe4\x02\x00\x00\x59\x10\x00\x00\x08\x03\x00\x00\x09\x03\x00\x00\xe7\x02\x00\x00\x00\x00\x00\x00\x4b\x10\x00\x00\xb0\x02\x00\x00\x96\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xea\x10\x00\x00\xb2\x02\x00\x00\x3e\x11\x00\x00\xaa\x02\x00\x00\x92\x11\x00\x00\xdd\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x31\x12\x00\x00\xad\x02\x00\x00\x85\x12\x00\x00\xa8\x02\x00\x00\xd9\x12\x00\x00\xb5\x02\x00\x00\x2d\x13\x00\x00\x78\x13\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcc\x13\x00\x00\xb7\x02\x00\x00\x20\x14\x00\x00\xa1\x02\x00\x00\x74\x14\x00\x00\xbf\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x13\x15\x00\x00\xb4\x02\x00\x00\x67\x15\x00\x00\xae\x02\x00\x00\xbb\x15\x00\x00\xb6\x02\x00\x00\x0f\x16\x00\x00\xb8\x02\x00\x00\x63\x16\x00\x00\xbc\x02\x00\x00\xb7\x16\x00\x00\x02\x17\x00\x00\x00\x00\x00\x00\x56\x17\x00\x00\xaa\x17\x00\x00\xfe\x17\x00\x00\x52\x18\x00\x00\xa6\x18\x00\x00\xfa\x18\x00\x00\x4e\x19\x00\x00\x99\x19\x00\x00\x00\x00\x00\x00\xed\x19\x00\x00\x41\x1a\x00\x00\x95\x1a\x00\x00\xe9\x1a\x00\x00\x3d\x1b\x00\x00\x88\x1b\x00\x00\x00\x00\x00\x00\xdc\x1b\x00\x00\x30\x1c\x00\x00\x84\x1c\x00\x00\xd8\x1c\x00\x00\x2c\x1d\x00\x00\x80\x1d\x00\x00\xd4\x1d\x00\x00\x28\x1e\x00\x00\x73\x1e\x00\x00\x00\x00\x00\x00\xc7\x1e\x00\x00\x1b\x1f\x00\x00\x6f\x1f\x00\x00\xc3\x1f\x00\x00\x17\x20\x00\x00\x6b\x20\x00\x00\xbf\x20\x00\x00\x0a\x21\x00\x00\x00\x00\x00\x00\x5e\x21\x00\x00\xb2\x21\x00\x00\x06\x22\x00\x00\x5a\x22\x00\x00\xae\x22\x00\x00\x02\x23\x00\x00\x56\x23\x00\x00\xaa\x23\x00\x00\xfe\x23\x00\x00\x49\x24\x00\x00\x00\x00\x00\x00\x9d\x24\x00\x00\xf1\x24\x00\x00\x45\x25\x00\x00\x99\x25\x00\x00\xed\x25\x00\x00\x41\x26\x00\x00\x95\x26\x00\x00\xe0\x26\x00\x00\x00\x00\x00\x00\x52\x27\x00\x00\x57\x27\x00\x00\x15\x03\x00\x00\x16\x03\x00\x00\xf8\x02\x00\x00\x5c\x27\x00\x00\x1c\x03\x00\x00\x21\x03\x00\x00\x17\x03\x00\x00\x61\x27\x00\x00\x86\x27\x00\x00\x3b\x03\x00\x00\x41\x03\x00\x00\x24\x03\x00\x00\x8b\x27\x00\x00\x48\x03\x00\x00\x49\x03\x00\x00\x2c\x03\x00\x00\x90\x27\x00\x00\x95\x27\x00\x00\x50\x03\x00\x00\x51\x03\x00\x00\x2f\x03\x00\x00\xba\x27\x00\x00\x5b\x03\x00\x00\x5c\x03\x00\x00\x3a\x03\x00\x00\xbf\x27\x00\x00\xc4\x27\x00\x00\x63\x03\x00\x00\x64\x03\x00\x00\x46\x03\x00\x00\xc9\x27\x00\x00\xee\x27\x00\x00\x6a\x03\x00\x00\x6b\x03\x00\x00\x4c\x03\x00\x00\xf3\x27\x00\x00\xf8\x27\x00\x00\x6c\x03\x00\x00\x71\x03\x00\x00\x4f\x03\x00\x00\xf6\x27\x00\x00\x4a\x28\x00\x00\x56\x03\x00\x00\x77\x0a\x00\x00\xbc\x28\x00\x00\xc1\x28\x00\x00\x78\x03\x00\x00\x7e\x03\x00\x00\x67\x03\x00\x00"#++alex_table :: AlexAddr+alex_table = AlexA# "\x00\x00\x05\x00\x09\x00\x05\x00\x05\x00\x05\x00\x07\x00\x08\x00\x0a\x00\x07\x00\x2f\x00\x08\x00\x0a\x00\x24\x00\x0c\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x22\x00\x05\x00\x32\x01\x2d\x00\x3c\x02\x96\x01\x32\x02\x0f\x01\xf7\x00\x50\x01\x55\x01\x29\x02\x20\x02\x7e\x01\x1d\x00\x85\x01\xf3\x00\x44\x02\x44\x02\x44\x02\x44\x02\x44\x02\x44\x02\x44\x02\x44\x02\x44\x02\x44\x02\x04\x00\x0a\x01\x38\x01\x2c\x01\x3f\x01\x8d\x01\xab\x01\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x8c\x00\x17\x02\x67\x01\x37\x02\x45\x02\x30\x00\x17\x01\x41\x02\xe1\x01\xf1\x01\xc3\x01\xc2\x00\x41\x02\x41\x02\xd9\x00\x41\x02\x41\x02\xcd\x01\x41\x02\x25\x01\x1f\x01\x41\x02\x41\x02\x41\x02\x41\x02\xce\x00\x41\x02\x41\x02\xd5\x01\x41\x02\x41\x02\x41\x02\xbe\x00\xe6\x00\x60\x01\x76\x00\x76\x00\x76\x00\x76\x00\x76\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xa5\x01\xa5\x01\xa5\x01\xa5\x01\xa5\x01\x09\x00\x08\x00\x06\x00\x08\x00\x09\x00\x06\x00\x06\x00\x08\x00\x76\x00\x09\x00\x06\x00\x08\x00\x09\x00\xb5\x00\x31\x00\x0d\x00\x0e\x00\x0f\x00\xa5\x01\x32\x00\x2e\x00\x79\x00\x38\x00\x35\x00\x36\x00\x37\x00\xb8\x00\x58\x00\x39\x00\x3a\x00\x3b\x00\xa8\x01\xf7\x00\xf7\x00\xf7\x00\x13\x00\x15\x00\x10\x00\x11\x00\x12\x00\x10\x00\x10\x00\x11\x00\x6b\x00\x12\x00\x14\x00\x15\x00\x16\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x33\x00\x43\x00\x42\x00\x44\x00\x40\x00\x49\x00\x47\x00\x48\x00\x4b\x00\x41\x00\x05\x00\x08\x00\x05\x00\x05\x00\x05\x00\x7a\x00\x4a\x00\x89\x00\x4d\x00\x4f\x00\x4c\x00\x50\x00\x4e\x00\x51\x00\x34\x00\x03\x00\x45\x00\x55\x00\x54\x00\x56\x00\x59\x00\x52\x00\x46\x00\x05\x00\x32\x01\x53\x00\x5a\x00\x96\x01\x32\x02\x0f\x01\x23\x00\x5b\x00\x55\x01\x29\x02\x20\x02\x7e\x01\x1e\x00\x85\x01\xf3\x00\x44\x02\x44\x02\x44\x02\x44\x02\x44\x02\x44\x02\x44\x02\x44\x02\x44\x02\x44\x02\x04\x00\x0a\x01\x39\x01\x2c\x01\x3f\x01\x8d\x01\xab\x01\x5c\x00\x5d\x00\x25\x02\x25\x02\x25\x02\x25\x02\x25\x02\x5f\x00\x60\x00\x5e\x00\x61\x00\x62\x00\x64\x00\x57\x00\x69\x00\x63\x00\x67\x00\x68\x00\x65\x00\x6c\x00\x6d\x00\x6f\x00\x76\x00\x66\x00\x6e\x00\x25\x02\x8c\x00\x17\x02\x67\x01\x37\x02\x45\x02\x70\x00\x16\x01\x71\x00\x72\x00\x74\x00\xc2\x01\xc1\x00\x0b\x00\x73\x00\xb5\x01\x6a\x00\x76\x00\xcc\x01\x77\x00\x24\x01\x1e\x01\x75\x00\x7f\x00\x7e\x00\x83\x00\xcd\x00\x82\x00\x87\x00\xd4\x01\xf7\x00\x7d\x00\x86\x00\xbd\x00\xe6\x00\x60\x01\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x88\x00\x8a\x00\x85\x00\x8b\x00\x7b\x00\x8b\x00\x81\x00\x7c\x00\x8e\x00\x80\x00\x91\x00\x92\x00\x84\x00\x92\x00\x94\x00\x97\x00\x98\x00\x99\x00\x07\x00\x32\x01\x98\x00\x9a\x00\x96\x01\x32\x02\x0f\x01\x9e\x00\x9e\x00\x55\x01\x29\x02\x20\x02\x7e\x01\x1f\x00\x85\x01\xf3\x00\x44\x02\x44\x02\x44\x02\x44\x02\x44\x02\x44\x02\x44\x02\x44\x02\x44\x02\x44\x02\x04\x00\x0a\x01\x39\x01\x2c\x01\x3f\x01\x8d\x01\xab\x01\x9d\x00\xa0\x00\x8b\x00\x8b\x00\x8b\x00\x8b\x00\x8b\x00\xa5\x00\x8b\x00\x8b\x00\x8b\x00\x8b\x00\x8b\x00\xa4\x00\xa3\x00\xa4\x00\x92\x00\x92\x00\x92\x00\x92\x00\x92\x00\xa6\x00\xaa\x00\xaa\x00\xac\x00\x8b\x00\x8c\x00\x17\x02\x67\x01\x37\x02\x45\x02\x8b\x00\x16\x01\xaf\x00\xa9\x00\xb0\x00\xc2\x01\xc1\x00\x90\x00\x92\x00\xb5\x01\xb1\x00\xb0\x00\xcc\x01\x90\x00\x24\x01\x1e\x01\xb2\x00\xb5\x00\xb5\x00\xbf\x00\xcd\x00\x96\x00\xb6\x00\xd4\x01\x5d\x01\xbb\x00\xc3\x00\xbd\x00\xe6\x00\x60\x01\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\xc5\x00\xba\x01\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xd5\x00\xd1\x00\xcb\x00\xc7\x00\xcf\x00\xe0\x00\xe0\x00\xe1\x00\xe5\x00\xe5\x00\xec\x00\x07\x00\x32\x01\xe4\x00\xe8\x00\x96\x01\x32\x02\x0f\x01\xff\xff\xec\x00\x55\x01\x29\x02\x20\x02\x7e\x01\x1f\x00\x85\x01\xf3\x00\x44\x02\x44\x02\x44\x02\x44\x02\x44\x02\x44\x02\x44\x02\x44\x02\x44\x02\x44\x02\x04\x00\x0a\x01\x39\x01\x2c\x01\x3f\x01\x8d\x01\xab\x01\xf2\x00\xf2\x00\x92\x00\x92\x00\x92\x00\x92\x00\x92\x00\xee\x00\x98\x00\x98\x00\x98\x00\x98\x00\x98\x00\xf4\x00\xf8\x00\xf8\x00\x98\x00\x98\x00\x98\x00\x98\x00\x98\x00\xf9\x00\xfd\x00\xfd\x00\xfe\x00\x92\x00\x8c\x00\x17\x02\x67\x01\x37\x02\x45\x02\x98\x00\x16\x01\x02\x01\x02\x01\x06\x01\xc2\x01\xc1\x00\x96\x00\x98\x00\xb5\x01\x03\x01\x06\x01\xcc\x01\x9c\x00\x24\x01\x1e\x01\x07\x01\x0b\x01\x0b\x01\x10\x01\xcd\x00\x9c\x00\x0c\x01\xd4\x01\x10\x01\x11\x01\x18\x01\xbd\x00\xe6\x00\x60\x01\x08\x00\x08\x00\x08\x00\x08\x00\x08\x00\x14\x01\x1c\x01\xd6\x00\xd5\x00\xd6\x00\xd6\x00\xd6\x00\x22\x01\x26\x01\x2b\x01\x2b\x01\x31\x01\x2d\x01\x31\x01\x33\x01\x37\x01\x37\x01\x3d\x01\x08\x00\x32\x01\x3a\x01\x3e\x01\x96\x01\x32\x02\x0f\x01\xd6\x00\x3e\x01\x55\x01\x29\x02\x20\x02\x7e\x01\x20\x00\x85\x01\xf3\x00\x44\x02\x44\x02\x44\x02\x44\x02\x44\x02\x44\x02\x44\x02\x44\x02\x44\x02\x44\x02\x04\x00\x0a\x01\x39\x01\x2c\x01\x3f\x01\x8d\x01\xab\x01\x45\x01\x40\x01\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9b\x01\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x46\x01\x45\x01\x45\x01\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\x46\x01\x46\x01\x36\x01\x47\x01\x9e\x00\x8c\x00\x17\x02\x67\x01\x37\x02\x45\x02\x9e\x00\x16\x01\x48\x01\x51\x01\x51\x01\xc2\x01\xc1\x00\xa2\x00\xa4\x00\xb5\x01\x52\x01\x57\x01\xcc\x01\xa2\x00\x24\x01\x1e\x01\x57\x01\x5c\x01\x4b\x01\x5c\x01\xcd\x00\xa8\x00\x58\x01\xd4\x01\x5d\x01\x62\x01\x62\x01\xbd\x00\xe6\x00\x60\x01\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x63\x01\x69\x01\x69\x01\x6e\x01\x6e\x01\x6a\x01\x6f\x01\x72\x01\x72\x01\x73\x01\x76\x01\x76\x01\x77\x01\x7a\x01\x7a\x01\x7b\x01\x7f\x01\x7f\x01\x0a\x00\x32\x01\x80\x01\x84\x01\x96\x01\x32\x02\x0f\x01\x84\x01\x89\x01\x55\x01\x29\x02\x20\x02\x7e\x01\x21\x00\x85\x01\xf3\x00\x44\x02\x44\x02\x44\x02\x44\x02\x44\x02\x44\x02\x44\x02\x44\x02\x44\x02\x44\x02\x04\x00\x0a\x01\x39\x01\x2c\x01\x3f\x01\x8d\x01\xab\x01\x89\x01\x8e\x01\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\x86\x01\xaa\x00\xaa\x00\xaa\x00\xaa\x00\xaa\x00\x8a\x01\x8e\x01\x8f\x01\xaa\x00\xaa\x00\xaa\x00\xaa\x00\xaa\x00\x92\x01\x92\x01\x93\x01\x97\x01\xa4\x00\x8c\x00\x17\x02\x67\x01\x37\x02\x45\x02\xaa\x00\x16\x01\x97\x01\x98\x01\x9c\x01\xc2\x01\xc1\x00\xa8\x00\xaa\x00\xb5\x01\x9c\x01\x9d\x01\xcc\x01\xae\x00\x24\x01\x1e\x01\xa1\x01\xa1\x01\xa5\x01\xa2\x01\xcd\x00\xae\x00\xa5\x01\xd4\x01\xa6\x01\xaa\x01\xaa\x01\xbd\x00\xe6\x00\x60\x01\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\xac\x01\xaf\x01\xaf\x01\xb0\x01\xca\x01\xb3\x01\xbc\x01\xb8\x01\xc4\x01\xc0\x01\xc6\x01\xce\x01\xd6\x01\xda\x01\x18\x02\x18\x02\xdc\x01\xd8\x01\x0a\x00\x32\x01\x19\x02\x1c\x02\x96\x01\x32\x02\x0f\x01\xd2\x01\x1c\x02\x55\x01\x29\x02\x20\x02\x7e\x01\x21\x00\x85\x01\xf3\x00\x44\x02\x44\x02\x44\x02\x44\x02\x44\x02\x44\x02\x44\x02\x44\x02\x44\x02\x44\x02\x04\x00\x0a\x01\x39\x01\x2c\x01\x3f\x01\x8d\x01\xab\x01\x1d\x02\x21\x02\x76\x00\x76\x00\x76\x00\x76\x00\x76\x00\x21\x02\x72\x01\x72\x01\x72\x01\x72\x01\x72\x01\x22\x02\x25\x02\x25\x02\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\x26\x02\x2a\x02\x2a\x02\x2b\x02\x76\x00\x8c\x00\x17\x02\x67\x01\x37\x02\x45\x02\x72\x01\x16\x01\x2e\x02\x2e\x02\x2f\x02\xc2\x01\xc1\x00\x79\x00\xb0\x00\xb5\x01\x33\x02\x33\x02\xcc\x01\x75\x01\x24\x01\x1e\x01\x34\x02\x38\x02\x38\x02\x3d\x02\xcd\x00\xb4\x00\x39\x02\xd4\x01\x3d\x02\x3e\x02\x43\x02\xbd\x00\xe6\x00\x60\x01\xfc\x00\x46\x02\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\x46\x02\x93\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\x5c\x01\x5c\x01\x5c\x01\x5c\x01\x5c\x01\x47\x02\xab\x00\x00\x00\x8d\x00\x7a\x00\x9f\x00\xb0\x00\x00\x00\x00\x00\x00\x00\x61\x01\x00\x00\xdf\x00\xb5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5c\x01\xb4\x00\x00\x00\x00\x00\x00\x00\x43\x02\x00\x00\x00\x00\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbc\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x68\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x56\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\xc4\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\xc6\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\xc8\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\xc0\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\xbb\x01\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\xd0\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x04\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\xd2\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\xcc\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe0\x00\xe0\x00\xe0\x00\xe0\x00\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe0\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\xe3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\xb4\x01\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\xda\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\xdb\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\xdc\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\xdd\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\xde\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\xd8\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\xe0\x00\xe0\x00\xe0\x00\xe0\x00\xe0\x00\xe5\x00\xe5\x00\xe5\x00\xe5\x00\xe5\x00\xe5\x00\xe5\x00\xe5\x00\xe5\x00\xe5\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe5\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe5\x00\x00\x00\x00\x00\xe3\x00\x00\x00\x7a\x01\x00\x00\x00\x00\xea\x00\x00\x00\x00\x00\x00\x00\x00\x00\xea\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7d\x01\xec\x00\xec\x00\xec\x00\xec\x00\xec\x00\xec\x00\xec\x00\xec\x00\xec\x00\xec\x00\x06\x01\x06\x01\x06\x01\x06\x01\x06\x01\x00\x00\x01\x01\xf2\x00\xf2\x00\xf2\x00\xf2\x00\xf2\x00\x00\x00\xec\x00\x00\x00\x00\x00\x00\x00\x00\x00\xec\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x01\x00\x00\x00\x00\xf0\x00\x00\x00\x00\x00\x00\x00\xf2\x00\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x09\x01\x6d\x01\xf2\x00\xf2\x00\xf2\x00\xf2\x00\xf2\x00\xf6\x00\x2e\x02\x2e\x02\x2e\x02\x2e\x02\x2e\x02\xf8\x00\xf8\x00\xf8\x00\xf8\x00\xf8\x00\xf8\x00\xf8\x00\xf8\x00\xf8\x00\xf8\x00\x00\x00\x00\x00\xf2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2e\x02\xed\x00\x5b\x01\xe7\x00\x00\x00\xf8\x00\x00\x00\xf6\x00\x00\x00\x00\x00\xf8\x00\x00\x00\x00\x00\x31\x02\x00\x00\x00\x00\x00\x00\x00\x00\xfb\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfb\x00\x00\x00\x00\x00\xfd\x00\xfd\x00\xfd\x00\xfd\x00\xfd\x00\xfd\x00\xfd\x00\xfd\x00\xfd\x00\xfd\x00\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x00\x00\x00\x00\xeb\x00\xfd\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x01\xf1\x00\x00\x00\x00\x01\x00\x00\x02\x01\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x05\x01\x00\x00\x00\x00\x00\x00\x00\x00\x05\x01\x06\x01\x06\x01\x06\x01\x06\x01\x06\x01\x0b\x01\x0b\x01\x0b\x01\x0b\x01\x0b\x01\x0b\x01\x0b\x01\x0b\x01\x0b\x01\x0b\x01\x10\x01\x10\x01\x10\x01\x10\x01\x10\x01\x00\x00\x00\x00\x00\x00\x06\x01\x00\x00\x00\x00\x00\x00\x00\x00\x0b\x01\x00\x00\x00\x00\x00\x00\x00\x00\x0b\x01\x00\x00\x00\x00\x09\x01\x00\x00\x10\x01\x00\x00\x00\x00\x0e\x01\x00\x00\x00\x00\x00\x00\x00\x00\x0e\x01\x00\x00\x00\x00\x00\x00\x00\x00\x13\x01\x10\x01\x10\x01\x10\x01\x10\x01\x10\x01\x44\x02\x44\x02\x44\x02\x44\x02\x44\x02\x44\x02\x44\x02\x44\x02\x44\x02\x44\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x01\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x13\x01\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x19\x01\x41\x02\x41\x02\x41\x02\x41\x02\xea\x01\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x15\x01\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x1d\x01\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x0f\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x27\x01\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x23\x01\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2b\x01\x2b\x01\x2b\x01\x2b\x01\x2b\x01\x2b\x01\x2b\x01\x2b\x01\x2b\x01\x2b\x01\xaf\x01\xaf\x01\xaf\x01\xaf\x01\xaf\x01\x31\x01\x31\x01\x31\x01\x31\x01\x31\x01\x00\x00\x00\x00\x00\x00\x2b\x01\x00\x00\x00\x00\x00\x00\x00\x00\x2b\x01\x00\x00\x00\x00\x00\x00\x00\x00\xaf\x01\x00\x00\x00\x00\x2f\x01\x00\x00\x31\x01\x00\x00\x00\x00\x2f\x01\x00\x00\x00\x00\x00\x00\x00\x00\xb2\x01\x00\x00\x00\x00\x00\x00\x00\x00\x35\x01\x31\x01\x31\x01\x31\x01\x31\x01\x31\x01\x92\x01\x92\x01\x92\x01\x92\x01\x92\x01\x2a\x01\x37\x01\x37\x01\x37\x01\x37\x01\x37\x01\x37\x01\x37\x01\x37\x01\x37\x01\x37\x01\x00\x00\x00\x00\x31\x01\x00\x00\x00\x00\x00\x00\x00\x00\x92\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x37\x01\x00\x00\x35\x01\x00\x00\x00\x00\x37\x01\x00\x00\x95\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x3c\x01\x00\x00\x00\x00\x00\x00\x00\x00\x3c\x01\x00\x00\x00\x00\x00\x00\x00\x00\x30\x01\x00\x00\x00\x00\x3e\x01\x3e\x01\x3e\x01\x3e\x01\x3e\x01\x44\x01\x3e\x01\x3e\x01\x3e\x01\x3e\x01\x3e\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4e\x01\x00\x00\x00\x00\x00\x00\x00\x00\x3e\x01\x44\x01\x44\x01\x44\x01\x44\x01\x44\x01\x3e\x01\x00\x00\x00\x00\x00\x00\x00\x00\x36\x01\x43\x01\x42\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x01\x00\x00\x00\x00\x00\x00\x00\x00\x44\x01\x45\x01\x45\x01\x45\x01\x45\x01\x45\x01\x46\x01\x46\x01\x46\x01\x46\x01\x46\x01\x00\x00\x00\x00\x4d\x01\x00\x00\x9c\x01\x9c\x01\x9c\x01\x9c\x01\x9c\x01\x00\x00\x00\x00\x00\x00\x00\x00\x45\x01\x00\x00\x00\x00\x00\x00\x00\x00\x46\x01\x43\x01\x51\x01\x51\x01\x51\x01\x51\x01\x51\x01\x00\x00\x4d\x01\x9c\x01\x00\x00\x00\x00\x00\x00\x4f\x01\x51\x01\x51\x01\x51\x01\x51\x01\x51\x01\x00\x00\x00\x00\x00\x00\x49\x01\x00\x00\x00\x00\x51\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x57\x01\x00\x00\x51\x01\x54\x01\xa0\x01\x5c\x01\x5c\x01\x5c\x01\x5c\x01\x5c\x01\x00\x00\x00\x00\x00\x00\x00\x00\x57\x01\x54\x01\x00\x00\x00\x00\x00\x00\x57\x01\x62\x01\x62\x01\x62\x01\x62\x01\x62\x01\x00\x00\x00\x00\x5a\x01\x5c\x01\x00\x00\x00\x00\x00\x00\x5a\x01\x00\x00\x62\x01\x62\x01\x62\x01\x62\x01\x62\x01\x00\x00\x00\x00\x5f\x01\x00\x00\x62\x01\x76\x01\x76\x01\x76\x01\x76\x01\x76\x01\x69\x01\x69\x01\x69\x01\x69\x01\x69\x01\x00\x00\x00\x00\x65\x01\x62\x01\x69\x01\x69\x01\x69\x01\x69\x01\x69\x01\x00\x00\x00\x00\x00\x00\x00\x00\x76\x01\x00\x00\x00\x00\x65\x01\x00\x00\x69\x01\x6e\x01\x6e\x01\x6e\x01\x6e\x01\x6e\x01\x00\x00\x00\x00\x79\x01\x69\x01\x00\x00\x00\x00\x00\x00\x6c\x01\x00\x00\x6e\x01\x6e\x01\x6e\x01\x6e\x01\x6e\x01\x00\x00\x00\x00\x6c\x01\x00\x00\x6e\x01\x72\x01\x72\x01\x72\x01\x72\x01\x72\x01\x76\x01\x76\x01\x76\x01\x76\x01\x76\x01\x00\x00\x00\x00\x71\x01\x6e\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x72\x01\x00\x00\x00\x00\x71\x01\x00\x00\x76\x01\x00\x00\x00\x00\x66\x01\x00\x00\x00\x00\x00\x00\x00\x00\x75\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x79\x01\x7f\x01\x7f\x01\x7f\x01\x7f\x01\x7f\x01\x00\x00\x00\x00\x00\x00\x7d\x01\x7f\x01\x7f\x01\x7f\x01\x7f\x01\x7f\x01\x84\x01\x84\x01\x84\x01\x84\x01\x84\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x01\x84\x01\x84\x01\x84\x01\x84\x01\x84\x01\x00\x00\x00\x00\x00\x00\x7f\x01\x00\x00\x00\x00\x00\x00\x82\x01\x84\x01\x89\x01\x89\x01\x89\x01\x89\x01\x89\x01\x00\x00\x00\x00\x82\x01\x00\x00\x84\x01\x00\x00\x00\x00\x88\x01\x00\x00\x00\x00\x89\x01\x89\x01\x89\x01\x89\x01\x89\x01\x00\x00\x00\x00\x88\x01\x89\x01\x8e\x01\x8e\x01\x8e\x01\x8e\x01\x8e\x01\x8e\x01\x8e\x01\x8e\x01\x8e\x01\x8e\x01\x00\x00\x00\x00\x8c\x01\x83\x01\x89\x01\x92\x01\x92\x01\x92\x01\x92\x01\x92\x01\x00\x00\x00\x00\x00\x00\x8e\x01\x00\x00\x00\x00\x00\x00\x8c\x01\x8e\x01\x97\x01\x97\x01\x97\x01\x97\x01\x97\x01\x00\x00\x00\x00\x91\x01\x00\x00\x92\x01\x00\x00\x00\x00\x91\x01\x00\x00\x97\x01\x97\x01\x97\x01\x97\x01\x97\x01\x00\x00\x00\x00\x00\x00\x95\x01\x97\x01\x9c\x01\x9c\x01\x9c\x01\x9c\x01\x9c\x01\x9c\x01\x9c\x01\x9c\x01\x9c\x01\x9c\x01\x00\x00\x00\x00\x9a\x01\x97\x01\xa1\x01\xa1\x01\xa1\x01\xa1\x01\xa1\x01\x00\x00\x00\x00\x00\x00\x00\x00\x9c\x01\x00\x00\x00\x00\x9a\x01\x00\x00\x9c\x01\xa1\x01\xa1\x01\xa1\x01\xa1\x01\xa1\x01\x00\x00\x00\x00\x9f\x01\xa1\x01\x00\x00\x00\x00\x00\x00\x9f\x01\x00\x00\xa5\x01\xa5\x01\xa5\x01\xa5\x01\xa5\x01\x00\x00\x00\x00\xa4\x01\x00\x00\xa1\x01\xa0\x01\xaa\x01\xaa\x01\xaa\x01\xaa\x01\xaa\x01\xaa\x01\xaa\x01\xaa\x01\xaa\x01\xaa\x01\x00\x00\xa4\x01\xa5\x01\x00\x00\x1c\x02\x1c\x02\x1c\x02\x1c\x02\x1c\x02\x00\x00\x00\x00\x00\x00\x00\x00\xaa\x01\x00\x00\xa8\x01\x00\x00\x00\x00\xaa\x01\xaf\x01\xaf\x01\xaf\x01\xaf\x01\xaf\x01\x00\x00\x00\x00\xae\x01\x1c\x02\x00\x00\x00\x00\x00\x00\xae\x01\x00\x00\x00\x00\x00\x00\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x1f\x02\x00\x00\xaf\x01\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\xb2\x01\x00\x00\x00\x00\x00\x00\xa9\x01\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\xbd\x01\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\xb9\x01\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\xc5\x01\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\xfb\x01\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\xc7\x01\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\xc1\x01\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\xcf\x01\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\xcb\x01\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\xd7\x01\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\xd9\x01\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\xdb\x01\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\xdd\x01\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\xd3\x01\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\xe2\x01\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\xe3\x01\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\xe4\x01\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\xe5\x01\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\xe6\x01\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\xe0\x01\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\xeb\x01\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\xec\x01\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\xed\x01\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\xe9\x01\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\xf2\x01\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\xf3\x01\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\xf4\x01\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\xf5\x01\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\xf6\x01\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\xf7\x01\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\xf0\x01\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\xfc\x01\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\xfd\x01\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\xfe\x01\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\xff\x01\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x00\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\xfa\x01\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x05\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x06\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x07\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x08\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x09\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x0a\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x0b\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x03\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x10\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x11\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x12\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x13\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x14\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x0e\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x18\x02\x18\x02\x18\x02\x18\x02\x18\x02\x18\x02\x18\x02\x18\x02\x18\x02\x18\x02\x1c\x02\x1c\x02\x1c\x02\x1c\x02\x1c\x02\x21\x02\x21\x02\x21\x02\x21\x02\x21\x02\x00\x00\x00\x00\x00\x00\x18\x02\x00\x00\x00\x00\x00\x00\x00\x00\x18\x02\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x02\x00\x00\x00\x00\x1b\x02\x00\x00\x21\x02\x00\x00\x00\x00\x1b\x02\x00\x00\x00\x00\x00\x00\x00\x00\x1f\x02\x00\x00\x00\x00\x00\x00\x00\x00\x24\x02\x21\x02\x21\x02\x21\x02\x21\x02\x21\x02\x25\x02\x25\x02\x25\x02\x25\x02\x25\x02\x2a\x02\x2a\x02\x2a\x02\x2a\x02\x2a\x02\x2a\x02\x2a\x02\x2a\x02\x2a\x02\x2a\x02\x00\x00\x00\x00\x00\x00\x21\x02\x00\x00\x00\x00\x00\x00\x00\x00\x25\x02\x00\x00\x00\x00\x00\x00\x00\x00\x2a\x02\x00\x00\x00\x00\x24\x02\x00\x00\x2a\x02\x00\x00\x00\x00\x28\x02\x00\x00\x00\x00\x00\x00\x00\x00\x2d\x02\x00\x00\x00\x00\x00\x00\x00\x00\x2d\x02\x2e\x02\x2e\x02\x2e\x02\x2e\x02\x2e\x02\x33\x02\x33\x02\x33\x02\x33\x02\x33\x02\x33\x02\x33\x02\x33\x02\x33\x02\x33\x02\x38\x02\x38\x02\x38\x02\x38\x02\x38\x02\x00\x00\x00\x00\x00\x00\x2e\x02\x00\x00\x00\x00\x00\x00\x00\x00\x33\x02\x00\x00\x00\x00\x00\x00\x00\x00\x33\x02\x00\x00\x00\x00\x31\x02\x00\x00\x38\x02\x00\x00\x00\x00\x36\x02\x00\x00\x00\x00\x00\x00\x00\x00\x36\x02\x00\x00\x00\x00\x00\x00\x00\x00\x3b\x02\x38\x02\x38\x02\x38\x02\x38\x02\x38\x02\x3d\x02\x3d\x02\x3d\x02\x3d\x02\x3d\x02\x3d\x02\x3d\x02\x3d\x02\x3d\x02\x3d\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x38\x02\x00\x00\x00\x00\x00\x00\x00\x00\x3d\x02\x00\x00\x00\x00\x00\x00\x00\x00\x3d\x02\x00\x00\x00\x00\x3b\x02\x00\x00\x43\x02\x00\x00\x00\x00\x40\x02\x00\x00\x00\x00\x00\x00\x00\x00\x40\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x41\x02\x43\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x42\x02\x00\x00\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x42\x02\x46\x02\x46\x02\x46\x02\x46\x02\x46\x02\x46\x02\x46\x02\x46\x02\x46\x02\x46\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x46\x02\x00\x00\x00\x00\x00\x00\x00\x00\x46\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x49\x02\x00\x00\x00\x00\x00\x00\x00\x00\x49\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"#++alex_check :: AlexAddr+alex_check = AlexA# "\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x20\x00\x0a\x00\x0a\x00\x61\x00\x2d\x00\x75\x00\x20\x00\x70\x00\x72\x00\x69\x00\x6f\x00\x72\x00\x69\x00\x79\x00\x20\x00\x21\x00\x74\x00\x23\x00\x24\x00\x25\x00\x26\x00\x3e\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x6f\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x20\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x20\x00\x76\x00\x2d\x00\x2d\x00\x2d\x00\x20\x00\x65\x00\x72\x00\x2d\x00\x6c\x00\x65\x00\x61\x00\x64\x00\x2d\x00\x69\x00\x6f\x00\x63\x00\x6b\x00\x2d\x00\x3e\x00\x3e\x00\x3e\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x74\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x20\x00\x66\x00\x72\x00\x65\x00\x65\x00\x72\x00\x66\x00\x65\x00\x65\x00\x65\x00\x69\x00\x76\x00\x6f\x00\x2d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x5b\x00\x6c\x00\x5d\x00\x6b\x00\x66\x00\x63\x00\x72\x00\x20\x00\x65\x00\x64\x00\x5b\x00\x65\x00\x72\x00\x66\x00\x65\x00\x76\x00\x65\x00\x6c\x00\x20\x00\x21\x00\x2d\x00\x65\x00\x24\x00\x25\x00\x26\x00\x74\x00\x72\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x67\x00\x65\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x63\x00\x65\x00\x6e\x00\x20\x00\x66\x00\x65\x00\x65\x00\x65\x00\x72\x00\x66\x00\x72\x00\x65\x00\x65\x00\x72\x00\x69\x00\x0a\x00\x2d\x00\x6d\x00\x20\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x6e\x00\x61\x00\x69\x00\x73\x00\x69\x00\x65\x00\x66\x00\x2d\x00\x74\x00\x69\x00\x63\x00\x0a\x00\x6c\x00\x2d\x00\x6e\x00\x6f\x00\x5d\x00\x44\x00\x5d\x00\x44\x00\x74\x00\x5d\x00\x44\x00\x77\x00\x3e\x00\x46\x00\x5d\x00\x7b\x00\x7c\x00\x7d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x3a\x00\x3d\x00\x52\x00\x0a\x00\x54\x00\x0a\x00\x56\x00\x5d\x00\x2d\x00\x5d\x00\x3d\x00\x0a\x00\x5d\x00\x0a\x00\x2d\x00\x3d\x00\x0a\x00\x44\x00\x20\x00\x21\x00\x0a\x00\x2d\x00\x24\x00\x25\x00\x26\x00\x0a\x00\x0a\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x3d\x00\x2d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x44\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0a\x00\x3d\x00\x0a\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x2d\x00\x0a\x00\x0a\x00\x2d\x00\x20\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x20\x00\x61\x00\x3d\x00\x3d\x00\x0a\x00\x65\x00\x66\x00\x2d\x00\x20\x00\x69\x00\x44\x00\x0a\x00\x6c\x00\x2d\x00\x6e\x00\x6f\x00\x2d\x00\x0a\x00\x0a\x00\x65\x00\x74\x00\x2d\x00\x2d\x00\x77\x00\x2d\x00\x2d\x00\x61\x00\x7b\x00\x7c\x00\x7d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x6c\x00\x68\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0a\x00\x75\x00\x65\x00\x73\x00\x72\x00\x0a\x00\x0a\x00\x2d\x00\x0a\x00\x0a\x00\x0a\x00\x20\x00\x21\x00\x7c\x00\x2d\x00\x24\x00\x25\x00\x26\x00\x20\x00\x0a\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x0a\x00\x0a\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x2d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x2d\x00\x0a\x00\x0a\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x2d\x00\x0a\x00\x0a\x00\x2d\x00\x20\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x20\x00\x61\x00\x0a\x00\x0a\x00\x0a\x00\x65\x00\x66\x00\x2d\x00\x20\x00\x69\x00\x2d\x00\x0a\x00\x6c\x00\x2d\x00\x6e\x00\x6f\x00\x2d\x00\x0a\x00\x0a\x00\x0a\x00\x74\x00\x2d\x00\x2d\x00\x77\x00\x0a\x00\x2d\x00\x6e\x00\x7b\x00\x7c\x00\x7d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x64\x00\x72\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x74\x00\x6f\x00\x0a\x00\x0a\x00\x0a\x00\x2d\x00\x0a\x00\x2d\x00\x0a\x00\x0a\x00\x3d\x00\x20\x00\x21\x00\x2d\x00\x0a\x00\x24\x00\x25\x00\x26\x00\x20\x00\x0a\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x0a\x00\x2d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x2d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0a\x00\x0a\x00\x0a\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0a\x00\x0a\x00\x3d\x00\x2d\x00\x20\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x20\x00\x61\x00\x2d\x00\x0a\x00\x0a\x00\x65\x00\x66\x00\x2d\x00\x20\x00\x69\x00\x2d\x00\x0a\x00\x6c\x00\x2d\x00\x6e\x00\x6f\x00\x0a\x00\x0a\x00\x2d\x00\x0a\x00\x74\x00\x2d\x00\x2d\x00\x77\x00\x2d\x00\x0a\x00\x0a\x00\x7b\x00\x7c\x00\x7d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x2d\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x2d\x00\x2d\x00\x0a\x00\x0a\x00\x2d\x00\x0a\x00\x0a\x00\x2d\x00\x0a\x00\x0a\x00\x2d\x00\x0a\x00\x0a\x00\x20\x00\x21\x00\x2d\x00\x0a\x00\x24\x00\x25\x00\x26\x00\x0a\x00\x0a\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x0a\x00\x0a\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x2d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x2d\x00\x0a\x00\x2d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0a\x00\x0a\x00\x2d\x00\x0a\x00\x20\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x20\x00\x61\x00\x0a\x00\x2d\x00\x0a\x00\x65\x00\x66\x00\x2d\x00\x20\x00\x69\x00\x0a\x00\x2d\x00\x6c\x00\x2d\x00\x6e\x00\x6f\x00\x0a\x00\x0a\x00\x0a\x00\x2d\x00\x74\x00\x2d\x00\x0a\x00\x77\x00\x2d\x00\x0a\x00\x0a\x00\x7b\x00\x7c\x00\x7d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x2d\x00\x0a\x00\x0a\x00\x2d\x00\x74\x00\x66\x00\x65\x00\x6e\x00\x6c\x00\x65\x00\x73\x00\x65\x00\x69\x00\x68\x00\x0a\x00\x0a\x00\x69\x00\x74\x00\x20\x00\x21\x00\x2d\x00\x0a\x00\x24\x00\x25\x00\x26\x00\x6e\x00\x0a\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x2d\x00\x0a\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0a\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x2d\x00\x0a\x00\x0a\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x2d\x00\x0a\x00\x0a\x00\x2d\x00\x20\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x20\x00\x61\x00\x0a\x00\x0a\x00\x2d\x00\x65\x00\x66\x00\x2d\x00\x20\x00\x69\x00\x0a\x00\x0a\x00\x6c\x00\x2d\x00\x6e\x00\x6f\x00\x2d\x00\x0a\x00\x0a\x00\x0a\x00\x74\x00\x2d\x00\x2d\x00\x77\x00\x0a\x00\x2d\x00\x27\x00\x7b\x00\x7c\x00\x7d\x00\x3e\x00\x0a\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0a\x00\x46\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x2d\x00\x52\x00\xff\xff\x54\x00\x5b\x00\x56\x00\x20\x00\xff\xff\xff\xff\xff\xff\x5b\x00\xff\xff\x5d\x00\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\x2d\x00\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\x2d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x2d\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x7c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\x7c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x09\x00\xff\xff\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x2d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\x2d\x00\xff\xff\x20\x00\xff\xff\xff\xff\x2d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x2d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x2d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\x3e\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\x2d\x00\xff\xff\xff\xff\xff\xff\x20\x00\x2d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x2d\x00\x5d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x2d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\x7c\x00\x7d\x00\x7e\x00\xff\xff\x20\x00\xff\xff\x2d\x00\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\x2d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x2d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x2d\x00\xff\xff\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x7c\x00\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\x5c\x00\xff\xff\x2d\x00\xff\xff\x20\x00\xff\xff\xff\xff\x2d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x2d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x2d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\x2d\x00\xff\xff\x20\x00\xff\xff\xff\xff\x2d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x2d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x2d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x2d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\x2d\x00\xff\xff\x20\x00\xff\xff\xff\xff\x2d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x2d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x2d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x3d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\x2d\x00\xff\xff\xff\xff\x20\x00\xff\xff\x2d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x2d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x2d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x3d\x00\xff\xff\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x20\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\x3d\x00\x3e\x00\x2d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x2d\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\x3e\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\x2d\x00\x20\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\x2d\x00\xff\xff\xff\xff\x20\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\x20\x00\x2d\x00\x3e\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\x2d\x00\xff\xff\xff\xff\xff\xff\x20\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x2d\x00\x20\x00\xff\xff\xff\xff\xff\xff\x2d\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x2d\x00\xff\xff\x20\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x2d\x00\x20\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\x2d\x00\xff\xff\x20\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x2d\x00\x20\x00\xff\xff\xff\xff\xff\xff\x2d\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x2d\x00\xff\xff\x20\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x2d\x00\x20\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\x2d\x00\xff\xff\x20\x00\xff\xff\xff\xff\x5d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x2d\x00\x20\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x20\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x2d\x00\xff\xff\x20\x00\xff\xff\xff\xff\x2d\x00\xff\xff\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x2d\x00\x20\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x2d\x00\x2e\x00\x20\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x20\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x2d\x00\xff\xff\x20\x00\xff\xff\xff\xff\x2d\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x20\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x2d\x00\x20\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\x2d\x00\xff\xff\x20\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x2d\x00\x20\x00\xff\xff\xff\xff\xff\xff\x2d\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x2d\x00\xff\xff\x20\x00\x3e\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\x2d\x00\x20\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\x2d\x00\xff\xff\xff\xff\x20\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x2d\x00\x20\x00\xff\xff\xff\xff\xff\xff\x2d\x00\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\x2d\x00\xff\xff\x20\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x2d\x00\xff\xff\xff\xff\xff\xff\x40\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\x2d\x00\xff\xff\x20\x00\xff\xff\xff\xff\x2d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x2d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x2d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\x2d\x00\xff\xff\x20\x00\xff\xff\xff\xff\x2d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x2d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x2d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\x2d\x00\xff\xff\x20\x00\xff\xff\xff\xff\x2d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x2d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x2d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\x2d\x00\xff\xff\x27\x00\xff\xff\xff\xff\x2d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x2d\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x2d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"#++alex_deflt :: AlexAddr+alex_deflt = AlexA# "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x19\x00\x18\x00\x1a\x00\x1b\x00\x1c\x00\x17\x00\x18\x00\x19\x00\x17\x00\x17\x00\x18\x00\x19\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x78\x00\x78\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x8f\x00\x8f\x00\xff\xff\xff\xff\xff\xff\xff\xff\x95\x00\x95\x00\xff\xff\xff\xff\xff\xff\xff\xff\x9b\x00\x9b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xa1\x00\xa1\x00\xff\xff\xff\xff\xff\xff\xff\xff\xa7\x00\xa7\x00\xff\xff\xff\xff\xff\xff\xff\xff\xad\x00\xad\x00\xff\xff\xff\xff\xff\xff\xff\xff\xb3\x00\xb3\x00\xff\xff\xff\xff\xb7\x00\xb7\x00\xff\xff\xba\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xca\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xd4\x00\xff\xff\xff\xff\xd7\x00\xd7\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xe2\x00\xe2\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xe9\x00\xe9\x00\xff\xff\xff\xff\xff\xff\xff\xff\xef\x00\xef\x00\xff\xff\xff\xff\xff\xff\xff\xff\xf5\x00\xf5\x00\xff\xff\xff\xff\xff\xff\xfa\x00\xfa\x00\xff\xff\xff\xff\xff\xff\xff\x00\xff\x00\xff\xff\xff\xff\xff\xff\x04\x01\x04\x01\xff\xff\xff\xff\x08\x01\x08\x01\xff\xff\xff\xff\xff\xff\x0d\x01\x0d\x01\xff\xff\xff\xff\xff\xff\x12\x01\x12\x01\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1b\x01\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x01\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x29\x01\xff\xff\xff\xff\xff\xff\xff\xff\x2e\x01\x2e\x01\xff\xff\xff\xff\xff\xff\xff\xff\x34\x01\x34\x01\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3b\x01\x3b\x01\xff\xff\xff\xff\xff\xff\xff\xff\x41\x01\x41\x01\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4a\x01\x4c\x01\x4a\x01\x4a\x01\x4c\x01\x4c\x01\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x53\x01\x53\x01\xff\xff\xff\xff\xff\xff\xff\xff\x59\x01\x59\x01\xff\xff\xff\xff\xff\xff\x5e\x01\x5e\x01\xff\xff\xff\xff\xff\xff\xff\xff\x64\x01\x64\x01\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x6b\x01\x6b\x01\xff\xff\xff\xff\xff\xff\x70\x01\x70\x01\xff\xff\xff\xff\x74\x01\x74\x01\xff\xff\xff\xff\x78\x01\x78\x01\xff\xff\xff\xff\x7c\x01\x7c\x01\xff\xff\xff\xff\xff\xff\x81\x01\x81\x01\xff\xff\xff\xff\xff\xff\xff\xff\x87\x01\x87\x01\xff\xff\xff\xff\x8b\x01\x8b\x01\xff\xff\xff\xff\xff\xff\x90\x01\x90\x01\xff\xff\xff\xff\x94\x01\x94\x01\xff\xff\xff\xff\xff\xff\x99\x01\x99\x01\xff\xff\xff\xff\xff\xff\x9e\x01\x9e\x01\xff\xff\xff\xff\xff\xff\xa3\x01\xa3\x01\xff\xff\xff\xff\xa7\x01\xa7\x01\xff\xff\xff\xff\xff\xff\xff\xff\xad\x01\xad\x01\xff\xff\xff\xff\xb1\x01\xb1\x01\xff\xff\xff\xff\xff\xff\xff\xff\xb7\x01\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xbf\x01\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xc9\x01\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xd1\x01\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xdf\x01\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xe8\x01\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xef\x01\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf9\x01\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x02\x02\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0d\x02\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x16\x02\xff\xff\xff\xff\xff\xff\x1a\x02\x1a\x02\xff\xff\xff\xff\x1e\x02\x1e\x02\xff\xff\xff\xff\xff\xff\x23\x02\x23\x02\xff\xff\xff\xff\x27\x02\x27\x02\xff\xff\xff\xff\xff\xff\x2c\x02\x2c\x02\xff\xff\xff\xff\x30\x02\x30\x02\xff\xff\xff\xff\xff\xff\x35\x02\x35\x02\xff\xff\xff\xff\xff\xff\x3a\x02\x3a\x02\xff\xff\xff\xff\xff\xff\x3f\x02\x3f\x02\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x48\x02\x48\x02\xff\xff"#++alex_accept = listArray (0::Int,585) [[],[],[(AlexAccPred (alex_action_27) (alexRightContext 185))],[(AlexAcc (alex_action_0))],[(AlexAcc (alex_action_74))],[(AlexAcc (alex_action_28))],[(AlexAcc (alex_action_91))],[(AlexAcc (alex_action_91))],[],[(AlexAcc (alex_action_100))],[(AlexAcc (alex_action_100))],[(AlexAcc (alex_action_28))],[(AlexAcc (alex_action_28))],[],[],[],[(AlexAcc (alex_action_28))],[(AlexAcc (alex_action_28))],[(AlexAcc (alex_action_28))],[(AlexAcc (alex_action_28))],[(AlexAcc (alex_action_28))],[(AlexAcc (alex_action_28))],[(AlexAcc (alex_action_28))],[(AlexAcc (alex_action_28))],[(AlexAcc (alex_action_28))],[(AlexAcc (alex_action_28))],[],[],[],[(AlexAcc (alex_action_91))],[],[],[],[],[(AlexAcc (alex_action_1))],[],[],[],[],[],[],[],[],[],[],[],[(AlexAcc (alex_action_2))],[],[],[],[],[(AlexAcc (alex_action_3))],[],[],[],[],[],[],[],[],[],[],[],[],[(AlexAcc (alex_action_4))],[],[],[],[],[(AlexAcc (alex_action_5))],[],[],[],[],[],[],[],[],[],[],[],[],[(AlexAcc (alex_action_6))],[],[],[],[],[(AlexAcc (alex_action_7))],[],[],[],[],[],[],[],[],[],[],[],[],[],[(AlexAcc (alex_action_8))],[],[],[],[],[(AlexAcc (alex_action_9))],[],[],[],[],[],[],[],[],[],[],[(AlexAcc (alex_action_10))],[],[],[],[],[],[],[(AlexAcc (alex_action_11))],[],[(AlexAcc (alex_action_12))],[],[(AlexAcc (alex_action_13))],[],[(AlexAcc (alex_action_14))],[],[(AlexAcc (alex_action_15))],[],[(AlexAcc (alex_action_16))],[],[(AlexAcc (alex_action_17))],[(AlexAcc (alex_action_18))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_63))],[],[],[],[],[(AlexAcc (alex_action_20))],[(AlexAcc (alex_action_20))],[],[],[],[],[(AlexAcc (alex_action_21))],[(AlexAcc (alex_action_21))],[],[],[],[],[(AlexAcc (alex_action_22))],[(AlexAcc (alex_action_22))],[],[],[],[],[(AlexAcc (alex_action_23))],[(AlexAcc (alex_action_23))],[],[],[],[],[(AlexAcc (alex_action_24))],[(AlexAcc (alex_action_24))],[],[],[],[],[(AlexAcc (alex_action_25))],[(AlexAcc (alex_action_25))],[],[],[],[],[(AlexAcc (alex_action_26))],[],[],[],[],[(AlexAccSkip)],[(AlexAcc (alex_action_29))],[(AlexAcc (alex_action_29))],[],[(AlexAcc (alex_action_57))],[(AlexAccPred (alex_action_30) (alexRightContext 201))],[(AlexAccPred (alex_action_30) (alexRightContext 201)),(AlexAcc (alex_action_97))],[],[(AlexAcc (alex_action_97))],[],[(AlexAcc (alex_action_97))],[],[(AlexAcc (alex_action_97))],[],[(AlexAcc (alex_action_97))],[],[(AlexAccSkip)],[(AlexAccPred (alex_action_31) (alexRightContext 211))],[(AlexAccPred (alex_action_31) (alexRightContext 211)),(AlexAcc (alex_action_97))],[],[(AlexAcc (alex_action_97))],[],[(AlexAcc (alex_action_97))],[],[(AlexAcc (alex_action_97))],[],[(AlexAccSkip)],[(AlexAcc (alex_action_32))],[],[],[(AlexAcc (alex_action_97))],[(AlexAcc (alex_action_97))],[(AlexAcc (alex_action_97))],[(AlexAcc (alex_action_97))],[(AlexAcc (alex_action_97))],[(AlexAcc (alex_action_97))],[(AlexAcc (alex_action_97))],[(AlexAcc (alex_action_33))],[(AlexAcc (alex_action_33))],[],[],[],[(AlexAcc (alex_action_34))],[(AlexAcc (alex_action_34))],[(AlexAcc (alex_action_65))],[],[],[],[],[(AlexAcc (alex_action_35))],[(AlexAcc (alex_action_35))],[(AlexAcc (alex_action_40))],[],[],[],[(AlexAcc (alex_action_36))],[(AlexAcc (alex_action_36))],[(AlexAcc (alex_action_93))],[],[],[],[(AlexAcc (alex_action_37))],[(AlexAcc (alex_action_37))],[],[],[],[(AlexAcc (alex_action_38))],[(AlexAcc (alex_action_38))],[],[],[],[(AlexAcc (alex_action_39))],[(AlexAcc (alex_action_39))],[],[],[],[(AlexAcc (alex_action_40))],[],[],[],[(AlexAcc (alex_action_41))],[(AlexAcc (alex_action_41))],[],[],[],[(AlexAcc (alex_action_42))],[(AlexAcc (alex_action_42))],[],[],[],[(AlexAccPred (alex_action_43) (alexRightContext 282))],[(AlexAccPred (alex_action_43) (alexRightContext 282)),(AlexAcc (alex_action_97))],[],[(AlexAcc (alex_action_97))],[],[(AlexAcc (alex_action_97))],[],[(AlexAccSkip)],[(AlexAccPred (alex_action_44) (alexRightContext 288))],[(AlexAccPred (alex_action_44) (alexRightContext 288)),(AlexAcc (alex_action_97))],[],[(AlexAcc (alex_action_97))],[],[(AlexAccSkip)],[(AlexAccPred (alex_action_45) (alexRightContext 296))],[(AlexAccPred (alex_action_45) (alexRightContext 296)),(AlexAcc (alex_action_97))],[],[(AlexAcc (alex_action_97))],[],[(AlexAcc (alex_action_97))],[],[(AlexAccSkip)],[(AlexAcc (alex_action_46))],[(AlexAcc (alex_action_46))],[(AlexAcc (alex_action_76))],[],[],[],[(AlexAcc (alex_action_47))],[(AlexAcc (alex_action_47))],[(AlexAcc (alex_action_70))],[],[],[],[(AlexAcc (alex_action_48))],[(AlexAcc (alex_action_48))],[(AlexAcc (alex_action_51))],[],[],[],[],[(AlexAcc (alex_action_49))],[(AlexAcc (alex_action_49))],[(AlexAcc (alex_action_52))],[],[],[],[(AlexAcc (alex_action_50))],[(AlexAcc (alex_action_51))],[(AlexAcc (alex_action_51))],[(AlexAcc (alex_action_51))],[],[],[],[],[],[],[],[(AlexAcc (alex_action_72))],[],[(AlexAcc (alex_action_53))],[(AlexAcc (alex_action_53))],[],[],[],[(AlexAcc (alex_action_54))],[(AlexAcc (alex_action_55))],[(AlexAcc (alex_action_55))],[],[],[],[(AlexAcc (alex_action_56))],[(AlexAcc (alex_action_57))],[],[],[],[(AlexAcc (alex_action_58))],[(AlexAcc (alex_action_59))],[(AlexAcc (alex_action_59))],[],[],[],[(AlexAcc (alex_action_60))],[(AlexAcc (alex_action_64))],[(AlexAcc (alex_action_61))],[(AlexAcc (alex_action_61))],[],[],[],[(AlexAcc (alex_action_62))],[(AlexAcc (alex_action_62))],[],[],[],[(AlexAcc (alex_action_63))],[],[],[],[(AlexAcc (alex_action_64))],[],[],[],[(AlexAcc (alex_action_65))],[],[],[],[(AlexAcc (alex_action_66))],[(AlexAcc (alex_action_66))],[],[],[],[(AlexAcc (alex_action_67))],[(AlexAcc (alex_action_67))],[(AlexAcc (alex_action_68))],[],[],[],[(AlexAcc (alex_action_68))],[],[],[],[(AlexAcc (alex_action_69))],[(AlexAcc (alex_action_69))],[],[],[],[(AlexAcc (alex_action_70))],[],[],[],[(AlexAcc (alex_action_71))],[(AlexAcc (alex_action_71))],[],[],[],[(AlexAcc (alex_action_72))],[(AlexAcc (alex_action_72))],[],[],[],[(AlexAcc (alex_action_73))],[(AlexAcc (alex_action_73))],[],[],[],[(AlexAcc (alex_action_74))],[],[],[],[(AlexAcc (alex_action_75))],[(AlexAcc (alex_action_75))],[(AlexAcc (alex_action_89))],[],[],[],[(AlexAcc (alex_action_76))],[],[],[],[(AlexAccPred (alex_action_77) (alexRightContext 438))],[(AlexAccPred (alex_action_77) (alexRightContext 438)),(AlexAcc (alex_action_97))],[],[],[(AlexAccSkip)],[(AlexAccPred (alex_action_78) (alexRightContext 446))],[(AlexAccPred (alex_action_78) (alexRightContext 446)),(AlexAcc (alex_action_97))],[],[(AlexAcc (alex_action_97))],[],[(AlexAcc (alex_action_97))],[],[(AlexAccSkip)],[(AlexAccPred (alex_action_79) (alexRightContext 456))],[(AlexAccPred (alex_action_79) (alexRightContext 456)),(AlexAcc (alex_action_97))],[],[(AlexAcc (alex_action_97))],[],[(AlexAcc (alex_action_97))],[],[(AlexAcc (alex_action_97))],[],[(AlexAccSkip)],[(AlexAccPred (alex_action_80) (alexRightContext 464))],[(AlexAccPred (alex_action_80) (alexRightContext 464)),(AlexAcc (alex_action_97))],[],[(AlexAcc (alex_action_97))],[],[(AlexAcc (alex_action_97))],[],[(AlexAccSkip)],[(AlexAccPred (alex_action_81) (alexRightContext 478))],[(AlexAccPred (alex_action_81) (alexRightContext 478)),(AlexAcc (alex_action_97))],[],[(AlexAcc (alex_action_97))],[],[(AlexAcc (alex_action_97))],[],[(AlexAcc (alex_action_97))],[],[(AlexAcc (alex_action_97))],[],[(AlexAcc (alex_action_97))],[],[(AlexAccSkip)],[(AlexAccPred (alex_action_82) (alexRightContext 487)),(AlexAcc (alex_action_97))],[(AlexAcc (alex_action_97))],[(AlexAcc (alex_action_97))],[(AlexAcc (alex_action_97))],[(AlexAcc (alex_action_97))],[(AlexAcc (alex_action_97))],[(AlexAcc (alex_action_97))],[],[(AlexAccSkip)],[(AlexAccPred (alex_action_83) (alexRightContext 494)),(AlexAcc (alex_action_97))],[(AlexAcc (alex_action_97))],[(AlexAcc (alex_action_97))],[(AlexAcc (alex_action_97))],[(AlexAcc (alex_action_97))],[],[(AlexAccSkip)],[(AlexAccPred (alex_action_84) (alexRightContext 504)),(AlexAcc (alex_action_97))],[(AlexAcc (alex_action_97))],[(AlexAcc (alex_action_97))],[(AlexAcc (alex_action_97))],[(AlexAcc (alex_action_97))],[(AlexAcc (alex_action_97))],[(AlexAcc (alex_action_97))],[(AlexAcc (alex_action_97))],[],[(AlexAccSkip)],[(AlexAccPred (alex_action_85) (alexRightContext 513)),(AlexAcc (alex_action_97))],[(AlexAcc (alex_action_97))],[(AlexAcc (alex_action_97))],[(AlexAcc (alex_action_97))],[(AlexAcc (alex_action_97))],[(AlexAcc (alex_action_97))],[(AlexAcc (alex_action_97))],[],[(AlexAccSkip)],[(AlexAccPred (alex_action_86) (alexRightContext 524)),(AlexAcc (alex_action_97))],[(AlexAcc (alex_action_97))],[(AlexAcc (alex_action_97))],[(AlexAcc (alex_action_97))],[(AlexAcc (alex_action_97))],[(AlexAcc (alex_action_97))],[(AlexAcc (alex_action_97))],[(AlexAcc (alex_action_97))],[(AlexAcc (alex_action_97))],[],[(AlexAccSkip)],[(AlexAccPred (alex_action_87) (alexRightContext 533)),(AlexAcc (alex_action_97))],[(AlexAcc (alex_action_97))],[(AlexAcc (alex_action_97))],[(AlexAcc (alex_action_97))],[(AlexAcc (alex_action_97))],[(AlexAcc (alex_action_97))],[(AlexAcc (alex_action_97))],[],[(AlexAccSkip)],[(AlexAcc (alex_action_88))],[(AlexAcc (alex_action_88))],[],[],[],[(AlexAcc (alex_action_89))],[],[],[],[(AlexAcc (alex_action_90))],[(AlexAcc (alex_action_90))],[],[],[],[(AlexAcc (alex_action_91))],[],[],[],[(AlexAcc (alex_action_92))],[(AlexAcc (alex_action_92))],[],[],[],[(AlexAcc (alex_action_93))],[],[],[],[(AlexAcc (alex_action_94))],[(AlexAcc (alex_action_94))],[],[],[],[(AlexAcc (alex_action_95))],[(AlexAcc (alex_action_95))],[],[],[],[(AlexAcc (alex_action_96))],[(AlexAcc (alex_action_96))],[],[],[],[(AlexAcc (alex_action_97))],[(AlexAcc (alex_action_97))],[(AlexAcc (alex_action_97))],[(AlexAcc (alex_action_98))],[(AlexAcc (alex_action_99))],[(AlexAcc (alex_action_99))],[],[],[]]+{-# LINE 175 "src/CSPM/Parser/Lexer.x" #-}++wschars :: String+wschars = " \t\r\n"++strip :: String -> String+strip = lstrip . rstrip++-- | Same as 'strip', but applies only to the left side of the string.+lstrip :: String -> String+lstrip s = case s of+ [] -> []+ (x:xs) -> if elem x wschars then lstrip xs else s++-- | Same as 'strip', but applies only to the right side of the string.+rstrip :: String -> String+rstrip = reverse . lstrip . reverse++openseq token inp len = + do+ --cs <- getSequenceStack+ --setSequenceStack (0:cs)+ tok token inp len+closeseq token inp len = + do+ --(c:cs) <- getSequenceStack+ --setSequenceStack cs+ tok token inp len++gt :: AlexInput -> Int -> ParseMonad LToken+gt inp len = do+ (c:cs) <- getSequenceStack+ tok (if c > 0 then TCloseSeq else TGt) inp len++soakTok :: Token -> AlexInput -> Int -> ParseMonad LToken+soakTok t inp len = setCurrentStartCode soak >> tok t inp len++-- TODO: don't count whitespace in the tokens+tok :: Token -> AlexInput -> Int -> ParseMonad LToken+tok t (ParserState { fileStack = fps:_ }) len =+ return $ L (SrcSpanOneLine f lineno colno (colno+len)) t+ where+ (FileParserState { tokenizerPos = FilePosition offset lineno colno, + fileName = f }) = fps++stok :: (String -> Token) -> AlexInput -> Int -> ParseMonad LToken+stok f (st @ ParserState { fileStack = stk }) len = do+ tok (f (filter (\ c -> c /= '\n') (takeChars len stk))) st len++skip input len = getNextToken++takeChars :: Int -> [FileParserState] -> String+takeChars 0 _ = ""+takeChars len (FileParserState {input = [] }:stk) = takeChars len stk+takeChars len (fps@(FileParserState {input = (c:cs) }):stk) = + c:(takeChars (len-1) (fps {input = cs}:stk))++nestedComment :: AlexInput -> Int -> ParseMonad LToken+nestedComment _ _ = do+ st <- getParserState+ go 1 st+ where + err :: ParseMonad a+ err = do+ FileParserState { + fileName = fname, + tokenizerPos = pos, + currentStartCode = sc } <- getTopFileParserState+ throwSourceError [lexicalErrorMessage (filePositionToSrcLoc fname pos)]+ go :: Int -> AlexInput -> ParseMonad LToken+ go 0 st = do setParserState st; getNextToken+ go n st = do+ case alexGetChar st of+ Nothing -> err+ Just (c,st) -> do+ case c of+ '-' -> do+ case alexGetChar st of+ Nothing -> err+ Just ('\125',st) -> go (n-1) st+ Just (c,st) -> go n st+ '\123' -> do+ case alexGetChar st of+ Nothing -> err+ Just ('-',st) -> go (n+1) st+ Just (c,st) -> go n st+ c -> go n st++switchInput :: AlexInput -> Int -> ParseMonad LToken+switchInput st len = do+ FileParserState { + fileName = fname, + tokenizerPos = pos, + currentStartCode = sc } <- getTopFileParserState+ let+ str = takeChars len (fileStack st)+ quotedFname = strip (drop (length "include") str)+ + hasStartQuote ('\"':cs) = True+ hasStartQuote _ = False++ hasEndQuote [] = False+ hasEndQuote ('\"':cs) = True+ hasEndQuote (c:cs) = hasEndQuote cs+ + file = calcFile (tail quotedFname)+ calcFile ('\"':cs) = ""+ calcFile (c:cs) = c:calcFile cs++ if not (hasStartQuote quotedFname) || not (hasEndQuote (tail quotedFname)) then+ throwSourceError [invalidIncludeErrorMessage (filePositionToSrcLoc fname pos)]+ else pushFile file getNextToken++type AlexInput = ParserState++begin :: Int -> AlexInput -> Int -> ParseMonad LToken+begin sc' st len = setCurrentStartCode sc' >> getNextToken++alexInputPrevChar :: AlexInput -> Char+alexInputPrevChar (ParserState { fileStack = fps:_ })= previousChar fps++alexGetChar :: AlexInput -> Maybe (Char,AlexInput)+alexGetChar (ParserState { fileStack = [] }) = Nothing+alexGetChar (st @ (ParserState { fileStack = fps:fpss })) = gc fps+ where+ gc (fps @ (FileParserState { input = [] })) = + alexGetChar (st { fileStack = fpss })+ gc (fps @ (FileParserState { tokenizerPos = p, input = (c:s) })) =+ p' `seq` Just (c, st')+ where+ p' = movePos p c+ fps' = fps { input = s, tokenizerPos = p', previousChar = c }+ st' = st { fileStack = fps':fpss }++getNextToken :: ParseMonad LToken+getNextToken = do+ FileParserState { + fileName = fname, + tokenizerPos = pos, + currentStartCode = sc } <- getTopFileParserState+ st <- getParserState+ case alexScan st sc of+ AlexEOF -> return $ L Unknown TEOF+ AlexError st' -> + throwSourceError [lexicalErrorMessage (filePositionToSrcLoc fname pos)]+ AlexSkip st' len -> do+ setParserState st'+ getNextToken+ AlexToken st' len action -> do+ setParserState st'+ action st len++getNextTokenWrapper :: (LToken -> ParseMonad a) -> ParseMonad a+getNextTokenWrapper cont = getNextToken >>= cont++++sem_prop,soak :: Int+sem_prop = 1+soak = 2+alex_action_0 = begin sem_prop +alex_action_1 = tok TTauPriority +alex_action_2 = tok TTauPriority +alex_action_3 = tok TDeadlockFree +alex_action_4 = tok TDeadlockFree +alex_action_5 = tok TLivelockFree +alex_action_6 = tok TLivelockFree +alex_action_7 = tok TDivergenceFree +alex_action_8 = tok TDivergenceFree +alex_action_9 = tok TDeterministic +alex_action_10 = tok (TModel Traces) +alex_action_11 = tok (TModel Failures) +alex_action_12 = tok (TModel FailuresDivergences) +alex_action_13 = tok (TModel Revivals) +alex_action_14 = tok (TModel RevivalsDivergences) +alex_action_15 = tok (TModel Refusals) +alex_action_16 = tok (TModel RefusalsDivergences) +alex_action_17 = begin 0 +alex_action_18 = begin 0 +alex_action_19 = tok (TRefines Traces) +alex_action_20 = tok (TRefines Failures) +alex_action_21 = tok (TRefines FailuresDivergences) +alex_action_22 = tok (TRefines Revivals) +alex_action_23 = tok (TRefines RevivalsDivergences) +alex_action_24 = tok (TRefines Refusals) +alex_action_25 = tok (TRefines RefusalsDivergences) +alex_action_26 = skip +alex_action_27 = begin 0 +alex_action_28 = skip +alex_action_29 = nestedComment +alex_action_30 = tok TFalse +alex_action_31 = tok TTrue +alex_action_32 = switchInput +alex_action_33 = tok TExtChoice +alex_action_34 = tok TIntChoice +alex_action_35 = tok TInterleave +alex_action_36 = tok TInterrupt +alex_action_37 = tok TPrefix +alex_action_38 = tok TSlidingChoice +alex_action_39 = tok TRException +alex_action_40 = tok TParallel +alex_action_41 = tok TSemiColon +alex_action_42 = tok TGuard +alex_action_43 = soakTok TAnd +alex_action_44 = soakTok TOr +alex_action_45 = soakTok TNot +alex_action_46 = tok TEq +alex_action_47 = tok TNotEq +alex_action_48 = tok TLtEq +alex_action_49 = tok TGtEq +alex_action_50 = tok TEmptySeq +alex_action_51 = tok TLt +alex_action_52 = gt +alex_action_53 = openseq TLParen +alex_action_54 = closeseq TRParen +alex_action_55 = openseq TLPipeBrace +alex_action_56 = closeseq TRPipeBrace +alex_action_57 = openseq TLBrace +alex_action_58 = closeseq TRBrace +alex_action_59 = openseq TLDoubleSqBracket +alex_action_60 = closeseq TRDoubleSqBracket +alex_action_61 = openseq TLPipeSqBracket +alex_action_62 = closeseq TRPipeSqBracket +alex_action_63 = tok TLSqBracket +alex_action_64 = tok TRSqBracket +alex_action_65 = tok TPipe +alex_action_66 = tok TComma +alex_action_67 = tok TDoubleDot +alex_action_68 = tok TDot +alex_action_69 = tok TQuestionMark +alex_action_70 = tok TExclamationMark +alex_action_71 = tok TDollar +alex_action_72 = tok TDrawnFrom +alex_action_73 = tok TTie +alex_action_74 = tok TColon +alex_action_75 = tok TDoubleAt +alex_action_76 = tok TDefineEqual +alex_action_77 = soakTok TIf +alex_action_78 = soakTok TThen +alex_action_79 = soakTok TElse +alex_action_80 = soakTok TLet +alex_action_81 = soakTok TWithin +alex_action_82 = soakTok TChannel +alex_action_83 = soakTok TAssert +alex_action_84 = soakTok TDataType +alex_action_85 = soakTok TExternal +alex_action_86 = soakTok TTransparent +alex_action_87 = soakTok TNameType +alex_action_88 = tok TBackSlash +alex_action_89 = tok TLambdaDot +alex_action_90 = tok TPlus +alex_action_91 = tok TMinus +alex_action_92 = tok TTimes +alex_action_93 = tok TDivide +alex_action_94 = tok TMod +alex_action_95 = tok TConcat +alex_action_96 = tok THash +alex_action_97 = stok (\s -> TIdent s) +alex_action_98 = stok (\ s -> TInteger (read s)) +alex_action_99 = tok TWildCard +alex_action_100 = tok TNewLine +{-# LINE 1 "templates/GenericTemplate.hs" #-}+{-# LINE 1 "templates/GenericTemplate.hs" #-}+{-# LINE 1 "<built-in>" #-}+{-# LINE 1 "<command-line>" #-}+{-# LINE 1 "templates/GenericTemplate.hs" #-}+-- -----------------------------------------------------------------------------+-- ALEX TEMPLATE+--+-- This code is in the PUBLIC DOMAIN; you may copy it freely and use+-- it for any purpose whatsoever.++-- -----------------------------------------------------------------------------+-- INTERNALS and main scanner engine++{-# LINE 37 "templates/GenericTemplate.hs" #-}++{-# LINE 47 "templates/GenericTemplate.hs" #-}+++data AlexAddr = AlexA# Addr#++#if __GLASGOW_HASKELL__ < 503+uncheckedShiftL# = shiftL#+#endif++{-# INLINE alexIndexInt16OffAddr #-}+alexIndexInt16OffAddr (AlexA# arr) off =+#ifdef WORDS_BIGENDIAN+ narrow16Int# i+ where+ i = word2Int# ((high `uncheckedShiftL#` 8#) `or#` low)+ high = int2Word# (ord# (indexCharOffAddr# arr (off' +# 1#)))+ low = int2Word# (ord# (indexCharOffAddr# arr off'))+ off' = off *# 2#+#else+ indexInt16OffAddr# arr off+#endif++++++{-# INLINE alexIndexInt32OffAddr #-}+alexIndexInt32OffAddr (AlexA# arr) off = +#ifdef WORDS_BIGENDIAN+ narrow32Int# i+ where+ i = word2Int# ((b3 `uncheckedShiftL#` 24#) `or#`+ (b2 `uncheckedShiftL#` 16#) `or#`+ (b1 `uncheckedShiftL#` 8#) `or#` b0)+ b3 = int2Word# (ord# (indexCharOffAddr# arr (off' +# 3#)))+ b2 = int2Word# (ord# (indexCharOffAddr# arr (off' +# 2#)))+ b1 = int2Word# (ord# (indexCharOffAddr# arr (off' +# 1#)))+ b0 = int2Word# (ord# (indexCharOffAddr# arr off'))+ off' = off *# 4#+#else+ indexInt32OffAddr# arr off+#endif++++++#if __GLASGOW_HASKELL__ < 503+quickIndex arr i = arr ! i+#else+-- GHC >= 503, unsafeAt is available from Data.Array.Base.+quickIndex = unsafeAt+#endif+++++-- -----------------------------------------------------------------------------+-- Main lexing routines++data AlexReturn a+ = AlexEOF+ | AlexError !AlexInput+ | AlexSkip !AlexInput !Int+ | AlexToken !AlexInput !Int a++-- alexScan :: AlexInput -> StartCode -> AlexReturn a+alexScan input (I# (sc))+ = alexScanUser undefined input (I# (sc))++alexScanUser user input (I# (sc))+ = case alex_scan_tkn user input 0# input sc AlexNone of+ (AlexNone, input') ->+ case alexGetChar input of+ Nothing -> ++++ AlexEOF+ Just _ ->++++ AlexError input'++ (AlexLastSkip input'' len, _) ->++++ AlexSkip input'' len++ (AlexLastAcc k input''' len, _) ->++++ AlexToken input''' len k+++-- Push the input through the DFA, remembering the most recent accepting+-- state it encountered.++alex_scan_tkn user orig_input len input s last_acc =+ input `seq` -- strict in the input+ let + new_acc = check_accs (alex_accept `quickIndex` (I# (s)))+ in+ new_acc `seq`+ case alexGetChar input of+ Nothing -> (new_acc, input)+ Just (c, new_input) -> ++++ let+ (base) = alexIndexInt32OffAddr alex_base s+ ((I# (ord_c))) = ord c+ (offset) = (base +# ord_c)+ (check) = alexIndexInt16OffAddr alex_check offset+ + (new_s) = if (offset >=# 0#) && (check ==# ord_c)+ then alexIndexInt16OffAddr alex_table offset+ else alexIndexInt16OffAddr alex_deflt s+ in+ case new_s of + -1# -> (new_acc, input)+ -- on an error, we want to keep the input *before* the+ -- character that failed, not after.+ _ -> alex_scan_tkn user orig_input (len +# 1#) + new_input new_s new_acc++ where+ check_accs [] = last_acc+ check_accs (AlexAcc a : _) = AlexLastAcc a input (I# (len))+ check_accs (AlexAccSkip : _) = AlexLastSkip input (I# (len))+ check_accs (AlexAccPred a predx : rest)+ | predx user orig_input (I# (len)) input+ = AlexLastAcc a input (I# (len))+ check_accs (AlexAccSkipPred predx : rest)+ | predx user orig_input (I# (len)) input+ = AlexLastSkip input (I# (len))+ check_accs (_ : rest) = check_accs rest++data AlexLastAcc a+ = AlexNone+ | AlexLastAcc a !AlexInput !Int+ | AlexLastSkip !AlexInput !Int++data AlexAcc a user+ = AlexAcc a+ | AlexAccSkip+ | AlexAccPred a (AlexAccPred user)+ | AlexAccSkipPred (AlexAccPred user)++type AlexAccPred user = user -> AlexInput -> Int -> AlexInput -> Bool++-- -----------------------------------------------------------------------------+-- Predicates on a rule++alexAndPred p1 p2 user in1 len in2+ = p1 user in1 len in2 && p2 user in1 len in2++--alexPrevCharIsPred :: Char -> AlexAccPred _ +alexPrevCharIs c _ input _ _ = c == alexInputPrevChar input++--alexPrevCharIsOneOfPred :: Array Char Bool -> AlexAccPred _ +alexPrevCharIsOneOf arr _ input _ _ = arr ! alexInputPrevChar input++--alexRightContext :: Int -> AlexAccPred _+alexRightContext (I# (sc)) user _ _ input = + case alex_scan_tkn user input 0# input sc AlexNone of+ (AlexNone, _) -> False+ _ -> True+ -- TODO: there's no need to find the longest+ -- match when checking the right context, just+ -- the first match will do.++-- used by wrappers+iUnbox (I# (i)) = i
+ libcspm.cabal view
@@ -0,0 +1,105 @@+Name: libcspm+License: BSD3+License-File: LICENSE.txt+Copyright: (c) 2011 Thomas Gibson-Robinson+Author: Thomas Gibson-Robinson <thomas.gibsonrobinson@gmail.com>+Maintainer: Thomas Gibson-Robinson <thomas.gibsonrobinson@gmail.com>+Bug-reports: https://github.com/tomgr/libcspm/issues+Homepage: https://github.com/tomgr/libcspm+Category: Concurrency+Build-type: Simple+Cabal-version: >=1.9.2+Synopsis: A library providing a parser, type checker and evaluator for CSPM.+Version: 0.1+Extra-source-files: + README.md ++Source-Repository head+ type: git+ location: https://github.com/tomgr/libcspm+ +Source-repository this+ type: git+ location: https://github.com/tomgr/libcspm+ tag: 0.1++Library+ Build-Depends:+ base >= 4 && < 5,+ filepath >= 1.2, + array >= 0.3, + containers >= 0.4, + mtl >= 2.0, + pretty >= 1.0,+ directory >= 1.0,+ graph-wrapper >= 0.2++ Exposed-Modules:+ CSPM,+ CSPM.Compiler.Events,+ CSPM.Compiler.Map,+ CSPM.Compiler.Processes,+ CSPM.Compiler.Set,+ CSPM.DataStructures.Names,+ CSPM.DataStructures.Syntax,+ CSPM.DataStructures.Tokens,+ CSPM.DataStructures.Types,+ CSPM.Desugar,+ CSPM.Evaluator,+ CSPM.Evaluator.BuiltInFunctions,+ CSPM.Evaluator.DeclBind,+ CSPM.Evaluator.Environment,+ CSPM.Evaluator.Exceptions,+ CSPM.Evaluator.Expr,+ CSPM.Evaluator.Module,+ CSPM.Evaluator.Monad,+ CSPM.Evaluator.PatBind,+ CSPM.Evaluator.Values,+ CSPM.Evaluator.ValueSet+ CSPM.Parser,+ CSPM.Parser.Exceptions,+ CSPM.Parser.Lexer,+ CSPM.Parser.Monad,+ CSPM.Parser.Parser,+ CSPM.PrettyPrinter,+ CSPM.TypeChecker,+ CSPM.TypeChecker.BuiltInFunctions,+ CSPM.TypeChecker.Common,+ CSPM.TypeChecker.Compressor,+ CSPM.TypeChecker.Decl,+ CSPM.TypeChecker.Dependencies,+ CSPM.TypeChecker.Environment,+ CSPM.TypeChecker.Exceptions,+ CSPM.TypeChecker.Expr,+ CSPM.TypeChecker.InteractiveStmt,+ CSPM.TypeChecker.Module,+ CSPM.TypeChecker.Monad,+ CSPM.TypeChecker.Pat,+ CSPM.TypeChecker.Unification,+ Util.Annotated,+ Util.Exception,+ Util.HierarchicalMap,+ Util.List,+ Util.Monad,+ Util.PartialFunctions,+ Util.Prelude,+ Util.PrettyPrint+ + Hs-Source-Dirs: src+ + Extensions: DoAndIfThenElse++Test-Suite unit-tests+ Type: exitcode-stdio-1.0+ Main-is: Main.hs++ Extensions: DoAndIfThenElse+ + Hs-Source-Dirs: tests+ + Build-depends: + base,+ libcspm,+ filepath >= 1.2, + mtl >= 2.0,+ directory >= 1.0
+ src/CSPM.hs view
@@ -0,0 +1,187 @@+{-# LANGUAGE TypeSynonymInstances, DoAndIfThenElse #-}+module CSPM (+ module CSPM.DataStructures.Names,+ module CSPM.DataStructures.Syntax,+ module CSPM.DataStructures.Types,+ -- * CSPM Monad+ CSPMSession, newCSPMSession,+ CSPMMonad,+ getSession, setSession, handleWarnings,+ withSession,+ -- ** A basic implementation of the monad+ CSPM, unCSPM,+ -- * Parser API+ parseStringAsFile, parseFile, parseInteractiveStmt, parseExpression,+ -- * Type Checker API+ typeCheckFile, typeCheckInteractiveStmt, typeCheckExpression, ensureExpressionIsOfType,+ dependenciesOfExp, typeOfExpression,+ -- * Evaluator API+ evaluateExp, + bindFile, bindDeclaration, getBoundNames,+)+where++import Control.Monad.State+import Control.Monad.Trans+import System.FilePath+import System.IO++import CSPM.DataStructures.Names+import CSPM.DataStructures.Syntax+import CSPM.DataStructures.Types+import qualified CSPM.Evaluator as EV+import CSPM.Evaluator.Values+import qualified CSPM.Parser as P+import qualified CSPM.TypeChecker as TC+import qualified CSPM.Desugar as DS+import Util.Annotated+import Util.Exception+import Util.PrettyPrint++-- | A `CSPMSession` represents the internal states of all the various+-- components.+data CSPMSession = CSPMSession {+ tcState :: TC.TypeInferenceState,+ evState :: EV.EvaluationState+ }++-- | Create a new `CSPMSession`.+newCSPMSession :: MonadIO m => m CSPMSession+newCSPMSession = do+ -- Get the type checker environment with the built in functions already+ -- injected+ tcState <- liftIO $ TC.initTypeChecker+ let evState = EV.initEvaluator+ return $ CSPMSession tcState evState++-- | The CSPMMonad is the main monad in which all functions must be called.+-- Whilst there is a build in representation (see `CSPM`) it is recommended+-- that you define an instance of CSPMMonad over whatever monad you use.+class (MonadIO m) => CSPMMonad m where+ getSession :: m CSPMSession+ setSession :: CSPMSession -> m ()+ handleWarnings :: [ErrorMessage] -> m ()+ +withSession :: CSPMMonad m => (CSPMSession -> m a) -> m a+withSession f = getSession >>= f++modifySession :: CSPMMonad m => (CSPMSession -> CSPMSession) -> m ()+modifySession f = do+ s <- getSession+ setSession (f s)++reportWarnings :: CSPMMonad m => m(a, [ErrorMessage]) -> m a+reportWarnings prog = withSession $ \ sess -> do+ (v, ws) <- prog+ if ws == [] then return ()+ else handleWarnings ws+ return v++-- A basic implementation+type CSPM = StateT CSPMSession IO++unCSPM :: CSPMSession -> CSPM a -> IO (a, CSPMSession)+unCSPM = flip runStateT+ +instance CSPMMonad CSPM where+ getSession = get+ setSession = put+ handleWarnings ms = liftIO $ putStrLn $ show $ prettyPrint ms++-- Parser API+parse :: CSPMMonad m => FilePath -> P.ParseMonad a -> m a+parse dir p = liftIO $ P.runParser p dir++-- | Parse a file `fp`. Throws a `SourceError` on any parse error.+parseFile :: CSPMMonad m => FilePath -> m [PModule]+parseFile fp =+ let (dir, fname) = splitFileName fp+ in parse dir (P.parseFile fname)++-- | Parses a string, treating it as though it were a file. Throws a +-- `SourceError` on any parse error.+parseStringAsFile :: CSPMMonad m => String -> m [PModule]+parseStringAsFile str = parse "" (P.parseStringAsFile str)++-- | Parses an `InteractiveStmt`. Throws a `SourceError` on any parse error.+parseInteractiveStmt :: CSPMMonad m => String -> m PInteractiveStmt+parseInteractiveStmt str = parse "" (P.parseInteractiveStmt str)++-- | Parses an `Exp`. Throws a `SourceError` on any parse error.+parseExpression :: CSPMMonad m => String -> m PExp+parseExpression str = parse "" (P.parseExpression str)++-- TypeChecker API+-- All the type checkers also perform desugaring+runTypeCheckerInCurrentState :: CSPMMonad m => TC.TypeCheckMonad a -> m (a, [ErrorMessage])+runTypeCheckerInCurrentState p = withSession $ \s -> do+ (a, ws, st) <- liftIO $ TC.runFromStateToState (tcState s) p+ modifySession (\s -> s { tcState = st })+ return (a, ws)++-- | Type checks a file, also desugaring it. Throws a `SourceError`+-- if an error is encountered and will call handleWarnings +typeCheckFile :: CSPMMonad m => [PModule] -> m [TCModule]+typeCheckFile ms = reportWarnings $ runTypeCheckerInCurrentState $ do+ TC.typeCheck ms+ return $ DS.desugar ms++-- | Type checks a `InteractiveStmt`.+typeCheckInteractiveStmt :: CSPMMonad m => PInteractiveStmt -> m TCInteractiveStmt+typeCheckInteractiveStmt pstmt = reportWarnings $ runTypeCheckerInCurrentState $ do+ TC.typeCheck pstmt+ return $ DS.desugar pstmt++typeCheckExpression :: CSPMMonad m => PExp -> m TCExp+typeCheckExpression exp = reportWarnings $ runTypeCheckerInCurrentState $ do+ TC.typeCheck exp+ return $ DS.desugar exp++ensureExpressionIsOfType :: CSPMMonad m => Type -> PExp -> m TCExp+ensureExpressionIsOfType t exp = reportWarnings $ runTypeCheckerInCurrentState $ do+ TC.typeCheckExpect t exp+ return $ DS.desugar exp++-- | Gets the type of the expression in the current context.+typeOfExpression :: CSPMMonad m => PExp -> m Type+typeOfExpression exp = + reportWarnings $ runTypeCheckerInCurrentState (TC.typeOfExp exp)++dependenciesOfExp :: CSPMMonad m => TCExp -> m [Name]+dependenciesOfExp e = + reportWarnings $ runTypeCheckerInCurrentState (TC.dependenciesOfExp e)++-- Evaluator API+runEvaluatorInCurrentState :: CSPMMonad m => EV.EvaluationMonad a -> m a+runEvaluatorInCurrentState p = withSession $ \s -> do+ let (a, st) = EV.runFromStateToState (evState s) p+ modifySession (\s -> s { evState = st })+ return a++-- Environment API++-- | Get a list of currently bound names in the environment.+getBoundNames :: CSPMMonad m => m [Name]+getBoundNames = runEvaluatorInCurrentState EV.getBoundNames ++-- | Takes a declaration and adds it to the current environment.+bindDeclaration :: CSPMMonad m => TCDecl -> m ()+bindDeclaration d = withSession $ \s -> do+ evSt <- runEvaluatorInCurrentState (EV.addToEnvironment (EV.evaluateDecl d))+ modifySession (\s -> s { evState = evSt })++-- | Binds all the declarations that are in a particular file.+bindFile :: CSPMMonad m => [TCModule] -> m ()+bindFile ms = do+ -- Bind+ evSt <- runEvaluatorInCurrentState (EV.addToEnvironment (EV.evaluateFile ms))+ modifySession (\s -> s { evState = evSt })+ return ()++-- | Returns a list of all declarations in the specified file.+evaluateFile :: CSPMMonad m => [TCModule] -> m [(Name, Value)]+evaluateFile ms = runEvaluatorInCurrentState (EV.evaluateFile ms)++-- | Evaluates the expression in the current context.+evaluateExp :: CSPMMonad m => TCExp -> m Value+evaluateExp e = runEvaluatorInCurrentState (EV.evaluateExp e)
+ src/CSPM/Compiler/Events.hs view
@@ -0,0 +1,33 @@+{-# LANGUAGE TypeSynonymInstances #-}+module CSPM.Compiler.Events (+ Event(..),+ EventSet+) where++import qualified CSPM.Compiler.Map as M+import qualified CSPM.Compiler.Set as S+import Util.PrettyPrint++-- | Events, as represented in the LTS.+data Event = + -- | The internal special event tau.+ Tau + -- | The internal event tick, representing termination.+ | Tick + -- | Any event defined in a channel definition.+ | UserEvent String+ deriving (Eq, Ord)++instance PrettyPrintable Event where+ prettyPrint Tau = char 'τ'+ prettyPrint Tick = char '✓'+ prettyPrint (UserEvent s) = text s+instance Show Event where+ show ev = show (prettyPrint ev)++-- | An alias for ease+type EventSet = S.Set Event+type EventMap = M.Map Event Event++instance PrettyPrintable EventSet where+ prettyPrint s = braces (list (map prettyPrint (S.toList s)))
+ src/CSPM/Compiler/Map.hs view
@@ -0,0 +1,32 @@+{-# LANGUAGE TypeSynonymInstances #-}+module CSPM.Compiler.Map ( + Map,+ lookup,+ empty,+ insert,+ domain, unSafeLookup,+ toList,+ fromList,+ Relation, applyRelation+) where++import Data.List (nub)+import Prelude hiding (lookup)+import Util.PartialFunctions++-- TODO+type Relation k v = Map k v+type Map k v = PartialFunction k v++instance (Eq k, Eq v) => Eq (Map k v) where+ m1 == m2 = and [lookup k m1 == lookup k m1 | k <- domain m1]+ +lookup k m = safeApply m k+empty = []+insert k v m = (k,v):m+domain m = nub (functionDomain m)+unSafeLookup k m = case lookup k m of+ Just v -> v+ Nothing -> error "no value"+toList = id+fromList = id
+ src/CSPM/Compiler/Processes.hs view
@@ -0,0 +1,57 @@+module CSPM.Compiler.Processes (+ Proc(..), ProcName+) where++import CSPM.Compiler.Events+import Util.PrettyPrint++type ProcName = String++data Proc =+ PAlphaParallel [(EventSet, Proc)]+ | PException Proc EventSet Proc+ | PExternalChoice [Proc]+ | PGenParallel EventSet [Proc]+ | PHide Proc EventSet+ | PInternalChoice [Proc]+ | PInterrupt Proc Proc+ | PInterleave [Proc]+ | PPrefix Event Proc+ | PSequentialComp Proc Proc+ | PSlidingChoice Proc Proc+ -- TODO:+ -- | PLinkParallel EventMap [Proc]+ -- | PRename EventMap Proc+ -- | POperator ProcOperator Proc+ -- where:+ -- data ProcOperator = Normalise | Explicate | StrongBisim | TauLoopFactor | Diamond | ModelCompress+ | PProcCall ProcName (Maybe Proc)++instance PrettyPrintable Proc where+ prettyPrint (PAlphaParallel aps) =+ text "||" <+> braces (list (map (\ (a,p) -> + parens (prettyPrint a <> char ',' <+> prettyPrint p)) aps))+ prettyPrint (PException p1 a p2) =+ prettyPrint p1 <+> text "[|" <> prettyPrint a <> text "|>" + <+> prettyPrint p2+ prettyPrint (PExternalChoice ps) =+ sep (punctuate (text " []") (map prettyPrint ps))+ prettyPrint (PGenParallel a ps) =+ text "||" <+> brackets (prettyPrint a) + <+> braces (list (map prettyPrint ps))+ prettyPrint (PHide p a) =+ prettyPrint p <+> char '\\' <+> prettyPrint a+ prettyPrint (PInternalChoice ps) =+ sep (punctuate (text " |~|") (map prettyPrint ps))+ prettyPrint (PInterleave ps) =+ sep (punctuate (text " |||") (map prettyPrint ps))+ prettyPrint (PPrefix e p) =+ prettyPrint e <+> text "->" <+> prettyPrint p+ prettyPrint (PSequentialComp p1 p2) =+ prettyPrint p1 <+> text "->" <+> prettyPrint p2+ prettyPrint (PSlidingChoice p1 p2) =+ prettyPrint p1 <+> text "|>" <+> prettyPrint p2+ + prettyPrint (PProcCall s _) = text s+instance Show Proc where+ show p = show (prettyPrint p)
+ src/CSPM/Compiler/Set.hs view
@@ -0,0 +1,39 @@+module CSPM.Compiler.Set ( + Set,+ null,+ member,+ empty,+ unions,+ union,+ difference,+ fromList, + toList,+ unionMap,+ split,+ subseteq,+) where++import Data.List ((\\), nub)+import Prelude hiding (null)++type Set a = [a]++null s = s == []+empty = []+unions xss = nub (concat xss)+union xs ys = nub (xs ++ ys)+difference xs ys = xs \\ ys+fromList = id+toList = id+member x xs = elem x xs+subseteq xs ys = and (map (\x -> x `elem` ys) xs)++unionMap :: Ord b => (a -> Set b) -> Set a -> Set b+unionMap f = unions . map f . toList++-- TODO: replace with iterOverSet :: Set a -> (a -> m b) -> m (Set b) ?+split :: Set a -> (a, Set a)+split (x:xs) = (x,xs)+++{- TODO use http://hackage.haskell.org/packages/archive/hashtables/1.0.0.0/doc/html/Data-HashTable-Class.html#v:new #-}
+ src/CSPM/DataStructures/Names.hs view
@@ -0,0 +1,19 @@+{-# LANGUAGE DeriveDataTypeable #-}+module CSPM.DataStructures.Names where+import Data.Typeable++data Name = + Name String+ | InternalName String+ deriving (Eq, Ord, Typeable, Show)++isInternal :: Name -> Bool+isInternal (Name _) = False+isInternal (InternalName _) = True++mkInternalName :: String -> Name+mkInternalName = InternalName++data QualifiedName =+ UnQual Name+ deriving (Eq, Show)
+ src/CSPM/DataStructures/Syntax.hs view
@@ -0,0 +1,261 @@+module CSPM.DataStructures.Syntax where++import CSPM.DataStructures.Types+import CSPM.DataStructures.Names+import Util.Annotated+import Util.Exception++-- P = post parsing, TC = post typechecking, An = annotated+type AnModule = Annotated () Module+-- Declarations may bind multiple names+type AnDecl = Annotated (Maybe SymbolTable, PSymbolTable) Decl+type AnMatch = Annotated () Match+type AnPat = Annotated () Pat+type AnExp = Annotated (Maybe Type, PType) Exp+type AnField = Annotated () Field+type AnStmt = Annotated () Stmt+type AnDataTypeClause = Annotated () DataTypeClause+type AnAssertion = Annotated () Assertion+type AnInteractiveStmt = Annotated () InteractiveStmt++getType :: Annotated (Maybe Type, PType) a -> Type+getType an = case fst (annotation an) of+ Just t -> t+ Nothing -> panic "Cannot get the type of something that is not typechecked"++getSymbolTable :: Annotated (Maybe SymbolTable, PSymbolTable) a -> SymbolTable+getSymbolTable an = case fst (annotation an) of+ Just t -> t+ Nothing -> panic "Cannot get the symbol table of something that is not typechecked"+++type PModule = AnModule+type PDecl = AnDecl+type PMatch = AnMatch+type PPat = AnPat+type PExp = AnExp+type PStmt = AnStmt+type PField = AnField+type PDataTypeClause = AnDataTypeClause+type PAssertion = AnAssertion+type PInteractiveStmt = AnInteractiveStmt++type TCModule = AnModule+type TCDecl = AnDecl+type TCMatch = AnMatch+type TCPat = AnPat+type TCExp = AnExp+type TCField = AnField+type TCStmt = AnStmt+type TCDataTypeClause = AnDataTypeClause+type TCAssertion = AnAssertion+type TCInteractiveStmt = AnInteractiveStmt++-- *************************************************************************+-- Basic Components+-- *************************************************************************+data Literal = + Int Integer+ | Bool Bool+ deriving (Eq, Show)++-- *************************************************************************+-- Modules+-- *************************************************************************+data Module = + GlobalModule [AnDecl]+ deriving (Eq, Show)++-- *************************************************************************+-- Expressions+-- *************************************************************************+data BinaryBooleanOp =+ And + | Or + | Equals + | NotEquals + | LessThan + | GreaterThan + | LessThanEq + | GreaterThanEq+ deriving (Eq, Show)+ +data UnaryBooleanOp =+ Not+ deriving (Eq, Show)++data UnaryMathsOp = + Negate+ deriving (Eq, Show)++data BinaryMathsOp = + Divide | Minus | Mod | Plus | Times+ deriving (Eq, Show)++data Exp =+ App AnExp [AnExp]+ | BooleanBinaryOp BinaryBooleanOp AnExp AnExp+ | BooleanUnaryOp UnaryBooleanOp AnExp+ | Concat AnExp AnExp+ | DotApp AnExp AnExp+ | If AnExp AnExp AnExp+ | Lambda AnPat AnExp+ | Let [AnDecl] AnExp+ | Lit Literal+ | List [AnExp]+ | ListComp [AnExp] [AnStmt]+ | ListEnumFrom AnExp+ | ListEnumFromTo AnExp AnExp+ -- TODO: ListEnumFrom and ListEnumTO - test in FDR+ -- TODO: compare with official CSPM syntax+ | ListLength AnExp+ | MathsBinaryOp BinaryMathsOp AnExp AnExp+ | MathsUnaryOp UnaryMathsOp AnExp+ | Paren AnExp+ | Set [AnExp]+ | SetComp [AnExp] [AnStmt]+ | SetEnum [AnExp] -- {| |}+ | SetEnumComp [AnExp] [AnStmt] -- {|c.x | x <- xs|}+ | SetEnumFrom AnExp+ | SetEnumFromTo AnExp AnExp+ | Tuple [AnExp]+ | Var QualifiedName++ -- Processes+ | AlphaParallel AnExp AnExp AnExp AnExp -- Proc Alpha Alpha Proc+ | Exception AnExp AnExp AnExp -- Proc Alpha Proc+ | ExternalChoice AnExp AnExp+ | GenParallel AnExp AnExp AnExp -- Proc Alpha Proc + | GuardedExp AnExp AnExp -- b & P+ | Hiding AnExp AnExp+ | InternalChoice AnExp AnExp+ | Interrupt AnExp AnExp+ | Interleave AnExp AnExp+ | LinkParallel AnExp [(AnExp, AnExp)] [AnStmt] AnExp -- Exp, tied chans, generators, second+ | Prefix AnExp [AnField] AnExp+ | Rename AnExp [(AnExp, AnExp)] [AnStmt]+ | SequentialComp AnExp AnExp -- P; Q+ | SlidingChoice AnExp AnExp++ -- Replicated Operators+ | ReplicatedAlphaParallel [AnStmt] AnExp AnExp -- alpha exp is second+ | ReplicatedExternalChoice [AnStmt] AnExp+ | ReplicatedInterleave [AnStmt] AnExp + | ReplicatedInternalChoice [AnStmt] AnExp+ | ReplicatedLinkParallel [(AnExp, AnExp)] [AnStmt] AnExp+ | ReplicatedParallel AnExp [AnStmt] AnExp -- alpha exp is first+ + -- Used only for parsing+ | ExpPatWildCard+ | ExpPatDoublePattern AnExp AnExp+ + deriving (Eq, Show)++data Field = + -- | !x+ Output AnExp+ -- | ?x:A+ | Input AnPat (Maybe AnExp)+ -- | $x:A (see P395 UCS)+ | NonDetInput AnPat (Maybe AnExp)+ deriving (Eq, Show)+ +data Stmt = + Generator AnPat AnExp+ | Qualifier AnExp+ deriving (Eq, Show)++-- A statement in an interactive session+data InteractiveStmt =+ Evaluate AnExp+ | Bind AnDecl+ | RunAssertion Assertion+ deriving Show+ +-- *************************************************************************+-- Declarations+-- *************************************************************************+data Decl = + -- Third argument is the annotated type+ FunBind Name [AnMatch]+ | PatBind AnPat AnExp+ | Assert Assertion+ | External [Name]+ | Transparent [Name]+ -- The expression in the following three definitions means a type expression+ -- and therefore dots and commas have special meanings. See TPC P529 for+ -- details (or the typechecker or evaluator).+ | Channel [Name] (Maybe AnExp)+ | DataType Name [AnDataTypeClause]+ | NameType Name AnExp+ deriving (Eq, Show)++-- TODO: annotate+data Assertion = + Refinement AnExp Model AnExp [ModelOption]+ | PropertyCheck AnExp SemanticProperty (Maybe Model)+ | BoolAssertion AnExp+ | ASNot Assertion+ deriving (Eq, Show)+ +data Model = + Traces + | Failures + | FailuresDivergences + | Refusals+ | RefusalsDivergences+ | Revivals+ | RevivalsDivergences+ deriving (Eq, Show)+ +data ModelOption = + TauPriority AnExp+ deriving (Eq, Show)+ +data SemanticProperty = + DeadlockFreedom+ | Deterministic + | LivelockFreedom+ deriving (Eq, Show)+ +-- TODO: annotate+data DataTypeClause =+ DataTypeClause Name (Maybe AnExp)+ deriving (Eq, Show)++data Match =+ Match [[AnPat]] AnExp+ deriving (Eq, Show)++data Pat =+ PConcat AnPat AnPat+ | PDotApp AnPat AnPat+ | PDoublePattern AnPat AnPat+ | PList [AnPat]+ | PLit Literal+ | PParen AnPat+ | PSet [AnPat]+ | PTuple [AnPat]+ | PVar Name+ | PWildCard+ + -- In all compiled patterns we store the original pattern+ -- Because of the fact that you can write patterns such as:+ -- f(<x,y>^xs^<z,p>)+ -- f(<x,y>)+ -- f(xs^<x,y>)+ -- we need an easy may of matching them. Thus, we compile+ -- the patterns to a PCompList instead.+ -- PCompList ps (Just (p, ps')) corresponds to a list+ -- where it starts with ps (where each p in ps matches exactly one+ -- component, has a middle of p and and end matching exactly ps'+ | PCompList [AnPat] (Maybe (AnPat, [AnPat])) Pat+ -- Recall the longest match rule when evaluating this+ -- How about:+ -- channel c : A.Int.A+ -- datatype A = B.Bool+ -- func(c.B.true.x) =+ -- func(c.B.false.0.B.x) =+ | PCompDot [AnPat] Pat++ deriving (Eq, Show)
+ src/CSPM/DataStructures/Tokens.hs view
@@ -0,0 +1,199 @@+module CSPM.DataStructures.Tokens (+ Token(..), LToken, Model(..),+)+where++import CSPM.DataStructures.Syntax (Model(..))+import CSPM.PrettyPrinter+import Util.Annotated+import Util.PrettyPrint++data Token = + TInteger Integer+ | TFalse+ | TTrue+ | TIdent String++ | TRefines Model+ | TModel Model+ | TTauPriority+ | TDeadlockFree+ | TDivergenceFree+ | TLivelockFree+ | TDeterministic++ | TNewLine+ | TDefineEqual++ | TComma+ | TDot+ | TExclamationMark+ | TQuestionMark+ | TDollar+ | TPipe+ | TDoubleDot+ | TColon+ | TDrawnFrom+ | TTie -- "<->"++ | TDoubleAt+ | TWildCard++ | TIf+ | TThen+ | TElse+ | TLet+ | TWithin+ | TBackSlash+ | TLambdaDot+ | TChannel+ | TAssert+ | TDataType+ | TExternal+ | TTransparent+ | TNameType++ | TSemiColon+ | TGuard++ | TNot+ | TAnd+ | TOr+ | TEq+ | TNotEq+ | TLtEq+ | TGtEq+ | TLt+ | TGt+ | TPlus+ | TMinus+ | TTimes+ | TDivide+ | TMod+ | TCloseSeq+ | TEmptySeq++ | TConcat+ | THash++ | TLParen+ | TRParen+ | TLBrace+ | TRBrace+ | TLPipeBrace+ | TRPipeBrace+ | TLDoubleSqBracket+ | TRDoubleSqBracket+ | TLPipeSqBracket+ | TRPipeSqBracket+ | TLSqBracket+ | TRSqBracket + + | TExtChoice+ | TIntChoice+ | TInterleave+ | TPrefix+ | TInterrupt+ | TSlidingChoice+ | TRException+ | TParallel++ | TEOF+ deriving Eq+ +type LToken = Located Token++instance Show Token where+ show t = show (prettyPrint t)++instance PrettyPrintable Token where+ prettyPrint (TInteger i) = integer i+ prettyPrint TFalse = text "false"+ prettyPrint TTrue = text "true"+ prettyPrint (TIdent s) = text s++ prettyPrint (TRefines m) = char '[' <> prettyPrint m <> char '='+ prettyPrint (TModel m) = char '[' <> prettyPrint m <> char ']'+ prettyPrint TTauPriority = text "tau priority"+ prettyPrint TDeadlockFree = text "deadlock free"+ prettyPrint TDivergenceFree = text "divergence free"+ prettyPrint TLivelockFree = text "livelock free"+ prettyPrint TDeterministic = text "deterministic"++ prettyPrint TNewLine = text "<newline>"+ prettyPrint TDefineEqual = char '='++ prettyPrint TComma = char ','+ prettyPrint TDot = char '.'+ prettyPrint TExclamationMark = char '!'+ prettyPrint TQuestionMark = char '?'+ prettyPrint TDollar = char '$'+ prettyPrint TPipe = char '|'+ prettyPrint TDoubleDot = text ".."+ prettyPrint TColon = char ':'+ prettyPrint TDrawnFrom = text "<-"+ prettyPrint TTie = text "<->"++ prettyPrint TDoubleAt = text "@@"+ prettyPrint TWildCard = char '_'++ prettyPrint TIf = text "if"+ prettyPrint TThen = text "then"+ prettyPrint TElse = text "else"+ prettyPrint TLet = text "let"+ prettyPrint TWithin = text "within"+ prettyPrint TBackSlash = char '\\'+ prettyPrint TLambdaDot = char '@'+ prettyPrint TChannel = text "channel"+ prettyPrint TAssert = text "assert"+ prettyPrint TDataType = text "datatype"+ prettyPrint TExternal = text "external"+ prettyPrint TTransparent = text "transparent"+ prettyPrint TNameType = text "nametype"++ prettyPrint TSemiColon = char ';'+ prettyPrint TGuard = char '&'++ prettyPrint TNot = text "not"+ prettyPrint TAnd = text "and"+ prettyPrint TOr = text "or"+ prettyPrint TEq = text "=="+ prettyPrint TNotEq = text "!="+ prettyPrint TLtEq = text "<="+ prettyPrint TGtEq = text ">="+ prettyPrint TLt = char '<'+ prettyPrint TGt = char '>'+ prettyPrint TPlus = char '+'+ prettyPrint TMinus = char '-'+ prettyPrint TTimes = char '*'+ prettyPrint TDivide = char '/'+ prettyPrint TMod = char '%'+ prettyPrint TCloseSeq = char '<'+ prettyPrint TEmptySeq = text "<>"++ prettyPrint TConcat = char '^'+ prettyPrint THash = char '#'++ prettyPrint TLParen = char '('+ prettyPrint TRParen = char ')'+ prettyPrint TLBrace = char '{'+ prettyPrint TRBrace = char '}'+ prettyPrint TLPipeBrace = text "{|"+ prettyPrint TRPipeBrace = text "|}"+ prettyPrint TLDoubleSqBracket = text "[["+ prettyPrint TRDoubleSqBracket = text "]]"+ prettyPrint TLPipeSqBracket = text "[|"+ prettyPrint TRPipeSqBracket = text "|]"+ prettyPrint TLSqBracket = text "["+ prettyPrint TRSqBracket = text "]"+ + prettyPrint TExtChoice = text "[]"+ prettyPrint TIntChoice = text "|~|"+ prettyPrint TInterleave = text "|||"+ prettyPrint TPrefix = text "->"+ prettyPrint TInterrupt = text "/\\"+ prettyPrint TSlidingChoice = text "[>"+ prettyPrint TRException = text "|>"+ prettyPrint TParallel = text "||"++ prettyPrint TEOF = text "EOF"
+ src/CSPM/DataStructures/Types.hs view
@@ -0,0 +1,165 @@+module CSPM.DataStructures.Types where++import Control.Monad.Trans+import Data.IORef+import Data.List++import CSPM.DataStructures.Names+import Util.PartialFunctions+import Util.PrettyPrint++-- *************************************************************************+-- Types+-- *************************************************************************+newtype TypeVar = TypeVar Int deriving (Eq, Show)++data TypeScheme =+ ForAll [(TypeVar, [Constraint])] Type+ deriving (Eq, Show)+ +data Constraint =+ Eq | Ord+ deriving (Eq, Ord, Show)++-- During Type Checking we use TDotable a b only when a is something+-- atomic. Except, during unification we start doing TDotable (TDot...)+-- and may build up large TDotable a b types.+data Type =+ TVar TypeVarRef+ | TProc+ | TInt+ | TBool+ | TEvent+ -- Something that can be extended to an event (only used internally)+ | TEventable+ | TSet Type+ | TSeq Type+ | TDot Type Type+ | TTuple [Type]+ -- Arguments to result type+ | TFunction [Type] Type+ -- TDotable a b means that this type can be dotted+ -- with an a to yield something of type b+ | TDotable Type Type+ | TDatatype Name+ deriving (Eq, Show)++data TypeVarRef = + TypeVarRef TypeVar [Constraint] PType++instance Eq TypeVarRef where+ (TypeVarRef tv1 cs1 pt1) == (TypeVarRef tv2 cs2 pt2) = tv1 == tv2++instance Show TypeVarRef where+ show (TypeVarRef tv cs _) = "TypeVarRef "++show tv ++ show cs++newtype IORefMaybe a = IORefMaybe (Maybe a)+type SymbolTable = PartialFunction Name TypeScheme+type PType = IORef (Maybe Type)+type PSymbolTable = IORef SymbolTable++readPType :: (MonadIO m) => PType -> m (Maybe Type)+readPType ioref = liftIO $ readIORef ioref++setPType :: (MonadIO m) => PType -> Type -> m ()+setPType ioref t = liftIO $ writeIORef ioref (Just t)++freshPType :: (MonadIO m) => m PType+freshPType = liftIO $ newIORef Nothing++readPSymbolTable :: (MonadIO m) => PSymbolTable -> m SymbolTable+readPSymbolTable ioref = liftIO $ readIORef ioref++setPSymbolTable :: (MonadIO m) => PSymbolTable -> SymbolTable -> m ()+setPSymbolTable ioref t = liftIO $ writeIORef ioref t++freshPSymbolTable :: (MonadIO m) => m PSymbolTable+freshPSymbolTable = liftIO $ newIORef []++instance PrettyPrintable Constraint where+ prettyPrint Eq = text "Eq"+ prettyPrint Ord = text "Ord"++-- | Pretty prints several types using the same variable substitutions+prettyPrintTypes :: [Type] -> [Doc]+prettyPrintTypes ts = map (prettyPrintType vmap) ts+ where+ vs = (nub . map fst . concatMap collectConstraints) ts+ -- | Map from int to letter to improve presentation+ vmap = zip (map (\ (TypeVar n) -> n) vs) ['a'..'z']++instance PrettyPrintable Type where+ prettyPrint t = prettyPrint (ForAll (collectConstraints t) t)++instance PrettyPrintable TypeScheme where+ prettyPrint (ForAll ts t) =+ (if length varsWithCs > 0 then + (if length varsWithCs > 1 then parens constraintsText + else constraintsText)+ <+> text "=> "+ else empty)+ <> prettyPrintType vmap t+ where+ -- | Map from int to letter to improve presentation+ vmap = zip (map (\ (TypeVar n, _) -> n) ts) ['a'..'z']+ -- | Vars with constraints+ varsWithCs = [(v, c) | (v, cs) <- ts, c <- cs, cs /= []]++ constraintsText = + hsep (+ punctuate comma [+ prettyPrint c <+> char (apply vmap n)+ | (TypeVar n, c) <- varsWithCs]+ )++prettyPrintType :: PartialFunction Int Char -> Type -> Doc+prettyPrintType vmap (TVar (TypeVarRef (TypeVar n) cs ioref)) = + case safeApply vmap n of+ Just c -> char c+ Nothing -> int n+prettyPrintType vmap (TFunction targs tr) = + parens (hsep (punctuate comma (map (prettyPrintType vmap) targs)))+ <+> text "->" <+> prettyPrintType vmap tr+prettyPrintType vmap (TSeq t) =+ char '<' <> prettyPrintType vmap t <> char '>'+prettyPrintType vmap (TSet t) =+ char '{' <> prettyPrintType vmap t <> char '}'+prettyPrintType vmap (TTuple ts) =+ parens (hsep (punctuate comma (map (prettyPrintType vmap) ts)))+prettyPrintType vmap (TDot t1 t2) =+ (case t1 of+ TDotable _ _ -> parens (prettyPrintType vmap t1)+ _ -> prettyPrintType vmap t1+ ) <> text "." <> prettyPrintType vmap t2+prettyPrintType vmap (TDotable t1 t2) =+ prettyPrintType vmap t1 <> text "=>" <> prettyPrintType vmap t2+prettyPrintType vmap (TDatatype (Name n)) = text n++prettyPrintType vmap (TBool) = text "Bool"+prettyPrintType vmap (TInt) = text "Int"+prettyPrintType vmap (TProc) = text "Proc"+prettyPrintType vmap (TEvent) = text "Event"+prettyPrintType vmap (TEventable) = text "Event or Channel"++collectConstraints :: Type -> [(TypeVar, [Constraint])]+collectConstraints = combine . collect+ where+ combine :: [(TypeVar, [Constraint])] -> [(TypeVar, [Constraint])]+ combine xs = + map (\ ys -> (head (map fst ys), nub (concat (map snd ys))))+ (groupBy (\ (v1, _) (v2, _) -> v1 == v2) xs)+ collect :: Type -> [(TypeVar, [Constraint])]+ collect (TVar (TypeVarRef v cs _)) = [(v, cs)]+ collect (TFunction targs tr) = + concatMap collect targs ++ collect tr+ collect (TSeq t) = collect t+ collect (TSet t) = collect t+ collect (TTuple ts) = concatMap collect ts+ collect (TDot t1 t2) = collect t1 ++ collect t2+ collect (TDotable t1 t2) = collect t1 ++ collect t2+ collect (TDatatype _) = []+ collect TBool = []+ collect TInt = []+ collect TProc = []+ collect TEvent = []+ collect TEventable = []
+ src/CSPM/Desugar.hs view
@@ -0,0 +1,179 @@+{-# LANGUAGE FlexibleInstances #-}+module CSPM.Desugar where++import CSPM.DataStructures.Syntax+import CSPM.DataStructures.Types+import CSPM.PrettyPrinter+import Util.Annotated+import Util.Exception+import Util.PrettyPrint++class Desugarable a where+ desugar :: a -> a+ desugarWithType :: a -> Type -> a+ + desugarWithType a t = desugar a++instance Desugarable a => Desugarable [a] where+ desugar xs = map desugar xs+instance Desugarable a => Desugarable (Maybe a) where+ desugar Nothing = Nothing+ desugar (Just a) = Just (desugar a)+instance Desugarable a => Desugarable (Annotated Type a) where+ desugar (An l t i) = An l t (desugarWithType i t)+instance Desugarable a => Desugarable (Annotated b a) where+ desugar (An l b i) = An l b (desugar i)+instance (Desugarable a, Desugarable b) => Desugarable (a,b) where+ desugar (a,b) = (desugar a, desugar b)++instance Desugarable Module where+ desugar (GlobalModule ds) = GlobalModule (desugar ds)++instance Desugarable Decl where+ desugar (FunBind n ms) = FunBind n (desugar ms)+ desugar (PatBind p e) = PatBind (desugar p) (desugar e)+ desugar (Assert a) = Assert (desugar a)+ desugar (External ns) = External ns+ desugar (Transparent ns) = Transparent ns+ desugar (Channel ns me) = Channel ns (desugar me)+ desugar (DataType n cs) = DataType n (desugar cs)+ desugar (NameType n e) = NameType n (desugar e)++instance Desugarable Assertion where+ desugar (Refinement e1 m e2 opts) = + Refinement (desugar e1) m (desugar e2) (desugar opts)+ desugar (PropertyCheck e p m) = + PropertyCheck (desugar e) p m++instance Desugarable ModelOption where+ desugar (TauPriority e) = TauPriority (desugar e)++instance Desugarable DataTypeClause where+ desugar (DataTypeClause n me) = DataTypeClause n (desugar me)++instance Desugarable Match where+ desugar (Match pss e) = Match (desugar pss) (desugar e)++instance Desugarable Exp where+ desugar (App e es) = App (desugar e) (desugar es)+ desugar (BooleanBinaryOp op e1 e2) = + BooleanBinaryOp op (desugar e1) (desugar e2)+ desugar (BooleanUnaryOp op e) =+ BooleanUnaryOp op (desugar e)+ desugar (Concat e1 e2) = Concat (desugar e1) (desugar e2)+ desugar (DotApp e1 e2) = DotApp (desugar e1) (desugar e2)+ desugar (If e1 e2 e3) = If (desugar e1) (desugar e2) (desugar e3)+ desugar (Lambda p e) = Lambda (desugar p) (desugar e)+ desugar (Let ds e) = Let (desugar ds) (desugar e)+ desugar (Lit l) = Lit (desugar l)+ desugar (List es) = List (desugar es)+ desugar (ListComp es stmts) = ListComp (desugar es) (desugar stmts)+ desugar (ListEnumFrom e) = ListEnumFrom (desugar e)+ desugar (ListEnumFromTo e1 e2) = ListEnumFromTo (desugar e1) (desugar e2)+ desugar (ListLength e) = ListLength (desugar e)+ desugar (MathsBinaryOp op e1 e2) = + MathsBinaryOp op (desugar e1) (desugar e2)+ desugar (MathsUnaryOp op e) = MathsUnaryOp op (desugar e)+ -- We don't remove the Paren as people may pretty print a desugared+ -- expression, which would then not have parenthesis needed to+ -- remove ambiguity+ desugar (Paren e) = Paren (desugar e)+ desugar (Set es) = Set (desugar es)+ desugar (SetComp es stmts) = SetComp (desugar es) (desugar stmts)+ desugar (SetEnum es) = SetEnum (desugar es)+ desugar (SetEnumComp es stmts) = SetEnumComp (desugar es) (desugar stmts)+ desugar (SetEnumFrom e) = SetEnumFrom (desugar e)+ desugar (SetEnumFromTo e1 e2) = SetEnumFromTo (desugar e1) (desugar e2)+ desugar (Tuple es) = Tuple (desugar es)+ desugar (Var n) = Var n++ desugar (AlphaParallel e1 e2 e3 e4) =+ AlphaParallel (desugar e1) (desugar e2) (desugar e3) (desugar e4)+ desugar (Exception e1 e2 e3) =+ Exception (desugar e1) (desugar e2) (desugar e3)+ desugar (ExternalChoice e1 e2) = ExternalChoice (desugar e1) (desugar e2)+ desugar (GenParallel e1 e2 e3) =+ GenParallel (desugar e1) (desugar e2) (desugar e3)+ desugar (GuardedExp e1 e2) = GuardedExp (desugar e1) (desugar e2)+ desugar (Hiding e1 e2) = Hiding (desugar e1) (desugar e2)+ desugar (InternalChoice e1 e2) = InternalChoice (desugar e1) (desugar e2)+ desugar (Interrupt e1 e2) = Interrupt (desugar e1) (desugar e2)+ desugar (Interleave e1 e2) = Interleave (desugar e1) (desugar e2)+ desugar (LinkParallel e1 ties stmts e2) = + LinkParallel (desugar e1) (desugar ties) (desugar stmts) (desugar e2)+ desugar (Prefix e1 fs e2) = Prefix (desugar e1) (desugar fs) (desugar e2)+ desugar (Rename e1 ties stmts) =+ Rename (desugar e1) (desugar ties) (desugar stmts)+ desugar (SequentialComp e1 e2) = SequentialComp (desugar e1) (desugar e2)+ desugar (SlidingChoice e1 e2) = SlidingChoice (desugar e1) (desugar e2)+ + desugar (ReplicatedAlphaParallel stmts e1 e2) =+ ReplicatedAlphaParallel (desugar stmts) (desugar e1) (desugar e2)+ desugar (ReplicatedInterleave stmts e) =+ ReplicatedInterleave (desugar stmts) (desugar e)+ desugar (ReplicatedExternalChoice stmts e) =+ ReplicatedExternalChoice (desugar stmts) (desugar e)+ desugar (ReplicatedInternalChoice stmts e) =+ ReplicatedInternalChoice (desugar stmts) (desugar e)+ desugar (ReplicatedParallel stmts e1 e2) =+ ReplicatedParallel (desugar stmts) (desugar e1) (desugar e2)+ desugar (ReplicatedLinkParallel ties stmts e) =+ ReplicatedLinkParallel (desugar ties) (desugar stmts) (desugar e)+ +instance Desugarable Field where+ desugar (Output e) = Output (desugar e)+ desugar (Input p e) = Input (desugar p) (desugar e)+ desugar (NonDetInput p e) = NonDetInput (desugar p) (desugar e)++instance Desugarable Stmt where+ desugar (Generator p e) = Generator (desugar p) (desugar e)+ desugar (Qualifier e) = Qualifier (desugar e)++instance Desugarable InteractiveStmt where+ desugar (Bind d) = Bind (desugar d)+ desugar (Evaluate e) = Evaluate (desugar e)+ desugar (RunAssertion a) = RunAssertion (desugar a)++instance Desugarable Pat where+ desugar (PConcat p1 p2) = + let+ combine (as1, Just (p, bs1)) (as2, Nothing) = (as1, Just (p, bs1++as2))+ combine (as1, Nothing) (as2, p) = (as1++as2, p)+ + extractCompList :: AnPat -> ([AnPat], Maybe (AnPat, [AnPat]))+ extractCompList (An _ _ (PCompList ps mp _)) = (ps, mp)+ extractCompList p = ([], Just (p, []))+ + (start, end) = + combine (extractCompList . desugar $ p1)+ (extractCompList . desugar $ p2)+ in PCompList start end (PConcat p1 p2)+ desugar (PList ps) = PCompList (map desugar ps) Nothing (PList ps)+ desugar (PDotApp p1 p2) = + let+ extractDotList (An _ _ (PCompDot ds _)) = ds+ extractDotList d = [d]+ ds1 = extractDotList (desugar p1)+ ds2 = extractDotList (desugar p2)+ in PCompDot (ds1++ds2) (PDotApp p1 p2)+ desugar (PDoublePattern p1 p2) =+ PDoublePattern (desugar p1) (desugar p2)+ desugar (PLit l) = PLit (desugar l)+ -- We don't remove the Paren as people may pretty print a desugared+ -- expression, which would then not have parenthesis needed to+ -- remove ambiguity+ desugar (PParen p) = PParen (desugar p)+ desugar (PSet []) = PSet []+ desugar (PSet [p]) = PSet [desugar p]+ desugar (PSet ps) = throwSourceError [mkErrorMessage l err]+ where+ -- TODO: get a proper location for the whole+ -- pattern+ l = loc (head ps)+ err = prettyPrint (PSet ps) <+> text "is not a valid set pattern as set patterns may only match at most one element"+ desugar (PTuple ps) = PTuple (map desugar ps)+ desugar (PVar n) = PVar n+ desugar (PWildCard) = PWildCard++instance Desugarable Literal where+ desugar l = l
+ src/CSPM/Evaluator.hs view
@@ -0,0 +1,50 @@+module CSPM.Evaluator (+ evaluateExp, evaluateDecl, evaluateFile,+ getBoundNames, addToEnvironment,+ + initEvaluator, runFromStateToState,+ EvaluationMonad, runEvaluator, EvaluationState,+) where++import CSPM.DataStructures.Names+import CSPM.DataStructures.Syntax+import CSPM.DataStructures.Types+import CSPM.Evaluator.BuiltInFunctions+import CSPM.Evaluator.DeclBind+import CSPM.Evaluator.Environment+import CSPM.Evaluator.Expr+import CSPM.Evaluator.Module+import CSPM.Evaluator.Monad+import CSPM.Evaluator.Values++runFromStateToState :: EvaluationState -> EvaluationMonad a -> + (a, EvaluationState)+runFromStateToState st prog = runEvaluator st $ do+ r <- prog+ s <- getState+ return (r, s)++-- | The environment to use initially. This uses the IO monad as +-- the EvaluationMonad cannot be used without a valid environment.+initEvaluator :: EvaluationState+initEvaluator = runEvaluator (EvaluationState new) $+ injectBuiltInFunctions getState++evaluateExp :: TCExp -> EvaluationMonad Value+evaluateExp e = eval e++-- | Evaluates the declaration but doesn't add it to the current environment.+evaluateDecl :: TCDecl -> EvaluationMonad [(Name, Value)]+evaluateDecl d = bindDecls [d]++-- | Evaluates the declaration but doesn't add it to the current environment.+evaluateFile :: [TCModule] -> EvaluationMonad [(Name, Value)]+evaluateFile ms = bindModules ms++getBoundNames :: EvaluationMonad [Name]+getBoundNames = + getEnvironment >>= return . filter (not . isInternal) . map fst . flatten++addToEnvironment + :: EvaluationMonad [(Name, Value)] -> EvaluationMonad EvaluationState+addToEnvironment bs = addScopeAndBindM bs getState
+ src/CSPM/Evaluator/BuiltInFunctions.hs view
@@ -0,0 +1,95 @@+module CSPM.Evaluator.BuiltInFunctions where++import Control.Monad++import qualified CSPM.Compiler.Set as CS+import CSPM.DataStructures.Names+import CSPM.Evaluator.Monad+import CSPM.Evaluator.Values+import qualified CSPM.Evaluator.ValueSet as S+import Util.Exception++builtInFunctions :: [(Name, Value)]+builtInFunctions = + let+ cspm_union [VSet s1, VSet s2] = S.union s1 s2+ cspm_inter [VSet s1, VSet s2] = S.intersection s1 s2+ cspm_diff [VSet s1, VSet s2] = S.difference s1 s2+ cspm_Union ss = S.unions (map (\ (VSet s) -> s) ss)+ cspm_Inter ss = S.intersections (map (\ (VSet s) -> s) ss)+ cspm_member [v, VSet s] = VBool $ S.member v s+ cspm_card [VSet s] = VInt $ S.card s+ cspm_empty [VSet s] = VBool $ S.empty s+ cspm_set [VList xs] = S.fromList xs+ cspm_Set [VSet s] = S.powerset s+ -- | Set of all sequences over s+ cspm_Seq [VSet s] = S.allSequences s+ cspm_seq [VSet s] = S.toList s+ + + cspm_length [VList xs] = VInt $ (toInteger (length xs))+ cspm_null [VList xs] = VBool $ null xs+ cspm_head [VList xs] = head xs+ cspm_tail [VList xs] = tail xs+ cspm_concat [VList xs] = concat (map (\(VList ys) -> ys) xs)+ cspm_elem [v, VList vs] = VBool $ v `elem` vs+ csp_chaos [VSet a] = VProc $ PProcCall n (Just p)+ where+ n = procId (Name "CHAOS") [[VSet a]]+ evSet = S.valueSetToEventSet a+ branches = [PPrefix ev (PProcCall n Nothing) | ev <- CS.toList evSet]+ stopProc = PProcCall (procId (Name "STOP") []) (Just csp_stop)+ p = PInternalChoice (stopProc:branches)+ + -- | Functions that return sets+ set_funcs = [+ ("union", cspm_union), ("inter", cspm_inter), + ("diff", cspm_diff), ("Union", cspm_Union), + ("Inter", cspm_Inter), ("set", cspm_set), + ("Set", cspm_Set), ("Seq", cspm_Seq)+ ]+ + -- | Functions that return sequences+ seq_funcs = [+ ("seq", cspm_seq), ("tail", cspm_tail), ("concat", cspm_concat)+ ]+ + -- | Functions that return something else+ other_funcs = [+ ("length", cspm_length), ("null", cspm_null), + ("head", cspm_head), ("elem", cspm_elem),+ ("member", cspm_member), ("card", cspm_card),+ ("empty", cspm_empty), ("CHAOS", csp_chaos)+ ]+ + mkFunc (s, f) = (Name s, VFunction (\ vs -> return (f vs)))+ + procs = [+ (csp_stop_id, csp_stop),+ (csp_skip_id, PPrefix Tick (PProcCall csp_stop_id (Just csp_stop)))+ ]+ + csp_skip_id = procId (Name "SKIP") []+ csp_stop_id = procId (Name "STOP") []+ csp_stop = PExternalChoice []+ + mkProc (s, p) = (Name s, VProc p)+ + cspm_true = ("true", VBool True)+ cspm_false = ("false", VBool False)+ cspm_True = ("True", VBool True)+ cspm_False = ("False", VBool False)+ + constants = [cspm_true, cspm_false, cspm_True, cspm_False]+ + mkConstant (s, v) = (Name s, v)+ in+ map mkFunc (+ map (\ (n, f) -> (n, VSet . f)) set_funcs+ ++ map (\ (n, f) -> (n, VList . f)) seq_funcs+ ++ other_funcs)+ ++ map mkProc procs+ ++ map mkConstant constants++injectBuiltInFunctions :: EvaluationMonad a -> EvaluationMonad a+injectBuiltInFunctions = addScopeAndBind builtInFunctions
+ src/CSPM/Evaluator/DeclBind.hs view
@@ -0,0 +1,120 @@+{-# LANGUAGE TypeSynonymInstances #-}+module CSPM.Evaluator.DeclBind (+ bindDecls, valuesForChannel, valuesForDataTypeClause,+) where++import Control.Monad+import Data.Maybe++import CSPM.DataStructures.Names+import CSPM.DataStructures.Syntax+import CSPM.Evaluator.Exceptions+import {-# SOURCE #-} CSPM.Evaluator.Expr+import CSPM.Evaluator.Monad+import CSPM.Evaluator.PatBind+import CSPM.Evaluator.Values+import CSPM.Evaluator.ValueSet+import Util.Annotated++bindDecls :: [TCDecl] -> EvaluationMonad [(Name, Value)]+bindDecls ds = do+ bss <- mapM bindDecl ds+ return (concat bss)++bindDecl :: AnDecl -> EvaluationMonad [(Name, Value)]+bindDecl (an@(An _ _ (FunBind n ms))) = do+ func <- collectArgs argGroupCount []+ return [(n, func)]+ where+ mss = map unAnnotate ms+ argGroupCount = head (map (\ (Match pss e) -> length pss) mss)+ collectArgs :: Int -> [[Value]] -> EvaluationMonad Value+ collectArgs 0 ass_ = do+ bss <- mapM (\ (Match pss e) -> do+ r <- zipWithM bindAll pss ass+ let b = and (map fst r)+ let binds = concatMap snd r+ return ((b, binds), e)+ ) mss+ let+ rs :: [([(Name, Value)], TCExp)]+ rs = [(bs, e) | ((True, bs), e) <- bss]+ case rs of+ ((binds, exp):_) ->+ addScopeAndBind binds (do+ v <- eval exp+ case v of+ VProc p -> + return $ VProc $ PProcCall (procId n ass) (Just p)+ _ -> return v)+ _ -> throwError $ + funBindPatternMatchFailureMessage (loc an) n ass+ where+ ass = reverse ass_+ collectArgs n ass =+ return $ VFunction $ \ vs -> collectArgs (n-1) (vs:ass)+bindDecl (an@(An _ _ (PatBind p e))) = do+ v <- eval e+ r <- bind p v+ case r of + (True, bs) -> return bs+ (False, _) -> throwError $ patternMatchFailureMessage (loc an) p v+bindDecl (an@(An _ _ (Channel ns me))) = do+ -- TODO: check channel values are in es+ vs <- case me of + Nothing -> return []+ Just e -> do+ v <- eval e+ return $ evalTypeExprToList v+ return $ [(n, VEvent n []) | n <- ns]+++ [(internalNameForChannel n, VTuple (map VSet vs)) | n <- ns]+bindDecl (an@(An _ _ (DataType n cs))) =+ -- TODO: check data values are in e+ let+ bindClause (DataTypeClause nc Nothing) = do+ return (emptySet, [(nc, VDataType nc []), + (internalNameForDataTypeClause nc, VTuple [])])+ bindClause (DataTypeClause nc (Just e)) = do+ v <- eval e+ let + sets = evalTypeExprToList v+ setOfValues = cartesianProduct (VDataType nc) sets+ binds = [(nc, VDataType nc []),+ (internalNameForDataTypeClause nc, VTuple (map VSet sets))]+ return (setOfValues, binds)+ in do+ (sets, binds) <- mapAndUnzipM (bindClause . unAnnotate) cs+ let dt = (n, VSet (unions sets))+ return $ dt:concat binds+bindDecl (an@(An _ _ (NameType n e))) = do+ v <- eval e+ return [(n, VSet $ evalTypeExpr v)]++bindDecl (an@(An _ _ (Assert _))) = return []+bindDecl (an@(An _ _ (External ns))) = return []+bindDecl (an@(An _ _ (Transparent ns))) = return []++internalNameForChannel, internalNameForDataTypeClause :: Name -> Name+internalNameForChannel (Name n) = + mkInternalName ("VALUE_TUPLE_CHANNEL_"++n)+internalNameForDataTypeClause (Name n) = + mkInternalName ("VALUE_TUPLE_DT_CLAUSE_"++n)++valuesForChannel :: Name -> EvaluationMonad [ValueSet]+valuesForChannel n = do+ VTuple vs <- lookupVar (internalNameForChannel n)+ return $ map (\(VSet s) -> s) vs++valuesForDataTypeClause :: Name -> EvaluationMonad [ValueSet]+valuesForDataTypeClause n = do+ VTuple vs <- lookupVar (internalNameForDataTypeClause n)+ return $ map (\(VSet s) -> s) vs++evalTypeExpr :: Value -> ValueSet+evalTypeExpr (VSet s) = s+evalTypeExpr (VDot vs) = cartesianProduct VDot (map evalTypeExpr vs)+evalTypeExpr (VTuple vs) = cartesianProduct VTuple (map evalTypeExpr vs)++evalTypeExprToList :: Value -> [ValueSet]+evalTypeExprToList (VDot vs) = map evalTypeExpr vs+evalTypeExprToList v = [evalTypeExpr v]
+ src/CSPM/Evaluator/Environment.hs view
@@ -0,0 +1,13 @@+module CSPM.Evaluator.Environment (+ module Util.HierarchicalMap,+ Environment,+) where++import qualified Data.Map as M+import Prelude++import CSPM.DataStructures.Names+import {-# SOURCE #-} CSPM.Evaluator.Values+import Util.HierarchicalMap++type Environment = HierarchicalMap Name Value
+ src/CSPM/Evaluator/Exceptions.hs view
@@ -0,0 +1,32 @@+module CSPM.Evaluator.Exceptions+where++import Data.Typeable+import Prelude++import CSPM.DataStructures.Names+import CSPM.DataStructures.Syntax+import CSPM.PrettyPrinter+import {-# SOURCE #-} CSPM.Evaluator.Values+import Util.Annotated+import Util.Exception+import Util.PrettyPrint++patternMatchFailureMessage :: SrcSpan -> AnPat -> Value -> ErrorMessage+patternMatchFailureMessage l pat v =+ mkErrorMessage l $ + hang (hang (text "Pattern match failure: Value") tabWidth+ (prettyPrint v))+ tabWidth (text "does not match the pattern" <+> prettyPrint pat)++funBindPatternMatchFailureMessage :: SrcSpan -> Name -> [[Value]] -> ErrorMessage+funBindPatternMatchFailureMessage l n vss = mkErrorMessage l $+ hang (text "Pattern match failure whilst attempting to evaluate:") tabWidth+ (prettyPrint n <> + hcat (map (\ vs -> parens (list (map prettyPrint vs))) vss))+ +typeCheckerFailureMessage :: String -> ErrorMessage+typeCheckerFailureMessage s =+ mkErrorMessage Unknown $+ hang (text "The program caused a runtime error that should have been caught by the typechecker:")+ tabWidth (text s)
+ src/CSPM/Evaluator/Expr.hs view
@@ -0,0 +1,342 @@+{-# LANGUAGE TypeSynonymInstances, DoAndIfThenElse #-}+module CSPM.Evaluator.Expr (+ Evaluatable, eval,+) where++import Control.Monad.Trans+import Data.Maybe++import CSPM.DataStructures.Names+import CSPM.DataStructures.Syntax+import CSPM.Evaluator.DeclBind+import CSPM.Evaluator.Environment+import CSPM.Evaluator.Exceptions+import CSPM.Evaluator.Monad+import CSPM.Evaluator.PatBind+import CSPM.Evaluator.Values+import qualified CSPM.Evaluator.ValueSet as S+import Util.Annotated+import Util.Exception+import Util.PrettyPrint++-- In order to keep lazy evaluation working properly only use pattern+-- matching when you HAVE to know the value. (Hence why we delay pattern+-- matching in BooleanBinaryOp And in case the first value is false.)++class Evaluatable a where+ eval :: a -> EvaluationMonad Value++instance Evaluatable a => Evaluatable (Annotated b a) where+ eval (An _ _ a) = eval a++instance Evaluatable Exp where+ eval (App func args) = do+ vs <- mapM eval args+ VFunction f <- eval func+ f vs+ eval (BooleanBinaryOp op e1 e2) = do+ v1 <- eval e1+ v2 <- eval e2+ case op of+ And -> + let + VBool b1 = v1+ VBool b2 = v2+ in return $ VBool (b1 && b2)+ Or -> + let + VBool b1 = v1+ VBool b2 = v2+ in return $ VBool (b1 || b2)+ Equals -> return $ VBool (v1 == v2)+ NotEquals -> return $ VBool (v1 /= v2)+ LessThan -> return $ VBool (v1 < v2)+ GreaterThan -> return $ VBool (v1 > v2)+ LessThanEq -> return $ VBool (v1 <= v2)+ GreaterThanEq -> return $ VBool (v1 >= v2)+ eval (BooleanUnaryOp op e) = do+ VBool b <- eval e+ case op of+ Not -> return $ VBool (not b)+ eval (Concat e1 e2) = do+ VList vs1 <- eval e1+ v2 <- eval e2+ -- If we instead wrote VList v2 <- eval e2+ -- then this would force evaluation of e2 to a list immediately.+ -- However, if we do the following instead this means that+ -- the second argument is only evaluated if it absolutely has to + -- be (what if e2 was bottom and we were taking head(e1^e2)).+ -- (To see why haskell does this consider the desugared form with+ -- the do's removed. It would be:+ -- ... eval e1) >>= (\ (VList vs2) -> ...)+ -- and therefore the pattern match would force evaluation.)+ let VList vs2 = v2+ return $ VList (vs1++vs2)+ eval (DotApp e1 e2) = do+ v1 <- eval e1+ v2 <- eval e2+ return $ combineDots v1 v2+ where+ combineDots (VDot vs1) (VDot vs2) = VDot (vs1++vs2)+ combineDots (VDot vs) y = VDot (vs++[y])+ combineDots (VEvent n vs1) (VDot vs2) = VEvent n (vs1++vs2)+ combineDots (VEvent n vs1) x = VEvent n (vs1++[x])+ combineDots (VDataType n vs1) (VDot vs2) = VDataType n (vs1++vs2)+ combineDots (VDataType n vs1) x = VDataType n (vs1++[x])+ combineDots v1 v2 = VDot [v1, v2]+ eval (If e1 e2 e3) = do+ VBool b <- eval e1+ if b then eval e2 else eval e3+ eval (Lambda p e) =+ return $ VFunction $ \ [v] -> do+ (matches, binds) <- bind p v+ if matches then+ addScopeAndBind binds (eval e)+ else+ throwError $ patternMatchFailureMessage (loc p) p v+ eval (Let decls e) = do+ bs <- bindDecls decls+ addScopeAndBind bs (eval e)+ eval (Lit lit) = return $+ case lit of+ Int i -> VInt i+ Bool b -> VBool b + eval (List es) = mapM eval es >>= return . VList+ eval (ListComp es stmts) = do+ xs <- evalStmts (\(VList xs) -> xs) stmts (mapM eval es)+ return $ VList xs+ where+ eval (ListEnumFrom e) = do+ VInt lb <- eval e+ return $ VList (map VInt [lb..])+ eval (ListEnumFromTo e1 e2) = do+ VInt lb <- eval e1+ VInt ub <- eval e2+ return $ VList (map VInt [lb..ub])+ eval (ListLength e) = do+ VList xs <- eval e + return $ VInt (toInteger (length xs))+ eval (MathsBinaryOp op e1 e2) = do+ VInt i1 <- eval e1+ VInt i2 <- eval e2+ case op of+ Divide -> return $ VInt (i1 `div` i2)+ Minus -> return $ VInt (i1 - i2)+ Mod -> return $ VInt (i1 `mod` i2)+ Plus -> return $ VInt (i1 + i2)+ Times -> return $ VInt (i1 * i2)+ eval (MathsUnaryOp op e) = do+ VInt i <- eval e+ case op of + Negate -> return $ VInt (-i)+ eval (Paren e) = eval e+ eval (Set es) = mapM eval es >>= return . VSet . S.fromList+ eval (SetComp es stmts) = do+ xs <- evalStmts (\(VSet s) -> S.toList s) stmts (mapM eval es)+ return $ VSet (S.fromList xs)+ eval (SetEnum es) = do+ evs <- mapM eval es+ ss <- mapM completeEvent evs+ return $ VSet (S.unions ss)+ eval (SetEnumComp es stmts) = do+ ss <- evalStmts (\(VSet s) -> S.toList s) stmts + (mapM (\e -> eval e >>= completeEvent) es)+ return $ VSet (S.unions ss)+ eval (SetEnumFrom e) = do+ VInt lb <- eval e+ return $ VSet (S.IntSetFrom lb)+ eval (SetEnumFromTo e1 e2) = do+ VInt lb <- eval e1+ VInt ub <- eval e2+ return $ VSet (S.RangedSet lb ub)+ eval (Tuple es) = mapM eval es >>= return . VTuple+ eval (Var (UnQual n)) = do+ v <- lookupVar n+ case v of+ VProc p -> return $ VProc $ PProcCall (procId n []) (Just p)+ _ -> return v++ -- This is the most complicated process because it is actually a shorthand+ -- for external choice and internal choice.+ eval (Prefix e1 fs e2) = do+ VEvent n vs1 <- eval e1+ let+ normalizeEvent [] = []+ normalizeEvent ((VDot vs1):vs2) = normalizeEvent (vs1++vs2)+ normalizeEvent (v:vs) = v:normalizeEvent vs+ + evalInputField :: [Value] -> [Field] -> AnPat -> S.ValueSet -> + EvaluationMonad [Proc]+ evalInputField vs fs p s = do+ mps <- mapM (\v -> do+ (matches, binds) <- bind p v+ if matches then do+ p <- addScopeAndBind binds + (evalFields (vs++normalizeEvent [v]) fs)+ return $ Just p+ else return Nothing) (S.toList s)+ return $ catMaybes mps+ + evalFields :: [Value] -> [Field] -> EvaluationMonad Proc+ evalFields vs [] = do+ p <- evalProc e2+ return $ PPrefix (valueEventToEvent (VEvent n vs)) p+ evalFields vs (Output e:fs) = do+ v <- eval e+ evalFields (vs++normalizeEvent [v]) fs+ + evalFields vs (Input p (Just e):fs) = do+ VSet s <- eval e+ ps <- evalInputField vs fs p s+ return $ PExternalChoice ps+ evalFields vs (Input p Nothing:fs) = do+ -- Calculate which component this is+ let component = length vs+ chanVs <- valuesForChannel n+ let s = chanVs!!component+ ps <- evalInputField vs fs p s+ return $ PExternalChoice ps+ + evalFields vs (NonDetInput p (Just e):fs) = do+ VSet s <- eval e+ ps <- evalInputField vs fs p s+ return $ PInternalChoice ps+ evalFields vs (NonDetInput p Nothing:fs) = do+ -- Calculate which component this is+ let component = length vs+ chanVs <- valuesForChannel n+ let s = chanVs!!component+ ps <- evalInputField vs fs p s+ return $ PInternalChoice ps+ + -- Takes a proc and combines nested [] and |~|+ simplify :: Proc -> Proc+-- TODO: error over PInternalChoice []+ simplify (PExternalChoice [p]) = simplify p+ simplify (PInternalChoice [p]) = simplify p+ + simplify (PExternalChoice ((PExternalChoice ps1):ps2)) =+ simplify (PExternalChoice (ps1++ps2))+ simplify (PExternalChoice ps) =+ PExternalChoice (map simplify ps)++ simplify (PInternalChoice ((PInternalChoice ps1):ps2)) =+ simplify (PInternalChoice (ps1++ps2))+ simplify (PInternalChoice ps) =+ PInternalChoice (map simplify ps)++ simplify p = p+ + p <- evalFields vs1 (map unAnnotate fs)+ return $ VProc $ simplify p++ eval (AlphaParallel e1 e2 e3 e4) = do+ p1 <- evalProc e1+ p2 <- evalProc e4+ VSet a1 <- eval e2+ VSet a2 <- eval e3+ return $ VProc $ PAlphaParallel [(S.valueSetToEventSet a1, p1),+ (S.valueSetToEventSet a2, p2)]+ eval (Exception e1 e2 e3) = do+ p1 <- evalProc e1+ VSet a <- eval e2+ p2 <- evalProc e3+ return $ VProc $ PException p1 (S.valueSetToEventSet a) p2+ eval (ExternalChoice e1 e2) = do+ p1 <- evalProc e1+ p2 <- evalProc e2+ return $ VProc $ PExternalChoice [p1, p2]+ eval (GenParallel e1 e2 e3) = do+ ps <- evalProcs [e1, e3]+ VSet a <- eval e2+ return $ VProc $ PGenParallel (S.valueSetToEventSet a) ps+ eval (GuardedExp guard proc) = do+ VBool b <- eval guard+ if b then eval proc else lookupVar (Name "STOP")+ eval (Hiding e1 e2) = do+ p <- evalProc e1+ VSet s <- eval e2+ return $ VProc $ PHide p (S.valueSetToEventSet s)+ eval (InternalChoice e1 e2) = do+ ps <- evalProcs [e1, e2]+ return $ VProc $ PInternalChoice ps+ eval (Interrupt e1 e2) = do+ p1 <- evalProc e1+ p2 <- evalProc e2+ return $ VProc $ PInterrupt p1 p2+ eval (Interleave e1 e2) = do+ ps <- evalProcs [e1, e2]+ return $ VProc $ PInterleave ps+-- TODO+-- eval (LinkParallel e1 ties stmts e2)+-- eval (Rename e1 ties stmts) = + eval (SequentialComp e1 e2) = do+ p1 <- evalProc e1+ p2 <- evalProc e2+ return $ VProc $ PSequentialComp p1 p2+ eval (SlidingChoice e1 e2) = do+ p1 <- evalProc e1+ p2 <- evalProc e2+ return $ VProc $ PSlidingChoice p1 p2+ + eval (ReplicatedAlphaParallel stmts e1 e2) = do+ aps <- evalStmts (\(VSet s) -> S.toList s) stmts (do+ VSet s <- eval e1+ p <- evalProc e2+ return [(S.valueSetToEventSet s, p)])+ return $ VProc $ PAlphaParallel aps+ eval (ReplicatedExternalChoice stmts e) = do+ ps <- evalStmts (\(VSet s) -> S.toList s) stmts (evalProcs [e])+ return $ VProc $ PExternalChoice ps+ eval (ReplicatedInterleave stmts e) = do+ ps <- evalStmts (\(VSet s) -> S.toList s) stmts (evalProcs [e])+ return $ VProc $ PInterleave ps+ eval (ReplicatedInternalChoice stmts e) = do+ ps <- evalStmts (\(VSet s) -> S.toList s) stmts (evalProcs [e])+ return $ VProc $ PInternalChoice ps+-- TODO+-- eval (ReplicatedLinkParallel e1 ties stmts e2) =+ eval (ReplicatedParallel e1 stmts e2) = do+ VSet s <- eval e1+ ps <- evalStmts (\(VSet s) -> S.toList s) stmts (evalProcs [e2])+ return $ VProc $ PGenParallel (S.valueSetToEventSet s) ps+ + eval e = panic ("No clause to eval "++show e)++evalProcs = mapM evalProc++evalProc :: Evaluatable a => a -> EvaluationMonad Proc+evalProc a = eval a >>= \v -> case v of+ VProc x -> return x+ _ -> panic "Type checker error"++-- | Evaluates the statements, evaluating `prog` for each possible +-- assingment to the generators that satisfies the qualifiers.+evalStmts :: (Value -> [Value]) -> [AnStmt] -> EvaluationMonad [a] -> + EvaluationMonad [a]+evalStmts extract anStmts prog =+ let+ -- | Progressively generates new values lazily+ evStmts [] = prog+ evStmts (Qualifier e:stmts) = do+ VBool b <- eval e+ if b then evStmts stmts else return []+ evStmts (Generator p e:stmts) = do+ v <- eval e+ let vs = extract v+ vss <- mapM (\v -> do+ (matches, binds) <- bind p v+ if matches then + addScopeAndBind binds (evStmts stmts)+ else return []) vs+ return $ concat vss+ in+ evStmts (map unAnnotate anStmts)++-- | Takes a VEvent and then computes all events that this is a prefix of.+completeEvent :: Value -> EvaluationMonad S.ValueSet+completeEvent (VEvent n vs) = do+ chanVs <- valuesForChannel n+ let remainingComponents = drop (length vs) chanVs+ if length remainingComponents == 0 then return $ S.fromList [VEvent n vs]+ else return $ S.cartesianProduct (\vs' -> VEvent n (vs++vs')) remainingComponents
+ src/CSPM/Evaluator/Expr.hs-boot view
@@ -0,0 +1,14 @@+module CSPM.Evaluator.Expr where++import CSPM.DataStructures.Syntax+import CSPM.Evaluator.Monad+import CSPM.Evaluator.Values+import CSPM.Evaluator.ValueSet+import Util.Annotated++class Evaluatable a where+ eval :: a -> EvaluationMonad Value+ +instance Evaluatable a => Evaluatable (Annotated b a)+instance Evaluatable Exp+
+ src/CSPM/Evaluator/Module.hs view
@@ -0,0 +1,21 @@+{-# LANGUAGE TypeSynonymInstances #-}+module CSPM.Evaluator.Module (+ bindModules, bindModule,+) +where++import Control.Monad++import CSPM.DataStructures.Names+import CSPM.DataStructures.Syntax+import CSPM.Evaluator.DeclBind+import CSPM.Evaluator.Monad+import CSPM.Evaluator.Values+import Util.Annotated++bindModules :: [TCModule] -> EvaluationMonad [(Name, Value)]+bindModules ms = liftM concat (mapM bindModule ms)++bindModule :: TCModule -> EvaluationMonad [(Name, Value)]+bindModule an = case unAnnotate an of+ GlobalModule ds -> bindDecls ds
+ src/CSPM/Evaluator/Monad.hs view
@@ -0,0 +1,75 @@+module CSPM.Evaluator.Monad where++--import Control.Monad.State+import Prelude hiding (lookup)++import CSPM.DataStructures.Names+import CSPM.Evaluator.Exceptions+import CSPM.Evaluator.Environment+import {-# SOURCE #-} CSPM.Evaluator.Values+import Util.Exception++data EvaluationState = + EvaluationState {+ environment :: Environment+ }+ +type EvaluationMonad = LazyEvalMonad EvaluationState++newtype LazyEvalMonad s a = LazyEvalMonad { + -- Notice that this doesn't yield a new environment+ unLazyEvalMonad :: s -> a+}+ +runLazyEvalMonad :: s -> LazyEvalMonad s a -> a+runLazyEvalMonad st (LazyEvalMonad prog) = prog st++gets :: (s -> a) -> LazyEvalMonad s a+gets f = LazyEvalMonad (\st -> f st)++modify :: (s -> s) -> LazyEvalMonad s a -> LazyEvalMonad s a+modify f prog = LazyEvalMonad (\st -> unLazyEvalMonad prog (f st))++instance Monad (LazyEvalMonad a) where+ (LazyEvalMonad p1) >>= f = + LazyEvalMonad (\ st -> + let+ a = p1 st+ LazyEvalMonad p2 = f a+ in p2 st)+ return k = LazyEvalMonad (\ st -> k)++runEvaluator :: EvaluationState -> EvaluationMonad a -> a+runEvaluator st prog = runLazyEvalMonad st prog++getState :: EvaluationMonad EvaluationState+getState = gets id++getEnvironment :: EvaluationMonad Environment+getEnvironment = gets environment++--setEnvironment :: Environment -> EvaluationMonad ()+--setEnvironment env =+-- modify (\ st -> st { environment = env })++lookupVar :: Name -> EvaluationMonad Value+lookupVar n = do+ -- This should never produce an error as the TC would+ -- catch it+ env <- getEnvironment+ return $ lookup env n+ +addScopeAndBind :: [(Name, Value)] -> EvaluationMonad a -> EvaluationMonad a+addScopeAndBind bs = addScopeAndBindM $ return bs++addScopeAndBindM :: EvaluationMonad [(Name, Value)] -> EvaluationMonad a -> EvaluationMonad a+addScopeAndBindM binds = + modify (\st -> let+ bs = runEvaluator st' binds+ env' = newLayerAndBind (environment st) bs+ st' = st { environment = env' }+ in+ st')++throwError :: ErrorMessage -> a+throwError err = throwSourceError [err]
+ src/CSPM/Evaluator/PatBind.hs view
@@ -0,0 +1,78 @@+{-# LANGUAGE TypeSynonymInstances #-}+module CSPM.Evaluator.PatBind where++import Control.Monad++import CSPM.DataStructures.Names+import CSPM.DataStructures.Syntax+import CSPM.Evaluator.Monad+import CSPM.Evaluator.Values+import CSPM.Evaluator.ValueSet+import Util.Annotated+import Util.Exception++-- Bind :: Pattern, value -> (Matches Pattern, Values to Bind+class Bindable a where+ bind :: a -> Value -> EvaluationMonad (Bool, [(Name, Value)])++instance Bindable a => Bindable (Annotated b a) where+ bind (An _ _ a) v = bind a v++instance Bindable Pat where+ -- We can decompose any PConcat pattern into three patterns representing:+ -- Begining (of the form PList), middle (either PWildcard or PVar)+ -- and end (of the form PList), With both begining and end possible empty+ bind (PCompList ps Nothing _) (VList xs) | length ps == length xs = + bindAll ps xs+ -- By desugaring the middle is not a PConcat or a PList+ bind (PCompList starts (Just (middle, ends)) _) (VList xs) =+ -- Only match if the list contains sufficient items+ if not (atLeastLength (length starts + length ends) xs) then + return (False, [])+ else do+ (b1, nvs1) <- bindAll starts xsStart+ (b2, nvs2) <- bindAll ends xsEnd+ (b3, nvs3) <- bind middle (VList xsMiddle)+ return (b1 && b2 && b3, nvs1++nvs2++nvs3)+ where+ atLeastLength 0 _ = True+ atLeastLength _ [] = False+ atLeastLength n (x:xs) = atLeastLength (n-1) xs+ (xsStart, rest) = splitAt (length starts) xs+ (xsMiddle, xsEnd) = + if length ends == 0 then (rest, [])+ else splitAt (length rest - length ends) rest+ bind (PCompDot ps _) (VDot vs) = do+ (b1, nvs1) <- bindAll psInit vsInit+ (b2, nvs2) <- bind pLast (VDot vsLast)+ return (b1 && b2, nvs1++nvs2)+ where+ (psInit, pLast) = initLast ps+ (vsInit, vsLast) = splitAt (length psInit) vs+ initLast :: [a] -> ([a], a)+ initLast [a] = ([],a)+ initLast (a:as) = let (bs,b) = initLast as in (a:bs,b)+ bind (PDoublePattern p1 p2) v = do+ (m1, b1) <- bind p1 v+ (m2, b2) <- bind p2 v+ return $ (m1 && m2, b1++b2)+ bind (PLit (Int i1)) (VInt i2) | i1 == i2 = return (True, [])+ bind (PLit (Bool b1)) (VBool b2) | b1 == b2 = return (True, [])+ bind (PSet [p]) (VSet s) = + case singletonValue s of+ Just v -> bind p v+ Nothing -> return (False, [])+ bind (PTuple ps) (VTuple vs) = do+ -- NB: len ps == len vs by typechecker+ bindAll ps vs+ -- Although n may refer to a datatype or a channel this doesn't+ -- matter, we rebind for ease+ bind (PVar n) v = return (True, [(n, v)])+ bind PWildCard v = return (True, [])+ bind _ _ = return (False, [])++bindAll :: Bindable a => [a] -> [Value]+ -> EvaluationMonad (Bool, [(Name, Value)])+bindAll ps xs = do+ rs <- zipWithM bind ps xs+ return (and (map fst rs), concat (map snd rs))
+ src/CSPM/Evaluator/ValueSet.hs view
@@ -0,0 +1,171 @@+module CSPM.Evaluator.ValueSet where++import Control.Monad+import qualified Data.Set as S++import CSPM.Evaluator.Values+import qualified CSPM.Compiler.Events as CE+import qualified CSPM.Compiler.Set as CS+import Util.Exception+import Util.PrettyPrint hiding (empty)++data ValueSet = + Integers -- Set of all integers+ | Processes -- Set of all processes+ | ExplicitSet (S.Set Value)+ | IntSetFrom Integer -- {lb..}+ | RangedSet Integer Integer -- {lb..ub}+ | LazySet [Value]++instance Eq ValueSet where+ Integers == Integers = True+ Processes == Processes = True+ IntSetFrom lb1 == IntSetFrom lb2 = lb1 == lb2+ RangedSet lb1 ub1 == RangedSet lb2 ub2 = lb1 == lb2 && ub1 == ub2+ ExplicitSet s1 == ExplicitSet s2 = s1 == s2++ ExplicitSet s == RangedSet lb ub = s == S.fromList (map VInt [lb..ub])+ RangedSet lb ub == ExplicitSet s = s == S.fromList (map VInt [lb..ub])+ -- TODO: complete+ + _ == _ = panic "Cannot compare sets"+ +instance Ord ValueSet where+ compare (ExplicitSet s1) (ExplicitSet s2) = compare s1 s2+ -- TODO: complete++instance PrettyPrintable ValueSet where+ prettyPrint Integers = text "Integers"+ prettyPrint Processes = text "Proc"+ prettyPrint (IntSetFrom lb) = braces (integer lb <> text "...")+ prettyPrint (RangedSet lb ub) = + braces (integer lb <> text "..." <> integer ub)+ prettyPrint (ExplicitSet s) =+ braces (list (map prettyPrint $ S.toList s))+ prettyPrint (LazySet vs) =+ braces (list (map prettyPrint vs))+ -- TODO: complete+ +instance Show ValueSet where+ show = show . prettyPrint++-- | Produces a ValueSet of the carteisan product of several ValueSets, +-- using 'vc' to convert each sequence of values into a single value.+cartesianProduct :: ([Value] -> Value) -> [ValueSet] -> ValueSet+cartesianProduct vc = fromList . map vc . sequence . map toList++-- | Returns the powerset of a ValueSet. This requires+powerset :: ValueSet -> ValueSet+powerset = fromList . map (VSet . fromList) . + filterM (\x -> [True, False]) . toList++-- | Returns the set of all sequences over the input set+allSequences :: ValueSet -> ValueSet+allSequences s = if empty s then emptySet else + let + itemsAsList :: [Value]+ itemsAsList = toList s+ list :: Integer -> [Value]+ list 0 = [VList []]+ list n = concatMap (\x -> map (app x) (list (n-1))) itemsAsList+ where+ app :: Value -> Value -> Value+ app x (VList xs) = VList $ x:xs+ in LazySet (list 0)++-- | The empty set+emptySet :: ValueSet+emptySet = ExplicitSet S.empty++-- | Converts a list to a set+fromList :: [Value] -> ValueSet+fromList = ExplicitSet . S.fromList++-- | Converts a set to list.+toList :: ValueSet -> [Value]+toList (ExplicitSet s) = S.toList s+toList (RangedSet lb ub) = map VInt [lb..ub]+toList (IntSetFrom lb) = map VInt [lb..]+toList (LazySet xs) = xs+-- TODO: rest++-- | Returns the value iff the set contains one item only+singletonValue :: ValueSet -> Maybe Value+singletonValue s = if card s == 1 then Just (head (toList s)) else Nothing++member :: Value -> ValueSet -> Bool+member v (ExplicitSet s) = S.member v s+member (VInt i) Integers = True+member (VInt i) (IntSetFrom lb) = i >= lb+member (VInt i) (RangedSet lb ub) = i >= lb && i <= ub+member v (LazySet xs) = v `elem` xs++card :: ValueSet -> Integer+card (ExplicitSet s) = toInteger (S.size s)+card (RangedSet lb ub) = ub-lb+1++empty :: ValueSet -> Bool+empty Processes = panic "empty(Processes) Not implemented"+empty (ExplicitSet s) = S.null s+empty (IntSetFrom lb) = False+empty (Integers) = False+empty (RangedSet lb ub) = False+empty (LazySet xs) =+ case xs of+ x:_ -> False+ _ -> True++mapMonotonic :: (Value -> Value) -> ValueSet -> ValueSet+mapMonotonic f (ExplicitSet s) = ExplicitSet $ S.mapMonotonic f s++unions :: [ValueSet] -> ValueSet+unions vs = foldr union (ExplicitSet S.empty) vs++intersections :: [ValueSet] -> ValueSet+intersections vs = panic "Unions not implemented"++union :: ValueSet -> ValueSet -> ValueSet+union (ExplicitSet s1) (ExplicitSet s2) =+ ExplicitSet (S.union s1 s2)+union (IntSetFrom lb1) (IntSetFrom lb2) = + IntSetFrom (min lb1 lb2)+union (IntSetFrom lb) Integers =Integers+union Integers (IntSetFrom lb) =Integers+union (IntSetFrom lb1) (RangedSet lb2 ub2) | lb1 <= ub2 =+ IntSetFrom (min lb1 lb2)+union (RangedSet lb2 ub2) (IntSetFrom lb1) | lb1 <= ub2 =+ IntSetFrom (min lb1 lb2)+union x y | x == y = x++intersection :: ValueSet -> ValueSet -> ValueSet+intersection (ExplicitSet s1) (ExplicitSet s2) =+ ExplicitSet (S.intersection s1 s2)+intersection (IntSetFrom lb1) (IntSetFrom lb2) = + IntSetFrom (min lb1 lb2)+intersection (IntSetFrom lb) Integers =IntSetFrom lb+intersection Integers (IntSetFrom lb) =IntSetFrom lb+intersection (IntSetFrom lb1) (RangedSet lb2 ub2) =+ if lb1 <= ub2 then RangedSet (max lb2 lb1) ub2+ else ExplicitSet S.empty+intersection (RangedSet lb2 ub2) (IntSetFrom lb1) | lb1 <= ub2 =+ intersection (IntSetFrom lb1) (RangedSet lb2 ub2)+inter x y | x == y = x++difference :: ValueSet -> ValueSet -> ValueSet+difference (ExplicitSet s1) (ExplicitSet s2) =+ ExplicitSet (S.difference s1 s2)+difference (IntSetFrom lb1) (IntSetFrom lb2) = + if lb1 < lb2 then RangedSet lb1 (lb2-1)+ else ExplicitSet S.empty+difference (IntSetFrom lb) Integers = ExplicitSet S.empty+--difference Integers (IntSetFrom lb) = +-- InfSetTo (lb-1)+--difference (IntSetFrom lb1) (RangedSet lb2 ub2) =+-- if lb1 <= ub2 thenRangedSet (max lb2 lb1) ub2+-- elseExplicitSet empty+--difference (RangedSet lb2 ub2) (IntSetFrom lb1) | lb1 <= ub2 =+difference x y | x == y = ExplicitSet S.empty +++valueSetToEventSet :: ValueSet -> CE.EventSet+valueSetToEventSet = CS.fromList . map valueEventToEvent . toList
+ src/CSPM/Evaluator/ValueSet.hs-boot view
@@ -0,0 +1,9 @@+module CSPM.Evaluator.ValueSet where++import Util.PrettyPrint++data ValueSet++instance Eq ValueSet+instance Ord ValueSet+instance PrettyPrintable ValueSet
+ src/CSPM/Evaluator/Values.hs view
@@ -0,0 +1,81 @@+module CSPM.Evaluator.Values (+ Value(..), Proc(..), Event(..),+ procId,+ valueEventToEvent,+) where++import CSPM.Compiler.Events+import CSPM.Compiler.Processes+import CSPM.DataStructures.Names+import CSPM.DataStructures.Syntax+import CSPM.Evaluator.Exceptions+import CSPM.Evaluator.Monad+import {-# SOURCE #-} CSPM.Evaluator.ValueSet+import CSPM.PrettyPrinter+import Util.Prelude+import Util.PrettyPrint++data Value =+ VInt Integer+ | VBool Bool+ | VTuple [Value]+ -- TODO: the following one may be completely incorrect, needs + -- testing+ | VDot [Value]+ | VEvent Name [Value]+ | VDataType Name [Value]+ | VList [Value]+ | VSet ValueSet+ | VFunction ([Value] -> EvaluationMonad Value)+ | VProc Proc++instance Eq Value where+ VInt i1 == VInt i2 = i1 == i2+ VBool b1 == VBool b2 = b1 == b2+ VTuple vs1 == VTuple vs2 = vs1 == vs2+ VDot vs1 == VDot vs2 = vs1 == vs2+ VEvent n1 vs1 == VEvent n2 vs2 = n1 == n2 && vs1 == vs2+ VDataType n1 vs1 == VDataType n2 vs2 = n1 == n2 && vs1 == vs2+ VList vs1 == VList vs2 = vs1 == vs2+ VSet s1 == VSet s2 = s1 == s2+ + v1 == v2 = throwError $ typeCheckerFailureMessage "Cannot compare for eq"+ +instance Ord Value where+ compare (VInt i1) (VInt i2) = compare i1 i2+ compare (VTuple vs1) (VTuple vs2) = compare vs1 vs2+ compare (VList vs1) (VList vs2) = compare vs1 vs2+ compare (VSet s1) (VSet s2) = compare s1 s2+ + -- These are only ever used for the internal set implementation+ compare (VDot vs1) (VDot vs2) = compare vs1 vs2+ compare (VEvent n vs1) (VEvent n' vs2) =+ compare n n' `thenCmp` compare vs1 vs2+ compare (VDataType n vs1) (VDataType n' vs2) = + compare n n' `thenCmp` compare vs1 vs2+ + compare v1 v2 = throwError $ typeCheckerFailureMessage "Cannot order"++instance PrettyPrintable Value where+ prettyPrint (VInt i) = integer i+ prettyPrint (VBool True) = text "true"+ prettyPrint (VBool False) = text "false"+ prettyPrint (VTuple vs) = parens (list $ map prettyPrint vs)+ prettyPrint (VDot vs) = dotSep (map prettyPrint vs)+ prettyPrint (VEvent n vs) = dotSep (prettyPrint n:map prettyPrint vs)+ prettyPrint (VDataType n vs) = dotSep (prettyPrint n:map prettyPrint vs)+ prettyPrint (VList vs) = angles (list $ map prettyPrint vs)+ prettyPrint (VSet s) = prettyPrint s+ prettyPrint (VFunction _) = text "<function>"+ prettyPrint (VProc p) = prettyPrint p++instance Show Value where+ show v = show (prettyPrint v)++-- TODO take acount of let within statements+procId :: Name -> [[Value]] -> String+procId n vss = show $+ prettyPrint n <> hcat (map (parens . list) (map (map prettyPrint) vss))++valueEventToEvent :: Value -> Event+valueEventToEvent (ev@(VEvent _ _)) = UserEvent (show (prettyPrint ev))
+ src/CSPM/Evaluator/Values.hs-boot view
@@ -0,0 +1,9 @@+module CSPM.Evaluator.Values where++import Util.PrettyPrint++data Value+instance Eq Value+instance Ord Value+instance PrettyPrintable Value+instance Show Value
+ src/CSPM/Parser.hs view
@@ -0,0 +1,30 @@+module CSPM.Parser (+ parseFile, parseInteractiveStmt, parseExpression, parseStringAsFile,+ + ParseMonad, runParser,+) +where++import CSPM.DataStructures.Syntax+import CSPM.Parser.Monad+import CSPM.Parser.Parser+import Util.Annotated++-- External Interface+parseInteractiveStmt :: String -> ParseMonad PInteractiveStmt+parseInteractiveStmt str =+ pushFileContents "<interactive>" str >> parseInteractiveStmt_++parseExpression :: String -> ParseMonad PExp+parseExpression str = + pushFileContents "<interactive>" str >> parseExpression_++parseFile :: String -> ParseMonad [PModule]+parseFile fname = do+ decls <- pushFile fname parseFile_+ return [An Unknown dummyAnnotation (GlobalModule decls)]++parseStringAsFile :: String -> ParseMonad [PModule]+parseStringAsFile str = do+ decls <- pushFileContents "<interactive>" str >> parseFile_+ return [An Unknown dummyAnnotation (GlobalModule decls)]
+ src/CSPM/Parser/Exceptions.hs view
@@ -0,0 +1,46 @@+module CSPM.Parser.Exceptions (+ invalidPatternErrorMessage,+ invalidDeclarationErrorMessage,+ invalidExpressionErrorMessage,+ invalidIncludeErrorMessage,+ lexicalErrorMessage,+ parseErrorMessage,+ fileAccessErrorMessage,+ + throwSourceError+)+where++import CSPM.DataStructures.Syntax+import CSPM.DataStructures.Tokens+import CSPM.PrettyPrinter+import Util.Annotated+import Util.Exception+import Util.PrettyPrint++invalidPatternErrorMessage :: PExp -> ErrorMessage+invalidPatternErrorMessage e = mkErrorMessage (loc e) $+ hang (prettyPrint e) tabWidth (text "is not a valid pattern")+ +invalidDeclarationErrorMessage :: PDecl -> ErrorMessage+invalidDeclarationErrorMessage d = mkErrorMessage (loc d) $+ hang (prettyPrint d) tabWidth (text "is not a valid declaration")++invalidExpressionErrorMessage :: PExp -> ErrorMessage+invalidExpressionErrorMessage e = mkErrorMessage (loc e) $+ hang (prettyPrint e) tabWidth (text "is not a valid expression")++invalidIncludeErrorMessage :: SrcSpan -> ErrorMessage+invalidIncludeErrorMessage srcspan = + mkErrorMessage srcspan (text "Invalid include directive")++lexicalErrorMessage :: SrcSpan -> ErrorMessage+lexicalErrorMessage srcspan = mkErrorMessage srcspan (text "Lexical error")++parseErrorMessage :: LToken -> ErrorMessage+parseErrorMessage tok = mkErrorMessage (locatedLoc tok) $+ text "Unexpected token" <+> prettyPrint tok++fileAccessErrorMessage :: FilePath -> ErrorMessage+fileAccessErrorMessage fp = mkErrorMessage Unknown $+ text "Could not open the file" <+> quotes (text fp)
+ src/CSPM/Parser/Lexer.x view
@@ -0,0 +1,329 @@+{+{-# LANGUAGE DoAndIfThenElse #-}+{-# OPTIONS_GHC -fno-warn-lazy-unlifted-bindings #-}+module CSPM.Parser.Lexer where++import Data.List++import Control.Monad.Trans+import CSPM.DataStructures.Tokens+import CSPM.Parser.Exceptions+import CSPM.Parser.Monad+import Util.Annotated+import Util.Exception++}++$digit = [0-9]+$whitechar = [\ \n\r\f\v\t]+$white_no_nl = $whitechar # \n+$not_white = [^$whitechar]+$alpha = [A-Za-z]+$upperalpha = [A-Z]+$alphaspace = [ $alpha]+$alphanum = [A-Za-z0-9_]+$propertychars = [A-Za-z0-9\ _\-]+$prime = '+$notid = [[^0-9a-zA-Z_]\(\[$whitechar]++@property = $propertychars+(\[$upperalpha+\])?++@white_no_nl = ((\-\-.*)|$white_no_nl)++@nl = ((\-\-.*\n)|$whitechar)*+@comment = (\-\-.*) +@nltok = (@comment|())\n@nl++-- *************************************************************************+-- TODO: get correct lambda function syntax++-- Note that we allow newlines to preceed all tokens, except for those that+-- may possibly be at the start of a new expression. Therefore, for example,+-- as a + may never be at the start of an expression we allow newlines before+-- them. However, - and < may either appear in the middle of an expression or+-- the start of one and thus we do not allow newlines to come between them.+tokens :-+ <0>@nl:\[ { begin sem_prop }+ <sem_prop>"tau priority" { tok TTauPriority }+ <sem_prop>"tau priority over" { tok TTauPriority }+ <sem_prop>"deadlock free" { tok TDeadlockFree }+ <sem_prop>"deadlock-free" { tok TDeadlockFree }+ <sem_prop>"livelock free" { tok TLivelockFree }+ <sem_prop>"livelock-free" { tok TLivelockFree }+ <sem_prop>"divergence free" { tok TDivergenceFree }+ <sem_prop>"divergence-free" { tok TDivergenceFree }+ <sem_prop>"deterministic" { tok TDeterministic }+ <sem_prop>@nl"[T]" { tok (TModel Traces) }+ <sem_prop>@nl"[F]" { tok (TModel Failures) }+ <sem_prop>@nl"[FD]" { tok (TModel FailuresDivergences) }+ <sem_prop>@nl"[V]" { tok (TModel Revivals) }+ <sem_prop>@nl"[VD]" { tok (TModel RevivalsDivergences) }+ <sem_prop>@nl"[R]" { tok (TModel Refusals) }+ <sem_prop>@nl"[RD]" { tok (TModel RefusalsDivergences) }+ <sem_prop>"]:" { begin 0 }+ <sem_prop>"]" { begin 0 }++ <0>@nl"[T="@nl { tok (TRefines Traces) }+ <0>@nl"[F="@nl { tok (TRefines Failures) }+ <0>@nl"[FD="@nl { tok (TRefines FailuresDivergences) }+ <0>@nl"[V="@nl { tok (TRefines Revivals) }+ <0>@nl"[VD="@nl { tok (TRefines RevivalsDivergences) }+ <0>@nl"[R="@nl { tok (TRefines Refusals) }+ <0>@nl"[RD="@nl { tok (TRefines RefusalsDivergences) }++ <soak>((\-\-.*\n)|$whitechar)+ { skip }+ <soak>""/$not_white { begin 0 }++ <0>@white_no_nl { skip }++ <0>@nl"{-" { nestedComment }++ <0>@nl"false"/$notid { tok TFalse }+ <0>@nl"true"/$notid { tok TTrue }++ <0>"include"$white_no_nl+.*\n { switchInput }++ -- Process Syntax+ <0>@nl"[]"@nl { tok TExtChoice }+ <0>@nl"|~|"@nl { tok TIntChoice }+ <0>@nl"|||"@nl { tok TInterleave }+ <0>@nl"/\"@nl { tok TInterrupt }+ <0>@nl"->"@nl { tok TPrefix }+ <0>@nl"[>"@nl { tok TSlidingChoice }+ <0>@nl"|>"@nl { tok TRException }+ <0>@nl"||"@nl { tok TParallel }+ <0>@nl";"@nl { tok TSemiColon }+ <0>@nl"&"@nl { tok TGuard }++ -- Boolean Operators+ <0>@nl"and"/$notid { soakTok TAnd }+ <0>@nl"or"/$notid { soakTok TOr }+ <0>@nl"not"/$notid { soakTok TNot }+ <0>@nl"=="@nl { tok TEq }+ <0>@nl"!="@nl { tok TNotEq }+ <0>@nl"<="@nl { tok TLtEq }+ <0>@nl">="@nl { tok TGtEq }+ -- We need a empty sequence token since the parser will not execute the+ <0>"<"$whitechar*">" { tok TEmptySeq }+ <0>"<"@nl { tok TLt }+ <0>@nl">" { gt }++ -- Parenthesis+ <0>"("@nl { openseq TLParen }+ <0>@nl")" { closeseq TRParen }+ <0>"{|"@nl { openseq TLPipeBrace }+ <0>@nl"|}" { closeseq TRPipeBrace }+ <0>"{"@nl { openseq TLBrace }+ <0>@nl"}" { closeseq TRBrace }+ <0>@nl"[["@nl { openseq TLDoubleSqBracket }+ <0>@nl"]]" { closeseq TRDoubleSqBracket }+ <0>@nl"[|"@nl { openseq TLPipeSqBracket }+ <0>@nl"|]"@nl { closeseq TRPipeSqBracket }+ <0>@nl"["@nl { tok TLSqBracket }+ <0>@nl"]"@nl { tok TRSqBracket }++ -- General Symbols+ <0>@nl"|"@nl { tok TPipe }+ <0>@nl","@nl { tok TComma }+ <0>@nl".."@nl { tok TDoubleDot }+ <0>@nl"."@nl { tok TDot }+ <0>@nl"?"@nl { tok TQuestionMark }+ <0>@nl"!"@nl { tok TExclamationMark }+ <0>@nl"$"@nl { tok TDollar }+ <0>@nl"<-"@nl { tok TDrawnFrom }+ <0>@nl"<->"@nl { tok TTie }+ <0>@nl":"@nl { tok TColon }++ <0>@nl"@@"@nl { tok TDoubleAt }++ -- Program Structure+ <0>@nl"="@nl { tok TDefineEqual }+ <0>@nl"if"/$notid { soakTok TIf }+ <0>@nl"then"/$notid { soakTok TThen }+ <0>@nl"else"/$notid { soakTok TElse }+ <0>@nl"let"/$notid { soakTok TLet }+ <0>@nl"within"/$notid { soakTok TWithin }+ <0>"channel"/$notid { soakTok TChannel }+ <0>"assert"/$notid { soakTok TAssert }+ <0>"datatype"/$notid { soakTok TDataType }+ <0>"external"/$notid { soakTok TExternal }+ <0>"transparent"/$notid { soakTok TTransparent }+ <0>"nametype"/$notid { soakTok TNameType }++ <0>@nl"\"@nl { tok TBackSlash }+ <0>@nl"@"@nl { tok TLambdaDot }++ -- Arithmetic+ <0>@nl"+"@nl { tok TPlus }+ <0>"-"@nl { tok TMinus }+ <0>@nl"*"@nl { tok TTimes }+ <0>@nl"/"@nl { tok TDivide }+ <0>@nl"%"@nl { tok TMod }++ -- Sequence Symbols+ <0>@nl"^"@nl { tok TConcat }+ <0>"#"@nl { tok THash }++ -- 'Wildcards'+ <0>$alpha+$alphanum*$prime* { stok (\s -> TIdent s) }+ <0>@nl$digit+ { stok (\ s -> TInteger (read s)) }++ -- Must be after names+ <0>@nl"_"@nl { tok TWildCard }++ <0>@nltok { tok TNewLine }++{+wschars :: String+wschars = " \t\r\n"++strip :: String -> String+strip = lstrip . rstrip++-- | Same as 'strip', but applies only to the left side of the string.+lstrip :: String -> String+lstrip s = case s of+ [] -> []+ (x:xs) -> if elem x wschars then lstrip xs else s++-- | Same as 'strip', but applies only to the right side of the string.+rstrip :: String -> String+rstrip = reverse . lstrip . reverse++openseq token inp len = + do+ --cs <- getSequenceStack+ --setSequenceStack (0:cs)+ tok token inp len+closeseq token inp len = + do+ --(c:cs) <- getSequenceStack+ --setSequenceStack cs+ tok token inp len++gt :: AlexInput -> Int -> ParseMonad LToken+gt inp len = do+ (c:cs) <- getSequenceStack+ tok (if c > 0 then TCloseSeq else TGt) inp len++soakTok :: Token -> AlexInput -> Int -> ParseMonad LToken+soakTok t inp len = setCurrentStartCode soak >> tok t inp len++-- TODO: don't count whitespace in the tokens+tok :: Token -> AlexInput -> Int -> ParseMonad LToken+tok t (ParserState { fileStack = fps:_ }) len =+ return $ L (SrcSpanOneLine f lineno colno (colno+len)) t+ where+ (FileParserState { tokenizerPos = FilePosition offset lineno colno, + fileName = f }) = fps++stok :: (String -> Token) -> AlexInput -> Int -> ParseMonad LToken+stok f (st @ ParserState { fileStack = stk }) len = do+ tok (f (filter (\ c -> c /= '\n') (takeChars len stk))) st len++skip input len = getNextToken++takeChars :: Int -> [FileParserState] -> String+takeChars 0 _ = ""+takeChars len (FileParserState {input = [] }:stk) = takeChars len stk+takeChars len (fps@(FileParserState {input = (c:cs) }):stk) = + c:(takeChars (len-1) (fps {input = cs}:stk))++nestedComment :: AlexInput -> Int -> ParseMonad LToken+nestedComment _ _ = do+ st <- getParserState+ go 1 st+ where + err :: ParseMonad a+ err = do+ FileParserState { + fileName = fname, + tokenizerPos = pos, + currentStartCode = sc } <- getTopFileParserState+ throwSourceError [lexicalErrorMessage (filePositionToSrcLoc fname pos)]+ go :: Int -> AlexInput -> ParseMonad LToken+ go 0 st = do setParserState st; getNextToken+ go n st = do+ case alexGetChar st of+ Nothing -> err+ Just (c,st) -> do+ case c of+ '-' -> do+ case alexGetChar st of+ Nothing -> err+ Just ('\125',st) -> go (n-1) st+ Just (c,st) -> go n st+ '\123' -> do+ case alexGetChar st of+ Nothing -> err+ Just ('-',st) -> go (n+1) st+ Just (c,st) -> go n st+ c -> go n st++switchInput :: AlexInput -> Int -> ParseMonad LToken+switchInput st len = do+ FileParserState { + fileName = fname, + tokenizerPos = pos, + currentStartCode = sc } <- getTopFileParserState+ let+ str = takeChars len (fileStack st)+ quotedFname = strip (drop (length "include") str)+ + hasStartQuote ('\"':cs) = True+ hasStartQuote _ = False++ hasEndQuote [] = False+ hasEndQuote ('\"':cs) = True+ hasEndQuote (c:cs) = hasEndQuote cs+ + file = calcFile (tail quotedFname)+ calcFile ('\"':cs) = ""+ calcFile (c:cs) = c:calcFile cs++ if not (hasStartQuote quotedFname) || not (hasEndQuote (tail quotedFname)) then+ throwSourceError [invalidIncludeErrorMessage (filePositionToSrcLoc fname pos)]+ else pushFile file getNextToken++type AlexInput = ParserState++begin :: Int -> AlexInput -> Int -> ParseMonad LToken+begin sc' st len = setCurrentStartCode sc' >> getNextToken++alexInputPrevChar :: AlexInput -> Char+alexInputPrevChar (ParserState { fileStack = fps:_ })= previousChar fps++alexGetChar :: AlexInput -> Maybe (Char,AlexInput)+alexGetChar (ParserState { fileStack = [] }) = Nothing+alexGetChar (st @ (ParserState { fileStack = fps:fpss })) = gc fps+ where+ gc (fps @ (FileParserState { input = [] })) = + alexGetChar (st { fileStack = fpss })+ gc (fps @ (FileParserState { tokenizerPos = p, input = (c:s) })) =+ p' `seq` Just (c, st')+ where+ p' = movePos p c+ fps' = fps { input = s, tokenizerPos = p', previousChar = c }+ st' = st { fileStack = fps':fpss }++getNextToken :: ParseMonad LToken+getNextToken = do+ FileParserState { + fileName = fname, + tokenizerPos = pos, + currentStartCode = sc } <- getTopFileParserState+ st <- getParserState+ case alexScan st sc of+ AlexEOF -> return $ L Unknown TEOF+ AlexError st' -> + throwSourceError [lexicalErrorMessage (filePositionToSrcLoc fname pos)]+ AlexSkip st' len -> do+ setParserState st'+ getNextToken+ AlexToken st' len action -> do+ setParserState st'+ action st len++getNextTokenWrapper :: (LToken -> ParseMonad a) -> ParseMonad a+getNextTokenWrapper cont = getNextToken >>= cont++}
+ src/CSPM/Parser/Monad.hs view
@@ -0,0 +1,143 @@+module CSPM.Parser.Monad (+ ParseMonad, ParserState(..), + FileParserState(..), movePos,+ setParserState, getParserState, + FilePosition(..), filePositionToSrcLoc,+ modifyTopFileParserState, getTopFileParserState,+ + runParser, pushFile, pushFileContents,+ getTokenizerPos, getFileName, getInput, + getPreviousChar, getCurrentStartCode, setCurrentStartCode, + getSequenceStack, setSequenceStack+)+where++import Control.Monad.State+import Data.Typeable+import Prelude+import System.FilePath+import System.IO+import System.IO.Error++import CSPM.DataStructures.Tokens+import CSPM.Parser.Exceptions+import Util.Annotated++-- *************************************************************************+-- Parser Support Types+-- *************************************************************************++-- TAKEN FROM ALEX+-- `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 FilePosition = FilePosition !Int !Int !Int+ deriving (Eq,Show)++startPos :: FilePosition+startPos = FilePosition 0 1 1++filePositionToSrcLoc :: String -> FilePosition -> SrcSpan+filePositionToSrcLoc filePath (FilePosition _ line col) = + SrcSpanPoint filePath line col+ +movePos :: FilePosition -> Char -> FilePosition+-- Don't treat tabs any differently (editors don't)+--movePos (FilePosition a l c) '\t' = +-- FilePosition (a+1) l (((c+7) `div` 8)*8+1)+movePos (FilePosition a l c) '\n' = FilePosition (a+1) (l+1) 1+movePos (FilePosition a l c) _ = FilePosition (a+1) l (c+1)++-- *************************************************************************+-- Parser Monad+-- *************************************************************************+data ParserState = ParserState {+ rootDir :: !String,+ fileStack :: ![FileParserState]+ }+ deriving Show++data FileParserState = FileParserState {+ tokenizerPos :: !FilePosition,+ fileName :: !String,+ input :: String,+ previousChar :: !Char,+ currentStartCode :: !Int, -- current startcode+ + sequenceStack :: ![Int]+ } + deriving Show++-- The parser monad takes a sequence of parser states, representing the+-- current stack of include files+type ParseMonad = StateT ParserState IO++runParser :: ParseMonad a -> String -> IO a+runParser prog dirname =+ runStateT prog (ParserState dirname [])+ >>= return . fst++getTopFileParserState :: ParseMonad FileParserState+getTopFileParserState = gets (head . fileStack)++getParserState :: ParseMonad ParserState+getParserState = gets id++setParserState :: ParserState -> ParseMonad ()+setParserState st = modify (\ _ -> st)++modifyTopFileParserState :: (FileParserState -> FileParserState) -> ParseMonad ()+modifyTopFileParserState stf =+ modify (\ st -> let fs:fss = fileStack st in + st { fileStack = (stf fs):fss })++pushFile :: String -> ParseMonad a -> ParseMonad a+pushFile fname prog =+ do+ dirname <- gets rootDir + let filename = combine dirname fname+ str <- liftIO $ catch (readFile filename) (\err ->+ throwSourceError [fileAccessErrorMessage filename])+ pushFileContents filename str+ x <- prog+ return x++pushFileContents :: String -> String -> ParseMonad ()+pushFileContents filename input = + modify (\ st -> let+ fs = FileParserState startPos filename input '\n' 0 [0]+ in+ st { fileStack = fs:(fileStack st) })++setFileParserState :: FileParserState -> ParseMonad ()+setFileParserState fs = + modify (\ st -> st { fileStack = fs:(tail (fileStack st)) } )++getTokenizerPos :: ParseMonad FilePosition+getTokenizerPos = getTopFileParserState >>= (return . tokenizerPos)++getFileName :: ParseMonad String+getFileName = getTopFileParserState >>= (return . fileName)++getInput :: ParseMonad String+getInput = getTopFileParserState >>= (return . input)++getPreviousChar :: ParseMonad Char+getPreviousChar = getTopFileParserState >>= (return . previousChar)++getCurrentStartCode :: ParseMonad Int+getCurrentStartCode = getTopFileParserState >>= (return . currentStartCode)++getSequenceStack :: ParseMonad [Int]+getSequenceStack = getTopFileParserState >>= (return . sequenceStack)++setCurrentStartCode :: Int -> ParseMonad ()+setCurrentStartCode sc = + modifyTopFileParserState (\ st -> st { currentStartCode = sc })++setSequenceStack :: [Int] -> ParseMonad ()+setSequenceStack st = + modifyTopFileParserState (\ s -> s { sequenceStack = st })
+ src/CSPM/Parser/Parser.hs view
@@ -0,0 +1,2383 @@+{-# OPTIONS_GHC -w #-}+{-# OPTIONS -fglasgow-exts -cpp #-}+module CSPM.Parser.Parser (+ parseFile_, parseInteractiveStmt_, parseExpression_+) +where++import Data.Char++import CSPM.DataStructures.Names+import CSPM.DataStructures.Syntax+import CSPM.DataStructures.Tokens+import CSPM.DataStructures.Types hiding (TDot)+import CSPM.Parser.Exceptions+import CSPM.Parser.Lexer+import CSPM.Parser.Monad+import Util.Annotated+import qualified Data.Array as Happy_Data_Array+import qualified GHC.Exts as Happy_GHC_Exts++-- parser produced by Happy Version 1.18.6++newtype HappyAbsSyn t8 t9 t28 t29 = HappyAbsSyn HappyAny+#if __GLASGOW_HASKELL__ >= 607+type HappyAny = Happy_GHC_Exts.Any+#else+type HappyAny = forall a . a+#endif+happyIn6 :: ([PDecl]) -> (HappyAbsSyn t8 t9 t28 t29)+happyIn6 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn6 #-}+happyOut6 :: (HappyAbsSyn t8 t9 t28 t29) -> ([PDecl])+happyOut6 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut6 #-}+happyIn7 :: (PInteractiveStmt) -> (HappyAbsSyn t8 t9 t28 t29)+happyIn7 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn7 #-}+happyOut7 :: (HappyAbsSyn t8 t9 t28 t29) -> (PInteractiveStmt)+happyOut7 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut7 #-}+happyIn8 :: t8 -> (HappyAbsSyn t8 t9 t28 t29)+happyIn8 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn8 #-}+happyOut8 :: (HappyAbsSyn t8 t9 t28 t29) -> t8+happyOut8 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut8 #-}+happyIn9 :: t9 -> (HappyAbsSyn t8 t9 t28 t29)+happyIn9 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn9 #-}+happyOut9 :: (HappyAbsSyn t8 t9 t28 t29) -> t9+happyOut9 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut9 #-}+happyIn10 :: ([PDecl]) -> (HappyAbsSyn t8 t9 t28 t29)+happyIn10 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn10 #-}+happyOut10 :: (HappyAbsSyn t8 t9 t28 t29) -> ([PDecl])+happyOut10 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut10 #-}+happyIn11 :: ([PDecl]) -> (HappyAbsSyn t8 t9 t28 t29)+happyIn11 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn11 #-}+happyOut11 :: (HappyAbsSyn t8 t9 t28 t29) -> ([PDecl])+happyOut11 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut11 #-}+happyIn12 :: ([PDecl]) -> (HappyAbsSyn t8 t9 t28 t29)+happyIn12 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn12 #-}+happyOut12 :: (HappyAbsSyn t8 t9 t28 t29) -> ([PDecl])+happyOut12 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut12 #-}+happyIn13 :: (Maybe PDecl) -> (HappyAbsSyn t8 t9 t28 t29)+happyIn13 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn13 #-}+happyOut13 :: (HappyAbsSyn t8 t9 t28 t29) -> (Maybe PDecl)+happyOut13 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut13 #-}+happyIn14 :: (PDecl) -> (HappyAbsSyn t8 t9 t28 t29)+happyIn14 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn14 #-}+happyOut14 :: (HappyAbsSyn t8 t9 t28 t29) -> (PDecl)+happyOut14 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut14 #-}+happyIn15 :: (PDecl) -> (HappyAbsSyn t8 t9 t28 t29)+happyIn15 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn15 #-}+happyOut15 :: (HappyAbsSyn t8 t9 t28 t29) -> (PDecl)+happyOut15 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut15 #-}+happyIn16 :: (Assertion) -> (HappyAbsSyn t8 t9 t28 t29)+happyIn16 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn16 #-}+happyOut16 :: (HappyAbsSyn t8 t9 t28 t29) -> (Assertion)+happyOut16 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut16 #-}+happyIn17 :: (SemanticProperty) -> (HappyAbsSyn t8 t9 t28 t29)+happyIn17 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn17 #-}+happyOut17 :: (HappyAbsSyn t8 t9 t28 t29) -> (SemanticProperty)+happyOut17 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut17 #-}+happyIn18 :: (ModelOption) -> (HappyAbsSyn t8 t9 t28 t29)+happyIn18 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn18 #-}+happyOut18 :: (HappyAbsSyn t8 t9 t28 t29) -> (ModelOption)+happyOut18 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut18 #-}+happyIn19 :: (PDataTypeClause) -> (HappyAbsSyn t8 t9 t28 t29)+happyIn19 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn19 #-}+happyOut19 :: (HappyAbsSyn t8 t9 t28 t29) -> (PDataTypeClause)+happyOut19 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut19 #-}+happyIn20 :: ([PDataTypeClause]) -> (HappyAbsSyn t8 t9 t28 t29)+happyIn20 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn20 #-}+happyOut20 :: (HappyAbsSyn t8 t9 t28 t29) -> ([PDataTypeClause])+happyOut20 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut20 #-}+happyIn21 :: ([PDataTypeClause]) -> (HappyAbsSyn t8 t9 t28 t29)+happyIn21 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn21 #-}+happyOut21 :: (HappyAbsSyn t8 t9 t28 t29) -> ([PDataTypeClause])+happyOut21 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut21 #-}+happyIn22 :: (Located Name) -> (HappyAbsSyn t8 t9 t28 t29)+happyIn22 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn22 #-}+happyOut22 :: (HappyAbsSyn t8 t9 t28 t29) -> (Located Name)+happyOut22 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut22 #-}+happyIn23 :: ([Located Name]) -> (HappyAbsSyn t8 t9 t28 t29)+happyIn23 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn23 #-}+happyOut23 :: (HappyAbsSyn t8 t9 t28 t29) -> ([Located Name])+happyOut23 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut23 #-}+happyIn24 :: ([Located Name]) -> (HappyAbsSyn t8 t9 t28 t29)+happyIn24 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn24 #-}+happyOut24 :: (HappyAbsSyn t8 t9 t28 t29) -> ([Located Name])+happyOut24 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut24 #-}+happyIn25 :: (Located QualifiedName) -> (HappyAbsSyn t8 t9 t28 t29)+happyIn25 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn25 #-}+happyOut25 :: (HappyAbsSyn t8 t9 t28 t29) -> (Located QualifiedName)+happyOut25 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut25 #-}+happyIn26 :: (Located Literal) -> (HappyAbsSyn t8 t9 t28 t29)+happyIn26 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn26 #-}+happyOut26 :: (HappyAbsSyn t8 t9 t28 t29) -> (Located Literal)+happyOut26 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut26 #-}+happyIn27 :: (PPat) -> (HappyAbsSyn t8 t9 t28 t29)+happyIn27 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn27 #-}+happyOut27 :: (HappyAbsSyn t8 t9 t28 t29) -> (PPat)+happyOut27 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut27 #-}+happyIn28 :: t28 -> (HappyAbsSyn t8 t9 t28 t29)+happyIn28 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn28 #-}+happyOut28 :: (HappyAbsSyn t8 t9 t28 t29) -> t28+happyOut28 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut28 #-}+happyIn29 :: t29 -> (HappyAbsSyn t8 t9 t28 t29)+happyIn29 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn29 #-}+happyOut29 :: (HappyAbsSyn t8 t9 t28 t29) -> t29+happyOut29 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut29 #-}+happyIn30 :: (PExp) -> (HappyAbsSyn t8 t9 t28 t29)+happyIn30 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn30 #-}+happyOut30 :: (HappyAbsSyn t8 t9 t28 t29) -> (PExp)+happyOut30 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut30 #-}+happyIn31 :: (PExp) -> (HappyAbsSyn t8 t9 t28 t29)+happyIn31 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn31 #-}+happyOut31 :: (HappyAbsSyn t8 t9 t28 t29) -> (PExp)+happyOut31 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut31 #-}+happyIn32 :: (PExp) -> (HappyAbsSyn t8 t9 t28 t29)+happyIn32 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn32 #-}+happyOut32 :: (HappyAbsSyn t8 t9 t28 t29) -> (PExp)+happyOut32 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut32 #-}+happyIn33 :: (PField) -> (HappyAbsSyn t8 t9 t28 t29)+happyIn33 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn33 #-}+happyOut33 :: (HappyAbsSyn t8 t9 t28 t29) -> (PField)+happyOut33 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut33 #-}+happyIn34 :: ((PExp, PExp)) -> (HappyAbsSyn t8 t9 t28 t29)+happyIn34 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn34 #-}+happyOut34 :: (HappyAbsSyn t8 t9 t28 t29) -> ((PExp, PExp))+happyOut34 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut34 #-}+happyIn35 :: ([(PExp, PExp)]) -> (HappyAbsSyn t8 t9 t28 t29)+happyIn35 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn35 #-}+happyOut35 :: (HappyAbsSyn t8 t9 t28 t29) -> ([(PExp, PExp)])+happyOut35 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut35 #-}+happyIn36 :: ([(PExp, PExp)]) -> (HappyAbsSyn t8 t9 t28 t29)+happyIn36 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn36 #-}+happyOut36 :: (HappyAbsSyn t8 t9 t28 t29) -> ([(PExp, PExp)])+happyOut36 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut36 #-}+happyIn37 :: ((PExp, PExp)) -> (HappyAbsSyn t8 t9 t28 t29)+happyIn37 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn37 #-}+happyOut37 :: (HappyAbsSyn t8 t9 t28 t29) -> ((PExp, PExp))+happyOut37 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut37 #-}+happyIn38 :: ([(PExp, PExp)]) -> (HappyAbsSyn t8 t9 t28 t29)+happyIn38 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn38 #-}+happyOut38 :: (HappyAbsSyn t8 t9 t28 t29) -> ([(PExp, PExp)])+happyOut38 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut38 #-}+happyIn39 :: ([(PExp, PExp)]) -> (HappyAbsSyn t8 t9 t28 t29)+happyIn39 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn39 #-}+happyOut39 :: (HappyAbsSyn t8 t9 t28 t29) -> ([(PExp, PExp)])+happyOut39 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut39 #-}+happyIn40 :: ([PField]) -> (HappyAbsSyn t8 t9 t28 t29)+happyIn40 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn40 #-}+happyOut40 :: (HappyAbsSyn t8 t9 t28 t29) -> ([PField])+happyOut40 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut40 #-}+happyIn41 :: ([PField]) -> (HappyAbsSyn t8 t9 t28 t29)+happyIn41 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn41 #-}+happyOut41 :: (HappyAbsSyn t8 t9 t28 t29) -> ([PField])+happyOut41 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut41 #-}+happyIn42 :: ([PExp]) -> (HappyAbsSyn t8 t9 t28 t29)+happyIn42 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn42 #-}+happyOut42 :: (HappyAbsSyn t8 t9 t28 t29) -> ([PExp])+happyOut42 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut42 #-}+happyIn43 :: ([PExp]) -> (HappyAbsSyn t8 t9 t28 t29)+happyIn43 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn43 #-}+happyOut43 :: (HappyAbsSyn t8 t9 t28 t29) -> ([PExp])+happyOut43 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut43 #-}+happyIn44 :: ([PExp]) -> (HappyAbsSyn t8 t9 t28 t29)+happyIn44 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn44 #-}+happyOut44 :: (HappyAbsSyn t8 t9 t28 t29) -> ([PExp])+happyOut44 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut44 #-}+happyIn45 :: ([PExp]) -> (HappyAbsSyn t8 t9 t28 t29)+happyIn45 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn45 #-}+happyOut45 :: (HappyAbsSyn t8 t9 t28 t29) -> ([PExp])+happyOut45 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut45 #-}+happyIn46 :: ([PStmt]) -> (HappyAbsSyn t8 t9 t28 t29)+happyIn46 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn46 #-}+happyOut46 :: (HappyAbsSyn t8 t9 t28 t29) -> ([PStmt])+happyOut46 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut46 #-}+happyIn47 :: (PStmt) -> (HappyAbsSyn t8 t9 t28 t29)+happyIn47 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn47 #-}+happyOut47 :: (HappyAbsSyn t8 t9 t28 t29) -> (PStmt)+happyOut47 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut47 #-}+happyIn48 :: ([PStmt]) -> (HappyAbsSyn t8 t9 t28 t29)+happyIn48 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn48 #-}+happyOut48 :: (HappyAbsSyn t8 t9 t28 t29) -> ([PStmt])+happyOut48 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut48 #-}+happyIn49 :: ([PStmt]) -> (HappyAbsSyn t8 t9 t28 t29)+happyIn49 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn49 #-}+happyOut49 :: (HappyAbsSyn t8 t9 t28 t29) -> ([PStmt])+happyOut49 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut49 #-}+happyInTok :: (LToken) -> (HappyAbsSyn t8 t9 t28 t29)+happyInTok x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyInTok #-}+happyOutTok :: (HappyAbsSyn t8 t9 t28 t29) -> (LToken)+happyOutTok x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOutTok #-}+++happyActOffsets :: HappyAddr+happyActOffsets = HappyA# "\x00\x00\x4c\x01\x70\x01\x00\x00\x4d\x00\x00\x00\x00\x00\x70\x01\x64\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x70\x01\x96\x00\x70\x01\x70\x01\x00\x00\x00\x00\x70\x01\x70\x01\x70\x01\x70\x01\x70\x01\x70\x01\x70\x01\x70\x01\x70\x01\x70\x01\x70\x01\xcf\x00\x00\x00\x01\x06\x96\x00\x70\x01\xcf\x00\x00\x00\xe9\xff\x05\x01\x17\x01\x00\x00\x00\x00\xfe\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x70\x01\x00\x00\xc6\x00\xe5\x00\x70\x01\x70\x01\x70\x01\x70\x01\x70\x01\x70\x01\x70\x01\x70\x01\x70\x01\x70\x01\x70\x01\x70\x01\x70\x01\x70\x01\x70\x01\x70\x01\x70\x01\x70\x01\x70\x01\x70\x01\x70\x01\x70\x01\x70\x01\x70\x01\x70\x01\x70\x01\x70\x01\x70\x01\x70\x01\x70\x01\x70\x01\x70\x01\x2a\x00\xde\x02\x00\x00\xf4\x00\xf7\x00\xe9\x00\xe3\x00\xe1\x00\xea\x00\x00\x00\xa8\x00\xf1\x00\x68\x05\x01\x06\xf7\xff\xed\x00\x35\x05\xf1\xff\x31\x02\xb7\x00\x04\x00\x9d\x01\x9c\x08\xcd\x00\x01\x06\xb5\x01\xee\x04\xa7\x04\xf8\xff\x00\x00\x00\x00\x00\x00\x00\x00\x70\x01\x00\x00\x03\x01\x70\x01\x70\x01\x70\x01\x00\x00\x70\x01\x00\x00\x70\x01\x00\x00\xba\x00\x70\x01\x70\x01\x00\x00\x70\x01\x70\x01\x70\x01\x70\x01\x70\x01\x70\x01\x70\x01\x70\x01\x97\x00\x70\x01\x70\x01\x2a\x08\x2a\x08\xf8\x07\xc6\x07\x2a\x08\xfd\x06\x62\x07\x94\x07\x60\x04\xd3\x00\x97\x02\xca\x00\x00\x00\xbb\x00\xc3\x00\x8e\x00\xeb\xff\x04\x00\x04\x00\x04\x00\x9d\x01\x9d\x01\x8b\x08\x8b\x08\x8b\x08\x8b\x08\x8b\x08\x8b\x08\x69\x08\x7a\x08\x33\x06\xce\x05\x30\x07\xcb\x06\x98\x06\x53\x08\x00\x00\x70\x01\x00\x00\xb4\x00\x00\x00\x00\x00\x00\x00\xb2\x00\x00\x00\xa9\x00\x9e\x00\x70\x01\x01\x00\x00\x00\x70\x01\x87\x00\x00\x00\x00\x00\x00\x00\x00\x00\x70\x01\x81\x00\x00\x00\x9b\x05\x00\x00\x00\x00\x00\x00\x5b\x00\x70\x01\xa2\x00\xa2\x00\x70\x01\x2a\x08\x70\x01\x70\x01\x00\x00\x70\x01\x5f\x00\x70\x01\x70\x01\x70\x01\x70\x01\x52\x00\x70\x01\x9b\x05\x9b\x05\x70\x01\x00\x00\x9b\x05\x9b\x05\x9b\x05\x00\x00\x85\x00\x00\x00\x76\x00\x4e\x00\x9b\x05\x19\x04\x00\x00\x4f\x00\x80\x00\x9b\x05\x00\x00\xe6\x03\x00\x00\x9f\x03\x58\x00\x00\x00\x00\x00\x70\x01\x00\x00\x00\x00\x00\x00\x70\x01\x70\x01\x58\x03\x11\x03\x70\x01\x65\x06\x65\x06\x00\x00\x00\x00\x00\x00\x00\x00\x30\x07\x30\x07\x00\x00\x00\x00\x00\x00\x00\x00\x74\x00\x67\x00\x00\x00\x00\x00\x70\x01\x00\x00\x70\x01\x7d\x00\x65\x06\x70\x01\x70\x01\x9b\x05\x9b\x05\x9b\x05\x65\x06\x65\x06\x00\x00\x00\x00\x00\x00"#++happyGotoOffsets :: HappyAddr+happyGotoOffsets = HappyA# "\x6d\x00\x40\x00\xfb\x09\x73\x00\xf0\x03\x00\x00\x00\x00\x2f\x05\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf3\x09\x67\x04\xad\x00\xeb\x09\x00\x00\x00\x00\xe3\x09\xdb\x09\xb6\x01\xe7\x04\xa1\x04\xd3\x09\xaa\x04\x98\x03\x51\x03\xf7\x01\xae\x01\x00\x00\x00\x00\xff\xff\xe8\x02\x5e\x03\x00\x00\x00\x00\x6a\x00\x00\x00\x6c\x00\x00\x00\x00\x00\xff\xff\xce\x00\x56\x00\xc4\x00\x71\x00\x47\x00\x04\x02\x00\x00\x00\x00\x49\x00\xcb\x09\xc3\x09\xbb\x09\xb3\x09\xab\x09\xa3\x09\x9b\x09\x93\x09\x8b\x09\x83\x09\x7b\x09\x73\x09\x6b\x09\x63\x09\x5b\x09\x53\x09\x4b\x09\x43\x09\x3b\x09\x33\x09\x47\x01\x3a\x02\x2b\x09\xa5\x03\x23\x09\x1b\x09\x13\x09\x0b\x09\x03\x09\xfb\x08\xf3\x08\xeb\x08\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\xff\xff\xff\xff\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\x29\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3f\x01\x00\x00\x3d\x06\xe3\x08\x0a\x06\xdb\x08\x00\x00\x18\x00\x00\x00\xfe\x00\x00\x00\xd3\x08\xcb\x08\xf6\x00\x00\x00\x8d\x00\xf1\x04\x48\x00\xd7\x05\xc3\x08\x5a\x08\x51\x08\x64\x00\x00\x00\x36\x08\x2e\x08\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2d\x00\xff\xff\x00\x00\x00\x00\x1d\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x25\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x05\xd0\x07\x00\x00\x02\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x71\x05\x17\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x38\x05\x3c\x00\x08\x00\x22\x04\xff\xff\xf3\x07\x9e\x07\x00\x00\x6d\x02\x00\x00\xfc\xff\x1a\x03\x8f\x07\x6c\x07\x00\x00\x39\x07\xff\xff\xff\xff\x07\x07\x00\x00\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\x7a\x00\xf6\xff\x00\x00\x00\x00\xd4\x06\x00\x00\x00\x00\x00\x00\xa1\x06\x6f\x06\xff\xff\xff\xff\x87\x01\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdf\x02\x00\x00\xa1\x02\x26\x00\xff\xff\x63\x01\xd1\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00"#++happyDefActions :: HappyAddr+happyDefActions = HappyA# "\xf6\xff\x00\x00\x00\x00\x00\x00\xf4\xff\xc8\xff\xc9\xff\x7b\xff\x00\x00\xca\xff\xd1\xff\xd2\xff\xcf\xff\xd0\xff\xa4\xff\x00\x00\x00\x00\x00\x00\x00\x00\xb1\xff\xcd\xff\x00\x00\x00\x00\x00\x00\x7b\xff\x7b\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf9\xff\xcb\xff\x00\x00\x00\x00\x00\x00\xfa\xff\x00\x00\x00\x00\xf2\xff\xf1\xff\xed\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\xff\x00\x00\x80\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7b\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x73\xff\x70\xff\x00\x00\x72\xff\x00\x00\x00\x00\x00\x00\x00\x00\x82\xff\x00\x00\x83\xff\x00\x00\x78\xff\x00\x00\x7a\xff\x78\xff\x00\x00\x00\x00\x00\x00\xab\xff\xb7\xff\xba\xff\x00\x00\xce\xff\x00\x00\x00\x00\x78\xff\x00\x00\xfc\xff\xf3\xff\xf5\xff\xb0\xff\x00\x00\xcc\xff\x00\x00\x00\x00\x00\x00\x00\x00\xc7\xff\x00\x00\xc3\xff\x00\x00\xaa\xff\x00\x00\x00\x00\x00\x00\xa6\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x96\xff\x97\xff\x98\xff\x9a\xff\xa1\xff\x9d\xff\x9e\xff\xa0\xff\xcb\xff\x77\xff\x00\x00\x00\x00\x86\xff\x77\xff\x87\xff\x00\x00\xac\xff\xb4\xff\xb3\xff\xb2\xff\xb5\xff\xb6\xff\xbd\xff\xbe\xff\xbb\xff\xbc\xff\xbf\xff\xc0\xff\xb9\xff\xb8\xff\x9f\xff\xa3\xff\x89\xff\x8b\xff\x8d\xff\xc6\xff\x7e\xff\x00\x00\xe6\xff\x00\x00\xd6\xff\xd4\xff\xe7\xff\xd5\xff\xe8\xff\x00\x00\xeb\xff\x00\x00\xef\xff\xf8\xff\x00\x00\xe2\xff\xe0\xff\xdf\xff\xde\xff\xdd\xff\x00\x00\xe4\xff\xe1\xff\xc5\xff\xf0\xff\xee\xff\xf7\xff\xec\xff\x00\x00\x00\x00\x00\x00\x00\x00\xa2\xff\x00\x00\x00\x00\xc2\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x75\xff\x74\xff\x00\x00\x71\xff\x93\xff\x91\xff\x92\xff\x84\xff\x00\x00\x81\xff\x00\x00\x00\x00\x79\xff\x00\x00\xa8\xff\x00\x00\x7d\xff\xc1\xff\xec\xff\x00\x00\xae\xff\x00\x00\x00\x00\xaf\xff\xad\xff\x00\x00\xa9\xff\xa7\xff\xa5\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x99\xff\x9c\xff\x88\xff\x76\xff\x95\xff\x85\xff\x8a\xff\x8c\xff\xe5\xff\xd3\xff\xd8\xff\xe9\xff\xd9\xff\xda\xff\xea\xff\xe3\xff\x00\x00\xdc\xff\x00\x00\x00\x00\x94\xff\x00\x00\x00\x00\x8e\xff\x8f\xff\xc4\xff\x90\xff\x9b\xff\xd7\xff\xdb\xff"#++happyCheck :: HappyAddr+happyCheck = HappyA# "\xff\xff\x10\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x10\x00\x10\x00\x20\x00\x21\x00\x22\x00\x23\x00\x17\x00\x25\x00\x13\x00\x14\x00\x15\x00\x16\x00\x12\x00\x13\x00\x19\x00\x1a\x00\x16\x00\x10\x00\x18\x00\x1b\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x22\x00\x23\x00\x0c\x00\x39\x00\x29\x00\x2a\x00\x2b\x00\x27\x00\x31\x00\x3f\x00\x13\x00\x14\x00\x3c\x00\x16\x00\x2e\x00\x2f\x00\x19\x00\x1a\x00\x0d\x00\x33\x00\x3e\x00\x10\x00\x0d\x00\x0e\x00\x38\x00\x39\x00\x37\x00\x3b\x00\x39\x00\x3d\x00\x27\x00\x17\x00\x01\x00\x41\x00\x3f\x00\x43\x00\x28\x00\x45\x00\x46\x00\x47\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x4c\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x13\x00\x14\x00\x28\x00\x16\x00\x10\x00\x18\x00\x19\x00\x1a\x00\x13\x00\x14\x00\x15\x00\x16\x00\x12\x00\x13\x00\x19\x00\x1a\x00\x16\x00\x1b\x00\x18\x00\x10\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x00\x00\x02\x00\x08\x00\x03\x00\x29\x00\x2a\x00\x2b\x00\x27\x00\x0b\x00\x03\x00\x13\x00\x14\x00\x15\x00\x16\x00\x2e\x00\x2f\x00\x19\x00\x1a\x00\x02\x00\x33\x00\x10\x00\x11\x00\x12\x00\x10\x00\x38\x00\x39\x00\x07\x00\x3b\x00\x31\x00\x3d\x00\x3c\x00\x3e\x00\x29\x00\x41\x00\x19\x00\x43\x00\x17\x00\x45\x00\x46\x00\x47\x00\x1b\x00\x44\x00\x01\x00\x02\x00\x4c\x00\x04\x00\x05\x00\x22\x00\x23\x00\x19\x00\x40\x00\x13\x00\x14\x00\x15\x00\x16\x00\x02\x00\x24\x00\x19\x00\x1a\x00\x12\x00\x13\x00\x4f\x00\x0d\x00\x16\x00\x26\x00\x18\x00\x06\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x29\x00\x2a\x00\x2b\x00\x07\x00\x06\x00\x01\x00\x02\x00\x27\x00\x04\x00\x05\x00\x13\x00\x14\x00\x15\x00\x16\x00\x2e\x00\x2f\x00\x19\x00\x1a\x00\x3a\x00\x33\x00\x07\x00\x10\x00\x12\x00\x13\x00\x38\x00\x39\x00\x16\x00\x3b\x00\x18\x00\x3d\x00\x10\x00\x11\x00\x12\x00\x41\x00\x0e\x00\x43\x00\x43\x00\x45\x00\x46\x00\x47\x00\x10\x00\x11\x00\x12\x00\x27\x00\x4c\x00\x10\x00\x13\x00\x14\x00\x19\x00\x16\x00\x2e\x00\x2f\x00\x19\x00\x1a\x00\x44\x00\x33\x00\x09\x00\x0a\x00\x0b\x00\x3a\x00\x38\x00\x39\x00\x07\x00\x3b\x00\x3c\x00\x3d\x00\x07\x00\x0f\x00\x19\x00\x41\x00\x19\x00\x43\x00\x07\x00\x45\x00\x46\x00\x47\x00\x19\x00\x02\x00\x01\x00\x02\x00\x4c\x00\x04\x00\x05\x00\x13\x00\x14\x00\x15\x00\x16\x00\x19\x00\x48\x00\x19\x00\x1a\x00\x13\x00\x14\x00\x15\x00\x16\x00\x12\x00\x13\x00\x19\x00\x1a\x00\x16\x00\x03\x00\x18\x00\x17\x00\xff\xff\x4f\x00\x29\x00\x2a\x00\x2b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x29\x00\x2a\x00\x2b\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2e\x00\x2f\x00\xff\xff\x31\x00\xff\xff\x33\x00\xff\xff\xff\xff\xff\xff\xff\xff\x38\x00\x39\x00\xff\xff\x3b\x00\xff\xff\x3d\x00\xff\xff\xff\xff\xff\xff\x41\x00\xff\xff\x43\x00\xff\xff\x45\x00\x46\x00\x47\x00\xff\xff\xff\xff\x01\x00\x02\x00\x4c\x00\x04\x00\x05\x00\x13\x00\x14\x00\x15\x00\x16\x00\xff\xff\xff\xff\x19\x00\x1a\x00\x13\x00\x14\x00\xff\xff\x16\x00\x12\x00\x13\x00\x19\x00\x1a\x00\x16\x00\xff\xff\x18\x00\xff\xff\xff\xff\xff\xff\x29\x00\x2a\x00\x2b\x00\x1f\x00\xff\xff\x26\x00\x27\x00\xff\xff\xff\xff\x01\x00\x02\x00\x27\x00\x04\x00\x05\x00\x13\x00\x14\x00\xff\xff\x16\x00\x2e\x00\x2f\x00\x19\x00\x1a\x00\xff\xff\x33\x00\xff\xff\xff\xff\x12\x00\x13\x00\x38\x00\x39\x00\x16\x00\x3b\x00\x18\x00\x3d\x00\xff\xff\xff\xff\xff\xff\x41\x00\xff\xff\x43\x00\xff\xff\x45\x00\x46\x00\x47\x00\xff\xff\xff\xff\xff\xff\x27\x00\x4c\x00\xff\xff\x13\x00\x14\x00\xff\xff\x16\x00\x2e\x00\x2f\x00\x19\x00\x1a\x00\xff\xff\x33\x00\xff\xff\xff\xff\xff\xff\xff\xff\x38\x00\x39\x00\xff\xff\x3b\x00\xff\xff\x3d\x00\xff\xff\xff\xff\xff\xff\x41\x00\xff\xff\x43\x00\xff\xff\x45\x00\x46\x00\x47\x00\xff\xff\xff\xff\xff\xff\x06\x00\x4c\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x13\x00\x14\x00\x15\x00\x16\x00\xff\xff\x11\x00\x19\x00\x1a\x00\x13\x00\x14\x00\xff\xff\x16\x00\x18\x00\xff\xff\x19\x00\x1a\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\x39\x00\x29\x00\x2a\x00\x2b\x00\x24\x00\xff\xff\x3f\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\x30\x00\xff\xff\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3f\x00\xff\xff\x41\x00\xff\xff\x43\x00\xff\xff\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\xff\xff\xff\xff\x4d\x00\x4e\x00\x06\x00\xff\xff\x08\x00\x09\x00\x0a\x00\x0b\x00\x13\x00\x14\x00\x15\x00\x16\x00\x0a\x00\x11\x00\x19\x00\x1a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x18\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\x18\x00\x19\x00\x1a\x00\xff\xff\x29\x00\x2a\x00\x2b\x00\xff\xff\xff\xff\xff\xff\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\x30\x00\xff\xff\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\x39\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x3f\x00\xff\xff\x41\x00\xff\xff\x43\x00\x11\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x18\x00\xff\xff\x4d\x00\x4e\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\x18\x00\x19\x00\x1a\x00\xff\xff\x1c\x00\x1d\x00\x1e\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\x30\x00\xff\xff\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\x39\x00\x3a\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x3f\x00\xff\xff\x41\x00\xff\xff\x43\x00\x11\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x18\x00\xff\xff\x4d\x00\x4e\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\x18\x00\x19\x00\x1a\x00\xff\xff\x1c\x00\xff\xff\xff\xff\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\x30\x00\xff\xff\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\x39\x00\xff\xff\x08\x00\x09\x00\x0a\x00\x0b\x00\x3f\x00\xff\xff\x41\x00\xff\xff\x43\x00\x11\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x18\x00\xff\xff\x4d\x00\x4e\x00\x4f\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\x18\x00\x19\x00\x1a\x00\xff\xff\xff\xff\xff\xff\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\x30\x00\xff\xff\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\xff\xff\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\xff\xff\x4d\x00\x4e\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\xff\xff\x0d\x00\x0e\x00\x05\x00\x06\x00\x11\x00\x08\x00\x09\x00\x13\x00\x14\x00\xff\xff\x16\x00\x18\x00\x18\x00\x19\x00\x1a\x00\xff\xff\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\xff\xff\x19\x00\x1a\x00\xff\xff\xff\xff\xff\xff\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\x30\x00\xff\xff\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\x39\x00\xff\xff\x08\x00\x09\x00\x0a\x00\x0b\x00\x3f\x00\xff\xff\x41\x00\xff\xff\x43\x00\x11\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x18\x00\xff\xff\x4d\x00\x4e\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\x18\x00\x19\x00\x1a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\x30\x00\xff\xff\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3f\x00\xff\xff\x41\x00\xff\xff\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\xff\xff\xff\xff\x4d\x00\x4e\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x13\x00\x14\x00\x15\x00\x16\x00\x0a\x00\x11\x00\x19\x00\x1a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x18\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\x18\x00\x19\x00\x1a\x00\xff\xff\x29\x00\x2a\x00\x2b\x00\xff\xff\xff\xff\xff\xff\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\x30\x00\xff\xff\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3f\x00\xff\xff\x41\x00\xff\xff\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\xff\xff\xff\xff\x4d\x00\x4e\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x13\x00\x14\x00\x15\x00\x16\x00\xff\xff\x11\x00\x19\x00\x1a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x18\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\x18\x00\x19\x00\x1a\x00\xff\xff\x29\x00\x2a\x00\x2b\x00\x1f\x00\x20\x00\x21\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3f\x00\xff\xff\x41\x00\xff\xff\x43\x00\xff\xff\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\xff\xff\xff\xff\x4d\x00\x4e\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\xff\xff\xff\xff\x04\x00\x05\x00\x06\x00\x11\x00\x08\x00\x09\x00\xff\xff\x15\x00\xff\xff\xff\xff\x18\x00\xff\xff\xff\xff\xff\xff\xff\xff\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\xff\xff\x19\x00\x1a\x00\xff\xff\xff\xff\xff\xff\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\x30\x00\xff\xff\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\x39\x00\xff\xff\x08\x00\x09\x00\x0a\x00\x0b\x00\x3f\x00\xff\xff\x41\x00\xff\xff\x43\x00\x11\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x18\x00\xff\xff\x4d\x00\x4e\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\x18\x00\x19\x00\x1a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\x30\x00\xff\xff\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\x39\x00\xff\xff\xff\xff\x3c\x00\xff\xff\xff\xff\x3f\x00\xff\xff\x41\x00\xff\xff\x43\x00\xff\xff\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\xff\xff\xff\xff\x4d\x00\x4e\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x05\x00\x06\x00\xff\xff\x08\x00\x09\x00\x11\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x18\x00\xff\xff\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\xff\xff\x19\x00\x1a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\x30\x00\xff\xff\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3f\x00\xff\xff\x41\x00\xff\xff\x43\x00\xff\xff\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\xff\xff\x4c\x00\x4d\x00\x4e\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x13\x00\x14\x00\xff\xff\x16\x00\x11\x00\xff\xff\x19\x00\x1a\x00\xff\xff\x13\x00\x14\x00\x18\x00\x16\x00\xff\xff\x18\x00\x19\x00\x1a\x00\xff\xff\xff\xff\x26\x00\x27\x00\x1f\x00\x20\x00\x21\x00\xff\xff\xff\xff\xff\xff\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\x30\x00\xff\xff\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3f\x00\xff\xff\x41\x00\xff\xff\x43\x00\xff\xff\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\xff\xff\xff\xff\x4d\x00\x4e\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\x11\x00\x19\x00\x1a\x00\x14\x00\xff\xff\x13\x00\x14\x00\x18\x00\x16\x00\xff\xff\x18\x00\x19\x00\x1a\x00\xff\xff\x26\x00\x27\x00\xff\xff\x1f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\x30\x00\xff\xff\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3f\x00\xff\xff\x41\x00\xff\xff\x43\x00\xff\xff\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\xff\xff\xff\xff\x4d\x00\x4e\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x13\x00\x14\x00\xff\xff\x16\x00\x11\x00\xff\xff\x19\x00\x1a\x00\xff\xff\x13\x00\x14\x00\x18\x00\x16\x00\xff\xff\x18\x00\x19\x00\x1a\x00\xff\xff\xff\xff\x26\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\x30\x00\xff\xff\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\x39\x00\xff\xff\x08\x00\x09\x00\x0a\x00\x0b\x00\x3f\x00\xff\xff\x41\x00\xff\xff\x43\x00\x11\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x18\x00\xff\xff\x4d\x00\x4e\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\x18\x00\x19\x00\x1a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\x30\x00\xff\xff\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\x39\x00\xff\xff\x08\x00\x09\x00\x0a\x00\x0b\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x11\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x18\x00\xff\xff\x4d\x00\x4e\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\x18\x00\x19\x00\x1a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\x30\x00\xff\xff\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\x39\x00\xff\xff\x08\x00\x09\x00\x0a\x00\x0b\x00\x3f\x00\xff\xff\x41\x00\xff\xff\x43\x00\x11\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x18\x00\xff\xff\x4d\x00\x4e\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\x18\x00\x19\x00\x1a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\x30\x00\xff\xff\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\x39\x00\xff\xff\x08\x00\x09\x00\x0a\x00\x0b\x00\x3f\x00\xff\xff\x41\x00\xff\xff\x43\x00\x11\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x18\x00\xff\xff\x4d\x00\x4e\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\x18\x00\x19\x00\x1a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\x30\x00\xff\xff\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\x39\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\xff\xff\x3f\x00\xff\xff\x41\x00\xff\xff\x43\x00\xff\xff\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\xff\xff\xff\xff\x4d\x00\x4e\x00\x13\x00\x14\x00\xff\xff\x16\x00\x17\x00\xff\xff\x19\x00\x1a\x00\xff\xff\xff\xff\xff\xff\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\x30\x00\xff\xff\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\x39\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\xff\xff\x3f\x00\xff\xff\x41\x00\xff\xff\x43\x00\xff\xff\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\xff\xff\xff\xff\x4d\x00\x4e\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\xff\xff\x19\x00\x1a\x00\xff\xff\xff\xff\xff\xff\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\x30\x00\xff\xff\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\x39\x00\xff\xff\x08\x00\xff\xff\xff\xff\xff\xff\x3f\x00\x0d\x00\x41\x00\xff\xff\x43\x00\x11\x00\x45\x00\x46\x00\xff\xff\x48\x00\x49\x00\x4a\x00\x18\x00\xff\xff\x4d\x00\x4e\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\xff\xff\x19\x00\x1a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\x30\x00\xff\xff\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\x39\x00\xff\xff\x08\x00\xff\xff\xff\xff\xff\xff\x3f\x00\x0d\x00\x41\x00\xff\xff\x43\x00\x11\x00\x45\x00\x46\x00\x47\x00\xff\xff\x49\x00\x4a\x00\x18\x00\xff\xff\x4d\x00\x4e\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\xff\xff\x19\x00\x1a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\x30\x00\xff\xff\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\x39\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\xff\xff\x3f\x00\xff\xff\x41\x00\xff\xff\x43\x00\xff\xff\x45\x00\x46\x00\x47\x00\xff\xff\x49\x00\x4a\x00\xff\xff\xff\xff\x4d\x00\x4e\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\xff\xff\x19\x00\x1a\x00\xff\xff\xff\xff\xff\xff\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\x30\x00\xff\xff\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\x39\x00\xff\xff\x08\x00\xff\xff\xff\xff\xff\xff\x3f\x00\xff\xff\x41\x00\xff\xff\x43\x00\x11\x00\x45\x00\x46\x00\xff\xff\x48\x00\x49\x00\x4a\x00\x18\x00\xff\xff\x4d\x00\x4e\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\xff\xff\x19\x00\x1a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\x30\x00\xff\xff\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\x39\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\xff\xff\x3f\x00\xff\xff\x41\x00\xff\xff\x43\x00\xff\xff\x45\x00\x46\x00\x47\x00\xff\xff\x49\x00\x4a\x00\xff\xff\xff\xff\x4d\x00\x4e\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\xff\xff\x19\x00\x1a\x00\xff\xff\xff\xff\xff\xff\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\x30\x00\xff\xff\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\x39\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\xff\xff\x3f\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\x45\x00\x19\x00\x1a\x00\x48\x00\x49\x00\x4a\x00\xff\xff\xff\xff\x4d\x00\x4e\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\xff\xff\x19\x00\x1a\x00\xff\xff\xff\xff\xff\xff\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\x30\x00\xff\xff\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\x39\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\xff\xff\x3f\x00\xff\xff\xff\xff\xff\xff\x07\x00\x08\x00\x09\x00\xff\xff\xff\xff\x48\x00\x49\x00\x4a\x00\xff\xff\xff\xff\x4d\x00\x4e\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\xff\xff\x19\x00\x1a\x00\xff\xff\xff\xff\xff\xff\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\x30\x00\xff\xff\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\x39\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\xff\xff\x3f\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\xff\xff\x19\x00\x1a\x00\x48\x00\xff\xff\x4a\x00\xff\xff\xff\xff\x4d\x00\x4e\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\xff\xff\x19\x00\x1a\x00\xff\xff\xff\xff\xff\xff\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\x30\x00\xff\xff\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\x39\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\xff\xff\x3f\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\xff\xff\x19\x00\x1a\x00\x48\x00\x13\x00\x14\x00\xff\xff\x16\x00\x4d\x00\x4e\x00\x19\x00\x1a\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\xff\xff\x19\x00\x1a\x00\xff\xff\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\x30\x00\x08\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\x39\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\x3f\x00\x19\x00\x1a\x00\xff\xff\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\x48\x00\x19\x00\x1a\x00\xff\xff\xff\xff\xff\xff\x4e\x00\xff\xff\xff\xff\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\x30\x00\xff\xff\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\x28\x00\x3f\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\x30\x00\xff\xff\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\x39\x00\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x3f\x00\x2f\x00\x30\x00\xff\xff\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\x39\x00\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x3f\x00\x2f\x00\x30\x00\xff\xff\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\x39\x00\xff\xff\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x3f\x00\x2f\x00\x30\x00\xff\xff\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\x39\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\x3f\x00\x19\x00\x1a\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\xff\xff\x19\x00\x1a\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\xff\xff\x19\x00\x1a\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\xff\xff\x19\x00\x1a\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\xff\xff\x19\x00\x1a\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\xff\xff\x19\x00\x1a\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\xff\xff\x19\x00\x1a\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\xff\xff\x19\x00\x1a\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\xff\xff\x19\x00\x1a\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\xff\xff\x19\x00\x1a\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\xff\xff\x19\x00\x1a\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\xff\xff\x19\x00\x1a\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\xff\xff\x19\x00\x1a\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\xff\xff\x19\x00\x1a\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\xff\xff\x19\x00\x1a\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\xff\xff\x19\x00\x1a\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\xff\xff\x19\x00\x1a\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\xff\xff\x19\x00\x1a\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\xff\xff\x19\x00\x1a\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\xff\xff\x19\x00\x1a\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\xff\xff\x19\x00\x1a\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\xff\xff\x19\x00\x1a\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\xff\xff\x19\x00\x1a\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\xff\xff\x19\x00\x1a\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\xff\xff\x19\x00\x1a\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\xff\xff\x19\x00\x1a\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\xff\xff\x19\x00\x1a\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\xff\xff\x19\x00\x1a\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\xff\xff\x19\x00\x1a\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\xff\xff\x19\x00\x1a\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\xff\xff\x19\x00\x1a\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\xff\xff\x19\x00\x1a\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\xff\xff\x19\x00\x1a\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\xff\xff\x19\x00\x1a\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\xff\xff\x19\x00\x1a\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\xff\xff\x19\x00\x1a\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\xff\xff\x19\x00\x1a\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\xff\xff\x19\x00\x1a\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\xff\xff\x19\x00\x1a\x00\x13\x00\x14\x00\xff\xff\x16\x00\xff\xff\xff\xff\x19\x00\x1a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"#++happyTable :: HappyAddr+happyTable = HappyA# "\x00\x00\x81\x00\x0b\x00\x0c\x00\xd0\x00\x0d\x00\x0e\x00\x85\x00\x78\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xf8\x00\xca\x00\x05\x00\x06\x00\x56\x00\x07\x00\x0f\x00\x10\x00\x57\x00\x09\x00\x11\x00\x0c\x01\x12\x00\x33\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x12\x01\x4b\x00\x58\x00\x06\x01\x5a\x00\x13\x00\x79\x00\x4c\x00\x05\x00\x06\x00\x82\x00\x07\x00\x14\x00\x15\x00\x63\x00\x09\x00\x1f\x01\x16\x00\x86\x00\x10\x01\x90\x00\x91\x00\x17\x00\x18\x00\x4a\x00\x19\x00\x4b\x00\x1a\x00\xf1\x00\x76\x00\x20\x00\x1b\x00\x4c\x00\x1c\x00\xda\x00\x1d\x00\x1e\x00\x1f\x00\x0d\x01\x0e\x01\x0f\x01\x10\x01\x20\x00\x0b\x00\x0c\x00\x76\x00\x0d\x00\x0e\x00\x05\x00\x06\x00\xdf\x00\x07\x00\xb8\x00\x21\x00\x22\x00\x09\x00\x05\x00\x06\x00\x56\x00\x07\x00\x0f\x00\x10\x00\x57\x00\x09\x00\x11\x00\xb5\x00\x12\x00\xbe\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x25\x00\xc1\x00\x16\x01\x04\x00\x58\x00\xe9\x00\x5a\x00\x13\x00\xc4\x00\x04\x00\x05\x00\x06\x00\x56\x00\x07\x00\x14\x00\x15\x00\x57\x00\x09\x00\xba\x00\x16\x00\xba\x00\xbb\x00\xbc\x00\x17\x01\x17\x00\x18\x00\x84\x00\x19\x00\x79\x00\x1a\x00\xfc\x00\xfe\x00\xe4\x00\x1b\x00\xff\x00\x1c\x00\xf9\x00\x1d\x00\x1e\x00\x1f\x00\x33\x00\x03\x01\x0b\x00\x0c\x00\x20\x00\x0d\x00\x0e\x00\x34\x00\x35\x00\x00\x01\x08\x01\x05\x00\x06\x00\x56\x00\x07\x00\xba\x00\x14\x01\x57\x00\x09\x00\x0f\x00\x10\x00\xfb\xff\xd2\x00\x11\x00\xcc\x00\x12\x00\xd3\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x58\x00\xeb\x00\x5a\x00\xd4\x00\xd5\x00\x0b\x00\x0c\x00\x13\x00\x0d\x00\x0e\x00\x05\x00\x06\x00\x6d\x00\x07\x00\x14\x00\x15\x00\x6e\x00\x09\x00\xd9\x00\x16\x00\xda\x00\xdc\x00\x0f\x00\x10\x00\x17\x00\x18\x00\x11\x00\x19\x00\x12\x00\x1a\x00\xba\x00\xbd\x00\xbc\x00\x1b\x00\xdd\x00\x1c\x00\xe4\x00\x1d\x00\x1e\x00\x1f\x00\xba\x00\xbf\x00\xbc\x00\x13\x00\x20\x00\xdc\x00\x05\x00\x06\x00\x7d\x00\x07\x00\x14\x00\x15\x00\x1d\x01\x09\x00\x89\x00\x16\x00\x38\x00\x39\x00\x3a\x00\x7e\x00\x17\x00\x18\x00\x84\x00\x19\x00\xf0\x00\x1a\x00\x88\x00\x8a\x00\x8b\x00\x1b\x00\x8c\x00\x1c\x00\x8e\x00\x1d\x00\x1e\x00\x1f\x00\x8d\x00\xba\x00\x0b\x00\x0c\x00\x20\x00\x0d\x00\x0e\x00\x05\x00\x06\x00\x56\x00\x07\x00\x8f\x00\xb7\x00\x57\x00\x09\x00\x05\x00\x06\x00\x56\x00\x07\x00\x0f\x00\x10\x00\x57\x00\x09\x00\x11\x00\xc3\x00\x12\x00\xc4\x00\x00\x00\xff\xff\x58\x00\xec\x00\x5a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x58\x00\xf0\x00\x5a\x00\x13\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x14\x00\x15\x00\x00\x00\x79\x00\x00\x00\x16\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17\x00\x18\x00\x00\x00\x19\x00\x00\x00\x1a\x00\x00\x00\x00\x00\x00\x00\x1b\x00\x00\x00\x1c\x00\x00\x00\x1d\x00\x1e\x00\x1f\x00\x00\x00\x00\x00\x0b\x00\x0c\x00\x20\x00\x0d\x00\x0e\x00\x05\x00\x06\x00\x56\x00\x07\x00\x00\x00\x00\x00\x57\x00\x09\x00\x05\x00\x06\x00\x00\x00\x07\x00\x0f\x00\x10\x00\x63\x00\x09\x00\x24\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x58\x00\xf7\x00\x5a\x00\x25\x00\x00\x00\xa0\x00\x65\x00\x00\x00\x00\x00\x0b\x00\x0c\x00\x13\x00\x0d\x00\x0e\x00\x05\x00\x06\x00\x00\x00\x07\x00\x14\x00\x15\x00\x1e\x01\x09\x00\x00\x00\x16\x00\x00\x00\x00\x00\x0f\x00\x10\x00\x17\x00\x18\x00\x11\x00\x19\x00\x12\x00\x1a\x00\x00\x00\x00\x00\x00\x00\x1b\x00\x00\x00\x1c\x00\x00\x00\x1d\x00\x1e\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x13\x00\x20\x00\x00\x00\x05\x00\x06\x00\x00\x00\x07\x00\x14\x00\x15\x00\x17\x01\x09\x00\x00\x00\x16\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17\x00\x18\x00\x00\x00\x19\x00\x00\x00\x1a\x00\x00\x00\x00\x00\x00\x00\x1b\x00\x00\x00\x1c\x00\x00\x00\x1d\x00\x1e\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x7c\x00\x20\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x05\x00\x06\x00\x56\x00\x07\x00\x00\x00\x3b\x00\x57\x00\x09\x00\x05\x00\x06\x00\x00\x00\x07\x00\x3c\x00\x00\x00\x68\x00\x09\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x00\x00\x4b\x00\x58\x00\x59\x00\x5a\x00\x69\x00\x00\x00\x4c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x00\x00\x43\x00\x44\x00\x00\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x00\x00\x4b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4c\x00\x00\x00\x4d\x00\x00\x00\x4e\x00\x00\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x00\x00\x00\x00\x55\x00\x56\x00\xc1\x00\x00\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x05\x00\x06\x00\x56\x00\x07\x00\xb7\x00\x3b\x00\x57\x00\x09\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3c\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x27\x00\x22\x00\x09\x00\x00\x00\x58\x00\x5b\x00\x5a\x00\x00\x00\x00\x00\x00\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x00\x00\x43\x00\x44\x00\x00\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x00\x00\x4b\x00\x7f\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x4c\x00\x00\x00\x4d\x00\x00\x00\x4e\x00\x3b\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x3c\x00\x00\x00\x55\x00\x56\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x9c\x00\x22\x00\x09\x00\x00\x00\x9d\x00\x9e\x00\x9f\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x00\x00\x43\x00\x44\x00\x00\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x00\x00\x4b\x00\x80\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x4c\x00\x00\x00\x4d\x00\x00\x00\x4e\x00\x3b\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x3c\x00\x00\x00\x55\x00\x56\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x9c\x00\x22\x00\x09\x00\x00\x00\x08\x01\x00\x00\x00\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x00\x00\x43\x00\x44\x00\x00\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x00\x00\x4b\x00\x00\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x4c\x00\x00\x00\x4d\x00\x00\x00\x4e\x00\x3b\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x3c\x00\x00\x00\x55\x00\x56\x00\xff\xff\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x20\x01\x22\x00\x09\x00\x00\x00\x00\x00\x00\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x00\x00\x43\x00\x44\x00\x00\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x00\x00\x4b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4c\x00\x00\x00\x4d\x00\xde\x00\x4e\x00\x00\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\xdf\x00\x00\x00\x55\x00\x56\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x00\x00\xce\xff\xce\xff\x28\x00\x29\x00\x3b\x00\x2a\x00\x2b\x00\x05\x00\x06\x00\x00\x00\x07\x00\x3c\x00\x14\x01\x22\x00\x09\x00\x00\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x00\x00\x2c\x00\x09\x00\x00\x00\x00\x00\x00\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x00\x00\x43\x00\x44\x00\x00\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x00\x00\x4b\x00\x00\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x4c\x00\x00\x00\x4d\x00\x00\x00\x4e\x00\x3b\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x3c\x00\x00\x00\x55\x00\x56\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x05\x01\x22\x00\x09\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x00\x00\x43\x00\x44\x00\x00\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x00\x00\x4b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4c\x00\x00\x00\x4d\x00\x00\x00\x4e\x00\x19\x01\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x00\x00\x00\x00\x55\x00\x56\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x05\x00\x06\x00\x56\x00\x07\x00\x26\x00\x3b\x00\x57\x00\x09\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3c\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x27\x00\x22\x00\x09\x00\x00\x00\x58\x00\x5c\x00\x5a\x00\x00\x00\x00\x00\x00\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x00\x00\x43\x00\x44\x00\x00\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x00\x00\x4b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4c\x00\x00\x00\x4d\x00\x00\x00\x4e\x00\x1a\x01\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x00\x00\x00\x00\x55\x00\x56\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x05\x00\x06\x00\x56\x00\x07\x00\x00\x00\x3b\x00\x57\x00\x09\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3c\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x5e\x00\x99\x00\x09\x00\x00\x00\x58\x00\x5d\x00\x5a\x00\x5f\x00\x9a\x00\x61\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x00\x00\x43\x00\x44\x00\x79\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x00\x00\x4b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4c\x00\x00\x00\x4d\x00\x00\x00\x4e\x00\x00\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x00\x00\x00\x00\x55\x00\x56\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x00\x00\x00\x00\x73\x00\x74\x00\x29\x00\x3b\x00\x2a\x00\x2b\x00\x00\x00\xfb\x00\x00\x00\x00\x00\x3c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x00\x00\x6f\x00\x09\x00\x00\x00\x00\x00\x00\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x00\x00\x43\x00\x44\x00\x00\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x00\x00\x4b\x00\x00\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x4c\x00\x00\x00\x4d\x00\x00\x00\x4e\x00\x3b\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x3c\x00\x00\x00\x55\x00\x56\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x0b\x01\x22\x00\x09\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x00\x00\x43\x00\x44\x00\x00\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x00\x00\x4b\x00\x00\x00\x00\x00\xfd\x00\x00\x00\x00\x00\x4c\x00\x00\x00\x4d\x00\x00\x00\x4e\x00\x00\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x00\x00\x00\x00\x55\x00\x56\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x28\x00\x29\x00\x00\x00\x2a\x00\x2b\x00\x3b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3c\x00\x00\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x00\x00\x6f\x00\x09\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x00\x00\x43\x00\x44\x00\x00\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x00\x00\x4b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4c\x00\x00\x00\x4d\x00\x00\x00\x4e\x00\x00\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x00\x00\xe1\x00\x55\x00\x56\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x7a\x00\x05\x00\x06\x00\x00\x00\x07\x00\x3b\x00\x00\x00\x63\x00\x09\x00\x00\x00\x05\x00\x06\x00\x3c\x00\x07\x00\x00\x00\x5e\x00\x22\x00\x09\x00\x00\x00\x00\x00\x64\x00\x65\x00\x5f\x00\x60\x00\x61\x00\x00\x00\x00\x00\x00\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x00\x00\x43\x00\x44\x00\x00\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x00\x00\x4b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4c\x00\x00\x00\x4d\x00\x00\x00\x4e\x00\x00\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x00\x00\x00\x00\x55\x00\x56\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x3b\x00\x66\x00\x09\x00\x7b\x00\x00\x00\x05\x00\x06\x00\x3c\x00\x07\x00\x00\x00\x5e\x00\x22\x00\x09\x00\x00\x00\x67\x00\x65\x00\x00\x00\xea\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x00\x00\x43\x00\x44\x00\x00\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x00\x00\x4b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4c\x00\x00\x00\x4d\x00\x00\x00\x4e\x00\x00\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x00\x00\x00\x00\x55\x00\x56\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x83\x00\x05\x00\x06\x00\x00\x00\x07\x00\x3b\x00\x00\x00\x71\x00\x09\x00\x00\x00\x05\x00\x06\x00\x3c\x00\x07\x00\x00\x00\x11\x01\x22\x00\x09\x00\x00\x00\x00\x00\x72\x00\x65\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x00\x00\x43\x00\x44\x00\x00\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x00\x00\x4b\x00\x00\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x4c\x00\x00\x00\x4d\x00\x00\x00\x4e\x00\x3b\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x3c\x00\x00\x00\x55\x00\x56\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\xca\x00\x22\x00\x09\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x00\x00\x43\x00\x44\x00\x00\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x00\x00\x4b\x00\x00\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x4c\x00\x00\x00\x4d\x00\x87\x00\x4e\x00\x3b\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x3c\x00\x00\x00\x55\x00\x56\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\xd0\x00\x22\x00\x09\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x00\x00\x43\x00\x44\x00\x00\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x00\x00\x4b\x00\x00\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x4c\x00\x00\x00\x4d\x00\x00\x00\x4e\x00\x00\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x3c\x00\x00\x00\x55\x00\x56\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\xe8\x00\x22\x00\x09\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x00\x00\x43\x00\x44\x00\x00\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x00\x00\x4b\x00\x00\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x4c\x00\x00\x00\x4d\x00\x00\x00\x4e\x00\x3b\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x3c\x00\x00\x00\x55\x00\x56\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\xf3\x00\x22\x00\x09\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x00\x00\x43\x00\x44\x00\x00\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x00\x00\x4b\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x00\x00\x4c\x00\x00\x00\x4d\x00\x00\x00\x4e\x00\x00\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x00\x00\x00\x00\x55\x00\x56\x00\x05\x00\x06\x00\x00\x00\x07\x00\xf5\x00\x00\x00\xf6\x00\x09\x00\x00\x00\x00\x00\x00\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x00\x00\x43\x00\x44\x00\x00\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x00\x00\x4b\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x00\x00\x4c\x00\x00\x00\x4d\x00\x00\x00\x4e\x00\x00\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x00\x00\x00\x00\x55\x00\x56\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x00\x00\x1a\x01\x09\x00\x00\x00\x00\x00\x00\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x00\x00\x43\x00\x44\x00\x00\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x00\x00\x4b\x00\x00\x00\x37\x00\x00\x00\x00\x00\x00\x00\x4c\x00\xd7\x00\x00\x00\x00\x00\x00\x00\x3b\x00\x4f\x00\x50\x00\x00\x00\x52\x00\x53\x00\x54\x00\x3c\x00\x00\x00\x55\x00\x56\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x00\x00\x1b\x01\x09\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x00\x00\x43\x00\x44\x00\x00\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x00\x00\x4b\x00\x00\x00\x37\x00\x00\x00\x00\x00\x00\x00\x4c\x00\xd8\x00\x4d\x00\x00\x00\x4e\x00\x3b\x00\x4f\x00\x50\x00\x51\x00\x00\x00\x53\x00\x54\x00\x3c\x00\x00\x00\x55\x00\x56\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x00\x00\x1c\x01\x09\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x00\x00\x43\x00\x44\x00\x00\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x00\x00\x4b\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x00\x00\x4c\x00\x00\x00\x4d\x00\x00\x00\x4e\x00\x00\x00\x4f\x00\x50\x00\x51\x00\x00\x00\x53\x00\x54\x00\x00\x00\x00\x00\x55\x00\x56\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x01\x09\x00\x00\x00\x00\x00\x00\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x00\x00\x43\x00\x44\x00\x00\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x00\x00\x4b\x00\x00\x00\x37\x00\x00\x00\x00\x00\x00\x00\x4c\x00\x00\x00\x4d\x00\x00\x00\x4e\x00\x3b\x00\x4f\x00\x50\x00\x00\x00\x52\x00\x53\x00\x54\x00\x3c\x00\x00\x00\x55\x00\x56\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x00\x00\x01\x01\x09\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x00\x00\x43\x00\x44\x00\x00\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x00\x00\x4b\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x00\x00\x4c\x00\x00\x00\x4d\x00\x00\x00\x4e\x00\x00\x00\x4f\x00\x50\x00\x51\x00\x00\x00\x53\x00\x54\x00\x00\x00\x00\x00\x55\x00\x56\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x00\x00\x03\x01\x09\x00\x00\x00\x00\x00\x00\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x00\x00\x43\x00\x44\x00\x00\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x00\x00\x4b\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x00\x00\x4c\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x4f\x00\x04\x01\x09\x00\x52\x00\x53\x00\x54\x00\x00\x00\x00\x00\x55\x00\x56\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x00\x00\x09\x01\x09\x00\x00\x00\x00\x00\x00\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x00\x00\x43\x00\x44\x00\x00\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x00\x00\x4b\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x00\x00\x4c\x00\x00\x00\x00\x00\x00\x00\xcd\x00\xce\x00\x2b\x00\x00\x00\x00\x00\x52\x00\x53\x00\x54\x00\x00\x00\x00\x00\x55\x00\x56\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x00\x00\x6f\x00\x09\x00\x00\x00\x00\x00\x00\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x00\x00\x43\x00\x44\x00\x00\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x00\x00\x4b\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x00\x00\x4c\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x00\x00\x0a\x01\x09\x00\x52\x00\x00\x00\x54\x00\x00\x00\x00\x00\x55\x00\x56\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x00\x00\xcc\x00\x09\x00\x00\x00\x00\x00\x00\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x00\x00\x43\x00\x44\x00\x00\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x00\x00\x4b\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x00\x00\x4c\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x00\x00\xd5\x00\x09\x00\x52\x00\x05\x00\x06\x00\x00\x00\x07\x00\x55\x00\x56\x00\xe1\x00\x09\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x00\x00\xe2\x00\x09\x00\x00\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x00\x00\x43\x00\x44\x00\x37\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x00\x00\x4b\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x4c\x00\xe5\x00\x09\x00\x00\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x52\x00\xe6\x00\x09\x00\x00\x00\x00\x00\x00\x00\x56\x00\x00\x00\x00\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x00\x00\x43\x00\x44\x00\x00\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x00\x00\x4b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3d\x00\x4c\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x00\x00\x43\x00\x44\x00\x00\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x00\x00\x4b\x00\x00\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x4c\x00\x43\x00\x44\x00\x00\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x00\x00\x4b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4c\x00\x00\x00\x00\x00\x00\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x00\x00\x4b\x00\x00\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x4c\x00\x43\x00\x44\x00\x00\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x00\x00\x4b\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x4c\x00\xe7\x00\x09\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x00\x00\xed\x00\x09\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x00\x00\xee\x00\x09\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x00\x00\xf2\x00\x09\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x00\x00\xf4\x00\x09\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x00\x00\x91\x00\x09\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x00\x00\x92\x00\x09\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x00\x00\x93\x00\x09\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x00\x00\x94\x00\x09\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x00\x00\x95\x00\x09\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x00\x00\x96\x00\x09\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x00\x00\x97\x00\x09\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x00\x00\x98\x00\x09\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x00\x00\x9b\x00\x09\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x00\x00\xa1\x00\x09\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x00\x00\xa2\x00\x09\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x00\x00\xa3\x00\x09\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x00\x00\xa4\x00\x09\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x00\x00\xa5\x00\x09\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x00\x00\xa6\x00\x09\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x00\x00\xa7\x00\x09\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x00\x00\xa8\x00\x09\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x00\x00\xa9\x00\x09\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x00\x00\xaa\x00\x09\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x00\x00\xab\x00\x09\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x00\x00\xac\x00\x09\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x00\x00\xad\x00\x09\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x00\x00\xae\x00\x09\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x00\x00\xaf\x00\x09\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x00\x00\xb0\x00\x09\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x00\x00\xb1\x00\x09\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x00\x00\xb2\x00\x09\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x00\x00\xb3\x00\x09\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x00\x00\xb4\x00\x09\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x00\x00\x62\x00\x09\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x00\x00\x6a\x00\x09\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x00\x00\x6b\x00\x09\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x00\x00\x6c\x00\x09\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x00\x00\x70\x00\x09\x00\x05\x00\x06\x00\x00\x00\x07\x00\x00\x00\x00\x00\x08\x00\x09\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"#++happyReduceArr = Happy_Data_Array.array (3, 143) [+ (3 , happyReduce_3),+ (4 , happyReduce_4),+ (5 , happyReduce_5),+ (6 , happyReduce_6),+ (7 , happyReduce_7),+ (8 , happyReduce_8),+ (9 , happyReduce_9),+ (10 , happyReduce_10),+ (11 , happyReduce_11),+ (12 , happyReduce_12),+ (13 , happyReduce_13),+ (14 , happyReduce_14),+ (15 , happyReduce_15),+ (16 , happyReduce_16),+ (17 , happyReduce_17),+ (18 , happyReduce_18),+ (19 , happyReduce_19),+ (20 , happyReduce_20),+ (21 , happyReduce_21),+ (22 , happyReduce_22),+ (23 , happyReduce_23),+ (24 , happyReduce_24),+ (25 , happyReduce_25),+ (26 , happyReduce_26),+ (27 , happyReduce_27),+ (28 , happyReduce_28),+ (29 , happyReduce_29),+ (30 , happyReduce_30),+ (31 , happyReduce_31),+ (32 , happyReduce_32),+ (33 , happyReduce_33),+ (34 , happyReduce_34),+ (35 , happyReduce_35),+ (36 , happyReduce_36),+ (37 , happyReduce_37),+ (38 , happyReduce_38),+ (39 , happyReduce_39),+ (40 , happyReduce_40),+ (41 , happyReduce_41),+ (42 , happyReduce_42),+ (43 , happyReduce_43),+ (44 , happyReduce_44),+ (45 , happyReduce_45),+ (46 , happyReduce_46),+ (47 , happyReduce_47),+ (48 , happyReduce_48),+ (49 , happyReduce_49),+ (50 , happyReduce_50),+ (51 , happyReduce_51),+ (52 , happyReduce_52),+ (53 , happyReduce_53),+ (54 , happyReduce_54),+ (55 , happyReduce_55),+ (56 , happyReduce_56),+ (57 , happyReduce_57),+ (58 , happyReduce_58),+ (59 , happyReduce_59),+ (60 , happyReduce_60),+ (61 , happyReduce_61),+ (62 , happyReduce_62),+ (63 , happyReduce_63),+ (64 , happyReduce_64),+ (65 , happyReduce_65),+ (66 , happyReduce_66),+ (67 , happyReduce_67),+ (68 , happyReduce_68),+ (69 , happyReduce_69),+ (70 , happyReduce_70),+ (71 , happyReduce_71),+ (72 , happyReduce_72),+ (73 , happyReduce_73),+ (74 , happyReduce_74),+ (75 , happyReduce_75),+ (76 , happyReduce_76),+ (77 , happyReduce_77),+ (78 , happyReduce_78),+ (79 , happyReduce_79),+ (80 , happyReduce_80),+ (81 , happyReduce_81),+ (82 , happyReduce_82),+ (83 , happyReduce_83),+ (84 , happyReduce_84),+ (85 , happyReduce_85),+ (86 , happyReduce_86),+ (87 , happyReduce_87),+ (88 , happyReduce_88),+ (89 , happyReduce_89),+ (90 , happyReduce_90),+ (91 , happyReduce_91),+ (92 , happyReduce_92),+ (93 , happyReduce_93),+ (94 , happyReduce_94),+ (95 , happyReduce_95),+ (96 , happyReduce_96),+ (97 , happyReduce_97),+ (98 , happyReduce_98),+ (99 , happyReduce_99),+ (100 , happyReduce_100),+ (101 , happyReduce_101),+ (102 , happyReduce_102),+ (103 , happyReduce_103),+ (104 , happyReduce_104),+ (105 , happyReduce_105),+ (106 , happyReduce_106),+ (107 , happyReduce_107),+ (108 , happyReduce_108),+ (109 , happyReduce_109),+ (110 , happyReduce_110),+ (111 , happyReduce_111),+ (112 , happyReduce_112),+ (113 , happyReduce_113),+ (114 , happyReduce_114),+ (115 , happyReduce_115),+ (116 , happyReduce_116),+ (117 , happyReduce_117),+ (118 , happyReduce_118),+ (119 , happyReduce_119),+ (120 , happyReduce_120),+ (121 , happyReduce_121),+ (122 , happyReduce_122),+ (123 , happyReduce_123),+ (124 , happyReduce_124),+ (125 , happyReduce_125),+ (126 , happyReduce_126),+ (127 , happyReduce_127),+ (128 , happyReduce_128),+ (129 , happyReduce_129),+ (130 , happyReduce_130),+ (131 , happyReduce_131),+ (132 , happyReduce_132),+ (133 , happyReduce_133),+ (134 , happyReduce_134),+ (135 , happyReduce_135),+ (136 , happyReduce_136),+ (137 , happyReduce_137),+ (138 , happyReduce_138),+ (139 , happyReduce_139),+ (140 , happyReduce_140),+ (141 , happyReduce_141),+ (142 , happyReduce_142),+ (143 , happyReduce_143)+ ]++happy_n_terms = 80 :: Int+happy_n_nonterms = 44 :: Int++happyReduce_3 = happySpecReduce_2 0# happyReduction_3+happyReduction_3 happy_x_2+ happy_x_1+ = case happyOut10 happy_x_2 of { happy_var_2 -> + happyIn6+ (happy_var_2+ )}++happyReduce_4 = happyMonadReduce 4# 1# happyReduction_4+happyReduction_4 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut31 happy_x_2 of { happy_var_2 -> + case happyOut30 happy_x_4 of { happy_var_4 -> + ( do+ d <- convDecl happy_var_2 happy_var_4 + return $ annotate2 happy_var_1 happy_var_4 (Bind d))}}}+ ) (\r -> happyReturn (happyIn7 r))++happyReduce_5 = happySpecReduce_2 1# happyReduction_5+happyReduction_5 happy_x_2+ happy_x_1+ = case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut16 happy_x_2 of { happy_var_2 -> + happyIn7+ (annotate happy_var_1 (RunAssertion happy_var_2)+ )}}++happyReduce_6 = happySpecReduce_1 1# happyReduction_6+happyReduction_6 happy_x_1+ = case happyOut30 happy_x_1 of { happy_var_1 -> + happyIn7+ (annotate happy_var_1 (Evaluate happy_var_1)+ )}++happyReduce_7 = happySpecReduce_1 2# happyReduction_7+happyReduction_7 happy_x_1+ = happyIn8+ (+ )++happyReduce_8 = happySpecReduce_2 2# happyReduction_8+happyReduction_8 happy_x_2+ happy_x_1+ = happyIn8+ (+ )++happyReduce_9 = happySpecReduce_0 3# happyReduction_9+happyReduction_9 = happyIn9+ (+ )++happyReduce_10 = happySpecReduce_2 3# happyReduction_10+happyReduction_10 happy_x_2+ happy_x_1+ = happyIn9+ (+ )++happyReduce_11 = happySpecReduce_0 4# happyReduction_11+happyReduction_11 = happyIn10+ ([]+ )++happyReduce_12 = happySpecReduce_1 4# happyReduction_12+happyReduction_12 happy_x_1+ = case happyOut11 happy_x_1 of { happy_var_1 -> + happyIn10+ (happy_var_1+ )}++happyReduce_13 = happySpecReduce_1 5# happyReduction_13+happyReduction_13 happy_x_1+ = case happyOut12 happy_x_1 of { happy_var_1 -> + happyIn11+ (combineDecls (reverse happy_var_1)+ )}++happyReduce_14 = happySpecReduce_1 6# happyReduction_14+happyReduction_14 happy_x_1+ = case happyOut14 happy_x_1 of { happy_var_1 -> + happyIn12+ ([happy_var_1]+ )}++happyReduce_15 = happySpecReduce_3 6# happyReduction_15+happyReduction_15 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut12 happy_x_1 of { happy_var_1 -> + case happyOut13 happy_x_3 of { happy_var_3 -> + happyIn12+ (case happy_var_3 of + Just d -> d:happy_var_1+ Nothing -> happy_var_1+ )}}++happyReduce_16 = happySpecReduce_0 7# happyReduction_16+happyReduction_16 = happyIn13+ (Nothing+ )++happyReduce_17 = happySpecReduce_1 7# happyReduction_17+happyReduction_17 happy_x_1+ = case happyOut14 happy_x_1 of { happy_var_1 -> + happyIn13+ (Just happy_var_1+ )}++happyReduce_18 = happyMonadReduce 1# 8# happyReduction_18+happyReduction_18 (happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen (case happyOut15 happy_x_1 of { happy_var_1 -> + ( annotateWithSymbolTable happy_var_1)}+ ) (\r -> happyReturn (happyIn14 r))++happyReduce_19 = happyMonadReduce 3# 9# happyReduction_19+happyReduction_19 (happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen (case happyOut31 happy_x_1 of { happy_var_1 -> + case happyOut30 happy_x_3 of { happy_var_3 -> + ( convDecl happy_var_1 happy_var_3)}}+ ) (\r -> happyReturn (happyIn15 r))++happyReduce_20 = happySpecReduce_2 9# happyReduction_20+happyReduction_20 happy_x_2+ happy_x_1+ = case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut23 happy_x_2 of { happy_var_2 -> + happyIn15+ (annotate2List happy_var_1 happy_var_2 (Channel (map unLoc happy_var_2) Nothing)+ )}}++happyReduce_21 = happyReduce 4# 9# happyReduction_21+happyReduction_21 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut23 happy_x_2 of { happy_var_2 -> + case happyOut30 happy_x_4 of { happy_var_4 -> + happyIn15+ (annotate2 happy_var_1 happy_var_4 (Channel (map unLoc happy_var_2) (Just happy_var_4))+ ) `HappyStk` happyRest}}}++happyReduce_22 = happyReduce 4# 9# happyReduction_22+happyReduction_22 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut22 happy_x_2 of { happy_var_2 -> + case happyOut20 happy_x_4 of { happy_var_4 -> + happyIn15+ (annotate2List happy_var_1 happy_var_4 (DataType (unLoc happy_var_2) happy_var_4)+ ) `HappyStk` happyRest}}}++happyReduce_23 = happySpecReduce_2 9# happyReduction_23+happyReduction_23 happy_x_2+ happy_x_1+ = case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut23 happy_x_2 of { happy_var_2 -> + happyIn15+ (annotate2List happy_var_1 happy_var_2 (External (map unLoc happy_var_2))+ )}}++happyReduce_24 = happySpecReduce_2 9# happyReduction_24+happyReduction_24 happy_x_2+ happy_x_1+ = case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut23 happy_x_2 of { happy_var_2 -> + happyIn15+ (annotate2List happy_var_1 happy_var_2 (Transparent (map unLoc happy_var_2))+ )}}++happyReduce_25 = happySpecReduce_2 9# happyReduction_25+happyReduction_25 happy_x_2+ happy_x_1+ = case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut16 happy_x_2 of { happy_var_2 -> + happyIn15+ (annotate happy_var_1 (Assert happy_var_2)+ )}}++happyReduce_26 = happyReduce 4# 9# happyReduction_26+happyReduction_26 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut22 happy_x_2 of { happy_var_2 -> + case happyOut30 happy_x_4 of { happy_var_4 -> + happyIn15+ (annotate2 happy_var_1 happy_var_4 (NameType (unLoc happy_var_2) happy_var_4)+ ) `HappyStk` happyRest}}}++happyReduce_27 = happySpecReduce_3 10# happyReduction_27+happyReduction_27 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut30 happy_x_1 of { happy_var_1 -> + case happyOutTok happy_x_2 of { happy_var_2 -> + case happyOut30 happy_x_3 of { happy_var_3 -> + happyIn16+ ((Refinement happy_var_1 (getRefinesModel happy_var_2) happy_var_3 [])+ )}}}++happyReduce_28 = happyReduce 4# 10# happyReduction_28+happyReduction_28 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOut30 happy_x_1 of { happy_var_1 -> + case happyOutTok happy_x_2 of { happy_var_2 -> + case happyOut30 happy_x_3 of { happy_var_3 -> + case happyOut18 happy_x_4 of { happy_var_4 -> + happyIn16+ ((Refinement happy_var_1 (getRefinesModel happy_var_2) happy_var_3 [happy_var_4])+ ) `HappyStk` happyRest}}}}++happyReduce_29 = happySpecReduce_2 10# happyReduction_29+happyReduction_29 happy_x_2+ happy_x_1+ = case happyOut30 happy_x_1 of { happy_var_1 -> + case happyOut17 happy_x_2 of { happy_var_2 -> + happyIn16+ ((PropertyCheck happy_var_1 happy_var_2 Nothing)+ )}}++happyReduce_30 = happySpecReduce_3 10# happyReduction_30+happyReduction_30 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut30 happy_x_1 of { happy_var_1 -> + case happyOut17 happy_x_2 of { happy_var_2 -> + case happyOutTok happy_x_3 of { happy_var_3 -> + happyIn16+ ((PropertyCheck happy_var_1 happy_var_2 (Just (getPropModel happy_var_3)))+ )}}}++happyReduce_31 = happySpecReduce_1 11# happyReduction_31+happyReduction_31 happy_x_1+ = happyIn17+ (DeadlockFreedom+ )++happyReduce_32 = happySpecReduce_1 11# happyReduction_32+happyReduction_32 happy_x_1+ = happyIn17+ (LivelockFreedom+ )++happyReduce_33 = happySpecReduce_1 11# happyReduction_33+happyReduction_33 happy_x_1+ = happyIn17+ (LivelockFreedom+ )++happyReduce_34 = happySpecReduce_1 11# happyReduction_34+happyReduction_34 happy_x_1+ = happyIn17+ (Deterministic+ )++happyReduce_35 = happySpecReduce_2 12# happyReduction_35+happyReduction_35 happy_x_2+ happy_x_1+ = case happyOut30 happy_x_2 of { happy_var_2 -> + happyIn18+ (TauPriority happy_var_2+ )}++happyReduce_36 = happySpecReduce_3 13# happyReduction_36+happyReduction_36 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut22 happy_x_1 of { happy_var_1 -> + case happyOut30 happy_x_3 of { happy_var_3 -> + happyIn19+ (annotate2 happy_var_1 happy_var_3 (DataTypeClause (unLoc happy_var_1) (Just happy_var_3))+ )}}++happyReduce_37 = happySpecReduce_1 13# happyReduction_37+happyReduction_37 happy_x_1+ = case happyOut22 happy_x_1 of { happy_var_1 -> + happyIn19+ (annotate happy_var_1 (DataTypeClause (unLoc happy_var_1) Nothing)+ )}++happyReduce_38 = happySpecReduce_1 14# happyReduction_38+happyReduction_38 happy_x_1+ = case happyOut21 happy_x_1 of { happy_var_1 -> + happyIn20+ (reverse happy_var_1+ )}++happyReduce_39 = happySpecReduce_1 15# happyReduction_39+happyReduction_39 happy_x_1+ = case happyOut19 happy_x_1 of { happy_var_1 -> + happyIn21+ ([happy_var_1]+ )}++happyReduce_40 = happySpecReduce_3 15# happyReduction_40+happyReduction_40 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut21 happy_x_1 of { happy_var_1 -> + case happyOut19 happy_x_3 of { happy_var_3 -> + happyIn21+ (happy_var_3:happy_var_1+ )}}++happyReduce_41 = happySpecReduce_1 16# happyReduction_41+happyReduction_41 happy_x_1+ = case happyOutTok happy_x_1 of { happy_var_1 -> + happyIn22+ (liftLoc happy_var_1 (Name (getName happy_var_1))+ )}++happyReduce_42 = happySpecReduce_1 17# happyReduction_42+happyReduction_42 happy_x_1+ = case happyOut24 happy_x_1 of { happy_var_1 -> + happyIn23+ (reverse happy_var_1+ )}++happyReduce_43 = happySpecReduce_1 18# happyReduction_43+happyReduction_43 happy_x_1+ = case happyOut22 happy_x_1 of { happy_var_1 -> + happyIn24+ ([happy_var_1]+ )}++happyReduce_44 = happySpecReduce_3 18# happyReduction_44+happyReduction_44 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut24 happy_x_1 of { happy_var_1 -> + case happyOut22 happy_x_3 of { happy_var_3 -> + happyIn24+ (happy_var_3:happy_var_1+ )}}++happyReduce_45 = happySpecReduce_1 19# happyReduction_45+happyReduction_45 happy_x_1+ = case happyOutTok happy_x_1 of { happy_var_1 -> + happyIn25+ (liftLoc happy_var_1 (UnQual (Name (getName happy_var_1)))+ )}++happyReduce_46 = happySpecReduce_1 20# happyReduction_46+happyReduction_46 happy_x_1+ = case happyOutTok happy_x_1 of { happy_var_1 -> + happyIn26+ (liftLoc happy_var_1 (Int (getInt happy_var_1))+ )}++happyReduce_47 = happySpecReduce_1 20# happyReduction_47+happyReduction_47 happy_x_1+ = case happyOutTok happy_x_1 of { happy_var_1 -> + happyIn26+ (liftLoc happy_var_1 (Bool True)+ )}++happyReduce_48 = happySpecReduce_1 20# happyReduction_48+happyReduction_48 happy_x_1+ = case happyOutTok happy_x_1 of { happy_var_1 -> + happyIn26+ (liftLoc happy_var_1 (Bool False)+ )}++happyReduce_49 = happySpecReduce_1 21# happyReduction_49+happyReduction_49 happy_x_1+ = case happyOut31 happy_x_1 of { happy_var_1 -> + happyIn27+ (convPat happy_var_1+ )}++happyReduce_50 = happyMonadReduce 1# 22# happyReduction_50+happyReduction_50 (happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> + ( do+ modifyTopFileParserState (+ \ st @ (FileParserState { sequenceStack = (c:cs) }) -> + st { sequenceStack = (c+1):cs })+ return happy_var_1)}+ ) (\r -> happyReturn (happyIn28 r))++happyReduce_51 = happyMonadReduce 1# 23# happyReduction_51+happyReduction_51 (happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> + ( do+ modifyTopFileParserState (+ \ st @ (FileParserState { sequenceStack = (c:cs) }) -> + st { sequenceStack = (c-1):cs })+ return happy_var_1)}+ ) (\r -> happyReturn (happyIn29 r))++happyReduce_52 = happySpecReduce_1 24# happyReduction_52+happyReduction_52 happy_x_1+ = case happyOut31 happy_x_1 of { happy_var_1 -> + happyIn30+ (checkExp happy_var_1+ )}++happyReduce_53 = happyMonadReduce 1# 25# happyReduction_53+happyReduction_53 (happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen (case happyOut32 happy_x_1 of { happy_var_1 -> + ( do+ t <- freshPType+ let An l _ e = happy_var_1+ return $ An l (Nothing, t) e)}+ ) (\r -> happyReturn (happyIn31 r))++happyReduce_54 = happySpecReduce_1 26# happyReduction_54+happyReduction_54 happy_x_1+ = case happyOut26 happy_x_1 of { happy_var_1 -> + happyIn32+ (liftLoc happy_var_1 (Lit (unLoc happy_var_1))+ )}++happyReduce_55 = happySpecReduce_1 26# happyReduction_55+happyReduction_55 happy_x_1+ = case happyOut25 happy_x_1 of { happy_var_1 -> + happyIn32+ (liftLoc happy_var_1 (Var (unLoc happy_var_1))+ )}++happyReduce_56 = happySpecReduce_3 26# happyReduction_56+happyReduction_56 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut42 happy_x_2 of { happy_var_2 -> + case happyOutTok happy_x_3 of { happy_var_3 -> + happyIn32+ (annotate2 happy_var_1 happy_var_3 (Tuple happy_var_2)+ )}}}++happyReduce_57 = happySpecReduce_3 26# happyReduction_57+happyReduction_57 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut31 happy_x_1 of { happy_var_1 -> + case happyOut31 happy_x_3 of { happy_var_3 -> + happyIn32+ (annotate2 happy_var_1 happy_var_3 (DotApp happy_var_1 happy_var_3)+ )}}++happyReduce_58 = happyReduce 4# 26# happyReduction_58+happyReduction_58 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut11 happy_x_2 of { happy_var_2 -> + case happyOut31 happy_x_4 of { happy_var_4 -> + happyIn32+ (annotate2 happy_var_1 happy_var_4 (Let (checkLetDecls happy_var_2) happy_var_4)+ ) `HappyStk` happyRest}}}++happyReduce_59 = happyReduce 6# 26# happyReduction_59+happyReduction_59 (happy_x_6 `HappyStk`+ happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut31 happy_x_2 of { happy_var_2 -> + case happyOut31 happy_x_4 of { happy_var_4 -> + case happyOut31 happy_x_6 of { happy_var_6 -> + happyIn32+ (annotate2 happy_var_1 happy_var_6 (If happy_var_2 happy_var_4 happy_var_6)+ ) `HappyStk` happyRest}}}}++happyReduce_60 = happySpecReduce_3 26# happyReduction_60+happyReduction_60 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut31 happy_x_2 of { happy_var_2 -> + case happyOutTok happy_x_3 of { happy_var_3 -> + happyIn32+ (annotate2 happy_var_1 happy_var_3 (Paren happy_var_2)+ )}}}++happyReduce_61 = happyReduce 4# 26# happyReduction_61+happyReduction_61 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOut31 happy_x_1 of { happy_var_1 -> + case happyOut44 happy_x_3 of { happy_var_3 -> + case happyOutTok happy_x_4 of { happy_var_4 -> + happyIn32+ (annotate2 happy_var_1 happy_var_4 (App happy_var_1 happy_var_3)+ ) `HappyStk` happyRest}}}++happyReduce_62 = happyReduce 4# 26# happyReduction_62+happyReduction_62 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut27 happy_x_2 of { happy_var_2 -> + case happyOut31 happy_x_4 of { happy_var_4 -> + happyIn32+ (annotate2 happy_var_1 happy_var_4 (Lambda happy_var_2 happy_var_4)+ ) `HappyStk` happyRest}}}++happyReduce_63 = happySpecReduce_3 26# happyReduction_63+happyReduction_63 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut31 happy_x_1 of { happy_var_1 -> + case happyOut31 happy_x_3 of { happy_var_3 -> + happyIn32+ (annotate2 happy_var_1 happy_var_3 (BooleanBinaryOp Equals happy_var_1 happy_var_3)+ )}}++happyReduce_64 = happySpecReduce_3 26# happyReduction_64+happyReduction_64 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut31 happy_x_1 of { happy_var_1 -> + case happyOut31 happy_x_3 of { happy_var_3 -> + happyIn32+ (annotate2 happy_var_1 happy_var_3 (BooleanBinaryOp NotEquals happy_var_1 happy_var_3)+ )}}++happyReduce_65 = happySpecReduce_3 26# happyReduction_65+happyReduction_65 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut31 happy_x_1 of { happy_var_1 -> + case happyOut31 happy_x_3 of { happy_var_3 -> + happyIn32+ (annotate2 happy_var_1 happy_var_3 (BooleanBinaryOp LessThan happy_var_1 happy_var_3)+ )}}++happyReduce_66 = happySpecReduce_3 26# happyReduction_66+happyReduction_66 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut31 happy_x_1 of { happy_var_1 -> + case happyOut31 happy_x_3 of { happy_var_3 -> + happyIn32+ (annotate2 happy_var_1 happy_var_3 (BooleanBinaryOp GreaterThan happy_var_1 happy_var_3)+ )}}++happyReduce_67 = happySpecReduce_3 26# happyReduction_67+happyReduction_67 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut31 happy_x_1 of { happy_var_1 -> + case happyOut31 happy_x_3 of { happy_var_3 -> + happyIn32+ (annotate2 happy_var_1 happy_var_3 (BooleanBinaryOp LessThanEq happy_var_1 happy_var_3)+ )}}++happyReduce_68 = happySpecReduce_3 26# happyReduction_68+happyReduction_68 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut31 happy_x_1 of { happy_var_1 -> + case happyOut31 happy_x_3 of { happy_var_3 -> + happyIn32+ (annotate2 happy_var_1 happy_var_3 (BooleanBinaryOp GreaterThanEq happy_var_1 happy_var_3)+ )}}++happyReduce_69 = happySpecReduce_2 26# happyReduction_69+happyReduction_69 happy_x_2+ happy_x_1+ = case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut31 happy_x_2 of { happy_var_2 -> + happyIn32+ (annotate2 happy_var_1 happy_var_2 (BooleanUnaryOp Not happy_var_2)+ )}}++happyReduce_70 = happySpecReduce_3 26# happyReduction_70+happyReduction_70 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut31 happy_x_1 of { happy_var_1 -> + case happyOut31 happy_x_3 of { happy_var_3 -> + happyIn32+ (annotate2 happy_var_1 happy_var_3 (BooleanBinaryOp Or happy_var_1 happy_var_3)+ )}}++happyReduce_71 = happySpecReduce_3 26# happyReduction_71+happyReduction_71 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut31 happy_x_1 of { happy_var_1 -> + case happyOut31 happy_x_3 of { happy_var_3 -> + happyIn32+ (annotate2 happy_var_1 happy_var_3 (BooleanBinaryOp And happy_var_1 happy_var_3)+ )}}++happyReduce_72 = happySpecReduce_2 26# happyReduction_72+happyReduction_72 happy_x_2+ happy_x_1+ = case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut31 happy_x_2 of { happy_var_2 -> + happyIn32+ (annotate2 happy_var_1 happy_var_2 (MathsUnaryOp Negate happy_var_2)+ )}}++happyReduce_73 = happySpecReduce_3 26# happyReduction_73+happyReduction_73 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut31 happy_x_1 of { happy_var_1 -> + case happyOut31 happy_x_3 of { happy_var_3 -> + happyIn32+ (annotate2 happy_var_1 happy_var_3 (MathsBinaryOp Plus happy_var_1 happy_var_3)+ )}}++happyReduce_74 = happySpecReduce_3 26# happyReduction_74+happyReduction_74 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut31 happy_x_1 of { happy_var_1 -> + case happyOut31 happy_x_3 of { happy_var_3 -> + happyIn32+ (annotate2 happy_var_1 happy_var_3 (MathsBinaryOp Minus happy_var_1 happy_var_3)+ )}}++happyReduce_75 = happySpecReduce_3 26# happyReduction_75+happyReduction_75 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut31 happy_x_1 of { happy_var_1 -> + case happyOut31 happy_x_3 of { happy_var_3 -> + happyIn32+ (annotate2 happy_var_1 happy_var_3 (MathsBinaryOp Mod happy_var_1 happy_var_3)+ )}}++happyReduce_76 = happySpecReduce_3 26# happyReduction_76+happyReduction_76 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut31 happy_x_1 of { happy_var_1 -> + case happyOut31 happy_x_3 of { happy_var_3 -> + happyIn32+ (annotate2 happy_var_1 happy_var_3 (MathsBinaryOp Divide happy_var_1 happy_var_3)+ )}}++happyReduce_77 = happySpecReduce_3 26# happyReduction_77+happyReduction_77 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut31 happy_x_1 of { happy_var_1 -> + case happyOut31 happy_x_3 of { happy_var_3 -> + happyIn32+ (annotate2 happy_var_1 happy_var_3 (MathsBinaryOp Times happy_var_1 happy_var_3)+ )}}++happyReduce_78 = happySpecReduce_1 26# happyReduction_78+happyReduction_78 happy_x_1+ = case happyOutTok happy_x_1 of { happy_var_1 -> + happyIn32+ (annotate happy_var_1 (List [])+ )}++happyReduce_79 = happySpecReduce_3 26# happyReduction_79+happyReduction_79 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut28 happy_x_1 of { happy_var_1 -> + case happyOut44 happy_x_2 of { happy_var_2 -> + case happyOut29 happy_x_3 of { happy_var_3 -> + happyIn32+ (annotate2 happy_var_1 happy_var_3 (List happy_var_2)+ )}}}++happyReduce_80 = happyReduce 5# 26# happyReduction_80+happyReduction_80 (happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOut28 happy_x_1 of { happy_var_1 -> + case happyOut44 happy_x_2 of { happy_var_2 -> + case happyOut48 happy_x_4 of { happy_var_4 -> + case happyOut29 happy_x_5 of { happy_var_5 -> + happyIn32+ (annotate2 happy_var_1 happy_var_5 (ListComp happy_var_2 happy_var_4)+ ) `HappyStk` happyRest}}}}++happyReduce_81 = happyReduce 4# 26# happyReduction_81+happyReduction_81 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOut28 happy_x_1 of { happy_var_1 -> + case happyOut31 happy_x_2 of { happy_var_2 -> + case happyOut29 happy_x_4 of { happy_var_4 -> + happyIn32+ (annotate2 happy_var_1 happy_var_4 (ListEnumFrom happy_var_2)+ ) `HappyStk` happyRest}}}++happyReduce_82 = happyReduce 5# 26# happyReduction_82+happyReduction_82 (happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOut28 happy_x_1 of { happy_var_1 -> + case happyOut31 happy_x_2 of { happy_var_2 -> + case happyOut31 happy_x_4 of { happy_var_4 -> + case happyOut29 happy_x_5 of { happy_var_5 -> + happyIn32+ (annotate2 happy_var_1 happy_var_5 (ListEnumFromTo happy_var_2 happy_var_4)+ ) `HappyStk` happyRest}}}}++happyReduce_83 = happySpecReduce_3 26# happyReduction_83+happyReduction_83 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut31 happy_x_1 of { happy_var_1 -> + case happyOut31 happy_x_3 of { happy_var_3 -> + happyIn32+ (annotate2 happy_var_1 happy_var_3 (Concat happy_var_1 happy_var_3)+ )}}++happyReduce_84 = happySpecReduce_2 26# happyReduction_84+happyReduction_84 happy_x_2+ happy_x_1+ = case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut31 happy_x_2 of { happy_var_2 -> + happyIn32+ (annotate2 happy_var_1 happy_var_2 (ListLength happy_var_2)+ )}}++happyReduce_85 = happySpecReduce_3 26# happyReduction_85+happyReduction_85 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut44 happy_x_2 of { happy_var_2 -> + case happyOutTok happy_x_3 of { happy_var_3 -> + happyIn32+ (annotate2 happy_var_1 happy_var_3 (Set happy_var_2)+ )}}}++happyReduce_86 = happyReduce 5# 26# happyReduction_86+happyReduction_86 (happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut44 happy_x_2 of { happy_var_2 -> + case happyOut48 happy_x_4 of { happy_var_4 -> + case happyOutTok happy_x_5 of { happy_var_5 -> + happyIn32+ (annotate2 happy_var_1 happy_var_5 (SetComp happy_var_2 happy_var_4)+ ) `HappyStk` happyRest}}}}++happyReduce_87 = happyReduce 4# 26# happyReduction_87+happyReduction_87 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut31 happy_x_2 of { happy_var_2 -> + case happyOutTok happy_x_4 of { happy_var_4 -> + happyIn32+ (annotate2 happy_var_1 happy_var_4 (SetEnumFrom happy_var_2)+ ) `HappyStk` happyRest}}}++happyReduce_88 = happyReduce 5# 26# happyReduction_88+happyReduction_88 (happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut31 happy_x_2 of { happy_var_2 -> + case happyOut31 happy_x_4 of { happy_var_4 -> + case happyOutTok happy_x_5 of { happy_var_5 -> + happyIn32+ (annotate2 happy_var_1 happy_var_5 (SetEnumFromTo happy_var_2 happy_var_4)+ ) `HappyStk` happyRest}}}}++happyReduce_89 = happySpecReduce_3 26# happyReduction_89+happyReduction_89 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut44 happy_x_2 of { happy_var_2 -> + case happyOutTok happy_x_3 of { happy_var_3 -> + happyIn32+ (annotate2 happy_var_1 happy_var_3 (SetEnum happy_var_2)+ )}}}++happyReduce_90 = happyReduce 5# 26# happyReduction_90+happyReduction_90 (happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut44 happy_x_2 of { happy_var_2 -> + case happyOut48 happy_x_4 of { happy_var_4 -> + case happyOutTok happy_x_5 of { happy_var_5 -> + happyIn32+ (annotate2 happy_var_1 happy_var_5 (SetEnumComp happy_var_2 happy_var_4)+ ) `HappyStk` happyRest}}}}++happyReduce_91 = happySpecReduce_1 26# happyReduction_91+happyReduction_91 happy_x_1+ = case happyOutTok happy_x_1 of { happy_var_1 -> + happyIn32+ (liftLoc happy_var_1 (ExpPatWildCard)+ )}++happyReduce_92 = happySpecReduce_3 26# happyReduction_92+happyReduction_92 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut31 happy_x_1 of { happy_var_1 -> + case happyOut31 happy_x_3 of { happy_var_3 -> + happyIn32+ (liftLoc happy_var_1 (ExpPatDoublePattern happy_var_1 happy_var_3)+ )}}++happyReduce_93 = happyReduce 4# 26# happyReduction_93+happyReduction_93 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOut31 happy_x_1 of { happy_var_1 -> + case happyOut40 happy_x_2 of { happy_var_2 -> + case happyOut31 happy_x_4 of { happy_var_4 -> + happyIn32+ (annotate2 happy_var_1 happy_var_4 (Prefix happy_var_1 happy_var_2 happy_var_4)+ ) `HappyStk` happyRest}}}++happyReduce_94 = happySpecReduce_3 26# happyReduction_94+happyReduction_94 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut31 happy_x_1 of { happy_var_1 -> + case happyOut31 happy_x_3 of { happy_var_3 -> + happyIn32+ (annotate2 happy_var_1 happy_var_3 (Prefix happy_var_1 [] happy_var_3)+ )}}++happyReduce_95 = happySpecReduce_3 26# happyReduction_95+happyReduction_95 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut31 happy_x_1 of { happy_var_1 -> + case happyOut31 happy_x_3 of { happy_var_3 -> + happyIn32+ (annotate2 happy_var_1 happy_var_3 (ExternalChoice happy_var_1 happy_var_3)+ )}}++happyReduce_96 = happySpecReduce_3 26# happyReduction_96+happyReduction_96 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut31 happy_x_1 of { happy_var_1 -> + case happyOut31 happy_x_3 of { happy_var_3 -> + happyIn32+ (annotate2 happy_var_1 happy_var_3 (Hiding happy_var_1 happy_var_3)+ )}}++happyReduce_97 = happySpecReduce_3 26# happyReduction_97+happyReduction_97 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut31 happy_x_1 of { happy_var_1 -> + case happyOut31 happy_x_3 of { happy_var_3 -> + happyIn32+ (annotate2 happy_var_1 happy_var_3 (InternalChoice happy_var_1 happy_var_3)+ )}}++happyReduce_98 = happySpecReduce_3 26# happyReduction_98+happyReduction_98 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut31 happy_x_1 of { happy_var_1 -> + case happyOut31 happy_x_3 of { happy_var_3 -> + happyIn32+ (annotate2 happy_var_1 happy_var_3 (Interleave happy_var_1 happy_var_3)+ )}}++happyReduce_99 = happyReduce 5# 26# happyReduction_99+happyReduction_99 (happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOut31 happy_x_1 of { happy_var_1 -> + case happyOut31 happy_x_3 of { happy_var_3 -> + case happyOut31 happy_x_5 of { happy_var_5 -> + happyIn32+ (annotate2 happy_var_1 happy_var_5 (GenParallel happy_var_1 happy_var_3 happy_var_5)+ ) `HappyStk` happyRest}}}++happyReduce_100 = happyReduce 7# 26# happyReduction_100+happyReduction_100 (happy_x_7 `HappyStk`+ happy_x_6 `HappyStk`+ happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOut31 happy_x_1 of { happy_var_1 -> + case happyOut31 happy_x_3 of { happy_var_3 -> + case happyOut31 happy_x_5 of { happy_var_5 -> + case happyOut31 happy_x_7 of { happy_var_7 -> + happyIn32+ (annotate2 happy_var_1 happy_var_7 (AlphaParallel happy_var_1 happy_var_3 happy_var_5 happy_var_7)+ ) `HappyStk` happyRest}}}}++happyReduce_101 = happySpecReduce_3 26# happyReduction_101+happyReduction_101 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut31 happy_x_1 of { happy_var_1 -> + case happyOut31 happy_x_3 of { happy_var_3 -> + happyIn32+ (annotate2 happy_var_1 happy_var_3 (Interrupt happy_var_1 happy_var_3)+ )}}++happyReduce_102 = happyReduce 5# 26# happyReduction_102+happyReduction_102 (happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOut31 happy_x_1 of { happy_var_1 -> + case happyOut31 happy_x_3 of { happy_var_3 -> + case happyOut31 happy_x_5 of { happy_var_5 -> + happyIn32+ (annotate2 happy_var_1 happy_var_5 (Exception happy_var_1 happy_var_3 happy_var_5)+ ) `HappyStk` happyRest}}}++happyReduce_103 = happySpecReduce_3 26# happyReduction_103+happyReduction_103 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut31 happy_x_1 of { happy_var_1 -> + case happyOut31 happy_x_3 of { happy_var_3 -> + happyIn32+ (annotate2 happy_var_1 happy_var_3 (SlidingChoice happy_var_1 happy_var_3)+ )}}++happyReduce_104 = happySpecReduce_3 26# happyReduction_104+happyReduction_104 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut31 happy_x_1 of { happy_var_1 -> + case happyOut31 happy_x_3 of { happy_var_3 -> + happyIn32+ (annotate2 happy_var_1 happy_var_3 (SequentialComp happy_var_1 happy_var_3)+ )}}++happyReduce_105 = happySpecReduce_3 26# happyReduction_105+happyReduction_105 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut31 happy_x_1 of { happy_var_1 -> + case happyOut31 happy_x_3 of { happy_var_3 -> + happyIn32+ (annotate2 happy_var_1 happy_var_3 (GuardedExp happy_var_1 happy_var_3)+ )}}++happyReduce_106 = happyReduce 5# 26# happyReduction_106+happyReduction_106 (happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOut31 happy_x_1 of { happy_var_1 -> + case happyOut35 happy_x_3 of { happy_var_3 -> + case happyOut46 happy_x_4 of { happy_var_4 -> + case happyOutTok happy_x_5 of { happy_var_5 -> + happyIn32+ (annotate2 happy_var_1 happy_var_5 (Rename happy_var_1 happy_var_3 happy_var_4)+ ) `HappyStk` happyRest}}}}++happyReduce_107 = happyReduce 6# 26# happyReduction_107+happyReduction_107 (happy_x_6 `HappyStk`+ happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOut31 happy_x_1 of { happy_var_1 -> + case happyOut38 happy_x_3 of { happy_var_3 -> + case happyOut46 happy_x_4 of { happy_var_4 -> + case happyOut31 happy_x_6 of { happy_var_6 -> + happyIn32+ (annotate2 happy_var_1 happy_var_6 (LinkParallel happy_var_1 happy_var_3 happy_var_4 happy_var_6)+ ) `HappyStk` happyRest}}}}++happyReduce_108 = happyReduce 4# 26# happyReduction_108+happyReduction_108 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut48 happy_x_2 of { happy_var_2 -> + case happyOut31 happy_x_4 of { happy_var_4 -> + happyIn32+ (annotate2 happy_var_1 happy_var_4 (ReplicatedInterleave happy_var_2 happy_var_4)+ ) `HappyStk` happyRest}}}++happyReduce_109 = happyReduce 4# 26# happyReduction_109+happyReduction_109 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut48 happy_x_2 of { happy_var_2 -> + case happyOut31 happy_x_4 of { happy_var_4 -> + happyIn32+ (annotate2 happy_var_1 happy_var_4 (ReplicatedExternalChoice happy_var_2 happy_var_4)+ ) `HappyStk` happyRest}}}++happyReduce_110 = happyReduce 4# 26# happyReduction_110+happyReduction_110 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut48 happy_x_2 of { happy_var_2 -> + case happyOut31 happy_x_4 of { happy_var_4 -> + happyIn32+ (annotate2 happy_var_1 happy_var_4 (ReplicatedInternalChoice happy_var_2 happy_var_4)+ ) `HappyStk` happyRest}}}++happyReduce_111 = happyReduce 7# 26# happyReduction_111+happyReduction_111 (happy_x_7 `HappyStk`+ happy_x_6 `HappyStk`+ happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut48 happy_x_2 of { happy_var_2 -> + case happyOut31 happy_x_5 of { happy_var_5 -> + case happyOut31 happy_x_7 of { happy_var_7 -> + happyIn32+ (annotate2 happy_var_1 happy_var_7 (ReplicatedAlphaParallel happy_var_2 happy_var_5 happy_var_7)+ ) `HappyStk` happyRest}}}}++happyReduce_112 = happyReduce 6# 26# happyReduction_112+happyReduction_112 (happy_x_6 `HappyStk`+ happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut31 happy_x_2 of { happy_var_2 -> + case happyOut48 happy_x_4 of { happy_var_4 -> + case happyOut31 happy_x_6 of { happy_var_6 -> + happyIn32+ (annotate2 happy_var_1 happy_var_6 (ReplicatedParallel happy_var_2 happy_var_4 happy_var_6)+ ) `HappyStk` happyRest}}}}++happyReduce_113 = happyReduce 6# 26# happyReduction_113+happyReduction_113 (happy_x_6 `HappyStk`+ happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut38 happy_x_2 of { happy_var_2 -> + case happyOut48 happy_x_4 of { happy_var_4 -> + case happyOut31 happy_x_6 of { happy_var_6 -> + happyIn32+ (annotate2 happy_var_1 happy_var_6 (ReplicatedLinkParallel happy_var_2 happy_var_4 happy_var_6)+ ) `HappyStk` happyRest}}}}++happyReduce_114 = happySpecReduce_2 27# happyReduction_114+happyReduction_114 happy_x_2+ happy_x_1+ = case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut31 happy_x_2 of { happy_var_2 -> + happyIn33+ (annotate2 happy_var_1 happy_var_2 (Input (convPat happy_var_2) Nothing)+ )}}++happyReduce_115 = happyReduce 4# 27# happyReduction_115+happyReduction_115 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut31 happy_x_2 of { happy_var_2 -> + case happyOut31 happy_x_4 of { happy_var_4 -> + happyIn33+ (annotate2 happy_var_1 happy_var_4 (Input (convPat happy_var_2) (Just (checkExp happy_var_4)))+ ) `HappyStk` happyRest}}}++happyReduce_116 = happySpecReduce_2 27# happyReduction_116+happyReduction_116 happy_x_2+ happy_x_1+ = case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut31 happy_x_2 of { happy_var_2 -> + happyIn33+ (annotate2 happy_var_1 happy_var_2 (NonDetInput (convPat happy_var_2) Nothing)+ )}}++happyReduce_117 = happyReduce 4# 27# happyReduction_117+happyReduction_117 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut31 happy_x_2 of { happy_var_2 -> + case happyOut31 happy_x_4 of { happy_var_4 -> + happyIn33+ (annotate2 happy_var_1 happy_var_4 (NonDetInput (convPat happy_var_2) (Just (checkExp happy_var_4)))+ ) `HappyStk` happyRest}}}++happyReduce_118 = happySpecReduce_2 27# happyReduction_118+happyReduction_118 happy_x_2+ happy_x_1+ = case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut31 happy_x_2 of { happy_var_2 -> + happyIn33+ (annotate2 happy_var_1 happy_var_2 (Output (checkExp happy_var_2))+ )}}++happyReduce_119 = happySpecReduce_3 28# happyReduction_119+happyReduction_119 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut30 happy_x_1 of { happy_var_1 -> + case happyOut30 happy_x_3 of { happy_var_3 -> + happyIn34+ ((happy_var_1, happy_var_3)+ )}}++happyReduce_120 = happySpecReduce_1 29# happyReduction_120+happyReduction_120 happy_x_1+ = case happyOut36 happy_x_1 of { happy_var_1 -> + happyIn35+ (reverse happy_var_1+ )}++happyReduce_121 = happySpecReduce_1 30# happyReduction_121+happyReduction_121 happy_x_1+ = case happyOut34 happy_x_1 of { happy_var_1 -> + happyIn36+ ([happy_var_1]+ )}++happyReduce_122 = happySpecReduce_3 30# happyReduction_122+happyReduction_122 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut36 happy_x_1 of { happy_var_1 -> + case happyOut34 happy_x_3 of { happy_var_3 -> + happyIn36+ (happy_var_3:happy_var_1+ )}}++happyReduce_123 = happySpecReduce_3 31# happyReduction_123+happyReduction_123 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut30 happy_x_1 of { happy_var_1 -> + case happyOut30 happy_x_3 of { happy_var_3 -> + happyIn37+ ((happy_var_1, happy_var_3)+ )}}++happyReduce_124 = happySpecReduce_1 32# happyReduction_124+happyReduction_124 happy_x_1+ = case happyOut39 happy_x_1 of { happy_var_1 -> + happyIn38+ (reverse happy_var_1+ )}++happyReduce_125 = happySpecReduce_1 33# happyReduction_125+happyReduction_125 happy_x_1+ = case happyOut37 happy_x_1 of { happy_var_1 -> + happyIn39+ ([happy_var_1]+ )}++happyReduce_126 = happySpecReduce_3 33# happyReduction_126+happyReduction_126 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut39 happy_x_1 of { happy_var_1 -> + case happyOut37 happy_x_3 of { happy_var_3 -> + happyIn39+ (happy_var_3:happy_var_1+ )}}++happyReduce_127 = happySpecReduce_1 34# happyReduction_127+happyReduction_127 happy_x_1+ = case happyOut41 happy_x_1 of { happy_var_1 -> + happyIn40+ (reverse happy_var_1+ )}++happyReduce_128 = happySpecReduce_1 35# happyReduction_128+happyReduction_128 happy_x_1+ = case happyOut33 happy_x_1 of { happy_var_1 -> + happyIn41+ ([happy_var_1]+ )}++happyReduce_129 = happySpecReduce_2 35# happyReduction_129+happyReduction_129 happy_x_2+ happy_x_1+ = case happyOut41 happy_x_1 of { happy_var_1 -> + case happyOut33 happy_x_2 of { happy_var_2 -> + happyIn41+ (happy_var_2:happy_var_1+ )}}++happyReduce_130 = happySpecReduce_3 36# happyReduction_130+happyReduction_130 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut31 happy_x_1 of { happy_var_1 -> + case happyOut45 happy_x_3 of { happy_var_3 -> + happyIn42+ (happy_var_1:(reverse happy_var_3)+ )}}++happyReduce_131 = happySpecReduce_1 37# happyReduction_131+happyReduction_131 happy_x_1+ = case happyOut45 happy_x_1 of { happy_var_1 -> + happyIn43+ (reverse happy_var_1+ )}++happyReduce_132 = happySpecReduce_0 38# happyReduction_132+happyReduction_132 = happyIn44+ ([]+ )++happyReduce_133 = happySpecReduce_1 38# happyReduction_133+happyReduction_133 happy_x_1+ = case happyOut45 happy_x_1 of { happy_var_1 -> + happyIn44+ (reverse happy_var_1+ )}++happyReduce_134 = happySpecReduce_3 39# happyReduction_134+happyReduction_134 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut45 happy_x_1 of { happy_var_1 -> + case happyOut31 happy_x_3 of { happy_var_3 -> + happyIn45+ (happy_var_3:happy_var_1+ )}}++happyReduce_135 = happySpecReduce_1 39# happyReduction_135+happyReduction_135 happy_x_1+ = case happyOut31 happy_x_1 of { happy_var_1 -> + happyIn45+ ([happy_var_1]+ )}++happyReduce_136 = happySpecReduce_0 40# happyReduction_136+happyReduction_136 = happyIn46+ ([]+ )++happyReduce_137 = happySpecReduce_2 40# happyReduction_137+happyReduction_137 happy_x_2+ happy_x_1+ = case happyOut48 happy_x_2 of { happy_var_2 -> + happyIn46+ (happy_var_2+ )}++happyReduce_138 = happySpecReduce_3 41# happyReduction_138+happyReduction_138 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut27 happy_x_1 of { happy_var_1 -> + case happyOut31 happy_x_3 of { happy_var_3 -> + happyIn47+ (annotate2 happy_var_1 happy_var_3 (Generator happy_var_1 happy_var_3)+ )}}++happyReduce_139 = happySpecReduce_3 41# happyReduction_139+happyReduction_139 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut27 happy_x_1 of { happy_var_1 -> + case happyOut31 happy_x_3 of { happy_var_3 -> + happyIn47+ (annotate2 happy_var_1 happy_var_3 (Generator happy_var_1 happy_var_3)+ )}}++happyReduce_140 = happySpecReduce_1 41# happyReduction_140+happyReduction_140 happy_x_1+ = case happyOut31 happy_x_1 of { happy_var_1 -> + happyIn47+ (annotate happy_var_1 (Qualifier happy_var_1)+ )}++happyReduce_141 = happySpecReduce_1 42# happyReduction_141+happyReduction_141 happy_x_1+ = case happyOut49 happy_x_1 of { happy_var_1 -> + happyIn48+ (reverse happy_var_1+ )}++happyReduce_142 = happySpecReduce_3 43# happyReduction_142+happyReduction_142 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut49 happy_x_1 of { happy_var_1 -> + case happyOut47 happy_x_3 of { happy_var_3 -> + happyIn49+ (happy_var_3:happy_var_1+ )}}++happyReduce_143 = happySpecReduce_1 43# happyReduction_143+happyReduction_143 happy_x_1+ = case happyOut47 happy_x_1 of { happy_var_1 -> + happyIn49+ ([happy_var_1]+ )}++happyNewToken action sts stk+ = getNextTokenWrapper(\tk -> + let cont i = happyDoAction i tk action sts stk in+ case tk of {+ L _ TEOF -> happyDoAction 79# tk action sts stk;+ L _ (TInteger _) -> cont 1#;+ L _ (TIdent _) -> cont 2#;+ L _ TNewLine -> cont 3#;+ L _ TFalse -> cont 4#;+ L _ TTrue -> cont 5#;+ L _ TDefineEqual -> cont 6#;+ L _ TComma -> cont 7#;+ L _ TDot -> cont 8#;+ L _ TQuestionMark -> cont 9#;+ L _ TDollar -> cont 10#;+ L _ TExclamationMark -> cont 11#;+ L _ TDoubleDot -> cont 12#;+ L _ TColon -> cont 13#;+ L _ TDrawnFrom -> cont 14#;+ L _ TTie -> cont 15#;+ L _ TPipe -> cont 16#;+ L _ TDoubleAt -> cont 17#;+ L _ TWildCard -> cont 18#;+ L _ TIf -> cont 19#;+ L _ TThen -> cont 20#;+ L _ TElse -> cont 21#;+ L _ TLet -> cont 22#;+ L _ TWithin -> cont 23#;+ L _ TBackSlash -> cont 24#;+ L _ TLambdaDot -> cont 25#;+ L _ TChannel -> cont 26#;+ L _ TDataType -> cont 27#;+ L _ TExternal -> cont 28#;+ L _ TTransparent -> cont 29#;+ L _ TNameType -> cont 30#;+ L _ TAssert -> cont 31#;+ L _ TDeadlockFree -> cont 32#;+ L _ TLivelockFree -> cont 33#;+ L _ TDivergenceFree -> cont 34#;+ L _ TDeterministic -> cont 35#;+ L _ TTauPriority -> cont 36#;+ L _ (TRefines _) -> cont 37#;+ L _ (TModel _) -> cont 38#;+ L _ TNot -> cont 39#;+ L _ TAnd -> cont 40#;+ L _ TOr -> cont 41#;+ L _ TEq -> cont 42#;+ L _ TNotEq -> cont 43#;+ L _ TLtEq -> cont 44#;+ L _ TGtEq -> cont 45#;+ L _ TEmptySeq -> cont 46#;+ L _ TLt -> cont 47#;+ L _ TGt -> cont 48#;+ L _ TCloseSeq -> cont 49#;+ L _ TPlus -> cont 50#;+ L _ TMinus -> cont 51#;+ L _ TTimes -> cont 52#;+ L _ TDivide -> cont 53#;+ L _ TMod -> cont 54#;+ L _ TConcat -> cont 55#;+ L _ THash -> cont 56#;+ L _ TLParen -> cont 57#;+ L _ TRParen -> cont 58#;+ L _ TLBrace -> cont 59#;+ L _ TRBrace -> cont 60#;+ L _ TLPipeBrace -> cont 61#;+ L _ TRPipeBrace -> cont 62#;+ L _ TLDoubleSqBracket -> cont 63#;+ L _ TRDoubleSqBracket -> cont 64#;+ L _ TLPipeSqBracket -> cont 65#;+ L _ TRPipeSqBracket -> cont 66#;+ L _ TLSqBracket -> cont 67#;+ L _ TRSqBracket -> cont 68#;+ L _ TExtChoice -> cont 69#;+ L _ TIntChoice -> cont 70#;+ L _ TInterleave -> cont 71#;+ L _ TPrefix -> cont 72#;+ L _ TInterrupt -> cont 73#;+ L _ TSlidingChoice -> cont 74#;+ L _ TRException -> cont 75#;+ L _ TParallel -> cont 76#;+ L _ TSemiColon -> cont 77#;+ L _ TGuard -> cont 78#;+ _ -> happyError' tk+ })++happyError_ tk = happyError' tk++happyThen :: () => ParseMonad a -> (a -> ParseMonad b) -> ParseMonad b+happyThen = (>>=)+happyReturn :: () => a -> ParseMonad a+happyReturn = (return)+happyThen1 = happyThen+happyReturn1 :: () => a -> ParseMonad a+happyReturn1 = happyReturn+happyError' :: () => (LToken) -> ParseMonad a+happyError' tk = parseError tk++parseFile_ = happySomeParser where+ happySomeParser = happyThen (happyParse 0#) (\x -> happyReturn (happyOut6 x))++parseInteractiveStmt_ = happySomeParser where+ happySomeParser = happyThen (happyParse 1#) (\x -> happyReturn (happyOut7 x))++parseExpression_ = happySomeParser where+ happySomeParser = happyThen (happyParse 2#) (\x -> happyReturn (happyOut31 x))++happySeq = happyDontSeq+++combineDecls :: [PDecl] -> [PDecl]+combineDecls [] = []+combineDecls ((An loc1 b (FunBind n ms)):(An loc2 c (FunBind n' ms')):ds) | n == n' = + combineDecls $ (An (combineSpans loc1 loc2) b (FunBind n (ms++ms'))):ds+combineDecls (d:ds) = d:combineDecls ds++convDecl :: PExp -> PExp -> ParseMonad PDecl+convDecl (lhs @ (An loc1 b lhsexp)) (rhs @ (An loc2 d _)) = + let+ span = combineSpans loc1 loc2++ -- REMEMBER: needs to reverse pts+ getPats :: Exp -> ([[PPat]], Name)+ getPats (App f args) = + ((map convPat args):ps, n)+ where+ (ps, n) = getPats (unAnnotate f)+ getPats (Var (UnQual n)) = ([], n)+ + convFunBind exp = + FunBind n [An span (dummyAnnotation) (Match (reverse ps) rhs)]+ where+ (ps, n) = getPats exp++ convPatBind exp = PatBind (convPat exp) rhs+ in do+ symbTable <- freshPSymbolTable+ case lhsexp of+ App f args -> return $ An span (Nothing, symbTable) (convFunBind lhsexp)+ _ -> return $ An span (Nothing, symbTable) (convPatBind lhs)++-- | Throws an error if a declaration that is not allowed inside a let +-- expression is found.+checkLetDecls :: [PDecl] -> [PDecl]+checkLetDecls decls = map checkDecl decls+ where+ checkDecl :: PDecl -> PDecl+ checkDecl (anDecl@(An _ _ decl)) =+ let+ check (FunBind a b) = anDecl+ check (PatBind a b) = anDecl+ check _ = throwSourceError [invalidDeclarationErrorMessage anDecl]+ in check decl++checkExp :: PExp -> PExp+checkExp (anExp@(An a b exp)) =+ let + check :: Exp -> Exp+ check (App e es) = App (checkExp e) (map checkExp es)+ check (BooleanBinaryOp op e1 e2) = BooleanBinaryOp op (checkExp e1) (checkExp e2)+ check (BooleanUnaryOp op e) = BooleanUnaryOp op (checkExp e)+ check (Concat e1 e2) = Concat (checkExp e1) (checkExp e2)+ check (DotApp e1 e2) = DotApp (checkExp e1) (checkExp e2)+ check (If e1 e2 e3) = If (checkExp e1) (checkExp e2) (checkExp e3)+ check (Lambda p e) = Lambda p (checkExp e)+ check (Let decls e) = Let decls (checkExp e)+ check (Lit lit) = Lit lit+ check (List es) = List (map checkExp es)+ check (ListComp es stmts) = ListComp (map checkExp es) stmts+ check (ListEnumFrom e) = ListEnumFrom (checkExp e)+ check (ListEnumFromTo e1 e2) = ListEnumFromTo (checkExp e1) (checkExp e2)+ check (ListLength e) = ListLength (checkExp e)+ check (MathsBinaryOp op e1 e2) = MathsBinaryOp op (checkExp e1) (checkExp e2)+ check (MathsUnaryOp op e) = MathsUnaryOp op (checkExp e)+ check (Paren e) = Paren (checkExp e)+ check (Set es) = Set (map checkExp es)+ check (SetComp es stmts) = SetComp (map checkExp es) stmts+ check (SetEnumFrom e) = SetEnumFrom (checkExp e)+ check (SetEnumFromTo e1 e2) = SetEnumFromTo (checkExp e1) (checkExp e2)+ check (SetEnum es) = SetEnum (map checkExp es)+ -- We don't need to check inside stmts as they will have been checked+ -- upon creation+ check (SetEnumComp es stmts) = SetEnumComp (map checkExp es) stmts+ check (Tuple es) = Tuple (map checkExp es)+ check (Var qname) = Var qname++ check (AlphaParallel e1 e2 e3 e4) = + AlphaParallel (checkExp e1) (checkExp e2) (checkExp e3) (checkExp e4)+ check (Exception e1 e2 e3) = Exception (checkExp e1) (checkExp e2) (checkExp e3)+ check (ExternalChoice e1 e2) = ExternalChoice (checkExp e1) (checkExp e2)+ check (GenParallel e1 e2 e3) = GenParallel (checkExp e1) (checkExp e2) (checkExp e3)+ check (GuardedExp e1 e2) = GuardedExp (checkExp e1) (checkExp e2)+ check (Hiding e1 e2) = Hiding (checkExp e1) (checkExp e2)+ check (InternalChoice e1 e2) = InternalChoice (checkExp e1) (checkExp e2)+ check (Interrupt e1 e2) = Interrupt (checkExp e1) (checkExp e2)+ check (Interleave e1 e2) = Interleave (checkExp e1) (checkExp e2)+ check (LinkParallel e1 ties stmts e2) = + LinkParallel (checkExp e1) ties stmts (checkExp e2)+ check (Prefix e1 fields e2) = Prefix (checkExp e1) fields (checkExp e2)+ check (Rename e ties stmts) = Rename (checkExp e) ties stmts+ check (SequentialComp e1 e2) = SequentialComp (checkExp e1) (checkExp e2)+ check (SlidingChoice e1 e2) = SlidingChoice (checkExp e1) (checkExp e2)++ check (ReplicatedAlphaParallel stmts e1 e2) = + ReplicatedAlphaParallel stmts (checkExp e1) (checkExp e2)+ check (ReplicatedInterleave stmts e1) = ReplicatedInterleave stmts (checkExp e1)+ check (ReplicatedExternalChoice stmts e1) = ReplicatedExternalChoice stmts (checkExp e1)+ check (ReplicatedInternalChoice stmts e1) = ReplicatedInternalChoice stmts (checkExp e1)+ check (ReplicatedParallel e1 stmts e2) = + ReplicatedParallel (checkExp e1) stmts (checkExp e2)+ check (ReplicatedLinkParallel ties stmts e) = + ReplicatedLinkParallel ties stmts (checkExp e)+ + check x = throwSourceError [invalidExpressionErrorMessage anExp]+ in+ An a b (check exp)++dotAppToList :: PExp -> [PExp]+dotAppToList (An a b exp) = + let + list :: Exp -> [PExp]+ list (DotApp e1 e2) = (dotAppToList e1) ++ (dotAppToList e2)+ list x = [An a b x]+ in+ list exp++convPat :: PExp -> PPat+convPat (anExp@ (An a b exp)) = + let+ trans :: Exp -> Pat+ trans (Concat e1 e2) = PConcat (convPat e1) (convPat e2)+ trans (DotApp e1 e2) = PDotApp (convPat e1) (convPat e2)+ trans (List xs) = PList (map convPat xs)+ trans (Lit x) = PLit x+ trans (Set xs) = PSet (map convPat xs)+ trans (Paren x) = PParen (convPat x)+ trans (Tuple xs) = PTuple (map convPat xs)+ trans (Var (UnQual x)) = PVar x+ trans (ExpPatWildCard) = PWildCard+ trans (ExpPatDoublePattern e1 e2) = + PDoublePattern (convPat e1) (convPat e2)+ trans x = throwSourceError [invalidPatternErrorMessage anExp]+ in+ An a () (trans exp)++-- Helper function to get the contents of tokens+getInt (L _ (TInteger x)) = x+getName (L _ (TIdent x)) = x+getRefinesModel (L _ (TRefines x)) = x+getPropModel (L _ (TModel x)) = x++class Locatable a where+ getLoc :: a b -> SrcSpan+ unLoc :: a b -> b+ mkLoc :: SrcSpan -> b -> a b++instance Locatable Located where+ getLoc (L loc _) = loc+ unLoc (L _ b) = b+ mkLoc loc b = L loc b++instance Locatable (Annotated a) where+ getLoc (An loc _ _) = loc+ unLoc (An _ _ b) = b+ mkLoc loc b = An loc dummyAnnotation b++annotate :: (Locatable t1, Locatable t2) => t1 a -> b -> t2 b+annotate t1 b = mkLoc (getLoc t1) b++annotate2 :: + (Locatable t1, Locatable t2, Locatable t3) => t1 a -> t2 b -> c -> t3 c+annotate2 t1 t2 b = mkLoc (combineSpans (getLoc t1) (getLoc t2)) b+annotate2List :: + (Locatable t1, Locatable t2, Locatable t3) => t1 a -> [t2 b] -> c -> t3 c+annotate2List t1 t2 b = annotate2 t1 (last t2) b+annotate2List' :: + (Locatable t1, Locatable t2, Locatable t3) => [t1 a] -> t2 b -> c -> t3 c+annotate2List' t1 t2 b = annotate2 (last t1) t2 b++annotateWithSymbolTable + :: Annotated (Maybe SymbolTable, PSymbolTable) a -> ParseMonad (Annotated (Maybe SymbolTable, PSymbolTable) a)+annotateWithSymbolTable (An l _ a) = do+ symbTable <- freshPSymbolTable+ return $ An l (Nothing, symbTable) a++liftLoc :: (Locatable t1, Locatable t2) => t1 a -> b -> t2 b+liftLoc t1 b = mkLoc (getLoc t1) b++parseError :: LToken -> ParseMonad a+parseError tok = throwSourceError [parseErrorMessage tok]+{-# LINE 1 "templates/GenericTemplate.hs" #-}+{-# LINE 1 "templates/GenericTemplate.hs" #-}+{-# LINE 1 "<built-in>" #-}+{-# LINE 1 "<command-line>" #-}+{-# LINE 1 "templates/GenericTemplate.hs" #-}+-- Id: GenericTemplate.hs,v 1.26 2005/01/14 14:47:22 simonmar Exp ++{-# LINE 30 "templates/GenericTemplate.hs" #-}+++data Happy_IntList = HappyCons Happy_GHC_Exts.Int# Happy_IntList++++++{-# LINE 51 "templates/GenericTemplate.hs" #-}++{-# LINE 61 "templates/GenericTemplate.hs" #-}++{-# LINE 70 "templates/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++-- If the current token is 0#, it means we've just accepted a partial+-- parse (a %partial parser). We must ignore the saved token on the top of+-- the stack in this case.+happyAccept 0# tk st sts (_ `HappyStk` ans `HappyStk` _) =+ happyReturn1 ans+happyAccept j tk st sts (HappyStk ans _) = + (happyTcHack j (happyTcHack st)) (happyReturn1 ans)++-----------------------------------------------------------------------------+-- Arrays only: do the next action++++happyDoAction i tk st+ = {- nothing -}+++ case action of+ 0# -> {- nothing -}+ happyFail i tk st+ -1# -> {- nothing -}+ happyAccept i tk st+ n | (n Happy_GHC_Exts.<# (0# :: Happy_GHC_Exts.Int#)) -> {- nothing -}++ (happyReduceArr Happy_Data_Array.! rule) i tk st+ where rule = (Happy_GHC_Exts.I# ((Happy_GHC_Exts.negateInt# ((n Happy_GHC_Exts.+# (1# :: Happy_GHC_Exts.Int#))))))+ n -> {- nothing -}+++ happyShift new_state i tk st+ where (new_state) = (n Happy_GHC_Exts.-# (1# :: Happy_GHC_Exts.Int#))+ where (off) = indexShortOffAddr happyActOffsets st+ (off_i) = (off Happy_GHC_Exts.+# i)+ check = if (off_i Happy_GHC_Exts.>=# (0# :: Happy_GHC_Exts.Int#))+ then (indexShortOffAddr happyCheck off_i Happy_GHC_Exts.==# i)+ else False+ (action)+ | check = indexShortOffAddr happyTable off_i+ | otherwise = indexShortOffAddr happyDefActions st++{-# LINE 130 "templates/GenericTemplate.hs" #-}+++indexShortOffAddr (HappyA# arr) off =+ Happy_GHC_Exts.narrow16Int# i+ where+ i = Happy_GHC_Exts.word2Int# (Happy_GHC_Exts.or# (Happy_GHC_Exts.uncheckedShiftL# high 8#) low)+ high = Happy_GHC_Exts.int2Word# (Happy_GHC_Exts.ord# (Happy_GHC_Exts.indexCharOffAddr# arr (off' Happy_GHC_Exts.+# 1#)))+ low = Happy_GHC_Exts.int2Word# (Happy_GHC_Exts.ord# (Happy_GHC_Exts.indexCharOffAddr# arr off'))+ off' = off Happy_GHC_Exts.*# 2#++++++data HappyAddr = HappyA# Happy_GHC_Exts.Addr#+++++-----------------------------------------------------------------------------+-- HappyState data type (not arrays)++{-# LINE 163 "templates/GenericTemplate.hs" #-}++-----------------------------------------------------------------------------+-- Shifting a token++happyShift new_state 0# tk st sts stk@(x `HappyStk` _) =+ let (i) = (case Happy_GHC_Exts.unsafeCoerce# x of { (Happy_GHC_Exts.I# (i)) -> i }) in+-- trace "shifting the error token" $+ happyDoAction i tk new_state (HappyCons (st) (sts)) (stk)++happyShift new_state i tk st sts stk =+ happyNewToken new_state (HappyCons (st) (sts)) ((happyInTok (tk))`HappyStk`stk)++-- happyReduce is specialised for the common cases.++happySpecReduce_0 i fn 0# tk st sts stk+ = happyFail 0# tk st sts stk+happySpecReduce_0 nt fn j tk st@((action)) sts stk+ = happyGoto nt j tk st (HappyCons (st) (sts)) (fn `HappyStk` stk)++happySpecReduce_1 i fn 0# tk st sts stk+ = happyFail 0# tk st sts stk+happySpecReduce_1 nt fn j tk _ sts@((HappyCons (st@(action)) (_))) (v1`HappyStk`stk')+ = let r = fn v1 in+ happySeq r (happyGoto nt j tk st sts (r `HappyStk` stk'))++happySpecReduce_2 i fn 0# tk st sts stk+ = happyFail 0# tk st sts stk+happySpecReduce_2 nt fn j tk _ (HappyCons (_) (sts@((HappyCons (st@(action)) (_))))) (v1`HappyStk`v2`HappyStk`stk')+ = let r = fn v1 v2 in+ happySeq r (happyGoto nt j tk st sts (r `HappyStk` stk'))++happySpecReduce_3 i fn 0# tk st sts stk+ = happyFail 0# tk st sts stk+happySpecReduce_3 nt fn j tk _ (HappyCons (_) ((HappyCons (_) (sts@((HappyCons (st@(action)) (_))))))) (v1`HappyStk`v2`HappyStk`v3`HappyStk`stk')+ = let r = fn v1 v2 v3 in+ happySeq r (happyGoto nt j tk st sts (r `HappyStk` stk'))++happyReduce k i fn 0# tk st sts stk+ = happyFail 0# tk st sts stk+happyReduce k nt fn j tk st sts stk+ = case happyDrop (k Happy_GHC_Exts.-# (1# :: Happy_GHC_Exts.Int#)) sts of+ sts1@((HappyCons (st1@(action)) (_))) ->+ let r = fn stk in -- it doesn't hurt to always seq here...+ happyDoSeq r (happyGoto nt j tk st1 sts1 r)++happyMonadReduce k nt fn 0# tk st sts stk+ = happyFail 0# tk st sts stk+happyMonadReduce k nt fn j tk st sts stk =+ happyThen1 (fn stk tk) (\r -> happyGoto nt j tk st1 sts1 (r `HappyStk` drop_stk))+ where (sts1@((HappyCons (st1@(action)) (_)))) = happyDrop k (HappyCons (st) (sts))+ drop_stk = happyDropStk k stk++happyMonad2Reduce k nt fn 0# tk st sts stk+ = happyFail 0# tk st sts stk+happyMonad2Reduce k nt fn j tk st sts stk =+ happyThen1 (fn stk tk) (\r -> happyNewToken new_state sts1 (r `HappyStk` drop_stk))+ where (sts1@((HappyCons (st1@(action)) (_)))) = happyDrop k (HappyCons (st) (sts))+ drop_stk = happyDropStk k stk++ (off) = indexShortOffAddr happyGotoOffsets st1+ (off_i) = (off Happy_GHC_Exts.+# nt)+ (new_state) = indexShortOffAddr happyTable off_i+++++happyDrop 0# l = l+happyDrop n (HappyCons (_) (t)) = happyDrop (n Happy_GHC_Exts.-# (1# :: Happy_GHC_Exts.Int#)) t++happyDropStk 0# l = l+happyDropStk n (x `HappyStk` xs) = happyDropStk (n Happy_GHC_Exts.-# (1#::Happy_GHC_Exts.Int#)) xs++-----------------------------------------------------------------------------+-- Moving to a new state after a reduction+++happyGoto nt j tk st = + {- nothing -}+ happyDoAction j tk new_state+ where (off) = indexShortOffAddr happyGotoOffsets st+ (off_i) = (off Happy_GHC_Exts.+# nt)+ (new_state) = indexShortOffAddr happyTable off_i+++++-----------------------------------------------------------------------------+-- Error recovery (0# is the error token)++-- parse error if we are in recovery and we fail again+happyFail 0# tk old_st _ stk =+-- trace "failing" $ + happyError_ tk++{- 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 0# tk old_st (HappyCons ((action)) (sts)) + (saved_tok `HappyStk` _ `HappyStk` stk) =+-- trace ("discarding state, depth " ++ show (length stk)) $+ happyDoAction 0# tk action sts ((saved_tok`HappyStk`stk))+-}++-- Enter error recovery: generate an error token,+-- save the old token and carry on.+happyFail i tk (action) sts stk =+-- trace "entering error recovery" $+ happyDoAction 0# tk action sts ( (Happy_GHC_Exts.unsafeCoerce# (Happy_GHC_Exts.I# (i))) `HappyStk` stk)++-- Internal happy errors:++notHappyAtAll :: a+notHappyAtAll = error "Internal Happy error\n"++-----------------------------------------------------------------------------+-- Hack to get the typechecker to accept our action functions+++happyTcHack :: Happy_GHC_Exts.Int# -> a -> a+happyTcHack x y = y+{-# INLINE happyTcHack #-}+++-----------------------------------------------------------------------------+-- Seq-ing. If the --strict flag is given, then Happy emits +-- happySeq = happyDoSeq+-- otherwise it emits+-- happySeq = happyDontSeq++happyDoSeq, happyDontSeq :: a -> b -> b+happyDoSeq a b = a `seq` b+happyDontSeq a b = b++-----------------------------------------------------------------------------+-- 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 happyDoAction #-}+{-# NOINLINE happyTable #-}+{-# NOINLINE happyCheck #-}+{-# NOINLINE happyActOffsets #-}+{-# NOINLINE happyGotoOffsets #-}+{-# NOINLINE happyDefActions #-}++{-# 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.
+ src/CSPM/PrettyPrinter.hs view
@@ -0,0 +1,287 @@+{-# LANGUAGE FlexibleInstances #-}+module CSPM.PrettyPrinter (+ prettyPrint, prettyPrintMatch,+)+where++import CSPM.DataStructures.Names+import CSPM.DataStructures.Syntax+import Util.Annotated+import Util.Exception+import Util.PrettyPrint+ +instance PrettyPrintable Name where+ prettyPrint (Name s) = text s+instance PrettyPrintable QualifiedName where+ prettyPrint (UnQual name) = prettyPrint name++instance PrettyPrintable [Module] where+ prettyPrint = vcat . map prettyPrint++instance PrettyPrintable Module where+ prettyPrint (GlobalModule decls) = + vcat (punctuate (char '\n') (map prettyPrint decls))++instance PrettyPrintable InteractiveStmt where+ prettyPrint (Evaluate e) = prettyPrint e+ prettyPrint (Bind decl) = + text "let" <+> prettyPrint decl+ +prettyPrintMatch :: Name -> AnMatch -> Doc+prettyPrintMatch n (An _ _ (Match groups exp)) = + hang ((prettyPrint n <> hcat (map ppGroup groups))+ <+> equals)+ tabWidth (prettyPrint exp)+ where+ ppGroup ps = parens (list (map prettyPrint ps))++instance PrettyPrintable Decl where+ prettyPrint (FunBind n ms) =+ vcat (map (prettyPrintMatch n) ms)+ prettyPrint (PatBind pat exp) =+ hang (prettyPrint pat <+> equals)+ tabWidth (prettyPrint exp)+ prettyPrint (Channel ns Nothing) =+ text "channel" <+> list (map prettyPrint ns)+ prettyPrint (Channel ns (Just e)) =+ text "channel" <+> list (map prettyPrint ns)+ <+> text ":" <+> prettyPrint e+ prettyPrint (External ns) =+ text "external" <+> list (map prettyPrint ns)+ prettyPrint (Transparent ns) =+ text "transparent" <+> list (map prettyPrint ns)+ prettyPrint (DataType n dtcs) =+ text "datatype" <+> prettyPrint n <+> text "=" + <+> fsep (punctuate (text "|") (map prettyPrint dtcs))+ prettyPrint (Assert a) =+ text "assert" <+> prettyPrint a+ +instance PrettyPrintable Assertion where+ prettyPrint (Refinement e1 m e2 opts) =+ hang (hang (prettyPrint e1) tabWidth+ (char '[' <> prettyPrint m <> char '=' <+> prettyPrint e2))+ tabWidth (fcat (map prettyPrint opts))+ prettyPrint (PropertyCheck e1 prop Nothing) =+ hang (prettyPrint e1) tabWidth+ (text ":[" <> prettyPrint prop <> text "]")+ prettyPrint (PropertyCheck e1 prop (Just m)) =+ hang (prettyPrint e1) tabWidth+ (colon <> brackets (prettyPrint prop <+> brackets (prettyPrint m)))+instance PrettyPrintable Model where+ prettyPrint Traces = text "T"+ prettyPrint Failures = text "F"+ prettyPrint FailuresDivergences = text "FD"+ prettyPrint Refusals = text "R"+ prettyPrint RefusalsDivergences = text "RD"+ prettyPrint Revivals = text "V"+ prettyPrint RevivalsDivergences = text "VD"+ +instance PrettyPrintable ModelOption where+ prettyPrint (TauPriority e) = + text ":[tau priority over]:" <+> prettyPrint e++instance PrettyPrintable SemanticProperty where+ prettyPrint DeadlockFreedom = text "deadlock free"+ prettyPrint Deterministic = text "deterministic"+ prettyPrint LivelockFreedom = text "divergence free"++instance PrettyPrintable DataTypeClause where+ prettyPrint (DataTypeClause n Nothing) = prettyPrint n+ prettyPrint (DataTypeClause n (Just e)) = + prettyPrint n <> text "." <> prettyPrint e++instance PrettyPrintable Pat where+ prettyPrint (PConcat e1 e2) =+ prettyPrint e1 <+> text "^" <+> prettyPrint e2+ prettyPrint (PDotApp e1 e2) =+ prettyPrint e1 <> text "." <> prettyPrint e2+ prettyPrint (PDoublePattern e1 e2) =+ prettyPrint e1 <+> text "@@" <+> prettyPrint e2+ prettyPrint (PList patterns) = + angles (list (map prettyPrint patterns))+ prettyPrint (PLit lit) = prettyPrint lit+ prettyPrint (PSet patterns) = + braces (list (map prettyPrint patterns))+ prettyPrint (PParen pattern) =+ parens (prettyPrint pattern)+ prettyPrint (PTuple patterns) = + parens (list (map prettyPrint patterns))+ prettyPrint (PVar name) = prettyPrint name+ prettyPrint (PWildCard) = char '_'+ + prettyPrint (PCompList _ _ p) = prettyPrint p+ prettyPrint (PCompDot _ p) = prettyPrint p+ +instance PrettyPrintable BinaryBooleanOp where+ prettyPrint And = text "and"+ prettyPrint Or = text "or"+ prettyPrint Equals = text "=="+ prettyPrint NotEquals = text "!="+ prettyPrint GreaterThan = text ">"+ prettyPrint LessThan = text "<"+ prettyPrint LessThanEq = text "<="+ prettyPrint GreaterThanEq = text ">="++instance PrettyPrintable UnaryBooleanOp where+ prettyPrint Not = text "not"++instance PrettyPrintable BinaryMathsOp where+ prettyPrint Divide = text "/"+ prettyPrint Minus = text "-"+ prettyPrint Mod = text "%"+ prettyPrint Plus = text "+"+ prettyPrint Times = text "*"+instance PrettyPrintable UnaryMathsOp where+ -- We include an extra space here to avoid { -1} being pretty printed as+ -- {-1} which would start a block comment+ prettyPrint Negate = text " -"++instance PrettyPrintable Exp where + prettyPrint (App e1 args) = + prettyPrint e1 <> parens (list (map prettyPrint args))+ prettyPrint (BooleanBinaryOp op e1 e2) = + ppBinOp (prettyPrint e1) (prettyPrint op) (prettyPrint e2)+ prettyPrint (BooleanUnaryOp op e1) = prettyPrint op <+> prettyPrint e1+ prettyPrint (Concat e1 e2) =+ ppBinOp' (prettyPrint e1) (char '^') (prettyPrint e2)+ prettyPrint (DotApp e1 e2) =+ ppBinOp' (prettyPrint e1) (char '.') (prettyPrint e2)+ prettyPrint (If e1 e2 e3) = + sep [hang (text "if" <+> prettyPrint e1 <+> text "then") + tabWidth (prettyPrint e2),+ text "else" <+> prettyPrint e3]+ prettyPrint (Lambda pat exp) = + text "\\" <> prettyPrint pat+ <+> text "@"+ <+> prettyPrint exp+ prettyPrint (Let decls exp) = + sep [hang (text "let") tabWidth (vcat (map prettyPrint decls)),+ hang (text "within") tabWidth (prettyPrint exp)]+ prettyPrint (ListLength exp) = char '#' <> prettyPrint exp+ prettyPrint (List exps) = angles (list (map prettyPrint exps))+ prettyPrint (ListComp es stmts) = angles (ppComp es stmts)+ prettyPrint (ListEnumFrom lb) = angles (prettyPrint lb <> text "..")+ prettyPrint (ListEnumFromTo lb ub) = + angles (prettyPrint lb <> text ".." <> prettyPrint ub)+ prettyPrint (Lit lit) = prettyPrint lit+ prettyPrint (MathsUnaryOp op e1) = prettyPrint op <> prettyPrint e1+ prettyPrint (MathsBinaryOp op e1 e2) =+ ppBinOp' (prettyPrint e1) (prettyPrint op) (prettyPrint e2)+ prettyPrint (Paren e) = parens (prettyPrint e)+ prettyPrint (Set exps) = braces (list (map prettyPrint exps))+ prettyPrint (SetComp es stmts) = braces (ppComp es stmts)+ prettyPrint (SetEnum es) = (braces . bars . list . map prettyPrint) es+ prettyPrint (SetEnumComp es stmts) = braces (bars (ppComp es stmts))+ prettyPrint (SetEnumFrom lb) = braces (prettyPrint lb <> text "..")+ prettyPrint (SetEnumFromTo lb ub) =+ braces (prettyPrint lb <> text ".." <> prettyPrint ub)+ prettyPrint (Tuple exps) = parens (list (map prettyPrint exps))+ prettyPrint (Var qname) = prettyPrint qname+ + -- Processes+ prettyPrint(AlphaParallel e1 a1 a2 e2) =+ ppBinOp (prettyPrint e1) (brackets (prettyPrint a1 <> text "||"+ <> prettyPrint a2)) (prettyPrint e2)+ prettyPrint (Exception e1 a e2) =+ ppBinOp (prettyPrint e1) (text "[|" <+> prettyPrint a <+> text "|>") + (prettyPrint e2)+ prettyPrint (ExternalChoice e1 e2) = + ppBinOp (prettyPrint e1) (text "[]") (prettyPrint e2)+ prettyPrint (GenParallel e1 alpha e2) = + ppBinOp (prettyPrint e1) (brackets (bars (prettyPrint alpha))) + (prettyPrint e2)+ prettyPrint (GuardedExp e1 e2) = + ppBinOp (prettyPrint e1) (char '&') (prettyPrint e2)+ prettyPrint (Hiding e1 e2) = + ppBinOp (prettyPrint e1) (char '\\') (prettyPrint e2)+ prettyPrint (InternalChoice e1 e2) =+ ppBinOp (prettyPrint e1) (text "|~|") (prettyPrint e2)+ prettyPrint (Interrupt e1 e2) =+ ppBinOp (prettyPrint e1) (text "/\\") (prettyPrint e2)+ prettyPrint (Interleave e1 e2) =+ ppBinOp (prettyPrint e1) (text "|||") (prettyPrint e2)+ prettyPrint (LinkParallel e1 ties stmts e2) =+ ppBinOp (prettyPrint e1)+ (ppComp' (map ppTie ties) stmts)+ (prettyPrint e2)+ prettyPrint (Prefix ev fs e) =+ ppBinOp (prettyPrint ev <> hcat (map prettyPrint fs)) (text "->")+ (prettyPrint e)+ prettyPrint (Rename e ties stmts) =+ prettyPrint e <+> brackets (brackets (+ ppComp' (map ppRename ties) stmts+ ))+ prettyPrint (SequentialComp e1 e2) =+ ppBinOp (prettyPrint e1) (char ';') (prettyPrint e2)+ prettyPrint (SlidingChoice e1 e2) =+ ppBinOp (prettyPrint e1) (text "[>") (prettyPrint e2)++ prettyPrint (ReplicatedAlphaParallel stmts alpha e) = + ppRepOp (text "||") stmts + (brackets (prettyPrint alpha) <+> prettyPrint e)+ prettyPrint (ReplicatedExternalChoice stmts e) = + ppRepOp (text "[]") stmts (prettyPrint e)+ prettyPrint (ReplicatedInterleave stmts e) = + ppRepOp (text "|||") stmts (prettyPrint e)+ prettyPrint (ReplicatedInternalChoice stmts e) = + ppRepOp (text "|~|") stmts (prettyPrint e)+ prettyPrint (ReplicatedLinkParallel ties stmts e) =+ ppRepOp (brackets (list (map ppTie ties))) stmts (prettyPrint e)+ prettyPrint (ReplicatedParallel alpha stmts e) =+ ppRepOp (brackets (bars (prettyPrint alpha))) stmts (prettyPrint e)+ + -- Patterns - this is only used when emitting parser errors about invalid+ -- expressions.+ prettyPrint (ExpPatWildCard) = char '_'+ prettyPrint (ExpPatDoublePattern e1 e2) = + prettyPrint e1 <+> text "@@" <+> prettyPrint e2++instance PrettyPrintable Field where+ prettyPrint (Output exp) = + char '!' <> prettyPrint exp+ prettyPrint (Input pat Nothing) =+ char '?' <> prettyPrint pat+ prettyPrint (Input pat (Just exp)) =+ char '?' <> prettyPrint pat <+> colon <+> prettyPrint exp+ prettyPrint (NonDetInput pat Nothing) = + char '$' <> prettyPrint pat+ prettyPrint (NonDetInput pat (Just exp)) =+ char '$' <> prettyPrint pat <+> colon <+> prettyPrint exp++instance PrettyPrintable Stmt where+ prettyPrint (Generator pat exp) = + sep [prettyPrint pat, text "<-" <+> prettyPrint exp]+ prettyPrint (Qualifier exp) = + prettyPrint exp++instance PrettyPrintable Literal where+ prettyPrint (Int n) = integer n+ prettyPrint (Bool True) = text "true"+ prettyPrint (Bool False) = text "false"++ppTie :: (AnExp, AnExp) -> Doc+ppTie (l, r) = prettyPrint l <+> text "<->" <+> prettyPrint r++ppRename :: (AnExp, AnExp) -> Doc+ppRename (l, r) = prettyPrint l <+> text "<-" <+> prettyPrint r++ppRepOp :: Doc -> [AnStmt] -> Doc -> Doc+ppRepOp op stmts exp =+ hang op tabWidth (+ hang (list (map prettyPrint stmts) <+> char '@')+ tabWidth exp)++ppComp :: [AnExp] -> [AnStmt] -> Doc+ppComp es stmts = ppComp' (map prettyPrint es) stmts + +ppComp' :: [Doc] -> [AnStmt] -> Doc+ppComp' es stmts = + hang (list es) tabWidth+ (if stmts /= [] then char '|' <+> list (map prettyPrint stmts)+ else empty)+ +ppBinOp :: Doc -> Doc -> Doc -> Doc+ppBinOp arg1 op arg2 = sep [arg1, op <+> arg2]++ppBinOp' :: Doc -> Doc -> Doc -> Doc+ppBinOp' arg1 op arg2 = cat [arg1, op <> arg2]
+ src/CSPM/TypeChecker.hs view
@@ -0,0 +1,62 @@+{-# LANGUAGE FlexibleContexts #-}+module CSPM.TypeChecker (+ typeCheck, typeCheckExpect,+ typeOfExp, dependenciesOfExp,+ + initTypeChecker,+ TypeCheckMonad, TypeInferenceState,+ runTypeChecker, runFromStateToState,+) where++import Control.Monad.Trans++import CSPM.DataStructures.Names+import CSPM.DataStructures.Syntax+import CSPM.DataStructures.Types+import CSPM.TypeChecker.BuiltInFunctions+import qualified CSPM.TypeChecker.Common as TC+import CSPM.TypeChecker.Compressor+import CSPM.TypeChecker.Dependencies+import CSPM.TypeChecker.Environment+import CSPM.TypeChecker.Expr+import CSPM.TypeChecker.InteractiveStmt+import CSPM.TypeChecker.Module+import CSPM.TypeChecker.Monad+import CSPM.TypeChecker.Unification+import Util.Annotated+import Util.Exception++runFromStateToState :: TypeInferenceState -> TypeCheckMonad a -> + IO (a, [ErrorMessage], TypeInferenceState)+runFromStateToState st prog = runTypeChecker st $ do+ r <- prog+ ws <- getWarnings+ resetWarnings+ s <- getState+ return (r, ws, s)++initTypeChecker :: IO TypeInferenceState+initTypeChecker = runTypeChecker newTypeInferenceState $ do+ injectBuiltInFunctions+ -- Add a blank level in the environment to allow built in functions+ -- to be overriden.+ local [] getState++typeCheckExpect :: (Compressable a, TC.TypeCheckable a Type) => Type -> a -> TypeCheckMonad a+typeCheckExpect t exp = TC.typeCheckExpect exp t >> mcompress exp++typeCheck :: (Compressable a, TC.TypeCheckable a b) => a -> TypeCheckMonad a+typeCheck exp = TC.typeCheck exp >> mcompress exp++typeOfExp :: PExp -> TypeCheckMonad Type+typeOfExp exp = do+ -- See if has been type checked, if so, return type,+ -- else type check+ mt <- liftIO $ readPType (snd (annotation exp))+ case mt of + Just t -> evaluateDots t >>= compress+ Nothing -> typeCheck exp >> typeOfExp exp++-- | Returns the list of names that this expression depends on+dependenciesOfExp :: TCExp -> TypeCheckMonad [Name]+dependenciesOfExp exp = dependencies exp
+ src/CSPM/TypeChecker/BuiltInFunctions.hs view
@@ -0,0 +1,132 @@+{-# LANGUAGE MultiParamTypeClasses, FunctionalDependencies #-}+module CSPM.TypeChecker.BuiltInFunctions(+ injectBuiltInFunctions, externalFunctions, transparentFunctions,+ builtInNames, replacementForDeprecatedName,+) where++import CSPM.DataStructures.Types+import CSPM.TypeChecker.Monad++import CSPM.DataStructures.Names+import Util.Exception+import Util.PartialFunctions++sets :: [Type -> (String, [Type], Type)]+sets = + let+ cspm_union fv = ("union", [TSet fv, TSet fv], TSet fv)+ cspm_inter fv = ("inter", [TSet fv, TSet fv], TSet fv)+ cspm_diff fv = ("diff", [TSet fv, TSet fv], TSet fv)+ cspm_Union fv = ("Union", [TSet (TSet fv)], TSet fv)+ cspm_Inter fv = ("Inter", [TSet (TSet fv)], TSet fv)+ cspm_member fv = ("member", [fv, TSet fv], TBool)+ cspm_card fv = ("card", [TSet fv], TInt)+ cspm_empty fv = ("empty", [TSet fv], TBool)+ cspm_set fv = ("set", [TSeq fv], TSet fv)+ cspm_Set fv = ("Set", [TSet fv], TSet (TSet fv))+ cspm_Seq fv = ("Seq", [TSet fv], TSet (TSeq fv))+ cspm_seq fv = ("seq", [TSet fv], TSeq fv)+ in+ [cspm_union, cspm_inter, cspm_diff, cspm_Union, cspm_Inter,+ cspm_member, cspm_card, cspm_empty, cspm_set, cspm_Set,+ cspm_Seq, cspm_seq]+seqs :: [Type -> (String, [Type], Type)]+seqs = + let+ cspm_length fv = ("length", [TSeq fv], TInt)+ cspm_null fv = ("null", [TSeq fv], TBool)+ cspm_head fv = ("head", [TSeq fv], fv)+ cspm_tail fv = ("tail", [TSeq fv], TSeq fv)+ cspm_concat fv = ("concat", [TSeq (TSeq fv)], TSeq fv)+ cspm_elem fv = ("elem", [fv, TSeq fv], TBool) + in+ [cspm_length, cspm_null, cspm_head, cspm_tail, cspm_concat,+ cspm_elem]++builtInProcs :: [(String, Type)]+builtInProcs =+ let+ cspm_STOP = ("STOP", TProc)+ cspm_SKIP = ("SKIP", TProc)+ cspm_CHAOS = ("CHAOS", TFunction [TSet TEvent] TProc)+ cspm_prioritise = ("prioritise", TFunction [TProc, TSeq (TSet TEvent)] TProc)+ in+ [cspm_STOP, cspm_SKIP, cspm_CHAOS, cspm_prioritise]++typeConstructors :: [(String, Type)]+typeConstructors =+ let+ cspm_Int = ("Int", TSet TInt)+ cspm_Bool = ("Bool", TSet TBool)+ cspm_Proc = ("Proc", TSet TProc)+ cspm_Events = ("Events", TSet TEvent)+ cspm_true = ("true", TBool)+ cspm_false = ("false", TBool)+ cspm_True = ("True", TBool)+ cspm_False = ("False", TBool) + in + [cspm_Int, cspm_Bool, cspm_Proc, cspm_Events, cspm_true, + cspm_false, cspm_True, cspm_False]++injectBuiltInFunctions :: TypeCheckMonad ()+injectBuiltInFunctions =+ let+ mkFuncType cs func = + do+ fv @ (TVar (TypeVarRef tv _ _)) <- freshTypeVarWithConstraints cs+ let (n, args, ret) = func fv+ let t = ForAll [(tv, cs)] (TFunction args ret)+ setType (Name n) t+ mkUnsafeFuncType s = do+ fv1 @ (TVar (TypeVarRef tv1 _ _)) <- freshTypeVarWithConstraints []+ fv2 @ (TVar (TypeVarRef tv2 _ _)) <- freshTypeVarWithConstraints []+ setType (Name s) (ForAll [(tv1, []), (tv2, [])] (TFunction [fv1] fv2))+ mkPatternType func =+ do + let (n, t) = func+ setType (Name n) (ForAll [] t)+ in do+ mapM_ (mkFuncType []) seqs+ mapM_ (mkFuncType [Eq]) sets+ mapM_ mkPatternType typeConstructors+ mapM_ mkPatternType builtInProcs+ mapM_ mkUnsafeFuncType unsafeFunctionNames+ mapM_ (markAsDeprecated . Name) deprecatedNames+ mapM_ (markTypeAsUnsafe . Name) unsafeFunctionNames++externalFunctions :: PartialFunction String Type+externalFunctions = []++transparentFunctions :: PartialFunction String Type+transparentFunctions = [+ ("diamond", TFunction [TProc] TProc),+ ("normal", TFunction [TProc] TProc),+ ("sbisim", TFunction [TProc] TProc),+ ("tau_loop_factor", TFunction [TProc] TProc),+ ("model_compress", TFunction [TProc] TProc),+ ("explicate", TFunction [TProc] TProc),+ ("wbisim", TFunction [TProc] TProc),+ ("chase", TFunction [TProc] TProc)+ ]++builtInNames :: [String]+builtInNames = + map fst externalFunctions+ ++ map fst transparentFunctions+ ++ map fst typeConstructors+ ++ map extract seqs+ ++ map extract sets+ ++ unsafeFunctionNames+ where+ extract f = let (a,_,_) = f (panic "Dummy type var evaluated") in a++unsafeFunctionNames :: [String]+unsafeFunctionNames = ["productions", "extensions"]++deprecatedNames :: [String]+deprecatedNames = ["True", "False"]++replacementForDeprecatedName :: Name -> Maybe Name+replacementForDeprecatedName (Name "True") = Just $ Name $ "true"+replacementForDeprecatedName (Name "False") = Just $ Name $ "false"+replacementForDeprecatedName _ = Nothing
+ src/CSPM/TypeChecker/Common.hs view
@@ -0,0 +1,67 @@+{-# LANGUAGE FlexibleContexts, MultiParamTypeClasses, FunctionalDependencies #-}+module CSPM.TypeChecker.Common where++import CSPM.DataStructures.Syntax+import CSPM.DataStructures.Types+import CSPM.TypeChecker.BuiltInFunctions+import CSPM.TypeChecker.Exceptions+import CSPM.TypeChecker.Monad+import CSPM.TypeChecker.Unification+import Util.PrettyPrint++-- a -> b <=> We can't have two instances that match on a but differ on b+class TypeCheckable a b | a -> b where+ typeCheck :: a -> TypeCheckMonad b+ typeCheck a = + case errorContext a of+ Just c -> addErrorContext c (typeCheck' a)+ Nothing -> typeCheck' a+ + typeCheckExpect :: a -> Type -> TypeCheckMonad b+ typeCheckExpect _ _ = panic "typeCheckExpect not supported"+ + typeCheck' :: a -> TypeCheckMonad b+ errorContext :: a -> Maybe ErrorContext++instance TypeCheckable Literal Type where+ errorContext a = Nothing+ typeCheck' (Int n) = return TInt+ typeCheck' (Bool b) = return TBool+ +ensureAreEqual :: TypeCheckable a Type => [a] -> TypeCheckMonad Type+ensureAreEqual [] = freshTypeVar+ensureAreEqual (e:es) = do+ t <- typeCheck e+ mapM (\e -> typeCheckExpect e t) es+ return t++ensureIsList :: TypeCheckable a b => a -> TypeCheckMonad b+ensureIsList e = do+ fv <- freshTypeVar+ typeCheckExpect e (TSeq fv)++ensureIsSet :: TypeCheckable a b => a -> TypeCheckMonad b+ensureIsSet e = do+ fv <- freshTypeVarWithConstraints [Eq]+ typeCheckExpect e (TSet fv)++ensureIsBool :: TypeCheckable a b => a -> TypeCheckMonad b+ensureIsBool e = typeCheckExpect e TBool++ensureIsInt :: TypeCheckable a b => a -> TypeCheckMonad b+ensureIsInt e = typeCheckExpect e TInt++ensureIsChannel :: TypeCheckable a b => a -> TypeCheckMonad b+ensureIsChannel e = typeCheckExpect e TEventable++ensureIsEvent :: TypeCheckable a b => a -> TypeCheckMonad b+ensureIsEvent e = typeCheckExpect e TEvent++ensureIsProc :: TypeCheckable a b => a -> TypeCheckMonad b+ensureIsProc e = typeCheckExpect e TProc++ensureHasConstraint :: Constraint -> Type -> TypeCheckMonad Type+ensureHasConstraint c t = do+ fv1 <- freshTypeVarWithConstraints [c]+ unify fv1 t+
+ src/CSPM/TypeChecker/Compressor.hs view
@@ -0,0 +1,175 @@+{-# LANGUAGE FlexibleInstances #-}+module CSPM.TypeChecker.Compressor(+ Compressable, mcompress+) where++import CSPM.DataStructures.Types+import CSPM.DataStructures.Syntax+import CSPM.TypeChecker.Monad+import Util.Annotated++class Compressable a where+ -- | Map compress+ mcompress :: a -> TypeCheckMonad a++($$) :: TypeCheckMonad (a -> b) -> TypeCheckMonad a -> TypeCheckMonad b+($$) fm argm = do+ f <- fm+ arg <- argm+ return $ f arg++instance (Compressable a) => Compressable (Annotated (Maybe SymbolTable, PSymbolTable) a) where+ mcompress (An l (_, pt) v) = do+ symbtable <- readPSymbolTable pt+ symbtable' <- mapM (\ (n, t) -> do+ t' <- compressTypeScheme t+ return (n,t')) symbtable+ v' <- mcompress v+ return $ An l (Just symbtable', pt) v'+instance (Compressable a) => Compressable (Annotated (Maybe Type, PType) a) where+ mcompress (An l (_, pt) v) = do+ Just t <- readPType pt+ t' <- compress t+ v' <- mcompress v+ return $ An l (Just t', pt) v'+instance (Compressable a) => Compressable (Annotated () a) where+ mcompress (An l t v) = do+ v' <- mcompress v+ return $ An l t v'++instance Compressable a => Compressable [a] where+ mcompress as = mapM mcompress as+instance Compressable a => Compressable (Maybe a) where+ mcompress Nothing = return Nothing+ mcompress (Just v) = mcompress v >>= return . Just+instance (Compressable a, Compressable b) => Compressable (a, b) where+ mcompress (v1, v2) = do+ v1' <- mcompress v1+ v2' <- mcompress v2+ return (v1', v2')+instance Compressable Exp where+ mcompress (App e es) = return App $$ mcompress e $$ mcompress es+ mcompress (BooleanBinaryOp op e1 e2) = return + (BooleanBinaryOp op) $$ mcompress e1 $$ mcompress e2+ mcompress (BooleanUnaryOp op e) = return+ (BooleanUnaryOp op) $$ mcompress e+ mcompress (Concat e1 e2) = return Concat $$ mcompress e1 $$ mcompress e2+ mcompress (DotApp e1 e2) = return DotApp $$ mcompress e1 $$ mcompress e2+ mcompress (If e1 e2 e3) = return If $$ mcompress e1 $$ mcompress e2 $$ mcompress e3+ mcompress (Lambda p e) = return Lambda $$ mcompress p $$ mcompress e+ mcompress (Let ds e) = return Let $$ mcompress ds $$ mcompress e+ mcompress (Lit l) = return Lit $$ mcompress l+ mcompress (List es) = return List $$ mcompress es+ mcompress (ListComp es stmts) = return ListComp $$ mcompress es $$ mcompress stmts + mcompress (ListEnumFrom e) = return ListEnumFrom $$ mcompress e+ mcompress (ListEnumFromTo e1 e2) = return ListEnumFromTo $$ mcompress e1 $$ mcompress e2+ mcompress (ListLength e) = return ListLength $$ mcompress e+ mcompress (MathsBinaryOp op e1 e2) = return + (MathsBinaryOp op) $$ mcompress e1 $$ mcompress e2+ mcompress (MathsUnaryOp op e) = return (MathsUnaryOp op) $$ mcompress e+ -- TODO: do we want to do this?+ mcompress (Paren e) = return unAnnotate $$ mcompress e+ mcompress (Set es) = return Set $$ mcompress es+ mcompress (SetComp es stmts) = return SetComp $$ mcompress es $$ mcompress stmts+ mcompress (SetEnum es) = return SetEnum $$ mcompress es+ mcompress (SetEnumComp es stmts) = return SetEnumComp $$ mcompress es $$ mcompress stmts+ mcompress (SetEnumFrom e) = return SetEnumFrom $$ mcompress e+ mcompress (SetEnumFromTo e1 e2) = return SetEnumFromTo $$ mcompress e1 $$ mcompress e2+ mcompress (Tuple es) = return Tuple $$ mcompress es+ mcompress (Var n) = return (Var n)++ mcompress (AlphaParallel e1 e2 e3 e4) = return+ AlphaParallel $$ mcompress e1 $$ mcompress e2 $$ mcompress e3 $$ mcompress e4+ mcompress (Exception e1 e2 e3) = return+ Exception $$ mcompress e1 $$ mcompress e2 $$ mcompress e3+ mcompress (ExternalChoice e1 e2) = return ExternalChoice $$ mcompress e1 $$ mcompress e2+ mcompress (GenParallel e1 e2 e3) = return+ GenParallel $$ mcompress e1 $$ mcompress e2 $$ mcompress e3+ mcompress (GuardedExp e1 e2) = return GuardedExp $$ mcompress e1 $$ mcompress e2+ mcompress (Hiding e1 e2) = return Hiding $$ mcompress e1 $$ mcompress e2+ mcompress (InternalChoice e1 e2) = return InternalChoice $$ mcompress e1 $$ mcompress e2+ mcompress (Interrupt e1 e2) = return Interrupt $$ mcompress e1 $$ mcompress e2+ mcompress (Interleave e1 e2) = return Interleave $$ mcompress e1 $$ mcompress e2+ mcompress (LinkParallel e1 ties stmts e2) = return + LinkParallel $$ mcompress e1 $$ mcompress ties $$ mcompress stmts $$ mcompress e2+ mcompress (Prefix e1 fs e2) = return Prefix $$ mcompress e1 $$ mcompress fs $$ mcompress e2+ mcompress (Rename e1 ties stmts) = return+ Rename $$ mcompress e1 $$ mcompress ties $$ mcompress stmts+ mcompress (SequentialComp e1 e2) = return SequentialComp $$ mcompress e1 $$ mcompress e2+ mcompress (SlidingChoice e1 e2) = return SlidingChoice $$ mcompress e1 $$ mcompress e2+ + mcompress (ReplicatedAlphaParallel stmts e1 e2) =+ return ReplicatedAlphaParallel $$ mcompress stmts $$ mcompress e1 $$ mcompress e2+ mcompress (ReplicatedInterleave stmts e) =+ return ReplicatedInterleave $$ mcompress stmts $$ mcompress e+ mcompress (ReplicatedExternalChoice stmts e) =+ return ReplicatedExternalChoice $$ mcompress stmts $$ mcompress e+ mcompress (ReplicatedInternalChoice stmts e) =+ return ReplicatedInternalChoice $$ mcompress stmts $$ mcompress e+ mcompress (ReplicatedParallel stmts e1 e2) =+ return ReplicatedParallel $$ mcompress stmts $$ mcompress e1 $$ mcompress e2+ mcompress (ReplicatedLinkParallel ties stmts e) =+ return ReplicatedLinkParallel $$ mcompress ties $$ mcompress stmts $$ mcompress e++ mcompress a = panic (show a)+instance Compressable Module where+ mcompress (GlobalModule ds) = return GlobalModule $$ mcompress ds++instance Compressable Decl where+ mcompress (FunBind n ms) = return (FunBind n) $$ mcompress ms+ mcompress (PatBind p e) = return PatBind $$ mcompress p $$ mcompress e+ mcompress (Assert a) = return Assert $$ mcompress a+ mcompress (External ns) = return (External ns)+ mcompress (Transparent ns) = return (Transparent ns)+ mcompress (Channel ns me) = return (Channel ns) $$ mcompress me+ mcompress (DataType n cs) = return (DataType n) $$ mcompress cs+ mcompress (NameType n e) = return (NameType n) $$ mcompress e++instance Compressable Assertion where+ mcompress (Refinement e1 m e2 opts) = return + Refinement $$ mcompress e1 $$ mcompress m $$ mcompress e2 $$ mcompress opts+ mcompress (PropertyCheck e p m) = return + PropertyCheck $$ mcompress e $$ mcompress p $$ mcompress m++instance Compressable ModelOption where+ mcompress (TauPriority e) = return TauPriority $$ mcompress e++instance Compressable DataTypeClause where+ mcompress (DataTypeClause n me) = return (DataTypeClause n) $$ mcompress me++instance Compressable Match where+ mcompress (Match pss e) = return Match $$ mcompress pss $$ mcompress e++instance Compressable Field where+ mcompress (Output e) = return Output $$ mcompress e+ mcompress (Input p e) = return Input $$ mcompress p $$ mcompress e+ mcompress (NonDetInput p e) = return NonDetInput $$ mcompress p $$ mcompress e++instance Compressable Stmt where+ mcompress (Generator p e) = return Generator $$ mcompress p $$ mcompress e+ mcompress (Qualifier e) = return Qualifier $$ mcompress e++instance Compressable InteractiveStmt where+ mcompress (Bind d) = return Bind $$ mcompress d+ mcompress (Evaluate e) = return Evaluate $$ mcompress e+ mcompress (RunAssertion a) = return RunAssertion $$ mcompress a+ +instance Compressable Pat where+ mcompress (PConcat p1 p2) = return PConcat $$ mcompress p1 $$ mcompress p2+ mcompress (PList ps) = return PList $$ mcompress ps+ mcompress (PDotApp p1 p2) = return PDotApp $$ mcompress p1 $$ mcompress p2+ mcompress (PDoublePattern p1 p2) =+ return PDoublePattern $$ mcompress p1 $$ mcompress p2+ mcompress (PLit l) = return PLit $$ mcompress l+ mcompress (PParen p) = return PParen $$ mcompress p+ mcompress (PSet ps) = return PSet $$ mcompress ps+ mcompress (PTuple ps) = return PTuple $$ mcompress ps+ mcompress (PVar n) = return (PVar n)+ mcompress (PWildCard) = return PWildCard++instance Compressable SemanticProperty where+ mcompress l = return l+instance Compressable Model where+ mcompress l = return l+instance Compressable Literal where+ mcompress l = return l
+ src/CSPM/TypeChecker/Decl.hs view
@@ -0,0 +1,341 @@+{-# LANGUAGE MultiParamTypeClasses, TypeSynonymInstances, FlexibleInstances,+ DoAndIfThenElse #-}+module CSPM.TypeChecker.Decl (typeCheckDecls) where++import Control.Monad+import Control.Monad.Trans+import Data.Graph.Wrapper+import qualified Data.Map as M+import qualified Data.Set as S+import Data.List (nub, intersect, (\\), sortBy)++import CSPM.DataStructures.Names+import CSPM.DataStructures.Syntax hiding (getType)+import CSPM.DataStructures.Types+import CSPM.PrettyPrinter+import CSPM.TypeChecker.BuiltInFunctions+import CSPM.TypeChecker.Common+import CSPM.TypeChecker.Dependencies+import CSPM.TypeChecker.Exceptions+import CSPM.TypeChecker.Expr+import CSPM.TypeChecker.Monad+import CSPM.TypeChecker.Pat+import CSPM.TypeChecker.Unification+import Util.Annotated+import Util.List+import Util.Monad+import Util.PartialFunctions+import Util.PrettyPrint++-- | Type check a list of possibly mutually recursive functions+typeCheckDecls :: [PDecl] -> TypeCheckMonad ()+typeCheckDecls decls = do+ namesBoundByDecls <- mapM (\ decl -> do+ namesBound <- namesBoundByDecl decl+ return (decl, namesBound)) decls+ + let + -- | Map from declarations to integer identifiers+ declMap = zip decls [0..]+ invDeclMap = invert declMap+ -- | Map from names to the identifier of the declaration that it is+ -- defined by.+ varToDeclIdMap = + [(n, apply declMap d) | (d, ns) <- namesBoundByDecls, n <- ns]+ boundVars = map fst varToDeclIdMap+ namesToLocations = [(n, loc d) | (d, ns) <- namesBoundByDecls, n <- ns]++ -- Throw an error if a name is defined multiple times+ manyErrorsIfFalse (noDups boundVars) + (duplicatedDefinitionsMessage namesToLocations)++ -- We prebind the datatypes and channels as they can be matched on in + -- patterns (and thus, given a var in a pattern we can't decide if it+ -- is free or a dependency otherwise).+ mapM_ registerChannelsAndDataTypes (map unAnnotate decls)++ -- Map from decl id -> [decl id] meaning decl id depends on the list of+ -- ids+ declDeps <- mapM (\ decl -> do+ deps <- dependencies decl+ let depsInThisGroup = intersect deps boundVars+ return (apply declMap decl, mapPF varToDeclIdMap depsInThisGroup)+ ) decls++ let + -- | Edge from n -> n' iff n uses n'+ declGraph :: Graph Int Int+ declGraph = fromListSimple [(id, deps) | (id, deps) <- declDeps]+ -- | The graph of strongly connected components, with an edge+ -- from scc i to scc j if j depends on i, but i does not depend+ -- on j.+ sccgraph :: Graph (S.Set Int) (M.Map Int Int)+ sccgraph = transpose (sccGraph declGraph)+ -- | The strongly connected components themselves, topologically sorted+ sccs :: [S.Set Int]+ sccs = topologicalSort sccgraph+ + -- | Get the declarations corresponding to certain ids+ typeInferenceGroup = mapPF invDeclMap++ -- When an error occurs continue type checking, but only+ -- type check groups that do not depend on the failed group.+ -- failM is called at the end if any error has occured.+ typeCheckGroups [] b = if b then failM else return ()+ typeCheckGroups (g:gs) b = do+ err <- tryAndRecover (do+ typeCheckMutualyRecursiveGroup (typeInferenceGroup (S.toList g))+ return False+ ) (return True)+ if not err then typeCheckGroups gs b+ -- Else, continue type checking but remove all declaration groups+ -- that are reachable from this group. Also, set the flag to be + -- True to indicate that an error has occured so that failM is + -- called at the end.+ else typeCheckGroups (gs \\ (reachableVertices sccgraph g)) True+ + -- Start type checking the groups+ typeCheckGroups sccs False++-- This method heavily affects the DataType clause of typeCheckDecl.+-- If any changes are made here changes will need to be made to typeCheckDecl+-- too++-- We have to prebind all datatype clauses and channel names so+-- that we can identify when a particular pattern uses these clauses and+-- channels. We do this by injecting them into the symbol table earlier+-- than normal.+registerChannelsAndDataTypes :: Decl -> TypeCheckMonad ()+registerChannelsAndDataTypes (DataType n cs) = do+ mapM_ (\ c -> case unAnnotate c of+ DataTypeClause n' _ -> addDataTypeOrChannel n'+ ) cs+registerChannelsAndDataTypes (Channel ns _) = + mapM_ addDataTypeOrChannel ns+registerChannelsAndDataTypes _ = return ()++-- | Type checks a group of certainly mutually recursive functions. Only +-- functions that are mutually recursive should be included otherwise the+-- types could end up being less general.+typeCheckMutualyRecursiveGroup :: [PDecl] -> TypeCheckMonad ()+typeCheckMutualyRecursiveGroup ds' = do+ -- TODO: fix temporary hack+ let + cmp x y = case (unAnnotate x, unAnnotate y) of+ (DataType _ _, DataType _ _) -> EQ+ (DataType _ _, _) -> LT+ (_, DataType _ _) -> GT+ (_, _) -> EQ+ ds = sortBy cmp ds'+ fvs <- liftM nub (concatMapM namesBoundByDecl ds)++ ftvs <- replicateM (length fvs) freshTypeVar+ zipWithM setType fvs (map (ForAll []) ftvs)+ + -- The list of all variables bound by these declaration+ fvs <- liftM nub (concatMapM namesBoundByDecl ds)++ -- Type check each declaration then generalise the types+ nts <- generaliseGroup fvs (map typeCheck ds)+ -- Add the type of each declaration (if one exists to each declaration)+ zipWithM annotate nts ds++ -- Compress all the types we have inferred here (they should never be + -- touched again)+ mapM_ (\ n -> do+ t <- getType n+ t' <- compressTypeScheme t+ setType n t') fvs+ where + annotate nts (An _ psymbtable _) = setPSymbolTable (snd psymbtable) nts++-- | Takes a type and returns the inner type, i.e. the type that this+-- is a set of. For example TSet t1 -> t, TTuple [TSet t1, TSet t2] -> (t1, t2).+-- The type that is returned is guaranteed to satisfy Eq since, at the+-- recursion only bottoms out on reaching something that is of type TSet.+evalTypeExpression :: Type -> TypeCheckMonad Type+evalTypeExpression (TTuple ts) = do+ -- TTuple [TSet t1,...] = TSet (TTuple [t1,...])+ ts' <- mapM evalTypeExpression ts+ return $ TTuple ts'+evalTypeExpression (TDot t1 t2) = do+ -- TDot (TSet t1) (TSet t2) = TSet (TDot t1 t2)+ t1' <- evalTypeExpression t1+ t2' <- evalTypeExpression t2+ return $ TDot t1' t2'+-- Otherwise, it must be a set.+evalTypeExpression t = do+ fv <- freshTypeVar+ unify t (TSet fv)+ return fv++instance TypeCheckable PDecl [(Name, Type)] where+ errorContext an = Nothing+ typeCheck' an = setSrcSpan (loc an) $ typeCheck (inner an)++instance TypeCheckable Decl [(Name, Type)] where+ errorContext (FunBind n ms) = Just $ + -- This will only be helpful if the equations don't match in+ -- type+ text "In the declaration of:" <+> prettyPrint n+ errorContext (p@(PatBind pat exp)) = Just $+ hang (text "In a pattern binding:") tabWidth (prettyPrint p)+ errorContext (DataType n cs) = Just $+ text "In the declaration of:" <+> prettyPrint n+ errorContext (NameType n e) = Just $+ text "In the declaration of:" <+> prettyPrint n+ errorContext (Channel ns es) = Just $+ text "In the declaration of:" <+> list (map prettyPrint ns)+ errorContext (Assert a) = Just $+ text "In the assertion:" <+> prettyPrint a+ errorContext (Transparent ns) = Nothing+ errorContext (External ns) = Nothing+ + typeCheck' (FunBind n ms) = do+ ts <- mapM (\ m -> addErrorContext (matchCtxt m) $ typeCheck m) ms+ ForAll [] t <- getType n+ -- This unification also ensures that each equation has the same number+ -- of arguments.+ (t' @ (TFunction tsargs _)) <- unifyAll (t:ts)+ return [(n, t')]+ where+ matchCtxt an = + hang (text "In an equation for" <+> prettyPrint n <> colon) + tabWidth (prettyPrintMatch n an)+ typeCheck' (PatBind pat exp) = do+ tpat <- typeCheck pat+ texp <- typeCheck exp+ -- We evaluate the dots to implement the 'longest match' rule. For+ -- example, suppose we have the following declaration:+ -- datatype A = B.Integers.Integers+ -- f(B.x) = x+ -- Then we make the decision that x should be of type Int.Int.+ tpat <- evaluateDots tpat+ texp <- evaluateDots texp+ -- We must disallow symmetric unification here as we don't want+ -- to allow patterns such as:+ -- x.y = B+ disallowSymmetricUnification (unify texp tpat)+ ns <- namesBoundByDecl' (PatBind pat exp)+ ts <- mapM getType ns+ return $ zip ns [t | ForAll _ t <- ts]+ -- The following two clauses rely on the fact that they have been + -- prebound.+ typeCheck' (Channel ns Nothing) = do+ -- We now unify the each type to be a TEvent+ mapM (\ n -> do+ ForAll [] t <- getType n+ unify TEvent t) ns+ -- (Now getType n for any n in ns will return TEvent)+ return [(n, TEvent) | n <- ns]+ typeCheck' (Channel ns (Just e)) = do+ t <- typeCheck e+ valueType <- evalTypeExpression t+ dotList <- typeToDotList valueType+ let t = foldr TDotable TEvent dotList+ mapM (\ n -> do+ ForAll [] t' <- getType n+ unify t' t) ns+ return $ [(n, t) | n <- ns]+ typeCheck' (DataType n clauses) = do+ nts <- mapM (\ clause -> do+ let + n' = case unAnnotate clause of+ DataTypeClause x _ -> x+ ForAll [] t <- getType n'+ (n', ts) <- typeCheck clause+ let texp = foldr TDotable (TDatatype n) ts+ t <- unify texp t+ return (n', t)+ ) clauses+ ForAll [] t <- getType n+ t' <- unify t (TSet (TDatatype n))+ return $ (n, t'):nts+ typeCheck' (NameType n e) = do+ t <- typeCheck e+ valueType <- evalTypeExpression t+ return [(n, TSet valueType)]+ typeCheck' (Transparent ns) = do+ mapM_ (\ (n@(Name s)) -> do+ texp <- applyPFOrError (transparentFunctionNotRecognised n) + transparentFunctions s+ ForAll [] t <- getType n+ unify texp t) ns+ return []+ typeCheck' (External ns) = do+ mapM_ (\ (n@(Name s)) -> do+ texp <- applyPFOrError (externalFunctionNotRecognised n) + externalFunctions s+ ForAll [] t <- getType n+ unify texp t) ns+ return []+ typeCheck' (Assert a) = typeCheck a >> return []++instance TypeCheckable Assertion () where+ errorContext a = Just $ + hang (text "In the assertion" <> colon) tabWidth (prettyPrint a)+ typeCheck' (PropertyCheck e1 p m) = do+ ensureIsProc e1+ return ()+ typeCheck' (Refinement e1 m e2 opts) = do+ ensureIsProc e1+ ensureIsProc e2+ mapM_ typeCheck opts++instance TypeCheckable ModelOption () where+ errorContext a = Nothing+ typeCheck' (TauPriority e) = do+ typeCheckExpect e (TSet TEvent)+ return ()++instance TypeCheckable PDataTypeClause (Name, [Type]) where+ errorContext an = Nothing+ typeCheck' an = setSrcSpan (loc an) $ typeCheck (inner an)++instance TypeCheckable DataTypeClause (Name, [Type]) where+ errorContext c = Just $+ hang (text "In the data type clause" <> colon) tabWidth + (prettyPrint c)+ typeCheck' (DataTypeClause n' Nothing) = do+ return (n', [])+ typeCheck' (DataTypeClause n' (Just e)) = do+ t <- typeCheck e+ valueType <- evalTypeExpression t+ dotList <- typeToDotList valueType+ return (n', dotList)++instance TypeCheckable PMatch Type where+ errorContext an = Nothing+ typeCheck' an = setSrcSpan (loc an) $ typeCheck (inner an)+instance TypeCheckable Match Type where+ -- We create the error context in FunBind as that has access+ -- to the name+ errorContext (Match groups exp) = Nothing+ typeCheck' (Match groups exp) = do+ -- Introduce free variables for all the parameters+ fvs <- liftM concat (mapM freeVars groups)+ local fvs $ do+ tgroups <- mapM (\ pats -> mapM (\ pat -> + -- We evaluate the dots here to implment the longest + -- match rule+ typeCheck pat >>= evaluateDots+ ) pats) groups+ + -- We evaluate the dots here to implment the longest match rule+ tr <- typeCheck exp >>= evaluateDots+ + -- We need to evaluate the dots in the patterns twice just in case + -- the type inferences on the RHS have resulted in extra dots on + -- the left being able to be removed.+ tgroups <- mapM (\ pats -> mapM (\ pat -> + typeCheck pat >>= evaluateDots+ ) pats) groups++ return $ foldr (\ targs tr -> TFunction targs tr) tr tgroups++applyPFOrError + :: Eq a => Error -> PartialFunction a b -> a -> TypeCheckMonad b+applyPFOrError err pf a = + case safeApply pf a of+ Just a -> return a+ Nothing -> raiseMessageAsError err
+ src/CSPM/TypeChecker/Decl.hs-boot view
@@ -0,0 +1,7 @@+module CSPM.TypeChecker.Decl where++import CSPM.DataStructures.Syntax+import CSPM.DataStructures.Types+import CSPM.TypeChecker.Monad++typeCheckDecls :: [PDecl] -> TypeCheckMonad ()
+ src/CSPM/TypeChecker/Dependencies.hs view
@@ -0,0 +1,270 @@+{-# LANGUAGE FlexibleInstances #-}+module CSPM.TypeChecker.Dependencies (+ Dependencies, dependencies, namesBoundByDecl, namesBoundByDecl',+ FreeVars, freeVars+) where++import Control.Monad+import Data.List (nub, (\\))++import CSPM.DataStructures.Names+import CSPM.DataStructures.Syntax+import CSPM.DataStructures.Types+import CSPM.TypeChecker.Exceptions+import CSPM.TypeChecker.Monad+import Util.Annotated+import Util.List+import Util.Monad++-- This file exports two main type classes, Dependencies and FreeVars. The first+-- computes what names a given expression/pattern/field/etc depends on.+-- The second computes the free variables within each statement.+-- Clearly these depend on each other heavily as a name is free iff+-- it is not a dependency.++namesBoundByDecl :: AnDecl -> TypeCheckMonad [Name]+namesBoundByDecl = namesBoundByDecl' . unAnnotate+namesBoundByDecl' (FunBind n ms) = return [n]+namesBoundByDecl' (PatBind p ms) = freeVars p+namesBoundByDecl' (Channel ns es) = return ns+namesBoundByDecl' (DataType n dcs) = + let+ namesBoundByDtClause (DataTypeClause n _) = [n]+ in+ return $ n:concatMap (namesBoundByDtClause . unAnnotate) dcs+namesBoundByDecl' (NameType n e) = return [n]+namesBoundByDecl' (External ns) = return ns+namesBoundByDecl' (Transparent ns) = return ns+namesBoundByDecl' (Assert _) = return []++class Dependencies a where+ dependencies :: a -> TypeCheckMonad [Name]+ dependencies xs = liftM nub (dependencies' xs)+ dependencies' :: a -> TypeCheckMonad [Name]++instance Dependencies a => Dependencies [a] where+ dependencies' xs = concatMapM dependencies xs+instance Dependencies a => Dependencies (Maybe a) where+ dependencies' (Just x) = dependencies' x+ dependencies' Nothing = return []+instance Dependencies a => Dependencies (Annotated b a) where+ dependencies' (An _ _ inner) = dependencies inner++instance Dependencies Pat where+ dependencies' (PVar n) = do+ res <- isDataTypeOrChannel n+ return $ if res then [n] else []+ dependencies' (PConcat p1 p2) = do+ fvs1 <- dependencies' p1+ fvs2 <- dependencies' p2+ return $ fvs1++fvs2+ dependencies' (PDotApp p1 p2) = dependencies' [p1,p2]+ dependencies' (PList ps) = dependencies' ps+ dependencies' (PWildCard) = return []+ dependencies' (PTuple ps) = dependencies' ps+ dependencies' (PSet ps) = dependencies' ps+ dependencies' (PParen p) = dependencies' p+ dependencies' (PLit l) = return []+ dependencies' (PDoublePattern p1 p2) = do+ fvs1 <- dependencies' p1+ fvs2 <- dependencies' p2+ return $ fvs1++fvs2+ +instance Dependencies Exp where+ dependencies' (App e es) = dependencies' (e:es)+ dependencies' (BooleanBinaryOp _ e1 e2) = dependencies' [e1,e2]+ dependencies' (BooleanUnaryOp _ e) = dependencies' e+ dependencies' (Concat e1 e2) = dependencies' [e1,e2]+ dependencies' (DotApp e1 e2) = dependencies' [e1,e2]+ dependencies' (If e1 e2 e3) = dependencies' [e1,e2, e3]+ dependencies' (Lambda p e) = do+ fvsp <- freeVars p+ depsp <- dependencies p+ fvse <- dependencies e+ return $ (fvse \\ fvsp)++depsp+ dependencies' (Let ds e) = do+ fvsd <- dependencies ds+ newBoundVars <- liftM nub (concatMapM namesBoundByDecl ds)+ fvse <- dependencies e+ return $ nub (fvse++fvsd) \\ newBoundVars+ dependencies' (Lit _) = return []+ dependencies' (List es) = dependencies es+ dependencies' (ListComp es stmts) = do+ fvStmts <- freeVars stmts+ depsStmts <- dependencies stmts+ fvses' <- dependencies es+ let fvse = nub (fvses'++depsStmts)+ return $ fvse \\ fvStmts+ dependencies' (ListEnumFrom e1) = dependencies' e1+ dependencies' (ListEnumFromTo e1 e2) = dependencies' [e1,e2]+ dependencies' (ListLength e) = dependencies' e+ dependencies' (MathsBinaryOp _ e1 e2) = dependencies' [e1,e2]+ dependencies' (MathsUnaryOp _ e1) = dependencies' e1+ dependencies' (Paren e) = dependencies' e+ dependencies' (Set es) = dependencies es+ dependencies' (SetComp es stmts) = do+ fvStmts <- freeVars stmts+ depsStmts <- dependencies stmts+ fvses' <- dependencies es+ let fvse = nub (fvses'++depsStmts)+ return $ fvse \\ fvStmts+ dependencies' (SetEnumComp es stmts) = do+ fvStmts <- freeVars stmts+ depsStmts <- dependencies stmts+ fvses' <- dependencies es+ let fvse = nub (fvses'++depsStmts)+ return $ fvse \\ fvStmts+ dependencies' (SetEnumFrom e1) = dependencies' e1+ dependencies' (SetEnumFromTo e1 e2) = dependencies' [e1,e2]+ dependencies' (SetEnum es) = dependencies' es+ dependencies' (Tuple es) = dependencies' es+ dependencies' (Var (UnQual n)) = return [n]+ + -- Processes+ dependencies' (AlphaParallel e1 e2 e3 e4) = dependencies' [e1,e2,e3,e4]+ dependencies' (Exception e1 e2 e3) = dependencies' [e1,e2,e3]+ dependencies' (ExternalChoice e1 e2) = dependencies' [e1,e2]+ dependencies' (GenParallel e1 e2 e3) = dependencies' [e1,e2,e3]+ dependencies' (GuardedExp e1 e2) = dependencies' [e1,e2]+ dependencies' (Hiding e1 e2) = dependencies' [e1,e2]+ dependencies' (InternalChoice e1 e2) = dependencies' [e1,e2]+ dependencies' (Interrupt e1 e2) = dependencies' [e1,e2]+ dependencies' (LinkParallel e1 links stmts e2) = do+ ds1 <- dependencies [e1,e2]+ ds2 <- dependenciesStmts stmts (concat (map (\ (x,y) -> x:y:[]) links))+ return $ ds1++ds2+ dependencies' (Interleave e1 e2) = dependencies' [e1,e2]+ dependencies' (Prefix e1 fields e2) = do+ depse <- dependencies' [e1,e2]+ depsfields <- dependencies fields+ fvfields <- freeVars fields+ let fvse = nub (fvfields++depsfields++depse)+ return $ fvse \\ fvfields+ dependencies' (Rename e1 renames stmts) = do+ d1 <- dependencies' e1+ d2 <- dependenciesStmts stmts (es++es')+ return $ d1++d2+ where (es, es') = unzip renames+ dependencies' (SequentialComp e1 e2) = dependencies' [e1,e2]+ dependencies' (SlidingChoice e1 e2) = dependencies' [e1,e2]++ dependencies' (ReplicatedAlphaParallel stmts e1 e2) = + dependenciesStmts stmts [e1,e2]+ dependencies' (ReplicatedInterleave stmts e1) = + dependenciesStmts stmts [e1]+ dependencies' (ReplicatedExternalChoice stmts e1) = + dependenciesStmts stmts [e1]+ dependencies' (ReplicatedInternalChoice stmts e1) = + dependenciesStmts stmts [e1]+ dependencies' (ReplicatedLinkParallel ties stmts e) =+ dependenciesStmts stmts (e:es++es')+ where (es, es') = unzip ties+ dependencies' (ReplicatedParallel e1 stmts e2) = dependenciesStmts stmts [e1,e2]+ + dependencies' x = panic ("TCDependencies.hs: unrecognised exp "++show x)++-- Recall that a later stmt can depend on values that appear in an ealier stmt+-- For example, consider <x | x <- ..., f(x)>. Therefore we do a foldr to correctly+-- consider cases like <x | f(x), x <- ... >+dependenciesStmts :: Dependencies a => [PStmt] -> a -> TypeCheckMonad [Name]+dependenciesStmts [] e = dependencies e+dependenciesStmts (stmt:stmts) e = do+ depse <- dependenciesStmts stmts e+ depsstmt <- dependencies stmt+ fvstmt <- freeVars stmt+ let depse' = nub (depsstmt++depse)+ return $ depse' \\ fvstmt++instance Dependencies Stmt where+ dependencies' (Generator p e) = do+ ds1 <- dependencies p+ ds2 <- dependencies e+ return $ ds1++ds2+ dependencies' (Qualifier e) = dependencies e++instance Dependencies Field where+ dependencies' (Input p e) = dependencies e+ dependencies' (NonDetInput p e) = dependencies e+ dependencies' (Output e) = dependencies e++instance Dependencies Decl where+ dependencies' (FunBind n ms) = do+ fvsms <- dependencies ms+ return $ fvsms+ dependencies' (PatBind p e) = do+ depsp <- dependencies p+ fvsp <- freeVars p+ depse <- dependencies e+ return $ depsp++depse+ dependencies' (Channel ns es) = dependencies es+ dependencies' (DataType n cs) = dependencies [cs]+ dependencies' (NameType n e) = dependencies' e+ dependencies' (External ns) = return []+ dependencies' (Transparent ns) = return []+ dependencies' (Assert a) = dependencies a++instance Dependencies Assertion where+ dependencies' (Refinement e1 m e2 opts) = do+ d1 <- dependencies [e1, e2]+ d2 <- dependencies opts+ return $ d1++d2+ dependencies' (PropertyCheck e1 p m) = dependencies [e1]+ dependencies' (BoolAssertion e1) = dependencies [e1]+ dependencies' (ASNot a) = dependencies a++instance Dependencies ModelOption where+ dependencies' (TauPriority e) = dependencies' e+ +instance Dependencies Match where+ dependencies' (Match ps e) =+ do+ fvs1 <- freeVars ps+ depsPs <- dependencies ps+ fvs2 <- dependencies e+ return $ (fvs2 \\ fvs1) ++ depsPs++instance Dependencies DataTypeClause where+ dependencies' (DataTypeClause n Nothing) = return []+ dependencies' (DataTypeClause n (Just e)) = dependencies' e+++class FreeVars a where+ freeVars :: a -> TypeCheckMonad [Name]+ freeVars = liftM nub . freeVars'+ + freeVars' :: a -> TypeCheckMonad [Name]++instance FreeVars a => FreeVars [a] where+ freeVars' xs = concatMapM freeVars' xs+ +instance FreeVars a => FreeVars (Annotated b a) where+ freeVars' (An _ _ inner) = freeVars inner++instance FreeVars Pat where+ freeVars' (PVar n) = do+ res <- isDataTypeOrChannel n+ return $ if res then [] else [n]+ freeVars' (PConcat p1 p2) = do+ fvs1 <- freeVars' p1+ fvs2 <- freeVars' p2+ return $ fvs1++fvs2+ freeVars' (PDotApp p1 p2) = freeVars' [p1,p2]+ freeVars' (PList ps) = freeVars' ps+ freeVars' (PWildCard) = return []+ freeVars' (PTuple ps) = freeVars' ps+ freeVars' (PSet ps) = freeVars' ps+ freeVars' (PParen p) = freeVars' p+ freeVars' (PLit l) = return []+ freeVars' (PDoublePattern p1 p2) = do+ fvs1 <- freeVars' p1+ fvs2 <- freeVars' p2+ return $ fvs1++fvs2++instance FreeVars Stmt where+ freeVars' (Qualifier e) = return []+ freeVars' (Generator p e) = freeVars p++instance FreeVars Field where+ freeVars' (Input p e) = freeVars p+ freeVars' (NonDetInput p e) = freeVars p+ freeVars' (Output e) = return []
+ src/CSPM/TypeChecker/Environment.hs view
@@ -0,0 +1,33 @@+module CSPM.TypeChecker.Environment (+ module Util.HierarchicalMap,+ Environment, + mkSymbolInformation, SymbolInformation(..)+)+where++import CSPM.DataStructures.Names+import CSPM.DataStructures.Types+import Util.HierarchicalMap++-- | Make symbol information for the type assuming that the symbol+-- is not deprecated and its type is not unsafe.+mkSymbolInformation :: TypeScheme -> SymbolInformation+mkSymbolInformation t = SymbolInformation { + typeScheme = t, + isDeprecated = False, + isTypeUnsafe = False + }++-- | Used to represent information about a symbol+data SymbolInformation = SymbolInformation {+ -- | The type of the symbol+ typeScheme :: TypeScheme,+ -- | Is this symbol deprecated+ isDeprecated :: Bool,+ -- | Is this symbols' type too general (if so+ -- use of it will emit a soundness warning)+ isTypeUnsafe :: Bool+ }+ deriving (Eq, Show)++type Environment = HierarchicalMap Name SymbolInformation
+ src/CSPM/TypeChecker/Exceptions.hs view
@@ -0,0 +1,102 @@+{-# LANGUAGE DeriveDataTypeable #-}+module CSPM.TypeChecker.Exceptions (+ Error, Warning,+ varNotInScopeMessage,+ infiniteUnificationMessage,+ unificationErrorMessage,+ duplicatedDefinitionsMessage,+ incorrectArgumentCountMessage,+ constraintUnificationErrorMessage,+ transparentFunctionNotRecognised,+ externalFunctionNotRecognised,+ deprecatedNameUsed,+ unsafeNameUsed,+)+where++import Data.Typeable+import Data.List (group, sort)+import Prelude++import CSPM.DataStructures.Names+import CSPM.DataStructures.Syntax+import CSPM.DataStructures.Types+import CSPM.PrettyPrinter+import Util.Annotated+import Util.Exception+import Util.PartialFunctions+import Util.PrettyPrint++type Error = Doc+type Warning = Doc++varNotInScopeMessage :: Name -> Error+varNotInScopeMessage n = prettyPrint n <+> text "is not in scope"++incorrectArgumentCountMessage :: Doc -> Int -> Int -> Error+incorrectArgumentCountMessage func expected actual = + hang (hang (text "The function") tabWidth func) tabWidth+ (text "was supplied with" <+> int actual <+> + text "arguments, but was expecting" <+> int expected)++infiniteUnificationMessage :: Type -> Type -> Error+infiniteUnificationMessage t1 t2 = + let [ppt1, ppt2] = prettyPrintTypes [t1, t2] in+ text "Cannot construct the infinite type:" <+> ppt1 <+> equals <+> ppt2++unificationErrorMessage :: [(Type, Type)] -> Error+unificationErrorMessage unificationStack = + let + hd = head unificationStack+ lt = last unificationStack+ (it1, it2) = hd+ (t1, t2) = lt+ [pit1, pit2, pt1, pt2] = prettyPrintTypes [it1, it2, t1, t2]+ in+ sep [text "Couldn't match expected type" <+> pit1,+ nest 8 (text "with actual type" <+> pit2)]+ $$+ if hd == lt then empty+ else sep [text "whilst matching expected type" <+> pt1,+ nest 8 (text "with actual type" <+> pt2)]++constraintUnificationErrorMessage :: Constraint -> Type -> Error+constraintUnificationErrorMessage c t = + hang (hang (text "The type") tabWidth (prettyPrint t)) tabWidth+ (text "does not have the constraint" <+> prettyPrint c)++duplicatedDefinitionsMessage :: [(Name, SrcSpan)] -> [Error]+duplicatedDefinitionsMessage ns = duplicatedDefinitionsMessage' $+ let+ names = map fst ns+ dupNames = (map head . filter (\ g -> length g > 1) . group . sort) names+ in [(n, applyRelation ns n) | n <- dupNames]++duplicatedDefinitionsMessage' :: [(Name, [SrcSpan])] -> [Error]+duplicatedDefinitionsMessage' nlocs = + map (\ (n, spans) ->+ hang (text "The variable" <+> prettyPrint n + <+> text "has multiple definitions at" <> colon) tabWidth+ (vcat (map prettyPrint spans))) nlocs++transparentFunctionNotRecognised :: Name -> Error+transparentFunctionNotRecognised n =+ text "The transparent function" <+> prettyPrint n <+> + text "is not recognised."+externalFunctionNotRecognised :: Name -> Error+externalFunctionNotRecognised n = + text "The external function" <+> prettyPrint n <+> + text "is not recognised."++deprecatedNameUsed :: Name -> Maybe Name -> Error+deprecatedNameUsed n Nothing = + prettyPrint n <+> text "is deprecated."+deprecatedNameUsed n (Just replacement) = + prettyPrint n <+> text "is deprecated - use" <+>+ prettyPrint replacement <+> text "instead."++unsafeNameUsed :: Name -> Error+unsafeNameUsed n =+ text "The invocation of" <+> prettyPrint n + <+> text "has not been type-checked."+ <+> text "Therefore, a runtime type error may occur here."
+ src/CSPM/TypeChecker/Expr.hs view
@@ -0,0 +1,367 @@+{-# LANGUAGE MultiParamTypeClasses, TypeSynonymInstances, DoAndIfThenElse #-}+module CSPM.TypeChecker.Expr () where++import Control.Monad+import Control.Monad.Trans+import Data.List++import CSPM.DataStructures.Names+import CSPM.DataStructures.Syntax hiding (getType)+import CSPM.DataStructures.Types+import CSPM.TypeChecker.BuiltInFunctions+import CSPM.TypeChecker.Common+import {-# SOURCE #-} CSPM.TypeChecker.Decl+import CSPM.TypeChecker.Dependencies+import CSPM.TypeChecker.Exceptions+import CSPM.TypeChecker.Pat+import CSPM.TypeChecker.Monad+import CSPM.TypeChecker.Unification+import Util.Annotated+import Util.Exception+import Util.List+import Util.Monad+import Util.PrettyPrint++checkFunctionCall :: Doc -> [PExp] -> [Type] -> TypeCheckMonad ()+checkFunctionCall func args expectedTypes = do+ actTypes <- mapM typeCheck args+ let+ as = zip4 [1..] args expectedTypes actTypes+ unifyArg (count, arg, texp, tact) = + setSrcSpan (loc arg) $ addErrorContext (+ hang (hang (text "In the" <+> speakNth count + <+> text "argument of")+ tabWidth (func <> comma) )+ tabWidth (text "namely" <+> prettyPrint arg)+ ) (do+ -- When we computer the type of the function we evaluated all+ -- dots in the arguments. Therefore, here we can evaluate the+ -- dots and remove them all.+ tact <- evaluateDots tact+ -- We also evaluate the dots in the expected type. This is done+ -- because during type checking of a recursive function we may+ -- have not yet have evaluated its dots.+ texp <- evaluateDots texp+ -- We must disallow symmetric unification here as we don't want+ -- to allow patterns such as:+ -- x.y = B+ disallowSymmetricUnification (unify texp tact))+ -- NB. the argument counts must already be correct+ mapM unifyArg as+ return ()++instance TypeCheckable PExp Type where+ errorContext an = Nothing+ typeCheck' an = do+ t <- setSrcSpan (loc an) $ typeCheck (inner an)+ setPType (snd (annotation an)) t+ return t+ typeCheckExpect an texp = do+ -- The unification is done in typeCheck (inner an)+ t <- setSrcSpan (loc an) $ typeCheckExpect (inner an) texp+ setPType (snd (annotation an)) t+ return t+instance TypeCheckable Exp Type where+ typeCheckExpect obj texp =+ case errorContext obj of+ Just c -> addErrorContext c m+ Nothing -> m+ where+ m = do+ tact <- typeCheck' obj+ unify texp tact++ errorContext e = Just $ + hang (text "In the expression:") tabWidth (prettyPrint e)+ + typeCheck' (App f args) = do+ targs <- replicateM (length args) freshTypeVar+ tr <- freshTypeVar+ typeCheckExpect f (TFunction targs tr)+ checkFunctionCall (prettyPrint f) args targs+ return tr+ typeCheck' (BooleanBinaryOp op e1 e2) = (do+ case op of+ And -> checkFunctionCall (text "and") [e1,e2] [TBool, TBool]+ Or -> checkFunctionCall (text "or") [e1,e2] [TBool, TBool]+ _ -> do+ t <- typeCheck e1+ t <- typeCheckExpect e2 t+ case op of + Equals -> ensureHasConstraint Eq t+ NotEquals -> ensureHasConstraint Eq t+ LessThan -> ensureHasConstraint Ord t+ LessThanEq -> ensureHasConstraint Ord t+ GreaterThan -> ensureHasConstraint Ord t+ GreaterThanEq -> ensureHasConstraint Ord t+ return ())+ >> return TBool+ typeCheck' (BooleanUnaryOp op e1) = do+ ensureIsBool e1+ typeCheck' (Concat e1 e2) = do+ t1 <- ensureIsList e1+ typeCheckExpect e2 t1+ typeCheck' (DotApp e1 e2) = do+ t1 <- typeCheck e1+ t2 <- typeCheck e2+ return $ TDot t1 t2+ typeCheck' (If e1 e2 e3) = do+ ensureIsBool e1+ t2 <- typeCheck e2+ typeCheckExpect e3 t2+ typeCheck' (Lambda p exp) = do+ fvs <- freeVars p+ local fvs $ do+ tr <- typeCheck exp+ targ <- typeCheck p+ return $ TFunction [targ] tr+ typeCheck' (Let decls exp) =+ -- Add a new scope: typeCheckDecl will add vars into it + local [] $ do+ typeCheckDecls decls+ typeCheck exp+ typeCheck' (Lit lit) = typeCheck lit+ typeCheck' (List es) = do+ t <- ensureAreEqual es+ return $ TSeq t+ typeCheck' (ListComp es stmts) =+ typeCheckStmts TSeq stmts $ do+ t <- ensureAreEqual es+ return $ TSeq t+ typeCheck' (ListEnumFrom lb) = do+ ensureIsInt lb+ return $ TSeq TInt+ typeCheck' (ListEnumFromTo lb ub) = do+ ensureIsInt lb+ ensureIsInt ub+ return $ TSeq TInt+ typeCheck' (ListLength e) = do+ ensureIsList e+ return $ TInt+ typeCheck' (MathsBinaryOp op e1 e2) = do+ ensureIsInt e1+ ensureIsInt e2+ return TInt+ typeCheck' (MathsUnaryOp op e1) = do+ ensureIsInt e1+ return TInt+ typeCheck' (Paren e) = typeCheck e+ typeCheck' (Set es) = do+ t <- ensureAreEqual es+ ensureHasConstraint Eq t+ return $ TSet t+ typeCheck' (SetComp es stmts) = + typeCheckStmts TSet stmts $ do+ t <- ensureAreEqual es+ return $ TSet t+ typeCheck' (SetEnum es) = do+ mapM ensureIsChannel es+ return $ TSet TEvent+ typeCheck' (SetEnumComp es stmts) = + typeCheckStmts TSet stmts $ do+ mapM ensureIsChannel es+ return $ TSet TEvent+ typeCheck' (SetEnumFrom lb) = do+ ensureIsInt lb+ return $ TSet TInt+ typeCheck' (SetEnumFromTo lb ub) = do+ ensureIsInt lb+ ensureIsInt ub+ return $ TSet TInt+ typeCheck' (Tuple es) = do+ ts <- mapM typeCheck es+ return $ TTuple ts+ typeCheck' (Var (UnQual n)) = do+ b <- isDeprecated n+ if b then + addWarning (deprecatedNameUsed n (replacementForDeprecatedName n))+ else return ()+ b <- isTypeUnsafe n+ if b then addWarning (unsafeNameUsed n)+ else return ()+ + t <- getType n+ instantiate t++ -- Processes+ typeCheck' (AlphaParallel e1 a1 a2 e2) = do+ ensureIsProc e1+ ensureIsProc e2+ typeCheckExpect a1 (TSet TEvent)+ typeCheckExpect a2 (TSet TEvent)+ return TProc+ typeCheck' (Exception e1 a e2) = do+ ensureIsProc e1+ ensureIsProc e2+ typeCheckExpect a (TSet TEvent)+ return TProc+ typeCheck' (ExternalChoice e1 e2) = do+ ensureIsProc e1+ ensureIsProc e2+ return TProc+ typeCheck' (Hiding e1 e2) = do+ ensureIsProc e1+ typeCheckExpect e2 (TSet TEvent)+ return TProc+ typeCheck' (GenParallel e1 a e2) = do+ ensureIsProc e1+ ensureIsProc e2+ typeCheckExpect a (TSet TEvent)+ return TProc+ typeCheck' (GuardedExp e1 e2) = do+ ensureIsBool e1+ ensureIsProc e2+ return TProc+ typeCheck' (InternalChoice e1 e2) = do+ ensureIsProc e1+ ensureIsProc e2+ return TProc+ typeCheck' (Interrupt e1 e2) = do+ ensureIsProc e1+ ensureIsProc e2+ return TProc+ typeCheck' (Interleave e1 e2) = do+ ensureIsProc e1+ ensureIsProc e2+ return TProc + typeCheck' (SequentialComp e1 e2) = do+ ensureIsProc e1+ ensureIsProc e2+ return TProc+ typeCheck' (SlidingChoice e1 e2) = do+ ensureIsProc e1+ ensureIsProc e2+ return TProc+ typeCheck' (Prefix e1 [] e2) = do+ ensureIsEvent e1+ ensureIsProc e2+ return TProc+ typeCheck' (Prefix e1 fields e2) = do+ fvsByField <- mapM (\f -> do+ fvs <- freeVars f+ return (f, fvs)) fields+ let + fvs = concatMap snd fvsByField+ namesToLocations = + [(n, loc f) | (f, fvs) <- fvsByField, n <- fvs]+ -- Throw an error if a name is defined multiple times+ manyErrorsIfFalse (noDups fvs) + (duplicatedDefinitionsMessage namesToLocations)+ t1 <- typeCheck e1+ let + tcfs [] tsfields = do+ unify TEvent (TDot t1 (foldr1 TDot (reverse tsfields)))+ ensureIsProc e2+ tcfs (f:fs) tsfields =+ typeCheckField f (\ t -> tcfs fs (t:tsfields))+ tcfs fields []++ typeCheck' (LinkParallel e1 ties stmts e2) = do+ ensureIsProc e1+ ensureIsProc e2+ typeCheckReplicatedOp stmts $ do+ let (as, bs) = unzip ties+ ast <- mapM ensureIsChannel as+ zipWithM typeCheckExpect bs ast+ return TProc++ typeCheck' (Rename e1 exps stmts) = do+ ensureIsProc e1+ typeCheckReplicatedOp stmts $ do+ let (as, bs) = unzip exps+ -- Unify the pairs of channels+ ast <- mapM ensureIsChannel as+ zipWithM typeCheckExpect bs ast+ return TProc+ + -- Replicated Operators+ typeCheck' (ReplicatedAlphaParallel stmts alpha proc) =+ typeCheckReplicatedOp stmts $ do+ t1 <- typeCheck alpha+ unify (TSet TEvent) t1+ ensureIsProc proc+ typeCheck' (ReplicatedParallel alpha stmts proc) =+ typeCheckReplicatedOp stmts $ do+ typeCheckExpect alpha (TSet TEvent)+ ensureIsProc proc+ typeCheck' (ReplicatedLinkParallel ties stmts proc) = + typeCheckStmts TSeq stmts $ do+ let (as, bs) = unzip ties+ ast <- mapM ensureIsChannel as+ zipWithM typeCheckExpect bs ast+ ensureIsProc proc+ typeCheck' (ReplicatedInterleave stmts e1) =+ typeCheckReplicatedOp stmts (ensureIsProc e1)+ typeCheck' (ReplicatedExternalChoice stmts e1) =+ typeCheckReplicatedOp stmts (ensureIsProc e1)+ typeCheck' (ReplicatedInternalChoice stmts e1) =+ typeCheckReplicatedOp stmts (ensureIsProc e1)+ typeCheck' x = panic ("No case for type checking a "++show x)+++typeCheckField :: PField -> (Type -> TypeCheckMonad a) -> TypeCheckMonad a+typeCheckField field tc = + let+ errCtxt = hang (text "In the field:") tabWidth (prettyPrint field)+ checkInput p e = do+ t <- typeCheck e+ fvs <- freeVars p+ local fvs $ do+ tp <- addErrorContext errCtxt (do+ tp <- typeCheck p+ unify (TSet tp) t+ return tp)+ tc tp+ chkInputNoSet p = do+ fvs <- freeVars p+ local fvs (addErrorContext errCtxt (typeCheck p) >>= tc)+ check (NonDetInput p (Just e)) = checkInput p e+ check (Input p (Just e)) = checkInput p e+ check (NonDetInput p Nothing) = chkInputNoSet p+ check (Input p Nothing) = chkInputNoSet p+ check (Output e) = addErrorContext errCtxt (typeCheck e) >>= tc+ in setSrcSpan (loc field) (check (unAnnotate field))++-- | The first argument is a type constructor, which given a type, returns+-- that type encapsulate in some other type.+typeCheckStmt :: (Type -> Type) -> PStmt -> TypeCheckMonad a -> TypeCheckMonad a+typeCheckStmt typc stmt tc = + let+ errCtxt = hang (text "In the statement of a comprehension:") tabWidth+ (prettyPrint stmt)+ + check (Qualifier e) = do+ addErrorContext errCtxt (ensureIsBool e)+ tc+ check (Generator p exp) = do+ fvs <- freeVars p+ texp <- addErrorContext errCtxt (typeCheck exp)+ local fvs $ do+ addErrorContext errCtxt (do+ tpat <- typeCheck p+ unify (typc tpat) texp)+ tc+ in setSrcSpan (loc stmt) (check (unAnnotate stmt))++-- | Type check a series of statements. For each statement a new scope is added+-- to ensure that clauses only depend on variables already bound.+typeCheckStmts :: (Type -> Type) -> [AnStmt] -> TypeCheckMonad a -> TypeCheckMonad a+typeCheckStmts typc stmts tc = do+ fvsByStmt <- mapM (\stmt -> do+ fvs <- freeVars stmt+ return (stmt, fvs)) stmts+ let + fvs = concatMap snd fvsByStmt+ namesToLocations = + [(n, loc f) | (f, fvs) <- fvsByStmt, n <- fvs]+ -- Throw an error if a name is defined multiple times+ manyErrorsIfFalse (noDups fvs) + (duplicatedDefinitionsMessage namesToLocations)+ check stmts+ where+ check [] = tc+ check (stmt:stmts) = typeCheckStmt typc stmt (check stmts)++-- | Shortcut for replicated operators+typeCheckReplicatedOp :: [AnStmt] -> TypeCheckMonad a -> TypeCheckMonad a+typeCheckReplicatedOp = typeCheckStmts TSet
+ src/CSPM/TypeChecker/InteractiveStmt.hs view
@@ -0,0 +1,24 @@+{-# LANGUAGE FlexibleInstances, MultiParamTypeClasses, TypeSynonymInstances #-}+module CSPM.TypeChecker.InteractiveStmt where++import CSPM.DataStructures.Names+import CSPM.DataStructures.Syntax+import CSPM.DataStructures.Types+import CSPM.TypeChecker.Common+import CSPM.TypeChecker.Decl+import CSPM.TypeChecker.Expr+import CSPM.TypeChecker.Monad+import CSPM.TypeChecker.Unification+import Util.Annotated+import Util.PrettyPrint++instance TypeCheckable PInteractiveStmt () where+ errorContext a = Nothing+ typeCheck' = typeCheck . unAnnotate++instance TypeCheckable InteractiveStmt () where+ errorContext a = Nothing+ typeCheck' (Bind decl) = typeCheckDecls [decl]+ typeCheck' (Evaluate exp) = + typeCheck exp >>= evaluateDots >> return ()+ typeCheck' (RunAssertion a) = typeCheck a >> return ()
+ src/CSPM/TypeChecker/Module.hs view
@@ -0,0 +1,21 @@+{-# LANGUAGE MultiParamTypeClasses, TypeSynonymInstances, FlexibleInstances #-}+module CSPM.TypeChecker.Module where++import CSPM.DataStructures.Syntax+import CSPM.DataStructures.Types+import CSPM.TypeChecker.Common+import CSPM.TypeChecker.Decl+import CSPM.TypeChecker.Monad+import Util.Annotated++instance TypeCheckable [PModule] () where+ errorContext _ = Nothing+ typeCheck' ([m]) = typeCheck m++instance TypeCheckable PModule () where+ errorContext _ = Nothing+ typeCheck' an = setSrcSpan (loc an) $ typeCheck' (inner an)++instance TypeCheckable Module () where+ errorContext _ = Nothing+ typeCheck' (GlobalModule ds) = typeCheckDecls ds
+ src/CSPM/TypeChecker/Monad.hs view
@@ -0,0 +1,373 @@+module CSPM.TypeChecker.Monad (+ readTypeRef, writeTypeRef, freshTypeVar, freshTypeVarWithConstraints,+ getType, safeGetType, setType, + isDeprecated, isTypeUnsafe, markAsDeprecated, markTypeAsUnsafe,+ compress, compressTypeScheme, + + TypeCheckMonad, runTypeChecker, + newTypeInferenceState, TypeInferenceState(..), getState,+ + local, getEnvironment,+ ErrorContext, addErrorContext, getErrorContexts,+ getSrcSpan, setSrcSpan,+ getUnificationStack, addUnificationPair,+ symmetricUnificationAllowed, disallowSymmetricUnification,+ getInError, setInError,+ resetWarnings, getWarnings, addWarning,+ + raiseMessageAsError, raiseMessagesAsError, panic,+ manyErrorsIfFalse, errorIfFalseM, errorIfFalse, tryAndRecover, failM,+ + addDataTypeOrChannel, isDataTypeOrChannel,+)+where++import Control.Monad.State+import Prelude hiding (lookup)++import CSPM.DataStructures.Names+import CSPM.DataStructures.Types+import qualified CSPM.TypeChecker.Environment as Env+import CSPM.TypeChecker.Exceptions+import Util.Annotated+import Util.Exception+import Util.PrettyPrint++-- *************************************************************************+-- Type Checker Monad+-- *************************************************************************+type ErrorContext = Doc++data TypeInferenceState = TypeInferenceState {+ -- | The type environment, which is a map from names to types.+ environment :: Env.Environment,+ -- | List of names that correspond to channels and+ -- datatypes - used when detecting dependencies.+ dataTypesAndChannels :: [Name],+ -- | Next TypeVar to be allocated+ nextTypeId :: Int,+ -- | Location of the current AST element - used for error+ -- pretty printing+ srcSpan :: SrcSpan,+ -- | Error stack - provides context information for any+ -- errors that might be raised+ errorContexts :: [ErrorContext],+ -- | Errors that have occured+ errors :: [ErrorMessage],+ -- | List of warnings that have occured+ warnings :: [ErrorMessage],+ -- | Stack of attempted unifications - the current one+ -- is at the front. In the form (expected, actual).+ unificationStack :: [(Type, Type)],+ -- | Are we currently in an error state+ inError :: Bool,+ symUnificationAllowed :: Bool+ }+ +newTypeInferenceState :: TypeInferenceState+newTypeInferenceState = TypeInferenceState {+ environment = Env.new,+ dataTypesAndChannels = [],+ nextTypeId = 0,+ srcSpan = Unknown,+ errorContexts = [],+ errors = [],+ warnings = [],+ unificationStack = [],+ inError = False,+ symUnificationAllowed = True+ }++type TypeCheckMonad = StateT TypeInferenceState IO++-- | Runs the typechecker, starting from state 'st'. If any errors are+-- encountered then a 'SourceError' will be thrown with the relevent+-- error messages.+runTypeChecker :: TypeInferenceState -> TypeCheckMonad a -> IO a+runTypeChecker st prog = do+ (a, st) <- runStateT prog st+ let errs = errors st+ case errs of+ [] -> return a+ _ -> throwSourceError errs++getState :: TypeCheckMonad TypeInferenceState+getState = gets id++getEnvironment :: TypeCheckMonad Env.Environment+getEnvironment = gets environment++setEnvironment :: Env.Environment -> TypeCheckMonad ()+setEnvironment env = modify (\ st -> st { environment = env })++local :: [Name] -> TypeCheckMonad a -> TypeCheckMonad a+local ns m = + do+ env <- getEnvironment+ newArgs <- replicateM (length ns) freshTypeVar+ let symbs = map (Env.mkSymbolInformation . ForAll []) newArgs+ setEnvironment (Env.newLayerAndBind env (zip ns symbs))+ + res <- m+ + env <- getEnvironment+ setEnvironment (Env.popLayer env)++ return res++addDataTypeOrChannel :: Name -> TypeCheckMonad ()+addDataTypeOrChannel n = modify (\ st -> st { + dataTypesAndChannels = n:dataTypesAndChannels st+ })++isDataTypeOrChannel :: Name -> TypeCheckMonad Bool+isDataTypeOrChannel n = do+ ns <- gets dataTypesAndChannels+ return $ n `elem` ns++getErrorContexts :: TypeCheckMonad [ErrorContext]+getErrorContexts = gets errorContexts++addErrorContext :: ErrorContext -> TypeCheckMonad a -> TypeCheckMonad a+addErrorContext c p = do+ ctxts <- getErrorContexts+ modify (\st -> st { errorContexts = c:ctxts })+ a <- p+ modify (\st -> st { errorContexts = ctxts })+ return a+ +getErrors :: TypeCheckMonad ErrorMessages+getErrors = gets errors++addErrors :: [ErrorMessage] -> TypeCheckMonad ()+addErrors es = modify (\ st -> st { errors = es++(errors st) })++getWarnings :: TypeCheckMonad [ErrorMessage]+getWarnings = gets warnings++resetWarnings :: TypeCheckMonad ()+resetWarnings = modify (\st -> st { warnings = [] })++addWarning :: Warning -> TypeCheckMonad ()+addWarning w = do+ src <- getSrcSpan+ let m = mkWarningMessage src w+ modify (\ st -> st { warnings = m:(warnings st) })++getInError :: TypeCheckMonad Bool+getInError = gets inError++setInError :: Bool -> TypeCheckMonad a -> TypeCheckMonad a+setInError b prog = do+ o <- getInError+ modify (\st -> st { inError = b })+ a <- prog+ modify (\st -> st { inError = o })+ return a++getSrcSpan :: TypeCheckMonad SrcSpan+getSrcSpan = gets srcSpan++-- | Sets the SrcSpan only within prog.+setSrcSpan :: SrcSpan -> TypeCheckMonad a -> TypeCheckMonad a+setSrcSpan loc prog = do+ oLoc <- getSrcSpan+ modify (\st -> st { srcSpan = loc })+ a <- prog+ modify (\st -> st { srcSpan = oLoc })+ return a++getUnificationStack :: TypeCheckMonad [(Type, Type)]+getUnificationStack = gets unificationStack++addUnificationPair :: (Type, Type) -> TypeCheckMonad a -> TypeCheckMonad a+addUnificationPair tp p = do+ stk <- getUnificationStack+ modify (\st -> st { unificationStack = tp:stk })+ a <- p+ modify (\ st -> st { unificationStack = stk })+ return a++symmetricUnificationAllowed :: TypeCheckMonad Bool+symmetricUnificationAllowed = gets symUnificationAllowed++disallowSymmetricUnification :: TypeCheckMonad a -> TypeCheckMonad a+disallowSymmetricUnification prog = do+ b <- symmetricUnificationAllowed+ modify (\st -> st { symUnificationAllowed = False })+ v <- prog+ modify (\st -> st { symUnificationAllowed = b })+ return v+ +-- Error handling++-- | Report the error if first parameter is False.+errorIfFalse :: Bool -> Error -> TypeCheckMonad ()+errorIfFalse b e = manyErrorsIfFalse b [e]++manyErrorsIfFalse :: Bool -> [Error] -> TypeCheckMonad ()+manyErrorsIfFalse True es = return ()+manyErrorsIfFalse False es = raiseMessagesAsError es++errorIfFalseM :: TypeCheckMonad Bool -> Error -> TypeCheckMonad ()+errorIfFalseM m e = m >>= \res -> errorIfFalse res e++failM :: TypeCheckMonad a+failM = do+ errs <- getErrors+ throwSourceError errs++raiseMessageAsError :: Error -> TypeCheckMonad a+raiseMessageAsError msg = raiseMessagesAsError [msg]++-- | Report a message as an error+raiseMessagesAsError :: [Error] -> TypeCheckMonad a+raiseMessagesAsError msgs = do+ src <- getSrcSpan+ ctxts <- getErrorContexts+ let ctxtDocs = ctxts+ let contextMsg = trimAndRenderContexts maxContexts ctxtDocs+ addErrors [mkErrorMessage src (msg $$ contextMsg) | msg <- msgs]+ failM+ where+ -- Don't print too much context+ trimAndRenderContexts 0 _ = empty+ trimAndRenderContexts n [] = empty+ trimAndRenderContexts n (doc:docs) = + doc $$ trimAndRenderContexts (n-1) docs+ maxContexts = 3++tryAndRecover :: + TypeCheckMonad a -> TypeCheckMonad a -> TypeCheckMonad a+tryAndRecover prog handler = tryM prog >>= \x ->+ case x of+ Right a -> return a+ Left ex -> case ex of+ SourceError msgs -> do+ -- The errors will be discarded as the errors propogate up.+ -- Hence, we reset them.+ setErrors msgs+ handler+ UserError -> handler+ -- An exception type we don't want to interfer with+ e -> throwException e+ where+ setErrors :: ErrorMessages -> TypeCheckMonad ()+ setErrors es = modify (\ st -> st { errors = es }) +++-- *************************************************************************+-- Type Operations+-- *************************************************************************+readTypeRef :: TypeVarRef -> TypeCheckMonad (Either (TypeVar, [Constraint]) Type)+readTypeRef (TypeVarRef tv cs ioref) = + do+ mtyp <- readPType ioref+ case mtyp of+ Just t -> return (Right t)+ Nothing -> return (Left (tv, cs))++writeTypeRef :: TypeVarRef -> Type -> TypeCheckMonad ()+writeTypeRef (TypeVarRef tv cs ioref) t = setPType ioref t++freshTypeVar :: TypeCheckMonad Type+freshTypeVar = freshTypeVarWithConstraints []++freshTypeVarWithConstraints :: [Constraint] -> TypeCheckMonad Type+freshTypeVarWithConstraints cs =+ do+ nextId <- gets nextTypeId+ modify (\s -> s { nextTypeId = nextId+1 })+ ioRef <- freshPType+ return $ TVar (TypeVarRef (TypeVar nextId) cs ioRef)++getSymbolInformation :: Name -> TypeCheckMonad Env.SymbolInformation+getSymbolInformation n = do+ env <- gets environment+ -- Force evaluation of lookup n+ -- If we don't do this the error is deferred until later+ case Env.maybeLookup env n of+ Just symb -> return symb+ Nothing -> raiseMessagesAsError [varNotInScopeMessage n]++-- | Get the type of 'n' and throw an exception if it doesn't exist.+getType :: Name -> TypeCheckMonad TypeScheme+getType n = do+ symb <- getSymbolInformation n+ return $ Env.typeScheme symb++-- | Get the type of 'n' if it exists, othewise return Nothing.+safeGetType :: Name -> TypeCheckMonad (Maybe TypeScheme)+safeGetType n = do+ env <- gets environment+ case Env.maybeLookup env n of+ Just symb -> return $ Just $ Env.typeScheme symb+ Nothing -> return Nothing+ +-- | Sets the type of n to be t in the current scope only. No unification is +-- performed.+setType :: Name -> TypeScheme -> TypeCheckMonad ()+setType n t = do+ env <- getEnvironment+ let + symb = case Env.maybeLookupInTopLayer env n of+ Just symb -> symb { Env.typeScheme = t }+ Nothing -> Env.mkSymbolInformation t+ setSymbolInformation n symb++setSymbolInformation :: Name -> Env.SymbolInformation -> TypeCheckMonad ()+setSymbolInformation n symb = do+ env <- getEnvironment+ setEnvironment (Env.update env n symb)++isDeprecated :: Name -> TypeCheckMonad Bool+isDeprecated n = do+ symb <- getSymbolInformation n+ return $ Env.isDeprecated symb++isTypeUnsafe :: Name -> TypeCheckMonad Bool+isTypeUnsafe n = do+ symb <- getSymbolInformation n+ return $ Env.isTypeUnsafe symb++markAsDeprecated :: Name -> TypeCheckMonad ()+markAsDeprecated n = do+ symb <- getSymbolInformation n+ setSymbolInformation n (symb { Env.isDeprecated = True })+markTypeAsUnsafe :: Name -> TypeCheckMonad ()+markTypeAsUnsafe n = do+ symb <- getSymbolInformation n+ setSymbolInformation n (symb { Env.isTypeUnsafe = True })++-- | Apply compress to the type of a type scheme.+compressTypeScheme :: TypeScheme -> TypeCheckMonad TypeScheme+compressTypeScheme (ForAll ts t) = + do+ t' <- compress t+ return $ ForAll ts t'++-- | Takes a type and compresses the type by reading all type variables and+-- if they point to another type, it returns that type instead.+compress :: Type -> TypeCheckMonad Type+compress (tr @ (TVar typeRef)) = do+ res <- readTypeRef typeRef+ case res of+ Left tv -> return tr+ Right t -> compress t+compress (TFunction targs tr) = do+ targs' <- mapM compress targs+ tr' <- compress tr+ return $ TFunction targs' tr'+compress (TSeq t) = compress t >>= return . TSeq+compress (TSet t) = compress t >>= return . TSet+compress (TTuple ts) = mapM compress ts >>= return . TTuple+compress (TDotable t1 t2)= do+ t1' <- compress t1+ t2' <- compress t2+ return $ TDotable t1' t2'+compress (TDatatype n) = return $ TDatatype n+compress (TDot t1 t2) = do+ t1' <- compress t1+ t2' <- compress t2+ return $ TDot t1' t2'+compress t = return t
+ src/CSPM/TypeChecker/Pat.hs view
@@ -0,0 +1,60 @@+{-# LANGUAGE MultiParamTypeClasses, TypeSynonymInstances #-}+module CSPM.TypeChecker.Pat () where++import CSPM.DataStructures.Syntax hiding (getType)+import CSPM.DataStructures.Types+import CSPM.TypeChecker.Common+import CSPM.TypeChecker.Monad+import CSPM.TypeChecker.Unification+import Util.Annotated+import Util.PrettyPrint+ +instance TypeCheckable PPat Type where+ errorContext an = Nothing+ typeCheck' an = setSrcSpan (loc an) $ typeCheck (inner an)+ typeCheckExpect an typ =+ setSrcSpan (loc an) (typeCheckExpect (inner an) typ)+instance TypeCheckable Pat Type where+ typeCheckExpect obj texp =+ case errorContext obj of+ Just c -> addErrorContext c m+ Nothing -> m+ where+ m = do+ tact <- typeCheck' obj+ unify texp tact++ errorContext p = Just $+ hang (text "In the pattern" <> colon) tabWidth (prettyPrint p)++ typeCheck' (PConcat p1 p2) = do+ t <- ensureIsList p1+ typeCheckExpect p2 t+ typeCheck' (PDoublePattern p1 p2) = do+ t <- typeCheck p1+ typeCheckExpect p2 t+ typeCheck' (PDotApp p1 p2) = do+ t1 <- typeCheck p1+ t2 <- typeCheck p2+ return $ TDot t1 t2+ typeCheck' (PList ps) = do+ t <- ensureAreEqual ps+ return $ TSeq t+ typeCheck' (PLit lit) = typeCheck lit+ typeCheck' (PParen p1) = typeCheck p1+ typeCheck' (PSet ps) = do+-- TODO: add to desugarer+-- errorIfFalse (length ps <= 1) (InvalidSetPattern ps)+ t <- ensureAreEqual ps+ ensureHasConstraint Eq t+ return $ TSet t+ typeCheck' (PTuple ps) = do+ ts <- mapM typeCheck ps+ return $ TTuple ts+ typeCheck' (PWildCard) = freshTypeVar+ typeCheck' (PVar n) = do+ t @ (ForAll _ t') <- getType n+ -- All variables are already in scope hence we can just return the+ -- type (since we always typeCheck a pattern in between a + -- local (freeVars pat)).+ return t'
+ src/CSPM/TypeChecker/Unification.hs view
@@ -0,0 +1,571 @@+{-# LANGUAGE DoAndIfThenElse #-}+module CSPM.TypeChecker.Unification (+ generaliseGroup, instantiate, unify, unifyAll, evaluateDots,+ typeToDotList,+) where++import Control.Monad+import Control.Monad.Trans+import Data.List (nub, (\\), intersect, group, sort)+import Prelude++import CSPM.DataStructures.Names+import CSPM.DataStructures.Types+import CSPM.TypeChecker.Environment+import CSPM.TypeChecker.Exceptions+import CSPM.TypeChecker.Monad+import Util.Exception+import Util.Monad+import Util.PrettyPrint++-- | Return the free type variables (and their constraints) for all 'TypeVar's +-- that occur in 'Type'.+freeTypeVars :: Type -> TypeCheckMonad [(TypeVar, [Constraint])]+freeTypeVars = liftM nub . freeTypeVars' +freeTypeVars' :: Type -> TypeCheckMonad [(TypeVar, [Constraint])]+freeTypeVars' (TVar tv) = do+ typ <- readTypeRef tv+ case typ of+ Left (tv, cs) -> return [(tv, cs)]+ Right t -> freeTypeVars' t+freeTypeVars' (TFunction targs tr) = + liftM concat (mapM freeTypeVars' (tr:targs))+freeTypeVars' (TSeq t) = freeTypeVars' t+freeTypeVars' (TSet t) = freeTypeVars' t+freeTypeVars' (TTuple ts) = liftM concat (mapM freeTypeVars' ts)+freeTypeVars' (TDotable t1 t2) = liftM concat (mapM freeTypeVars' [t1,t2])+freeTypeVars' (TDot t1 t2) = liftM concat (mapM freeTypeVars' [t1,t2])+freeTypeVars' (TDatatype n1) = return []+freeTypeVars' TInt = return []+freeTypeVars' TBool = return []+freeTypeVars' TEvent = return []+freeTypeVars' TEventable = return []+freeTypeVars' TProc = return []++-- | Generalise the types of the declarations. The parameter 'names' gives the +-- names that were bound by all the declarations that we are interested in. This+-- is done because we convert a type T into forall vs T where +-- vs = fvts (T) - fvts(Env)+-- where Env does not contain the function whose type we are generalizing+-- (this is because when we type a declaration we are really typing a +-- lambda function).+generaliseGroup :: [Name] -> [TypeCheckMonad [(Name, Type)]] -> + TypeCheckMonad [[(Name, TypeScheme)]]+generaliseGroup names tsm = do+ -- Perform the type checking+ ts <- sequence tsm+ env <- getEnvironment+ -- Get all the free variables that are currently in the environment that + -- were not bound by any of this group.+ envfvs <- (liftM nub . concatMapM freeTypeVars)+ [t | (n, SymbolInformation { + typeScheme = ForAll _ t + }) <- flatten env, not (n `elem` names)]+ mapM (\ nts -> mapM (\ (n,t) -> do+ -- The free vars in this type+ deffvs <- freeTypeVars t+ -- All the free variables that were actually bound by this declaration + -- (rather than some other declaration in the environment).+ let + unboundVars = + filter (\ (fv, cs) -> not (fv `elem` map fst envfvs)) deffvs+ ts = ForAll unboundVars t+ setType n ts+ return (n, ts)) nts) ts++-- | Instantiates the typescheme with some fresh type variables.+instantiate :: TypeScheme -> TypeCheckMonad Type+instantiate (ForAll ts t) = do+ tvs <- mapM (freshTypeVarWithConstraints . snd) ts+ foldM (\ x y -> substituteType y x) t (zip (map fst ts) tvs)+ +-- | Does 'a' occur somewhere in 't'.+occurs :: TypeVar -> Type -> TypeCheckMonad Bool+occurs a (TVar (tvref @ (TypeVarRef tv _ _))) = do+ res <- readTypeRef tvref+ case res of + Left (tv,cs)-> return $ a == tv+ Right t -> occurs a t+occurs a (TSet t) = occurs a t+occurs a (TSeq t) = occurs a t+occurs a (TDot t1 t2) = liftM or (mapM (occurs a) [t1,t2])+occurs a (TTuple ts) = liftM or (mapM (occurs a) ts)+occurs a (TFunction ts t) = liftM or (mapM (occurs a) (t:ts))+occurs a (TDatatype n) = return False+occurs a (TDotable t1 t2) = liftM or (mapM (occurs a) [t1,t2])+occurs a TInt = return False+occurs a TBool = return False+occurs a TProc = return False+occurs a TEvent = return False+occurs a TEventable = return False++-- | Unifys all types to a single type. The first type is used as the +-- expected Type in error messages.+unifyAll :: [Type] -> TypeCheckMonad Type+unifyAll [] = freshTypeVar+unifyAll [t] = return t+unifyAll (t1:ts) = do+ t2 <- unifyAll ts+ unify t1 t2++-- | Takes a constraint and a type and returns True iff the type satisfies the+-- constraint, or can be made to satsify the constraint by appropriate type+-- substitutions, in which case the type substitutions are performed.+unifyConstraint :: Constraint -> Type -> TypeCheckMonad Bool+unifyConstraint c (TVar v) = do+ res <- readTypeRef v+ case res of+ Left (tva, cs) -> + if c `elem` cs then return True else do+ fv <- freshTypeVarWithConstraints (nub (c:cs))+ applySubstitution v fv+ return True+ Right t -> unifyConstraint c t+unifyConstraint c TInt = return True+unifyConstraint Eq TBool = return True -- Bools are not orderable P524+unifyConstraint c (TSeq t) = unifyConstraint c t+unifyConstraint c (TDot t1 t2) = liftM and (mapM (unifyConstraint c) [t1,t2])+unifyConstraint c (TSet t) = return True -- All set elements must support comparison+unifyConstraint c (TTuple ts) = liftM and (mapM (unifyConstraint c) ts)+unifyConstraint Eq TEvent = return True -- Events comparable only+unifyConstraint Eq TEventable = return True -- ditto+unifyConstraint Eq (TDotable a b) = -- channels and datatypes are only dotable things+ liftM and (mapM (unifyConstraint Eq) [a,b])+unifyConstraint Eq (TDatatype n) = return True+ -- User data types are not orderable P524+unifyConstraint c t = + raiseMessageAsError $ constraintUnificationErrorMessage c t+++-- | Takes a type and converts TDot t1 t2 to [t1, t2].+typeToDotList :: Type -> TypeCheckMonad [Type]+typeToDotList t = compress t >>= \ t ->+ case t of+ TDot t1 t2 -> do+ (t:ts1) <- typeToDotList t1+ ts2 <- typeToDotList t2+ return (t:ts1++ts2)+ _ -> return [t]++-- | Takes a 'TDotable' and returns a tuple consisting of:+-- the arguments that it takes and the ultimate return type. Note+-- that due to the way that TDotables are introduced the return type+-- is guaranteed to be simple.+-- This requires that its argument is compressed.+reduceDotable :: Type -> ([Type], Type)+reduceDotable (TDotable argt rt) = + let (args, urt) = reduceDotable rt in (argt:args, urt)+reduceDotable x = ([], x)++-- | We convert all TDotable (TDot t1 t2) to +-- TDotable t1 (TDotable t2...). Thus every argument of a TDotable+-- is not a TDot.+toNormalForm :: Type -> Type+toNormalForm (TDotable (TDot t1 t2) rt) = + toNormalForm (TDotable t1 (TDotable t2 rt))+-- Hence, t1 is atomic (of some sort)+toNormalForm (TDotable t1 (TDotable t2 rt)) = + TDotable t1 (toNormalForm (TDotable t2 rt))+toNormalForm x = x++isVar :: Type -> Bool+isVar (TVar _) = True+isVar _ = False++isDotable :: Type -> Bool+isDotable (TDotable _ _) = True+isDotable _ = False++isSimple :: Type -> Bool+isSimple a = not (isDotable a) && not (isVar a)++-- Assumption, argument of TDotable is always simple+-- and that result of TDotable is either another TDotable or+-- simple.++-- Also, we assume that if a type list is of the form +-- [TDotable argt rt, arg] then arg must contribute to argt (though +-- obviously argt could itself by a TDotable). In reality, this means+-- that we prohibit definitions such as:+-- datatype A = B.{0..1}+-- f(x) = B.true+-- Intuitively this can be thought of as prohibiting dots usage+-- as a functional programming construct.++-- | Takes two type lists and unifies them into one type list.+combineTypeLists :: [Type] -> [Type] -> TypeCheckMonad [Type]+combineTypeLists [] [] = return []++-- If either of the front components is a TDot, compute the dot list.+combineTypeLists ((TDot a1 a2):as) bs = do+ ts <- typeToDotList (TDot a1 a2)+ combineTypeLists (ts++as) bs+combineTypeLists as ((TDot b1 b2):bs) = do+ ts <- typeToDotList (TDot b1 b2)+ combineTypeLists as (ts++bs)++-- If one type list has just one component left then this must be equal+-- to the dotted type of the other.+combineTypeLists (a:as) [b] = do+ -- IMPORTANT: The expected type is b+ t <- unify b (foldr1 TDot (a:as))+ return [t]+combineTypeLists [a] (b:bs) = do+ -- IMPORTANT The expected type is a+ t <- unify a (foldr1 TDot (b:bs))+ return [t]++-- Hence, as /= [], bs /= []++-- Otherwise, if both arguments are simple, and not equal to TDot,+-- then we can just unify them.+-- Note, if the first item in the list is a var, and b is not dotable +-- then, providing there is another item after the var, (by the shortest+-- match rule) we unify the var and b.+combineTypeLists (a:as) (b:bs) | not (isDotable a) && not (isDotable b) = do+ t <- unify a b+ ts <- combineTypeLists as bs+ return (t:ts)++-- ASSUMPTION: argt is not a TDot, or a TDotable. ++-- Otherwise, if the head of one of the lists is dotable then we proceed+-- as follows+combineTypeLists ((a0@(TDotable argt rt)):a:as) (b:bs)+ | (isSimple a || (isVar a && as /= [])) = do+ -- By assumption a is not a TDot and so either, a is simple and+ -- hence we unify argt and a or, it is a var. Then, providing + -- as /= [] we can use the shortest match rule to justify + -- matching with just with one component.+ unify argt a+ combineTypeLists (rt:as) (b:bs)+ | isVar a = do+ -- as == [] otherwise the above case applies. Hence, we need to + -- set a to be equal to the args necessary to remove all + -- TDotables from the front, plus any extension needed in order+ -- to make it match (b:bs). Firstly, compute what the ultimate+ -- return type (urt) and args to get this will be.+ let (args, urt) = reduceDotable (TDotable argt rt)+ -- As urt is simple it immediately follows that the length of+ -- the urt type list is 1. Therefore, even if bs has a var on + -- the end we still want the b:bs type list to be as short as+ -- possible (and thus don't need to extend it). Hence, we can+ -- use the evalTypeListList function.+ t:ts <- evalTypeList (b:bs)+ -- The first type in this list must be equal to urt+ t1 <- unify urt t+ -- We want to set the var a to all the args, plus any extension+ -- from bs+ combineTypeLists (args++ts) [a]+ return (t1:ts)+ -- Else, a is not simple, or a var. Hence is a TDotable. + | isDotable a = do+ -- Compute the ultimate return type of A, and the args to get + -- to it.+ let (argsA, rtA) = reduceDotable a+ -- We know rtA has to be the same type as argt+ unify argt rtA+ -- Hence, if we can find all the arguments required to produce+ -- rtA then, we can produce rt. Thus we reduce as follows.+ combineTypeLists (foldr TDotable rt argsA : as) (b:bs)++-- Symmetric case of above+combineTypeLists (a:as) ((TDotable argt rt):b:bs)+ | (isSimple b || (isVar b && bs /= [])) = do+ unify argt b+ combineTypeLists (rt:bs) (a:as)+ | isVar b = do+ let (args, urt) = reduceDotable (TDotable argt rt)+ t:ts <- evalTypeList (a:as)+ t1 <- unify urt t+ combineTypeLists (args++ts) [b]+ return (t1:ts)+ | isDotable b = do+ let (argsB, rtB) = reduceDotable b+ unify argt rtB+ combineTypeLists (foldr TDotable rt argsB : bs) (a:as)++-- TODO: explain why we can't do the unification (it may be because of+-- a type error, but may well be because of an unsupported type list).+combineTypeLists as bs = raiseUnificationError True+++++-- | The main type unification algorithm. This adds values to the unification +-- stack in order to ensure error messages are helpful.+unify :: Type -> Type -> TypeCheckMonad Type+unify texp tact = do+ addUnificationPair (texp, tact) (unifyNoStk texp tact)++-- | Unifies the types but doesn't add a pair to the stack.+unifyNoStk :: Type -> Type -> TypeCheckMonad Type+unifyNoStk (TVar t1) (TVar t2) | t1 == t2 = + return (TVar t1)+unifyNoStk (TVar t1) (TVar t2) = do+ res1 <- readTypeRef t1+ res2 <- readTypeRef t2+ case (res1, res2) of+ (Left (tv1, cs1), Left (tv2,cs2)) -> do+ fv <- freshTypeVarWithConstraints (nub (cs1 ++ cs2))+ applySubstitution t1 fv+ applySubstitution t2 fv+ return fv+ (Left _, Right t) -> unify (TVar t1) t+ (Right t, Left _) -> unify t (TVar t2)+ (Right t1, Right t2) -> unify t1 t2+unifyNoStk (TVar a) b = do+ res <- readTypeRef a+ case res of+ Left (tva, cs) -> do+ res <- liftM and (mapM (\ c -> unifyConstraint c b) cs)+ if res then applySubstitution a b+ else raiseUnificationError False+ Right t -> unify t b+unifyNoStk a (TVar b) = do+ res <- readTypeRef b+ case res of+ Left (tvb, cs) -> do+ res <- liftM and (mapM (\ c -> unifyConstraint c a) cs)+ if res then applySubstitution b a+ else raiseUnificationError False+ Right t -> unify a t+++-- Type Atoms+unifyNoStk TInt TInt = return TInt+unifyNoStk TBool TBool = return TBool+unifyNoStk TProc TProc = return TProc+unifyNoStk TEvent TEvent = return TEvent+unifyNoStk TEventable TEventable = return TEventable+unifyNoStk TEvent TEventable = return TEvent+unifyNoStk TEventable TEvent = return TEvent+unifyNoStk (TDatatype n1) (TDatatype n2) + | n1 == n2 = return $ TDatatype n1++-- Simple cases+unifyNoStk (TFunction ts1 rt1) (TFunction ts2 rt2) | length ts1 == length ts2 = do+ ts <- zipWithM unify ts1 ts2+ rt <- unify rt1 rt2+ return $ TFunction ts rt+unifyNoStk (TSeq t1) (TSeq t2) = do+ t <- unify t1 t2+ return $ TSeq t+unifyNoStk (TSet t1) (TSet t2) = do+ t <- unify t1 t2+ return $ TSet t+unifyNoStk (TTuple ts1) (TTuple ts2) | length ts1 == length ts2 = do+ ts <- zipWithM unify ts1 ts2+ return $ TTuple ts++unifyNoStk (a@(TDotable _ _)) (b@(TDotable _ _)) = do+ a <- compress a+ b <- compress b+ let+ -- Compute the ultimate return types and the arguments required+ -- to get to this return type+ (argsA, rtA) = (reduceDotable . toNormalForm) a+ (argsB, rtB) = (reduceDotable . toNormalForm) b+ -- The return type of the combined dotable must be the unified version+ -- of the return types+ rt <- unify rtA rtB++ case (rtA, rtB) of+ (TEventable, TEventable) -> panic "TC: double eventable"+ (TEventable, _) -> do+ -- Firstly, evaluate each type list to reduce it; this means+ -- that it will not have any terms like TDotable TInt ..., TInt..+ as <- evalTypeList argsA+ bs <- evalTypeList argsB+ -- As the left argument is eventable we compute what arguments+ -- would be required to make it into a TEventable (by computing+ -- the ultimate return types of each element).+ let as' = map (snd . reduceDotable . toNormalForm) as+ -- These must be equal to the argument types that are required to+ -- reach rtB, hence we unify.+ zipWithM unify as' bs+ -- The most general type will have the arguments of bs, rather+ -- than the arguments of as (bs provide more information).+ return $ TDotable (foldl1 TDot bs) rt+ (_, TEventable) -> do+ as <- evalTypeList argsA+ bs <- evalTypeList argsB+ let bs' = map (snd . reduceDotable . toNormalForm) bs+ zipWithM unify as bs'+ return $ TDotable (foldl1 TDot as) rt+ (_, _) -> do+ -- If neither is a TEventable then the args must be the same.+ -- Hence, unify the two argument lists.+ args <- combineTypeLists argsA argsB+ return $ TDotable (foldl1 TDot args) rt++unifyNoStk (TDot t1 t2) (TDot t1' t2') = do+ a0 <- typeToDotList (TDot t1 t2)+ b0 <- typeToDotList (TDot t1' t2')+ let a = map toNormalForm a0+ let b = map toNormalForm b0+ ts <- combineTypeLists a b+ return $ foldl1 TDot ts++-- TDot + TEvent/TEventable/TDatatype/TDotable++unifyNoStk (TDot t1 t2) (TDatatype n) = do+ b <- symmetricUnificationAllowed+ if not b then raiseUnificationError False else return ()+ unify (TDotable t2 (TDatatype n)) t1+ return $ TDatatype n++unifyNoStk (TDatatype n) (TDot t1 t2) = do+ unify (TDotable t2 (TDatatype n)) t1+ return $ TDatatype n++unifyNoStk (TDot t1 t2) TEvent = do+ b <- symmetricUnificationAllowed+ if not b then raiseUnificationError False else return ()+ unify (TDotable t2 TEvent) t1+ return TEvent++unifyNoStk TEvent (TDot t1 t2) = do+ unify (TDotable t2 TEvent) t1+ return TEvent++unifyNoStk (TDot t1 t2) TEventable = do+ b <- symmetricUnificationAllowed+ if not b then raiseUnificationError False else return ()+ tl <- unify (TDotable t2 TEventable) t1+ return $ TDot tl t2++unifyNoStk TEventable (TDot t1 t2) = do+ tl <- unify (TDotable t2 TEventable) t1+ return $ TDot tl t2++unifyNoStk (TDot t1 t2) (TDotable argt rt) = do+ b <- symmetricUnificationAllowed+ if not b then raiseUnificationError False else return ()+ unify t1 (TDotable t2 (TDotable argt rt))+ return $ TDotable argt rt++unifyNoStk (TDotable argt rt) (TDot t1 t2) = do+ unify (TDotable t2 (TDotable argt rt)) t1+ return $ TDotable argt rt++unifyNoStk (TDotable argt rt) TEventable = do+ unify TEventable rt+ return $ TDotable argt rt+unifyNoStk TEventable (TDotable argt rt) = do+ unify TEventable rt+ return $ TDotable argt rt++unifyNoStk t1 t2 = raiseUnificationError False++-- | Raises a unification error. If the passed flag is True then +-- any dots are not evaluated in the error. This is to avoid infinite loops that+-- can occur, for example, whilst unifiying:+-- [TDotable TInt (TDatatype (Name "A")),TBool]+-- [TDotable TInt (TDatatype (Name "A")),TBool]+raiseUnificationError :: Bool -> TypeCheckMonad a+raiseUnificationError isDotError = do+ b <- getInError+ if b then throwException $ UserError else setInError True $ do+ ts <- getUnificationStack+ cts <- mapM (\ (t1, t2) -> do+ t1 <- compress t1+ t2 <- compress t2+ -- Try and tidy any dot lists+ (t1, t2) <- tryAndRecover (do+ t1 <- evaluateDots t1+ t2 <- evaluateDots t2+ return (t1, t2)) (return (t1,t2))+ return (t1, t2)) ts+ raiseMessageAsError $ unificationErrorMessage cts+ +-- Returns the type that we substitute for+-- NB: in a quantified type we do not apply the substitution to any +-- quantified variables+applySubstitution :: TypeVarRef -> Type -> TypeCheckMonad Type+applySubstitution (tvref @ (TypeVarRef tv _ _)) typ = do+ t' <- compress typ+ b <- occurs tv typ+ (b, t) <- if b then do+ t <- evaluateDots t'+ b <- occurs tv t+ return (b,t)+ else return (b, typ)+ errorIfFalse (not b)+ (infiniteUnificationMessage (TVar tvref) t')+ writeTypeRef tvref t+ return typ++-- | Applies a subtitution directly to the type. This is used in+-- type instantiation where we create a fresh type for each universal +-- variable+substituteType :: (TypeVar, Type) -> Type -> TypeCheckMonad Type+substituteType (tv, t) (b @ (TVar (a @ (TypeVarRef tv' cs ioref)))) = do+ res <- readTypeRef a+ case res of+ Left tva -> if tv == tv' then return t else return b+ Right t' -> substituteType (tv, t) t'+substituteType sub (TFunction targs tr) = do+ targs' <- mapM (substituteType sub) targs+ tr' <- substituteType sub tr+ return $ TFunction targs' tr'+substituteType sub (TSeq t) = substituteType sub t >>= return . TSeq+substituteType sub (TDot t1 t2) = do + t1' <- substituteType sub t1+ t2' <- substituteType sub t2+ return $ TDot t1' t2'+substituteType sub (TSet t) = substituteType sub t >>= return . TSet+substituteType sub (TDotable t1 t2) = do+ t1' <- substituteType sub t1+ t2' <- substituteType sub t2+ return $ TDotable t1' t2'+substituteType sub (TTuple ts) = + mapM (substituteType sub) ts >>= return . TTuple+substituteType sub (TDatatype n) = return $ TDatatype n+substituteType sub TInt = return TInt+substituteType sub TBool = return TBool+substituteType sub TProc = return TProc+substituteType sub TEvent = return TEvent+substituteType sub TEventable = return TEventable++-- | Takes a type and attempts to simplify all TDots inside+-- by combining TDotable t1 t2 and arguments.+evaluateDots :: Type -> TypeCheckMonad Type+evaluateDots (TVar t) = do+ res <- readTypeRef t+ case res of+ Left (tv, cs) -> return $ TVar t+ Right t -> evaluateDots t+evaluateDots (TSet t) = evaluateDots t >>= return . TSet+evaluateDots (TSeq t) = evaluateDots t >>= return . TSeq+evaluateDots (TTuple ts) = mapM evaluateDots ts >>= return . TTuple+evaluateDots t = do+ ts <- typeToDotList t+ ts <- mapM (\t -> compress t >>= return . toNormalForm) ts+ ts <- evalTypeList ts+ return $ foldr1 TDot ts++-- Assumption, argument of TDotable is always simple+-- and that result of TDotable is either another TDotable or+-- simple.+evalTypeList :: [Type] -> TypeCheckMonad [Type]+evalTypeList (t:[]) = return [t]+evalTypeList ((TDot t1 t2):ts) = evalTypeList (t1:t2:ts)+evalTypeList (TDotable argt rt : arg : args)+ | isVar arg && args == [] = do+ let (args, urt) = reduceDotable (TDotable argt rt)+ -- Implement longest match rule+ unify arg (foldr1 TDot args)+ return [urt]+ | not (isDotable arg) = do+ -- Implement shortest match rule (if isVar ag)+ t <- unify argt arg+ evalTypeList (rt:args)+ | isDotable arg = do+ let (argsA, rtA) = reduceDotable arg+ t <- unify argt rtA+ evalTypeList (foldr TDotable rt argsA : args)+-- If the first argument isn't a dotable we ignore it.+evalTypeList (t:ts) = do+ ts <- evalTypeList ts+ return $ t:ts
+ src/Util/Annotated.hs view
@@ -0,0 +1,133 @@+{-# LANGUAGE FlexibleContexts, FlexibleInstances #-}+module Util.Annotated where++import Prelude+import Util.Exception+import Util.Prelude+import Util.PrettyPrint++data SrcLoc = + SrcLoc {+ srcLocFile :: String,+ srcLocLine :: !Int,+ srcLocCol :: !Int+ }+ | NoLoc+ deriving Eq+ +instance Ord SrcLoc where+ (SrcLoc f1 l1 c1) `compare` (SrcLoc f2 l2 c2) =+ (f1 `compare` f2) `thenCmp` + (l1 `compare` l2) `thenCmp` + (c1 `compare` c2)+ NoLoc `compare` NoLoc = EQ+ NoLoc `compare` _ = LT+ _ `compare` NoLoc = GT+ +-- From GHC+data SrcSpan = + SrcSpanOneLine { + srcSpanFile :: String,+ srcSpanLine :: !Int,+ srcSpanSCol :: !Int,+ srcSpanECol :: !Int+ }+ | SrcSpanMultiLine { + srcSpanFile :: String,+ srcSpanSLine :: !Int,+ srcSpanSCol :: !Int,+ srcSpanELine :: !Int,+ srcSpanECol :: !Int+ }+ | SrcSpanPoint { + srcSpanFile :: String,+ srcSpanLine :: !Int,+ srcSpanCol :: !Int+ }+ | Unknown+ deriving Eq+ +srcSpanStart :: SrcSpan -> SrcLoc+srcSpanStart (SrcSpanOneLine f l sc ec) = SrcLoc f l sc+srcSpanStart (SrcSpanMultiLine f sl sc el ec) = SrcLoc f sl sc+srcSpanStart (SrcSpanPoint f l c) = SrcLoc f l c+srcSpanStart Unknown = NoLoc++srcSpanEnd :: SrcSpan -> SrcLoc+srcSpanEnd (SrcSpanOneLine f l sc ec) = SrcLoc f l ec+srcSpanEnd (SrcSpanMultiLine f sl sc el ec) = SrcLoc f el ec+srcSpanEnd (SrcSpanPoint f l c) = SrcLoc f l c+srcSpanEnd Unknown = NoLoc++-- We want to order SrcSpans first by the start point, then by the end point.+instance Ord SrcSpan where+ a `compare` b = + (srcSpanStart a `compare` srcSpanStart b) `thenCmp` + (srcSpanEnd a `compare` srcSpanEnd b)++instance Show SrcSpan where+ show s = show (prettyPrint s)++instance PrettyPrintable SrcSpan where+ prettyPrint (SrcSpanOneLine f sline scol1 ecol1) = + text f <> colon <> int sline <> colon <> int scol1 <> char '-' <> int ecol1+ prettyPrint (SrcSpanMultiLine f sline scol eline ecol) = + text f <> colon <> int sline <> colon <> int scol+ <> char '-' + <> int eline <> colon <> int ecol+ prettyPrint (SrcSpanPoint f sline scol) = + text f <> colon <> int sline <> colon <> int scol+ prettyPrint Unknown = text "<unknown location>"+ +combineSpans :: SrcSpan -> SrcSpan -> SrcSpan+combineSpans s1 s2 | srcSpanFile s1 /= srcSpanFile s2 = + panic "Cannot combine spans as they span files"+combineSpans (SrcSpanOneLine f1 line1 scol1 ecol1) + (SrcSpanOneLine f2 line2 scol2 ecol2) = + if line1 == line2 then SrcSpanOneLine f1 line1 scol1 ecol2+ else SrcSpanMultiLine f1 line1 scol1 line2 ecol2+combineSpans (SrcSpanOneLine f1 sline1 scol1 ecol1) + (SrcSpanMultiLine f2 sline2 scol2 eline2 ecol2) = + SrcSpanMultiLine f1 sline1 scol1 eline2 ecol2+combineSpans (SrcSpanMultiLine f1 sline1 scol1 eline1 ecol1)+ (SrcSpanOneLine f2 eline2 scol2 ecol2) =+ SrcSpanMultiLine f1 sline1 scol1 eline2 ecol2+combineSpans (SrcSpanMultiLine f1 sline1 scol1 eline1 ecol1) + (SrcSpanMultiLine f2 sline2 scol2 eline2 ecol2) =+ SrcSpanMultiLine f1 sline1 scol1 eline2 ecol2++data Located a = + L {+ locatedLoc :: SrcSpan,+ locatedInner :: a + }+ +data Annotated a b = + An {+ loc :: SrcSpan,+ annotation :: a,+ inner :: b+ }++dummyAnnotation :: a+dummyAnnotation = panic "Dummy annotation evaluated"++unAnnotate :: Annotated a b -> b+unAnnotate (An _ _ b) = b+ +instance Show b => Show (Annotated a b) where+ show (An _ _ b) = show b+instance Show a => Show (Located a) where+ show (L _ a) = show a++instance (PrettyPrintable [b]) => PrettyPrintable [Annotated a b] where+ prettyPrint ans = prettyPrint (map unAnnotate ans)+instance (PrettyPrintable b) => PrettyPrintable (Annotated a b) where+ prettyPrint (An loc typ inner) = prettyPrint inner+instance (PrettyPrintable a) => PrettyPrintable (Located a) where+ prettyPrint (L loc inner) = prettyPrint inner++instance Eq b => Eq (Annotated a b) where+ (An _ _ b1) == (An _ _ b2) = b1 == b2+instance Eq a => Eq (Located a) where+ (L _ b1) == (L _ b2) = b1 == b2
+ src/Util/Annotated.hs-boot view
@@ -0,0 +1,14 @@+module Util.Annotated where++import Util.PrettyPrint++data SrcLoc+instance Ord SrcLoc+data SrcSpan+instance Eq SrcSpan+instance Ord SrcSpan+instance Show SrcSpan+instance PrettyPrintable SrcSpan+combineSpans :: SrcSpan -> SrcSpan -> SrcSpan++data Located a
+ src/Util/Exception.hs view
@@ -0,0 +1,103 @@+{-# LANGUAGE DeriveDataTypeable, TypeSynonymInstances #-}+module Util.Exception (+ Exception,+ SfdrException(..),+ throwException,+ tryM,+ panic, throwSourceError,+ mkErrorMessage, mkWarningMessage, + ErrorMessage, ErrorMessages,+)+where++import Control.Exception+import Control.Monad.State+import Data.Typeable+import Data.List+import Prelude hiding (catch)++import {-# SOURCE #-} Util.Annotated+import Util.PrettyPrint++type ErrorMessages = [ErrorMessage]++-- | An error message that resulted from something in the user's input.+data ErrorMessage =+ ErrorMessage {+ -- | Used for sorting into order+ location :: SrcSpan,+ -- | The message+ message :: Doc+ }+ | WarningMessage {+ -- | Used for sorting into order+ location :: SrcSpan,+ -- | The message+ message :: Doc+ }++mkErrorMessage :: SrcSpan -> Doc -> ErrorMessage+mkErrorMessage l d = ErrorMessage l d++mkWarningMessage :: SrcSpan -> Doc -> ErrorMessage+mkWarningMessage l d = WarningMessage l (text "Warning" <> colon <+> d)++instance Eq ErrorMessage where+ m1 == m2 = location m1 == location m2+instance Ord ErrorMessage where+ compare m1 m2 = compare (location m1) (location m2)++instance PrettyPrintable ErrorMessages where+ prettyPrint ms = vcat . punctuate (text "\n") . map prettyPrint . sort $ ms+instance PrettyPrintable ErrorMessage where+ prettyPrint m = + hang (prettyPrint (location m) <> colon) 4 (message m)++instance Show ErrorMessage where+ show m = show (prettyPrint m)++-- | Exceptions that cause Sfdr to abort whatever it is doing. +data SfdrException =+ -- | An unexpected internal error+ Panic String+ -- | An error in the user's input occured+ | SourceError ErrorMessages+ -- | An error occured. Normally this is caught by the application and + -- then turned into a SourceError.+ | UserError+ deriving Typeable++instance Show SfdrException where+ show (Panic str) = "Internal inconsitancy error: "++show str+ show (SourceError ms) = show (prettyPrint ms)+ show (UserError) = "An unknown error occured."++instance Exception SfdrException++throwSourceError :: ErrorMessages -> a+throwSourceError = throwException . SourceError++panic :: String -> a+panic = throwException . Panic++throwException :: Exception e => e -> a+throwException = throw+ +-- | A class to allow catching of SourceErrors in arbitrary monads.+class Monad m => MonadIOException m where+ tryM :: (MonadIOException m) => m a -> m (Either SfdrException a)+ +instance MonadIOException IO where+ tryM prog = do+ r <- try prog+ case r of+ Left (e@(Panic s)) -> throwException e+ _ -> return r++instance MonadIOException m => MonadIOException (StateT s m) where+ tryM prog = + StateT $ \st -> do+ x <- tryM (runStateT prog st)+ case x of+ Right (a, s) -> return $ (Right a, s)+ Left e -> return $ (Left e, st)
+ src/Util/HierarchicalMap.hs view
@@ -0,0 +1,73 @@+{-# LANGUAGE DeriveDataTypeable #-}+module Util.HierarchicalMap where++import qualified Data.Map as M+import Data.Typeable+import Prelude hiding (lookup)+import Util.Exception++data Ord a => HierarchicalMap a b = + HierarchicalMap [M.Map a b]+ deriving Show++data (Ord a, Show a, Typeable a) => HierarchicalMapException a = + ValueNotFoundException a+ deriving (Show, Typeable)++instance (Ord a, Show a, Typeable a) => Exception (HierarchicalMapException a)++-- | Creates/updates a key in the top level map.+update :: Ord a => HierarchicalMap a b -> a -> b -> HierarchicalMap a b+update (HierarchicalMap (m:ms)) k v = + HierarchicalMap ((M.insert k v m):ms)++updateMulti :: Ord a => HierarchicalMap a b -> [(a, b)] -> HierarchicalMap a b+updateMulti m bs = + foldl (\ m (a,b) -> update m a b) m bs++-- | Looks up a key in any map, starting from the top+lookup :: (Show k, Typeable k, Ord k) => HierarchicalMap k a -> k -> a+lookup hm k = case maybeLookup hm k of+ Just v -> v+ Nothing -> throwException (ValueNotFoundException k)++maybeLookup :: (Show k, Typeable k, Ord k) => HierarchicalMap k a -> k -> Maybe a+maybeLookup (HierarchicalMap []) k = Nothing+maybeLookup (HierarchicalMap (m:ms)) k = + case M.lookup k m of+ Just v -> Just v+ Nothing -> maybeLookup (HierarchicalMap ms) k++maybeLookupInTopLayer :: (Show k, Typeable k, Ord k) => HierarchicalMap k a -> k -> Maybe a+maybeLookupInTopLayer (HierarchicalMap []) k = Nothing+maybeLookupInTopLayer (HierarchicalMap (m:ms)) k = M.lookup k m++popLayer :: Ord a => HierarchicalMap a b -> HierarchicalMap a b+popLayer (HierarchicalMap (m:ms)) = HierarchicalMap ms++flatten :: Ord a => HierarchicalMap a b -> [(a, b)]+flatten (HierarchicalMap ms) = h ms []+ where+ h [] _ = []+ h (m:ms) ks = l++(h ms ks')+ where+ l = [(k, v) | (k, v) <- M.toList m, not (k `elem` ks)]+ ks' = map fst l++ks++newLayer :: Ord a => HierarchicalMap a b -> HierarchicalMap a b+newLayer (HierarchicalMap ms) = HierarchicalMap (M.empty : ms)++newLayerAndBind :: Ord a => HierarchicalMap a b -> [(a, b)] -> HierarchicalMap a b+newLayerAndBind (HierarchicalMap ms) bs = + HierarchicalMap (M.fromList bs : ms)++newRecursiveLayerAndBind :: Ord a => + HierarchicalMap a b -> [HierarchicalMap a b -> (a, b)] -> HierarchicalMap a b+newRecursiveLayerAndBind map bs = newMap+ where+ bs' = [f newMap | f <- bs]+ newMap = newLayerAndBind map bs'++-- | Creates a new map+new :: Ord a => HierarchicalMap a b+new = HierarchicalMap [M.empty]
+ src/Util/List.hs view
@@ -0,0 +1,7 @@+module Util.List where+import Data.List++-- TODO: speed up+-- | Returns true iff the list has no duplicates.+noDups :: Eq a => [a] -> Bool+noDups xs = nub xs == xs
+ src/Util/Monad.hs view
@@ -0,0 +1,6 @@+module Util.Monad where++import Control.Monad++concatMapM :: (Monad m) => (a -> m [b]) -> [a] -> m [b]+concatMapM f xs = liftM concat (mapM f xs)
+ src/Util/PartialFunctions.hs view
@@ -0,0 +1,60 @@+module Util.PartialFunctions where++import Data.List (nub)++import Util.Exception++-- *********************************************************************+-- Partial functions+-- *********************************************************************+type PartialFunction a b = [(a,b)] -- From a to b++functionDomain :: Eq a => PartialFunction a b -> [a]+functionDomain f = map fst f++functionImage :: Eq a => PartialFunction a b -> [b]+functionImage f = map snd f++identityFunction :: Eq a => [a] -> PartialFunction a a+identityFunction xs = [(x,x) | x <- xs]++invert :: (Eq a, Eq b) => PartialFunction a b -> PartialFunction b a+invert f = [(a,b) | (b,a) <- f]++apply :: Eq a => PartialFunction a b -> a -> b+apply f x =+ let+ pos = [b | (a,b) <- f, a == x]+ in+ if length pos == 0 then + panic ("Partial function applied to value outside of domain")+ else head pos+ +applyRelation :: Eq a => PartialFunction a b -> a -> [b]+applyRelation f x = [b | (a,b) <- f, a == x]++safeApply :: Eq a => PartialFunction a b -> a -> Maybe b+safeApply f x =+ let+ pos = [b | (a,b) <- f, a == x]+ in+ if length pos == 0 then Nothing+ else Just (head pos)++composeFunctions :: + (Eq a, Eq b) => PartialFunction b c -> PartialFunction a b -> + PartialFunction a c+composeFunctions f g = + [(a, apply f b) | (a,b) <- g]++mapPF :: Eq a => PartialFunction a b -> [a] -> [b]+mapPF f xs = [apply f x | x <- xs]++safeMapPF :: Eq a => PartialFunction a b -> [a] -> [b]+safeMapPF f xs = [x | Just x <- [safeApply f x | x <- xs]]++updatePF :: Eq a => PartialFunction a b -> a -> b -> PartialFunction a b+updatePF f a b = (a,b):[(c,d) | (c,d) <- f, c /= a]++removeEntry :: Eq a => PartialFunction a b -> a -> PartialFunction a b+removeEntry f a = [(c,d) | (c,d) <- f, c /= a]
+ src/Util/Prelude.hs view
@@ -0,0 +1,28 @@+module Util.Prelude where++import Data.Char+import Prelude+import System.Directory+import System.FilePath++-- | Given two orderings, returns the second if the first is +-- `EQ` and returns the first otherwise.+thenCmp :: Ordering -> Ordering -> Ordering+thenCmp EQ x = x+thenCmp x _ = x++-- | Given a file path, if the first character is a ~ then+-- expands the ~ to the users' home directory.+expandPathIO :: String -> IO String+expandPathIO ('~':'/':d) = do+ tilde <- getHomeDirectory -- will fail if HOME not defined+ return $ joinPath [tilde, d]+expandPathIO other = return other++-- | Remove whitespace from the beginning and end of a string.+trim :: String -> String+trim = f . f where f = reverse . dropWhile isSpace++-- | Compute the cartesian product of a list of lists.+cartProduct :: [[a]] -> [[a]]+cartProduct = sequence
+ src/Util/PrettyPrint.hs view
@@ -0,0 +1,57 @@+module Util.PrettyPrint (+ module Text.PrettyPrint.HughesPJ,+ PrettyPrintable (prettyPrint),+ tabWidth,+ tabIndent,+ angles, bars, list, dotSep,+ speakNth+)+where ++import Text.PrettyPrint.HughesPJ++class PrettyPrintable a where+ prettyPrint :: a -> Doc++-- | The width, in spaces, of a tab character.+tabWidth :: Int +tabWidth = 4++-- | Indent a document by `tabWidth` characters, on each line+-- (uses `nest`).+tabIndent :: Doc -> Doc+tabIndent = nest tabWidth++-- | Surrounds a `Doc` with '<' and '>'.+angles :: Doc -> Doc+angles d = char '<' <> d <> char '>'++-- | Surrounds a `Doc` with '|'.+bars :: Doc -> Doc+bars d = char '|' <> d <> char '|'++-- | Separates a list of `Doc`s by '.'.+dotSep :: [Doc] -> Doc+dotSep docs = fcat (punctuate (text ".") docs)++-- | Separates a list of `Doc`s by ','.+list :: [Doc] -> Doc+list docs = fsep (punctuate (text ",") docs)++-- | Converts a number into 'first', 'second' etc.+speakNth :: Int -> Doc+speakNth 1 = text "first"+speakNth 2 = text "second"+speakNth 3 = text "third"+speakNth 4 = text "fourth"+speakNth 5 = text "fifth"+speakNth 6 = text "sixth"+speakNth n = hcat [ int n, text suffix ]+ where+ suffix + | n <= 20 = "th" -- 11,12,13 are non-std+ | last_dig == 1 = "st"+ | last_dig == 2 = "nd"+ | last_dig == 3 = "rd"+ | otherwise = "th"+ last_dig = n `rem` 10
+ tests/Main.hs view
@@ -0,0 +1,114 @@+module Main where++import System.Directory+import System.Exit (exitFailure, exitSuccess)+import System.FilePath++import CSPM+import Monad+import Util.Exception+import Util.PrettyPrint++data RunResult = + ErrorOccured+ | WarningsEmitted+ | PassedNoWarnings+ deriving Eq+ +main :: IO ()+main = do+ tests <- runSections+ results <- sequence tests+ let+ failureCount = length results - successCount+ successCount = length (filter id results)+ putStrLn $ show $ + int failureCount <+> text "failures" + <+> int successCount <+> text "passes"+ if failureCount == 0 then exitSuccess else exitFailure++getAndFilterDirectoryContents :: FilePath -> IO [FilePath]+getAndFilterDirectoryContents fp = do+ b <- doesDirectoryExist fp+ if not b then return [] else do+ names <- getDirectoryContents fp+ return $ filter (`notElem` [".", "..", ".DS_Store"]) names++runSections ::IO [IO Bool]+runSections = do+ let testDir = "tests"+ sections <- getAndFilterDirectoryContents testDir+ fs <- mapM (\section -> do+ shouldPassFiles <- getAndFilterDirectoryContents $ + joinPath [testDir, section, "should_pass"]+ shouldFailFiles <- getAndFilterDirectoryContents $ + joinPath [testDir, section, "should_fail"]+ shouldWarnFiles <- getAndFilterDirectoryContents $+ joinPath [testDir, section, "should_warn"]+ let + Just test = lookup section testFunctions+ pf = [runTest (joinPath [testDir, section, "should_pass", f]) + test PassedNoWarnings | f <- shouldPassFiles]+ ff = [runTest (joinPath [testDir, section, "should_fail", f]) + test ErrorOccured | f <- shouldFailFiles]+ wf = [runTest (joinPath [testDir, section, "should_warn", f]) + test WarningsEmitted | f <- shouldWarnFiles]+ return $ pf++ff++wf+ ) sections+ return $ concat fs++runTest :: FilePath -> (FilePath -> Test a) -> RunResult -> IO Bool+runTest fp test expectedResult = do+ putStr $ "Running test "++fp++"..."+ s <- initTestState+ res <- tryM $ runTestM s $ do+ test fp+ getState lastWarnings+ let+ failed :: Maybe Doc -> IO Bool+ failed (Just e) = do+ putStrLn "FAILED"+ putStrLn $ show e+ return False+ failed Nothing = do+ putStrLn "FAILED"+ return False+ passed = do+ putStrLn "Passed"+ return True+ + shouldPass = expectedResult == PassedNoWarnings+ shouldFail = expectedResult == ErrorOccured+ shouldWarn = expectedResult == WarningsEmitted+ case res of + Left (SourceError e) -> if shouldFail then passed else failed (Just (prettyPrint e))+ Right [] -> if shouldPass then passed else failed Nothing+ Right ws -> if shouldWarn then passed else failed (Just (prettyPrint ws))+ _ -> failed (Just (text "Internal Error"))++testFunctions = [+ ("parser", parserTest),+ ("typechecker", typeCheckerTest),+ ("prettyprinter", prettyPrinterTest)+ ]++typeCheckerTest :: FilePath -> Test ()+typeCheckerTest fp = do+ ms <- parseFile fp+ typeCheckFile ms+ return ()++parserTest :: FilePath -> Test ()+parserTest fp = do+ ms <- parseFile fp+ -- Force evaluation of the whole of ms. We can't just use seq+ -- as this would leave thunks in the data structure. Instead we take+ -- the length of the string representing ms and then compute the length+ (length (show ms)) `seq` (return ())++prettyPrinterTest :: FilePath -> Test ()+prettyPrinterTest fp = do+ ms <- parseFile fp+ let str = show (prettyPrint ms)+ ms' <- parseStringAsFile str+ if ms /= ms' then throwException UserError else return ()