MicroHs (empty) → 0.8
raw patch · 158 files changed
+29208/−0 lines, 158 filesdep +basedep +containersdep +deepseq
Dependencies added: base, containers, deepseq, directory, ghc-prim, mtl, pretty, process, time
Files
- Example.hs +13/−0
- LICENSE +13/−0
- Makefile +109/−0
- MicroHs.cabal +72/−0
- README.md +250/−0
- Tools/Addcombs.hs +30/−0
- Tools/Compress.hs +71/−0
- Tools/convertX.sh +2/−0
- generated/mhs.c +14056/−0
- ghc/Compat.hs +153/−0
- ghc/Control/Alternative.hs +6/−0
- ghc/Data/Double.hs +1/−0
- ghc/PrimTable.hs +91/−0
- ghc/System/Console/SimpleReadline.hs +10/−0
- lib/Control/Alternative.hs +21/−0
- lib/Control/Applicative.hs +16/−0
- lib/Control/DeepSeq.hs +12/−0
- lib/Control/Error.hs +11/−0
- lib/Control/Exception.hs +20/−0
- lib/Control/Monad.hs +114/−0
- lib/Control/Monad/State/Strict.hs +110/−0
- lib/Data/Bits.hs +93/−0
- lib/Data/Bool.hs +40/−0
- lib/Data/Bool_Type.hs +4/−0
- lib/Data/Bounded.hs +6/−0
- lib/Data/Char.hs +107/−0
- lib/Data/Char_Type.hs +5/−0
- lib/Data/Complex.hs +137/−0
- lib/Data/Double.hs +144/−0
- lib/Data/Either.hs +25/−0
- lib/Data/Enum.hs +70/−0
- lib/Data/Eq.hs +13/−0
- lib/Data/Floating.hs +45/−0
- lib/Data/Fractional.hs +19/−0
- lib/Data/Function.hs +39/−0
- lib/Data/Functor.hs +15/−0
- lib/Data/Identity.hs +24/−0
- lib/Data/Int.hs +78/−0
- lib/Data/IntMap.hs +96/−0
- lib/Data/IntSet.hs +29/−0
- lib/Data/Integer.hs +488/−0
- lib/Data/Integer_Type.hs +58/−0
- lib/Data/Integral.hs +58/−0
- lib/Data/List.hs +363/−0
- lib/Data/List_Type.hs +12/−0
- lib/Data/Map.hs +155/−0
- lib/Data/Maybe.hs +69/−0
- lib/Data/Maybe_Type.hs +5/−0
- lib/Data/Monoid.hs +8/−0
- lib/Data/Num.hs +21/−0
- lib/Data/Ord.hs +48/−0
- lib/Data/Ordering_Type.hs +2/−0
- lib/Data/Ratio.hs +83/−0
- lib/Data/Ratio_Type.hs +13/−0
- lib/Data/Real.hs +6/−0
- lib/Data/RealFloat.hs +68/−0
- lib/Data/Semigroup.hs +6/−0
- lib/Data/Tuple.hs +60/−0
- lib/Data/Word.hs +99/−0
- lib/Debug/Trace.hs +13/−0
- lib/Foreign/C/String.hs +24/−0
- lib/Foreign/Marshal/Alloc.hs +15/−0
- lib/Foreign/Ptr.hs +15/−0
- lib/Prelude.hs +65/−0
- lib/Primitives.hs +206/−0
- lib/System/Console/SimpleReadline.hs +174/−0
- lib/System/Directory.hs +12/−0
- lib/System/Environment.hs +23/−0
- lib/System/IO.hs +236/−0
- lib/System/Process.hs +11/−0
- lib/Text/PrettyPrint/HughesPJ.hs +368/−0
- lib/Text/Show.hs +41/−0
- lib/Text/String.hs +86/−0
- lib/Unsafe/Coerce.hs +5/−0
- src/MicroHs/Compile.hs +197/−0
- src/MicroHs/Desugar.hs +556/−0
- src/MicroHs/Exp.hs +543/−0
- src/MicroHs/Expr.hs +653/−0
- src/MicroHs/Graph.hs +158/−0
- src/MicroHs/Ident.hs +144/−0
- src/MicroHs/IdentMap.hs +169/−0
- src/MicroHs/Interactive.hs +170/−0
- src/MicroHs/Lex.hs +232/−0
- src/MicroHs/Main.hs +129/−0
- src/MicroHs/MakeCArray.hs +24/−0
- src/MicroHs/Parse.hs +590/−0
- src/MicroHs/StateIO.hs +67/−0
- src/MicroHs/TCMonad.hs +31/−0
- src/MicroHs/Translate.hs +135/−0
- src/MicroHs/TypeCheck.hs +2498/−0
- src/Text/ParserComb.hs +261/−0
- src/runtime/config-micro-64.h +68/−0
- src/runtime/config-mingw-64.h +53/−0
- src/runtime/config-unix-64.h +140/−0
- src/runtime/config-windows-64.h +101/−0
- src/runtime/eval.c +2388/−0
- tests/Arith.hs +8/−0
- tests/Arith.ref +3/−0
- tests/Case.hs +70/−0
- tests/Case.ref +7/−0
- tests/Catch.hs +22/−0
- tests/Catch.ref +4/−0
- tests/Class.hs +45/−0
- tests/Class.ref +5/−0
- tests/Default.hs +9/−0
- tests/Default.ref +3/−0
- tests/Enum.hs +12/−0
- tests/Enum.ref +7/−0
- tests/Eq.hs +20/−0
- tests/Eq.ref +2/−0
- tests/Exists.hs +42/−0
- tests/Exists.ref +6/−0
- tests/ExistsBug.hs +18/−0
- tests/FArith.hs +24/−0
- tests/FArith.ref +7/−0
- tests/Fac.hs +23/−0
- tests/Fac.ref +2/−0
- tests/Floating.hs +8/−0
- tests/Floating.ref +3/−0
- tests/Foreign.hs +11/−0
- tests/Foreign.ref +2/−0
- tests/FunDep.hs +11/−0
- tests/Guard.hs +15/−0
- tests/Guard.ref +1/−0
- tests/Hello.hs +5/−0
- tests/Hello.ref +2/−0
- tests/IOTest.hs +48/−0
- tests/IOTest.ref +17/−0
- tests/Infix.hs +19/−0
- tests/Infix.ref +1/−0
- tests/Kind.hs +6/−0
- tests/ListTest.hs +9/−0
- tests/ListTest.ref +4/−0
- tests/LitMatch.hs +31/−0
- tests/LitMatch.ref +4/−0
- tests/LocalPoly.hs +12/−0
- tests/LocalPoly.ref +1/−0
- tests/Makefile +45/−0
- tests/Misc.hs +11/−0
- tests/Misc.ref +1/−0
- tests/Multi.hs +20/−0
- tests/Multi.ref +3/−0
- tests/MutRec.hs +8/−0
- tests/MutRec.ref +1/−0
- tests/Newtype.hs +19/−0
- tests/Newtype.ref +2/−0
- tests/Nfib.hs +17/−0
- tests/Rank2.hs +20/−0
- tests/Rank2.ref +3/−0
- tests/Readline.hs +16/−0
- tests/Sieve.hs +17/−0
- tests/Sieve.ref +1/−0
- tests/StringTest.hs +22/−0
- tests/StringTest.ref +16/−0
- tests/TypeEq.hs +25/−0
- tests/TypeEq.ref +2/−0
- tests/Word.hs +13/−0
- tests/Word.ref +4/−0
+ Example.hs view
@@ -0,0 +1,13 @@+module Example(main) where+import Prelude++fac :: Int -> Int+fac 0 = 1+fac n = n * fac(n - 1)++main :: IO ()+main = do+ let+ rs = map fac [1,2,3,10]+ putStrLn "Some factorials"+ print rs
+ LICENSE view
@@ -0,0 +1,13 @@+Copyright 2023 Lennart Augustsson++Licensed under the Apache License, Version 2.0 (the "License");+you may not use this file except in compliance with the License.+You may obtain a copy of the License at++ http://www.apache.org/licenses/LICENSE-2.0++Unless required by applicable law or agreed to in writing, software+distributed under the License is distributed on an "AS IS" BASIS,+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.+See the License for the specific language governing permissions and+limitations under the License.
+ Makefile view
@@ -0,0 +1,109 @@+# installation prefix+PREFIX=/usr/local+#+CCWARNS= -Wall -Wno-deprecated-declarations+CCOPTS= -O3+CCLIBS= -lm+CCEVAL= $(CC) $(CCWARNS) $(CCOPTS) src/runtime/eval.c $(CCLIBS)+#+GHC= ghc+GHCINCS= -ighc -isrc+GHCWARNS= -Wall -Wno-unrecognised-warning-flags -Wno-x-partial+GHCOPTS= -O+GHCEXTS= -XScopedTypeVariables -XPatternGuards -XTupleSections -XTypeSynonymInstances -XFlexibleInstances+GHCPKGS= #-package mtl -package pretty -package temporary -package process+GHCTOOL= -F -pgmF Tools/convertX.sh+GHCOUTDIR= ghc-out+GHCOUT= -outputdir $(GHCOUTDIR)+GHCPROF= # -prof -fprof-late #-prof -fprof-auto+GHCFLAGS= $(GHCEXTS) $(GHCINCS) $(GHCWARNS) $(GHCOPTS) $(GHCTOOL) $(GHCPKGS) $(GHCOUT) $(GHCPROF)+#+.PHONY: clean bootstrap install ghcgen newmhs cacheprelude++all: bin/gmhs++newmhs: ghcgen+ $(CCEVAL) generated/mhs.c -o bin/mhs+ $(CC) $(CCWARNS) -g src/runtime/eval.c $(CCLIBS) generated/mhs.c -o bin/mhsgdb++# Compile mhs from distribution, with C compiler+bin/mhs: src/runtime/eval.c src/runtime/config*.h #generated/mhs.c+ @mkdir -p bin+ $(CCEVAL) generated/mhs.c -o bin/mhs++# Compile combinator evaluator+bin/mhseval: src/runtime/eval.c src/runtime/config*.h src/runtime/comb.c+ @mkdir -p bin+ $(CCEVAL) src/runtime/comb.c -o bin/mhseval++# Compile mhs with ghc+bin/gmhs: src/*/*.hs Tools/convertX.sh+ @mkdir -p bin+ $(GHC) $(GHCFLAGS) src/MicroHs/Main.hs -main-is MicroHs.Main -o bin/gmhs++# Generate distribution C file+generated/mhs.c: bin/mhs src/*/*.hs+ @mkdir -p generated+ bin/mhs -ilib -isrc MicroHs.Main -ogenerated/mhs.c++# Make sure boottrapping works+bootstrap: bin/mhs-stage2+ @echo "*** copy stage2 to bin/mhs"+ cp bin/mhs-stage2 bin/mhs+ cp generated/mhs-stage2.c generated/mhs.c ++ghcgen: bin/gmhs src/*/*.hs lib/*.hs lib/*/*.hs lib/*/*/*.hs+ bin/gmhs -ilib -isrc MicroHs.Main -ogenerated/mhs.c++# Build stage1 compiler with existing compiler+bin/mhs-stage1: bin/mhs src/*/*.hs+ @mkdir -p generated+ @echo "*** Build stage1 compiler, using bin/mhs"+ bin/mhs -ilib -isrc MicroHs.Main -ogenerated/mhs-stage1.c+ $(CCEVAL) generated/mhs-stage1.c -o bin/mhs-stage1++# Build stage2 compiler with stage1 compiler, and compare+bin/mhs-stage2: bin/mhs-stage1 src/*/*.hs+ @mkdir -p generated+ @echo "*** Build stage2 compiler, with stage1 compiler"+ bin/mhs-stage1 -ilib -isrc MicroHs.Main -ogenerated/mhs-stage2.c+ cmp generated/mhs-stage1.c generated/mhs-stage2.c+ @echo "*** stage2 equal to stage1"+ $(CCEVAL) generated/mhs-stage2.c -o bin/mhs-stage2++# Run test examples with ghc-compiled compiler+runtest: bin/mhseval bin/gmhs tests/*.hs+ cd tests; make alltest++# Compress the binary (broken on MacOS)+bin/umhs: bin/mhs+ rm -f bin/umhs+ upx -q -q -obin/umhs bin/mhs++#+cacheprelude:+ @mkdir -p cache+ bin/mhs -c Prelude -ocache/Prelude.comb++#+clean:+ rm -rf src/*/*.hi src/*/*.o *.comb *.tmp *~ bin/* a.out $(GHCOUTDIR) tmp/* Tools/*.o Tools/*.hi dist-newstyle generated/*-stage* cache+ cd tests; make clean++install:+ mkdir -p $(PREFIX)/bin+ cp bin/mhs $(PREFIX)/bin+ mkdir -p $(PREFIX)/lib/mhs/src/runtime+ cp -r lib $(PREFIX)/lib/mhs+ cp src/runtime/* $(PREFIX)/lib/mhs/src/runtime+ @echo "***"+ @echo "*** Installation complete"+ @echo "*** Set environment variable MHSDIR to $(PREFIX)/lib/mhs"+ @echo "***"++everytest: runtest bootcombtest++bootcombtest: bin/gmhs bin/mhseval+ bin/gmhs -ilib -isrc -ogmhs.comb MicroHs.Main+ bin/mhseval +RTS -v -rgmhs.comb -RTS -ilib -isrc -omhs.comb MicroHs.Main+ cmp gmhs.comb mhs.comb
+ MicroHs.cabal view
@@ -0,0 +1,72 @@+cabal-version: 3.0+name: MicroHs+version: 0.8+synopsis: A compiler for a subset of Haskell+license: Apache-2.0+license-file: LICENSE+copyright: 2023 Lennart Augustsson+category: language+author: lennart@augustsson.net+maintainer: lennart@augustsson.net+stability: experimental+description: A compiler for a subset of Haskell.+ The compiler translates to combinators and can compile itself.+build-type: Simple++extra-source-files:+ LICENSE+ Example.hs+ Makefile+ README.md+ Tools/convertX.sh+ Tools/Addcombs.hs+ Tools/Compress.hs+ generated/mhs.c+ ghc/**/*.hs+ lib/**/*.hs+ src/runtime/eval.c+ src/runtime/*.h+ tests/Makefile+ tests/*.hs+ tests/*.ref++source-repository head+ type: git+ location: https://github.com/augustss/MicroHs++executable mhs+ default-language: Haskell98+ hs-source-dirs: src ghc+ ghc-options: -Wall -Wno-unrecognised-warning-flags -Wno-x-partial -F -pgmF ./Tools/convertX.sh -main-is MicroHs.Main+ main-is: MicroHs/Main.hs+ default-extensions: ScopedTypeVariables PatternGuards TupleSections TypeSynonymInstances FlexibleInstances+ other-modules: MicroHs.Compile+ MicroHs.Desugar+ MicroHs.Exp+ MicroHs.Expr+ MicroHs.Graph+ MicroHs.Ident+ MicroHs.IdentMap+ MicroHs.Interactive+ MicroHs.Lex+ MicroHs.MakeCArray+ MicroHs.Parse+ MicroHs.StateIO+ MicroHs.TCMonad+ MicroHs.Translate+ MicroHs.TypeCheck+ Text.ParserComb+ System.Console.SimpleReadline+ Control.Alternative+ Data.Double+ Compat+ PrimTable+ build-depends: base >= 4.10 && < 4.20,+ containers >= 0.5 && < 0.8,+ deepseq >= 1.1 && < 1.6,+ ghc-prim >= 0.5 && < 0.12,+ mtl >= 2.0 && < 2.4,+ time >= 1.1 && < 1.15,+ pretty >= 1.0 && < 1.2,+ process >= 1.6 && < 1.8,+ directory >= 1.2 && < 1.5
+ README.md view
@@ -0,0 +1,250 @@+# Micro Haskell+This directory contains an implementation of a small subset of Haskell.+It uses combinators for the runtime execution.++The compiler can compile itself.++## Compiling MicroHs+There are two different ways to compile MicroHs+* Using GHC with standard `Prelude` and libraries. `Makefile` target `bin/gmhs`+* Using the included combinator file and runtime. `Makefile` target `bin/mhs`++These different ways of compiling need slightly different imports etc.+To accomodate this each source file is preprocessed for the first target.+When compiling with GHC the string `--X` is removed from the source file.+This way anything special needed with GHC is just treated as comments by mhs.++Compiling MicroHs is really best done using `make`, but there is also a `MicroHs.cabal` file+for use with `cabal`. This only builds what corresponds to the first target.++Also note that there is no need to have a Haskell compiler to run MicroHs.+All you need is a C compiler, and MicroHs can bootstrap, given the included combinator file.++To install `mhs` use `make install`. You also need to set the environment variable `MHSDIR`.++## Language+The language is an extended subset of Haskell-98.++Differences:+ * Top level definitions must have a type signature.+ * Type variables need an explicit `forall`.+ * Type variables without a kind annotation are assumed to have kind `Type`.+ * There is no prefix negation.+ * There is no `Read` class.+ * There is no deriving.+ * The `Prelude` has to be imported explicitly.+ * Polymorphic types are never inferred; use a type signature if you need it.+ * A module must have an export list.+ * Always enabled extension:+ * ConstraintKinds+ * EmptyDataDecls+ * ExtendedDefaultRules+ * FlexibleContexts+ * FlexibleInstance+ * ForeignFunctionInterface+ * IncoherentInstances+ * KindSignatures+ * MonoLocalBinds+ * MultiParamTypeClasses+ * NegativeLiterals+ * NoMonomorphismRestriction+ * OverlappingInstances+ * RankNTypes+ * QualifiedDo+ * ScopedTypeVariables+ * StarIsType+ * TupleSections+ * TypeSynonymInstances+ * UndecidableInstances+ * UndecidableSuperClasses+ * In the works+ * FunctionalDependencies+ * ExistentialQuantification+ * `main` in the top module given to `mhs` serves at the program entry point.+ * Many things that should be an error (but which are mostly harmless) are not reported.+ * More differences that I don't remember right now.++## Example+The file `Example.hs` contains the following:+```Haskell+module Example(main) where+import Prelude++fac :: Int -> Int+fac 0 = 1+fac n = n * fac(n-1)++main :: IO ()+main = do+ let+ rs = map fac [1,2,3,10]+ putStrLn "Some factorials"+ print rs+```++First, make sure the compiler is built by doing `make`.+Then compile the file by `bin/mhs Example -oEx` which produces `Ex`.+Finally, run the binary file by `./Ex`.+This should produce+```+Some factorials+[1,2,6,3628800]+```++## Libraries+There are a number of libraries that have some of the standard Haskell functions.+But in general, the `Prelude` contains less.++## Types+There are some primitive data types, e.g `Int`, `IO`, `Ptr`, and `Double`.+These are known by the runtime system and various primitive operations work on them.+The function type, `->`, is (of course) also built in.++All other types are defined with the language. They are converted to lambda terms using+the Scott encoding. The runtime system knows how lists and booleans are encoded.+++## Compiler+The compiler is written in Micro Haskell.+It takes a name of a module and compiles to a target (see below).+This module should contain the function `main` of type `IO ()` and+it will be the entry point to the program.++### Compiler flags+* `-iDIR` add `DIR` to search path for modules+* `-oFILE` output file. If the `FILE` ends in `.comb` it will produce a textual combinator file. If `FILE` ends in `.c` it will produce a C file with the combinators. For all other `FILE` it will compiler the combinators together with the runtime system to produce a regular executable.+* `-r` run directly (does not work if compiled with GHC)+* `-v` be more verbose, flag can be repeated++With the `-v` flag the processing time for each module is reported.+E.g.+ ```+ importing done MicroHs.Exp, 284ms (91 + 193)+ ```+which means that processing the module `MicroHs.Exp` took 284ms,+with parsing taking 91ms and typecheck&desugar taking 193ms.++### Environment variables+* `MHSDIR` the directory where `lib/` and `src/` are expected to be. Defaults to `./`.+* `MHSCC` command use to compile C file to produce binaries. Look at the source for more information.++### Compiler modules++* `Compile`, top level compiler. Maintains a cache of already compiled modules.+* `Desugar`, desugar full expressions to simple expressions.+* `Exp`, simple expression type, combinator abstraction and optimization.+* `Expr`, parsed expression type.+* `Graph`, strongly connected component algorithm.+* `Ident`, identifiers and related types.+* `IdentMap`, map from identifiers to something.+* `Interactive`, top level for the interactive REPL.+* `Lex`, lexical analysis and indentation processing.+* `Main`, the main module. Decodes flags, compiles, and writes result.+* `MakeCArray`, generate a C version of the combinator file.+* `Parse`, parse and build and abstract syntax tree.+* `StateIO`, state + IO monad.+* `TCMonad`, type checking monad.+* `Translate`, convert an expression tree to its value.+* `TypeCheck`, type checker.++## Interactive mode+If no module name is given the compiler enters interactive mode.+You can enter expressions to be evaluated, or top level definitions (including `import`).+Simple line editing is available.++All definitions are saved in the file `Interactive.hs` and all input+lines as saved in `.mhsi`. The latter file is read on startup so+the command history is persisted.++Available commands:++* `:quit` Quit the interactive system+* `:clear` Get back to start state+* `:del STR` Delete all definitions that begin with `STR`+* `:reload` Reload all modules+* `expr` Evaluate expression.+* `defn` Add definition (can also be an `import`)++***NOTE*** When you `import` a module it is cached.+If the file changes and you import it again it will not reload.+You can use `:clear` (or `:reload`) to get back to an empty cache.+This is a bug.++## Runtime+The runtime system is written in C and is in `src/runtime/eval.c`.+It uses combinators for handling variables, and has primitive operations+for built in types and for executing IO operations.+There is a also a simple mark-scan garbage collector.+The runtime system is written in a reasonably portable C code.++### Runtime flags+Runtime flags are given between the flags `+RTS` and `-RTS`.+Between those the runtime decodes the flags, everything else is available to+the running program.++* `-HSIZE` set heap size to `SIZE` cells, can be suffixed by `k`, `M`, or `G`, default is `50M`+* `-KSIZE` set stack size to `SIZE` entries, can be suffixed by `k`, `M`, or `G`, default is`100k`+* `-rFILE` read combinators from `FILE`, instead of `out.comb`+* `-v` be more verbose, flag can be repeated++For example, `bin/mhseval +RTS -H1M -v -RTS hello` runs `out.comb` and the program gets the argument `hello`,+whereas the runtime system sets the heap to 1M cells and is verbose.++### FFI+MicroHs supports calling C functions, but all such functions must be in a table in the runtime system.++### Features+The runtime system can serialize and deserialize any expression+and keep its graph structure (sharing and cycles).+The only exceptions to this are C pointers file handles, which cannot be serialized (except for `stdin`, `stdout`, and `stderr`).++### Memory layout+Memory allocation is based on cells. Each cell has room for two pointers (i.e., two words, typically 16 bytes),+so it can represent an application node. One bit is used to indicate if+the cell is an application or something else. If it is something else one+word is a tag indicating what it is, e.g., a combinator or an integer.+The second word is then used to store any payload, e.g., the number itself for an integer node.++Memory allocation has a bitmap with one bit per cell.+Allocating a cell consists of finding the next free cell using the bitmap,+and then marking it as used. The garbage collector first clears the bitmap+and then (recursively) marks every used cell in the bitmap.+There is no explicit scan phase since that is baked into the allocation.+Allocation is fast assuming the CPU has some kind of FindFirstSet instruction.++It is possible to use smaller cells by using 32 bit "pointers" instead of 64 bit pointers.+This has a performance penalty, though.++### Portability+The C code for the evaluator does not use any special features, and should be+portable to many platforms. It has mostly been test with MacOS and Linux,+and somewhat with Windows.++The code has only been tested on 64 bit platforms, so again, there are lurking problems+with other word sizes, but they should be easy to fix.++The `src/runtime/` directory contains configuration files for different platform.+Edit `src/runtime/eval.c` to `#include` the right one.++## Bootstrapping+The compiler can compile itself. To replace `bin/mhs` with a new version,+do `make bootstrap`. This will recompile the compiler twice and compare+the outputs to make sure the new compiler still works.+++# FAQ+* + * Q: When will it get _insert feature_?+ * A: Maybe some time, maybe never.+* + * Q: Why are the error messages so bad?+ * A: Error messages are boring.+* + * Q: Why is the so much source code?+ * A: I wonder this myself. 7000+ lines of Haskell seems excessive.+ 2500+ lines of C is also more than I'd like for such a simple system.+* + * Q: Why are the binaries so big?+ * A: The combinator file is rather verbose. The combinator file+ for the compiler shrinks from 350kB to 75kB when compressed with upx.+ The evaluator alone is about 70kB (26kB compressed with upx).
+ Tools/Addcombs.hs view
@@ -0,0 +1,30 @@+module Addcombs(main) where+import Prelude+import Data.Char+import System.Environment++chunkify :: Int -> [Char] -> [[Char]]+chunkify n [] = []+chunkify n xs =+ let (as, bs) = splitAt n xs+ in as : chunkify n bs++showChunk :: [Char] -> String+showChunk = concatMap (\ c -> show (ord c) ++ ",")++main :: IO ()+main = do+{-+ args <- getArgs+ let fn = case args of { [a] -> a; _ -> error "Usage: Addcombs file" }+ file <- readFile fn+-}+ hSetBinaryMode stdin True+ file <- hGetContents stdin+ let size = length file+ chunks = chunkify 20 file+ putStrLn $ "unsigned char combexprdata[] = {"+ mapM_ (putStrLn . showChunk) chunks+ putStrLn "0 };"+ putStrLn "unsigned char *combexpr = combexprdata;"+ putStrLn $ "int combexprlen = " ++ show size ++ ";"
+ Tools/Compress.hs view
@@ -0,0 +1,71 @@+module Compress(main) where+import Prelude+import Data.Map as M+import Data.Char+import System.IO+--import Debug.Trace++--+-- A simple LZW compressor+-- It uses a dictionary of maximum size 4096.+-- The 12 bit code words are encoded with 2 code words in 3 bytes.+-- It can only compress input of printable ASCII + '\n'++type Table = M.Map [Char] Int++-- Don't change this lightly.+-- It needs to be coordinated with the decompressor transducer in eval.c+maxDict :: Int+maxDict = 4096++toChar :: Int -> Char+toChar i = chr (i + 32)++(!) :: Table -> [Char] -> Int+(!) t s =+ case M.lookupBy compare s t of+ Nothing -> undefined -- error $ "(!): " ++ showString s+ Just i -> i++compress :: Table -> [Char] -> [Char] -> [Int]+compress t [] p = [ t ! p ]+compress t (c:cs) p =+ let p' = p ++ [c]+ s = M.size t+ t' = if s < maxDict then M.insertBy compare p' s t else t+ in+-- trace ("compress " ++ showString p') $+-- trace show (M.toList t)) $+ case M.lookupBy compare p' t of+ Just _ ->+-- trace "found" $+ compress t cs p'+ Nothing ->+-- trace ("not found p=" ++ show p ++ " " ++ show (M.lookupBy compare p t)) $+ (t ! p) : compress t' cs [c]++-- Initial table is ' ' .. '~', and '\n'+initTable :: Table+initTable = M.fromListBy compare $ [([toChar c], c) | c <- [0..94] ] ++ [("\n", 95)]++toBytes :: [Int] -> [Int]+toBytes [] = []+toBytes [i] = [i `rem` 256, i `quot` 256, 0]+toBytes (i1:i2:is) =+ let i = i1 + 4096*i2+ b1 = i `rem` 256+ b2 = (i `quot` 256) `rem` 256+ b3 = i `quot` (256*256)+ in b1 : b2 : b3 : toBytes is++bad :: Char -> Bool+bad c = not (isPrint c || c == '\n')++main :: IO ()+main = do+ f <- hGetContents stdin+ when (any bad f) $+ error "Non-printable ASCII in input"+ let bs = compress initTable f []+ hSetBinaryMode stdout True+ putStr $ 'Z' : (map chr $ toBytes bs)
+ Tools/convertX.sh view
@@ -0,0 +1,2 @@+#!/bin/sh+( echo "{-# LINE 1 \"$1\" #-}" ; sed -e 's/--[XW]//' $2 ) > $3
+ generated/mhs.c view
@@ -0,0 +1,14056 @@+static unsigned char data[] = {+118,53,46,49,10,49,54,49,52,10,40,40,65,32,58,48,32,40,40,66,+32,40,66,32,40,66,32,40,66,32,67,41,41,41,41,32,40,40,66,32,+40,66,32,40,66,32,67,41,41,41,32,40,40,66,32,40,66,32,67,41,+41,32,80,41,41,41,41,32,40,40,65,32,58,49,32,40,85,32,40,90,+32,40,90,32,40,90,32,75,41,41,41,41,41,32,40,40,65,32,58,50,+32,40,85,32,40,75,32,40,90,32,40,90,32,75,41,41,41,41,41,32,+40,40,65,32,58,51,32,40,85,32,40,75,32,40,75,32,40,90,32,75,+41,41,41,41,41,32,40,40,65,32,58,52,32,40,85,32,40,75,32,40,+75,32,40,75,32,75,41,41,41,41,41,32,40,40,65,32,58,53,32,40,+85,32,40,75,32,40,75,32,40,75,32,65,41,41,41,41,41,32,40,40,+65,32,58,54,32,40,75,32,40,110,111,68,101,102,97,117,108,116,32,34,+65,108,116,101,114,110,97,116,105,118,101,46,101,109,112,116,121,34,41,41,+41,32,40,40,65,32,58,55,32,40,75,32,40,110,111,68,101,102,97,117,+108,116,32,34,65,108,116,101,114,110,97,116,105,118,101,46,60,124,62,34,+41,41,41,32,40,40,65,32,58,56,32,40,40,83,32,40,40,40,83,39,+32,83,39,41,32,40,40,66,32,95,49,52,41,32,95,49,41,41,32,40,+40,40,67,39,32,95,50,55,54,41,32,40,40,66,32,95,49,50,41,32,+95,49,41,41,32,95,52,54,50,41,41,41,32,95,53,41,41,32,40,40,+65,32,58,57,32,40,40,83,32,40,40,40,83,39,32,67,39,41,32,95,+51,41,32,95,52,41,41,32,40,40,40,67,39,32,95,49,51,41,32,95,+49,41,32,95,52,54,49,41,41,41,32,40,40,65,32,58,49,48,32,40,+40,40,83,39,32,80,41,32,95,50,41,32,40,40,40,67,39,32,95,49,+51,41,32,95,49,41,32,95,49,51,52,49,41,41,41,32,40,40,65,32,+58,49,49,32,40,40,66,32,40,66,32,40,66,32,40,66,32,67,41,41,+41,41,32,40,40,66,32,40,66,32,40,66,32,67,41,41,41,32,40,40,+66,32,40,66,32,67,41,41,32,80,41,41,41,41,32,40,40,65,32,58,+49,50,32,40,85,32,40,90,32,40,90,32,40,90,32,75,41,41,41,41,+41,32,40,40,65,32,58,49,51,32,40,85,32,40,75,32,40,90,32,40,+90,32,75,41,41,41,41,41,32,40,40,65,32,58,49,52,32,40,85,32,+40,75,32,40,75,32,40,90,32,75,41,41,41,41,41,32,40,40,65,32,+58,49,53,32,40,85,32,40,75,32,40,75,32,40,75,32,75,41,41,41,+41,41,32,40,40,65,32,58,49,54,32,40,85,32,40,75,32,40,75,32,+40,75,32,65,41,41,41,41,41,32,40,40,65,32,58,49,55,32,40,75,+32,40,110,111,68,101,102,97,117,108,116,32,34,65,112,112,108,105,99,97,+116,105,118,101,46,112,117,114,101,34,41,41,41,32,40,40,65,32,58,49,+56,32,40,75,32,40,110,111,68,101,102,97,117,108,116,32,34,65,112,112,+108,105,99,97,116,105,118,101,46,60,42,62,34,41,41,41,32,40,40,65,+32,58,49,57,32,40,40,40,83,39,32,66,41,32,95,49,52,41,32,40,+40,40,67,39,32,95,50,55,51,41,32,95,49,50,41,32,95,50,54,52,+41,41,41,32,40,40,65,32,58,50,48,32,40,40,40,83,39,32,66,41,+32,95,49,52,41,32,40,40,40,67,39,32,95,50,55,54,41,32,95,49,+50,41,32,95,50,54,53,41,41,41,32,40,40,65,32,58,50,49,32,95,+49,52,49,51,41,32,40,40,65,32,58,50,50,32,40,40,66,32,95,49,+52,56,49,41,32,95,50,49,41,41,32,40,40,65,32,58,50,51,32,40,+40,40,83,39,32,95,49,52,56,49,41,32,95,50,49,41,32,73,41,41,+32,40,40,65,32,58,50,52,32,95,49,51,57,55,41,32,40,40,65,32,+58,50,53,32,40,95,50,52,32,34,117,110,100,101,102,105,110,101,100,34,+41,41,32,40,40,65,32,58,50,54,32,73,41,32,40,40,65,32,58,50,+55,32,40,40,40,67,39,32,66,41,32,95,49,52,49,50,41,32,40,40,+67,32,95,50,54,51,41,32,95,50,54,41,41,41,32,40,40,65,32,58,+50,56,32,40,40,40,67,39,32,95,50,55,41,32,40,40,95,50,55,50,+32,95,49,52,53,48,41,32,95,49,55,53,41,41,32,40,40,95,50,54,+51,32,40,95,51,52,32,95,49,52,53,50,41,41,32,95,49,55,52,41,+41,41,32,40,40,65,32,58,50,57,32,40,40,66,32,40,40,83,32,95,+49,52,56,49,41,32,40,95,51,52,32,95,49,52,53,50,41,41,41,32,+95,50,52,41,41,32,40,40,65,32,58,51,48,32,40,40,66,32,40,66,+32,40,66,32,67,41,41,41,32,40,40,66,32,40,66,32,67,41,41,32,+80,41,41,41,32,40,40,65,32,58,51,49,32,40,85,32,40,90,32,40,+90,32,75,41,41,41,41,32,40,40,65,32,58,51,50,32,40,85,32,40,+75,32,40,90,32,75,41,41,41,41,32,40,40,65,32,58,51,51,32,40,+85,32,40,75,32,40,75,32,75,41,41,41,41,32,40,40,65,32,58,51,+52,32,40,85,32,40,75,32,40,75,32,65,41,41,41,41,32,40,40,65,+32,58,51,53,32,40,75,32,40,110,111,68,101,102,97,117,108,116,32,34,+77,111,110,97,100,46,62,62,61,34,41,41,41,32,40,40,65,32,58,51,+54,32,40,40,40,67,39,32,40,67,39,32,66,41,41,32,95,51,50,41,+32,75,41,41,32,40,40,65,32,58,51,55,32,40,40,66,32,95,49,51,+41,32,95,51,49,41,41,32,40,40,65,32,58,51,56,32,40,40,40,83,+39,32,40,67,39,32,66,41,41,32,95,51,50,41,32,40,40,40,83,39,+32,40,67,39,32,66,41,41,32,95,51,50,41,32,40,66,39,32,95,51,+52,41,41,41,41,32,40,40,65,32,58,51,57,32,80,41,32,40,40,65,+32,58,52,48,32,40,85,32,75,41,41,32,40,40,65,32,58,52,49,32,+40,85,32,65,41,41,32,40,40,65,32,58,52,50,32,40,75,32,95,50,+52,41,41,32,40,40,65,32,58,52,51,32,40,40,66,32,40,66,32,89,+41,41,32,40,40,40,83,39,32,66,41,32,40,66,39,32,40,40,66,32,+80,41,32,40,40,67,32,95,51,52,41,32,95,52,54,49,41,41,41,41,+32,40,40,40,83,39,32,40,67,39,32,66,41,41,32,40,40,66,32,40,+66,32,40,67,39,32,66,41,41,41,32,40,66,39,32,95,51,50,41,41,+41,32,40,40,40,83,39,32,40,67,39,32,40,67,39,32,66,41,41,41,+32,40,66,39,32,95,51,50,41,41,32,40,40,40,67,39,32,66,41,32,+40,66,39,32,95,51,52,41,41,32,95,52,54,50,41,41,41,41,41,41,+32,40,40,65,32,58,52,52,32,40,40,66,32,40,66,32,89,41,41,32,+40,40,40,83,39,32,66,41,32,40,66,39,32,40,40,66,32,80,41,32,+40,40,67,32,95,51,52,41,32,95,49,51,52,49,41,41,41,41,32,40,+40,40,67,39,32,40,67,39,32,66,41,41,32,40,40,66,32,40,66,32,+40,67,39,32,66,41,41,41,32,40,66,39,32,95,51,50,41,41,41,32,+90,41,41,41,41,32,40,40,65,32,58,52,53,32,40,40,66,32,85,41,+32,40,40,67,32,95,51,52,41,32,95,49,51,52,49,41,41,41,32,40,+40,65,32,58,52,54,32,40,40,67,32,95,52,51,41,32,95,50,54,52,+41,41,32,40,40,65,32,58,52,55,32,40,40,66,32,95,50,54,54,41,+32,95,51,50,41,41,32,40,40,65,32,58,52,56,32,40,40,66,32,67,+41,32,40,40,66,32,67,39,41,32,95,51,50,41,41,41,32,40,40,65,+32,58,52,57,32,40,40,66,32,95,50,54,54,41,32,95,52,56,41,41,+32,40,40,65,32,58,53,48,32,40,40,66,32,89,41,32,40,40,40,83,+39,32,66,41,32,40,66,39,32,40,40,66,32,80,41,32,40,40,67,32,+95,51,52,41,32,95,52,54,49,41,41,41,41,32,40,40,40,83,39,32,+66,41,32,40,40,66,32,40,83,39,32,40,83,39,32,66,41,41,41,32,+40,66,39,32,95,51,50,41,41,41,32,40,40,40,83,39,32,40,67,39,+32,40,67,39,32,66,41,41,41,32,40,40,66,32,40,66,32,40,66,32,+40,67,39,32,66,41,41,41,41,32,40,66,39,32,40,66,39,32,95,51,+50,41,41,41,41,32,40,40,40,67,39,32,66,41,32,40,66,39,32,40,+66,39,32,40,40,66,32,95,50,54,49,41,32,95,51,52,41,41,41,41,+32,40,40,66,32,40,67,32,83,41,41,32,95,52,54,50,41,41,41,41,+41,41,41,32,40,40,65,32,58,53,49,32,40,40,66,32,89,41,32,40,+40,40,83,39,32,66,41,32,40,66,39,32,40,40,66,32,80,41,32,40,+40,67,32,95,51,52,41,32,40,40,80,32,95,52,54,49,41,32,95,52,+54,49,41,41,41,41,41,32,40,40,40,83,39,32,66,41,32,40,40,66,+32,40,83,39,32,40,83,39,32,66,41,41,41,32,40,66,39,32,95,51,+50,41,41,41,32,40,40,40,83,39,32,40,67,39,32,40,67,39,32,66,+41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,67,39,32,66,41,+41,41,41,32,40,66,39,32,40,66,39,32,95,51,50,41,41,41,41,32,+40,40,66,32,40,66,32,40,66,32,85,41,41,41,32,40,40,40,67,39,+32,66,41,32,40,66,39,32,40,66,39,32,40,66,39,32,40,40,66,32,+95,50,54,49,41,32,95,51,52,41,41,41,41,41,32,40,40,40,83,39,+32,67,41,32,40,40,66,32,40,40,67,39,32,83,39,41,32,83,39,41,+41,32,40,40,66,32,40,40,67,39,32,66,41,32,80,41,41,32,95,52,+54,50,41,41,41,32,40,40,66,32,40,66,32,80,41,41,32,95,52,54,+50,41,41,41,41,41,41,41,41,41,32,40,40,65,32,58,53,50,32,40,+40,95,50,55,49,32,95,50,54,51,41,32,40,95,50,55,53,32,95,53,+50,41,41,41,32,40,40,65,32,58,53,51,32,40,40,40,40,40,95,49,+49,32,95,53,50,41,32,95,50,54,53,41,32,83,41,32,40,95,49,57,+32,95,53,51,41,41,32,40,95,50,48,32,95,53,51,41,41,41,32,40,+40,65,32,58,53,52,32,40,40,40,40,95,51,48,32,95,53,51,41,32,+40,40,40,67,39,32,67,41,32,40,67,32,83,39,41,41,32,73,41,41,+32,40,95,51,54,32,95,53,52,41,41,32,40,95,51,55,32,95,53,52,+41,41,41,32,40,40,65,32,58,53,53,32,85,41,32,40,40,65,32,58,+53,54,32,40,40,95,50,55,49,32,40,40,66,32,40,66,32,40,95,50,+54,49,32,95,53,53,41,41,41,32,40,40,66,32,40,40,67,39,32,67,+41,32,95,53,57,41,41,32,40,66,32,80,41,41,41,41,32,40,95,50,+55,53,32,95,53,54,41,41,41,32,40,40,65,32,58,53,55,32,40,40,+40,40,40,95,49,49,32,95,53,54,41,32,40,40,66,32,40,95,50,54,+49,32,95,53,53,41,41,32,80,41,41,32,40,95,51,56,32,95,53,56,+41,41,32,40,40,66,32,40,66,32,40,95,50,54,49,32,95,53,53,41,+41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,67,41,32,95,+53,57,41,41,32,40,90,32,95,53,57,41,41,41,41,32,40,95,50,48,+32,95,53,55,41,41,41,32,40,40,65,32,58,53,56,32,40,40,40,40,+95,51,48,32,95,53,55,41,32,40,40,66,32,40,66,32,40,95,50,54,+49,32,95,53,53,41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,+66,32,67,41,32,95,53,57,41,41,32,40,66,32,95,53,57,41,41,41,+41,32,40,95,49,53,32,95,53,55,41,41,32,40,95,49,51,32,95,53,+55,41,41,41,32,40,40,65,32,58,53,57,32,40,85,32,73,41,41,32,+40,40,65,32,58,54,48,32,40,40,66,32,40,95,50,54,51,32,95,53,+54,53,41,41,32,95,53,57,41,41,32,40,40,65,32,58,54,49,32,40,+40,66,32,40,95,50,54,49,32,95,53,53,41,41,32,40,66,32,40,80,+32,95,49,51,52,49,41,41,41,41,32,40,40,65,32,58,54,50,32,40,+40,66,32,40,95,50,54,49,32,95,53,53,41,41,32,40,90,32,40,80,+32,95,49,51,52,49,41,41,41,41,32,40,40,65,32,58,54,51,32,40,+40,95,50,54,49,32,95,53,53,41,32,40,40,83,32,80,41,32,73,41,+41,41,32,40,40,65,32,58,54,52,32,40,40,66,32,40,95,50,54,49,+32,95,53,53,41,41,32,40,40,67,32,40,83,39,32,80,41,41,32,73,+41,41,41,32,40,40,65,32,58,54,53,32,40,40,66,32,40,66,32,40,+66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,+40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,+32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,67,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,+40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,+32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,+66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,+67,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,+32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,+66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,+67,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,+40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,+32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,67,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,66,32,+40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,+32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,+66,32,40,66,32,40,66,32,67,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,+40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,+32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,67,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,66,32,40,66,+32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,+66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,+67,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,66,+32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,+66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,+67,41,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,66,32,+40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,+32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,67,41,41,41,+41,41,41,41,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,+32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,+66,32,40,66,32,40,66,32,67,41,41,41,41,41,41,41,41,41,41,41,+41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,+32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,67,41,41,41,+41,41,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,+66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,+67,41,41,41,41,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,+66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,+67,41,41,41,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,+32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,67,41,41,41,+41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,+66,32,40,66,32,40,66,32,67,41,41,41,41,41,41,41,32,40,40,66,+32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,67,41,41,41,+41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,+67,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,+67,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,67,41,41,41,+32,40,40,66,32,40,66,32,67,41,41,32,80,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,65,32,58,+54,54,32,40,85,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,+32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,+90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,+40,90,32,40,90,32,75,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,32,40,40,65,32,58,54,55,32,40,85,+32,40,75,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,+90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,+40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,+32,75,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,32,40,40,65,32,58,54,56,32,40,85,32,40,75,32,40,+75,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,+40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,+32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,75,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,32,+40,40,65,32,58,54,57,32,40,85,32,40,75,32,40,75,32,40,75,32,+40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,+32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,+90,32,40,90,32,40,90,32,40,90,32,75,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,65,32,58,+55,48,32,40,85,32,40,75,32,40,75,32,40,75,32,40,75,32,40,90,+32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,+90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,+40,90,32,40,90,32,75,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,32,40,40,65,32,58,55,49,32,40,85,+32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,90,32,40,+90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,+40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,+32,75,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,32,40,40,65,32,58,55,50,32,40,85,32,40,75,32,40,+75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,90,32,40,90,32,+40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,+32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,75,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,32,+40,40,65,32,58,55,51,32,40,85,32,40,75,32,40,75,32,40,75,32,+40,75,32,40,75,32,40,75,32,40,75,32,40,90,32,40,90,32,40,90,+32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,+90,32,40,90,32,40,90,32,40,90,32,75,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,65,32,58,+55,52,32,40,85,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,+32,40,75,32,40,75,32,40,75,32,40,90,32,40,90,32,40,90,32,40,+90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,+40,90,32,40,90,32,75,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,32,40,40,65,32,58,55,53,32,40,85,+32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,+75,32,40,75,32,40,75,32,40,90,32,40,90,32,40,90,32,40,90,32,+40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,+32,75,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,32,40,40,65,32,58,55,54,32,40,85,32,40,75,32,40,+75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,+40,75,32,40,75,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,+32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,75,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,32,+40,40,65,32,58,55,55,32,40,85,32,40,75,32,40,75,32,40,75,32,+40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,+32,40,75,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,+90,32,40,90,32,40,90,32,40,90,32,75,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,65,32,58,+55,56,32,40,85,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,+32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,+75,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,+40,90,32,40,90,32,75,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,32,40,40,65,32,58,55,57,32,40,85,+32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,+75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,+40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,+32,75,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,32,40,40,65,32,58,56,48,32,40,85,32,40,75,32,40,+75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,+40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,90,+32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,75,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,32,+40,40,65,32,58,56,49,32,40,85,32,40,75,32,40,75,32,40,75,32,+40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,+32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,90,32,40,+90,32,40,90,32,40,90,32,40,90,32,75,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,65,32,58,+56,50,32,40,85,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,+32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,+75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,90,32,40,90,32,+40,90,32,40,90,32,75,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,32,40,40,65,32,58,56,51,32,40,85,+32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,+75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,+40,75,32,40,75,32,40,75,32,40,75,32,40,90,32,40,90,32,40,90,+32,75,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,32,40,40,65,32,58,56,52,32,40,85,32,40,75,32,40,+75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,+40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,+32,40,75,32,40,75,32,40,75,32,40,90,32,40,90,32,75,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,32,+40,40,65,32,58,56,53,32,40,85,32,40,75,32,40,75,32,40,75,32,+40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,+32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,+75,32,40,75,32,40,75,32,40,90,32,75,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,65,32,58,+56,54,32,40,85,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,+32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,+75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,+40,75,32,40,75,32,75,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,32,40,40,65,32,58,56,55,32,40,85,+32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,+75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,+40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,+32,65,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,32,40,40,65,32,58,56,56,32,40,75,32,40,110,111,68,+101,102,97,117,108,116,32,34,66,105,116,115,46,46,38,46,34,41,41,41,+32,40,40,65,32,58,56,57,32,40,75,32,40,110,111,68,101,102,97,117,+108,116,32,34,66,105,116,115,46,46,124,46,34,41,41,41,32,40,40,65,+32,58,57,48,32,40,75,32,40,110,111,68,101,102,97,117,108,116,32,34,+66,105,116,115,46,120,111,114,34,41,41,41,32,40,40,65,32,58,57,49,+32,40,75,32,40,110,111,68,101,102,97,117,108,116,32,34,66,105,116,115,+46,99,111,109,112,108,101,109,101,110,116,34,41,41,41,32,40,40,65,32,+58,57,50,32,40,40,40,83,39,32,40,83,39,32,83,41,41,32,40,40,+66,32,40,66,32,40,83,32,40,40,67,32,40,95,52,57,55,32,95,50,+56,50,41,41,32,35,48,41,41,41,41,32,40,40,66,32,40,40,83,39,+32,83,41,32,40,67,32,40,40,67,32,40,95,52,57,57,32,95,50,56,+50,41,41,32,35,48,41,41,41,41,32,95,55,57,41,41,41,32,40,40,+40,67,39,32,40,67,39,32,66,41,41,32,95,56,49,41,32,40,95,52,+56,50,32,95,50,55,55,41,41,41,41,32,40,40,65,32,58,57,51,32,+40,40,40,83,39,32,40,83,39,32,83,41,41,32,40,40,66,32,40,66,+32,40,83,32,40,40,67,32,40,95,52,57,55,32,95,50,56,50,41,41,+32,35,48,41,41,41,41,32,40,40,66,32,40,40,83,39,32,83,41,32,+40,67,32,40,40,67,32,40,95,52,57,57,32,95,50,56,50,41,41,32,+35,48,41,41,41,41,32,95,56,51,41,41,41,32,40,40,40,67,39,32,+40,67,39,32,66,41,41,32,95,56,52,41,32,40,95,52,56,50,32,95,+50,55,55,41,41,41,41,32,40,40,65,32,58,57,52,32,40,40,67,32,+40,40,83,32,95,55,54,41,32,40,40,67,32,95,55,52,41,32,35,48,+41,41,41,32,35,48,41,41,32,40,40,65,32,58,57,53,32,40,75,32,+40,110,111,68,101,102,97,117,108,116,32,34,66,105,116,115,46,98,105,116,+34,41,41,41,32,40,40,65,32,58,57,54,32,40,40,40,83,39,32,40,+67,39,32,66,41,41,32,95,54,56,41,32,95,55,52,41,41,32,40,40,+65,32,58,57,55,32,40,40,40,83,39,32,40,67,39,32,66,41,41,32,+95,54,55,41,32,40,40,40,83,39,32,66,41,32,95,55,48,41,32,95,+55,52,41,41,41,32,40,40,65,32,58,57,56,32,40,40,40,83,39,32,+40,67,39,32,66,41,41,32,95,54,57,41,32,95,55,52,41,41,32,40,+40,65,32,58,57,57,32,40,75,32,40,110,111,68,101,102,97,117,108,116,+32,34,66,105,116,115,46,116,101,115,116,66,105,116,34,41,41,41,32,40,+40,65,32,58,49,48,48,32,95,55,49,41,32,40,40,65,32,58,49,48,+49,32,95,55,57,41,32,40,40,65,32,58,49,48,50,32,40,40,40,67,+39,32,40,67,39,32,66,41,41,32,95,55,49,41,32,40,95,52,56,50,+32,95,50,55,55,41,41,41,32,40,40,65,32,58,49,48,51,32,95,56,+49,41,32,40,40,65,32,58,49,48,52,32,95,55,50,41,32,40,40,65,+32,58,49,48,53,32,40,40,40,67,39,32,40,67,39,32,66,41,41,32,+95,55,50,41,32,40,95,52,56,50,32,95,50,55,55,41,41,41,32,40,+40,65,32,58,49,48,54,32,40,75,32,40,110,111,68,101,102,97,117,108,+116,32,34,66,105,116,115,46,112,111,112,67,111,117,110,116,34,41,41,41,+32,40,40,65,32,58,49,48,55,32,40,75,32,40,110,111,68,101,102,97,+117,108,116,32,34,66,105,116,115,46,98,105,116,83,105,122,101,77,97,121,+98,101,34,41,41,41,32,40,40,65,32,58,49,48,56,32,40,40,66,32,+40,66,32,40,95,52,55,49,32,40,95,50,52,32,34,98,105,116,83,105,+122,101,32,105,115,32,117,110,100,101,102,105,110,101,100,34,41,41,41,41,+32,95,56,54,41,41,32,40,40,65,32,58,49,48,57,32,40,40,66,32,+40,66,32,40,66,32,67,41,41,41,32,40,40,66,32,40,66,32,67,41,+41,32,80,41,41,41,32,40,40,65,32,58,49,49,48,32,40,85,32,40,+90,32,40,90,32,75,41,41,41,41,32,40,40,65,32,58,49,49,49,32,+40,85,32,40,75,32,40,90,32,75,41,41,41,41,32,40,40,65,32,58,+49,49,50,32,40,85,32,40,75,32,40,75,32,75,41,41,41,41,32,40,+40,65,32,58,49,49,51,32,40,85,32,40,75,32,40,75,32,65,41,41,+41,41,32,40,40,65,32,58,49,49,52,32,40,75,32,40,110,111,68,101,+102,97,117,108,116,32,34,70,105,110,105,116,101,66,105,116,115,46,102,105,+110,105,116,101,66,105,116,83,105,122,101,34,41,41,41,32,40,40,65,32,+58,49,49,53,32,40,40,40,83,39,32,40,83,39,32,40,40,83,39,32,+40,95,52,56,48,32,95,50,55,55,41,41,32,40,40,67,32,40,95,52,+56,48,32,95,50,55,55,41,41,32,35,49,41,41,41,41,32,40,40,40,+67,39,32,40,67,39,32,66,41,41,32,40,40,66,32,40,66,32,89,41,+41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,+32,40,40,66,32,40,66,32,40,66,32,40,83,32,40,40,67,32,40,95,+52,57,55,32,95,50,56,50,41,41,32,40,40,95,52,56,53,32,95,50,+55,55,41,32,40,95,51,53,57,32,35,48,41,41,41,41,41,41,41,32,+40,40,40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,32,40,+40,40,67,39,32,40,67,39,32,66,41,41,32,40,40,66,32,40,66,32,+83,41,41,32,40,40,66,32,95,55,56,41,32,95,49,49,48,41,41,41,+32,40,40,67,32,66,41,32,40,40,67,32,40,95,52,56,48,32,95,50,+55,55,41,41,32,35,49,41,41,41,41,32,73,41,41,41,32,73,41,41,+41,32,40,40,67,32,40,95,52,56,48,32,95,50,55,55,41,41,32,35,+49,41,41,41,32,95,49,49,49,41,41,32,40,40,65,32,58,49,49,54,+32,40,40,40,67,39,32,40,67,39,32,89,41,41,32,40,40,40,67,39,+32,40,67,39,32,40,67,39,32,83,41,41,41,32,40,40,40,83,39,32,+40,83,39,32,66,41,41,32,40,40,66,32,40,66,32,83,41,41,32,40,+40,66,32,40,66,32,40,67,32,40,95,53,48,48,32,95,50,56,50,41,+41,41,41,32,95,49,49,49,41,41,41,32,40,40,40,67,39,32,40,67,+39,32,40,67,39,32,83,41,41,41,32,40,40,40,67,39,32,40,67,39,+32,66,41,41,32,40,40,66,32,40,66,32,83,41,41,32,40,40,66,32,+95,55,56,41,32,95,49,49,48,41,41,41,32,40,40,67,32,66,41,32,+40,40,67,32,40,95,52,55,57,32,95,50,55,55,41,41,32,35,49,41,+41,41,41,32,73,41,41,41,32,73,41,41,32,35,48,41,41,32,40,40,+65,32,58,49,49,55,32,40,40,95,50,48,49,32,40,40,67,32,40,40,+67,32,83,39,41,32,95,49,50,50,41,41,32,73,41,41,32,40,95,50,+48,53,32,95,49,49,55,41,41,41,32,40,40,65,32,58,49,49,56,32,+40,40,40,95,49,53,56,56,32,40,75,32,40,40,80,32,40,95,49,53,+57,55,32,34,70,97,108,115,101,34,41,41,32,40,95,49,53,57,55,32,+34,84,114,117,101,34,41,41,41,41,32,40,95,49,53,57,51,32,95,49,+49,56,41,41,32,40,95,49,53,57,52,32,95,49,49,56,41,41,41,32,+40,40,65,32,58,49,49,57,32,40,40,95,49,50,54,32,95,49,50,52,+41,32,95,49,50,53,41,41,32,40,40,65,32,58,49,50,48,32,40,82,+32,95,49,50,53,41,41,32,40,40,65,32,58,49,50,49,32,40,85,32,+95,49,50,52,41,41,32,40,40,65,32,58,49,50,50,32,40,40,80,32,+95,49,50,53,41,32,95,49,50,52,41,41,32,40,40,65,32,58,49,50,+51,32,95,49,50,53,41,32,40,40,65,32,58,49,50,52,32,75,41,32,+40,40,65,32,58,49,50,53,32,65,41,32,40,40,65,32,58,49,50,54,+32,80,41,32,40,40,65,32,58,49,50,55,32,40,85,32,75,41,41,32,+40,40,65,32,58,49,50,56,32,40,85,32,65,41,41,32,40,40,65,32,+58,49,50,57,32,40,75,32,40,110,111,68,101,102,97,117,108,116,32,34,+66,111,117,110,100,101,100,46,109,105,110,66,111,117,110,100,34,41,41,41,+32,40,40,65,32,58,49,51,48,32,40,75,32,40,110,111,68,101,102,97,+117,108,116,32,34,66,111,117,110,100,101,100,46,109,97,120,66,111,117,110,+100,34,41,41,41,32,40,40,65,32,58,49,51,49,32,40,40,95,50,48,+49,32,95,49,51,57,49,41,32,95,49,51,57,50,41,41,32,40,40,65,+32,58,49,51,50,32,40,40,40,40,40,40,40,40,95,52,57,52,32,95,+49,51,49,41,32,95,49,52,48,48,41,32,95,49,51,57,51,41,32,95,+49,51,57,52,41,32,95,49,51,57,53,41,32,95,49,51,57,54,41,32,+40,95,53,48,56,32,95,49,51,50,41,41,32,40,95,53,48,57,32,95,+49,51,50,41,41,41,32,40,40,65,32,58,49,51,51,32,40,40,95,50,+48,49,32,95,49,52,48,49,41,32,40,95,50,48,53,32,95,49,51,51,+41,41,41,32,40,40,65,32,58,49,51,52,32,40,40,40,40,40,40,40,+40,95,52,57,52,32,95,49,51,51,41,32,95,49,52,48,48,41,32,40,+40,40,67,39,32,40,67,39,32,40,95,50,48,50,32,95,53,49,48,41,+41,41,32,95,49,52,48,48,41,32,95,53,49,52,41,41,32,40,40,40,+67,39,32,40,67,39,32,40,95,50,48,51,32,95,53,49,48,41,41,41,+32,95,49,52,48,48,41,32,95,53,49,54,41,41,32,40,40,40,67,39,+32,40,67,39,32,40,95,50,48,50,32,95,53,49,48,41,41,41,32,95,+49,52,48,48,41,32,95,53,49,54,41,41,32,40,40,40,67,39,32,40,+67,39,32,40,95,50,48,51,32,95,53,49,48,41,41,41,32,95,49,52,+48,48,41,32,95,53,49,52,41,41,32,40,95,53,48,56,32,95,49,51,+52,41,41,32,40,95,53,48,57,32,95,49,51,52,41,41,41,32,40,40,+65,32,58,49,51,53,32,40,40,95,49,50,54,32,40,95,49,51,54,32,+35,48,41,41,32,40,95,49,51,54,32,35,49,50,55,41,41,41,32,40,+40,65,32,58,49,51,54,32,95,49,52,48,50,41,32,40,40,65,32,58,+49,51,55,32,95,49,52,48,51,41,32,40,40,65,32,58,49,51,56,32,+40,40,40,83,39,32,95,49,50,49,41,32,40,95,49,51,57,52,32,35,+57,55,41,41,32,40,40,67,32,95,49,51,57,52,41,32,35,49,50,50,+41,41,41,32,40,40,65,32,58,49,51,57,32,40,40,40,83,39,32,95,+49,50,49,41,32,40,95,49,51,57,52,32,35,54,53,41,41,32,40,40,+67,32,95,49,51,57,52,41,32,35,57,48,41,41,41,32,40,40,65,32,+58,49,52,48,32,40,40,40,83,39,32,95,49,50,48,41,32,95,49,51,+56,41,32,95,49,51,57,41,41,32,40,40,65,32,58,49,52,49,32,40,+40,40,83,39,32,95,49,50,49,41,32,40,95,49,51,57,52,32,35,52,+56,41,41,32,40,40,67,32,95,49,51,57,52,41,32,35,53,55,41,41,+41,32,40,40,65,32,58,49,52,50,32,40,40,40,83,39,32,95,49,50,+48,41,32,95,49,52,49,41,32,40,40,40,83,39,32,95,49,50,48,41,+32,40,40,40,83,39,32,95,49,50,49,41,32,40,95,49,51,57,52,32,+35,57,55,41,41,32,40,40,67,32,95,49,51,57,52,41,32,35,49,48,+50,41,41,41,32,40,40,40,83,39,32,95,49,50,49,41,32,40,95,49,+51,57,52,32,35,55,48,41,41,32,40,40,67,32,95,49,51,57,52,41,+32,35,55,48,41,41,41,41,41,32,40,40,65,32,58,49,52,51,32,40,+40,40,83,39,32,95,49,50,48,41,32,95,49,52,48,41,32,95,49,52,+49,41,41,32,40,40,65,32,58,49,52,52,32,40,40,40,83,39,32,95,+49,50,49,41,32,40,95,49,51,57,52,32,35,51,50,41,41,32,40,40,+67,32,95,49,51,57,52,41,32,35,49,50,54,41,41,41,32,40,40,65,+32,58,49,52,53,32,40,40,40,83,39,32,95,49,50,48,41,32,40,40,+67,32,40,95,50,48,50,32,95,49,51,49,41,41,32,35,51,50,41,41,+32,40,40,40,83,39,32,95,49,50,48,41,32,40,40,67,32,40,95,50,+48,50,32,95,49,51,49,41,41,32,35,57,41,41,32,40,40,67,32,40,+95,50,48,50,32,95,49,51,49,41,41,32,35,49,48,41,41,41,41,32,+40,40,65,32,58,49,52,54,32,40,40,83,32,40,40,83,32,40,40,40,+83,39,32,95,49,50,49,41,32,40,95,49,51,57,52,32,35,52,56,41,+41,32,40,40,67,32,95,49,51,57,52,41,32,35,53,55,41,41,41,32,+40,40,83,32,40,40,83,32,40,40,40,83,39,32,95,49,50,49,41,32,+40,95,49,51,57,52,32,35,57,55,41,41,32,40,40,67,32,95,49,51,+57,52,41,32,35,49,48,50,41,41,41,32,40,40,83,32,40,40,67,32,+40,40,40,83,39,32,95,49,50,49,41,32,40,95,49,51,57,52,32,35,+54,53,41,41,32,40,40,67,32,95,49,51,57,52,41,32,35,55,48,41,+41,41,32,40,95,50,52,32,34,100,105,103,105,116,84,111,73,110,116,34,+41,41,41,32,40,40,40,67,39,32,40,95,52,56,48,32,95,50,55,55,+41,41,32,95,49,51,55,41,32,40,40,40,95,52,56,48,32,95,50,55,+55,41,32,40,95,49,51,55,32,35,54,53,41,41,32,35,49,48,41,41,+41,41,41,32,40,40,40,67,39,32,40,95,52,56,48,32,95,50,55,55,+41,41,32,95,49,51,55,41,32,40,40,40,95,52,56,48,32,95,50,55,+55,41,32,40,95,49,51,55,32,35,57,55,41,41,32,35,49,48,41,41,+41,41,41,32,40,40,40,67,39,32,40,95,52,56,48,32,95,50,55,55,+41,41,32,95,49,51,55,41,32,40,95,49,51,55,32,35,52,56,41,41,+41,41,32,40,40,65,32,58,49,52,55,32,40,40,83,32,40,40,83,32,+40,40,40,83,39,32,95,49,50,49,41,32,40,95,49,51,57,52,32,35,+54,53,41,41,32,40,40,67,32,95,49,51,57,52,41,32,35,57,48,41,+41,41,32,40,95,49,50,53,32,40,40,40,110,111,77,97,116,99,104,32,+34,46,47,108,105,98,47,68,97,116,97,47,67,104,97,114,46,104,115,34,+41,32,35,56,51,41,32,35,49,41,41,41,41,32,40,40,66,32,95,49,+51,54,41,32,40,40,40,67,39,32,40,95,52,55,57,32,95,50,55,55,+41,41,32,40,40,40,67,39,32,40,95,52,56,48,32,95,50,55,55,41,+41,32,95,49,51,55,41,32,40,95,49,51,55,32,35,54,53,41,41,41,+32,40,95,49,51,55,32,35,57,55,41,41,41,41,41,32,40,40,65,32,+58,49,52,56,32,40,40,83,32,40,40,83,32,40,40,40,83,39,32,95,+49,50,49,41,32,40,95,49,51,57,52,32,35,57,55,41,41,32,40,40,+67,32,95,49,51,57,52,41,32,35,57,55,41,41,41,32,40,95,49,50,+53,32,40,40,40,110,111,77,97,116,99,104,32,34,46,47,108,105,98,47,+68,97,116,97,47,67,104,97,114,46,104,115,34,41,32,35,56,55,41,32,+35,49,41,41,41,41,32,40,40,66,32,95,49,51,54,41,32,40,40,40,+67,39,32,40,95,52,55,57,32,95,50,55,55,41,41,32,40,40,40,67,+39,32,40,95,52,56,48,32,95,50,55,55,41,41,32,95,49,51,55,41,+32,40,95,49,51,55,32,35,57,55,41,41,41,32,40,95,49,51,55,32,+35,54,53,41,41,41,41,41,32,40,40,65,32,58,49,52,57,32,40,40,+40,95,49,53,56,56,32,40,75,32,40,40,67,32,40,40,83,32,40,40,+67,32,61,61,41,32,35,51,57,41,41,32,40,40,66,32,40,95,50,54,+51,32,40,95,49,53,57,54,32,35,51,57,41,41,41,32,40,40,40,67,+39,32,95,50,54,51,41,32,40,40,66,32,95,49,53,57,55,41,32,95,+49,53,48,41,41,32,40,95,49,53,57,54,32,35,51,57,41,41,41,41,+41,32,40,95,49,53,57,55,32,34,39,92,57,50,38,39,39,34,41,41,+41,41,32,40,95,49,53,57,51,32,95,49,52,57,41,41,32,40,40,66,+32,40,95,50,54,51,32,40,95,49,53,57,54,32,35,51,52,41,41,41,+32,40,89,32,40,40,66,32,40,80,32,40,95,49,53,57,54,32,35,51,+52,41,41,41,32,40,40,40,83,39,32,67,41,32,40,40,66,32,40,40,+83,39,32,83,39,41,32,40,40,67,32,40,95,50,48,50,32,95,49,51,+49,41,41,32,35,51,52,41,41,41,32,40,40,67,39,32,66,41,32,40,+40,66,32,95,50,54,51,41,32,40,40,66,32,95,49,53,57,55,41,32,+95,49,53,48,41,41,41,41,41,32,40,66,32,40,95,50,54,51,32,40,+95,49,53,57,55,32,34,92,57,50,38,92,51,52,38,34,41,41,41,41,+41,41,41,41,41,32,40,40,65,32,58,49,53,48,32,40,40,40,67,39,+32,89,41,32,40,40,40,83,39,32,66,41,32,40,40,66,32,80,41,32,+40,40,83,32,40,40,83,32,95,49,52,52,41,32,40,40,66,32,40,95,+52,54,51,32,34,39,92,57,50,38,34,41,41,32,40,40,40,67,39,32,+95,52,54,51,41,32,40,40,66,32,40,95,49,53,57,48,32,95,50,56,+51,41,41,32,95,49,51,55,41,41,32,40,40,79,32,35,51,57,41,32,+75,41,41,41,41,41,32,40,40,67,32,79,41,32,75,41,41,41,41,32,+40,40,66,32,40,66,32,40,67,32,66,41,41,41,32,40,66,39,32,40,+40,66,32,67,41,32,40,67,32,40,95,50,48,50,32,95,49,51,49,41,+41,41,41,41,41,41,32,40,40,79,32,40,40,80,32,35,49,48,41,32,+34,92,57,50,38,110,34,41,41,32,40,40,79,32,40,40,80,32,35,49,+51,41,32,34,92,57,50,38,114,34,41,41,32,40,40,79,32,40,40,80,+32,35,57,41,32,34,92,57,50,38,116,34,41,41,32,40,40,79,32,40,+40,80,32,35,56,41,32,34,92,57,50,38,98,34,41,41,32,40,40,79,+32,40,40,80,32,35,57,50,41,32,34,92,57,50,38,92,57,50,38,34,+41,41,32,75,41,41,41,41,41,41,41,32,40,40,65,32,58,49,53,49,+32,40,40,40,40,40,40,40,95,52,55,56,32,95,49,51,52,57,41,32,+95,49,51,53,48,41,32,95,49,51,53,49,41,32,95,49,51,53,51,41,+32,40,40,83,32,40,40,83,32,40,40,67,32,40,95,52,57,55,32,95,+49,53,52,41,41,32,38,48,46,48,41,41,32,73,41,41,32,40,95,52,+56,50,32,95,49,53,49,41,41,41,32,40,40,67,32,40,40,67,32,40,+40,67,32,40,40,67,32,40,95,52,57,54,32,95,49,53,52,41,41,32,+38,48,46,48,41,41,32,38,45,49,46,48,41,41,32,38,48,46,48,41,+41,32,38,49,46,48,41,41,32,95,51,54,51,41,41,32,40,40,65,32,+58,49,53,50,32,40,40,40,40,95,50,53,50,32,95,49,53,49,41,32,+95,49,51,53,50,41,32,40,95,50,53,56,32,95,49,53,50,41,41,32,+40,40,40,83,39,32,95,49,51,53,50,41,32,40,40,66,32,40,95,52,+56,53,32,95,49,53,49,41,41,32,95,53,50,54,41,41,32,40,40,66,+32,40,95,52,56,53,32,95,49,53,49,41,41,32,95,53,50,55,41,41,+41,41,32,40,40,65,32,58,49,53,51,32,40,40,95,50,48,49,32,95,+49,51,53,52,41,32,95,49,51,53,53,41,41,32,40,40,65,32,58,49,+53,52,32,40,40,40,40,40,40,40,40,95,52,57,52,32,95,49,53,51,+41,32,40,95,53,48,51,32,95,49,53,52,41,41,32,95,49,51,53,54,+41,32,95,49,51,53,55,41,32,95,49,51,53,56,41,32,95,49,51,53,+57,41,32,40,95,53,48,56,32,95,49,53,52,41,41,32,40,95,53,48,+57,32,95,49,53,52,41,41,41,32,40,40,65,32,58,49,53,53,32,40,+40,40,95,49,53,56,56,32,40,95,49,53,57,50,32,95,49,53,53,41,+41,32,95,49,51,54,48,41,32,40,95,49,53,57,52,32,95,49,53,53,+41,41,41,32,40,40,65,32,58,49,53,54,32,40,95,53,51,49,32,40,+40,66,32,40,40,40,83,39,32,40,95,52,56,49,32,40,95,53,49,57,+32,95,51,48,57,41,41,41,32,40,40,66,32,40,95,53,51,50,32,95,+51,49,48,41,41,32,40,85,32,75,41,41,41,32,40,40,66,32,40,40,+95,50,54,48,32,40,40,67,32,40,40,80,32,40,95,53,50,48,32,40,+40,80,32,95,51,48,57,41,32,95,51,48,54,41,41,41,32,95,50,55,+56,41,41,32,95,50,56,50,41,41,32,40,40,95,52,56,53,32,40,95,+53,49,57,32,95,51,48,57,41,41,32,40,95,51,53,57,32,35,50,41,+41,41,41,32,40,85,32,65,41,41,41,41,32,95,49,54,56,41,41,41,+32,40,40,65,32,58,49,53,55,32,40,40,40,40,40,40,40,40,40,40,+40,40,40,40,40,40,40,40,40,40,40,40,40,95,50,48,54,32,95,49,+53,50,41,32,40,40,95,50,53,54,32,95,49,53,50,41,32,40,40,95,+53,51,48,32,40,95,51,53,57,32,35,51,49,52,49,53,57,50,54,53,+51,53,56,57,55,57,51,41,41,32,40,95,51,53,57,32,35,49,48,48,+48,48,48,48,48,48,48,48,48,48,48,48,48,41,41,41,41,32,40,40,+66,32,95,49,52,49,48,41,32,95,49,53,57,41,41,32,40,40,66,32,+95,49,52,49,48,41,32,95,49,53,56,41,41,32,40,40,66,32,95,49,+52,49,48,41,32,95,49,54,48,41,41,32,40,95,50,51,52,32,95,49,+53,55,41,41,32,40,95,50,51,53,32,95,49,53,55,41,41,32,40,40,+66,32,95,49,52,49,48,41,32,95,49,54,49,41,41,32,40,40,66,32,+95,49,52,49,48,41,32,95,49,54,50,41,41,32,40,40,66,32,95,49,+52,49,48,41,32,95,49,54,51,41,41,32,40,40,66,32,95,49,52,49,+48,41,32,95,49,54,52,41,41,32,40,40,66,32,95,49,52,49,48,41,+32,95,49,54,53,41,41,32,40,40,66,32,95,49,52,49,48,41,32,95,+49,54,54,41,41,32,40,95,50,52,50,32,95,49,53,55,41,41,32,40,+95,50,52,51,32,95,49,53,55,41,41,32,40,95,50,52,52,32,95,49,+53,55,41,41,32,40,95,50,52,53,32,95,49,53,55,41,41,32,40,95,+50,52,54,32,95,49,53,55,41,41,32,40,95,50,52,55,32,95,49,53,+55,41,41,32,40,95,50,52,56,32,95,49,53,55,41,41,32,40,95,50,+52,57,32,95,49,53,55,41,41,32,40,95,50,53,48,32,95,49,53,55,+41,41,32,40,95,50,53,49,32,95,49,53,55,41,41,41,32,40,40,65,+32,58,49,53,56,32,94,108,111,103,41,32,40,40,65,32,58,49,53,57,+32,94,101,120,112,41,32,40,40,65,32,58,49,54,48,32,94,115,113,114,+116,41,32,40,40,65,32,58,49,54,49,32,94,115,105,110,41,32,40,40,+65,32,58,49,54,50,32,94,99,111,115,41,32,40,40,65,32,58,49,54,+51,32,94,116,97,110,41,32,40,40,65,32,58,49,54,52,32,94,97,115,+105,110,41,32,40,40,65,32,58,49,54,53,32,94,97,99,111,115,41,32,+40,40,65,32,58,49,54,54,32,94,97,116,97,110,41,32,40,40,65,32,+58,49,54,55,32,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,+95,53,51,52,32,40,40,67,32,40,40,80,32,95,49,53,50,41,32,95,+49,53,52,41,41,32,95,49,53,55,41,41,32,40,75,32,40,95,51,53,+57,32,35,50,41,41,41,32,40,75,32,35,53,51,41,41,32,40,75,32,+40,40,80,32,40,40,95,52,56,53,32,95,50,55,55,41,32,40,95,51,+53,57,32,35,45,49,48,50,49,41,41,41,32,40,40,95,52,56,53,32,+95,50,55,55,41,32,40,95,51,53,57,32,35,49,48,50,52,41,41,41,+41,41,32,95,49,54,56,41,32,95,49,55,51,41,32,40,95,53,53,53,+32,95,49,54,55,41,41,32,40,95,53,53,54,32,95,49,54,55,41,41,+32,40,95,53,53,55,32,95,49,54,55,41,41,32,95,49,54,57,41,32,+95,49,55,48,41,32,95,49,55,49,41,32,95,49,55,50,41,32,40,75,+32,95,49,50,53,41,41,32,40,95,53,54,51,32,95,49,54,55,41,41,+41,32,40,40,65,32,58,49,54,56,32,40,40,66,32,40,40,83,32,40,+40,40,83,39,32,67,41,32,40,40,66,32,40,40,67,39,32,67,41,32,+40,40,40,83,39,32,40,83,39,32,67,41,41,32,40,40,66,32,40,66,+32,40,83,32,40,40,67,32,40,95,50,48,50,32,95,53,56,51,41,41,+32,35,48,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,67,41,+41,32,40,40,66,32,40,66,32,40,83,32,40,40,67,32,40,95,50,48,+50,32,95,53,56,51,41,41,32,35,50,48,52,55,41,41,41,41,32,40,+40,40,67,39,32,40,67,39,32,66,41,41,32,40,40,66,32,40,66,32,+80,41,41,32,40,40,67,32,66,41,32,40,40,66,32,95,51,54,49,41,+32,40,40,67,32,40,95,54,56,32,95,53,56,54,41,41,32,35,52,53,+48,51,53,57,57,54,50,55,51,55,48,52,57,54,41,41,41,41,41,32,+40,40,40,67,39,32,40,95,52,56,48,32,95,50,55,55,41,41,32,40,+40,40,67,39,32,40,95,52,56,48,32,95,50,55,55,41,41,32,95,49,+51,56,57,41,32,35,49,48,50,51,41,41,32,35,53,50,41,41,41,41,+32,40,40,80,32,40,40,95,52,56,53,32,95,51,48,56,41,32,40,95,+51,53,57,32,35,48,41,41,41,32,40,40,95,52,56,53,32,95,50,55,+55,41,32,40,95,51,53,57,32,35,48,41,41,41,41,41,41,32,40,40,+40,67,39,32,40,67,39,32,80,41,41,32,40,40,67,32,66,41,32,95,+51,54,49,41,41,32,40,40,95,52,56,53,32,95,50,55,55,41,32,40,+95,51,53,57,32,35,48,41,41,41,41,41,41,32,40,40,40,67,39,32,+40,95,56,49,32,95,53,56,54,41,41,32,40,40,67,32,40,95,54,55,+32,95,53,56,54,41,41,32,35,57,50,50,51,51,55,50,48,51,54,56,+53,52,55,55,53,56,48,55,41,41,32,35,53,50,41,41,41,32,40,40,+67,32,40,95,54,55,32,95,53,56,54,41,41,32,35,52,53,48,51,53,+57,57,54,50,55,51,55,48,52,57,53,41,41,41,32,40,40,67,32,40,+40,67,32,40,40,40,67,39,32,40,95,50,48,51,32,95,53,56,51,41,+41,32,40,40,67,32,40,95,54,55,32,95,53,56,54,41,41,32,35,45,+57,50,50,51,51,55,50,48,51,54,56,53,52,55,55,53,56,48,56,41,+41,32,35,48,41,41,32,95,50,54,52,41,41,32,40,95,52,56,50,32,+95,51,48,56,41,41,41,41,32,95,49,51,55,54,41,41,32,40,40,65,+32,58,49,54,57,32,40,40,66,32,40,40,40,83,39,32,95,49,50,49,+41,32,40,40,40,67,39,32,40,95,50,48,50,32,95,53,56,51,41,41,+32,40,40,40,67,39,32,40,95,56,49,32,95,53,56,54,41,41,32,40,+40,67,32,40,95,54,55,32,95,53,56,54,41,41,32,35,57,50,50,51,+51,55,50,48,51,54,56,53,52,55,55,53,56,48,55,41,41,32,35,53,+50,41,41,32,35,50,48,52,55,41,41,32,40,40,40,67,39,32,40,95,+50,48,51,32,95,53,56,51,41,41,32,40,40,67,32,40,95,54,55,32,+95,53,56,54,41,41,32,35,52,53,48,51,53,57,57,54,50,55,51,55,+48,52,57,53,41,41,32,35,48,41,41,41,32,95,49,51,55,54,41,41,+32,40,40,65,32,58,49,55,48,32,40,40,66,32,40,40,40,83,39,32,+95,49,50,49,41,32,40,40,40,67,39,32,40,95,50,48,50,32,95,53,+56,51,41,41,32,40,40,40,67,39,32,40,95,56,49,32,95,53,56,54,+41,41,32,40,40,67,32,40,95,54,55,32,95,53,56,54,41,41,32,35,+57,50,50,51,51,55,50,48,51,54,56,53,52,55,55,53,56,48,55,41,+41,32,35,53,50,41,41,32,35,50,48,52,55,41,41,32,40,40,40,67,+39,32,40,95,50,48,50,32,95,53,56,51,41,41,32,40,40,67,32,40,+95,54,55,32,95,53,56,54,41,41,32,35,52,53,48,51,53,57,57,54,+50,55,51,55,48,52,57,53,41,41,32,35,48,41,41,41,32,95,49,51,+55,54,41,41,32,40,40,65,32,58,49,55,49,32,40,40,66,32,40,40,+40,83,39,32,95,49,50,49,41,32,40,40,40,67,39,32,40,95,50,48,+50,32,95,53,56,51,41,41,32,40,40,40,67,39,32,40,95,56,49,32,+95,53,56,54,41,41,32,40,40,67,32,40,95,54,55,32,95,53,56,54,+41,41,32,35,57,50,50,51,51,55,50,48,51,54,56,53,52,55,55,53,+56,48,55,41,41,32,35,53,50,41,41,32,35,48,41,41,32,40,40,40,+67,39,32,40,95,50,48,51,32,95,53,56,51,41,41,32,40,40,67,32,+40,95,54,55,32,95,53,56,54,41,41,32,35,52,53,48,51,53,57,57,+54,50,55,51,55,48,52,57,53,41,41,32,35,48,41,41,41,32,95,49,+51,55,54,41,41,32,40,40,65,32,58,49,55,50,32,40,40,66,32,40,+40,40,83,39,32,95,49,50,49,41,32,40,40,40,67,39,32,40,95,50,+48,51,32,95,53,56,51,41,41,32,40,40,67,32,40,95,54,55,32,95,+53,56,54,41,41,32,35,45,57,50,50,51,51,55,50,48,51,54,56,53,+52,55,55,53,56,48,56,41,41,32,35,48,41,41,32,40,40,40,67,39,+32,40,95,50,48,50,32,95,53,56,51,41,41,32,40,40,67,32,40,95,+54,55,32,95,53,56,54,41,41,32,35,57,50,50,51,51,55,50,48,51,+54,56,53,52,55,55,53,56,48,55,41,41,32,35,48,41,41,41,32,95,+49,51,55,54,41,41,32,40,40,65,32,58,49,55,51,32,40,40,40,67,+39,32,66,41,32,40,40,66,32,40,95,52,56,49,32,95,49,53,49,41,+41,32,40,95,52,56,53,32,95,49,53,49,41,41,41,32,40,40,95,50,+54,48,32,40,40,67,32,40,40,80,32,95,49,53,50,41,32,95,50,55,+56,41,41,32,95,50,56,50,41,41,32,40,40,95,52,56,53,32,95,49,+53,49,41,32,40,95,51,53,57,32,35,50,41,41,41,41,41,32,40,40,+65,32,58,49,55,52,32,40,40,66,32,90,41,32,85,41,41,32,40,40,+65,32,58,49,55,53,32,40,90,32,85,41,41,32,40,40,65,32,58,49,+55,54,32,40,40,40,83,39,32,95,50,48,49,41,32,40,40,40,83,39,+32,67,41,32,40,40,66,32,40,67,32,83,39,41,41,32,40,40,40,67,+39,32,67,41,32,40,40,66,32,40,67,32,67,39,41,41,32,40,40,66,+32,95,50,48,50,41,32,40,85,32,75,41,41,41,41,32,40,75,32,95,+49,50,52,41,41,41,41,32,40,40,66,32,40,40,67,39,32,66,41,32,+40,85,32,40,75,32,95,49,50,52,41,41,41,41,32,40,40,66,32,95,+50,48,50,41,32,40,85,32,65,41,41,41,41,41,32,40,40,66,32,95,+50,48,53,41,32,40,40,66,32,95,49,55,54,41,32,40,40,40,83,39,+32,80,41,32,40,85,32,75,41,41,32,40,85,32,65,41,41,41,41,41,+41,32,40,40,65,32,58,49,55,55,32,80,41,32,40,40,65,32,58,49,+55,56,32,40,40,83,32,40,40,40,83,39,32,95,49,53,56,56,41,32,+40,40,40,83,39,32,40,83,39,32,80,41,41,32,40,40,66,32,40,40,+67,39,32,66,41,32,40,40,66,32,95,49,53,57,56,41,32,40,40,67,+32,40,95,53,48,48,32,95,50,56,50,41,41,32,95,49,54,48,49,41,+41,41,41,32,40,40,66,32,40,66,32,40,95,50,54,51,32,40,95,49,+53,57,55,32,34,76,101,102,116,32,34,41,41,41,41,32,40,40,40,67,+39,32,95,49,53,56,57,41,32,40,85,32,75,41,41,32,95,49,54,48,+49,41,41,41,41,32,40,40,66,32,40,40,67,39,32,66,41,32,40,40,+66,32,95,49,53,57,56,41,32,40,40,67,32,40,95,53,48,48,32,95,+50,56,50,41,41,32,95,49,54,48,49,41,41,41,41,32,40,40,66,32,+40,66,32,40,95,50,54,51,32,40,95,49,53,57,55,32,34,82,105,103,+104,116,32,34,41,41,41,41,32,40,40,40,67,39,32,95,49,53,56,57,+41,32,40,85,32,65,41,41,32,95,49,54,48,49,41,41,41,41,41,32,+40,40,66,32,95,49,53,57,51,41,32,40,40,66,32,95,49,55,56,41,+32,40,40,40,83,39,32,80,41,32,40,85,32,75,41,41,32,40,85,32,+65,41,41,41,41,41,41,32,40,40,66,32,95,49,53,57,52,41,32,40,+40,66,32,95,49,55,56,41,32,40,40,40,83,39,32,80,41,32,40,85,+32,75,41,41,32,40,85,32,65,41,41,41,41,41,41,32,40,40,65,32,+58,49,55,57,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,66,+32,40,66,32,40,66,32,67,41,41,41,41,41,41,41,32,40,40,66,32,+40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,67,41,41,41,41,+41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,67,+41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,67,+41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,67,41,41,41,32,+40,40,66,32,40,66,32,67,41,41,32,80,41,41,41,41,41,41,41,32,+40,40,65,32,58,49,56,48,32,40,85,32,40,90,32,40,90,32,40,90,+32,40,90,32,40,90,32,40,90,32,75,41,41,41,41,41,41,41,41,32,+40,40,65,32,58,49,56,49,32,40,85,32,40,75,32,40,90,32,40,90,+32,40,90,32,40,90,32,40,90,32,75,41,41,41,41,41,41,41,41,32,+40,40,65,32,58,49,56,50,32,40,85,32,40,75,32,40,75,32,40,90,+32,40,90,32,40,90,32,40,90,32,75,41,41,41,41,41,41,41,41,32,+40,40,65,32,58,49,56,51,32,40,85,32,40,75,32,40,75,32,40,75,+32,40,90,32,40,90,32,40,90,32,75,41,41,41,41,41,41,41,41,32,+40,40,65,32,58,49,56,52,32,40,85,32,40,75,32,40,75,32,40,75,+32,40,75,32,40,90,32,40,90,32,75,41,41,41,41,41,41,41,41,32,+40,40,65,32,58,49,56,53,32,40,85,32,40,75,32,40,75,32,40,75,+32,40,75,32,40,75,32,40,90,32,75,41,41,41,41,41,41,41,41,32,+40,40,65,32,58,49,56,54,32,40,85,32,40,75,32,40,75,32,40,75,+32,40,75,32,40,75,32,40,75,32,75,41,41,41,41,41,41,41,41,32,+40,40,65,32,58,49,56,55,32,40,85,32,40,75,32,40,75,32,40,75,+32,40,75,32,40,75,32,40,75,32,65,41,41,41,41,41,41,41,41,32,+40,40,65,32,58,49,56,56,32,40,40,40,83,39,32,95,50,54,51,41,+32,95,49,56,50,41,32,40,40,66,32,40,95,50,54,51,32,40,40,67,+32,40,95,52,55,57,32,95,50,55,55,41,41,32,40,40,95,52,56,53,+32,95,50,55,55,41,32,40,95,51,53,57,32,35,49,41,41,41,41,41,+32,95,49,56,51,41,41,41,32,40,40,65,32,58,49,56,57,32,40,40,+40,83,39,32,95,50,54,51,41,32,95,49,56,50,41,32,40,40,66,32,+40,95,50,54,51,32,40,40,95,52,57,51,32,95,50,55,55,41,32,40,+40,95,52,56,53,32,95,50,55,55,41,32,40,95,51,53,57,32,35,49,+41,41,41,41,41,32,95,49,56,51,41,41,41,32,40,40,65,32,58,49,+57,48,32,40,75,32,40,110,111,68,101,102,97,117,108,116,32,34,69,110,+117,109,46,116,111,69,110,117,109,34,41,41,41,32,40,40,65,32,58,49,+57,49,32,40,75,32,40,110,111,68,101,102,97,117,108,116,32,34,69,110,+117,109,46,102,114,111,109,69,110,117,109,34,41,41,41,32,40,40,65,32,+58,49,57,50,32,40,40,40,83,39,32,66,41,32,40,40,66,32,95,51,+57,53,41,32,95,49,56,50,41,41,32,40,40,66,32,40,66,32,40,95,+49,56,52,32,95,49,57,56,41,41,41,32,95,49,56,51,41,41,41,32,+40,40,65,32,58,49,57,51,32,40,40,40,83,39,32,66,41,32,40,66,+39,32,40,40,66,32,95,51,57,53,41,32,95,49,56,50,41,41,41,32,+40,40,40,83,39,32,40,67,39,32,66,41,41,32,40,40,66,32,40,66,+32,40,95,49,56,53,32,95,49,57,56,41,41,41,32,95,49,56,51,41,+41,32,95,49,56,51,41,41,41,32,40,40,65,32,58,49,57,52,32,40,+40,40,83,39,32,66,41,32,40,66,39,32,40,40,66,32,95,51,57,53,+41,32,95,49,56,50,41,41,41,32,40,40,40,83,39,32,40,67,39,32,+66,41,41,32,40,40,66,32,40,66,32,40,95,49,56,54,32,95,49,57,+56,41,41,41,32,95,49,56,51,41,41,32,95,49,56,51,41,41,41,32,+40,40,65,32,58,49,57,53,32,40,40,40,83,39,32,66,41,32,40,66,+39,32,40,66,39,32,40,40,66,32,95,51,57,53,41,32,95,49,56,50,+41,41,41,41,32,40,40,40,83,39,32,40,67,39,32,40,67,39,32,66,+41,41,41,32,40,40,40,83,39,32,40,67,39,32,66,41,41,32,40,40,+66,32,40,66,32,40,95,49,56,55,32,95,49,57,56,41,41,41,32,95,+49,56,51,41,41,32,95,49,56,51,41,41,32,95,49,56,51,41,41,41,+32,40,40,65,32,58,49,57,54,32,40,40,40,83,39,32,66,41,32,40,+40,66,32,95,51,57,53,41,32,40,40,66,32,95,49,56,50,41,32,40,+85,32,75,41,41,41,41,32,40,40,40,83,39,32,40,83,39,32,40,95,+49,56,54,32,95,49,57,56,41,41,41,32,40,40,66,32,95,49,56,51,+41,32,40,85,32,75,41,41,41,32,40,40,40,83,39,32,66,41,32,40,+40,66,32,95,49,56,51,41,32,40,85,32,75,41,41,41,32,40,40,66,+32,95,50,55,48,41,32,40,40,66,32,95,49,50,56,41,32,40,85,32,+65,41,41,41,41,41,41,41,32,40,40,65,32,58,49,57,55,32,40,40,+40,83,39,32,40,67,39,32,66,41,41,32,40,40,40,83,39,32,40,83,+39,32,67,41,41,32,40,40,40,83,39,32,40,83,39,32,40,83,39,32,+83,41,41,41,32,40,40,66,32,40,66,32,40,40,83,39,32,83,41,32,+40,95,53,48,48,32,95,50,56,50,41,41,41,41,32,40,40,40,83,39,+32,66,41,32,40,66,39,32,40,66,39,32,40,40,66,32,95,51,57,53,+41,32,40,40,66,32,95,49,56,50,41,32,40,85,32,75,41,41,41,41,+41,41,32,40,40,66,32,40,66,32,40,40,67,39,32,67,41,32,40,67,+32,40,95,49,56,55,32,95,49,57,56,41,41,41,41,41,32,40,40,40,+83,39,32,66,41,32,40,40,66,32,95,49,56,51,41,32,40,85,32,75,+41,41,41,32,40,40,66,32,95,50,55,48,41,32,40,40,66,32,95,49,+50,55,41,32,40,85,32,65,41,41,41,41,41,41,41,41,32,40,40,40,+83,39,32,66,41,32,40,66,39,32,40,66,39,32,40,40,66,32,95,51,+57,53,41,32,40,40,66,32,95,49,56,50,41,32,40,85,32,75,41,41,+41,41,41,41,32,40,40,66,32,40,66,32,40,40,67,39,32,67,41,32,+40,67,32,40,95,49,56,55,32,95,49,57,56,41,41,41,41,41,32,40,+40,40,83,39,32,66,41,32,40,40,66,32,95,49,56,51,41,32,40,85,+32,75,41,41,41,32,40,40,66,32,95,50,55,48,41,32,40,40,66,32,+95,49,50,56,41,32,40,85,32,65,41,41,41,41,41,41,41,41,32,40,+40,66,32,95,49,56,51,41,32,40,85,32,75,41,41,41,41,32,40,40,+66,32,95,49,56,51,41,32,40,85,32,75,41,41,41,41,32,40,40,65,+32,58,49,57,56,32,40,40,40,40,40,40,40,40,95,49,55,57,32,40,+40,67,32,40,95,52,55,57,32,95,50,55,55,41,41,32,40,40,95,52,+56,53,32,95,50,55,55,41,32,40,95,51,53,57,32,35,49,41,41,41,+41,32,40,40,67,32,40,95,52,56,48,32,95,50,55,55,41,41,32,40,+40,95,52,56,53,32,95,50,55,55,41,32,40,95,51,53,57,32,35,49,+41,41,41,41,32,73,41,32,73,41,32,40,40,83,32,95,52,54,50,41,+32,40,40,66,32,40,95,49,56,52,32,95,49,57,56,41,41,32,40,40,+67,32,40,95,52,55,57,32,95,50,55,55,41,41,32,35,49,41,41,41,+41,32,40,40,40,83,39,32,40,67,39,32,89,41,41,32,40,40,66,32,+40,66,32,40,66,32,40,83,32,95,52,54,50,41,41,41,41,32,40,40,+66,32,40,66,32,40,67,32,66,41,41,41,32,40,40,66,32,40,66,32,+40,67,32,40,95,52,55,57,32,95,50,55,55,41,41,41,41,32,40,67,+32,40,95,52,56,48,32,95,50,55,55,41,41,41,41,41,41,32,73,41,+41,32,40,40,66,32,40,40,67,39,32,95,52,50,52,41,32,40,67,32,+40,95,52,57,56,32,95,50,56,50,41,41,41,41,32,40,95,49,56,52,+32,95,49,57,56,41,41,41,32,40,40,40,83,39,32,83,41,32,40,40,+40,83,39,32,40,83,39,32,83,39,41,41,32,40,67,32,40,95,52,57,+57,32,95,50,56,50,41,41,41,32,40,40,66,32,40,66,32,40,40,67,+39,32,95,52,50,52,41,32,40,67,32,40,95,53,48,48,32,95,50,56,+50,41,41,41,41,41,32,40,95,49,56,53,32,95,49,57,56,41,41,41,+41,32,40,40,66,32,40,66,32,40,40,67,39,32,95,52,50,52,41,32,+40,67,32,40,95,52,57,56,32,95,50,56,50,41,41,41,41,41,32,40,+95,49,56,53,32,95,49,57,56,41,41,41,41,41,32,40,40,65,32,58,+49,57,57,32,40,40,40,40,40,40,40,40,95,49,55,57,32,40,95,49,+56,56,32,95,49,57,57,41,41,32,40,95,49,56,57,32,95,49,57,57,+41,41,32,40,40,67,32,40,40,83,32,40,40,67,32,61,61,41,32,35,+48,41,41,32,40,40,67,32,40,40,67,32,40,40,67,32,61,61,41,32,+35,49,41,41,32,40,95,50,52,32,34,69,110,117,109,46,66,111,111,108,+46,116,111,69,110,117,109,58,32,98,97,100,32,97,114,103,34,41,41,41,+32,95,49,50,53,41,41,41,32,95,49,50,52,41,41,32,40,40,80,32,+35,48,41,32,35,49,41,41,32,40,95,49,57,50,32,95,49,57,57,41,+41,32,40,95,49,57,51,32,95,49,57,57,41,41,32,40,95,49,57,52,+32,95,49,57,57,41,41,32,40,95,49,57,53,32,95,49,57,57,41,41,+41,32,40,40,65,32,58,50,48,48,32,40,40,40,40,40,40,40,40,95,+49,55,57,32,40,95,49,56,56,32,95,50,48,48,41,41,32,40,95,49,+56,57,32,95,50,48,48,41,41,32,95,49,52,48,50,41,32,95,49,52,+48,51,41,32,40,95,49,57,50,32,95,50,48,48,41,41,32,40,95,49,+57,51,32,95,50,48,48,41,41,32,40,95,49,57,52,32,95,50,48,48,+41,41,32,40,95,49,57,53,32,95,50,48,48,41,41,41,32,40,40,65,+32,58,50,48,49,32,80,41,32,40,40,65,32,58,50,48,50,32,40,85,+32,75,41,41,32,40,40,65,32,58,50,48,51,32,40,85,32,65,41,41,+32,40,40,65,32,58,50,48,52,32,40,75,32,40,110,111,68,101,102,97,+117,108,116,32,34,69,113,46,61,61,34,41,41,41,32,40,40,65,32,58,+50,48,53,32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,+40,67,39,32,40,67,39,32,67,41,41,32,95,50,48,50,41,32,95,49,+50,53,41,41,32,95,49,50,52,41,41,32,40,40,65,32,58,50,48,54,+32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,+40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,+32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,+66,32,40,66,32,40,66,32,67,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,+66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,+40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,+32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,67,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,+40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,+32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,+66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,+67,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,+32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,+66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,+67,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,+40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,+32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,67,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,66,32,+40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,+32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,+66,32,40,66,32,40,66,32,67,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,+40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,+32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,67,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,66,32,40,66,+32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,+66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,+67,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,66,+32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,+66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,+67,41,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,66,32,+40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,+32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,67,41,41,41,+41,41,41,41,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,+32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,+66,32,40,66,32,40,66,32,67,41,41,41,41,41,41,41,41,41,41,41,+41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,+32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,67,41,41,41,+41,41,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,+66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,+67,41,41,41,41,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,+66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,+67,41,41,41,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,+32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,67,41,41,41,+41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,+66,32,40,66,32,40,66,32,67,41,41,41,41,41,41,41,32,40,40,66,+32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,67,41,41,41,+41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,+67,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,+67,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,67,41,41,41,+32,40,40,66,32,40,66,32,67,41,41,32,80,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,65,32,+58,50,48,55,32,40,85,32,40,90,32,40,90,32,40,90,32,40,90,32,+40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,+32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,+90,32,40,90,32,40,90,32,40,90,32,75,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,65,32,+58,50,48,56,32,40,85,32,40,75,32,40,90,32,40,90,32,40,90,32,+40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,+32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,+90,32,40,90,32,40,90,32,40,90,32,75,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,65,32,+58,50,48,57,32,40,85,32,40,75,32,40,75,32,40,90,32,40,90,32,+40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,+32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,+90,32,40,90,32,40,90,32,40,90,32,75,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,65,32,+58,50,49,48,32,40,85,32,40,75,32,40,75,32,40,75,32,40,90,32,+40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,+32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,+90,32,40,90,32,40,90,32,40,90,32,75,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,65,32,+58,50,49,49,32,40,85,32,40,75,32,40,75,32,40,75,32,40,75,32,+40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,+32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,+90,32,40,90,32,40,90,32,40,90,32,75,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,65,32,+58,50,49,50,32,40,85,32,40,75,32,40,75,32,40,75,32,40,75,32,+40,75,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,+32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,+90,32,40,90,32,40,90,32,40,90,32,75,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,65,32,+58,50,49,51,32,40,85,32,40,75,32,40,75,32,40,75,32,40,75,32,+40,75,32,40,75,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,+32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,+90,32,40,90,32,40,90,32,40,90,32,75,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,65,32,+58,50,49,52,32,40,85,32,40,75,32,40,75,32,40,75,32,40,75,32,+40,75,32,40,75,32,40,75,32,40,90,32,40,90,32,40,90,32,40,90,+32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,+90,32,40,90,32,40,90,32,40,90,32,75,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,65,32,+58,50,49,53,32,40,85,32,40,75,32,40,75,32,40,75,32,40,75,32,+40,75,32,40,75,32,40,75,32,40,75,32,40,90,32,40,90,32,40,90,+32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,+90,32,40,90,32,40,90,32,40,90,32,75,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,65,32,+58,50,49,54,32,40,85,32,40,75,32,40,75,32,40,75,32,40,75,32,+40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,90,32,40,90,+32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,+90,32,40,90,32,40,90,32,40,90,32,75,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,65,32,+58,50,49,55,32,40,85,32,40,75,32,40,75,32,40,75,32,40,75,32,+40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,90,+32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,+90,32,40,90,32,40,90,32,40,90,32,75,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,65,32,+58,50,49,56,32,40,85,32,40,75,32,40,75,32,40,75,32,40,75,32,+40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,+32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,+90,32,40,90,32,40,90,32,40,90,32,75,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,65,32,+58,50,49,57,32,40,85,32,40,75,32,40,75,32,40,75,32,40,75,32,+40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,+32,40,75,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,+90,32,40,90,32,40,90,32,40,90,32,75,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,65,32,+58,50,50,48,32,40,85,32,40,75,32,40,75,32,40,75,32,40,75,32,+40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,+32,40,75,32,40,75,32,40,90,32,40,90,32,40,90,32,40,90,32,40,+90,32,40,90,32,40,90,32,40,90,32,75,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,65,32,+58,50,50,49,32,40,85,32,40,75,32,40,75,32,40,75,32,40,75,32,+40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,+32,40,75,32,40,75,32,40,75,32,40,90,32,40,90,32,40,90,32,40,+90,32,40,90,32,40,90,32,40,90,32,75,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,65,32,+58,50,50,50,32,40,85,32,40,75,32,40,75,32,40,75,32,40,75,32,+40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,+32,40,75,32,40,75,32,40,75,32,40,75,32,40,90,32,40,90,32,40,+90,32,40,90,32,40,90,32,40,90,32,75,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,65,32,+58,50,50,51,32,40,85,32,40,75,32,40,75,32,40,75,32,40,75,32,+40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,+32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,90,32,40,+90,32,40,90,32,40,90,32,40,90,32,75,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,65,32,+58,50,50,52,32,40,85,32,40,75,32,40,75,32,40,75,32,40,75,32,+40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,+32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,+90,32,40,90,32,40,90,32,40,90,32,75,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,65,32,+58,50,50,53,32,40,85,32,40,75,32,40,75,32,40,75,32,40,75,32,+40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,+32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,+75,32,40,90,32,40,90,32,40,90,32,75,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,65,32,+58,50,50,54,32,40,85,32,40,75,32,40,75,32,40,75,32,40,75,32,+40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,+32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,+75,32,40,75,32,40,90,32,40,90,32,75,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,65,32,+58,50,50,55,32,40,85,32,40,75,32,40,75,32,40,75,32,40,75,32,+40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,+32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,+75,32,40,75,32,40,75,32,40,90,32,75,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,65,32,+58,50,50,56,32,40,85,32,40,75,32,40,75,32,40,75,32,40,75,32,+40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,+32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,+75,32,40,75,32,40,75,32,40,75,32,75,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,65,32,+58,50,50,57,32,40,85,32,40,75,32,40,75,32,40,75,32,40,75,32,+40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,+32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,+75,32,40,75,32,40,75,32,40,75,32,65,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,65,32,+58,50,51,48,32,40,75,32,40,110,111,68,101,102,97,117,108,116,32,34,+70,108,111,97,116,105,110,103,46,112,105,34,41,41,41,32,40,40,65,32,+58,50,51,49,32,40,75,32,40,110,111,68,101,102,97,117,108,116,32,34,+70,108,111,97,116,105,110,103,46,101,120,112,34,41,41,41,32,40,40,65,+32,58,50,51,50,32,40,75,32,40,110,111,68,101,102,97,117,108,116,32,+34,70,108,111,97,116,105,110,103,46,108,111,103,34,41,41,41,32,40,40,+65,32,58,50,51,51,32,40,40,40,83,39,32,67,41,32,95,50,49,50,+41,32,40,40,83,32,40,40,40,83,39,32,95,50,53,52,41,32,95,50,+48,55,41,32,40,40,40,67,39,32,95,52,56,53,41,32,40,40,66,32,+95,50,53,51,41,32,95,50,48,55,41,41,32,40,95,51,53,57,32,35,+49,41,41,41,41,32,40,40,40,67,39,32,95,52,56,53,41,32,40,40,+66,32,95,50,53,51,41,32,95,50,48,55,41,41,32,40,95,51,53,57,+32,35,50,41,41,41,41,41,32,40,40,65,32,58,50,51,52,32,40,40,+40,83,39,32,66,41,32,40,66,39,32,95,50,48,57,41,41,32,40,40,+40,83,39,32,66,41,32,40,40,66,32,95,52,56,49,41,32,40,40,66,+32,95,50,53,51,41,32,95,50,48,55,41,41,41,32,95,50,49,48,41,+41,41,32,40,40,65,32,58,50,51,53,32,40,40,40,83,39,32,66,41,+32,40,40,40,83,39,32,67,39,41,32,40,40,66,32,95,50,53,52,41,+32,95,50,48,55,41,41,32,95,50,49,48,41,41,32,95,50,49,48,41,+41,32,40,40,65,32,58,50,51,54,32,40,75,32,40,110,111,68,101,102,+97,117,108,116,32,34,70,108,111,97,116,105,110,103,46,115,105,110,34,41,+41,41,32,40,40,65,32,58,50,51,55,32,40,75,32,40,110,111,68,101,+102,97,117,108,116,32,34,70,108,111,97,116,105,110,103,46,99,111,115,34,+41,41,41,32,40,40,65,32,58,50,51,56,32,40,40,83,32,40,40,40,+83,39,32,83,39,41,32,40,40,66,32,95,50,53,52,41,32,95,50,48,+55,41,41,32,95,50,49,52,41,41,32,95,50,49,53,41,41,32,40,40,+65,32,58,50,51,57,32,40,75,32,40,110,111,68,101,102,97,117,108,116,+32,34,70,108,111,97,116,105,110,103,46,97,115,105,110,34,41,41,41,32,+40,40,65,32,58,50,52,48,32,40,75,32,40,110,111,68,101,102,97,117,+108,116,32,34,70,108,111,97,116,105,110,103,46,97,99,111,115,34,41,41,+41,32,40,40,65,32,58,50,52,49,32,40,75,32,40,110,111,68,101,102,+97,117,108,116,32,34,70,108,111,97,116,105,110,103,46,97,116,97,110,34,+41,41,41,32,40,40,65,32,58,50,52,50,32,40,40,83,32,40,40,40,+83,39,32,67,39,41,32,40,40,66,32,95,50,53,52,41,32,95,50,48,+55,41,41,32,40,40,83,32,40,40,40,83,39,32,83,39,41,32,40,40,+66,32,95,52,56,48,41,32,40,40,66,32,95,50,53,51,41,32,95,50,+48,55,41,41,41,32,95,50,48,57,41,41,32,40,40,40,83,39,32,66,+41,32,95,50,48,57,41,32,40,40,66,32,95,52,56,50,41,32,40,40,+66,32,95,50,53,51,41,32,95,50,48,55,41,41,41,41,41,41,32,40,+40,40,67,39,32,95,52,56,53,41,32,40,40,66,32,95,50,53,51,41,+32,95,50,48,55,41,41,32,40,95,51,53,57,32,35,50,41,41,41,41,+32,40,40,65,32,58,50,52,51,32,40,40,83,32,40,40,40,83,39,32,+67,39,41,32,40,40,66,32,95,50,53,52,41,32,95,50,48,55,41,41,+32,40,40,83,32,40,40,40,83,39,32,83,39,41,32,40,40,66,32,95,+52,55,57,41,32,40,40,66,32,95,50,53,51,41,32,95,50,48,55,41,+41,41,32,95,50,48,57,41,41,32,40,40,40,83,39,32,66,41,32,95,+50,48,57,41,32,40,40,66,32,95,52,56,50,41,32,40,40,66,32,95,+50,53,51,41,32,95,50,48,55,41,41,41,41,41,41,32,40,40,40,67,+39,32,95,52,56,53,41,32,40,40,66,32,95,50,53,51,41,32,95,50,+48,55,41,41,32,40,95,51,53,57,32,35,50,41,41,41,41,32,40,40,+65,32,58,50,52,52,32,40,40,83,32,40,40,40,83,39,32,83,39,41,+32,40,40,66,32,95,50,53,52,41,32,95,50,48,55,41,41,32,95,50,+50,48,41,41,32,95,50,50,49,41,41,32,40,40,65,32,58,50,52,53,+32,40,40,40,83,39,32,66,41,32,95,50,49,48,41,32,40,40,40,83,+39,32,83,41,32,40,40,66,32,95,52,55,57,41,32,40,40,66,32,95,+50,53,51,41,32,95,50,48,55,41,41,41,32,40,40,40,83,39,32,66,+41,32,95,50,49,49,41,32,40,40,83,32,40,40,40,83,39,32,67,39,+41,32,40,40,66,32,95,52,55,57,41,32,40,40,66,32,95,50,53,51,+41,32,95,50,48,55,41,41,41,32,40,40,40,67,39,32,83,41,32,40,+40,66,32,95,52,56,49,41,32,40,40,66,32,95,50,53,51,41,32,95,+50,48,55,41,41,41,32,73,41,41,41,32,40,40,40,67,39,32,95,52,+56,53,41,32,40,40,66,32,95,50,53,51,41,32,95,50,48,55,41,41,+32,40,95,51,53,57,32,35,49,41,41,41,41,41,41,41,32,40,40,65,+32,58,50,52,54,32,40,40,40,83,39,32,66,41,32,95,50,49,48,41,+32,40,40,40,83,39,32,83,41,32,40,40,66,32,95,52,55,57,41,32,+40,40,66,32,95,50,53,51,41,32,95,50,48,55,41,41,41,32,40,40,+40,83,39,32,66,41,32,95,50,49,49,41,32,40,40,83,32,40,40,40,+83,39,32,67,39,41,32,40,40,66,32,95,52,56,48,41,32,40,40,66,+32,95,50,53,51,41,32,95,50,48,55,41,41,41,32,40,40,40,67,39,+32,83,41,32,40,40,66,32,95,52,56,49,41,32,40,40,66,32,95,50,+53,51,41,32,95,50,48,55,41,41,41,32,73,41,41,41,32,40,40,40,+67,39,32,95,52,56,53,41,32,40,40,66,32,95,50,53,51,41,32,95,+50,48,55,41,41,32,40,95,51,53,57,32,35,49,41,41,41,41,41,41,+41,32,40,40,65,32,58,50,52,55,32,40,40,83,32,40,40,40,83,39,+32,67,39,41,32,40,40,66,32,95,50,53,52,41,32,95,50,48,55,41,+41,32,40,40,40,83,39,32,66,41,32,95,50,49,48,41,32,40,40,83,+32,40,40,40,83,39,32,83,39,41,32,40,40,66,32,95,50,53,52,41,+32,95,50,48,55,41,41,32,40,40,40,83,39,32,67,41,32,40,40,66,+32,95,52,55,57,41,32,40,40,66,32,95,50,53,51,41,32,95,50,48,+55,41,41,41,32,40,40,40,67,39,32,95,52,56,53,41,32,40,40,66,+32,95,50,53,51,41,32,95,50,48,55,41,41,32,40,95,51,53,57,32,+35,49,41,41,41,41,41,32,40,40,40,83,39,32,67,41,32,40,40,66,+32,95,52,56,48,41,32,40,40,66,32,95,50,53,51,41,32,95,50,48,+55,41,41,41,32,40,40,40,67,39,32,95,52,56,53,41,32,40,40,66,+32,95,50,53,51,41,32,95,50,48,55,41,41,32,40,95,51,53,57,32,+35,49,41,41,41,41,41,41,41,32,40,40,40,67,39,32,95,52,56,53,+41,32,40,40,66,32,95,50,53,51,41,32,95,50,48,55,41,41,32,40,+95,51,53,57,32,35,50,41,41,41,41,32,40,40,65,32,58,50,52,56,+32,40,40,40,83,39,32,66,41,32,95,50,49,48,41,32,40,40,40,83,+39,32,95,52,55,57,41,32,40,40,66,32,95,50,53,51,41,32,95,50,+48,55,41,41,32,40,40,40,67,39,32,95,52,56,53,41,32,40,40,66,+32,95,50,53,51,41,32,95,50,48,55,41,41,32,40,95,51,53,57,32,+35,49,41,41,41,41,41,32,40,40,65,32,58,50,52,57,32,40,40,83,+32,40,40,40,83,39,32,67,39,41,32,40,40,66,32,95,52,56,48,41,+32,40,40,66,32,95,50,53,51,41,32,95,50,48,55,41,41,41,32,95,+50,48,57,41,41,32,40,40,40,67,39,32,95,52,56,53,41,32,40,40,+66,32,95,50,53,51,41,32,95,50,48,55,41,41,32,40,95,51,53,57,+32,35,49,41,41,41,41,32,40,40,65,32,58,50,53,48,32,40,40,40,+83,39,32,66,41,32,95,50,50,54,41,32,95,50,48,57,41,41,32,40,+40,65,32,58,50,53,49,32,40,40,40,83,39,32,66,41,32,95,50,50,+54,41,32,40,40,40,83,39,32,66,41,32,40,40,66,32,95,52,56,50,+41,32,40,40,66,32,95,50,53,51,41,32,95,50,48,55,41,41,41,32,+95,50,48,57,41,41,41,32,40,40,65,32,58,50,53,50,32,40,40,66,+32,40,66,32,40,66,32,67,41,41,41,32,40,40,66,32,40,66,32,67,+41,41,32,80,41,41,41,32,40,40,65,32,58,50,53,51,32,40,85,32,+40,90,32,40,90,32,75,41,41,41,41,32,40,40,65,32,58,50,53,52,+32,40,85,32,40,75,32,40,90,32,75,41,41,41,41,32,40,40,65,32,+58,50,53,53,32,40,85,32,40,75,32,40,75,32,75,41,41,41,41,32,+40,40,65,32,58,50,53,54,32,40,85,32,40,75,32,40,75,32,65,41,+41,41,41,32,40,40,65,32,58,50,53,55,32,40,75,32,40,110,111,68,+101,102,97,117,108,116,32,34,70,114,97,99,116,105,111,110,97,108,46,47,+34,41,41,41,32,40,40,65,32,58,50,53,56,32,40,40,83,32,95,50,+53,52,41,32,40,40,40,67,39,32,95,52,56,53,41,32,95,50,53,51,+41,32,40,95,51,53,57,32,35,49,41,41,41,41,32,40,40,65,32,58,+50,53,57,32,40,75,32,40,110,111,68,101,102,97,117,108,116,32,34,70,+114,97,99,116,105,111,110,97,108,46,102,114,111,109,82,97,116,105,111,110,+97,108,34,41,41,41,32,40,40,65,32,58,50,54,48,32,40,40,40,83,+39,32,40,83,39,32,83,41,41,32,40,40,40,83,39,32,66,41,32,40,+40,66,32,83,41,32,40,40,40,83,39,32,67,41,32,40,40,66,32,95,+53,48,48,41,32,40,85,32,40,75,32,65,41,41,41,41,32,40,40,40,+67,39,32,95,52,56,53,41,32,40,40,66,32,40,85,32,65,41,41,32,+40,40,66,32,95,51,54,53,41,32,40,85,32,40,75,32,75,41,41,41,+41,41,32,40,95,51,53,57,32,35,48,41,41,41,41,41,32,40,40,40,+83,39,32,66,41,32,40,66,39,32,40,40,66,32,95,50,53,53,41,32,+40,85,32,40,90,32,75,41,41,41,41,41,32,40,40,40,83,39,32,40,+67,39,32,66,41,41,32,40,40,66,32,95,51,56,52,41,32,40,40,40,+83,39,32,67,41,32,40,40,40,83,39,32,80,41,32,40,40,66,32,95,+50,53,51,41,32,40,85,32,40,90,32,75,41,41,41,41,32,40,85,32,+40,75,32,75,41,41,41,41,32,40,85,32,40,75,32,65,41,41,41,41,+41,32,40,40,66,32,95,52,56,50,41,32,40,40,66,32,40,85,32,65,+41,41,32,40,40,66,32,95,51,54,53,41,32,40,85,32,40,75,32,75,+41,41,41,41,41,41,41,41,41,32,40,40,66,32,95,51,56,52,41,32,+40,40,40,83,39,32,67,41,32,40,40,40,83,39,32,80,41,32,40,40,+66,32,95,50,53,51,41,32,40,85,32,40,90,32,75,41,41,41,41,32,+40,85,32,40,75,32,75,41,41,41,41,32,40,85,32,40,75,32,65,41,+41,41,41,41,41,32,40,40,65,32,58,50,54,49,32,73,41,32,40,40,+65,32,58,50,54,50,32,40,83,32,95,49,51,57,57,41,41,32,40,40,+65,32,58,50,54,51,32,66,41,32,40,40,65,32,58,50,54,52,32,73,+41,32,40,40,65,32,58,50,54,53,32,75,41,32,40,40,65,32,58,50,+54,54,32,67,41,32,40,40,65,32,58,50,54,55,32,95,49,51,57,56,+41,32,40,40,65,32,58,50,54,56,32,85,41,32,40,40,65,32,58,50,+54,57,32,40,40,40,67,39,32,40,83,39,32,40,67,39,32,66,41,41,+41,32,66,41,32,73,41,41,32,40,40,65,32,58,50,55,48,32,95,50,+54,53,41,32,40,40,65,32,58,50,55,49,32,80,41,32,40,40,65,32,+58,50,55,50,32,40,85,32,75,41,41,32,40,40,65,32,58,50,55,51,+32,40,85,32,65,41,41,32,40,40,65,32,58,50,55,52,32,40,75,32,+40,110,111,68,101,102,97,117,108,116,32,34,70,117,110,99,116,111,114,46,+102,109,97,112,34,41,41,41,32,40,40,65,32,58,50,55,53,32,40,40,+40,67,39,32,95,50,54,51,41,32,95,50,55,50,41,32,95,50,54,53,+41,41,32,40,40,65,32,58,50,55,54,32,95,50,55,50,41,32,40,40,+65,32,58,50,55,55,32,40,40,40,40,40,40,40,95,52,55,56,32,95,+49,51,52,50,41,32,95,49,51,52,51,41,32,95,49,51,52,52,41,32,+95,49,51,52,56,41,32,40,40,83,32,40,40,83,32,40,40,67,32,40,+95,52,57,55,32,95,50,56,50,41,41,32,35,48,41,41,32,73,41,41,+32,40,95,52,56,50,32,95,50,55,55,41,41,41,32,40,40,67,32,40,+40,67,32,40,40,67,32,40,40,67,32,40,95,52,57,54,32,95,50,56,+50,41,41,32,35,48,41,41,32,35,45,49,41,41,32,35,48,41,41,32,+35,49,41,41,32,95,51,54,48,41,41,32,40,40,65,32,58,50,55,56,+32,40,40,40,40,40,40,40,40,95,51,54,52,32,40,40,80,32,95,50,+56,49,41,32,95,50,55,55,41,41,32,95,49,51,52,53,41,32,95,49,+51,52,54,41,32,40,95,51,55,53,32,95,50,55,56,41,41,32,40,95,+51,55,54,32,95,50,55,56,41,41,32,40,95,51,55,55,32,95,50,55,+56,41,41,32,40,95,51,55,56,32,95,50,55,56,41,41,32,95,51,53,+57,41,41,32,40,40,65,32,58,50,55,57,32,40,40,95,49,50,54,32,+40,40,40,95,52,55,57,32,95,50,55,55,41,32,40,95,49,51,56,57,+32,40,40,95,49,51,54,54,32,35,45,49,41,32,35,50,41,41,41,32,+35,49,41,41,32,40,95,49,51,56,57,32,40,40,95,49,51,54,54,32,+35,45,49,41,32,35,50,41,41,41,41,32,40,40,65,32,58,50,56,48,+32,40,95,53,51,49,32,40,40,66,32,95,53,50,57,41,32,95,51,53,+57,41,41,41,32,40,40,65,32,58,50,56,49,32,40,40,95,50,48,49,+32,95,49,51,55,55,41,32,95,49,51,55,56,41,41,32,40,40,65,32,+58,50,56,50,32,40,40,40,40,40,40,40,40,95,52,57,52,32,95,50,+56,49,41,32,95,49,52,48,48,41,32,95,49,51,55,57,41,32,95,49,+51,56,48,41,32,95,49,51,56,49,41,32,95,49,51,56,50,41,32,40,+95,53,48,56,32,95,50,56,50,41,41,32,40,95,53,48,57,32,95,50,+56,50,41,41,41,32,40,40,65,32,58,50,56,51,32,40,40,40,95,49,+53,56,56,32,40,95,49,53,57,50,32,95,50,56,51,41,41,32,95,50,+56,52,41,32,40,95,49,53,57,52,32,95,50,56,51,41,41,41,32,40,+40,65,32,58,50,56,52,32,40,40,83,32,40,40,83,32,40,40,67,32,+40,95,52,57,55,32,95,50,56,50,41,41,32,35,48,41,41,32,40,40,+66,32,95,50,56,53,41,32,40,95,52,56,50,32,95,50,55,55,41,41,+41,41,32,40,40,66,32,40,95,52,54,50,32,35,52,53,41,41,32,95,+50,56,53,41,41,41,32,40,40,65,32,58,50,56,53,32,40,40,83,32,+40,40,67,32,40,40,40,83,39,32,83,39,41,32,40,40,67,32,40,95,+52,57,57,32,95,50,56,50,41,41,32,35,45,49,48,41,41,32,40,40,+40,67,39,32,66,41,32,40,40,66,32,95,52,54,51,41,32,40,40,66,+32,95,50,56,53,41,32,40,40,67,32,40,95,51,54,54,32,95,50,55,+56,41,41,32,35,49,48,41,41,41,41,32,40,40,67,32,79,41,32,75,+41,41,41,41,32,40,40,67,32,79,41,32,75,41,41,41,32,40,40,66,+32,95,49,52,48,50,41,32,40,40,66,32,40,40,95,52,56,48,32,95,+50,55,55,41,32,40,95,49,52,48,51,32,35,52,56,41,41,41,32,40,+40,67,32,40,95,51,54,55,32,95,50,55,56,41,41,32,35,49,48,41,+41,41,41,41,32,40,40,65,32,58,50,56,54,32,40,90,32,75,41,41,+32,40,40,65,32,58,50,56,55,32,40,40,66,32,90,41,32,40,40,66,+32,40,66,32,90,41,41,32,80,41,41,41,32,40,40,65,32,58,50,56,+56,32,40,40,66,32,40,66,32,40,66,32,90,41,41,41,32,40,40,66,+32,40,66,32,40,66,32,90,41,41,41,32,40,40,66,32,40,66,32,40,+66,32,67,41,41,41,32,40,40,66,32,40,66,32,67,41,41,32,80,41,+41,41,41,41,32,40,40,65,32,58,50,56,57,32,40,40,40,83,39,32,+83,41,32,40,40,40,83,39,32,40,83,39,32,67,41,41,32,40,40,40,+67,39,32,40,67,39,32,83,41,41,32,40,40,40,67,39,32,66,41,32,+40,40,66,32,40,83,39,32,83,39,41,41,32,40,40,40,67,39,32,66,+41,32,40,40,66,32,95,49,50,48,41,32,40,40,67,32,40,95,53,48,+48,32,95,50,56,50,41,41,32,35,48,41,41,41,32,40,40,67,32,40,+95,50,48,50,32,95,50,56,49,41,41,32,35,48,41,41,41,41,32,40,+40,66,32,40,66,32,40,40,67,39,32,80,41,32,40,40,67,32,40,95,+52,56,48,32,95,50,55,55,41,41,32,35,49,41,41,41,41,32,40,67,+32,40,95,52,55,57,32,95,50,55,55,41,41,41,41,41,32,40,67,32,+80,41,41,41,32,40,95,51,54,54,32,95,50,55,56,41,41,41,32,40,+95,51,54,55,32,95,50,55,56,41,41,41,32,40,40,65,32,58,50,57,+48,32,95,50,56,54,41,32,40,40,65,32,58,50,57,49,32,40,40,40,+83,39,32,67,41,32,40,40,66,32,40,80,32,95,52,55,54,41,41,32,+40,40,40,67,39,32,40,67,39,32,66,41,41,32,40,40,40,67,39,32,+67,41,32,40,95,50,48,50,32,95,50,56,49,41,41,32,95,52,55,54,+41,41,32,95,52,55,55,41,41,41,32,40,40,66,32,40,40,67,39,32,+40,67,39,32,40,67,39,32,67,41,41,41,32,40,40,40,67,39,32,40,+67,39,32,40,67,39,32,67,41,41,41,32,40,40,40,67,39,32,40,67,+39,32,40,67,39,32,40,67,39,32,83,39,41,41,41,41,32,40,40,66,+32,40,66,32,40,66,32,40,66,32,67,41,41,41,41,32,40,40,66,32,+40,40,67,39,32,40,67,39,32,40,67,39,32,67,41,41,41,32,40,40,+66,32,40,66,32,40,66,32,40,40,83,39,32,83,39,41,32,40,40,67,+32,40,95,50,48,50,32,95,50,56,49,41,41,32,35,48,41,41,41,41,+41,32,40,40,66,32,40,40,67,39,32,40,67,39,32,67,41,41,32,40,+40,66,32,40,66,32,40,40,83,39,32,83,39,41,32,40,40,67,32,40,+95,50,48,50,32,95,50,56,49,41,41,32,35,49,41,41,41,41,32,40,+40,66,32,40,40,67,39,32,67,41,32,40,40,66,32,40,40,67,39,32,+83,39,41,32,40,40,67,32,40,95,50,48,50,32,95,50,56,49,41,41,+32,35,50,41,41,41,32,40,67,32,95,50,57,49,41,41,41,41,32,40,+67,32,95,50,57,49,41,41,41,41,41,32,40,67,32,95,50,57,49,41,+41,41,41,41,32,40,67,32,95,50,57,49,41,41,41,41,32,40,85,32,+75,41,41,41,32,40,85,32,65,41,41,41,41,32,40,40,67,32,95,50,+56,57,41,32,35,52,41,41,41,41,32,40,40,65,32,58,50,57,50,32,+40,95,50,57,56,32,95,50,54,53,41,41,32,40,40,65,32,58,50,57,+51,32,40,40,95,51,57,55,32,40,95,50,54,56,32,95,50,57,50,41,+41,32,95,50,57,48,41,41,32,40,40,65,32,58,50,57,52,32,40,40,+67,32,40,40,40,67,39,32,66,41,32,40,40,80,32,95,52,54,49,41,+32,40,40,40,67,39,32,40,67,39,32,79,41,41,32,80,41,32,75,41,+41,41,32,40,40,40,83,39,32,40,67,39,32,40,67,39,32,40,67,39,+32,66,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,+95,50,57,53,41,41,41,41,32,40,40,40,83,39,32,40,67,39,32,40,+67,39,32,66,41,41,41,32,40,40,66,32,40,66,32,40,66,32,95,50,+57,53,41,41,41,32,40,40,40,83,39,32,40,67,39,32,66,41,41,32,+40,40,66,32,40,66,32,95,50,57,53,41,41,32,40,40,40,67,39,32,+66,41,32,40,40,66,32,95,51,57,53,41,32,40,85,32,40,40,95,52,+56,53,32,95,50,55,55,41,32,40,95,51,53,57,32,35,48,41,41,41,+41,41,32,95,50,57,52,41,41,41,32,40,40,40,67,39,32,66,41,32,+40,40,66,32,95,51,57,53,41,32,40,85,32,35,49,41,41,41,32,95,+50,57,52,41,41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,+32,95,51,57,53,41,32,40,85,32,35,50,41,41,41,32,95,50,57,52,+41,41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,95,51,+57,53,41,32,40,85,32,35,51,41,41,41,32,95,50,57,52,41,41,41,+41,32,40,40,66,32,85,41,32,40,40,66,32,40,66,32,80,41,41,32,+40,40,67,39,32,40,95,52,55,57,32,95,50,55,55,41,41,32,40,40,+67,32,40,95,52,56,49,32,95,50,55,55,41,41,32,40,40,95,52,56,+53,32,95,50,55,55,41,32,40,95,51,53,57,32,35,52,41,41,41,41,+41,41,41,41,32,40,40,65,32,58,50,57,53,32,40,40,66,32,89,41,+32,40,40,40,83,39,32,66,41,32,83,41,32,40,40,66,32,40,66,32,+90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,40,83,39,+32,66,41,32,40,40,66,32,83,41,32,85,41,41,32,40,40,66,32,40,+66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,67,+32,40,40,40,67,39,32,67,39,41,32,40,40,66,32,67,39,41,32,83,+41,41,32,40,40,66,32,40,66,32,40,66,32,40,83,32,66,41,41,41,+41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,90,41,+41,41,41,41,32,40,40,66,32,40,40,83,39,32,40,67,39,32,66,41,+41,32,40,40,66,32,66,39,41,32,66,39,41,41,41,32,40,40,66,32,+40,66,32,40,66,32,40,66,32,40,66,32,40,83,32,66,41,41,41,41,+41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,+66,32,40,66,32,90,41,41,41,41,41,41,41,32,40,40,40,67,39,32,+66,41,32,40,66,39,32,40,66,39,32,40,40,66,32,40,67,39,32,40,+67,39,32,40,67,39,32,67,41,41,41,41,32,40,40,66,32,40,40,67,+39,32,66,41,32,40,66,39,32,40,40,66,32,67,41,32,40,95,52,57,+55,32,95,50,56,50,41,41,41,41,41,32,40,40,67,39,32,66,41,32,+95,52,54,50,41,41,41,41,41,41,32,40,40,66,32,40,40,67,39,32,+66,41,32,95,52,54,50,41,41,32,40,67,32,95,50,57,53,41,41,41,+41,41,41,41,41,41,41,32,40,40,40,110,111,77,97,116,99,104,32,34,+46,47,108,105,98,47,68,97,116,97,47,73,110,116,77,97,112,46,104,115,+34,41,32,35,54,53,41,32,35,49,41,41,41,41,41,41,41,41,41,41,+32,40,40,65,32,58,50,57,54,32,40,40,95,50,54,51,32,40,95,51,+57,53,32,95,53,54,53,41,41,32,95,50,57,52,41,41,32,40,40,65,+32,58,50,57,55,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,+32,67,41,32,40,67,32,95,50,57,49,41,41,32,40,95,50,52,32,34,+68,97,116,97,46,73,110,116,77,97,112,46,33,34,41,41,41,32,73,41,+41,32,40,40,65,32,58,50,57,56,32,40,40,66,32,40,67,39,32,89,+41,41,32,40,40,40,67,39,32,40,67,39,32,40,83,39,32,40,83,39,+32,67,41,41,41,41,32,40,40,66,32,40,40,83,39,32,66,41,32,40,+40,66,32,40,83,39,32,80,41,41,32,40,67,32,95,50,56,55,41,41,+41,41,32,40,40,66,32,40,66,32,40,40,67,39,32,40,83,39,32,67,+41,41,32,40,40,66,32,40,40,83,39,32,40,83,39,32,83,39,41,41,+32,40,95,50,48,50,32,95,50,56,49,41,41,41,32,40,40,40,67,39,+32,40,67,39,32,66,41,41,32,40,40,66,32,66,39,41,32,40,66,32,+95,50,54,49,41,41,41,32,40,40,40,67,39,32,40,67,39,32,95,50,+54,49,41,41,32,95,50,57,50,41,32,40,40,40,40,95,50,56,56,32,+95,50,56,54,41,32,95,50,56,54,41,32,95,50,56,54,41,32,95,50,+56,54,41,41,41,41,41,41,41,32,40,66,32,40,40,67,39,32,66,41,+32,95,50,56,55,41,41,41,41,41,32,40,40,40,67,39,32,66,41,32,+40,40,66,32,40,67,39,32,40,67,39,32,40,67,39,32,67,41,41,41,+41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,+67,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,+40,67,39,32,40,67,39,32,83,39,41,41,41,41,41,32,40,40,66,32,+40,66,32,40,66,32,40,66,32,40,66,32,67,41,41,41,41,41,32,40,+40,40,83,39,32,40,83,39,32,40,83,39,32,40,83,39,32,40,83,39,+32,67,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,+32,40,66,32,40,40,83,39,32,83,39,41,32,40,40,67,32,40,95,50,+48,50,32,95,50,56,49,41,41,32,35,48,41,41,41,41,41,41,41,32,+40,40,40,83,39,32,40,83,39,32,40,83,39,32,40,83,39,32,40,83,+39,32,67,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,+66,32,40,66,32,40,40,83,39,32,83,39,41,32,40,40,67,32,40,95,+50,48,50,32,95,50,56,49,41,41,32,35,49,41,41,41,41,41,41,41,+32,40,40,40,83,39,32,40,83,39,32,40,83,39,32,40,83,39,32,40,+83,39,32,67,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,+40,66,32,40,66,32,40,40,67,39,32,83,39,41,32,40,40,67,32,40,+95,50,48,50,32,95,50,56,49,41,41,32,35,50,41,41,41,41,41,41,+41,32,40,40,66,32,40,40,67,39,32,40,67,39,32,40,67,39,32,66,+41,41,41,32,40,40,66,32,40,66,32,66,39,41,41,32,95,50,56,56,+41,41,41,32,67,41,41,41,32,40,40,66,32,40,40,67,39,32,40,67,+39,32,66,41,41,32,40,40,66,32,40,66,32,67,39,41,41,32,95,50,+56,56,41,41,41,32,67,41,41,41,41,32,40,40,66,32,40,66,32,40,+66,32,40,66,32,67,41,41,41,41,32,40,40,66,32,40,40,67,39,32,+66,41,32,40,40,66,32,67,39,41,32,95,50,56,56,41,41,41,32,67,+41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,67,+41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,67,41,41,41,32,+40,40,66,32,40,66,32,40,67,39,32,95,50,56,56,41,41,41,32,67,+41,41,41,41,41,41,32,40,85,32,75,41,41,41,32,40,85,32,65,41,+41,41,41,32,40,40,67,32,95,50,56,57,41,32,35,52,41,41,41,41,+41,32,40,40,65,32,58,50,57,57,32,73,41,32,40,40,65,32,58,51,+48,48,32,40,95,50,57,57,32,95,50,57,48,41,41,32,40,40,65,32,+58,51,48,49,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,+67,41,32,95,50,57,49,41,32,95,49,50,52,41,41,32,40,75,32,95,+49,50,53,41,41,41,32,40,40,65,32,58,51,48,50,32,40,40,66,32,+40,66,32,95,50,57,57,41,41,32,40,40,67,32,95,50,57,50,41,32,+95,49,51,52,49,41,41,41,32,40,40,65,32,58,51,48,51,32,40,40,+66,32,95,50,57,57,41,32,40,40,66,32,95,50,57,51,41,32,40,40,+67,32,95,52,49,50,41,32,40,95,52,52,55,32,95,49,51,52,49,41,+41,41,41,41,32,40,40,65,32,58,51,48,52,32,40,40,66,32,40,95,+51,57,53,32,95,53,54,53,41,41,32,95,50,57,52,41,41,32,40,40,+65,32,58,51,48,53,32,40,40,95,50,48,49,32,95,51,52,55,41,32,+95,51,52,56,41,41,32,40,40,65,32,58,51,48,54,32,40,40,40,40,+40,40,40,40,95,52,57,52,32,95,51,48,53,41,32,40,95,53,48,51,+32,95,51,48,54,41,41,32,95,51,52,57,41,32,95,51,53,48,41,32,+95,51,53,49,41,32,95,51,53,50,41,32,40,95,53,48,56,32,95,51,+48,54,41,41,32,40,95,53,48,57,32,95,51,48,54,41,41,41,32,40,+40,65,32,58,51,48,55,32,40,40,40,95,49,53,56,56,32,40,95,49,+53,57,50,32,95,51,48,55,41,41,32,95,51,52,51,41,32,40,95,49,+53,57,52,32,95,51,48,55,41,41,41,32,40,40,65,32,58,51,48,56,+32,40,40,40,40,40,40,40,95,52,55,56,32,95,51,49,54,41,32,95,+51,49,57,41,32,95,51,50,56,41,32,95,51,49,55,41,32,95,51,49,+56,41,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,+95,52,57,54,32,95,51,48,54,41,41,32,95,51,51,56,41,41,32,95,+51,52,50,41,41,32,95,51,51,56,41,41,32,95,51,51,57,41,41,32,+73,41,41,32,40,40,65,32,58,51,48,57,32,40,40,40,40,40,40,40,+40,95,51,54,52,32,40,40,80,32,95,51,48,53,41,32,95,51,48,56,+41,41,32,40,95,51,55,51,32,95,51,48,57,41,41,32,40,95,51,55,+52,32,95,51,48,57,41,41,32,40,95,51,55,53,32,95,51,48,57,41,+41,32,40,95,51,55,54,32,95,51,48,57,41,41,32,95,51,51,50,41,+32,40,95,51,55,56,32,95,51,48,57,41,41,32,73,41,41,32,40,40,+65,32,58,51,49,48,32,40,95,53,51,49,32,95,53,50,57,41,41,32,+40,40,65,32,58,51,49,49,32,40,40,40,40,40,40,40,40,95,49,55,+57,32,40,40,67,32,40,95,52,55,57,32,95,51,48,56,41,41,32,40,+40,95,52,56,53,32,95,51,48,56,41,32,40,95,51,53,57,32,35,49,+41,41,41,41,32,40,40,67,32,40,95,52,56,48,32,95,51,48,56,41,+41,32,40,40,95,52,56,53,32,95,51,48,56,41,32,40,95,51,53,57,+32,35,49,41,41,41,41,32,95,51,53,57,41,32,95,51,54,48,41,32,+40,40,83,32,95,52,54,50,41,32,40,40,66,32,40,95,49,56,52,32,+95,51,49,49,41,41,32,40,40,67,32,40,95,52,55,57,32,95,51,48,+56,41,41,32,40,95,51,53,57,32,35,49,41,41,41,41,41,32,40,40,+40,83,39,32,40,67,39,32,89,41,41,32,40,40,66,32,40,66,32,40,+66,32,40,83,32,95,52,54,50,41,41,41,41,32,40,40,66,32,40,66,+32,40,67,32,66,41,41,41,32,40,40,66,32,40,66,32,40,67,32,40,+95,52,55,57,32,95,51,48,56,41,41,41,41,32,40,67,32,40,95,52,+56,48,32,95,51,48,56,41,41,41,41,41,41,32,73,41,41,32,40,40,+66,32,40,40,67,39,32,95,52,50,52,41,32,40,67,32,40,95,52,57,+56,32,95,51,48,54,41,41,41,41,32,40,95,49,56,52,32,95,51,49,+49,41,41,41,32,40,40,40,83,39,32,83,41,32,40,40,40,83,39,32,+40,83,39,32,83,39,41,41,32,40,67,32,40,95,52,57,57,32,95,51,+48,54,41,41,41,32,40,40,66,32,40,66,32,40,40,67,39,32,95,52,+50,52,41,32,40,67,32,40,95,53,48,48,32,95,51,48,54,41,41,41,+41,41,32,40,95,49,56,53,32,95,51,49,49,41,41,41,41,32,40,40,+66,32,40,66,32,40,40,67,39,32,95,52,50,52,41,32,40,67,32,40,+95,52,57,56,32,95,51,48,54,41,41,41,41,41,32,40,95,49,56,53,+32,95,51,49,49,41,41,41,41,41,32,40,40,65,32,58,51,49,50,32,+40,85,32,40,75,32,95,51,57,50,41,41,41,32,40,40,65,32,58,51,+49,51,32,40,40,95,50,48,49,32,40,40,67,32,40,40,67,32,83,39,+41,32,40,40,80,32,95,49,50,53,41,32,95,49,50,52,41,41,41,32,+40,40,80,32,95,49,50,52,41,32,95,49,50,53,41,41,41,32,40,95,+50,48,53,32,95,51,49,51,41,41,41,32,40,40,65,32,58,51,49,52,+32,40,40,40,67,39,32,66,41,32,40,40,66,32,40,83,32,40,85,32,+40,40,95,51,53,53,32,95,51,53,54,41,32,95,52,54,49,41,41,41,+41,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,95,51,53,53,+41,41,41,41,32,95,51,50,54,41,41,32,40,40,65,32,58,51,49,53,+32,35,48,41,32,40,40,65,32,58,51,49,54,32,40,40,67,32,40,40,+40,67,39,32,67,39,41,32,66,41,32,40,40,40,83,39,32,40,83,39,+32,67,41,41,32,40,40,66,32,40,66,32,40,67,32,83,39,41,41,41,+32,40,40,40,67,39,32,66,41,32,66,41,32,40,40,66,32,40,40,83,+39,32,67,41,32,40,40,66,32,40,67,32,83,39,41,41,32,40,40,66,+32,40,66,32,40,95,51,53,53,32,95,51,53,54,41,41,41,32,95,51,+50,48,41,41,41,41,32,40,40,40,67,39,32,40,83,39,32,83,41,41,+32,40,40,66,32,40,40,83,39,32,83,41,32,95,51,50,55,41,41,32,+40,40,40,67,39,32,66,41,32,40,66,39,32,95,49,50,53,41,41,32,+40,40,66,32,40,66,32,40,95,51,49,52,32,95,51,53,54,41,41,41,+32,95,51,50,51,41,41,41,41,32,40,40,66,32,40,66,32,40,95,51,+49,52,32,95,51,53,55,41,41,41,32,40,67,32,95,51,50,51,41,41,+41,41,41,41,41,32,40,40,40,83,39,32,66,41,32,40,40,40,67,39,+32,83,39,41,32,66,41,32,40,40,40,67,39,32,40,83,39,32,67,41,+41,32,40,40,66,32,40,66,32,40,67,32,67,39,41,41,41,32,40,40,+40,83,39,32,40,67,39,32,83,41,41,32,40,40,40,83,39,32,66,41,+32,40,40,66,32,83,41,32,40,67,32,95,51,50,55,41,41,41,32,40,+40,66,32,40,40,67,39,32,66,41,32,95,49,50,53,41,41,32,40,40,+66,32,40,66,32,40,95,51,49,52,32,95,51,53,54,41,41,41,32,40,+67,32,95,51,50,51,41,41,41,41,41,32,40,40,66,32,40,66,32,40,+95,51,49,52,32,95,51,53,55,41,41,41,32,95,51,50,51,41,41,41,+41,32,73,41,41,41,32,40,40,40,67,39,32,66,41,32,66,41,32,40,+40,40,67,39,32,66,41,32,40,40,66,32,40,67,39,32,66,41,41,32,+85,41,41,32,40,40,66,32,40,66,32,40,95,51,53,53,32,95,51,53,+55,41,41,41,32,95,51,50,48,41,41,41,41,41,41,41,32,40,40,40,+110,111,77,97,116,99,104,32,34,46,47,108,105,98,47,68,97,116,97,47,+73,110,116,101,103,101,114,46,104,115,34,41,32,35,49,50,50,41,32,35,+49,41,41,41,32,40,40,65,32,58,51,49,55,32,40,40,83,32,73,41,+32,40,40,40,67,39,32,66,41,32,40,40,66,32,83,41,32,85,41,41,+32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,67,32,40,+40,67,32,83,39,41,32,40,95,51,53,53,32,95,51,53,55,41,41,41,+32,40,95,51,53,53,32,95,51,53,54,41,41,41,41,41,41,41,32,40,+40,65,32,58,51,49,56,32,40,85,32,40,75,32,40,95,51,53,53,32,+95,51,53,54,41,41,41,41,32,40,40,65,32,58,51,49,57,32,40,40,+40,67,39,32,66,41,32,95,51,49,54,41,32,95,51,49,55,41,41,32,+40,40,65,32,58,51,50,48,32,40,95,51,50,49,32,95,51,49,53,41,+41,32,40,40,65,32,58,51,50,49,32,40,40,40,83,39,32,67,41,32,+40,40,66,32,40,67,32,83,39,41,41,32,40,40,40,83,39,32,80,41,+32,40,40,67,32,40,40,83,32,40,40,67,32,40,95,50,48,50,32,95,+50,56,49,41,41,32,95,51,49,53,41,41,32,40,40,67,32,79,41,32,+75,41,41,41,32,95,52,54,49,41,41,32,40,40,66,32,40,66,32,40,+40,67,39,32,40,40,83,39,32,95,52,54,50,41,32,40,85,32,65,41,+41,41,32,40,67,32,40,40,40,67,39,32,95,51,50,49,41,32,40,85,+32,75,41,41,32,95,52,54,49,41,41,41,41,41,32,40,40,67,32,95,+51,50,50,41,32,95,51,49,53,41,41,41,41,41,32,40,40,40,83,39,+32,67,41,32,40,40,66,32,40,40,67,39,32,83,39,41,32,83,39,41,+41,32,40,40,66,32,40,66,32,40,40,67,39,32,40,40,83,39,32,95,+52,54,50,41,32,40,85,32,65,41,41,41,32,40,40,40,67,39,32,67,+41,32,40,40,67,39,32,95,51,50,49,41,32,40,85,32,75,41,41,41,+32,95,52,54,49,41,41,41,41,32,40,40,40,67,39,32,67,41,32,95,+51,50,50,41,32,95,51,49,53,41,41,41,41,32,40,40,66,32,40,66,+32,40,40,67,39,32,66,41,32,40,40,66,32,40,67,39,32,40,40,83,+39,32,95,52,54,50,41,32,40,85,32,65,41,41,41,41,32,40,40,66,+32,67,41,32,40,40,67,39,32,95,51,50,49,41,32,40,85,32,75,41,+41,41,41,41,41,41,32,95,51,50,50,41,41,41,41,32,40,40,65,32,+58,51,50,50,32,40,40,66,32,40,66,32,40,66,32,40,40,40,83,39,+32,80,41,32,40,40,67,32,40,95,51,54,54,32,95,50,55,56,41,41,+32,95,51,53,56,41,41,32,40,40,67,32,40,95,51,54,55,32,95,50,+55,56,41,41,32,95,51,53,56,41,41,41,41,41,32,40,40,66,32,40,+66,32,40,95,52,55,57,32,95,50,55,55,41,41,41,32,40,95,52,55,+57,32,95,50,55,55,41,41,41,41,32,40,40,65,32,58,51,50,51,32,+40,95,51,50,52,32,95,51,49,53,41,41,32,40,40,65,32,58,51,50,+52,32,40,40,40,83,39,32,67,41,32,40,40,66,32,40,83,32,83,39,+41,41,32,40,40,67,32,40,40,40,67,39,32,83,39,41,32,40,40,66,+32,67,39,41,32,40,40,66,32,83,41,32,40,40,67,32,61,61,41,32,+35,48,41,41,41,41,32,40,40,67,32,40,40,40,67,39,32,67,39,41,+32,83,39,41,32,40,40,40,67,39,32,66,41,32,40,85,32,95,52,54,+49,41,41,32,40,90,32,75,41,41,41,41,32,40,90,32,75,41,41,41,+41,32,40,40,80,32,95,50,53,41,32,40,75,32,40,75,32,40,40,40,+110,111,77,97,116,99,104,32,34,46,47,108,105,98,47,68,97,116,97,47,+73,110,116,101,103,101,114,46,104,115,34,41,32,35,49,53,56,41,32,35,+49,41,41,41,41,41,41,41,32,40,40,40,83,39,32,67,41,32,40,40,+66,32,40,40,67,39,32,83,39,41,32,83,39,41,41,32,40,40,66,32,+40,66,32,40,40,67,39,32,40,40,83,39,32,95,52,54,50,41,32,40,+85,32,65,41,41,41,32,40,40,40,67,39,32,67,41,32,40,40,67,39,+32,95,51,50,52,41,32,40,85,32,75,41,41,41,32,95,52,54,49,41,+41,41,41,32,40,40,40,67,39,32,67,41,32,95,51,50,53,41,32,95,+51,49,53,41,41,41,41,32,40,40,66,32,40,66,32,40,40,67,39,32,+66,41,32,40,40,66,32,40,67,39,32,40,40,83,39,32,95,52,54,50,+41,32,40,85,32,65,41,41,41,41,32,40,40,66,32,67,41,32,40,40,+67,39,32,95,51,50,52,41,32,40,85,32,75,41,41,41,41,41,41,41,+32,95,51,50,53,41,41,41,41,32,40,40,65,32,58,51,50,53,32,40,+40,66,32,40,66,32,40,66,32,40,40,83,32,40,40,83,32,40,40,67,+32,40,95,52,57,55,32,95,50,56,50,41,41,32,35,48,41,41,32,40,+40,40,83,39,32,80,41,32,40,40,67,32,40,95,51,54,54,32,95,50,+55,56,41,41,32,95,51,53,56,41,41,32,40,40,67,32,40,95,51,54,+55,32,95,50,55,56,41,41,32,95,51,53,56,41,41,41,41,32,40,40,+40,83,39,32,80,41,32,40,40,40,67,39,32,40,95,52,56,48,32,95,+50,55,55,41,41,32,40,40,67,32,40,95,51,54,54,32,95,50,55,56,+41,41,32,95,51,53,56,41,41,32,35,49,41,41,32,40,40,40,67,39,+32,40,95,52,55,57,32,95,50,55,55,41,41,32,40,40,67,32,40,95,+51,54,55,32,95,50,55,56,41,41,32,95,51,53,56,41,41,32,95,51,+53,56,41,41,41,41,41,41,32,40,40,67,39,32,40,67,39,32,40,95,+52,55,57,32,95,50,55,55,41,41,41,32,40,95,52,56,48,32,95,50,+55,55,41,41,41,41,32,40,40,65,32,58,51,50,54,32,40,40,95,50,+54,51,32,95,52,50,51,41,32,40,40,95,50,54,51,32,40,95,52,50,+53,32,40,40,67,32,40,95,50,48,50,32,95,50,56,49,41,41,32,35,+48,41,41,41,32,95,52,50,51,41,41,41,32,40,40,65,32,58,51,50,+55,32,40,40,40,67,39,32,83,41,32,40,40,40,83,39,32,40,67,39,+32,67,41,41,32,40,40,66,32,40,66,32,40,40,83,39,32,40,83,39,+32,95,49,50,48,41,41,32,40,67,32,40,95,52,57,55,32,95,50,56,+50,41,41,41,41,41,32,40,40,66,32,40,66,32,40,40,67,39,32,40,+67,39,32,95,49,50,49,41,41,32,40,67,32,40,95,50,48,50,32,95,+50,56,49,41,41,41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,+66,32,40,89,32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,+40,66,32,40,67,32,40,40,40,67,39,32,83,39,41,32,83,39,41,32,+40,40,40,67,39,32,66,41,32,40,85,32,95,49,50,52,41,41,32,40,+90,32,75,41,41,41,41,41,32,40,40,66,32,40,40,67,39,32,40,67,+39,32,66,41,41,32,66,39,41,41,32,40,40,66,32,40,40,83,39,32,+66,41,32,40,40,66,32,40,83,39,32,66,41,41,32,40,40,66,32,40,+66,32,95,49,50,48,41,41,32,40,95,52,57,55,32,95,50,56,50,41,+41,41,41,41,32,40,40,67,39,32,66,41,32,40,40,66,32,40,67,39,+32,66,41,41,32,40,40,66,32,40,66,32,95,49,50,49,41,41,32,40,+95,50,48,50,32,95,50,56,49,41,41,41,41,41,41,41,41,32,40,95,+50,52,32,34,108,116,87,46,99,109,112,34,41,41,41,41,32,95,52,50,+51,41,41,32,95,52,50,51,41,41,41,41,32,95,52,49,49,41,41,32,+95,52,49,49,41,41,32,40,40,65,32,58,51,50,56,32,40,40,83,32,+66,41,32,40,40,66,32,90,41,32,40,40,66,32,40,66,32,40,80,32,+40,40,95,51,53,53,32,95,51,53,54,41,32,95,52,54,49,41,41,41,+41,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,66,32,+40,83,32,73,41,41,32,40,40,66,32,90,41,32,40,40,66,32,40,66,+32,40,80,32,40,40,95,51,53,53,32,95,51,53,54,41,32,95,52,54,+49,41,41,41,41,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,+40,40,67,32,66,41,32,40,40,40,83,39,32,40,83,39,32,83,41,41,+32,40,40,66,32,40,66,32,40,67,32,83,41,41,41,32,40,40,40,67,+39,32,40,67,39,32,66,41,41,32,40,40,66,32,40,66,32,40,67,39,+32,80,41,41,41,32,40,40,40,67,39,32,66,41,32,66,41,32,40,40,+40,67,39,32,66,41,32,40,40,66,32,40,67,39,32,66,41,41,32,40,+40,66,32,40,66,32,95,51,53,53,41,41,32,95,51,50,57,41,41,41,+32,40,67,32,40,95,51,51,48,32,95,51,49,53,41,41,41,41,41,41,+32,40,90,32,75,41,41,41,41,32,40,40,40,67,39,32,66,41,32,66,+41,32,40,40,40,83,39,32,40,83,39,32,40,83,39,32,83,41,41,41,+32,40,40,66,32,40,66,32,40,66,32,40,67,32,83,41,41,41,41,32,+40,40,40,67,39,32,40,67,39,32,40,67,39,32,66,41,41,41,32,40,+40,66,32,40,66,32,40,66,32,40,67,39,32,80,41,41,41,41,32,40,+40,40,67,39,32,66,41,32,40,40,66,32,40,67,39,32,66,41,41,32,+40,40,66,32,40,66,32,95,51,53,53,41,41,32,95,51,50,57,41,41,+41,32,40,95,51,51,48,32,95,51,49,53,41,41,41,41,32,40,90,32,+75,41,41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,40,+67,39,32,66,41,41,32,40,40,66,32,40,66,32,95,51,53,53,41,41,+32,95,51,50,57,41,41,41,32,95,51,51,49,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,32,40,40,65,32,58,51,50,57,32,40,+40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,95,50,+48,50,32,95,51,49,51,41,41,32,95,51,53,55,41,41,32,95,51,53,+54,41,41,32,40,40,65,32,58,51,51,48,32,40,40,40,83,39,32,40,+67,39,32,66,41,41,32,40,40,66,32,85,41,32,40,40,67,32,40,40,+83,32,40,40,67,32,40,95,50,48,50,32,95,50,56,49,41,41,32,35,+48,41,41,32,40,40,67,32,79,41,32,75,41,41,41,32,95,52,54,49,+41,41,41,32,40,40,66,32,40,40,83,39,32,66,41,32,40,40,66,32,+40,67,39,32,40,40,83,39,32,95,52,54,50,41,32,40,40,67,32,40,+95,51,54,55,32,95,50,55,56,41,41,32,95,51,53,56,41,41,41,41,+32,40,40,67,39,32,67,41,32,40,40,67,39,32,95,51,51,48,41,32,+40,40,67,32,40,95,51,54,54,32,95,50,55,56,41,41,32,95,51,53,+56,41,41,41,41,41,41,32,40,40,67,39,32,40,67,39,32,40,95,52,+55,57,32,95,50,55,55,41,41,41,32,40,67,32,40,95,52,56,49,32,+95,50,55,55,41,41,41,41,41,41,32,40,40,65,32,58,51,51,49,32,+40,40,66,32,40,66,32,40,95,52,48,48,32,95,51,50,48,41,41,41,+32,40,40,66,32,40,66,32,40,40,95,52,49,51,32,95,52,54,51,41,+32,40,40,95,51,57,53,32,40,40,67,32,95,52,52,54,41,32,35,48,+41,41,32,40,40,95,49,56,52,32,95,49,57,56,41,32,35,48,41,41,+41,41,41,32,40,40,66,32,95,51,57,53,41,32,40,95,51,51,48,32,+95,51,49,53,41,41,41,41,41,32,40,40,65,32,58,51,51,50,32,40,+40,66,32,40,83,32,73,41,41,32,40,40,66,32,90,41,32,40,40,66,+32,40,66,32,40,80,32,40,95,50,52,32,34,73,110,116,101,103,101,114,+58,32,100,105,118,105,115,105,111,110,32,98,121,32,48,34,41,41,41,41,+32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,67,32,66,+41,32,40,40,66,32,40,66,32,40,83,32,40,85,32,40,40,80,32,40,+40,95,51,53,53,32,95,51,53,54,41,32,95,52,54,49,41,41,32,40,+40,95,51,53,53,32,95,51,53,54,41,32,95,52,54,49,41,41,41,41,+41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,+32,90,41,41,32,40,40,40,83,39,32,66,41,32,66,41,32,40,40,40,+67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,41,+32,40,40,40,67,39,32,40,67,39,32,40,83,39,32,40,67,39,32,40,+67,39,32,83,41,41,41,41,41,32,40,40,40,67,39,32,40,83,39,32,+40,67,39,32,66,41,41,41,32,40,40,66,32,40,66,32,66,39,41,41,+32,40,40,66,32,40,66,32,40,66,32,40,67,39,32,66,41,41,41,41,+32,40,40,66,32,40,66,32,40,66,32,40,67,32,40,95,52,48,56,32,+40,40,67,32,40,95,50,48,50,32,95,50,56,49,41,41,32,35,48,41,+41,41,41,41,41,32,40,40,40,67,39,32,66,41,32,66,41,32,40,40,+40,67,39,32,66,41,32,40,40,66,32,40,67,39,32,66,41,41,32,95,+51,51,51,41,41,32,95,51,51,54,41,41,41,41,41,41,32,40,40,66,+32,40,66,32,40,40,67,39,32,83,41,32,40,40,66,32,40,40,67,39,+32,95,51,51,53,41,32,40,85,32,65,41,41,41,32,95,52,53,53,41,+41,41,41,32,40,40,40,67,39,32,40,67,39,32,66,41,41,32,40,40,+66,32,66,39,41,32,40,40,66,32,66,39,41,32,95,51,51,51,41,41,+41,32,40,40,66,32,40,40,67,39,32,66,41,32,80,41,41,32,40,40,+66,32,95,52,54,51,41,32,40,85,32,75,41,41,41,41,41,41,41,32,+40,40,67,39,32,95,52,50,50,41,32,95,52,49,49,41,41,41,32,95,+52,53,54,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,65,32,+58,51,51,51,32,40,40,66,32,40,66,32,85,41,41,32,40,40,40,83,+39,32,40,67,39,32,40,67,39,32,66,41,41,41,32,40,40,66,32,40,+66,32,40,66,32,80,41,41,41,32,40,40,66,32,40,66,32,95,51,49,+52,41,41,32,95,51,50,57,41,41,41,32,95,51,49,52,41,41,41,32,+40,40,65,32,58,51,51,52,32,40,40,40,67,39,32,67,41,32,95,51,+51,50,41,32,75,41,41,32,40,40,65,32,58,51,51,53,32,40,40,40,+67,39,32,67,41,32,40,40,66,32,40,67,32,40,40,40,67,39,32,89,+41,32,40,40,66,32,40,66,32,40,40,83,39,32,67,41,32,40,40,66,+32,40,67,32,83,39,41,41,32,40,40,66,32,40,67,32,80,41,41,32,+40,40,67,32,79,41,32,75,41,41,41,41,41,41,32,40,40,40,67,39,+32,40,67,39,32,66,41,41,32,40,40,66,32,40,66,32,40,67,39,32,+66,41,41,41,32,40,40,66,32,40,66,32,40,66,32,67,41,41,41,32,+40,40,40,83,39,32,40,67,39,32,66,41,41,32,40,40,66,32,40,66,+32,40,67,39,32,83,41,41,41,32,40,40,66,32,40,67,32,67,39,41,+41,32,40,67,32,40,95,51,54,55,32,95,50,55,56,41,41,41,41,41,+32,40,40,66,32,40,67,39,32,95,52,54,50,41,41,32,40,67,32,40,+95,51,54,54,32,95,50,55,56,41,41,41,41,41,41,41,32,40,40,66,+32,40,95,52,55,57,32,95,50,55,55,41,41,32,40,40,67,32,40,95,+52,56,49,32,95,50,55,55,41,41,32,95,51,53,56,41,41,41,41,41,+32,95,51,49,53,41,41,41,32,95,52,50,51,41,41,32,95,52,54,49,+41,41,32,40,40,65,32,58,51,51,54,32,40,40,66,32,40,67,32,40,+40,40,83,39,32,67,41,32,40,40,66,32,40,40,67,39,32,67,41,32,+40,40,40,83,39,32,40,83,39,32,66,41,41,32,40,40,66,32,40,40,+83,39,32,83,41,32,40,40,66,32,40,40,83,39,32,83,41,32,40,40,+66,32,40,83,32,40,40,67,32,95,51,52,57,41,32,95,51,51,56,41,+41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,80,41,32,95,+51,51,55,41,41,32,95,51,51,55,41,41,41,41,32,40,40,66,32,40,+40,67,39,32,66,41,32,40,40,66,32,80,41,32,40,40,66,32,95,51,+51,55,41,32,40,40,67,32,95,51,49,57,41,32,95,51,51,57,41,41,+41,41,41,32,40,40,66,32,40,66,32,95,51,51,55,41,41,32,40,67,+32,95,51,49,54,41,41,41,41,41,41,32,40,40,40,67,39,32,66,41,+32,40,66,39,32,95,51,49,57,41,41,32,40,67,32,95,51,50,56,41,+41,41,41,32,40,40,40,67,39,32,40,83,39,32,67,41,41,32,40,40,+40,83,39,32,40,67,39,32,40,83,39,32,89,41,41,41,32,40,40,66,+32,40,40,83,39,32,66,41,32,40,66,39,32,40,40,66,32,40,83,39,+32,67,41,41,32,40,40,66,32,67,41,32,40,40,67,39,32,95,51,53,+50,41,32,95,51,49,56,41,41,41,41,41,41,32,40,40,66,32,40,66,+32,40,40,67,39,32,40,67,39,32,83,41,41,32,40,40,40,67,39,32,+67,41,32,40,40,66,32,40,40,67,39,32,67,39,41,32,83,39,41,41,+32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,95,51,51,52,41,+41,41,32,40,40,66,32,40,40,83,39,32,66,41,32,95,51,49,54,41,+41,32,40,40,66,32,40,40,67,39,32,66,41,32,95,51,49,54,41,41,+32,40,67,32,95,51,51,52,41,41,41,41,32,95,51,52,48,41,41,41,+32,73,41,41,41,41,32,40,40,40,67,39,32,66,41,32,40,66,39,32,+95,51,49,57,41,41,32,40,67,32,95,51,50,56,41,41,41,41,41,32,+95,51,51,52,41,41,32,40,40,67,32,95,51,49,54,41,32,95,51,51,+57,41,41,41,41,41,32,40,40,66,32,40,95,50,54,49,32,40,95,51,+53,53,32,95,51,53,54,41,41,41,32,40,40,40,83,39,32,95,52,54,+51,41,32,40,40,40,67,39,32,95,52,52,54,41,32,40,40,40,67,39,+32,40,95,52,56,48,32,95,50,55,55,41,41,32,95,52,49,49,41,32,+35,49,41,41,32,35,48,41,41,32,40,40,40,67,39,32,79,41,32,95,+52,53,53,41,32,75,41,41,41,41,41,32,40,95,51,53,53,32,95,51,+53,54,41,41,41,41,32,40,95,51,53,53,32,95,51,53,54,41,41,41,+32,40,40,65,32,58,51,51,55,32,40,85,32,65,41,41,32,40,40,65,+32,58,51,51,56,32,40,40,95,51,53,53,32,95,51,53,54,41,32,95,+52,54,49,41,41,32,40,40,65,32,58,51,51,57,32,40,40,95,51,53,+53,32,95,51,53,54,41,32,40,40,79,32,35,49,41,32,75,41,41,41,+32,40,40,65,32,58,51,52,48,32,40,40,95,51,53,53,32,95,51,53,+54,41,32,40,40,79,32,35,50,41,32,75,41,41,41,32,40,40,65,32,+58,51,52,49,32,40,40,95,51,53,53,32,95,51,53,54,41,32,40,40,+79,32,35,49,48,41,32,75,41,41,41,32,40,40,65,32,58,51,52,50,+32,40,40,95,51,53,53,32,95,51,53,55,41,32,40,40,79,32,35,49,+41,32,75,41,41,41,32,40,40,65,32,58,51,52,51,32,40,85,32,40,+40,66,32,40,83,32,40,85,32,40,40,79,32,35,52,56,41,32,75,41,+41,41,41,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,+67,32,40,40,67,32,83,39,41,32,95,51,52,52,41,41,32,40,40,66,+32,40,95,52,54,50,32,35,52,53,41,41,32,95,51,52,52,41,41,41,+41,41,41,41,32,40,40,65,32,58,51,52,52,32,40,40,83,32,40,85,+32,75,41,41,32,40,90,32,40,90,32,40,40,66,32,40,40,40,83,39,+32,95,52,54,51,41,32,40,40,66,32,95,51,52,52,41,32,40,40,66,+32,95,51,50,54,41,32,40,40,67,32,40,40,67,32,66,41,32,40,40,+40,83,39,32,66,41,32,80,41,32,40,40,66,32,90,41,32,40,40,66,+32,40,67,32,80,41,41,32,40,90,32,75,41,41,41,41,41,41,32,40,+40,40,110,111,77,97,116,99,104,32,75,41,32,35,48,41,32,35,48,41,+41,41,41,41,32,40,40,40,67,39,32,79,41,32,40,40,66,32,95,49,+51,54,41,32,40,40,66,32,40,40,95,52,55,57,32,95,50,55,55,41,+32,40,95,49,51,55,32,35,52,56,41,41,41,32,40,40,67,32,40,40,+67,32,66,41,32,40,90,32,40,40,83,32,80,41,32,40,40,66,32,40,+67,32,80,41,41,32,40,90,32,75,41,41,41,41,41,41,32,40,40,40,+110,111,77,97,116,99,104,32,75,41,32,35,48,41,32,35,48,41,41,41,+41,41,32,75,41,41,41,32,40,40,67,32,95,51,51,53,41,32,35,49,+48,41,41,41,41,41,41,32,40,40,65,32,58,51,52,53,32,40,40,83,+32,40,40,67,32,83,41,32,40,40,40,67,39,32,40,67,39,32,66,41,+41,32,40,67,32,40,40,67,32,61,61,41,32,35,52,53,41,41,41,32,+40,40,66,32,40,95,52,56,50,32,95,51,48,56,41,41,32,95,51,52,+54,41,41,41,41,32,95,51,52,54,41,41,32,40,40,65,32,58,51,52,+54,32,40,40,95,51,57,57,32,40,40,40,67,39,32,66,41,32,40,40,+66,32,40,95,52,55,57,32,95,51,48,56,41,41,32,40,40,67,32,40,+95,52,56,49,32,95,51,48,56,41,41,32,95,51,52,49,41,41,41,32,+40,40,66,32,95,51,53,57,41,32,40,40,40,67,39,32,40,95,52,56,+48,32,95,50,55,55,41,41,32,95,49,51,55,41,32,40,95,49,51,55,+32,35,52,56,41,41,41,41,41,32,95,51,51,56,41,41,32,40,40,65,+32,58,51,52,55,32,40,40,67,32,66,41,32,40,40,40,67,39,32,66,+41,32,66,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,40,67,+39,32,66,41,41,32,40,40,66,32,40,66,32,95,49,50,49,41,41,32,+40,95,50,48,50,32,95,51,49,51,41,41,41,41,32,40,95,50,48,50,+32,40,95,51,56,54,32,95,50,56,49,41,41,41,41,41,41,32,40,40,+65,32,58,51,52,56,32,40,40,66,32,40,66,32,95,49,50,50,41,41,+32,95,51,52,55,41,41,32,40,40,65,32,58,51,52,57,32,40,40,67,+32,66,41,32,40,40,40,83,39,32,67,41,32,40,40,66,32,40,67,32,+83,39,41,41,32,40,40,67,32,66,41,32,40,40,40,67,39,32,67,41,+32,40,40,66,32,40,67,32,67,39,41,41,32,95,51,50,55,41,41,32,+95,49,50,52,41,41,41,41,32,40,40,67,32,66,41,32,40,40,66,32,+40,40,67,39,32,66,41,32,40,85,32,95,49,50,53,41,41,41,32,40,+67,32,95,51,50,55,41,41,41,41,41,41,32,40,40,65,32,58,51,53,+48,32,40,40,66,32,40,66,32,95,49,50,50,41,41,32,40,67,32,95,+51,52,57,41,41,41,32,40,40,65,32,58,51,53,49,32,40,67,32,95,+51,52,57,41,41,32,40,40,65,32,58,51,53,50,32,40,40,66,32,40,+66,32,95,49,50,50,41,41,32,95,51,52,57,41,41,32,40,40,65,32,+58,51,53,51,32,40,85,32,40,40,67,32,83,41,32,40,95,52,54,50,+32,35,45,49,41,41,41,41,32,40,40,65,32,58,51,53,52,32,40,40,+83,32,40,40,67,32,83,41,32,40,40,40,67,39,32,40,67,39,32,66,+41,41,32,40,67,32,40,40,67,32,61,61,41,32,35,45,49,41,41,41,+32,40,95,51,53,53,32,95,51,53,55,41,41,41,41,32,40,95,51,53,+53,32,95,51,53,54,41,41,41,32,40,40,65,32,58,51,53,53,32,80,+41,32,40,40,65,32,58,51,53,54,32,75,41,32,40,40,65,32,58,51,+53,55,32,65,41,32,40,40,65,32,58,51,53,56,32,35,50,49,52,55,+52,56,51,54,52,56,41,32,40,40,65,32,58,51,53,57,32,40,40,83,+32,40,40,40,67,39,32,67,41,32,40,40,83,32,40,40,40,83,39,32,+67,39,41,32,40,40,66,32,83,39,41,32,40,40,67,32,95,49,51,56,+50,41,32,35,48,41,41,41,32,40,40,40,67,39,32,67,41,32,40,40,+40,67,39,32,40,83,39,32,67,39,41,41,32,95,49,51,55,55,41,32,+40,40,66,32,40,66,32,40,95,49,50,53,32,40,40,40,110,111,77,97,+116,99,104,32,34,46,47,108,105,98,47,68,97,116,97,47,73,110,116,101,+103,101,114,95,84,121,112,101,46,104,115,34,41,32,35,49,56,41,32,35,+49,41,41,41,41,32,40,40,66,32,40,66,32,40,95,51,53,53,32,95,+51,53,55,41,41,41,32,85,41,41,41,41,32,40,40,95,51,53,53,32,+95,51,53,55,41,32,40,40,79,32,35,48,41,32,40,40,79,32,35,48,+41,32,40,40,79,32,35,50,41,32,75,41,41,41,41,41,41,41,32,40,+40,66,32,40,66,32,40,95,51,53,53,32,95,51,53,54,41,41,41,32,+85,41,41,41,32,40,89,32,40,40,40,67,39,32,67,41,32,40,40,66,+32,40,83,32,40,40,67,32,61,61,41,32,35,48,41,41,41,32,40,40,+66,32,40,40,83,39,32,95,52,54,50,41,32,40,40,67,32,95,49,51,+52,54,41,32,95,51,53,56,41,41,41,32,40,40,67,32,66,41,32,40,+40,67,32,95,49,51,52,53,41,32,95,51,53,56,41,41,41,41,41,32,+95,52,54,49,41,41,41,41,32,40,95,49,51,52,51,32,35,48,41,41,+41,32,40,40,65,32,58,51,54,48,32,40,85,32,40,40,40,67,39,32,+66,41,32,40,40,66,32,95,49,51,52,52,41,32,40,40,80,32,35,49,+41,32,40,40,95,49,51,52,51,32,35,48,41,32,35,49,41,41,41,41,+32,40,40,80,32,35,48,41,32,40,40,83,32,80,41,32,40,40,40,83,+39,32,40,83,39,32,80,41,41,32,40,40,40,67,39,32,66,41,32,95,+49,51,52,50,41,32,40,95,49,51,52,52,32,95,51,53,56,41,41,41,+32,40,40,66,32,40,66,32,90,41,41,32,40,40,40,67,39,32,66,41,+32,40,66,39,32,95,49,51,52,50,41,41,32,40,40,66,32,40,66,32,+40,95,49,51,52,52,32,95,51,53,56,41,41,41,32,40,40,40,67,39,+32,66,41,32,95,49,51,52,50,41,32,40,95,49,51,52,52,32,95,51,+53,56,41,41,41,41,41,41,41,41,41,41,41,32,40,40,65,32,58,51,+54,49,32,40,40,66,32,40,95,51,53,53,32,95,51,53,54,41,41,32,+40,89,32,40,40,40,67,39,32,67,41,32,40,40,66,32,40,83,32,40,+40,67,32,95,49,51,56,51,41,32,35,48,41,41,41,32,40,40,66,32,+40,40,83,39,32,95,52,54,50,41,32,40,40,66,32,95,49,51,56,57,+41,32,40,40,67,32,95,49,51,54,55,41,32,40,95,49,51,57,48,32,+95,51,53,56,41,41,41,41,41,32,40,40,67,32,66,41,32,40,40,67,+32,95,49,51,54,54,41,32,40,95,49,51,57,48,32,95,51,53,56,41,+41,41,41,41,41,32,95,52,54,49,41,41,41,41,32,40,40,65,32,58,+51,54,50,32,40,40,66,32,95,49,51,57,48,41,32,95,51,54,48,41,+41,32,40,40,65,32,58,51,54,51,32,40,85,32,40,40,40,67,39,32,+66,41,32,40,40,66,32,95,49,51,53,49,41,32,40,40,80,32,38,49,+46,48,41,32,40,40,95,49,51,53,48,32,38,48,46,48,41,32,38,49,+46,48,41,41,41,41,32,40,89,32,40,40,66,32,40,80,32,38,48,46,+48,41,41,32,40,40,66,32,40,40,67,39,32,66,41,32,40,40,66,32,+95,49,51,52,57,41,32,95,49,51,54,50,41,41,41,32,40,66,32,40,+95,49,51,53,49,32,40,95,49,51,54,50,32,95,51,53,56,41,41,41,+41,41,41,41,41,41,32,40,40,65,32,58,51,54,52,32,40,40,66,32,+40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,67,41,+41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,+40,66,32,40,66,32,67,41,41,41,41,41,41,32,40,40,66,32,40,66,+32,40,66,32,40,66,32,40,66,32,67,41,41,41,41,41,32,40,40,66,+32,40,66,32,40,66,32,40,66,32,67,41,41,41,41,32,40,40,66,32,+40,66,32,40,66,32,67,41,41,41,32,40,40,66,32,40,66,32,67,41,+41,32,80,41,41,41,41,41,41,41,32,40,40,65,32,58,51,54,53,32,+40,85,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,+32,75,41,41,41,41,41,41,41,41,32,40,40,65,32,58,51,54,54,32,+40,85,32,40,75,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,+32,75,41,41,41,41,41,41,41,41,32,40,40,65,32,58,51,54,55,32,+40,85,32,40,75,32,40,75,32,40,90,32,40,90,32,40,90,32,40,90,+32,75,41,41,41,41,41,41,41,41,32,40,40,65,32,58,51,54,56,32,+40,85,32,40,75,32,40,75,32,40,75,32,40,90,32,40,90,32,40,90,+32,75,41,41,41,41,41,41,41,41,32,40,40,65,32,58,51,54,57,32,+40,85,32,40,75,32,40,75,32,40,75,32,40,75,32,40,90,32,40,90,+32,75,41,41,41,41,41,41,41,41,32,40,40,65,32,58,51,55,48,32,+40,85,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,90,+32,75,41,41,41,41,41,41,41,41,32,40,40,65,32,58,51,55,49,32,+40,85,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,+32,75,41,41,41,41,41,41,41,41,32,40,40,65,32,58,51,55,50,32,+40,85,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,+32,65,41,41,41,41,41,41,41,41,32,40,40,65,32,58,51,55,51,32,+40,40,40,67,39,32,40,67,39,32,67,41,41,32,95,51,55,48,41,32,+75,41,41,32,40,40,65,32,58,51,55,52,32,40,40,40,67,39,32,40,+67,39,32,67,41,41,32,95,51,55,48,41,32,65,41,41,32,40,40,65,+32,58,51,55,53,32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,+95,51,55,49,41,32,75,41,41,32,40,40,65,32,58,51,55,54,32,40,+40,40,67,39,32,40,67,39,32,67,41,41,32,95,51,55,49,41,32,65,+41,41,32,40,40,65,32,58,51,55,55,32,40,40,40,83,39,32,40,83,+39,32,40,83,39,32,80,41,41,41,32,95,51,54,54,41,32,95,51,54,+55,41,41,32,40,40,65,32,58,51,55,56,32,40,40,40,83,39,32,66,+41,32,40,40,66,32,83,41,32,40,40,40,67,39,32,40,67,39,32,83,+41,41,32,40,40,40,83,39,32,40,83,39,32,40,83,39,32,83,41,41,+41,32,40,40,40,67,39,32,40,67,39,32,66,41,41,32,40,40,66,32,+40,66,32,67,41,41,32,40,40,40,83,39,32,66,41,32,40,40,40,83,+39,32,67,39,41,32,40,40,66,32,95,50,48,50,41,32,40,40,66,32,+40,85,32,75,41,41,32,95,51,54,53,41,41,41,32,40,40,66,32,95,+52,56,52,41,32,40,40,66,32,40,85,32,65,41,41,32,95,51,54,53,+41,41,41,41,32,40,40,40,83,39,32,66,41,32,40,40,66,32,95,52,+56,50,41,32,40,40,66,32,40,85,32,65,41,41,32,95,51,54,53,41,+41,41,32,40,40,66,32,95,52,56,52,41,32,40,40,66,32,40,85,32,+65,41,41,32,95,51,54,53,41,41,41,41,41,41,32,40,40,83,32,73,+41,32,40,90,32,75,41,41,41,41,32,40,40,40,83,39,32,66,41,32,+40,40,66,32,40,67,39,32,66,41,41,32,40,40,66,32,40,66,32,80,+41,41,32,40,40,83,32,40,40,40,67,39,32,67,39,41,32,40,40,66,+32,95,52,56,48,41,32,40,40,66,32,40,85,32,65,41,41,32,95,51,+54,53,41,41,41,32,40,85,32,75,41,41,41,32,40,40,40,67,39,32,+95,52,56,53,41,32,40,40,66,32,40,85,32,65,41,41,32,95,51,54,+53,41,41,32,40,95,51,53,57,32,35,49,41,41,41,41,41,41,32,40,+40,66,32,67,41,32,40,40,66,32,95,52,55,57,41,32,40,40,66,32,+40,85,32,65,41,41,32,95,51,54,53,41,41,41,41,41,41,32,40,85,+32,65,41,41,41,41,32,95,51,55,48,41,41,32,40,40,65,32,58,51,+55,57,32,40,75,32,40,110,111,68,101,102,97,117,108,116,32,34,73,110,+116,101,103,114,97,108,46,116,111,73,110,116,101,103,101,114,34,41,41,41,+32,40,40,65,32,58,51,56,48,32,40,40,40,83,39,32,40,67,39,32,+66,41,41,32,40,40,40,83,39,32,66,41,32,40,40,66,32,89,41,32,+40,40,40,67,39,32,40,67,39,32,40,83,39,32,67,41,41,41,32,40,+40,40,83,39,32,66,41,32,40,66,39,32,40,40,66,32,83,41,32,40,+40,40,83,39,32,67,41,32,40,40,66,32,95,50,48,50,41,32,40,40,+66,32,40,85,32,75,41,41,32,95,51,54,53,41,41,41,32,40,40,40,+67,39,32,95,52,56,53,41,32,40,40,66,32,40,85,32,65,41,41,32,+95,51,54,53,41,41,32,40,95,51,53,57,32,35,48,41,41,41,41,41,+41,32,40,40,66,32,40,40,67,39,32,66,41,32,83,41,41,32,95,51,+54,55,41,41,41,32,73,41,41,41,32,40,40,66,32,95,52,56,51,41,+32,40,40,66,32,40,85,32,65,41,41,32,95,51,54,53,41,41,41,41,+32,40,40,66,32,95,52,56,51,41,32,40,40,66,32,40,85,32,65,41,+41,32,95,51,54,53,41,41,41,41,32,40,40,65,32,58,51,56,49,32,+40,40,40,83,39,32,40,67,39,32,67,41,41,32,40,40,40,83,39,32,+83,41,32,40,40,40,83,39,32,40,67,39,32,83,39,41,41,32,40,40,+66,32,40,66,32,95,49,50,48,41,41,32,40,40,40,83,39,32,67,41,+32,40,40,66,32,95,50,48,50,41,32,40,40,66,32,40,85,32,75,41,+41,32,95,51,54,53,41,41,41,32,40,40,40,67,39,32,95,52,56,53,+41,32,40,40,66,32,40,85,32,65,41,41,32,95,51,54,53,41,41,32,+40,95,51,53,57,32,35,48,41,41,41,41,41,32,40,40,40,83,39,32,+67,41,32,40,40,66,32,95,50,48,50,41,32,40,40,66,32,40,85,32,+75,41,41,32,95,51,54,53,41,41,41,32,40,40,40,67,39,32,95,52,+56,53,41,32,40,40,66,32,40,85,32,65,41,41,32,95,51,54,53,41,+41,32,40,95,51,53,57,32,35,48,41,41,41,41,41,32,40,40,40,83,+39,32,66,41,32,40,66,39,32,40,40,66,32,95,52,56,51,41,32,40,+40,66,32,40,85,32,65,41,41,32,95,51,54,53,41,41,41,41,32,40,+40,67,32,40,40,40,83,39,32,67,39,41,32,40,40,66,32,83,39,41,+32,40,40,66,32,95,52,56,49,41,32,40,40,66,32,40,85,32,65,41,+41,32,95,51,54,53,41,41,41,41,32,40,40,40,83,39,32,40,83,39,+32,66,41,41,32,95,51,54,54,41,32,95,51,56,48,41,41,41,32,73,+41,41,41,41,32,40,40,40,67,39,32,95,52,56,53,41,32,40,40,66,+32,40,85,32,65,41,41,32,95,51,54,53,41,41,32,40,95,51,53,57,+32,35,48,41,41,41,41,32,40,40,65,32,58,51,56,50,32,40,40,83,+32,40,40,40,83,39,32,67,39,41,32,40,40,66,32,95,50,48,50,41,+32,40,40,66,32,40,85,32,75,41,41,32,95,51,54,53,41,41,41,32,+40,40,40,83,39,32,67,41,32,95,51,54,55,41,32,40,40,40,67,39,+32,95,52,56,53,41,32,40,40,66,32,40,85,32,65,41,41,32,95,51,+54,53,41,41,32,40,95,51,53,57,32,35,50,41,41,41,41,41,32,40,+40,40,67,39,32,95,52,56,53,41,32,40,40,66,32,40,85,32,65,41,+41,32,95,51,54,53,41,41,32,40,95,51,53,57,32,35,48,41,41,41,+41,32,40,40,65,32,58,51,56,51,32,40,40,66,32,40,66,32,95,49,+50,50,41,41,32,95,51,56,50,41,41,32,40,40,65,32,58,51,56,52,+32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,40,83,39,+32,66,41,32,40,40,66,32,83,41,32,40,40,40,83,39,32,67,41,32,+40,40,66,32,95,52,57,55,41,32,40,85,32,40,75,32,65,41,41,41,+41,32,40,40,40,67,39,32,95,52,56,53,41,32,40,40,66,32,40,85,+32,65,41,41,32,40,40,66,32,95,51,54,53,41,32,40,85,32,40,75,+32,75,41,41,41,41,41,32,40,95,51,53,57,32,35,48,41,41,41,41,+41,32,40,40,66,32,89,41,32,40,40,40,83,39,32,40,67,39,32,40,+67,39,32,67,41,41,41,32,40,40,40,83,39,32,66,41,32,40,66,39,+32,40,40,66,32,83,41,32,40,40,40,83,39,32,67,41,32,40,40,66,+32,95,50,48,50,41,32,40,40,66,32,40,85,32,75,41,41,32,40,40,+66,32,95,51,54,53,41,32,40,85,32,40,75,32,75,41,41,41,41,41,+41,32,40,40,40,67,39,32,95,52,56,53,41,32,40,40,66,32,40,85,+32,65,41,41,32,40,40,66,32,95,51,54,53,41,32,40,85,32,40,75,+32,75,41,41,41,41,41,32,40,95,51,53,57,32,35,48,41,41,41,41,+41,41,32,40,40,40,83,39,32,40,83,39,32,40,83,39,32,83,41,41,+41,32,40,40,40,83,39,32,66,41,32,40,66,39,32,40,40,66,32,83,+41,32,40,40,66,32,95,51,56,50,41,32,40,85,32,40,75,32,75,41,+41,41,41,41,41,32,40,40,40,83,39,32,66,41,32,40,40,66,32,40,+83,39,32,66,41,41,32,40,40,66,32,95,52,56,49,41,32,40,85,32,+40,90,32,75,41,41,41,41,41,32,40,40,40,83,39,32,40,67,39,32,+40,67,39,32,66,41,41,41,32,40,40,66,32,40,67,32,66,41,41,32,+40,40,40,67,39,32,83,41,32,40,40,66,32,95,52,56,49,41,32,40,+85,32,40,90,32,75,41,41,41,41,32,73,41,41,41,32,40,40,40,83,+39,32,67,41,32,40,40,66,32,95,51,54,54,41,32,40,85,32,40,75,+32,75,41,41,41,41,32,40,40,40,67,39,32,95,52,56,53,41,32,40,+40,66,32,40,85,32,65,41,41,32,40,40,66,32,95,51,54,53,41,32,+40,85,32,40,75,32,75,41,41,41,41,41,32,40,95,51,53,57,32,35,+50,41,41,41,41,41,41,41,32,40,40,40,83,39,32,40,67,39,32,40,+67,39,32,66,41,41,41,32,40,40,66,32,40,67,32,66,41,41,32,40,+40,40,67,39,32,83,41,32,40,40,66,32,95,52,56,49,41,32,40,85,+32,40,90,32,75,41,41,41,41,32,73,41,41,41,32,40,40,40,83,39,+32,67,41,32,40,40,66,32,95,51,54,54,41,32,40,85,32,40,75,32,+75,41,41,41,41,32,40,40,40,67,39,32,95,52,56,53,41,32,40,40,+66,32,40,85,32,65,41,41,32,40,40,66,32,95,51,54,53,41,32,40,+85,32,40,75,32,75,41,41,41,41,41,32,40,95,51,53,57,32,35,50,+41,41,41,41,41,41,41,32,40,40,40,67,39,32,95,52,56,53,41,32,+40,85,32,40,90,32,75,41,41,41,32,40,95,51,53,57,32,35,49,41,+41,41,41,41,41,32,40,95,50,52,32,34,68,97,116,97,46,73,110,116,+101,103,114,97,108,46,94,58,32,110,101,103,97,116,105,118,101,32,101,120,+112,111,110,101,110,116,34,41,41,41,32,40,40,65,32,58,51,56,53,32,+40,40,40,83,39,32,66,41,32,40,40,66,32,95,52,56,53,41,32,40,+85,32,65,41,41,41,32,40,40,66,32,95,51,55,50,41,32,40,85,32,+75,41,41,41,41,32,40,40,65,32,58,51,56,54,32,40,40,40,83,39,+32,95,50,48,49,41,32,40,40,66,32,40,67,32,40,40,67,32,83,39,+41,32,40,40,80,32,95,49,50,53,41,32,40,75,32,40,75,32,95,49,+50,52,41,41,41,41,41,41,32,40,40,66,32,40,40,67,39,32,66,41,+32,40,66,39,32,40,85,32,95,49,50,52,41,41,41,41,32,40,40,40,+83,39,32,40,67,39,32,66,41,41,32,40,40,66,32,40,66,32,40,67,+39,32,66,41,41,41,32,40,40,66,32,40,66,32,40,66,32,95,49,50,+49,41,41,41,32,95,50,48,50,41,41,41,32,40,40,66,32,95,50,48,+50,41,32,95,51,56,54,41,41,41,41,41,32,40,40,66,32,95,50,48,+53,41,32,95,51,56,54,41,41,41,32,40,40,65,32,58,51,56,55,32,+40,40,95,50,55,49,32,95,51,57,53,41,32,40,95,50,55,53,32,95,+51,56,55,41,41,41,32,40,40,65,32,58,51,56,56,32,40,40,40,40,+40,95,49,49,32,95,51,56,55,41,32,40,40,67,32,79,41,32,75,41,+41,32,40,95,51,56,32,95,51,56,57,41,41,32,40,95,49,57,32,95,+51,56,56,41,41,32,40,95,50,48,32,95,51,56,56,41,41,41,32,40,+40,65,32,58,51,56,57,32,40,40,40,40,95,51,48,32,95,51,56,56,+41,32,40,95,50,54,54,32,95,51,57,52,41,41,32,40,95,51,54,32,+95,51,56,57,41,41,32,40,95,51,55,32,95,51,56,57,41,41,41,32,+40,40,65,32,58,51,57,48,32,40,40,95,51,57,32,95,51,56,57,41,+32,40,75,32,95,52,54,49,41,41,41,32,40,40,65,32,58,51,57,49,+32,40,40,83,32,40,40,40,83,39,32,95,49,53,56,56,41,32,40,90,+32,95,49,53,57,49,41,41,32,40,40,66,32,95,49,53,57,51,41,32,+95,51,57,49,41,41,41,32,40,40,66,32,95,49,53,57,52,41,32,95,+51,57,49,41,41,41,32,40,40,65,32,58,51,57,50,32,40,40,80,32,+95,49,50,53,41,32,40,75,32,40,75,32,95,49,50,52,41,41,41,41,+32,40,40,65,32,58,51,57,51,32,40,40,95,51,57,55,32,95,52,54,+51,41,32,95,52,54,49,41,41,32,40,40,65,32,58,51,57,52,32,40,+40,66,32,40,95,50,54,51,32,95,51,57,51,41,41,32,95,51,57,53,+41,41,32,40,40,65,32,58,51,57,53,32,40,40,66,32,89,41,32,40,+40,66,32,40,66,32,40,80,32,95,52,54,49,41,41,41,32,40,40,66,+32,40,67,39,32,66,41,41,32,40,66,32,95,52,54,50,41,41,41,41,+41,32,40,40,65,32,58,51,57,54,32,40,40,66,32,89,41,32,40,40,+66,32,40,66,32,40,80,32,95,52,54,49,41,41,41,32,40,40,40,67,+39,32,40,83,39,32,83,41,41,32,40,67,39,32,83,39,41,41,32,40,+40,67,39,32,66,41,32,95,52,54,50,41,41,41,41,41,32,40,40,65,+32,58,51,57,55,32,40,40,66,32,40,66,32,89,41,41,32,40,40,66,+32,40,40,67,39,32,66,41,32,80,41,41,32,40,67,39,32,66,41,41,+41,41,32,40,40,65,32,58,51,57,56,32,40,40,66,32,40,80,32,40,+95,50,52,32,34,102,111,108,100,114,49,34,41,41,41,32,95,51,57,55,+41,41,32,40,40,65,32,58,51,57,57,32,40,40,66,32,89,41,32,40,+40,66,32,40,66,32,40,83,32,80,41,41,41,32,40,40,67,39,32,66,+41,32,66,41,41,41,41,32,40,40,65,32,58,52,48,48,32,40,40,66,+32,40,80,32,40,95,50,52,32,34,102,111,108,100,108,49,34,41,41,41,+32,95,51,57,57,41,41,32,40,40,65,32,58,52,48,49,32,40,40,66,+32,40,80,32,40,95,50,52,32,34,109,105,110,105,109,117,109,34,41,41,+41,32,40,40,66,32,95,51,57,55,41,32,40,40,40,67,39,32,40,83,+39,32,67,41,41,32,40,40,40,67,39,32,40,67,39,32,83,41,41,32,+95,52,57,55,41,32,73,41,41,32,73,41,41,41,41,32,40,40,65,32,+58,52,48,50,32,40,40,66,32,40,80,32,40,95,50,52,32,34,109,97,+120,105,109,117,109,34,41,41,41,32,40,40,66,32,95,51,57,55,41,32,+40,40,40,67,39,32,40,83,39,32,67,41,41,32,40,40,40,67,39,32,+40,67,39,32,83,41,41,32,95,52,57,57,41,32,73,41,41,32,73,41,+41,41,41,32,40,40,65,32,58,52,48,51,32,40,40,40,83,39,32,95,+51,57,55,41,32,95,52,55,57,41,32,40,40,67,32,95,52,56,53,41,+32,40,95,51,53,57,32,35,48,41,41,41,41,32,40,40,65,32,58,52,+48,52,32,40,40,40,83,39,32,95,51,57,55,41,32,95,52,56,49,41,+32,40,40,67,32,95,52,56,53,41,32,40,95,51,53,57,32,35,49,41,+41,41,41,32,40,40,65,32,58,52,48,53,32,40,40,95,51,57,55,32,+95,49,50,49,41,32,95,49,50,53,41,41,32,40,40,65,32,58,52,48,+54,32,40,40,95,51,57,55,32,95,49,50,48,41,32,95,49,50,52,41,+41,32,40,40,65,32,58,52,48,55,32,40,40,66,32,40,95,50,54,51,+32,95,52,48,54,41,41,32,95,51,57,53,41,41,32,40,40,65,32,58,+52,48,56,32,40,40,66,32,40,95,50,54,51,32,95,52,48,53,41,41,+32,95,51,57,53,41,41,32,40,40,65,32,58,52,48,57,32,40,40,67,+32,40,40,40,83,39,32,67,39,41,32,40,40,67,32,40,95,52,57,56,+32,95,50,56,50,41,41,32,35,48,41,41,32,40,40,66,32,40,80,32,+95,52,54,49,41,41,32,40,40,66,32,40,40,67,39,32,66,41,32,95,+52,54,50,41,41,32,40,40,66,32,95,52,48,57,41,32,40,40,67,32,+40,95,52,56,48,32,95,50,55,55,41,41,32,35,49,41,41,41,41,41,+41,32,95,52,54,49,41,41,32,40,40,65,32,58,52,49,48,32,40,40,+67,32,40,40,40,83,39,32,83,39,41,32,40,40,67,32,40,95,52,57,+56,32,95,50,56,50,41,41,32,35,48,41,41,32,40,40,66,32,40,80,+32,95,52,54,49,41,41,32,40,90,32,40,40,66,32,95,52,49,48,41,+32,40,40,67,32,40,95,52,56,48,32,95,50,55,55,41,41,32,35,49,+41,41,41,41,41,41,32,73,41,41,32,40,40,65,32,58,52,49,49,32,+40,40,89,32,40,40,66,32,40,83,32,80,41,41,32,40,40,66,32,90,+41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,40,67,39,32,40,+83,32,95,49,51,57,57,41,41,41,32,67,41,41,32,40,40,67,32,40,+95,52,55,57,32,95,50,55,55,41,41,32,35,49,41,41,41,41,41,32,+35,48,41,41,32,40,40,65,32,58,52,49,50,32,40,95,52,49,51,32,+80,41,41,32,40,40,65,32,58,52,49,51,32,40,40,66,32,89,41,32,+40,40,66,32,40,66,32,40,40,67,39,32,66,41,32,40,85,32,95,52,+54,49,41,41,41,41,32,40,40,66,32,40,66,32,40,40,67,39,32,66,+41,32,40,66,39,32,40,85,32,95,52,54,49,41,41,41,41,41,32,40,+40,66,32,40,67,39,32,66,41,41,32,40,40,66,32,40,66,32,40,67,+39,32,66,41,41,41,32,40,66,32,40,66,32,95,52,54,50,41,41,41,+41,41,41,41,41,32,40,40,65,32,58,52,49,52,32,40,40,80,32,40,+40,80,32,95,52,54,49,41,32,95,52,54,49,41,41,32,40,40,67,32,+66,41,32,40,40,40,67,39,32,66,41,32,40,66,39,32,95,52,49,52,+41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,40,67,39,32,+66,41,41,32,40,40,66,32,40,66,32,80,41,41,32,95,52,54,50,41,+41,41,32,95,52,54,50,41,41,41,41,41,32,40,40,65,32,58,52,49,+53,32,40,40,80,32,40,40,67,32,40,40,80,32,95,52,54,49,41,32,+95,52,54,49,41,41,32,95,52,54,49,41,41,32,40,40,67,32,66,41,+32,40,40,40,67,39,32,66,41,32,40,66,39,32,40,66,39,32,95,52,+49,53,41,41,41,32,40,40,40,67,39,32,40,67,39,32,66,41,41,32,+40,40,66,32,40,66,32,40,67,39,32,40,67,39,32,66,41,41,41,41,+32,40,40,66,32,40,66,32,40,66,32,40,66,32,67,41,41,41,41,32,+40,40,40,67,39,32,66,41,32,40,40,66,32,40,67,39,32,66,41,41,+32,40,40,66,32,40,66,32,80,41,41,32,95,52,54,50,41,41,41,32,+95,52,54,50,41,41,41,41,32,95,52,54,50,41,41,41,41,41,32,40,+40,65,32,58,52,49,54,32,40,40,66,32,95,52,49,55,41,32,95,50,+48,50,41,41,32,40,40,65,32,58,52,49,55,32,40,40,66,32,89,41,+32,40,40,66,32,40,66,32,40,67,32,40,40,67,32,83,39,41,32,95,+52,55,55,41,41,41,41,32,40,40,66,32,40,66,32,40,40,67,39,32,+66,41,32,40,66,39,32,40,85,32,95,52,55,54,41,41,41,41,41,32,+40,40,66,32,40,67,39,32,66,41,41,32,40,40,66,32,40,66,32,40,+67,39,32,66,41,41,41,32,40,40,67,32,40,67,39,32,67,41,41,32,+95,52,55,54,41,41,41,41,41,41,41,32,40,40,65,32,58,52,49,56,+32,40,40,66,32,95,52,49,57,41,32,95,50,48,50,41,41,32,40,40,+65,32,58,52,49,57,32,40,40,66,32,89,41,32,40,40,66,32,40,66,+32,40,40,67,39,32,66,41,32,40,85,32,95,49,50,53,41,41,41,41,+32,40,40,66,32,40,66,32,40,40,67,39,32,66,41,32,40,66,39,32,+40,85,32,95,49,50,52,41,41,41,41,41,32,40,40,66,32,40,67,39,+32,66,41,41,32,40,40,66,32,40,66,32,40,67,39,32,66,41,41,41,+32,40,66,32,40,66,32,95,49,50,49,41,41,41,41,41,41,41,41,32,+40,40,65,32,58,52,50,48,32,40,40,66,32,95,52,50,49,41,32,95,+50,48,50,41,41,32,40,40,65,32,58,52,50,49,32,40,40,40,67,39,+32,40,67,39,32,66,41,41,32,40,40,40,67,39,32,66,41,32,95,52,+49,57,41,32,95,52,50,51,41,41,32,95,52,50,51,41,41,32,40,40,+65,32,58,52,50,50,32,40,40,40,83,39,32,40,83,39,32,80,41,41,+32,95,52,48,57,41,32,95,52,49,48,41,41,32,40,40,65,32,58,52,+50,51,32,40,40,89,32,40,40,66,32,40,83,32,80,41,41,32,40,40,+40,67,39,32,66,41,32,66,41,32,40,67,32,95,52,54,50,41,41,41,+41,32,95,52,54,49,41,41,32,40,40,65,32,58,52,50,52,32,40,40,+66,32,89,41,32,40,40,66,32,40,66,32,40,80,32,95,52,54,49,41,+41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,40,83,39,32,+66,41,41,32,40,82,32,95,52,54,49,41,41,41,32,40,40,67,39,32,+66,41,32,95,52,54,50,41,41,41,41,41,32,40,40,65,32,58,52,50,+53,32,40,40,66,32,89,41,32,40,40,66,32,40,66,32,40,80,32,95,+52,54,49,41,41,41,32,40,40,66,32,67,41,32,40,40,67,32,40,83,+39,32,83,39,41,41,32,95,52,54,50,41,41,41,41,41,32,40,40,65,+32,58,52,50,54,32,40,40,40,67,39,32,89,41,32,40,40,66,32,40,+66,32,40,40,83,39,32,80,41,32,40,40,40,67,39,32,80,41,32,95,+52,50,51,41,32,95,52,54,49,41,41,41,41,32,40,40,40,67,39,32,+66,41,32,40,40,66,32,40,83,39,32,83,41,41,32,40,40,40,67,39,+32,66,41,32,40,83,39,32,83,39,41,41,32,40,40,40,67,39,32,66,+41,32,40,66,39,32,40,40,66,32,80,41,32,95,52,50,51,41,41,41,+32,95,52,54,50,41,41,41,41,32,40,40,40,67,39,32,66,41,32,66,+41,32,40,67,32,95,52,54,50,41,41,41,41,41,32,95,52,54,49,41,+41,32,40,40,65,32,58,52,50,55,32,40,40,40,67,39,32,89,41,32,+40,40,66,32,40,66,32,40,40,83,39,32,80,41,32,40,40,40,67,39,+32,80,41,32,95,52,50,51,41,32,95,52,54,49,41,41,41,41,32,40,+40,40,67,39,32,66,41,32,40,40,66,32,40,83,39,32,83,41,41,32,+40,40,40,67,39,32,66,41,32,40,83,39,32,83,39,41,41,32,40,40,+66,32,40,66,32,80,41,41,32,40,40,66,32,40,66,32,95,52,50,51,+41,41,32,40,67,32,95,52,54,50,41,41,41,41,41,41,32,40,40,40,+67,39,32,66,41,32,66,41,32,40,67,32,95,52,54,50,41,41,41,41,+41,32,95,52,54,49,41,41,32,40,40,65,32,58,52,50,56,32,40,40,+80,32,40,95,50,52,32,34,104,101,97,100,34,41,41,32,75,41,41,32,+40,40,65,32,58,52,50,57,32,40,40,80,32,40,95,50,52,32,34,116,+97,105,108,34,41,41,32,65,41,41,32,40,40,65,32,58,52,51,48,32,+40,40,66,32,40,80,32,95,52,54,49,41,41,32,40,40,66,32,40,40,+67,39,32,66,41,32,95,52,54,50,41,41,32,40,40,66,32,89,41,32,+40,40,66,32,40,66,32,40,80,32,95,52,54,49,41,41,41,32,40,40,+40,67,39,32,66,41,32,40,66,39,32,40,66,39,32,95,52,54,50,41,+41,41,32,40,40,67,39,32,66,41,32,95,52,54,50,41,41,41,41,41,+41,41,32,40,40,65,32,58,52,51,49,32,40,40,66,32,40,66,32,95,+51,57,51,41,41,32,95,52,51,48,41,41,32,40,40,65,32,58,52,51,+50,32,40,40,66,32,95,52,51,52,41,32,95,50,48,50,41,41,32,40,+40,65,32,58,52,51,51,32,40,40,66,32,40,66,32,40,66,32,95,49,+50,50,41,41,41,32,95,52,51,50,41,41,32,40,40,65,32,58,52,51,+52,32,40,66,32,95,52,48,55,41,41,32,40,40,65,32,58,52,51,53,+32,40,40,66,32,89,41,32,40,40,66,32,40,66,32,40,80,32,95,52,+55,54,41,41,41,32,40,40,40,67,39,32,40,67,39,32,83,41,41,32,+40,67,39,32,67,39,41,41,32,95,52,55,55,41,41,41,41,32,40,40,+65,32,58,52,51,54,32,40,40,66,32,95,52,51,55,41,32,95,50,48,+50,41,41,32,40,40,65,32,58,52,51,55,32,40,40,40,67,39,32,40,+67,39,32,67,41,41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,+32,40,40,66,32,40,66,32,95,52,51,53,41,41,32,40,40,67,32,40,+67,39,32,95,50,54,51,41,41,32,95,53,54,53,41,41,41,32,95,52,+55,54,41,41,32,40,85,32,40,75,32,95,52,55,55,41,41,41,41,32,+40,40,65,32,58,52,51,56,32,40,40,66,32,95,52,51,57,41,32,95,+50,48,50,41,41,32,40,40,65,32,58,52,51,57,32,40,40,66,32,40,+40,83,39,32,66,41,32,95,52,54,51,41,41,32,40,40,40,83,39,32,+67,39,41,32,40,40,66,32,95,51,57,57,41,32,40,40,66,32,95,50,+54,54,41,32,95,52,52,50,41,41,41,32,95,52,52,53,41,41,41,32,+40,40,65,32,58,52,52,48,32,40,40,66,32,95,52,52,49,41,32,95,+50,48,50,41,41,32,40,40,65,32,58,52,52,49,32,40,40,66,32,40,+67,39,32,95,51,57,54,41,41,32,40,40,66,32,40,66,32,40,66,32,+95,49,50,50,41,41,41,32,40,40,66,32,67,41,32,95,52,51,52,41,+41,41,41,32,40,40,65,32,58,52,52,50,32,40,40,66,32,89,41,32,+40,40,66,32,40,66,32,40,66,32,40,80,32,95,52,54,49,41,41,41,+41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,67,41,41,41,+32,40,40,40,67,39,32,66,41,32,40,83,39,32,40,83,39,32,83,39,+41,41,41,32,40,66,32,40,40,67,39,32,66,41,32,95,52,54,50,41,+41,41,41,32,73,41,41,41,41,32,40,40,65,32,58,52,52,51,32,40,+40,66,32,89,41,32,40,40,66,32,40,66,32,40,66,32,40,80,32,95,+52,54,49,41,41,41,41,32,40,40,40,67,39,32,40,83,39,32,40,83,+39,32,67,41,41,41,32,40,40,40,67,39,32,66,41,32,40,83,39,32,+40,83,39,32,83,39,41,41,41,32,40,66,32,40,40,67,39,32,66,41,+32,95,52,54,50,41,41,41,41,32,73,41,41,41,41,32,40,40,65,32,+58,52,52,52,32,40,40,66,32,95,52,52,53,41,32,95,50,48,50,41,+41,32,40,40,65,32,58,52,52,53,32,40,40,66,32,89,41,32,40,40,+66,32,40,66,32,40,80,32,95,52,54,49,41,41,41,32,40,40,66,32,+40,66,32,40,40,83,39,32,66,41,32,95,52,54,50,41,41,41,32,40,+40,66,32,40,40,67,39,32,66,41,32,66,41,41,32,40,40,66,32,40,+66,32,95,51,57,54,41,41,32,40,66,32,40,66,32,95,49,50,50,41,+41,41,41,41,41,41,41,32,40,40,65,32,58,52,52,54,32,40,40,40,+67,39,32,66,41,32,95,52,48,57,41,32,95,52,52,55,41,41,32,40,+40,65,32,58,52,52,55,32,40,40,66,32,89,41,32,95,52,54,50,41,+41,32,40,40,65,32,58,52,52,56,32,40,40,66,32,95,52,52,57,41,+32,95,50,48,50,41,41,32,40,40,65,32,58,52,52,57,32,40,40,66,+32,95,51,57,57,41,32,40,40,66,32,95,50,54,54,41,32,95,52,52,+50,41,41,41,32,40,40,65,32,58,52,53,48,32,40,40,66,32,95,51,+57,57,41,32,40,40,66,32,95,50,54,54,41,32,95,52,52,51,41,41,+41,32,40,40,65,32,58,52,53,49,32,40,40,40,67,39,32,67,41,32,+40,40,66,32,40,83,32,40,40,67,32,40,95,52,57,55,32,95,50,56,+50,41,41,32,35,48,41,41,41,32,40,67,32,40,89,32,40,40,66,32,+40,66,32,40,80,32,40,95,50,52,32,34,33,33,58,32,101,109,112,116,+121,34,41,41,41,41,32,40,40,66,32,40,40,83,39,32,67,39,41,32,+40,40,67,32,40,95,50,48,50,32,95,50,56,49,41,41,32,35,48,41,+41,41,32,40,40,67,32,66,41,32,40,40,67,32,40,95,52,56,48,32,+95,50,55,55,41,41,32,35,49,41,41,41,41,41,41,41,41,32,40,95,+50,52,32,34,33,33,58,32,60,48,34,41,41,41,32,40,40,65,32,58,+52,53,50,32,40,40,40,83,39,32,40,83,39,32,80,41,41,32,95,51,+57,54,41,32,40,40,66,32,95,51,57,54,41,32,40,95,50,54,51,32,+95,49,50,50,41,41,41,41,32,40,40,65,32,58,52,53,51,32,40,40,+66,32,95,52,53,52,41,32,95,52,57,56,41,41,32,40,40,65,32,58,+52,53,52,32,40,40,66,32,89,41,32,40,40,66,32,40,66,32,40,80,+32,95,52,54,49,41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,+66,32,40,83,39,32,67,41,41,32,40,66,32,95,52,53,50,41,41,41,+32,40,40,40,83,39,32,66,41,32,40,66,39,32,40,67,39,32,95,52,+54,51,41,41,41,32,40,40,67,39,32,66,41,32,95,52,54,50,41,41,+41,41,41,41,32,40,40,65,32,58,52,53,53,32,40,40,80,32,40,95,+50,52,32,34,108,97,115,116,58,32,91,93,34,41,41,32,40,40,40,67,+39,32,83,41,32,85,41,32,40,90,32,40,90,32,95,52,53,53,41,41,+41,41,41,32,40,40,65,32,58,52,53,54,32,40,40,80,32,40,95,50,+52,32,34,105,110,105,116,58,32,91,93,34,41,41,32,40,40,66,32,40,+83,32,40,85,32,95,52,54,49,41,41,41,32,40,40,66,32,90,41,32,+40,40,66,32,90,41,32,40,40,40,67,39,32,66,41,32,95,52,54,50,+41,32,95,52,53,54,41,41,41,41,41,41,32,40,40,65,32,58,52,53,+55,32,40,40,66,32,95,52,53,56,41,32,95,50,48,50,41,41,32,40,+40,65,32,58,52,53,56,32,40,40,66,32,89,41,32,40,40,66,32,40,+66,32,40,80,32,95,49,50,52,41,41,41,32,40,40,66,32,40,67,39,+32,40,83,39,32,95,49,50,48,41,41,41,32,95,52,51,52,41,41,41,+41,32,40,40,65,32,58,52,53,57,32,40,40,66,32,89,41,32,40,40,+66,32,40,66,32,40,83,32,95,52,54,50,41,41,41,32,40,67,32,66,+41,41,41,41,32,40,40,65,32,58,52,54,48,32,40,40,66,32,89,41,+32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,83,32,40,85,32,+95,52,54,49,41,41,41,41,41,41,32,40,40,40,67,39,32,40,83,39,+32,40,83,39,32,40,83,39,32,67,41,41,41,41,32,40,40,40,67,39,+32,66,41,32,40,40,66,32,40,83,39,32,66,41,41,32,40,40,66,32,+40,66,32,40,67,39,32,67,39,41,41,41,32,40,40,66,32,40,66,32,+40,66,32,67,39,41,41,41,32,95,52,49,54,41,41,41,41,32,40,66,+32,40,66,32,40,40,67,39,32,66,41,32,95,52,54,50,41,41,41,41,+41,32,40,66,32,40,40,83,39,32,66,41,32,95,52,54,51,41,41,41,+41,41,41,32,40,40,65,32,58,52,54,49,32,75,41,32,40,40,65,32,+58,52,54,50,32,79,41,32,40,40,65,32,58,52,54,51,32,40,40,67,+32,83,41,32,40,40,66,32,40,40,67,39,32,66,41,32,95,52,54,50,+41,41,32,40,67,32,95,52,54,51,41,41,41,41,32,40,40,65,32,58,+52,54,52,32,40,40,40,83,39,32,95,50,48,49,41,32,40,40,66,32,+40,67,32,40,40,67,32,83,39,41,32,40,40,80,32,95,49,50,53,41,+32,40,75,32,95,49,50,52,41,41,41,41,41,32,40,40,66,32,40,40,+67,39,32,66,41,32,40,85,32,95,49,50,52,41,41,41,32,95,50,48,+50,41,41,41,32,40,40,66,32,95,50,48,53,41,32,95,52,54,52,41,+41,41,32,40,40,65,32,58,52,54,53,32,40,40,83,32,40,40,40,83,+39,32,95,49,53,56,56,41,32,40,40,66,32,40,66,32,40,80,32,40,+95,49,53,57,55,32,34,78,111,116,104,105,110,103,34,41,41,41,41,32,+40,40,66,32,40,40,67,39,32,66,41,32,40,40,66,32,95,49,53,57,+56,41,32,40,40,67,32,40,95,53,48,48,32,95,50,56,50,41,41,32,+35,49,49,41,41,41,41,32,40,40,66,32,40,66,32,40,95,50,54,51,+32,40,95,49,53,57,55,32,34,74,117,115,116,32,34,41,41,41,41,32,+40,40,67,32,95,49,53,56,57,41,32,35,49,49,41,41,41,41,41,32,+40,40,66,32,95,49,53,57,51,41,32,95,52,54,53,41,41,41,32,40,+40,66,32,95,49,53,57,52,41,32,95,52,54,53,41,41,41,32,40,40,+65,32,58,52,54,54,32,40,40,95,50,55,49,32,40,40,66,32,40,80,+32,95,52,55,54,41,41,32,40,66,32,95,52,55,55,41,41,41,32,40,+95,50,55,53,32,95,52,54,54,41,41,41,32,40,40,65,32,58,52,54,+55,32,40,40,40,40,40,95,49,49,32,95,52,54,54,41,32,95,52,55,+55,41,32,40,40,40,67,39,32,66,41,32,40,85,32,95,52,55,54,41,+41,32,40,40,40,67,39,32,66,41,32,40,85,32,95,52,55,54,41,41,+32,40,66,32,95,52,55,55,41,41,41,41,32,40,95,49,57,32,95,52,+54,55,41,41,32,40,95,50,48,32,95,52,54,55,41,41,41,32,40,40,+65,32,58,52,54,56,32,40,40,40,40,95,51,48,32,95,52,54,55,41,+32,40,85,32,95,52,55,54,41,41,32,40,95,51,54,32,95,52,54,56,+41,41,32,40,95,49,51,32,95,52,54,55,41,41,41,32,40,40,65,32,+58,52,54,57,32,40,40,95,51,57,32,95,52,54,56,41,32,40,75,32,+95,52,55,54,41,41,41,32,40,40,65,32,58,52,55,48,32,80,41,32,+40,40,65,32,58,52,55,49,32,40,40,67,32,80,41,32,73,41,41,32,+40,40,65,32,58,52,55,50,32,40,95,51,57,52,32,40,40,80,32,75,+41,32,40,40,67,32,79,41,32,75,41,41,41,41,32,40,40,65,32,58,+52,55,51,32,40,40,80,32,95,49,50,52,41,32,40,75,32,95,49,50,+53,41,41,41,32,40,40,65,32,58,52,55,52,32,40,40,66,32,89,41,+32,40,40,66,32,40,66,32,40,80,32,95,52,54,49,41,41,41,32,40,+40,40,67,39,32,40,83,39,32,67,41,41,32,40,67,39,32,83,39,41,+41,32,40,66,32,40,67,32,95,52,54,50,41,41,41,41,41,41,32,40,+40,65,32,58,52,55,53,32,40,40,80,32,95,52,54,49,41,32,40,40,+67,32,79,41,32,75,41,41,41,32,40,40,65,32,58,52,55,54,32,75,+41,32,40,40,65,32,58,52,55,55,32,40,90,32,85,41,41,32,40,40,+65,32,58,52,55,56,32,40,40,66,32,40,66,32,40,66,32,40,66,32,+40,66,32,40,66,32,67,41,41,41,41,41,41,32,40,40,66,32,40,66,+32,40,66,32,40,66,32,40,66,32,67,41,41,41,41,41,32,40,40,66,+32,40,66,32,40,66,32,40,66,32,67,41,41,41,41,32,40,40,66,32,+40,66,32,40,66,32,67,41,41,41,32,40,40,66,32,40,66,32,67,41,+41,32,80,41,41,41,41,41,41,32,40,40,65,32,58,52,55,57,32,40,+85,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,75,41,41,+41,41,41,41,41,32,40,40,65,32,58,52,56,48,32,40,85,32,40,75,+32,40,90,32,40,90,32,40,90,32,40,90,32,75,41,41,41,41,41,41,+41,32,40,40,65,32,58,52,56,49,32,40,85,32,40,75,32,40,75,32,+40,90,32,40,90,32,40,90,32,75,41,41,41,41,41,41,41,32,40,40,+65,32,58,52,56,50,32,40,85,32,40,75,32,40,75,32,40,75,32,40,+90,32,40,90,32,75,41,41,41,41,41,41,41,32,40,40,65,32,58,52,+56,51,32,40,85,32,40,75,32,40,75,32,40,75,32,40,75,32,40,90,+32,75,41,41,41,41,41,41,41,32,40,40,65,32,58,52,56,52,32,40,+85,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,75,41,41,+41,41,41,41,41,32,40,40,65,32,58,52,56,53,32,40,85,32,40,75,+32,40,75,32,40,75,32,40,75,32,40,75,32,65,41,41,41,41,41,41,+41,32,40,40,65,32,58,52,56,54,32,40,75,32,40,110,111,68,101,102,+97,117,108,116,32,34,78,117,109,46,43,34,41,41,41,32,40,40,65,32,+58,52,56,55,32,40,75,32,40,110,111,68,101,102,97,117,108,116,32,34,+78,117,109,46,45,34,41,41,41,32,40,40,65,32,58,52,56,56,32,40,+75,32,40,110,111,68,101,102,97,117,108,116,32,34,78,117,109,46,42,34,+41,41,41,32,40,40,65,32,58,52,56,57,32,40,40,83,32,95,52,56,+48,41,32,40,40,67,32,95,52,56,53,41,32,40,95,51,53,57,32,35,+48,41,41,41,41,32,40,40,65,32,58,52,57,48,32,40,75,32,40,110,+111,68,101,102,97,117,108,116,32,34,78,117,109,46,97,98,115,34,41,41,+41,32,40,40,65,32,58,52,57,49,32,40,75,32,40,110,111,68,101,102,+97,117,108,116,32,34,78,117,109,46,115,105,103,110,117,109,34,41,41,41,+32,40,40,65,32,58,52,57,50,32,40,75,32,40,110,111,68,101,102,97,+117,108,116,32,34,78,117,109,46,102,114,111,109,73,110,116,101,103,101,114,+34,41,41,41,32,40,40,65,32,58,52,57,51,32,40,40,66,32,67,41,+32,95,52,56,48,41,41,32,40,40,65,32,58,52,57,52,32,40,40,66,+32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,67,+41,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,+32,40,66,32,40,66,32,67,41,41,41,41,41,41,32,40,40,66,32,40,+66,32,40,66,32,40,66,32,40,66,32,67,41,41,41,41,41,32,40,40,+66,32,40,66,32,40,66,32,40,66,32,67,41,41,41,41,32,40,40,66,+32,40,66,32,40,66,32,67,41,41,41,32,40,40,66,32,40,66,32,67,+41,41,32,80,41,41,41,41,41,41,41,32,40,40,65,32,58,52,57,53,+32,40,85,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,+90,32,75,41,41,41,41,41,41,41,41,32,40,40,65,32,58,52,57,54,+32,40,85,32,40,75,32,40,90,32,40,90,32,40,90,32,40,90,32,40,+90,32,75,41,41,41,41,41,41,41,41,32,40,40,65,32,58,52,57,55,+32,40,85,32,40,75,32,40,75,32,40,90,32,40,90,32,40,90,32,40,+90,32,75,41,41,41,41,41,41,41,41,32,40,40,65,32,58,52,57,56,+32,40,85,32,40,75,32,40,75,32,40,75,32,40,90,32,40,90,32,40,+90,32,75,41,41,41,41,41,41,41,41,32,40,40,65,32,58,52,57,57,+32,40,85,32,40,75,32,40,75,32,40,75,32,40,75,32,40,90,32,40,+90,32,75,41,41,41,41,41,41,41,41,32,40,40,65,32,58,53,48,48,+32,40,85,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,+90,32,75,41,41,41,41,41,41,41,41,32,40,40,65,32,58,53,48,49,+32,40,85,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,+75,32,75,41,41,41,41,41,41,41,41,32,40,40,65,32,58,53,48,50,+32,40,85,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,+75,32,65,41,41,41,41,41,41,41,41,32,40,40,65,32,58,53,48,51,+32,40,40,40,83,39,32,40,83,39,32,83,41,41,32,40,40,40,67,39,+32,40,67,39,32,67,41,41,32,95,52,57,56,41,32,95,53,49,54,41,+41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,40,67,+39,32,40,67,39,32,67,41,41,32,40,40,66,32,67,41,32,95,52,57,+56,41,41,32,95,53,49,52,41,41,32,95,53,49,53,41,41,41,32,40,+40,65,32,58,53,48,52,32,40,40,40,67,39,32,40,67,39,32,67,41,+41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,66,32,+67,41,32,95,52,57,56,41,41,32,95,49,50,53,41,41,32,95,49,50,+52,41,41,32,40,40,65,32,58,53,48,53,32,40,75,32,40,110,111,68,+101,102,97,117,108,116,32,34,79,114,100,46,60,61,34,41,41,41,32,40,+40,65,32,58,53,48,54,32,40,40,40,67,39,32,40,67,39,32,67,41,+41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,95,52,57,56,+41,32,95,49,50,53,41,41,32,95,49,50,52,41,41,32,40,40,65,32,+58,53,48,55,32,95,52,57,56,41,32,40,40,65,32,58,53,48,56,32,+40,40,40,67,39,32,40,67,39,32,83,41,41,32,40,40,40,67,39,32,+40,83,39,32,67,41,41,32,95,52,57,56,41,32,73,41,41,32,73,41,+41,32,40,40,65,32,58,53,48,57,32,40,40,40,67,39,32,40,83,39,+32,67,41,41,32,40,40,40,67,39,32,40,67,39,32,83,41,41,32,95,+52,57,56,41,32,73,41,41,32,73,41,41,32,40,40,65,32,58,53,49,+48,32,40,40,95,50,48,49,32,40,40,40,67,39,32,83,41,32,40,40,+67,32,40,40,67,32,83,39,41,32,40,40,67,32,40,40,80,32,95,49,+50,53,41,32,95,49,50,52,41,41,32,95,49,50,52,41,41,41,32,40,+40,67,32,40,40,80,32,95,49,50,52,41,32,95,49,50,53,41,41,32,+95,49,50,52,41,41,41,32,40,40,67,32,40,40,80,32,95,49,50,52,+41,32,95,49,50,52,41,41,32,95,49,50,53,41,41,41,32,40,95,50,+48,53,32,95,53,49,48,41,41,41,32,40,40,65,32,58,53,49,49,32,+40,40,67,32,40,40,80,32,95,49,50,52,41,32,95,49,50,53,41,41,+32,95,49,50,52,41,41,32,40,40,65,32,58,53,49,50,32,40,40,40,+95,49,53,56,56,32,40,75,32,40,40,67,32,40,40,80,32,40,95,49,+53,57,55,32,34,76,84,34,41,41,32,40,95,49,53,57,55,32,34,69,+81,34,41,41,41,32,40,95,49,53,57,55,32,34,71,84,34,41,41,41,+41,32,40,95,49,53,57,51,32,95,53,49,50,41,41,32,40,95,49,53,+57,52,32,95,53,49,50,41,41,41,32,40,40,65,32,58,53,49,51,32,+40,40,95,49,50,54,32,95,53,49,52,41,32,95,53,49,54,41,41,32,+40,40,65,32,58,53,49,52,32,40,90,32,75,41,41,32,40,40,65,32,+58,53,49,53,32,40,75,32,75,41,41,32,40,40,65,32,58,53,49,54,+32,40,75,32,65,41,41,32,40,40,65,32,58,53,49,55,32,40,40,40,+83,39,32,95,50,48,49,41,32,40,40,66,32,40,67,32,66,41,41,32,+40,40,66,32,40,40,67,39,32,66,41,32,66,41,41,32,40,40,40,83,+39,32,40,67,39,32,66,41,41,32,40,40,66,32,40,66,32,40,67,39,+32,66,41,41,41,32,40,40,66,32,40,66,32,40,66,32,95,49,50,49,+41,41,41,32,95,50,48,50,41,41,41,32,95,50,48,50,41,41,41,41,+32,40,40,66,32,95,50,48,53,41,32,95,53,49,55,41,41,41,32,40,+40,65,32,58,53,49,56,32,40,40,83,32,40,40,83,32,40,40,83,32,+40,40,83,32,40,40,83,32,40,40,83,32,40,40,40,83,39,32,95,52,+57,52,41,32,40,40,66,32,95,53,49,55,41,32,40,40,66,32,40,85,+32,75,41,41,32,40,40,66,32,95,51,54,53,41,32,40,85,32,75,41,+41,41,41,41,32,40,40,66,32,95,53,48,51,41,32,40,40,66,32,95,+53,49,56,41,32,40,40,40,83,39,32,80,41,32,40,85,32,75,41,41,+32,40,85,32,65,41,41,41,41,41,41,32,40,40,66,32,40,67,32,66,+41,41,32,40,40,66,32,40,40,67,39,32,66,41,32,66,41,41,32,40,+40,40,83,39,32,40,67,39,32,66,41,41,32,40,40,66,32,66,39,41,+32,40,40,40,83,39,32,66,41,32,40,40,66,32,67,39,41,32,40,40,+66,32,95,52,57,55,41,32,40,85,32,65,41,41,41,41,32,40,40,66,+32,95,52,56,49,41,32,40,40,66,32,40,85,32,65,41,41,32,40,40,+66,32,95,51,54,53,41,32,40,85,32,75,41,41,41,41,41,41,41,32,+40,40,66,32,67,41,32,40,40,66,32,95,52,56,49,41,32,40,40,66,+32,40,85,32,65,41,41,32,40,40,66,32,95,51,54,53,41,32,40,85,+32,75,41,41,41,41,41,41,41,41,41,41,32,40,40,66,32,40,67,32,+66,41,41,32,40,40,66,32,40,40,67,39,32,66,41,32,66,41,41,32,+40,40,40,83,39,32,40,67,39,32,66,41,41,32,40,40,66,32,66,39,+41,32,40,40,40,83,39,32,66,41,32,40,40,66,32,67,39,41,32,40,+40,66,32,95,52,57,56,41,32,40,85,32,65,41,41,41,41,32,40,40,+66,32,95,52,56,49,41,32,40,40,66,32,40,85,32,65,41,41,32,40,+40,66,32,95,51,54,53,41,32,40,85,32,75,41,41,41,41,41,41,41,+32,40,40,66,32,67,41,32,40,40,66,32,95,52,56,49,41,32,40,40,+66,32,40,85,32,65,41,41,32,40,40,66,32,95,51,54,53,41,32,40,+85,32,75,41,41,41,41,41,41,41,41,41,41,32,40,40,66,32,40,67,+32,66,41,41,32,40,40,66,32,40,40,67,39,32,66,41,32,66,41,41,+32,40,40,40,83,39,32,40,67,39,32,66,41,41,32,40,40,66,32,66,+39,41,32,40,40,40,83,39,32,66,41,32,40,40,66,32,67,39,41,32,+40,40,66,32,95,52,57,57,41,32,40,85,32,65,41,41,41,41,32,40,+40,66,32,95,52,56,49,41,32,40,40,66,32,40,85,32,65,41,41,32,+40,40,66,32,95,51,54,53,41,32,40,85,32,75,41,41,41,41,41,41,+41,32,40,40,66,32,67,41,32,40,40,66,32,95,52,56,49,41,32,40,+40,66,32,40,85,32,65,41,41,32,40,40,66,32,95,51,54,53,41,32,+40,85,32,75,41,41,41,41,41,41,41,41,41,41,32,40,40,66,32,40,+67,32,66,41,41,32,40,40,66,32,40,40,67,39,32,66,41,32,66,41,+41,32,40,40,40,83,39,32,40,67,39,32,66,41,41,32,40,40,66,32,+66,39,41,32,40,40,40,83,39,32,66,41,32,40,40,66,32,67,39,41,+32,40,40,66,32,95,53,48,48,41,32,40,85,32,65,41,41,41,41,32,+40,40,66,32,95,52,56,49,41,32,40,40,66,32,40,85,32,65,41,41,+32,40,40,66,32,95,51,54,53,41,32,40,85,32,75,41,41,41,41,41,+41,41,32,40,40,66,32,67,41,32,40,40,66,32,95,52,56,49,41,32,+40,40,66,32,40,85,32,65,41,41,32,40,40,66,32,95,51,54,53,41,+32,40,85,32,75,41,41,41,41,41,41,41,41,41,41,32,40,40,66,32,+95,53,48,56,41,32,40,40,66,32,95,53,49,56,41,32,40,40,40,83,+39,32,80,41,32,40,85,32,75,41,41,32,40,85,32,65,41,41,41,41,+41,41,32,40,40,66,32,95,53,48,57,41,32,40,40,66,32,95,53,49,+56,41,32,40,40,40,83,39,32,80,41,32,40,85,32,75,41,41,32,40,+85,32,65,41,41,41,41,41,41,32,40,40,65,32,58,53,49,57,32,40,+40,83,32,40,40,83,32,40,40,83,32,40,40,83,32,40,40,83,32,40,+40,40,83,39,32,95,52,55,56,41,32,40,40,66,32,40,67,32,66,41,+41,32,40,40,66,32,40,40,67,39,32,66,41,32,66,41,41,32,40,40,+83,32,40,40,40,83,39,32,67,39,41,32,40,40,66,32,83,39,41,32,+40,40,66,32,67,39,41,32,40,40,66,32,83,39,41,32,95,53,50,53,+41,41,41,41,32,40,40,40,83,39,32,40,67,39,32,66,41,41,32,40,+40,66,32,66,39,41,32,40,40,40,83,39,32,66,41,32,40,40,66,32,+67,39,41,32,40,40,66,32,95,52,55,57,41,32,40,40,66,32,40,85,+32,65,41,41,32,95,51,54,53,41,41,41,41,32,40,40,66,32,95,52,+56,49,41,32,40,40,66,32,40,85,32,65,41,41,32,95,51,54,53,41,+41,41,41,41,32,40,40,66,32,67,41,32,40,40,66,32,95,52,56,49,+41,32,40,40,66,32,40,85,32,65,41,41,32,95,51,54,53,41,41,41,+41,41,41,32,40,40,66,32,95,52,56,49,41,32,40,40,66,32,40,85,+32,65,41,41,32,95,51,54,53,41,41,41,41,41,41,32,40,40,66,32,+40,67,32,66,41,41,32,40,40,66,32,40,40,67,39,32,66,41,32,66,+41,41,32,40,40,83,32,40,40,40,83,39,32,67,39,41,32,40,40,66,+32,83,39,41,32,40,40,66,32,67,39,41,32,40,40,66,32,83,39,41,+32,95,53,50,53,41,41,41,41,32,40,40,40,83,39,32,40,67,39,32,+66,41,41,32,40,40,66,32,66,39,41,32,40,40,40,83,39,32,66,41,+32,40,40,66,32,67,39,41,32,40,40,66,32,95,52,56,48,41,32,40,+40,66,32,40,85,32,65,41,41,32,95,51,54,53,41,41,41,41,32,40,+40,66,32,95,52,56,49,41,32,40,40,66,32,40,85,32,65,41,41,32,+95,51,54,53,41,41,41,41,41,32,40,40,66,32,67,41,32,40,40,66,+32,95,52,56,49,41,32,40,40,66,32,40,85,32,65,41,41,32,95,51,+54,53,41,41,41,41,41,41,32,40,40,66,32,95,52,56,49,41,32,40,+40,66,32,40,85,32,65,41,41,32,95,51,54,53,41,41,41,41,41,41,+41,32,40,40,66,32,40,67,32,66,41,41,32,40,40,66,32,40,40,67,+39,32,66,41,32,66,41,41,32,40,40,40,83,39,32,40,67,39,32,66,+41,41,32,40,40,66,32,40,66,32,40,67,39,32,66,41,41,41,32,40,+40,40,83,39,32,66,41,32,40,66,39,32,95,53,50,53,41,41,32,40,+40,66,32,95,52,56,49,41,32,40,40,66,32,40,85,32,65,41,41,32,+95,51,54,53,41,41,41,41,41,32,40,40,66,32,95,52,56,49,41,32,+40,40,66,32,40,85,32,65,41,41,32,95,51,54,53,41,41,41,41,41,+41,41,32,40,40,66,32,85,41,32,40,40,66,32,40,66,32,95,53,50,+56,41,41,32,40,40,66,32,95,52,56,50,41,32,40,40,66,32,40,85,+32,65,41,41,32,95,51,54,53,41,41,41,41,41,41,32,40,40,66,32,+85,41,32,40,40,66,32,40,66,32,95,53,50,56,41,41,32,40,40,66,+32,95,52,56,51,41,32,40,40,66,32,40,85,32,65,41,41,32,95,51,+54,53,41,41,41,41,41,41,32,40,40,66,32,85,41,32,40,40,66,32,+90,41,32,40,40,40,83,39,32,40,67,39,32,95,53,50,56,41,41,32,+40,40,66,32,95,52,56,52,41,32,40,40,66,32,40,85,32,65,41,41,+32,95,51,54,53,41,41,41,32,40,40,40,67,39,32,95,52,56,53,41,+32,40,40,66,32,40,85,32,65,41,41,32,95,51,54,53,41,41,32,40,+95,51,53,57,32,35,49,41,41,41,41,41,41,41,32,40,40,40,83,39,+32,40,67,39,32,95,53,50,56,41,41,32,40,40,66,32,95,52,56,53,+41,32,40,40,66,32,40,85,32,65,41,41,32,95,51,54,53,41,41,41,+32,40,40,40,67,39,32,95,52,56,53,41,32,40,40,66,32,40,85,32,+65,41,41,32,95,51,54,53,41,41,32,40,95,51,53,57,32,35,49,41,+41,41,41,41,32,40,40,65,32,58,53,50,48,32,40,40,83,32,40,40,+83,32,40,40,40,83,39,32,95,50,53,50,41,32,40,40,66,32,95,53,+49,57,41,32,40,85,32,75,41,41,41,32,40,40,66,32,40,67,32,66,+41,41,32,40,40,66,32,40,40,67,39,32,66,41,32,66,41,41,32,40,+40,40,83,39,32,40,67,39,32,66,41,41,32,40,40,66,32,66,39,41,+32,40,40,40,83,39,32,66,41,32,40,40,66,32,67,39,41,32,40,40,+66,32,95,53,50,52,41,32,40,85,32,75,41,41,41,41,32,40,40,66,+32,95,52,56,49,41,32,40,40,66,32,40,85,32,65,41,41,32,40,40,+66,32,95,51,54,53,41,32,40,85,32,75,41,41,41,41,41,41,41,32,+40,40,66,32,95,52,56,49,41,32,40,40,66,32,40,85,32,65,41,41,+32,40,40,66,32,95,51,54,53,41,32,40,85,32,75,41,41,41,41,41,+41,41,41,41,32,40,40,66,32,85,41,32,40,40,40,67,39,32,40,67,+39,32,67,41,41,32,40,40,40,83,39,32,66,41,32,40,40,66,32,83,+41,32,40,40,40,83,39,32,67,41,32,40,40,66,32,95,50,48,50,41,+32,40,40,66,32,40,85,32,75,41,41,32,40,40,66,32,95,51,54,53,+41,32,40,85,32,75,41,41,41,41,41,32,40,40,40,67,39,32,95,52,+56,53,41,32,40,40,66,32,40,85,32,65,41,41,32,40,40,66,32,95,+51,54,53,41,32,40,85,32,75,41,41,41,41,32,40,95,51,53,57,32,+35,48,41,41,41,41,41,32,40,40,40,83,39,32,83,41,32,40,40,40,+67,39,32,40,83,39,32,83,39,41,41,32,40,40,40,83,39,32,67,41,+32,40,40,66,32,95,52,57,55,41,32,40,85,32,65,41,41,41,32,40,+40,40,67,39,32,95,52,56,53,41,32,40,40,66,32,40,85,32,65,41,+41,32,40,40,66,32,95,51,54,53,41,32,40,85,32,75,41,41,41,41,+32,40,95,51,53,57,32,35,48,41,41,41,41,32,40,67,32,95,53,50,+56,41,41,41,32,40,40,40,83,39,32,66,41,32,40,40,66,32,40,67,+39,32,95,53,50,56,41,41,32,40,40,66,32,95,52,56,50,41,32,40,+40,66,32,40,85,32,65,41,41,32,40,40,66,32,95,51,54,53,41,32,+40,85,32,75,41,41,41,41,41,41,32,40,40,66,32,95,52,56,50,41,+32,40,40,66,32,40,85,32,65,41,41,32,40,40,66,32,95,51,54,53,+41,32,40,85,32,75,41,41,41,41,41,41,41,41,32,40,95,50,52,32,+34,68,97,116,97,46,82,97,116,105,111,46,114,101,99,105,112,58,32,100,+105,118,105,115,105,111,110,32,98,121,32,48,34,41,41,41,41,41,32,40,+40,66,32,85,41,32,40,40,40,83,39,32,40,67,39,32,66,41,41,32,+40,40,40,83,39,32,66,41,32,40,40,66,32,95,53,50,52,41,32,40,+85,32,75,41,41,41,32,40,40,66,32,95,52,56,53,41,32,40,40,66,+32,40,85,32,65,41,41,32,40,40,66,32,95,51,54,53,41,32,40,85,+32,75,41,41,41,41,41,41,32,40,40,66,32,95,52,56,53,41,32,40,+40,66,32,40,85,32,65,41,41,32,40,40,66,32,95,51,54,53,41,32,+40,85,32,75,41,41,41,41,41,41,41,41,32,40,40,65,32,58,53,50,+49,32,40,40,83,32,40,40,40,83,39,32,95,49,53,56,56,41,32,40,+40,66,32,40,66,32,85,41,41,32,40,40,66,32,40,40,67,39,32,66,+41,32,40,66,39,32,40,40,66,32,95,50,54,49,41,32,40,40,66,32,+95,49,53,57,56,41,32,40,40,67,32,40,95,52,57,57,32,95,50,56,+50,41,41,32,35,55,41,41,41,41,41,41,32,40,40,40,83,39,32,40,+67,39,32,66,41,41,32,40,40,66,32,40,66,32,95,50,54,51,41,41,+32,40,40,67,32,95,49,53,56,57,41,32,35,56,41,41,41,32,40,40,+66,32,40,66,32,40,95,50,54,51,32,40,95,49,53,57,55,32,34,32,+37,32,34,41,41,41,41,32,40,40,67,32,95,49,53,56,57,41,32,35,+56,41,41,41,41,41,41,32,40,40,66,32,95,49,53,57,51,41,32,95,+53,50,49,41,41,41,32,40,40,66,32,95,49,53,57,52,41,32,95,53,+50,49,41,41,41,32,40,40,65,32,58,53,50,50,32,40,40,95,53,50,+56,32,40,40,95,52,56,53,32,95,51,48,56,41,32,40,95,51,53,57,+32,35,49,41,41,41,32,40,40,95,52,56,53,32,95,51,48,56,41,32,+40,95,51,53,57,32,35,48,41,41,41,41,32,40,40,65,32,58,53,50,+51,32,40,40,95,53,50,56,32,40,40,95,52,56,53,32,95,51,48,56,+41,32,40,95,51,53,57,32,35,48,41,41,41,32,40,40,95,52,56,53,+32,95,51,48,56,41,32,40,95,51,53,57,32,35,48,41,41,41,41,32,+40,40,65,32,58,53,50,52,32,40,40,83,32,40,40,40,83,39,32,67,+39,41,32,40,40,66,32,83,39,41,32,95,53,50,53,41,41,32,40,40,+40,83,39,32,40,67,39,32,66,41,41,32,40,40,66,32,95,52,56,49,+41,32,40,40,66,32,40,85,32,65,41,41,32,95,51,54,53,41,41,41,+32,40,40,66,32,95,52,56,52,41,32,40,40,66,32,40,85,32,65,41,+41,32,95,51,54,53,41,41,41,41,41,32,40,40,66,32,95,52,56,51,+41,32,40,40,66,32,40,85,32,65,41,41,32,95,51,54,53,41,41,41,+41,32,40,40,65,32,58,53,50,53,32,40,40,40,67,39,32,40,67,39,+32,67,41,41,32,40,40,40,83,39,32,66,41,32,40,40,66,32,83,41,+32,40,40,40,83,39,32,67,41,32,40,40,66,32,95,50,48,50,41,32,+40,40,66,32,40,85,32,75,41,41,32,95,51,54,53,41,41,41,32,40,+40,40,67,39,32,95,52,56,53,41,32,40,40,66,32,40,85,32,65,41,+41,32,95,51,54,53,41,41,32,40,95,51,53,57,32,35,48,41,41,41,+41,41,32,40,40,40,83,39,32,83,41,32,40,40,40,83,39,32,40,67,+39,32,83,39,41,41,32,40,40,66,32,40,66,32,40,83,39,32,95,53,+50,56,41,41,41,32,95,51,54,54,41,41,32,95,51,54,54,41,41,32,+95,51,56,48,41,41,41,32,40,95,50,52,32,34,68,97,116,97,46,82,+97,116,105,111,46,37,58,32,48,32,100,101,110,111,109,105,110,97,116,111,+114,34,41,41,41,32,40,40,65,32,58,53,50,54,32,40,85,32,75,41,+41,32,40,40,65,32,58,53,50,55,32,40,85,32,65,41,41,32,40,40,+65,32,58,53,50,56,32,40,40,40,83,39,32,66,41,32,115,101,113,41,+32,40,40,66,32,40,83,32,115,101,113,41,41,32,80,41,41,41,32,40,+40,65,32,58,53,50,57,32,40,40,67,32,95,53,50,56,41,32,40,95,+51,53,57,32,35,49,41,41,41,32,40,40,65,32,58,53,51,48,32,95,+53,50,56,41,32,40,40,65,32,58,53,51,49,32,85,41,32,40,40,65,+32,58,53,51,50,32,40,85,32,73,41,41,32,40,40,65,32,58,53,51,+51,32,40,75,32,40,110,111,68,101,102,97,117,108,116,32,34,82,101,97,+108,46,116,111,82,97,116,105,111,110,97,108,34,41,41,41,32,40,40,65,+32,58,53,51,52,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,+66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,+40,66,32,40,66,32,40,66,32,67,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,66,+32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,+66,32,40,66,32,67,41,41,41,41,41,41,41,41,41,41,41,41,41,32,+40,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,+66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,67,41,41,+41,41,41,41,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,+32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,+66,32,40,66,32,67,41,41,41,41,41,41,41,41,41,41,41,32,40,40,+66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,+40,66,32,40,66,32,40,66,32,67,41,41,41,41,41,41,41,41,41,41,+32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,+40,66,32,40,66,32,40,66,32,67,41,41,41,41,41,41,41,41,41,32,+40,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,+66,32,40,66,32,67,41,41,41,41,41,41,41,41,32,40,40,66,32,40,+66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,67,41,41,+41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,+66,32,40,66,32,67,41,41,41,41,41,41,32,40,40,66,32,40,66,32,+40,66,32,40,66,32,40,66,32,67,41,41,41,41,41,32,40,40,66,32,+40,66,32,40,66,32,40,66,32,67,41,41,41,41,32,40,40,66,32,40,+66,32,40,66,32,67,41,41,41,32,40,40,66,32,40,66,32,67,41,41,+32,80,41,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,65,+32,58,53,51,53,32,40,85,32,40,90,32,40,90,32,40,90,32,40,90,+32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,+90,32,40,90,32,40,90,32,75,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,32,40,40,65,32,58,53,51,54,32,40,85,32,40,75,32,+40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,+32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,75,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,65,32,58,53,51,+55,32,40,85,32,40,75,32,40,75,32,40,90,32,40,90,32,40,90,32,+40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,+32,40,90,32,75,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+32,40,40,65,32,58,53,51,56,32,40,85,32,40,75,32,40,75,32,40,+75,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,+40,90,32,40,90,32,40,90,32,40,90,32,75,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,32,40,40,65,32,58,53,51,57,32,40,85,+32,40,75,32,40,75,32,40,75,32,40,75,32,40,90,32,40,90,32,40,+90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,+75,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,65,+32,58,53,52,48,32,40,85,32,40,75,32,40,75,32,40,75,32,40,75,+32,40,75,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,+90,32,40,90,32,40,90,32,75,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,32,40,40,65,32,58,53,52,49,32,40,85,32,40,75,32,+40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,90,32,40,90,+32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,75,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,65,32,58,53,52,+50,32,40,85,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,+40,75,32,40,75,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,+32,40,90,32,75,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+32,40,40,65,32,58,53,52,51,32,40,85,32,40,75,32,40,75,32,40,+75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,90,32,+40,90,32,40,90,32,40,90,32,40,90,32,75,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,32,40,40,65,32,58,53,52,52,32,40,85,+32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,+75,32,40,75,32,40,75,32,40,90,32,40,90,32,40,90,32,40,90,32,+75,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,65,+32,58,53,52,53,32,40,85,32,40,75,32,40,75,32,40,75,32,40,75,+32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,+90,32,40,90,32,40,90,32,75,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,32,40,40,65,32,58,53,52,54,32,40,85,32,40,75,32,+40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,+32,40,75,32,40,75,32,40,75,32,40,90,32,40,90,32,75,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,65,32,58,53,52,+55,32,40,85,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,+40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,+32,40,90,32,75,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+32,40,40,65,32,58,53,52,56,32,40,85,32,40,75,32,40,75,32,40,+75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,+40,75,32,40,75,32,40,75,32,40,75,32,75,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,32,40,40,65,32,58,53,52,57,32,40,85,+32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,+75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,+65,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,65,+32,58,53,53,48,32,40,75,32,40,110,111,68,101,102,97,117,108,116,32,+34,82,101,97,108,70,108,111,97,116,46,102,108,111,97,116,82,97,100,105,+120,34,41,41,41,32,40,40,65,32,58,53,53,49,32,40,75,32,40,110,+111,68,101,102,97,117,108,116,32,34,82,101,97,108,70,108,111,97,116,46,+102,108,111,97,116,68,105,103,105,116,115,34,41,41,41,32,40,40,65,32,+58,53,53,50,32,40,75,32,40,110,111,68,101,102,97,117,108,116,32,34,+82,101,97,108,70,108,111,97,116,46,102,108,111,97,116,82,97,110,103,101,+34,41,41,41,32,40,40,65,32,58,53,53,51,32,40,75,32,40,110,111,+68,101,102,97,117,108,116,32,34,82,101,97,108,70,108,111,97,116,46,100,+101,99,111,100,101,70,108,111,97,116,34,41,41,41,32,40,40,65,32,58,+53,53,52,32,40,75,32,40,110,111,68,101,102,97,117,108,116,32,34,82,+101,97,108,70,108,111,97,116,46,101,110,99,111,100,101,70,108,111,97,116,+34,41,41,41,32,40,40,65,32,58,53,53,53,32,40,40,40,83,39,32,+83,41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,66,+32,40,66,32,40,83,32,40,40,40,67,39,32,40,95,50,48,50,32,95,+51,48,53,41,41,32,40,85,32,75,41,41,32,40,95,51,53,57,32,35,+48,41,41,41,41,41,32,40,40,66,32,40,66,32,40,40,67,39,32,40,+95,52,55,57,32,95,50,55,55,41,41,32,40,85,32,65,41,41,41,41,+32,95,53,51,55,41,41,41,32,35,48,41,41,32,95,53,51,57,41,41,+32,40,40,65,32,58,53,53,54,32,40,40,83,32,40,40,40,83,39,32,+83,39,41,32,95,53,52,48,41,32,40,40,40,67,39,32,67,41,32,95,+53,51,57,41,32,75,41,41,41,32,40,40,66,32,40,66,32,40,95,52,+56,50,32,95,50,55,55,41,41,41,32,95,53,51,55,41,41,41,32,40,+40,65,32,58,53,53,55,32,40,40,40,67,39,32,67,41,32,40,40,66,+32,40,40,83,39,32,83,39,41,32,40,40,67,32,61,61,41,32,35,48,+41,41,41,32,40,40,40,83,39,32,40,67,39,32,83,41,41,32,40,40,+40,83,39,32,40,67,39,32,40,83,39,32,67,41,41,41,32,40,40,40,+67,39,32,40,67,39,32,83,41,41,32,40,40,40,83,39,32,66,41,32,+40,40,66,32,40,83,39,32,67,39,41,41,32,40,40,66,32,40,66,32,+67,39,41,41,32,40,40,40,83,39,32,40,83,39,32,95,49,50,48,41,+41,32,40,40,40,83,39,32,67,41,32,40,40,66,32,95,50,48,50,41,+32,40,40,66,32,95,52,57,53,41,32,40,40,66,32,40,85,32,40,75,+32,75,41,41,41,32,95,53,51,53,41,41,41,41,32,40,40,40,67,39,+32,95,52,56,53,41,32,40,40,66,32,95,50,53,51,41,32,40,40,66,+32,40,85,32,40,90,32,75,41,41,41,32,95,53,51,53,41,41,41,32,+40,95,51,53,57,32,35,48,41,41,41,41,32,40,40,40,83,39,32,40,+83,39,32,95,49,50,48,41,41,32,95,53,52,52,41,32,95,53,52,53,+41,41,41,41,41,32,40,40,40,83,39,32,66,41,32,40,66,39,32,40,+66,39,32,40,40,40,67,39,32,83,39,41,32,95,53,52,48,41,32,40,+85,32,75,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,+66,32,40,40,67,39,32,40,95,52,55,57,32,95,50,55,55,41,41,32,+40,85,32,65,41,41,41,41,41,41,32,40,40,66,32,40,67,39,32,40,+67,39,32,95,53,54,52,41,41,41,32,40,40,66,32,40,66,32,40,40,+67,39,32,40,95,52,55,57,32,95,50,55,55,41,41,32,40,40,40,83,+39,32,40,95,52,56,48,32,95,50,55,55,41,41,32,40,85,32,65,41,+41,32,40,85,32,75,41,41,41,41,41,32,40,40,66,32,40,66,32,40,+40,95,52,56,49,32,95,50,55,55,41,32,40,40,95,52,56,53,32,95,+50,55,55,41,32,40,95,51,53,57,32,35,52,41,41,41,41,41,32,95,+53,51,55,41,41,41,41,41,41,41,32,73,41,41,32,95,53,51,57,41,+41,32,95,53,51,56,41,41,41,32,73,41,41,32,40,40,65,32,58,53,+53,56,32,40,75,32,40,110,111,68,101,102,97,117,108,116,32,34,82,101,+97,108,70,108,111,97,116,46,105,115,78,97,78,34,41,41,41,32,40,40,+65,32,58,53,53,57,32,40,75,32,40,110,111,68,101,102,97,117,108,116,+32,34,82,101,97,108,70,108,111,97,116,46,105,115,73,110,102,105,110,105,+116,101,34,41,41,41,32,40,40,65,32,58,53,54,48,32,40,75,32,40,+110,111,68,101,102,97,117,108,116,32,34,82,101,97,108,70,108,111,97,116,+46,105,115,68,101,110,111,114,109,97,108,105,122,101,100,34,41,41,41,32,+40,40,65,32,58,53,54,49,32,40,75,32,40,110,111,68,101,102,97,117,+108,116,32,34,82,101,97,108,70,108,111,97,116,46,105,115,78,101,103,97,+116,105,118,101,90,101,114,111,34,41,41,41,32,40,40,65,32,58,53,54,+50,32,40,75,32,40,110,111,68,101,102,97,117,108,116,32,34,82,101,97,+108,70,108,111,97,116,46,105,115,73,69,69,69,34,41,41,41,32,40,40,+65,32,58,53,54,51,32,40,40,40,83,39,32,40,83,39,32,83,41,41,+32,40,40,40,83,39,32,66,41,32,40,40,66,32,83,41,32,40,40,40,+83,39,32,67,41,32,40,40,66,32,95,52,57,57,41,32,40,40,66,32,+40,85,32,40,75,32,75,41,41,41,32,95,53,51,53,41,41,41,32,40,+40,40,67,39,32,95,52,56,53,41,32,40,40,66,32,95,50,53,51,41,+32,40,40,66,32,40,85,32,40,90,32,75,41,41,41,32,95,53,51,53,+41,41,41,32,40,95,51,53,57,32,35,48,41,41,41,41,41,32,40,40,+40,83,39,32,40,67,39,32,67,41,41,32,40,40,40,83,39,32,40,83,+39,32,83,41,41,32,40,40,40,83,39,32,66,41,32,40,40,66,32,40,+67,39,32,95,49,50,49,41,41,32,40,40,40,83,39,32,67,41,32,40,+40,66,32,95,50,48,50,41,32,40,40,66,32,95,52,57,53,41,32,40,+40,66,32,40,85,32,40,75,32,75,41,41,41,32,95,53,51,53,41,41,+41,41,32,40,40,40,67,39,32,95,52,56,53,41,32,40,40,66,32,95,+50,53,51,41,32,40,40,66,32,40,85,32,40,90,32,75,41,41,41,32,+95,53,51,53,41,41,41,32,40,95,51,53,57,32,35,48,41,41,41,41,+41,32,40,40,40,83,39,32,67,41,32,40,40,66,32,95,52,57,57,41,+32,40,40,66,32,40,85,32,40,75,32,75,41,41,41,32,95,53,51,53,+41,41,41,32,40,40,40,67,39,32,95,52,56,53,41,32,40,40,66,32,+95,50,53,51,41,32,40,40,66,32,40,85,32,40,90,32,75,41,41,41,+32,95,53,51,53,41,41,41,32,40,95,51,53,57,32,35,48,41,41,41,+41,41,32,40,40,40,83,39,32,40,83,39,32,83,41,41,32,40,40,40,+83,39,32,40,83,39,32,83,41,41,32,40,40,40,83,39,32,66,41,32,+40,40,66,32,40,67,39,32,95,49,50,49,41,41,32,40,40,40,83,39,+32,67,41,32,40,40,66,32,95,52,57,55,41,32,40,40,66,32,40,85,+32,40,75,32,75,41,41,41,32,95,53,51,53,41,41,41,32,40,40,40,+67,39,32,95,52,56,53,41,32,40,40,66,32,95,50,53,51,41,32,40,+40,66,32,40,85,32,40,90,32,75,41,41,41,32,95,53,51,53,41,41,+41,32,40,95,51,53,57,32,35,48,41,41,41,41,41,32,40,40,40,83,+39,32,67,41,32,40,40,66,32,95,52,57,57,41,32,40,40,66,32,40,+85,32,40,75,32,75,41,41,41,32,95,53,51,53,41,41,41,32,40,40,+40,67,39,32,95,52,56,53,41,32,40,40,66,32,95,50,53,51,41,32,+40,40,66,32,40,85,32,40,90,32,75,41,41,41,32,95,53,51,53,41,+41,41,32,40,95,51,53,57,32,35,48,41,41,41,41,41,32,40,40,40,+83,39,32,40,83,39,32,83,41,41,32,40,40,40,83,39,32,40,83,39,+32,83,41,41,32,40,40,40,83,39,32,40,83,39,32,40,83,39,32,95,+49,50,48,41,41,41,32,40,40,40,83,39,32,66,41,32,40,40,66,32,+40,67,39,32,95,49,50,49,41,41,32,40,40,40,83,39,32,67,41,32,+40,40,66,32,95,52,57,56,41,32,40,40,66,32,40,85,32,40,75,32,+75,41,41,41,32,95,53,51,53,41,41,41,32,40,40,40,67,39,32,95,+52,56,53,41,32,40,40,66,32,95,50,53,51,41,32,40,40,66,32,40,+85,32,40,90,32,75,41,41,41,32,95,53,51,53,41,41,41,32,40,95,+51,53,57,32,35,48,41,41,41,41,41,32,40,40,40,83,39,32,67,41,+32,40,40,66,32,95,52,57,55,41,32,40,40,66,32,40,85,32,40,75,+32,75,41,41,41,32,95,53,51,53,41,41,41,32,40,40,40,67,39,32,+95,52,56,53,41,32,40,40,66,32,95,50,53,51,41,32,40,40,66,32,+40,85,32,40,90,32,75,41,41,41,32,95,53,51,53,41,41,41,32,40,+95,51,53,57,32,35,48,41,41,41,41,41,32,40,40,40,83,39,32,40,+83,39,32,40,83,39,32,95,49,50,48,41,41,41,32,40,40,40,83,39,+32,66,41,32,40,40,66,32,40,67,39,32,95,49,50,49,41,41,32,40,+40,40,83,39,32,67,41,32,40,40,66,32,95,52,57,55,41,32,40,40,+66,32,40,85,32,40,75,32,75,41,41,41,32,95,53,51,53,41,41,41,+32,40,40,40,67,39,32,95,52,56,53,41,32,40,40,66,32,95,50,53,+51,41,32,40,40,66,32,40,85,32,40,90,32,75,41,41,41,32,95,53,+51,53,41,41,41,32,40,95,51,53,57,32,35,48,41,41,41,41,41,32,+95,53,52,55,41,41,32,40,40,40,83,39,32,66,41,32,40,40,66,32,+40,67,39,32,95,49,50,49,41,41,32,95,53,52,55,41,41,32,95,53,+52,55,41,41,41,41,32,40,40,40,83,39,32,40,67,39,32,67,41,41,+32,40,40,40,83,39,32,83,41,32,40,40,40,83,39,32,40,67,39,32,+83,39,41,41,32,40,40,66,32,40,66,32,95,49,50,49,41,41,32,40,+40,40,83,39,32,67,41,32,40,40,66,32,95,50,48,50,41,32,40,40,+66,32,95,52,57,53,41,32,40,40,66,32,40,85,32,40,75,32,75,41,+41,41,32,95,53,51,53,41,41,41,41,32,40,40,40,67,39,32,95,52,+56,53,41,32,40,40,66,32,95,50,53,51,41,32,40,40,66,32,40,85,+32,40,90,32,75,41,41,41,32,95,53,51,53,41,41,41,32,40,95,51,+53,57,32,35,48,41,41,41,41,41,32,40,40,40,83,39,32,40,83,39,+32,95,49,50,48,41,41,32,40,40,40,83,39,32,67,41,32,40,40,66,+32,95,52,57,55,41,32,40,40,66,32,40,85,32,40,75,32,75,41,41,+41,32,95,53,51,53,41,41,41,32,40,40,40,67,39,32,95,52,56,53,+41,32,40,40,66,32,95,50,53,51,41,32,40,40,66,32,40,85,32,40,+90,32,75,41,41,41,32,95,53,51,53,41,41,41,32,40,95,51,53,57,+32,35,48,41,41,41,41,32,95,53,52,55,41,41,41,32,40,40,40,67,+39,32,40,83,39,32,67,41,41,32,40,40,40,83,39,32,40,83,39,32,+83,41,41,32,40,40,40,83,39,32,66,41,32,40,40,66,32,40,67,39,+32,95,49,50,49,41,41,32,40,40,40,83,39,32,67,41,32,40,40,66,+32,95,50,48,50,41,32,40,40,66,32,95,52,57,53,41,32,40,40,66,+32,40,85,32,40,75,32,75,41,41,41,32,95,53,51,53,41,41,41,41,+32,40,40,40,67,39,32,95,52,56,53,41,32,40,40,66,32,95,50,53,+51,41,32,40,40,66,32,40,85,32,40,90,32,75,41,41,41,32,95,53,+51,53,41,41,41,32,40,95,51,53,57,32,35,48,41,41,41,41,41,32,+40,40,40,83,39,32,67,41,32,40,40,66,32,95,50,48,50,41,32,40,+40,66,32,95,52,57,53,41,32,40,40,66,32,40,85,32,40,75,32,75,+41,41,41,32,95,53,51,53,41,41,41,41,32,40,40,40,67,39,32,95,+52,56,53,41,32,40,40,66,32,95,50,53,51,41,32,40,40,66,32,40,+85,32,40,90,32,75,41,41,41,32,95,53,51,53,41,41,41,32,40,95,+51,53,57,32,35,48,41,41,41,41,41,32,40,40,66,32,67,41,32,40,+40,66,32,95,52,55,57,41,32,40,40,66,32,95,50,53,51,41,32,40,+40,66,32,40,85,32,40,90,32,75,41,41,41,32,95,53,51,53,41,41,+41,41,41,41,32,73,41,41,41,32,40,40,66,32,95,50,48,56,41,32,+40,40,66,32,40,85,32,40,75,32,65,41,41,41,32,95,53,51,53,41,+41,41,41,41,32,40,40,40,83,39,32,66,41,32,40,66,39,32,40,40,+66,32,95,52,56,50,41,32,40,40,66,32,95,50,53,51,41,32,40,40,+66,32,40,85,32,40,90,32,75,41,41,41,32,95,53,51,53,41,41,41,+41,41,32,40,40,40,83,39,32,66,41,32,95,53,52,57,41,32,40,40,+66,32,95,52,56,50,41,32,40,40,66,32,95,50,53,51,41,32,40,40,+66,32,40,85,32,40,90,32,75,41,41,41,32,95,53,51,53,41,41,41,+41,41,41,41,41,32,40,40,40,83,39,32,66,41,32,40,66,39,32,40,+40,40,83,39,32,95,52,55,57,41,32,40,40,66,32,95,50,53,51,41,+32,40,40,66,32,40,85,32,40,90,32,75,41,41,41,32,95,53,51,53,+41,41,41,32,40,40,66,32,95,50,48,56,41,32,40,40,66,32,40,85,+32,40,75,32,65,41,41,41,32,95,53,51,53,41,41,41,41,41,32,40,+40,40,83,39,32,66,41,32,40,66,39,32,40,40,66,32,95,50,49,57,+41,32,40,40,66,32,40,85,32,40,75,32,65,41,41,41,32,95,53,51,+53,41,41,41,41,32,40,40,66,32,95,50,53,52,41,32,40,40,66,32,+40,85,32,40,90,32,75,41,41,41,32,95,53,51,53,41,41,41,41,41,+41,41,32,40,40,83,32,40,40,40,83,39,32,95,50,53,52,41,32,40,+40,66,32,40,85,32,40,90,32,75,41,41,41,32,95,53,51,53,41,41,+32,40,40,66,32,95,50,48,56,41,32,40,40,66,32,40,85,32,40,75,+32,65,41,41,41,32,95,53,51,53,41,41,41,41,32,40,40,40,67,39,+32,95,52,56,53,41,32,40,40,66,32,95,50,53,51,41,32,40,40,66,+32,40,85,32,40,90,32,75,41,41,41,32,95,53,51,53,41,41,41,32,+40,95,51,53,57,32,35,50,41,41,41,41,41,41,32,40,40,40,83,39,+32,66,41,32,40,66,39,32,40,40,66,32,95,50,49,57,41,32,40,40,+66,32,40,85,32,40,75,32,65,41,41,41,32,95,53,51,53,41,41,41,+41,32,40,40,66,32,95,50,53,52,41,32,40,40,66,32,40,85,32,40,+90,32,75,41,41,41,32,95,53,51,53,41,41,41,41,41,32,40,40,65,+32,58,53,54,52,32,40,40,40,83,39,32,66,41,32,40,40,66,32,40,+95,53,48,49,32,95,50,56,50,41,41,32,40,95,52,56,50,32,95,50,+55,55,41,41,41,32,40,95,53,48,50,32,95,50,56,50,41,41,41,32,+40,40,65,32,58,53,54,53,32,40,85,32,75,41,41,32,40,40,65,32,+58,53,54,54,32,40,85,32,65,41,41,32,40,40,65,32,58,53,54,55,+32,40,40,40,83,39,32,95,50,48,49,41,32,40,40,66,32,40,67,32,+66,41,41,32,40,40,66,32,40,40,67,39,32,66,41,32,66,41,41,32,+40,40,40,83,39,32,40,67,39,32,66,41,41,32,40,40,66,32,40,66,+32,40,67,39,32,66,41,41,41,32,40,40,66,32,40,66,32,40,66,32,+95,49,50,49,41,41,41,32,40,40,66,32,95,50,48,50,41,32,40,85,+32,75,41,41,41,41,41,32,40,40,66,32,95,50,48,50,41,32,40,85,+32,65,41,41,41,41,41,41,32,40,40,66,32,95,50,48,53,41,32,40,+40,66,32,95,53,54,55,41,32,40,40,40,83,39,32,80,41,32,40,85,+32,75,41,41,32,40,85,32,65,41,41,41,41,41,41,32,40,40,65,32,+58,53,54,56,32,40,40,40,83,39,32,95,50,48,49,41,32,40,40,66,+32,40,67,32,66,41,41,32,40,40,66,32,40,40,67,39,32,66,41,32,+40,66,39,32,66,41,41,41,32,40,40,40,83,39,32,40,67,39,32,66,+41,41,32,40,40,66,32,66,39,41,32,40,40,66,32,40,66,32,40,67,+39,32,66,41,41,41,32,40,40,66,32,40,66,32,66,39,41,41,32,40,+40,66,32,40,66,32,40,66,32,95,49,50,49,41,41,41,32,40,40,66,+32,95,50,48,50,41,32,40,85,32,40,90,32,75,41,41,41,41,41,41,+41,41,32,40,40,40,83,39,32,40,67,39,32,66,41,41,32,40,40,66,+32,40,66,32,40,67,39,32,66,41,41,41,32,40,40,66,32,40,66,32,+40,66,32,95,49,50,49,41,41,41,32,40,40,66,32,95,50,48,50,41,+32,40,85,32,40,75,32,75,41,41,41,41,41,41,32,40,40,66,32,95,+50,48,50,41,32,40,85,32,40,75,32,65,41,41,41,41,41,41,41,41,+32,40,40,66,32,95,50,48,53,41,32,40,40,66,32,95,53,54,56,41,+32,40,40,40,83,39,32,67,41,32,40,40,40,83,39,32,80,41,32,40,+85,32,40,90,32,75,41,41,41,32,40,85,32,40,75,32,75,41,41,41,+41,32,40,85,32,40,75,32,65,41,41,41,41,41,41,41,32,40,40,65,+32,58,53,54,57,32,40,40,40,83,39,32,95,50,48,49,41,32,40,40,+66,32,40,67,32,66,41,41,32,40,40,66,32,40,40,67,39,32,66,41,+32,40,66,39,32,40,66,39,32,66,41,41,41,41,32,40,40,40,83,39,+32,40,67,39,32,66,41,41,32,40,40,66,32,66,39,41,32,40,40,66,+32,66,39,41,32,40,40,66,32,40,66,32,40,67,39,32,66,41,41,41,+32,40,40,66,32,40,66,32,66,39,41,41,32,40,40,66,32,40,66,32,+66,39,41,41,32,40,40,66,32,40,66,32,40,66,32,95,49,50,49,41,+41,41,32,40,40,66,32,95,50,48,50,41,32,40,85,32,40,90,32,40,+90,32,75,41,41,41,41,41,41,41,41,41,41,41,32,40,40,40,83,39,+32,40,67,39,32,66,41,41,32,40,40,66,32,66,39,41,32,40,40,66,+32,40,66,32,40,67,39,32,66,41,41,41,32,40,40,66,32,40,66,32,+66,39,41,41,32,40,40,66,32,40,66,32,40,66,32,95,49,50,49,41,+41,41,32,40,40,66,32,95,50,48,50,41,32,40,85,32,40,75,32,40,+90,32,75,41,41,41,41,41,41,41,41,41,32,40,40,40,83,39,32,40,+67,39,32,66,41,41,32,40,40,66,32,40,66,32,40,67,39,32,66,41,+41,41,32,40,40,66,32,40,66,32,40,66,32,95,49,50,49,41,41,41,+32,40,40,66,32,95,50,48,50,41,32,40,85,32,40,75,32,40,75,32,+75,41,41,41,41,41,41,41,32,40,40,66,32,95,50,48,50,41,32,40,+85,32,40,75,32,40,75,32,65,41,41,41,41,41,41,41,41,41,41,32,+40,40,66,32,95,50,48,53,41,32,40,40,66,32,95,53,54,57,41,32,+40,40,40,83,39,32,67,41,32,40,40,40,83,39,32,67,41,32,40,40,+40,83,39,32,80,41,32,40,85,32,40,90,32,40,90,32,75,41,41,41,+41,32,40,85,32,40,75,32,40,90,32,75,41,41,41,41,41,32,40,85,+32,40,75,32,40,75,32,75,41,41,41,41,41,32,40,85,32,40,75,32,+40,75,32,65,41,41,41,41,41,41,41,41,32,40,40,65,32,58,53,55,+48,32,40,40,40,95,49,53,56,56,32,40,75,32,40,85,32,40,95,49,+53,57,55,32,34,40,41,34,41,41,41,41,32,40,95,49,53,57,51,32,+95,53,55,48,41,41,32,40,95,49,53,57,52,32,95,53,55,48,41,41,+41,32,40,40,65,32,58,53,55,49,32,40,40,83,32,40,40,40,83,39,+32,95,49,53,56,56,41,32,40,90,32,40,40,66,32,85,41,32,40,40,+66,32,40,66,32,40,66,32,40,95,49,53,57,56,32,95,49,50,53,41,+41,41,41,32,40,40,40,83,39,32,40,67,39,32,66,41,41,32,40,40,+66,32,40,66,32,95,50,54,51,41,41,32,40,40,40,67,39,32,95,49,+53,56,57,41,32,40,85,32,75,41,41,32,35,48,41,41,41,32,40,40,+66,32,40,66,32,40,95,50,54,51,32,40,95,49,53,57,55,32,40,40,+79,32,35,52,52,41,32,75,41,41,41,41,41,32,40,40,40,67,39,32,+95,49,53,56,57,41,32,40,85,32,65,41,41,32,35,48,41,41,41,41,+41,41,41,32,40,40,66,32,95,49,53,57,51,41,32,40,40,66,32,95,+53,55,49,41,32,40,40,40,83,39,32,80,41,32,40,85,32,75,41,41,+32,40,85,32,65,41,41,41,41,41,41,32,40,40,66,32,95,49,53,57,+52,41,32,40,40,66,32,95,53,55,49,41,32,40,40,40,83,39,32,80,+41,32,40,85,32,75,41,41,32,40,85,32,65,41,41,41,41,41,41,32,+40,40,65,32,58,53,55,50,32,40,40,83,32,40,40,40,83,39,32,95,+49,53,56,56,41,32,40,90,32,40,40,66,32,85,41,32,40,40,66,32,+40,66,32,40,66,32,40,66,32,40,95,49,53,57,56,32,95,49,50,53,+41,41,41,41,41,32,40,40,40,83,39,32,40,67,39,32,66,41,41,32,+40,40,66,32,66,39,41,32,40,40,66,32,40,66,32,95,50,54,51,41,+41,32,40,40,40,67,39,32,95,49,53,56,57,41,32,40,85,32,40,90,+32,75,41,41,41,32,35,48,41,41,41,41,32,40,40,66,32,40,66,32,+40,66,32,40,95,50,54,51,32,40,95,49,53,57,55,32,40,40,79,32,+35,52,52,41,32,75,41,41,41,41,41,41,32,40,40,40,83,39,32,40,+67,39,32,66,41,41,32,40,40,66,32,40,66,32,95,50,54,51,41,41,+32,40,40,40,67,39,32,95,49,53,56,57,41,32,40,85,32,40,75,32,+75,41,41,41,32,35,48,41,41,41,32,40,40,66,32,40,66,32,40,95,+50,54,51,32,40,95,49,53,57,55,32,40,40,79,32,35,52,52,41,32,+75,41,41,41,41,41,32,40,40,40,67,39,32,95,49,53,56,57,41,32,+40,85,32,40,75,32,65,41,41,41,32,35,48,41,41,41,41,41,41,41,+41,41,32,40,40,66,32,95,49,53,57,51,41,32,40,40,66,32,95,53,+55,50,41,32,40,40,40,83,39,32,67,41,32,40,40,40,83,39,32,80,+41,32,40,85,32,40,90,32,75,41,41,41,32,40,85,32,40,75,32,75,+41,41,41,41,32,40,85,32,40,75,32,65,41,41,41,41,41,41,41,32,+40,40,66,32,95,49,53,57,52,41,32,40,40,66,32,95,53,55,50,41,+32,40,40,40,83,39,32,67,41,32,40,40,40,83,39,32,80,41,32,40,+85,32,40,90,32,75,41,41,41,32,40,85,32,40,75,32,75,41,41,41,+41,32,40,85,32,40,75,32,65,41,41,41,41,41,41,41,32,40,40,65,+32,58,53,55,51,32,40,40,83,32,40,40,40,83,39,32,95,49,53,56,+56,41,32,40,90,32,40,40,66,32,85,41,32,40,40,66,32,40,66,32,+40,66,32,40,66,32,40,66,32,40,95,49,53,57,56,32,95,49,50,53,+41,41,41,41,41,41,32,40,40,40,83,39,32,40,67,39,32,66,41,41,+32,40,40,66,32,66,39,41,32,40,40,66,32,66,39,41,32,40,40,66,+32,40,66,32,95,50,54,51,41,41,32,40,40,40,67,39,32,95,49,53,+56,57,41,32,40,85,32,40,90,32,40,90,32,75,41,41,41,41,32,35,+48,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,+40,95,50,54,51,32,40,95,49,53,57,55,32,40,40,79,32,35,52,52,+41,32,75,41,41,41,41,41,41,41,32,40,40,40,83,39,32,40,67,39,+32,66,41,41,32,40,40,66,32,66,39,41,32,40,40,66,32,40,66,32,+95,50,54,51,41,41,32,40,40,40,67,39,32,95,49,53,56,57,41,32,+40,85,32,40,75,32,40,90,32,75,41,41,41,41,32,35,48,41,41,41,+41,32,40,40,66,32,40,66,32,40,66,32,40,95,50,54,51,32,40,95,+49,53,57,55,32,40,40,79,32,35,52,52,41,32,75,41,41,41,41,41,+41,32,40,40,40,83,39,32,40,67,39,32,66,41,41,32,40,40,66,32,+40,66,32,95,50,54,51,41,41,32,40,40,40,67,39,32,95,49,53,56,+57,41,32,40,85,32,40,75,32,40,75,32,75,41,41,41,41,32,35,48,+41,41,41,32,40,40,66,32,40,66,32,40,95,50,54,51,32,40,95,49,+53,57,55,32,40,40,79,32,35,52,52,41,32,75,41,41,41,41,41,32,+40,40,40,67,39,32,95,49,53,56,57,41,32,40,85,32,40,75,32,40,+75,32,65,41,41,41,41,32,35,48,41,41,41,41,41,41,41,41,41,41,+41,32,40,40,66,32,95,49,53,57,51,41,32,40,40,66,32,95,53,55,+51,41,32,40,40,40,83,39,32,67,41,32,40,40,40,83,39,32,67,41,+32,40,40,40,83,39,32,80,41,32,40,85,32,40,90,32,40,90,32,75,+41,41,41,41,32,40,85,32,40,75,32,40,90,32,75,41,41,41,41,41,+32,40,85,32,40,75,32,40,75,32,75,41,41,41,41,41,32,40,85,32,+40,75,32,40,75,32,65,41,41,41,41,41,41,41,41,32,40,40,66,32,+95,49,53,57,52,41,32,40,40,66,32,95,53,55,51,41,32,40,40,40,+83,39,32,67,41,32,40,40,40,83,39,32,67,41,32,40,40,40,83,39,+32,80,41,32,40,85,32,40,90,32,40,90,32,75,41,41,41,41,32,40,+85,32,40,75,32,40,90,32,75,41,41,41,41,41,32,40,85,32,40,75,+32,40,75,32,75,41,41,41,41,41,32,40,85,32,40,75,32,40,75,32,+65,41,41,41,41,41,41,41,41,32,40,40,65,32,58,53,55,52,32,40,+40,95,49,50,54,32,95,49,51,52,49,41,32,95,49,51,52,49,41,41,+32,40,40,65,32,58,53,55,53,32,40,40,40,83,39,32,95,49,50,54,+41,32,40,40,40,83,39,32,80,41,32,40,40,66,32,95,49,50,55,41,+32,40,85,32,75,41,41,41,32,40,40,66,32,95,49,50,55,41,32,40,+85,32,65,41,41,41,41,32,40,40,40,83,39,32,80,41,32,40,40,66,+32,95,49,50,56,41,32,40,85,32,75,41,41,41,32,40,40,66,32,95,+49,50,56,41,32,40,85,32,65,41,41,41,41,41,32,40,40,65,32,58,+53,55,54,32,40,40,40,83,39,32,95,49,50,54,41,32,40,40,40,83,+39,32,67,41,32,40,40,40,83,39,32,80,41,32,40,40,66,32,95,49,+50,55,41,32,40,85,32,40,90,32,75,41,41,41,41,32,40,40,66,32,+95,49,50,55,41,32,40,85,32,40,75,32,75,41,41,41,41,41,32,40,+40,66,32,95,49,50,55,41,32,40,85,32,40,75,32,65,41,41,41,41,+41,32,40,40,40,83,39,32,67,41,32,40,40,40,83,39,32,80,41,32,+40,40,66,32,95,49,50,56,41,32,40,85,32,40,90,32,75,41,41,41,+41,32,40,40,66,32,95,49,50,56,41,32,40,85,32,40,75,32,75,41,+41,41,41,41,32,40,40,66,32,95,49,50,56,41,32,40,85,32,40,75,+32,65,41,41,41,41,41,41,32,40,40,65,32,58,53,55,55,32,40,40,+40,83,39,32,95,49,50,54,41,32,40,40,40,83,39,32,67,41,32,40,+40,40,83,39,32,67,41,32,40,40,40,83,39,32,80,41,32,40,40,66,+32,95,49,50,55,41,32,40,85,32,40,90,32,40,90,32,75,41,41,41,+41,41,32,40,40,66,32,95,49,50,55,41,32,40,85,32,40,75,32,40,+90,32,75,41,41,41,41,41,41,32,40,40,66,32,95,49,50,55,41,32,+40,85,32,40,75,32,40,75,32,75,41,41,41,41,41,41,32,40,40,66,+32,95,49,50,55,41,32,40,85,32,40,75,32,40,75,32,65,41,41,41,+41,41,41,32,40,40,40,83,39,32,67,41,32,40,40,40,83,39,32,67,+41,32,40,40,40,83,39,32,80,41,32,40,40,66,32,95,49,50,56,41,+32,40,85,32,40,90,32,40,90,32,75,41,41,41,41,41,32,40,40,66,+32,95,49,50,56,41,32,40,85,32,40,75,32,40,90,32,75,41,41,41,+41,41,41,32,40,40,66,32,95,49,50,56,41,32,40,85,32,40,75,32,+40,75,32,75,41,41,41,41,41,41,32,40,40,66,32,95,49,50,56,41,+32,40,85,32,40,75,32,40,75,32,65,41,41,41,41,41,41,41,32,40,+40,65,32,58,53,55,56,32,40,40,40,40,40,40,40,95,52,55,56,32,+95,49,51,54,51,41,32,95,49,51,54,52,41,32,95,49,51,54,53,41,+32,40,95,52,56,57,32,95,53,55,56,41,41,32,73,41,32,40,40,67,+32,40,40,67,32,40,40,67,32,40,95,50,48,50,32,95,53,56,51,41,+41,32,35,48,41,41,32,35,49,41,41,32,35,48,41,41,32,40,40,66,+32,95,49,51,57,48,41,32,95,51,54,48,41,41,41,32,40,40,65,32,+58,53,55,57,32,40,40,40,40,40,40,40,40,95,51,54,52,32,40,40,+80,32,95,53,56,51,41,32,95,53,55,56,41,41,32,95,49,51,54,54,+41,32,95,49,51,54,55,41,32,40,95,51,55,53,32,95,53,55,57,41,+41,32,40,95,51,55,54,32,95,53,55,57,41,41,32,40,95,51,55,55,+32,95,53,55,57,41,41,32,40,95,51,55,56,32,95,53,55,57,41,41,+32,95,51,54,49,41,41,32,40,40,65,32,58,53,56,48,32,40,40,95,+49,50,54,32,35,48,41,32,35,45,49,41,41,32,40,40,65,32,58,53,+56,49,32,40,95,53,51,49,32,40,40,66,32,95,53,50,57,41,32,95,+51,54,49,41,41,41,32,40,40,65,32,58,53,56,50,32,40,40,40,40,+40,40,40,40,95,49,55,57,32,40,40,67,32,40,95,52,55,57,32,95,+53,55,56,41,41,32,40,40,95,52,56,53,32,95,53,55,56,41,32,40,+95,51,53,57,32,35,49,41,41,41,41,32,40,40,67,32,40,95,52,56,+48,32,95,53,55,56,41,41,32,40,40,95,52,56,53,32,95,53,55,56,+41,32,40,95,51,53,57,32,35,49,41,41,41,41,32,95,49,51,57,48,+41,32,95,49,51,56,57,41,32,40,40,83,32,95,52,54,50,41,32,40,+40,66,32,40,95,49,56,52,32,95,53,56,53,41,41,32,40,40,67,32,+40,95,52,55,57,32,95,53,55,56,41,41,32,35,49,41,41,41,41,32,+40,40,40,83,39,32,40,67,39,32,89,41,41,32,40,40,66,32,40,66,+32,40,66,32,40,83,32,95,52,54,50,41,41,41,41,32,40,40,66,32,+40,66,32,40,67,32,66,41,41,41,32,40,40,66,32,40,66,32,40,67,+32,40,95,52,55,57,32,95,53,55,56,41,41,41,41,32,40,67,32,40,+95,52,56,48,32,95,53,55,56,41,41,41,41,41,41,32,73,41,41,32,+40,40,66,32,40,40,67,39,32,95,52,50,52,41,32,40,67,32,40,95,+52,57,56,32,95,53,56,52,41,41,41,41,32,40,95,49,56,52,32,95,+53,56,53,41,41,41,32,40,40,40,83,39,32,83,41,32,40,40,40,83,+39,32,40,83,39,32,83,39,41,41,32,40,67,32,40,95,52,57,57,32,+95,53,56,52,41,41,41,32,40,40,66,32,40,66,32,40,40,67,39,32,+95,52,50,52,41,32,40,67,32,40,95,53,48,48,32,95,53,56,52,41,+41,41,41,41,32,40,95,49,56,53,32,95,53,56,53,41,41,41,41,32,+40,40,66,32,40,66,32,40,40,67,39,32,95,52,50,52,41,32,40,67,+32,40,95,52,57,56,32,95,53,56,52,41,41,41,41,41,32,40,95,49,+56,53,32,95,53,56,53,41,41,41,41,41,32,40,40,65,32,58,53,56,+51,32,40,40,95,50,48,49,32,95,49,51,56,51,41,32,95,49,51,56,+52,41,41,32,40,40,65,32,58,53,56,52,32,40,40,40,40,40,40,40,+40,95,52,57,52,32,95,53,56,51,41,32,40,95,53,48,51,32,95,53,+56,52,41,41,32,95,49,51,56,53,41,32,95,49,51,56,54,41,32,95,+49,51,56,55,41,32,95,49,51,56,56,41,32,40,95,53,48,56,32,95,+53,56,52,41,41,32,40,95,53,48,57,32,95,53,56,52,41,41,41,32,+40,40,65,32,58,53,56,53,32,40,40,40,40,40,40,40,40,95,49,55,+57,32,40,95,49,56,56,32,95,53,56,53,41,41,32,40,95,49,56,57,+32,95,53,56,53,41,41,32,95,49,51,57,48,41,32,95,49,51,56,57,+41,32,40,95,49,57,50,32,95,53,56,53,41,41,32,40,95,49,57,51,+32,95,53,56,53,41,41,32,40,95,49,57,52,32,95,53,56,53,41,41,+32,40,95,49,57,53,32,95,53,56,53,41,41,41,32,40,40,65,32,58,+53,56,54,32,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,+40,40,40,40,40,40,95,54,53,32,95,53,56,51,41,32,95,49,51,54,+56,41,32,95,49,51,54,57,41,32,95,49,51,55,48,41,32,95,49,51,+55,52,41,32,40,95,57,50,32,95,53,56,54,41,41,32,40,95,57,51,+32,95,53,56,54,41,41,32,35,48,41,32,40,95,49,51,55,49,32,35,+49,41,41,32,40,95,57,54,32,95,53,56,54,41,41,32,40,95,57,55,+32,95,53,56,54,41,41,32,40,95,57,56,32,95,53,56,54,41,41,32,+40,95,57,57,32,95,53,56,54,41,41,32,95,49,51,55,49,41,32,40,+95,49,48,49,32,95,53,56,54,41,41,32,95,49,51,55,50,41,32,40,+95,49,48,51,32,95,53,56,54,41,41,32,40,95,49,48,52,32,95,53,+56,54,41,41,32,40,95,49,48,53,32,95,53,56,54,41,41,32,40,95,+49,48,54,32,95,53,56,54,41,41,32,40,95,49,48,55,32,95,53,56,+54,41,41,32,40,75,32,35,54,52,41,41,41,32,40,40,65,32,58,53,+56,55,32,40,40,40,95,49,53,56,56,32,40,95,49,53,57,50,32,95,+53,56,55,41,41,32,40,89,32,40,40,40,67,39,32,83,41,32,40,40,+40,67,39,32,67,41,32,40,40,66,32,40,40,83,39,32,83,39,41,32,+40,40,67,32,40,95,52,57,55,32,95,53,56,52,41,41,32,35,49,48,+41,41,41,32,40,40,40,67,39,32,40,67,39,32,66,41,41,32,40,40,+66,32,40,66,32,95,52,54,51,41,41,32,40,40,67,32,66,41,32,40,+40,67,32,40,95,51,54,54,32,95,53,55,57,41,41,32,35,49,48,41,+41,41,41,32,40,40,67,32,79,41,32,75,41,41,41,41,32,40,40,67,+32,79,41,32,75,41,41,41,32,40,40,66,32,95,49,51,54,41,32,40,+40,66,32,40,40,95,52,55,57,32,95,50,55,55,41,32,40,95,49,51,+55,32,35,52,56,41,41,41,32,40,40,66,32,95,49,51,56,57,41,32,+40,40,67,32,40,95,51,54,55,32,95,53,55,57,41,41,32,35,49,48,+41,41,41,41,41,41,41,32,40,95,49,53,57,52,32,95,53,56,55,41,+41,41,32,40,40,65,32,58,53,56,56,32,40,40,66,32,40,66,32,73,+79,46,112,101,114,102,111,114,109,73,79,41,41,32,40,40,40,67,39,32,+66,41,32,40,40,66,32,40,95,51,51,32,95,49,52,53,50,41,41,32,+95,49,52,55,50,41,41,32,40,95,51,52,32,95,49,52,53,50,41,41,+41,41,32,40,40,65,32,58,53,56,57,32,40,40,66,32,40,67,32,95,+53,56,56,41,41,32,40,40,67,32,95,51,52,41,32,95,49,51,52,49,+41,41,41,32,40,40,65,32,58,53,57,48,32,95,49,52,49,53,41,32,+40,40,65,32,58,53,57,49,32,40,40,40,67,39,32,66,41,32,40,40,+66,32,95,49,52,48,53,41,32,95,53,57,48,41,41,32,40,40,67,32,+40,83,39,32,95,49,52,48,53,41,41,32,40,40,40,67,39,32,66,41,+32,40,40,66,32,95,49,52,48,54,41,32,95,53,57,52,41,41,32,95,+49,52,48,55,41,41,41,41,32,40,40,65,32,58,53,57,50,32,95,49,+52,49,54,41,32,40,40,65,32,58,53,57,51,32,94,102,114,101,101,41,+32,40,40,65,32,58,53,57,52,32,95,53,57,51,41,32,40,40,65,32,+58,53,57,53,32,94,109,97,108,108,111,99,41,32,40,40,65,32,58,53,+57,54,32,95,53,57,53,41,32,40,40,65,32,58,53,57,55,32,40,40,+95,50,48,49,32,40,40,40,67,39,32,66,41,32,40,40,66,32,40,95,+50,48,50,32,95,53,56,51,41,41,32,95,49,52,49,56,41,41,32,95,+49,52,49,56,41,41,32,40,95,50,48,53,32,95,53,57,55,41,41,41,+32,40,40,65,32,58,53,57,56,32,40,40,40,95,49,53,56,56,32,40,+75,32,40,40,66,32,40,95,50,54,51,32,40,95,49,53,57,55,32,34,+80,84,82,35,34,41,41,41,32,40,40,66,32,40,40,95,49,53,56,57,+32,95,53,56,55,41,32,35,48,41,41,32,95,49,52,49,56,41,41,41,+41,32,40,95,49,53,57,51,32,95,53,57,56,41,41,32,40,95,49,53,+57,52,32,95,53,57,56,41,41,41,32,40,40,65,32,58,53,57,57,32,+40,95,49,52,49,55,32,35,48,41,41,32,40,40,65,32,58,54,48,48,+32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,67,41,41,+41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,67,41,41,+41,41,32,40,40,66,32,40,66,32,40,66,32,67,41,41,41,32,40,40,+66,32,40,66,32,67,41,41,32,80,41,41,41,41,41,32,40,40,65,32,+58,54,48,49,32,40,85,32,40,90,32,40,90,32,40,90,32,40,90,32,+75,41,41,41,41,41,41,32,40,40,65,32,58,54,48,50,32,40,85,32,+40,75,32,40,90,32,40,90,32,40,90,32,75,41,41,41,41,41,41,32,+40,40,65,32,58,54,48,51,32,40,85,32,40,75,32,40,75,32,40,90,+32,40,90,32,75,41,41,41,41,41,41,32,40,40,65,32,58,54,48,52,+32,40,85,32,40,75,32,40,75,32,40,75,32,40,90,32,75,41,41,41,+41,41,41,32,40,40,65,32,58,54,48,53,32,40,85,32,40,75,32,40,+75,32,40,75,32,40,75,32,75,41,41,41,41,41,41,32,40,40,65,32,+58,54,48,54,32,40,85,32,40,75,32,40,75,32,40,75,32,40,75,32,+65,41,41,41,41,41,41,32,40,40,65,32,58,54,48,55,32,80,41,32,+40,40,65,32,58,54,48,56,32,40,85,32,75,41,41,32,40,40,65,32,+58,54,48,57,32,40,40,66,32,85,41,32,40,90,32,95,54,48,55,41,+41,41,32,40,40,65,32,58,54,49,48,32,40,85,32,65,41,41,32,40,+40,65,32,58,54,49,49,32,40,40,95,54,48,55,32,95,52,54,49,41,+32,95,57,50,48,41,41,32,40,40,65,32,58,54,49,50,32,40,40,66,+32,85,41,32,40,40,66,32,40,40,67,39,32,66,41,32,95,54,48,55,+41,41,32,95,57,51,49,41,41,41,32,40,40,65,32,58,54,49,51,32,+40,40,40,83,39,32,40,67,39,32,40,67,39,32,40,95,51,50,32,95,+49,52,53,50,41,41,41,41,32,95,54,49,54,41,32,40,40,66,32,85,+41,32,40,40,66,32,40,66,32,40,66,32,40,40,95,51,50,32,95,49,+52,53,50,41,32,95,49,52,55,57,41,41,41,41,32,40,40,40,67,39,+32,66,41,32,40,40,66,32,40,67,39,32,40,67,39,32,40,40,83,39,+32,40,95,51,50,32,95,49,52,53,50,41,41,32,40,40,66,32,40,95,+51,52,32,95,49,52,53,50,41,41,32,95,50,49,41,41,41,41,41,32,+40,40,66,32,40,66,32,40,66,32,40,66,32,85,41,41,41,41,32,40,+40,66,32,40,66,32,40,66,32,40,66,32,40,40,95,51,50,32,95,49,+52,53,50,41,32,95,49,52,55,57,41,41,41,41,41,32,40,40,40,83,+39,32,66,41,32,40,40,66,32,40,67,39,32,66,41,41,32,40,40,66,+32,40,66,32,40,67,39,32,40,95,51,51,32,95,49,52,53,50,41,41,+41,41,32,40,40,40,67,39,32,66,41,32,40,66,39,32,40,40,66,32,+95,50,54,49,41,32,40,40,66,32,40,95,52,53,32,95,49,52,53,50,+41,41,32,40,40,40,67,39,32,40,95,52,57,57,32,95,50,56,50,41,+41,32,95,54,48,49,41,32,35,48,41,41,41,41,41,32,40,40,66,32,+40,66,32,40,95,50,54,49,32,95,49,52,55,50,41,41,41,32,40,40,+66,32,40,66,32,40,95,52,54,51,32,34,99,111,109,98,105,110,97,116,+111,114,32,99,111,110,118,101,114,115,105,111,110,32,34,41,41,41,32,40,+40,40,67,39,32,40,67,39,32,95,52,54,51,41,41,32,40,40,66,32,+40,66,32,40,95,49,54,49,48,32,35,54,41,41,41,32,40,40,66,32,+40,66,32,40,95,49,53,57,48,32,95,50,56,51,41,41,41,32,40,67,+32,40,95,52,56,48,32,95,50,55,55,41,41,41,41,41,32,34,109,115,+34,41,41,41,41,41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,+66,32,40,83,39,32,40,95,51,51,32,95,49,52,53,50,41,41,41,32,+40,40,40,67,39,32,66,41,32,40,40,66,32,95,50,54,49,41,32,40,+40,66,32,40,95,52,53,32,95,49,52,53,50,41,41,32,40,40,40,67,+39,32,40,95,52,57,57,32,95,50,56,50,41,41,32,95,54,48,49,41,+32,35,51,41,41,41,41,32,40,40,66,32,40,95,50,54,49,32,95,49,+52,55,50,41,41,32,40,40,66,32,40,95,52,54,51,32,34,99,111,109,+98,105,110,97,116,111,114,115,58,92,49,48,38,34,41,41,32,95,54,53,+48,41,41,41,41,41,32,40,40,66,32,40,66,32,40,95,51,52,32,95,+49,52,53,50,41,41,41,32,40,67,32,80,41,41,41,41,41,41,41,41,+32,40,95,51,57,52,32,40,85,32,40,40,40,67,39,32,40,67,39,32,+79,41,41,32,40,40,40,67,39,32,66,41,32,80,41,32,95,55,48,51,+41,41,32,75,41,41,41,41,41,41,41,41,32,40,40,65,32,58,54,49,+52,32,40,40,40,67,39,32,40,95,49,50,50,32,95,49,51,51,57,41,+41,32,40,40,66,32,40,40,95,51,50,32,95,49,52,53,50,41,32,40,+40,95,49,52,54,51,32,34,99,97,99,104,101,47,80,114,101,108,117,100,+101,46,99,111,109,98,34,41,32,95,49,52,52,54,41,41,41,32,40,40,+66,32,40,80,32,40,40,95,51,52,32,95,49,52,53,50,41,32,95,54,+49,49,41,41,41,32,40,40,66,32,40,40,83,39,32,40,95,51,50,32,+95,49,52,53,50,41,41,32,95,49,52,53,53,41,41,32,40,40,66,32,+40,40,67,39,32,66,41,32,40,40,66,32,40,95,51,51,32,95,49,52,+53,50,41,41,32,95,49,52,53,57,41,41,41,32,40,40,40,67,39,32,+66,41,32,40,40,66,32,40,95,51,51,32,95,49,52,53,50,41,41,32,+40,40,40,67,39,32,95,50,54,49,41,32,40,40,66,32,40,95,52,53,+32,95,49,52,53,50,41,41,32,95,54,48,53,41,41,32,40,95,49,52,+55,50,32,34,108,111,97,100,101,100,32,99,97,99,104,101,100,32,80,114,+101,108,117,100,101,34,41,41,41,41,32,40,95,51,52,32,95,49,52,53,+50,41,41,41,41,41,41,41,32,40,40,95,51,52,32,95,49,52,53,50,+41,32,95,54,49,49,41,41,41,32,40,40,65,32,58,54,49,53,32,40,+40,40,83,39,32,66,41,32,40,40,66,32,40,95,51,50,32,95,49,52,+53,50,41,41,32,95,54,49,52,41,41,32,40,40,66,32,40,66,32,40,+66,32,40,40,95,50,55,54,32,95,49,52,53,48,41,32,95,53,54,53,+41,41,41,41,32,95,54,49,51,41,41,41,32,40,40,65,32,58,54,49,+54,32,40,40,40,83,39,32,40,67,39,32,40,67,39,32,40,95,51,50,+32,95,49,52,53,50,41,41,41,41,32,40,40,66,32,40,66,32,95,49,+48,56,57,41,41,32,95,54,49,55,41,41,32,40,40,66,32,85,41,32,+40,40,66,32,40,67,32,66,41,41,32,40,40,66,32,90,41,32,40,40,+40,67,39,32,66,41,32,40,40,66,32,40,67,39,32,40,95,51,51,32,+95,49,52,53,50,41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,+66,32,95,50,54,49,41,32,40,40,66,32,40,95,52,53,32,95,49,52,+53,50,41,41,32,40,40,40,67,39,32,40,95,52,57,57,32,95,50,56,+50,41,41,32,95,54,48,49,41,32,35,48,41,41,41,41,32,40,40,66,+32,40,95,50,54,49,32,95,49,52,55,50,41,41,32,40,40,66,32,40,+95,52,54,51,32,34,116,111,116,97,108,32,105,109,112,111,114,116,32,116,+105,109,101,32,32,32,32,32,34,41,41,32,40,40,40,67,39,32,95,52,+54,51,41,32,40,40,66,32,40,95,49,54,49,48,32,35,54,41,41,32,+40,95,49,53,57,48,32,95,50,56,51,41,41,41,32,34,109,115,34,41,+41,41,41,41,41,32,40,40,66,32,40,95,51,52,32,95,49,52,53,50,+41,41,32,40,40,40,83,39,32,80,41,32,40,40,66,32,40,95,50,54,+49,32,40,95,51,57,52,32,95,49,49,49,54,41,41,41,32,40,40,66,+32,40,95,50,54,49,32,95,57,50,50,41,41,32,95,54,49,48,41,41,+41,32,73,41,41,41,41,41,41,41,41,32,40,40,65,32,58,54,49,55,+32,40,40,66,32,40,66,32,40,40,95,51,50,32,95,49,48,57,50,41,+32,40,95,49,48,57,52,32,95,54,49,48,41,41,41,41,32,40,40,40,+83,39,32,40,83,39,32,67,41,41,32,40,40,66,32,40,40,83,39,32,+67,41,32,95,57,50,56,41,41,32,40,40,66,32,40,66,32,40,40,95,+51,50,32,95,49,48,57,50,41,32,40,95,49,48,57,52,32,95,54,48,+56,41,41,41,41,32,40,40,66,32,40,40,83,39,32,40,67,39,32,40,+95,51,51,32,95,49,48,57,50,41,41,41,32,40,40,40,83,39,32,40,+83,39,32,95,50,54,49,41,41,32,40,40,66,32,40,66,32,40,95,52,+53,32,95,49,48,57,50,41,41,41,32,40,95,52,51,50,32,95,56,57,+50,41,41,41,32,40,40,66,32,40,66,32,40,95,50,54,49,32,95,50,+52,41,41,41,32,40,40,66,32,40,66,32,40,95,52,54,51,32,34,114,+101,99,117,114,115,105,118,101,32,109,111,100,117,108,101,58,32,34,41,41,+41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,95,52,54,51,41,+32,95,57,48,50,41,41,32,40,40,66,32,40,95,52,54,51,32,34,44,+32,105,109,112,111,114,116,32,99,104,97,105,110,58,32,34,41,41,32,40,+40,66,32,95,49,54,48,57,41,32,40,95,51,57,53,32,95,57,48,50,+41,41,41,41,41,41,41,41,41,32,40,40,66,32,40,40,83,39,32,40,+95,51,51,32,95,49,48,57,50,41,41,32,40,40,66,32,40,95,50,54,+49,32,95,49,48,57,53,41,41,32,40,40,40,67,39,32,40,83,39,32,+95,54,48,57,41,41,32,40,40,40,67,39,32,66,41,32,95,52,54,50,+41,32,95,54,48,56,41,41,32,73,41,41,41,41,32,40,40,40,83,39,+32,40,83,39,32,40,95,51,51,32,95,49,48,57,50,41,41,41,32,40,+40,40,67,39,32,66,41,32,40,40,66,32,95,50,54,49,41,32,40,40,+66,32,40,95,52,53,32,95,49,48,57,50,41,41,32,40,40,40,67,39,+32,40,95,52,57,57,32,95,50,56,50,41,41,32,95,54,48,49,41,32,+35,48,41,41,41,41,32,40,40,66,32,40,95,50,54,49,32,95,49,48,+57,56,41,41,32,40,40,66,32,40,95,50,54,49,32,95,49,52,55,50,+41,41,32,40,40,66,32,40,95,52,54,51,32,34,105,109,112,111,114,116,+105,110,103,32,34,41,41,32,95,57,48,50,41,41,41,41,41,32,40,40,+40,83,39,32,40,83,39,32,40,95,51,50,32,95,49,48,57,50,41,41,+41,32,95,54,49,56,41,32,40,40,66,32,40,66,32,85,41,41,32,40,+40,40,83,39,32,40,83,39,32,66,41,41,32,40,40,66,32,40,66,32,+40,83,39,32,40,83,39,32,66,41,41,41,41,32,40,40,66,32,40,66,+32,40,66,32,40,66,32,40,95,51,51,32,95,49,48,57,50,41,41,41,+41,41,32,40,40,40,67,39,32,66,41,32,40,66,39,32,40,66,39,32,+40,40,66,32,95,50,54,49,41,32,40,40,66,32,40,95,52,53,32,95,+49,48,57,50,41,41,32,40,40,40,67,39,32,40,95,52,57,57,32,95,+50,56,50,41,41,32,95,54,48,49,41,32,35,48,41,41,41,41,41,41,+32,40,40,66,32,40,66,32,40,66,32,40,95,50,54,49,32,95,49,48,+57,56,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,95,50,+54,49,32,95,49,52,55,50,41,41,41,41,32,40,40,66,32,40,66,32,+40,66,32,40,95,52,54,51,32,34,105,109,112,111,114,116,105,110,103,32,+100,111,110,101,32,34,41,41,41,41,32,40,40,40,67,39,32,66,41,32,+40,66,39,32,40,40,66,32,95,52,54,51,41,32,95,57,48,50,41,41,+41,32,40,40,66,32,40,66,32,40,95,52,54,51,32,34,44,32,34,41,+41,41,32,40,40,40,83,39,32,40,83,39,32,95,52,54,51,41,41,32,+40,40,66,32,40,66,32,40,95,49,53,57,48,32,95,50,56,51,41,41,+41,32,40,95,52,55,57,32,95,50,55,55,41,41,41,32,40,40,66,32,+40,66,32,40,95,52,54,51,32,34,109,115,32,40,34,41,41,41,32,40,+40,40,67,39,32,66,41,32,40,40,66,32,95,52,54,51,41,32,40,95,+49,53,57,48,32,95,50,56,51,41,41,41,32,40,40,66,32,40,95,52,+54,51,32,34,32,43,32,34,41,41,32,40,40,40,67,39,32,95,52,54,+51,41,32,40,95,49,53,57,48,32,95,50,56,51,41,41,32,40,40,79,+32,35,52,49,41,32,75,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,32,40,40,40,67,39,32,40,83,39,32,66,41,41,32,40,40,66,+32,66,39,41,32,40,40,66,32,66,39,41,32,40,40,66,32,66,39,41,+32,40,40,66,32,40,66,32,40,95,51,51,32,95,49,48,57,50,41,41,+41,32,40,40,40,67,39,32,40,83,39,32,95,50,54,49,41,41,32,40,+40,66,32,40,66,32,40,95,52,53,32,95,49,48,57,50,41,41,41,32,+40,40,40,67,39,32,66,41,32,40,40,66,32,95,49,50,49,41,32,95,+54,48,53,41,41,32,40,40,67,32,40,95,50,48,51,32,95,56,57,50,+41,41,32,40,95,56,57,55,32,34,73,110,116,101,114,97,99,116,105,118,+101,34,41,41,41,41,41,32,40,40,66,32,40,95,50,54,49,32,95,49,+48,57,56,41,41,32,40,40,66,32,40,95,50,54,49,32,95,49,52,55,+50,41,41,32,40,40,66,32,40,95,52,54,51,32,34,108,111,97,100,101,+100,32,34,41,41,32,95,57,48,50,41,41,41,41,41,41,41,41,41,32,+40,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,40,95,51,+50,32,95,49,48,57,50,41,32,95,49,48,57,55,41,41,41,41,41,41,+32,40,40,40,67,39,32,40,83,39,32,66,41,41,32,40,40,66,32,66,+39,41,32,40,40,66,32,66,39,41,32,40,40,66,32,40,66,32,40,67,+39,32,40,95,51,51,32,95,49,48,57,50,41,41,41,41,32,40,40,66,+32,40,66,32,40,66,32,40,95,50,54,49,32,95,49,48,57,54,41,41,+41,41,32,40,40,66,32,40,66,32,40,40,83,39,32,95,54,48,55,41,+32,40,40,66,32,95,52,50,57,41,32,95,54,48,56,41,41,41,41,32,+40,40,40,67,39,32,40,67,39,32,66,41,41,32,95,57,50,57,41,32,+95,54,49,48,41,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,+66,32,40,66,32,40,95,51,52,32,95,49,48,57,50,41,41,41,41,41,+32,40,40,40,67,39,32,66,41,32,40,66,39,32,40,66,39,32,80,41,+41,41,32,40,40,66,32,40,66,32,40,95,52,55,57,32,95,50,55,55,+41,41,41,32,40,95,52,55,57,32,95,50,55,55,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,32,40,40,40,67,39,32,40,67,39,+32,66,41,41,32,40,40,66,32,40,66,32,40,95,51,51,32,95,49,48,+57,50,41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,95,+50,54,49,41,32,40,40,66,32,40,95,52,53,32,95,49,48,57,50,41,+41,32,40,40,40,67,39,32,40,95,52,57,57,32,95,50,56,50,41,41,+32,95,54,48,49,41,32,35,48,41,41,41,41,32,40,40,66,32,40,95,+50,54,49,32,95,49,48,57,56,41,41,32,40,40,66,32,40,95,50,54,+49,32,95,49,52,55,50,41,41,32,40,40,66,32,40,95,52,54,51,32,+34,105,109,112,111,114,116,105,110,103,32,99,97,99,104,101,100,32,34,41,+41,32,95,57,48,50,41,41,41,41,41,41,32,40,40,66,32,40,95,51,+52,32,95,49,48,57,50,41,41,32,40,40,67,32,80,41,32,40,40,95,+52,56,53,32,95,50,55,55,41,32,40,95,51,53,57,32,35,48,41,41,+41,41,41,41,41,41,32,40,40,65,32,58,54,49,56,32,40,40,66,32,+40,66,32,40,40,95,51,50,32,95,49,48,57,50,41,32,40,95,49,48,+57,56,32,95,49,52,55,57,41,41,41,41,32,40,40,40,83,39,32,40,+83,39,32,66,41,41,32,40,40,66,32,40,66,32,40,95,51,50,32,95,+49,48,57,50,41,41,41,32,40,40,66,32,40,66,32,95,49,48,57,56,+41,41,32,40,40,40,67,39,32,83,41,32,40,40,66,32,40,40,67,39,+32,95,54,49,57,41,32,40,95,56,48,53,32,95,56,48,55,41,41,41,+32,95,54,48,51,41,41,32,40,40,40,67,39,32,95,52,54,51,41,32,+40,40,66,32,40,95,51,57,53,32,40,40,67,32,40,40,83,32,40,40,+67,32,40,95,50,48,50,32,95,49,51,49,41,41,32,35,52,54,41,41,+32,73,41,41,32,35,52,55,41,41,41,32,95,57,48,48,41,41,32,34,+46,104,115,34,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,+85,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,66,+41,41,41,32,40,40,66,32,40,66,32,66,39,41,41,32,40,40,40,67,+39,32,67,41,32,40,40,66,32,40,40,67,39,32,67,39,41,32,40,40,+66,32,83,39,41,32,40,40,66,32,40,67,39,32,40,95,51,51,32,95,+49,48,57,50,41,41,41,32,40,40,40,83,39,32,40,83,39,32,95,50,+54,49,41,41,32,40,40,66,32,40,66,32,40,95,52,53,32,95,49,48,+57,50,41,41,41,32,40,95,50,48,51,32,95,56,57,50,41,41,41,32,+40,40,66,32,40,66,32,40,95,50,54,49,32,95,50,52,41,41,41,32,+40,40,66,32,40,66,32,40,95,52,54,51,32,34,109,111,100,117,108,101,+32,110,97,109,101,32,100,111,101,115,32,110,111,116,32,97,103,114,101,101,+32,119,105,116,104,32,102,105,108,101,32,110,97,109,101,58,32,34,41,41,+41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,95,52,54,51,41,+32,95,57,48,50,41,41,32,40,40,66,32,40,95,52,54,51,32,40,40,+79,32,35,51,50,41,32,75,41,41,41,32,95,57,48,50,41,41,41,41,+41,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,83,39,32,+40,66,32,40,40,95,51,50,32,95,49,48,57,50,41,32,40,95,49,48,+57,56,32,95,49,52,55,57,41,41,41,41,41,41,32,40,40,40,83,39,+32,66,41,32,40,66,39,32,40,40,66,32,40,83,39,32,66,41,41,32,+40,40,66,32,40,66,32,40,95,51,50,32,95,49,48,57,50,41,41,41,+32,40,40,66,32,40,66,32,40,95,50,54,49,32,40,40,95,50,55,50,+32,95,49,48,57,48,41,32,95,52,49,52,41,41,41,41,32,40,40,40,+67,39,32,66,41,32,40,40,66,32,40,95,52,51,32,95,49,48,57,50,+41,41,32,95,54,49,55,41,41,32,40,95,51,57,52,32,40,85,32,40,+75,32,40,90,32,40,90,32,40,40,67,32,79,41,32,75,41,41,41,41,+41,41,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,+66,32,40,66,32,85,41,41,41,41,41,32,40,40,66,32,40,66,32,40,+66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,40,95,51,50,32,+95,49,48,57,50,41,32,40,95,49,48,57,56,32,95,49,52,55,57,41,+41,41,41,41,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,66,+41,41,32,40,40,66,32,66,39,41,32,40,40,66,32,40,66,32,40,67,+39,32,66,41,41,41,32,40,40,40,83,39,32,66,41,32,40,66,39,32,+40,40,66,32,67,39,41,32,40,40,66,32,67,39,41,32,40,40,66,32,+40,83,39,32,40,95,51,51,32,95,49,48,57,50,41,41,41,32,40,40,+40,67,39,32,66,41,32,40,40,66,32,95,50,54,49,41,32,40,40,66,+32,40,95,52,53,32,95,49,48,57,50,41,41,32,40,40,40,67,39,32,+40,95,52,57,57,32,95,50,56,50,41,41,32,95,54,48,49,41,32,35,+50,41,41,41,41,32,40,40,66,32,40,95,50,54,49,32,95,49,48,57,+56,41,41,32,40,40,66,32,40,95,50,54,49,32,95,49,52,55,50,41,+41,32,40,40,66,32,40,95,52,54,51,32,34,116,121,112,101,32,99,104,+101,99,107,101,100,58,92,49,48,38,34,41,41,32,40,40,40,67,39,32,+95,52,54,51,41,32,40,95,49,51,48,52,32,95,56,51,57,41,41,32,+34,45,45,45,45,45,92,49,48,38,34,41,41,41,41,41,41,41,41,41,+41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,+40,67,39,32,66,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,+32,40,66,32,40,66,32,40,40,83,39,32,40,95,51,50,32,95,49,48,+57,50,41,41,32,40,40,66,32,40,95,50,54,49,32,40,95,51,52,32,+95,49,48,57,50,41,41,41,32,40,40,66,32,40,95,50,54,49,32,95,+50,49,41,41,32,95,49,49,49,54,41,41,41,41,41,41,41,41,32,40,+40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,85,41,+41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,+66,32,40,66,32,40,40,95,51,50,32,95,49,48,57,50,41,32,40,95,+49,48,57,56,32,95,49,52,55,57,41,41,41,41,41,41,41,41,32,40,+40,40,67,39,32,66,41,32,40,66,39,32,40,66,39,32,40,66,39,32,+40,40,66,32,40,83,39,32,66,41,41,32,40,40,66,32,40,66,32,40,+95,51,51,32,95,49,48,57,50,41,41,41,32,40,40,40,67,39,32,66,+41,32,40,40,66,32,95,50,54,49,41,32,40,40,66,32,40,95,52,53,+32,95,49,48,57,50,41,41,32,40,40,40,67,39,32,40,95,52,57,57,+32,95,50,56,50,41,41,32,95,54,48,49,41,32,35,51,41,41,41,41,+32,40,40,66,32,40,95,50,54,49,32,95,49,48,57,56,41,41,32,40,+40,66,32,40,95,50,54,49,32,95,49,52,55,50,41,41,32,40,40,66,+32,40,95,52,54,51,32,34,100,101,115,117,103,97,114,101,100,58,92,49,+48,38,34,41,41,32,40,95,49,51,48,52,32,95,54,53,48,41,41,41,+41,41,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,+66,32,40,66,32,40,66,32,40,95,51,52,32,95,49,48,57,50,41,41,+41,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,66,41,41,32,+40,40,66,32,40,66,32,40,67,39,32,40,67,39,32,40,67,39,32,67,+41,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,66,41,41,32,+40,40,66,32,40,66,32,40,67,39,32,66,41,41,41,32,40,40,66,32,+40,66,32,40,66,32,67,41,41,41,32,40,40,66,32,40,66,32,40,67,+32,80,41,41,41,32,40,67,32,40,95,52,56,48,32,95,50,55,55,41,+41,41,41,41,41,32,40,67,32,40,95,52,56,48,32,95,50,55,55,41,+41,41,41,41,32,40,95,52,48,51,32,95,50,55,55,41,41,41,41,41,+41,41,41,32,95,54,50,49,41,41,41,41,41,32,40,40,66,32,40,40,+67,39,32,40,67,39,32,95,49,49,50,51,41,41,32,95,52,49,50,41,+41,32,40,40,83,32,73,41,32,40,90,32,40,90,32,75,41,41,41,41,+41,41,41,41,41,32,40,40,66,32,40,95,51,57,52,32,40,40,67,32,+40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,+40,40,67,32,40,40,67,32,40,40,67,32,40,40,80,32,40,75,32,40,+75,32,75,41,41,41,32,40,75,32,40,75,32,75,41,41,41,41,32,40,+75,32,40,75,32,75,41,41,41,41,32,40,75,32,40,75,32,75,41,41,+41,41,32,40,75,32,40,75,32,75,41,41,41,41,32,40,40,67,32,79,+41,32,75,41,41,41,32,40,75,32,40,75,32,40,75,32,75,41,41,41,+41,41,32,40,75,32,40,75,32,75,41,41,41,41,32,40,75,32,40,75,+32,40,75,32,40,75,32,75,41,41,41,41,41,41,32,40,75,32,40,75,+32,40,75,32,40,75,32,75,41,41,41,41,41,41,32,40,75,32,75,41,+41,41,41,32,40,85,32,40,75,32,65,41,41,41,41,41,41,32,40,85,+32,40,90,32,75,41,41,41,41,41,32,40,95,57,57,54,32,95,57,57,+57,41,41,41,41,41,41,32,40,40,65,32,58,54,49,57,32,40,40,66,+32,40,40,83,39,32,40,83,39,32,40,95,51,50,32,95,49,52,53,50,+41,41,41,32,95,54,50,48,41,41,32,40,40,40,67,39,32,40,67,39,+32,40,67,39,32,80,41,41,41,32,40,40,40,67,39,32,66,41,32,40,+66,39,32,40,40,66,32,95,50,54,49,41,32,95,56,51,54,41,41,41,+32,40,40,66,32,40,66,32,40,95,52,54,51,32,34,70,105,108,101,32,+110,111,116,32,102,111,117,110,100,58,32,34,41,41,41,32,40,40,66,32,+40,40,67,39,32,95,52,54,51,41,32,40,95,49,53,57,48,32,40,95,+51,57,49,32,95,49,52,57,41,41,41,41,32,40,40,66,32,40,95,52,+54,51,32,34,92,49,48,38,112,97,116,104,61,34,41,41,32,40,95,49,+53,57,48,32,40,95,51,57,49,32,40,95,51,57,49,32,95,49,52,57,+41,41,41,41,41,41,41,41,32,40,85,32,40,40,66,32,40,40,67,39,+32,40,95,51,50,32,95,49,52,53,50,41,41,32,95,49,52,55,54,41,+41,32,40,40,66,32,40,66,32,40,95,51,52,32,95,49,52,53,50,41,+41,41,32,80,41,41,41,41,41,41,32,40,40,65,32,58,54,50,48,32,+40,40,40,67,39,32,66,41,32,40,85,32,40,40,95,51,52,32,95,49,+52,53,50,41,32,95,52,55,54,41,41,41,32,40,40,40,83,39,32,66,+41,32,40,40,66,32,40,67,39,32,40,40,83,39,32,40,95,51,50,32,+95,49,52,53,50,41,41,32,40,40,67,32,95,49,52,54,51,41,32,95,+49,52,52,54,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,66,+41,41,32,40,40,66,32,40,66,32,80,41,41,32,40,67,32,95,54,50,+48,41,41,41,32,40,40,66,32,40,66,32,40,95,51,52,32,95,49,52,+53,50,41,41,41,32,40,40,66,32,40,66,32,95,52,55,55,41,41,32,+80,41,41,41,41,41,32,40,40,66,32,40,67,32,95,52,54,51,41,41,+32,40,95,52,54,51,32,40,40,79,32,35,52,55,41,32,75,41,41,41,+41,41,41,32,40,40,65,32,58,54,50,49,32,40,85,32,40,40,40,83,+39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,+39,32,40,67,39,32,66,41,41,41,41,41,41,41,32,40,40,66,32,40,+66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,95,50,54,+49,41,41,41,41,41,41,41,32,95,49,49,49,53,41,41,32,40,40,66,+32,40,66,32,40,95,50,54,49,32,40,95,51,57,53,32,95,54,55,52,+41,41,41,41,32,40,40,66,32,40,66,32,40,95,50,54,49,32,95,54,+55,51,41,41,41,32,40,40,66,32,95,51,57,52,41,32,95,54,50,50,+41,41,41,41,41,41,32,40,40,65,32,58,54,50,50,32,40,40,40,67,+39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,83,39,32,+67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,+32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,+40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,+83,39,32,80,41,32,40,90,32,40,40,40,67,39,32,67,41,32,40,40,+40,67,39,32,40,83,39,32,67,41,41,32,40,40,40,67,39,32,40,67,+39,32,40,67,39,32,95,52,49,51,41,41,41,32,40,40,66,32,40,66,+32,40,66,32,40,66,32,85,41,41,41,41,32,40,40,66,32,40,66,32,+40,66,32,90,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,+39,32,40,67,39,32,66,41,41,41,41,32,40,40,66,32,40,66,32,40,+66,32,40,66,32,40,67,39,32,66,41,41,41,41,41,32,40,40,40,67,+39,32,40,67,39,32,40,67,39,32,40,67,39,32,67,41,41,41,41,32,+40,40,40,67,39,32,66,41,32,40,66,39,32,40,66,39,32,40,40,66,+32,40,67,39,32,83,39,41,41,32,40,40,66,32,66,39,41,32,40,40,+66,32,40,66,32,80,41,41,32,95,57,48,53,41,41,41,41,41,41,32,+40,40,66,32,40,66,32,40,66,32,40,66,32,40,40,83,39,32,95,50,+54,49,41,32,95,54,52,54,41,41,41,41,41,32,40,40,66,32,40,66,+32,40,66,32,40,40,67,39,32,40,83,39,32,95,50,54,49,41,41,32,+40,89,32,40,40,66,32,40,40,67,39,32,66,41,32,83,41,41,32,40,+40,40,83,39,32,40,83,39,32,40,83,39,32,67,41,41,41,32,40,40,+66,32,40,66,32,40,66,32,40,67,32,83,39,41,41,41,41,32,40,40,+66,32,40,67,32,40,83,39,32,66,41,41,41,32,40,40,66,32,40,66,+32,90,41,41,32,40,67,39,32,67,41,41,41,41,41,32,40,40,66,32,+40,67,32,40,83,39,32,66,41,41,41,32,40,40,66,32,40,66,32,40,+66,32,40,40,67,39,32,66,41,32,40,40,66,32,95,54,55,54,41,32,+40,40,66,32,40,95,54,55,54,32,40,95,54,55,56,32,40,95,55,56,+49,32,34,115,101,113,34,41,41,41,41,32,95,54,55,53,41,41,41,41,+41,41,32,40,67,39,32,67,41,41,41,41,41,41,41,41,41,41,32,40,+40,40,67,39,32,40,83,39,32,66,41,41,32,40,40,66,32,66,39,41,+32,40,40,66,32,40,66,32,95,50,54,49,41,41,32,40,40,66,32,40,+66,32,95,54,52,54,41,41,32,40,40,66,32,40,40,67,39,32,95,51,+57,52,41,32,40,40,66,32,85,41,32,40,40,66,32,90,41,32,40,40,+67,32,40,67,39,32,79,41,41,32,75,41,41,41,41,41,32,40,95,52,+49,50,32,40,40,95,49,56,52,32,95,49,57,56,41,32,35,48,41,41,+41,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,66,41,41,32,+40,40,66,32,40,66,32,95,54,52,55,41,41,32,40,66,32,95,54,55,+53,41,41,41,32,40,95,51,57,53,32,95,54,55,53,41,41,41,41,41,+41,41,32,40,40,66,32,40,95,51,57,52,32,40,85,32,40,90,32,40,+40,40,67,39,32,79,41,32,40,40,66,32,95,56,57,55,41,32,40,40,+66,32,40,95,52,54,51,32,34,36,120,34,41,41,32,40,95,49,53,57,+48,32,95,50,56,51,41,41,41,41,32,75,41,41,41,41,41,32,40,95,+52,49,50,32,40,40,95,49,56,52,32,95,49,57,56,41,32,35,48,41,+41,41,41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,95,+52,54,51,41,32,40,40,67,32,40,40,67,32,95,51,57,50,41,32,40,+40,79,32,95,49,50,52,41,32,75,41,41,41,32,95,52,54,49,41,41,+41,32,40,40,66,32,40,95,51,57,53,32,95,53,54,53,41,41,32,40,+40,95,49,55,55,32,95,50,54,52,41,32,40,95,51,57,53,32,95,53,+54,54,41,41,41,41,41,41,41,41,32,40,40,95,49,56,52,32,95,49,+57,56,41,32,35,48,41,41,41,32,73,41,41,32,40,40,66,32,95,56,+57,55,41,32,40,40,66,32,40,95,52,54,51,32,34,36,102,34,41,41,+32,40,95,49,53,57,48,32,95,50,56,51,41,41,41,41,41,41,32,40,+90,32,40,40,66,32,85,41,32,40,90,32,40,90,32,40,40,66,32,90,+41,32,40,40,40,67,39,32,40,67,39,32,79,41,41,32,40,40,40,67,+39,32,40,67,39,32,80,41,41,32,95,57,48,53,41,32,40,95,54,55,+56,32,40,95,55,56,49,32,40,40,79,32,35,55,51,41,32,75,41,41,+41,41,41,32,75,41,41,41,41,41,41,41,41,32,40,75,32,40,75,32,+95,52,54,49,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,79,+41,41,32,40,40,40,83,39,32,66,41,32,80,41,32,40,40,66,32,95,+54,50,53,41,32,40,95,56,48,53,32,95,56,48,55,41,41,41,41,32,+75,41,41,41,32,40,75,32,40,75,32,95,52,54,49,41,41,41,41,32,+40,75,32,95,52,54,49,41,41,41,32,40,40,66,32,90,41,32,40,40,+40,67,39,32,40,67,39,32,79,41,41,32,40,40,66,32,40,67,32,80,+41,41,32,40,40,66,32,40,95,50,54,49,32,95,54,55,56,41,41,32,+95,55,56,50,41,41,41,32,75,41,41,41,41,32,40,75,32,40,75,32,+95,52,54,49,41,41,41,41,32,40,40,66,32,40,66,32,90,41,41,32,+40,40,66,32,40,66,32,40,67,32,66,41,41,41,32,40,40,66,32,40,+66,32,40,66,32,90,41,41,41,32,40,40,40,83,39,32,40,67,39,32,+66,41,41,32,40,40,66,32,40,66,32,67,41,41,32,40,40,40,67,39,+32,40,83,39,32,40,67,39,32,83,41,41,41,32,40,40,40,67,39,32,+40,67,39,32,40,67,39,32,40,67,39,32,67,41,41,41,41,32,40,40,+40,83,39,32,66,41,32,40,40,66,32,40,83,39,32,66,41,41,32,40,+40,66,32,40,66,32,40,83,39,32,40,83,39,32,95,52,54,50,41,41,+41,41,32,40,40,40,67,39,32,40,67,39,32,66,41,41,32,40,40,66,+32,66,39,41,32,40,40,66,32,40,66,32,80,41,41,32,40,40,40,67,+39,32,66,41,32,40,40,66,32,95,50,54,49,41,32,95,57,48,53,41,+41,32,95,49,50,53,49,41,41,41,41,32,40,40,40,83,39,32,66,41,+32,40,40,66,32,95,50,54,49,41,32,95,54,52,54,41,41,32,40,40,+66,32,40,40,83,39,32,95,50,54,49,41,32,95,54,55,55,41,41,32,+40,40,66,32,40,40,67,39,32,95,54,52,55,41,32,95,54,55,53,41,+41,32,40,95,51,57,53,32,95,54,55,53,41,41,41,41,41,41,41,41,+32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,+83,39,32,67,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,+40,66,32,40,40,67,39,32,40,67,39,32,95,52,49,51,41,41,32,40,+40,66,32,40,66,32,40,40,67,39,32,66,41,32,40,40,66,32,80,41,+32,95,57,48,54,41,41,41,41,32,40,40,66,32,40,40,83,39,32,66,+41,32,40,40,66,32,95,50,54,49,41,32,95,54,55,55,41,41,41,32,+40,40,66,32,40,40,67,39,32,66,41,32,40,40,66,32,95,54,55,54,+41,32,95,54,55,53,41,41,41,32,40,40,40,67,39,32,66,41,32,40,+40,66,32,95,50,54,49,41,32,95,54,52,54,41,41,32,95,54,55,53,+41,41,41,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,+95,52,54,51,41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,+32,40,67,39,32,95,51,57,52,41,41,32,40,40,40,67,39,32,40,67,+39,32,40,67,39,32,79,41,41,41,32,40,40,40,67,39,32,66,41,32,+40,66,39,32,40,40,66,32,95,50,54,49,41,32,95,57,48,53,41,41,+41,32,95,49,51,49,56,41,41,32,75,41,41,41,32,40,40,66,32,40,+40,95,49,56,54,32,95,49,57,56,41,32,40,40,95,52,56,53,32,95,+50,55,55,41,32,40,95,51,53,57,32,35,49,41,41,41,41,32,95,52,+49,49,41,41,41,41,41,32,73,41,41,41,32,40,95,56,57,55,32,34,+36,102,34,41,41,41,32,40,40,66,32,40,66,32,40,95,51,57,52,32,+40,40,40,67,39,32,79,41,32,40,40,66,32,95,56,57,55,41,32,40,+40,66,32,40,95,52,54,51,32,34,36,120,34,41,41,32,40,95,49,53,+57,48,32,95,50,56,51,41,41,41,41,32,75,41,41,41,41,32,40,40,+66,32,40,66,32,40,40,95,49,56,54,32,95,49,57,56,41,32,40,40,+95,52,56,53,32,95,50,55,55,41,32,40,95,51,53,57,32,35,49,41,+41,41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,40,95,+52,55,57,32,95,50,55,55,41,41,32,95,52,49,49,41,41,32,95,52,+49,49,41,41,41,41,41,41,32,40,40,66,32,95,51,57,52,41,32,40,+40,66,32,40,67,32,40,40,80,32,40,75,32,40,75,32,75,41,41,41,+32,40,75,32,40,75,32,75,41,41,41,41,41,32,40,40,66,32,90,41,+32,40,40,40,67,39,32,40,67,39,32,79,41,41,32,95,57,48,53,41,+32,75,41,41,41,41,41,41,41,41,41,41,32,40,75,32,40,75,32,40,+75,32,40,75,32,95,52,54,49,41,41,41,41,41,41,32,40,75,32,95,+52,54,49,41,41,41,32,40,40,65,32,58,54,50,51,32,40,40,40,67,+39,32,95,55,57,49,41,32,40,40,40,67,39,32,79,41,32,40,80,32,+95,52,54,49,41,41,32,75,41,41,32,95,52,54,49,41,41,32,40,40,+65,32,58,54,50,52,32,40,40,40,67,39,32,67,41,32,40,40,66,32,+40,80,32,40,40,40,67,39,32,40,67,39,32,79,41,41,32,40,40,40,+83,39,32,66,41,32,80,41,32,40,40,66,32,95,54,50,53,41,32,40,+95,56,48,53,32,95,56,48,55,41,41,41,41,32,75,41,41,41,32,40,+40,40,83,39,32,66,41,32,40,40,66,32,40,67,39,32,95,52,54,50,+41,41,32,40,40,40,67,39,32,66,41,32,80,41,32,95,54,51,55,41,+41,41,32,40,40,40,67,39,32,40,83,39,32,95,51,57,52,41,41,32,+40,40,40,67,39,32,40,67,39,32,40,67,39,32,79,41,41,41,32,40,+40,66,32,40,66,32,40,83,32,80,41,41,41,32,40,40,66,32,40,66,+32,40,66,32,95,54,51,55,41,41,41,32,40,40,40,67,39,32,66,41,+32,40,66,39,32,40,40,66,32,95,55,52,56,41,32,95,55,52,51,41,+41,41,32,40,40,40,67,39,32,40,67,39,32,79,41,41,32,40,40,40,+67,39,32,66,41,32,80,41,32,40,40,66,32,40,95,50,54,49,32,95,+54,50,51,41,41,32,95,55,52,51,41,41,41,32,75,41,41,41,41,41,+32,75,41,41,32,95,55,57,52,41,41,41,41,32,40,75,32,40,75,32,+95,52,54,49,41,41,41,41,32,40,40,65,32,58,54,50,53,32,40,40,+66,32,40,83,32,40,85,32,95,49,51,48,50,41,41,41,32,40,40,66,+32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,85,41,41,32,40,+40,66,32,40,66,32,90,41,41,32,40,40,40,67,39,32,83,41,32,40,+40,40,67,39,32,40,67,39,32,67,39,41,41,32,40,40,66,32,40,66,+32,83,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,40,+83,39,32,40,95,51,57,55,32,95,54,55,55,41,41,41,41,41,32,40,+40,40,67,39,32,66,41,32,40,40,66,32,40,67,39,32,67,41,41,32,+40,40,67,32,40,40,40,67,39,32,67,39,41,32,40,40,66,32,83,39,+41,32,95,54,53,53,41,41,32,95,52,54,51,41,41,32,40,95,51,57,+53,32,95,54,55,53,41,41,41,41,32,40,95,51,57,53,32,40,85,32,+40,40,66,32,40,67,32,40,40,40,83,39,32,40,83,39,32,67,41,41,+32,40,40,66,32,40,67,32,80,41,41,32,95,54,50,56,41,41,32,40,+40,40,67,39,32,66,41,32,40,40,66,32,95,49,50,48,41,32,95,54,+50,54,41,41,32,40,95,52,48,55,32,95,54,50,55,41,41,41,41,41,+32,40,95,51,57,53,32,95,54,52,48,41,41,41,41,41,41,32,73,41,+41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,95,50,54,49,+41,32,40,40,66,32,95,52,48,57,41,32,95,52,49,49,41,41,41,32,+40,95,54,52,56,32,34,36,113,34,41,41,41,41,32,40,40,66,32,40,+95,50,54,49,32,95,56,50,53,41,41,32,40,95,55,56,55,32,40,95,+56,57,55,32,75,41,41,41,41,41,41,41,41,41,32,40,40,65,32,58,+54,50,54,32,40,85,32,40,90,32,40,40,80,32,95,49,50,53,41,32,+40,40,67,32,66,41,32,40,40,66,32,90,41,32,40,40,40,67,39,32,+80,41,32,40,40,80,32,95,49,50,52,41,32,40,75,32,40,75,32,95,+49,50,53,41,41,41,41,32,40,75,32,40,75,32,95,49,50,53,41,41,+41,41,41,41,41,41,41,32,40,40,65,32,58,54,50,55,32,40,40,67,+32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,+32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,+32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,+32,40,40,80,32,40,75,32,95,49,50,52,41,41,32,40,40,40,67,39,+32,66,41,32,40,40,66,32,95,49,50,48,41,32,95,54,50,55,41,41,+32,95,54,50,55,41,41,41,32,40,75,32,40,75,32,95,49,51,48,50,+41,41,41,41,32,40,75,32,95,49,51,48,50,41,41,41,32,40,75,32,+40,75,32,95,49,50,53,41,41,41,41,32,40,75,32,40,75,32,95,49,+51,48,50,41,41,41,41,32,40,75,32,40,75,32,95,49,51,48,50,41,+41,41,41,32,40,75,32,95,49,51,48,50,41,41,41,32,40,75,32,95,+49,51,48,50,41,41,41,32,40,75,32,40,75,32,95,49,51,48,50,41,+41,41,41,32,40,75,32,40,75,32,95,49,51,48,50,41,41,41,41,32,+40,75,32,40,75,32,95,49,51,48,50,41,41,41,41,32,40,75,32,40,+75,32,40,75,32,95,49,51,48,50,41,41,41,41,41,32,40,75,32,40,+75,32,95,49,51,48,50,41,41,41,41,32,40,75,32,95,54,50,55,41,+41,41,32,40,75,32,95,49,51,48,50,41,41,41,32,40,75,32,95,49,+50,52,41,41,41,32,40,75,32,40,75,32,95,49,51,48,50,41,41,41,+41,32,40,40,65,32,58,54,50,56,32,40,85,32,40,40,66,32,40,40,+67,39,32,95,50,54,51,41,32,95,54,51,49,41,41,32,95,54,50,57,+41,41,41,32,40,40,65,32,58,54,50,57,32,40,40,67,32,83,41,32,+40,40,66,32,40,67,32,66,41,41,32,40,40,66,32,40,40,83,39,32,+40,83,39,32,83,41,41,32,40,40,40,67,39,32,67,41,32,40,40,66,+32,40,40,67,39,32,67,39,41,32,83,39,41,41,32,40,40,40,67,39,+32,40,67,39,32,66,41,41,32,40,40,67,32,66,41,32,95,54,51,55,+41,41,32,40,90,32,75,41,41,41,41,32,40,90,32,75,41,41,41,41,+32,40,40,66,32,40,66,32,40,40,67,39,32,67,41,32,40,40,40,67,+39,32,40,67,39,32,83,41,41,32,40,40,66,32,40,66,32,40,40,67,+39,32,83,41,32,40,67,32,95,54,54,56,41,41,41,41,32,40,40,66,+32,40,66,32,40,66,32,40,95,50,54,49,32,95,54,51,55,41,41,41,+41,32,40,40,66,32,67,41,32,40,40,67,39,32,95,54,51,48,41,32,+95,55,52,51,41,41,41,41,41,32,40,40,66,32,95,54,52,57,41,32,+95,55,50,50,41,41,41,41,41,32,40,67,32,95,54,50,57,41,41,41,+41,41,41,32,40,40,65,32,58,54,51,48,32,40,40,66,32,89,41,32,+40,40,40,83,39,32,40,83,39,32,40,83,39,32,83,41,41,41,32,40,+40,66,32,40,66,32,40,67,32,40,83,39,32,66,41,41,41,41,32,40,+40,40,67,39,32,40,67,39,32,40,67,39,32,40,83,39,32,40,67,39,+32,67,41,41,41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,+32,40,83,39,32,66,41,41,32,40,40,66,32,40,66,32,67,41,41,32,+40,40,66,32,40,66,32,40,67,32,83,39,41,41,41,32,40,40,66,32,+40,66,32,40,66,32,40,66,32,40,67,32,95,55,52,56,41,41,41,41,+41,32,40,40,66,32,40,40,67,39,32,40,67,39,32,40,67,39,32,79,+41,41,41,32,40,40,66,32,40,66,32,40,67,32,80,41,41,41,32,40,+40,40,67,39,32,40,67,39,32,95,55,57,49,41,41,32,40,40,40,67,+39,32,40,67,39,32,79,41,41,32,40,67,32,80,41,41,32,75,41,41,+32,95,52,54,49,41,41,41,41,32,40,40,40,67,39,32,79,41,32,40,+40,66,32,40,80,32,40,95,55,52,51,32,95,57,49,52,41,41,41,32,+95,54,50,51,41,41,32,75,41,41,41,41,41,41,41,32,40,40,40,67,+39,32,40,67,39,32,40,83,39,32,40,67,39,32,67,41,41,41,41,32,+40,40,40,67,39,32,40,67,39,32,40,83,39,32,40,67,39,32,67,41,+41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,83,39,32,40,67,+39,32,67,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,83,+39,32,40,67,39,32,67,41,41,41,41,32,40,40,40,67,39,32,40,67,+39,32,40,83,39,32,40,67,39,32,67,41,41,41,41,32,40,40,40,67,+39,32,40,67,39,32,40,83,39,32,40,67,39,32,67,41,41,41,41,32,+40,40,40,67,39,32,40,67,39,32,40,83,39,32,40,67,39,32,67,41,+41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,83,39,32,40,67,+39,32,67,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,83,+39,32,40,67,39,32,67,41,41,41,41,32,40,40,40,67,39,32,40,67,+39,32,40,83,39,32,40,67,39,32,67,41,41,41,41,32,40,40,40,67,+39,32,40,67,39,32,40,83,39,32,40,67,39,32,67,41,41,41,41,32,+40,40,40,67,39,32,40,67,39,32,40,83,39,32,40,67,39,32,67,41,+41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,83,39,32,40,67,+39,32,67,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,83,+39,32,40,67,39,32,67,41,41,41,41,32,40,40,40,67,39,32,40,67,+39,32,40,83,39,32,40,67,39,32,67,41,41,41,41,32,40,40,40,67,+39,32,40,67,39,32,40,83,39,32,40,67,39,32,67,41,41,41,41,32,+40,40,40,67,39,32,40,67,39,32,40,83,39,32,40,67,39,32,80,41,+41,41,41,32,40,40,66,32,40,66,32,40,40,67,39,32,66,41,32,40,+40,66,32,67,41,32,40,67,32,40,95,57,48,52,32,34,68,97,116,97,+46,66,111,111,108,46,111,116,104,101,114,119,105,115,101,34,41,41,41,41,+41,41,32,67,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,+41,41,32,75,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,+41,41,32,40,90,32,75,41,41,41,32,75,41,41,32,75,41,41,32,40,+90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,+41,41,32,40,90,32,40,90,32,75,41,41,41,41,32,40,90,32,75,41,+41,41,32,40,90,32,75,41,41,41,32,75,41,41,32,75,41,41,32,40,+90,32,75,41,41,41,41,32,75,41,41,41,32,40,40,40,67,39,32,40,+67,39,32,67,41,41,32,40,40,66,32,40,66,32,40,40,67,39,32,67,+39,41,32,83,41,41,41,32,40,40,40,67,39,32,40,83,39,32,40,83,+39,32,40,67,39,32,67,41,41,41,41,32,40,40,66,32,40,66,32,40,+66,32,40,40,67,39,32,40,67,39,32,83,39,41,41,32,40,40,66,32,+85,41,32,40,90,32,75,41,41,41,41,41,41,32,40,40,67,39,32,40,+67,39,32,40,67,39,32,67,41,41,41,32,40,40,66,32,40,66,32,40,+66,32,40,67,32,95,55,53,53,41,41,41,41,32,67,41,41,41,41,32,+40,40,66,32,40,66,32,40,66,32,40,67,32,95,55,52,57,41,41,41,+41,32,67,41,41,41,41,32,40,40,40,110,111,77,97,116,99,104,32,34,+115,114,99,47,77,105,99,114,111,72,115,47,68,101,115,117,103,97,114,46,+104,115,34,41,32,35,49,50,52,41,32,35,49,41,41,41,41,41,32,40,+40,65,32,58,54,51,49,32,40,40,83,32,83,41,32,40,40,66,32,90,+41,32,40,40,66,32,90,41,32,40,40,40,83,39,32,67,41,32,40,40,+66,32,40,67,32,40,40,40,67,39,32,83,39,41,32,40,40,66,32,89,+41,32,40,40,40,67,39,32,66,41,32,40,66,39,32,80,41,41,32,40,+40,40,83,39,32,40,83,39,32,67,41,41,32,40,40,66,32,40,66,32,+40,67,32,83,39,41,41,41,32,40,40,66,32,40,66,32,40,66,32,85,+41,41,41,32,40,66,32,40,66,32,40,40,67,39,32,40,67,39,32,95,+50,54,49,41,41,32,95,54,51,50,41,41,41,41,41,41,32,40,40,40,+83,39,32,40,83,39,32,40,83,39,32,83,41,41,41,32,40,40,66,32,+40,66,32,40,66,32,40,67,32,83,41,41,41,41,32,40,40,66,32,40,+66,32,40,66,32,40,66,32,40,67,32,66,41,41,41,41,41,32,40,40,+40,67,39,32,40,67,39,32,40,67,39,32,66,41,41,41,32,40,40,66,+32,40,66,32,40,66,32,67,41,41,41,32,40,40,66,32,40,66,32,40,+66,32,40,40,67,39,32,67,39,41,32,67,39,41,41,41,41,32,40,66,+32,40,66,32,40,40,67,39,32,40,67,39,32,95,50,54,49,41,41,32,+95,54,51,51,41,41,41,41,41,41,32,40,90,32,75,41,41,41,41,41,+32,40,40,66,32,40,67,39,32,67,41,41,32,40,40,66,32,40,66,32,+40,40,67,39,32,83,41,32,40,40,67,39,32,95,54,51,52,41,32,40,+40,80,32,40,40,40,110,111,77,97,116,99,104,32,75,41,32,35,48,41,+32,35,48,41,41,32,75,41,41,41,41,41,32,40,40,67,32,67,39,41,+32,40,40,80,32,40,40,40,110,111,77,97,116,99,104,32,75,41,32,35,+48,41,32,35,48,41,41,32,65,41,41,41,41,41,41,41,41,41,32,40,+95,54,52,56,32,34,36,109,34,41,41,41,41,32,40,40,66,32,40,66,+32,40,95,56,55,53,32,40,95,52,57,56,32,95,56,57,51,41,41,41,+41,32,40,40,66,32,40,66,32,40,95,50,54,49,32,40,95,51,57,53,+32,40,40,83,32,73,41,32,40,40,40,67,39,32,40,67,39,32,66,41,+41,32,40,40,66,32,40,66,32,67,41,41,32,80,41,41,32,95,55,50,+49,41,41,41,41,41,41,32,40,40,66,32,40,66,32,95,54,55,51,41,+41,32,40,40,66,32,40,66,32,40,95,50,54,49,32,95,51,57,51,41,+41,41,32,40,40,67,39,32,40,95,52,49,51,32,95,54,50,52,41,41,+32,40,95,54,52,56,32,34,36,112,34,41,41,41,41,41,41,41,41,32,+40,95,51,57,52,32,95,56,50,53,41,41,41,41,41,41,32,40,40,65,+32,58,54,51,50,32,95,54,54,56,41,32,40,40,65,32,58,54,51,51,+32,40,40,40,83,39,32,66,41,32,95,54,51,50,41,32,40,40,66,32,+40,66,32,40,95,54,55,54,32,40,95,54,55,56,32,40,95,55,56,49,+32,40,40,79,32,35,56,57,41,32,75,41,41,41,41,41,41,32,95,54,+55,55,41,41,41,32,40,40,65,32,58,54,51,52,32,40,40,40,67,39,+32,66,41,32,40,40,66,32,67,41,32,40,40,40,67,39,32,40,67,39,+32,83,41,41,32,40,40,40,83,39,32,40,67,39,32,40,67,39,32,66,+41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,40,67,39,+32,40,83,39,32,95,50,54,49,41,41,41,32,40,40,40,67,39,32,66,+41,32,40,66,39,32,95,54,51,51,41,41,32,40,40,66,32,40,67,32,+95,50,54,49,41,41,32,40,40,66,32,95,54,51,56,41,32,40,85,32,+65,41,41,41,41,41,41,32,85,41,41,32,40,40,66,32,40,66,32,40,+95,50,54,49,32,40,40,95,51,57,55,32,95,50,54,51,41,32,95,50,+54,52,41,41,41,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,+39,32,40,67,39,32,95,52,49,51,41,41,32,40,40,66,32,40,66,32,+40,66,32,40,67,32,95,54,51,50,41,41,41,41,32,40,40,66,32,40,+40,67,39,32,67,41,32,40,40,66,32,40,67,32,95,54,51,57,41,41,+32,95,52,49,49,41,41,41,32,95,54,55,53,41,41,41,32,40,40,95,+49,56,52,32,95,49,57,56,41,32,40,40,95,52,56,53,32,95,50,55,+55,41,32,40,95,51,53,57,32,35,48,41,41,41,41,41,32,73,41,41,+41,41,32,40,85,32,75,41,41,41,41,32,95,52,49,52,41,41,32,40,+40,65,32,58,54,51,53,32,40,40,83,32,40,40,83,32,40,40,40,83,+39,32,95,49,50,49,41,32,40,40,95,52,57,56,32,95,51,48,54,41,+32,40,40,95,51,55,50,32,95,50,55,56,41,32,40,95,49,50,55,32,+95,50,55,57,41,41,41,41,32,40,40,67,32,40,95,52,57,55,32,95,+51,48,54,41,41,32,40,40,95,51,55,50,32,95,50,55,56,41,32,40,+95,49,50,56,32,95,50,55,57,41,41,41,41,41,32,40,40,66,32,40,+95,54,55,54,32,40,95,54,55,53,32,40,95,56,57,55,32,34,68,97,+116,97,46,73,110,116,101,103,101,114,46,95,105,110,116,76,105,115,116,84,+111,73,110,116,101,103,101,114,34,41,41,41,41,32,40,40,66,32,95,55,+48,50,41,32,40,40,66,32,40,95,51,57,53,32,40,40,95,50,54,51,+32,95,54,55,56,41,32,95,55,55,53,41,41,41,32,95,51,53,51,41,+41,41,41,41,32,40,40,66,32,40,95,54,55,54,32,40,95,54,55,53,+32,40,95,56,57,55,32,34,68,97,116,97,46,73,110,116,101,103,101,114,+95,84,121,112,101,46,95,105,110,116,84,111,73,110,116,101,103,101,114,34,+41,41,41,41,32,40,40,66,32,95,54,55,56,41,32,40,40,66,32,95,+55,55,53,41,32,95,51,54,48,41,41,41,41,41,32,40,40,65,32,58,+54,51,54,32,40,40,40,83,39,32,95,54,55,54,41,32,40,40,66,32,+40,95,54,55,54,32,40,95,54,55,53,32,40,95,56,57,55,32,34,68,+97,116,97,46,82,97,116,105,111,95,84,121,112,101,46,95,109,107,82,97,+116,105,111,110,97,108,34,41,41,41,41,32,40,40,66,32,95,54,51,53,+41,32,95,53,50,54,41,41,41,32,40,40,66,32,95,54,51,53,41,32,+95,53,50,55,41,41,41,32,40,40,65,32,58,54,51,55,32,40,40,67,+32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,+32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,83,32,40,40,67,+32,40,40,67,32,40,40,83,32,40,40,67,32,40,40,83,32,40,40,67,+32,40,40,80,32,95,54,55,53,41,32,40,40,40,67,39,32,66,41,32,+40,40,66,32,95,54,55,54,41,32,95,54,51,55,41,41,32,95,54,51,+55,41,41,41,32,40,75,32,40,75,32,95,49,51,48,50,41,41,41,41,+32,40,40,66,32,95,54,50,53,41,32,40,95,56,48,53,32,95,56,48,+56,41,41,41,41,32,40,75,32,40,40,83,32,40,40,40,67,39,32,83,+41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,+40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,+40,67,39,32,83,41,32,40,40,67,32,40,40,67,32,67,39,41,32,75,+41,41,32,95,54,51,53,41,41,32,75,41,41,32,95,54,51,54,41,41,+32,40,40,66,32,95,54,55,56,41,32,40,40,66,32,95,55,55,53,41,+32,95,49,51,55,41,41,41,41,32,75,41,41,32,75,41,41,32,75,41,+41,32,95,54,55,56,41,41,41,41,32,40,40,66,32,95,54,53,50,41,+32,40,95,56,48,53,32,95,56,48,56,41,41,41,41,32,40,40,40,67,+39,32,66,41,32,95,54,51,49,41,32,95,54,51,55,41,41,41,32,40,+40,66,32,40,95,50,54,49,32,40,95,54,55,55,32,40,95,56,57,55,+32,34,36,102,34,41,41,41,41,32,40,40,66,32,40,95,50,54,49,32,+40,40,95,51,57,57,32,95,54,55,54,41,32,40,40,95,50,54,49,32,+95,54,55,53,41,32,40,95,56,57,55,32,34,36,102,34,41,41,41,41,+41,32,40,95,51,57,53,32,95,54,51,55,41,41,41,41,41,32,40,40,+40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,+39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,66,32,40,80,+32,40,40,66,32,40,95,50,54,49,32,95,55,48,50,41,41,32,40,95,+51,57,53,32,95,54,51,55,41,41,41,41,32,40,40,66,32,40,40,83,+39,32,80,41,32,40,40,66,32,95,54,51,55,41,32,40,40,66,32,95,+55,53,49,41,32,40,40,66,32,95,55,54,54,41,32,40,40,67,32,79,+41,32,75,41,41,41,41,41,41,32,40,40,40,67,39,32,40,83,39,32,+40,67,39,32,83,41,41,41,32,40,40,40,67,39,32,40,83,39,32,67,+41,41,32,40,40,66,32,40,66,32,40,67,32,83,39,41,41,41,32,40,+40,66,32,40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,40,67,+39,32,40,67,39,32,40,67,39,32,67,39,41,41,41,32,40,40,66,32,+40,66,32,40,66,32,40,67,39,32,40,95,54,57,48,32,40,95,54,55,+53,32,40,95,56,57,55,32,34,68,97,116,97,46,76,105,115,116,46,99,+111,110,99,97,116,77,97,112,34,41,41,41,41,41,41,41,32,40,40,66,+32,40,66,32,40,66,32,40,66,32,95,54,51,55,41,41,41,41,32,40,+40,66,32,40,66,32,40,66,32,40,40,83,39,32,95,55,54,49,41,32,+40,40,40,67,39,32,79,41,32,95,55,52,51,41,32,75,41,41,41,41,+41,32,40,40,66,32,40,66,32,40,66,32,40,40,67,39,32,95,55,52,+56,41,32,95,55,52,51,41,41,41,41,32,40,40,40,67,39,32,40,67,+39,32,40,67,39,32,79,41,41,41,32,40,40,66,32,40,66,32,40,67,+32,80,41,41,41,32,40,40,66,32,40,66,32,40,95,50,54,49,32,95,+54,50,51,41,41,41,32,40,40,66,32,40,66,32,95,55,53,49,41,41,+32,95,55,54,55,41,41,41,41,32,40,40,79,32,40,40,80,32,40,95,+55,52,51,32,95,57,49,52,41,41,32,40,40,95,50,54,49,32,95,54,+50,51,41,32,40,95,55,53,49,32,40,95,55,54,54,32,95,52,54,49,+41,41,41,41,41,32,75,41,41,41,41,41,41,41,32,95,54,51,55,41,+41,41,32,40,40,66,32,95,54,52,57,41,32,95,56,51,48,41,41,41,+41,32,40,40,66,32,40,66,32,40,66,32,95,54,51,55,41,41,41,32,+40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,66,32,40,66,+32,40,67,32,95,55,53,53,41,41,41,32,40,40,66,32,40,66,32,95,+55,53,49,41,41,32,95,55,54,55,41,41,41,32,40,95,55,53,49,32,+40,95,55,54,54,32,95,52,54,49,41,41,41,41,41,41,32,40,40,66,+32,40,66,32,40,66,32,95,54,51,55,41,41,41,32,40,40,66,32,40,+66,32,40,67,32,95,55,52,57,41,41,41,32,40,40,66,32,40,66,32,+95,55,53,49,41,41,32,95,55,54,55,41,41,41,41,41,41,41,32,40,+75,32,95,49,51,48,50,41,41,41,32,40,75,32,40,75,32,95,49,51,+48,50,41,41,41,41,32,40,75,32,40,75,32,95,49,51,48,50,41,41,+41,41,32,40,75,32,40,75,32,40,75,32,95,49,51,48,50,41,41,41,+41,41,41,32,40,75,32,40,75,32,95,49,51,48,50,41,41,41,41,32,+40,75,32,40,75,32,95,49,51,48,50,41,41,41,41,32,40,75,32,40,+75,32,95,49,51,48,50,41,41,41,41,32,40,40,40,67,39,32,66,41,+32,40,40,40,67,39,32,67,39,41,32,40,40,66,32,95,54,57,48,41,+32,95,54,51,55,41,41,32,95,54,51,55,41,41,32,95,54,51,55,41,+41,41,32,40,75,32,40,75,32,95,49,51,48,50,41,41,41,41,32,40,+75,32,40,75,32,95,49,51,48,50,41,41,41,41,32,40,75,32,95,49,+51,48,50,41,41,41,32,40,40,67,32,40,40,40,83,39,32,95,56,48,+50,41,32,95,55,55,50,41,32,40,40,66,32,95,54,55,53,41,32,95,+55,55,50,41,41,41,32,40,40,66,32,40,40,40,83,39,32,40,95,51,+57,55,32,95,54,55,55,41,41,32,40,40,66,32,40,95,50,54,49,32,+95,54,51,56,41,41,32,40,95,51,57,53,32,95,54,55,53,41,41,41,+32,73,41,41,32,40,40,66,32,40,95,51,57,52,32,40,40,40,67,39,+32,79,41,32,40,40,66,32,95,56,57,55,41,32,40,40,66,32,40,95,+52,54,51,32,40,40,79,32,35,49,50,48,41,32,75,41,41,41,32,40,+95,49,53,57,48,32,95,50,56,51,41,41,41,41,32,75,41,41,41,32,+40,40,95,49,56,54,32,95,49,57,56,41,32,40,40,95,52,56,53,32,+95,50,55,55,41,32,40,95,51,53,57,32,35,49,41,41,41,41,41,41,+41,41,32,40,75,32,40,75,32,95,49,51,48,50,41,41,41,41,32,40,+40,65,32,58,54,51,56,32,40,40,95,50,54,51,32,40,95,54,55,55,+32,40,95,56,57,55,32,34,36,102,34,41,41,41,32,40,40,95,51,57,+57,32,95,54,55,54,41,32,40,95,54,55,53,32,40,95,56,57,55,32,+34,36,102,34,41,41,41,41,41,32,40,40,65,32,58,54,51,57,32,40,+40,40,67,39,32,66,41,32,40,40,66,32,67,41,32,40,40,66,32,40,+40,67,39,32,66,41,32,95,54,55,54,41,41,32,40,40,40,67,39,32,+40,83,39,32,40,95,51,57,55,32,95,54,55,55,41,41,41,32,40,40,+66,32,40,66,32,95,54,55,53,41,41,32,40,67,32,95,52,53,49,41,+41,41,32,73,41,41,41,41,32,40,40,66,32,40,95,51,57,52,32,40,+40,40,67,39,32,79,41,32,40,40,66,32,95,56,57,55,41,32,40,40,+66,32,40,95,52,54,51,32,40,40,79,32,35,49,50,48,41,32,75,41,+41,41,32,40,95,49,53,57,48,32,95,50,56,51,41,41,41,41,32,75,+41,41,41,32,40,40,95,49,56,54,32,95,49,57,56,41,32,40,40,95,+52,56,53,32,95,50,55,55,41,32,40,95,51,53,57,32,35,49,41,41,+41,41,41,41,32,40,40,65,32,58,54,52,48,32,40,40,67,32,40,40,+83,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,+67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,83,32,40,40,+67,32,40,40,67,32,40,40,83,32,40,40,67,32,40,40,67,32,40,40,+67,32,40,40,83,32,73,41,32,75,41,41,32,40,40,40,67,39,32,66,+41,32,40,40,66,32,95,55,52,52,41,32,95,54,52,48,41,41,32,95,+54,52,48,41,41,41,32,40,75,32,40,75,32,95,49,51,48,50,41,41,+41,41,32,40,75,32,95,49,51,48,50,41,41,41,32,40,40,40,83,39,+32,40,67,39,32,67,41,41,32,40,40,40,83,39,32,40,67,39,32,67,+41,41,32,40,40,40,83,39,32,66,41,32,40,40,66,32,67,41,32,40,+40,40,83,39,32,67,41,32,40,40,40,83,39,32,67,41,32,40,40,40,+83,39,32,67,41,32,40,40,40,83,39,32,80,41,32,75,41,32,75,41,+41,32,75,41,41,32,75,41,41,32,75,41,41,41,32,40,40,40,67,39,+32,66,41,32,40,40,66,32,83,41,32,40,67,32,40,40,40,67,39,32,+40,95,52,57,55,32,95,50,56,50,41,41,32,95,52,49,49,41,32,35,+50,41,41,41,41,32,40,40,66,32,40,66,32,95,54,52,48,41,41,32,+40,40,66,32,40,66,32,95,55,53,49,41,41,32,40,40,66,32,40,66,+32,95,55,54,54,41,41,32,40,40,66,32,95,51,57,53,41,32,40,40,+40,67,39,32,95,50,54,51,41,32,95,55,52,55,41,32,95,55,55,57,+41,41,41,41,41,41,41,41,32,75,41,41,32,75,41,41,41,32,40,75,+32,40,75,32,95,49,51,48,50,41,41,41,41,32,40,75,32,40,75,32,+95,49,51,48,50,41,41,41,41,32,40,40,66,32,40,66,32,40,95,50,+54,49,32,95,54,52,48,41,41,41,32,40,40,40,67,39,32,40,83,39,+32,40,95,51,57,57,32,95,55,52,52,41,41,41,32,40,40,40,67,39,+32,66,41,32,40,40,66,32,95,54,52,53,41,32,40,95,56,48,53,32,+95,56,48,56,41,41,41,32,95,52,49,49,41,41,32,73,41,41,41,41,+32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,80,+32,40,40,66,32,40,95,50,54,49,32,95,54,52,48,41,41,32,40,40,+95,51,57,55,32,40,40,66,32,95,55,52,52,41,32,40,95,55,52,52,+32,95,54,52,51,41,41,41,32,95,54,52,52,41,41,41,32,40,75,32,+40,75,32,95,49,51,48,50,41,41,41,41,32,40,75,32,95,49,51,48,+50,41,41,41,32,40,75,32,40,75,32,95,49,51,48,50,41,41,41,41,+32,40,75,32,40,75,32,95,49,51,48,50,41,41,41,41,32,40,75,32,+40,75,32,40,75,32,95,49,51,48,50,41,41,41,41,41,41,32,40,75,+32,40,75,32,95,49,51,48,50,41,41,41,41,32,40,75,32,40,75,32,+95,49,51,48,50,41,41,41,41,32,40,75,32,40,75,32,95,49,51,48,+50,41,41,41,41,32,40,75,32,40,75,32,40,75,32,95,49,51,48,50,+41,41,41,41,41,32,40,75,32,40,75,32,95,49,51,48,50,41,41,41,+41,32,40,40,40,67,39,32,66,41,32,95,55,53,55,41,32,95,54,52,+48,41,41,41,32,40,75,32,95,49,51,48,50,41,41,41,32,75,41,41,+32,40,75,32,40,75,32,95,49,51,48,50,41,41,41,41,32,40,40,65,+32,58,54,52,49,32,40,40,95,50,54,49,32,95,56,57,55,41,32,40,+40,95,52,54,51,32,95,49,49,48,54,41,32,34,91,93,34,41,41,41,+32,40,40,65,32,58,54,52,50,32,40,40,95,50,54,49,32,95,56,57,+55,41,32,40,40,95,52,54,51,32,95,49,49,48,54,41,32,40,40,79,+32,35,53,56,41,32,75,41,41,41,41,32,40,40,65,32,58,54,52,51,+32,40,40,95,50,54,49,32,95,55,53,57,41,32,40,40,95,55,54,51,+32,40,40,79,32,40,40,80,32,95,54,52,49,41,32,40,40,95,52,56,+53,32,95,50,55,55,41,32,40,95,51,53,57,32,35,48,41,41,41,41,+32,40,40,79,32,40,40,80,32,95,54,52,50,41,32,40,40,95,52,56,+53,32,95,50,55,55,41,32,40,95,51,53,57,32,35,50,41,41,41,41,+32,75,41,41,41,32,95,54,52,50,41,41,41,32,40,40,65,32,58,54,+52,52,32,40,40,95,50,54,49,32,95,55,53,57,41,32,40,40,95,55,+54,51,32,40,40,79,32,40,40,80,32,95,54,52,49,41,32,40,40,95,+52,56,53,32,95,50,55,55,41,32,40,95,51,53,57,32,35,48,41,41,+41,41,32,40,40,79,32,40,40,80,32,95,54,52,50,41,32,40,40,95,+52,56,53,32,95,50,55,55,41,32,40,95,51,53,57,32,35,50,41,41,+41,41,32,75,41,41,41,32,95,54,52,49,41,41,41,32,40,40,65,32,+58,54,52,53,32,40,40,66,32,40,40,83,39,32,40,66,32,40,95,50,+54,49,32,95,55,53,57,41,41,41,32,40,40,40,67,39,32,40,83,39,+32,95,55,54,51,41,41,32,40,40,40,67,39,32,40,67,39,32,79,41,+41,32,40,67,32,80,41,41,32,75,41,41,32,73,41,41,41,32,95,56,+48,49,41,41,32,40,40,65,32,58,54,52,54,32,40,67,32,40,95,51,+57,55,32,95,54,55,55,41,41,41,32,40,40,65,32,58,54,52,55,32,+40,95,51,57,57,32,95,54,55,54,41,41,32,40,40,65,32,58,54,52,+56,32,40,40,66,32,40,95,52,53,48,32,40,95,50,48,50,32,95,56,+57,50,41,41,41,32,40,40,40,67,39,32,95,51,57,52,41,32,40,40,+40,67,39,32,40,67,39,32,79,41,41,32,40,40,66,32,40,66,32,95,+56,57,55,41,41,32,40,40,40,67,39,32,66,41,32,95,52,54,51,41,+32,40,95,49,53,57,48,32,95,50,56,51,41,41,41,41,32,75,41,41,+32,40,40,95,49,56,52,32,95,49,57,56,41,32,35,49,41,41,41,41,+32,40,40,65,32,58,54,52,57,32,40,40,95,50,54,51,32,95,52,50,+56,41,32,40,95,54,52,56,32,34,36,113,34,41,41,41,32,40,40,65,+32,58,54,53,48,32,40,40,95,50,54,51,32,95,49,54,48,55,41,32,+40,95,51,57,53,32,95,54,53,49,41,41,41,32,40,40,65,32,58,54,+53,49,32,40,85,32,40,40,40,67,39,32,66,41,32,40,40,66,32,95,+52,54,51,41,32,95,57,48,50,41,41,32,40,40,66,32,40,95,52,54,+51,32,34,32,61,32,34,41,41,32,40,95,49,53,57,48,32,95,55,49,+56,41,41,41,41,41,32,40,40,65,32,58,54,53,50,32,40,40,40,67,+39,32,40,67,39,32,83,41,41,32,40,40,67,32,40,40,40,67,39,32,+83,39,41,32,40,40,66,32,67,39,41,32,95,54,53,53,41,41,32,40,+40,66,32,40,66,32,95,56,51,48,41,41,32,95,55,52,56,41,41,41,+32,40,40,40,67,39,32,79,41,32,95,54,51,55,41,32,75,41,41,41,+32,40,95,51,57,53,32,40,85,32,40,40,66,32,40,67,32,40,40,40,+83,39,32,40,83,39,32,67,41,41,32,40,40,66,32,40,40,67,39,32,+80,41,32,40,40,67,32,79,41,32,75,41,41,41,32,95,54,50,56,41,+41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,95,49,50,48,41,+32,95,54,50,54,41,41,32,95,54,50,55,41,41,41,41,32,95,54,52,+48,41,41,41,41,41,32,40,40,65,32,58,54,53,51,32,40,40,66,32,+40,40,95,51,50,32,95,53,56,41,32,95,54,51,41,41,32,40,40,40,+83,39,32,40,83,39,32,40,95,51,51,32,95,53,56,41,41,41,32,40,+40,66,32,40,66,32,95,54,50,41,41,32,95,52,49,48,41,41,32,40,+40,66,32,40,66,32,40,95,51,52,32,95,53,56,41,41,41,32,95,52,+48,57,41,41,41,41,32,40,40,65,32,58,54,53,52,32,40,40,40,95,+51,50,32,95,53,56,41,32,95,54,51,41,32,40,40,40,83,39,32,40,+95,51,51,32,95,53,56,41,41,32,40,40,66,32,95,54,50,41,32,95,+52,50,57,41,41,32,40,40,66,32,40,95,51,52,32,95,53,56,41,41,+32,95,52,50,56,41,41,41,41,32,40,40,65,32,58,54,53,53,32,40,+40,40,67,39,32,66,41,32,40,40,66,32,40,67,39,32,40,67,39,32,+95,54,48,41,41,41,32,40,40,66,32,67,41,32,40,40,40,67,39,32,+40,67,39,32,89,41,41,32,40,40,40,67,39,32,40,67,39,32,66,41,+41,32,40,40,66,32,40,66,32,40,83,39,32,80,41,41,41,32,40,40,+40,67,39,32,67,39,41,32,40,40,66,32,95,54,53,55,41,32,95,54,+53,56,41,41,32,95,52,50,51,41,41,41,32,40,40,66,32,40,66,32,+40,40,67,39,32,66,41,32,40,40,66,32,95,50,54,49,41,32,40,40,+66,32,95,54,53,57,41,32,40,95,51,52,32,95,53,56,41,41,41,41,+41,41,32,40,40,40,67,39,32,66,41,32,67,39,41,32,40,67,32,95,+52,54,50,41,41,41,41,41,32,95,52,54,49,41,41,41,41,32,40,95,+54,52,56,32,34,36,120,34,41,41,41,32,40,40,65,32,58,54,53,54,+32,80,41,32,40,40,65,32,58,54,53,55,32,40,40,66,32,89,41,32,+40,40,40,83,39,32,40,67,39,32,40,67,39,32,67,41,41,41,32,40,+40,66,32,40,66,32,40,66,32,40,83,32,95,51,57,50,41,41,41,41,+32,40,40,40,67,39,32,66,41,32,40,40,66,32,83,41,32,40,40,66,+32,40,67,32,83,39,41,41,32,40,40,66,32,40,66,32,40,95,50,54,+49,32,40,95,51,52,32,95,53,56,41,41,41,41,32,40,67,32,40,40,+80,32,40,40,40,110,111,77,97,116,99,104,32,75,41,32,35,48,41,32,+35,48,41,41,32,40,90,32,40,85,32,40,75,32,75,41,41,41,41,41,+41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,66,41,41,32,40,+40,66,32,40,66,32,40,67,39,32,67,41,41,41,32,40,40,40,67,39,+32,40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,41,32,40,+40,40,67,39,32,40,67,39,32,66,41,41,32,40,40,66,32,66,39,41,+32,40,40,66,32,40,66,32,40,83,39,32,66,41,41,41,32,40,40,66,+32,40,66,32,40,66,32,95,50,54,49,41,41,41,32,40,40,66,32,40,+66,32,40,66,32,95,54,53,57,41,41,41,32,40,40,67,32,40,67,39,+32,66,41,41,32,40,85,32,40,75,32,65,41,41,41,41,41,41,41,41,+32,40,40,40,83,39,32,40,83,39,32,40,67,39,32,66,41,41,41,32,+40,40,66,32,40,66,32,40,66,32,40,67,39,32,95,50,54,49,41,41,+41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,95,54,53,57,+41,41,41,41,32,40,40,66,32,40,40,67,39,32,66,41,32,40,40,66,+32,67,41,32,40,67,32,95,54,53,55,41,41,41,41,32,40,40,40,67,+39,32,66,41,32,40,40,66,32,95,51,57,53,41,32,40,40,40,67,39,+32,67,41,32,40,40,66,32,40,67,32,66,41,41,32,40,40,66,32,40,+40,83,39,32,40,67,39,32,66,41,41,32,40,40,66,32,66,39,41,32,+85,41,41,41,32,40,40,40,67,39,32,40,83,39,32,40,67,39,32,40,+67,39,32,40,67,39,32,67,41,41,41,41,41,32,40,40,40,67,39,32,+40,83,39,32,40,67,39,32,40,67,39,32,40,67,39,32,67,41,41,41,+41,41,32,40,40,40,67,39,32,40,83,39,32,40,67,39,32,40,67,39,+32,40,67,39,32,67,41,41,41,41,41,32,40,40,40,67,39,32,40,83,+39,32,40,67,39,32,40,67,39,32,40,67,39,32,67,41,41,41,41,41,+32,40,40,40,67,39,32,40,83,39,32,40,67,39,32,40,67,39,32,40,+67,39,32,67,41,41,41,41,41,32,40,40,40,67,39,32,40,83,39,32,+40,67,39,32,40,67,39,32,40,67,39,32,67,41,41,41,41,41,32,40,+40,40,67,39,32,40,83,39,32,40,67,39,32,40,67,39,32,40,67,39,+32,67,41,41,41,41,41,32,40,40,40,67,39,32,40,83,39,32,40,67,+39,32,40,67,39,32,40,67,39,32,67,41,41,41,41,41,32,40,40,40,+67,39,32,40,83,39,32,40,67,39,32,40,67,39,32,40,67,39,32,67,+41,41,41,41,41,32,40,40,40,67,39,32,40,83,39,32,40,67,39,32,+40,67,39,32,40,67,39,32,67,41,41,41,41,41,32,40,40,40,67,39,+32,40,83,39,32,40,67,39,32,40,67,39,32,40,67,39,32,67,41,41,+41,41,41,32,40,40,40,67,39,32,40,83,39,32,40,67,39,32,40,67,+39,32,40,67,39,32,67,41,41,41,41,41,32,40,40,40,67,39,32,40,+83,39,32,40,67,39,32,40,67,39,32,40,67,39,32,67,41,41,41,41,+41,32,40,40,40,67,39,32,40,83,39,32,40,67,39,32,40,67,39,32,+40,67,39,32,67,41,41,41,41,41,32,40,40,40,67,39,32,40,83,39,+32,40,67,39,32,40,67,39,32,40,67,39,32,67,41,41,41,41,41,32,+40,40,40,67,39,32,40,83,39,32,40,67,39,32,40,67,39,32,40,67,+39,32,67,41,41,41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,+66,32,40,67,39,32,40,67,39,32,67,41,41,41,32,40,40,66,32,40,+66,32,40,66,32,40,67,32,67,39,41,41,41,41,32,40,40,66,32,40,+66,32,40,67,39,32,40,67,39,32,67,41,41,41,41,32,40,40,66,32,+40,66,32,40,40,67,39,32,66,41,32,80,41,41,41,32,40,40,66,32,+40,67,39,32,95,50,54,51,41,41,32,40,67,32,95,54,54,55,41,41,+41,41,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,+41,32,75,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,+41,32,40,90,32,75,41,41,41,32,75,41,41,32,75,41,41,32,40,90,+32,75,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,+41,32,40,90,32,40,90,32,75,41,41,41,41,32,40,90,32,75,41,41,+41,32,40,90,32,75,41,41,41,32,75,41,41,32,75,41,41,32,40,90,+32,75,41,41,41,41,41,32,40,40,40,110,111,77,97,116,99,104,32,34,+115,114,99,47,77,105,99,114,111,72,115,47,68,101,115,117,103,97,114,46,+104,115,34,41,32,35,51,54,49,41,32,35,50,57,41,41,41,41,32,40,+85,32,40,75,32,75,41,41,41,41,41,41,41,32,40,40,40,67,39,32,+40,67,39,32,67,41,41,32,40,40,66,32,40,66,32,40,40,83,39,32,+83,39,41,32,95,51,57,50,41,41,41,32,40,40,40,83,39,32,40,67,+39,32,40,67,39,32,40,83,39,32,40,95,51,50,32,95,53,56,41,41,+41,41,41,32,40,40,40,67,39,32,40,67,39,32,66,41,41,32,40,40,+66,32,40,66,32,40,67,39,32,40,95,52,51,32,95,53,56,41,41,41,+41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,40,83,39,32,+40,40,83,39,32,40,95,51,50,32,95,53,56,41,41,32,40,40,66,32,+95,54,53,51,41,32,95,55,55,51,41,41,41,41,41,41,32,40,40,40,+67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,66,41,41,41,41,+32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,83,39,32,40,95,+51,50,32,95,53,56,41,41,41,41,41,41,32,40,40,66,32,40,40,67,+39,32,40,67,39,32,66,41,41,32,40,40,66,32,40,40,67,39,32,67,+39,41,32,95,54,53,55,41,41,32,40,40,67,39,32,95,52,54,51,41,+32,40,95,51,57,53,32,95,54,55,53,41,41,41,41,41,32,40,40,66,+32,95,51,57,53,41,32,40,40,66,32,89,41,32,40,40,66,32,40,66,+32,85,41,41,32,40,40,66,32,40,66,32,40,40,67,39,32,66,41,32,+40,66,39,32,40,85,32,95,49,51,48,50,41,41,41,41,41,32,40,40,+40,67,39,32,40,67,39,32,40,83,39,32,40,83,39,32,40,83,39,32,+83,41,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,+32,40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,41,41,41,+32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,+67,39,32,40,67,39,32,83,41,41,41,41,41,41,32,40,40,40,67,39,+32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,+32,83,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,+66,32,40,40,67,39,32,66,41,32,40,40,66,32,67,41,32,40,40,40,+67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,+32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,+41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,+40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,+40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,+39,32,83,41,32,40,40,67,32,40,40,67,32,83,39,41,32,75,41,41,+32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,75,41,41,+32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,+75,41,41,41,32,75,41,41,32,75,41,41,32,40,90,32,75,41,41,41,+32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,+40,90,32,75,41,41,41,41,32,40,90,32,75,41,41,41,41,41,41,41,+41,32,40,40,66,32,40,40,67,39,32,66,41,32,40,66,39,32,40,66,+39,32,40,66,39,32,66,41,41,41,41,41,32,40,40,66,32,40,66,32,+40,67,39,32,40,67,39,32,40,67,39,32,67,41,41,41,41,41,32,40,+40,66,32,40,66,32,40,40,67,39,32,66,41,32,40,40,66,32,40,67,+39,32,80,41,41,32,40,67,32,95,52,54,50,41,41,41,41,41,32,40,+40,66,32,40,67,39,32,95,50,54,51,41,41,32,40,67,32,95,54,54,+55,41,41,41,41,41,41,41,32,75,41,41,32,75,41,41,32,40,90,32,+75,41,41,41,32,40,40,66,32,40,67,39,32,40,67,39,32,67,41,41,+41,32,40,40,67,39,32,40,67,39,32,80,41,41,32,40,40,66,32,95,+52,54,51,41,32,95,54,55,48,41,41,41,41,41,41,41,41,41,41,41,+32,40,40,66,32,40,66,32,40,66,32,40,95,51,52,32,95,53,56,41,+41,41,41,32,40,40,66,32,40,66,32,80,41,41,32,95,54,53,54,41,+41,41,41,32,40,40,66,32,95,54,54,57,41,32,40,40,67,32,40,40,+67,32,83,41,32,40,40,66,32,90,41,32,40,40,66,32,85,41,32,40,+40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,67,32,80,41,32,+75,41,41,41,41,41,41,41,32,40,40,40,110,111,77,97,116,99,104,32,+75,41,32,35,48,41,32,35,48,41,41,41,41,41,41,32,40,95,54,55,+49,32,40,40,95,50,54,57,32,40,95,50,48,50,32,95,55,55,52,41,+41,32,40,85,32,40,90,32,40,90,32,40,40,80,32,95,49,51,48,50,+41,32,40,90,32,95,54,54,57,41,41,41,41,41,41,41,41,41,32,40,+40,66,32,40,66,32,40,66,32,40,95,50,54,49,32,40,95,51,52,32,+95,53,56,41,41,41,41,41,32,40,40,66,32,67,41,32,95,54,54,52,+41,41,41,41,41,32,40,95,51,52,32,95,53,56,41,41,41,41,41,32,+40,85,32,40,90,32,75,41,41,41,41,41,32,95,54,54,54,41,41,41,+41,32,40,95,51,52,32,95,53,56,41,41,41,41,32,40,40,65,32,58,+54,53,56,32,40,85,32,40,40,40,67,39,32,40,67,39,32,66,41,41,+32,40,40,66,32,40,66,32,95,54,55,54,41,41,32,40,40,40,67,39,+32,66,41,32,40,40,66,32,95,54,55,54,41,32,40,40,66,32,40,95,+54,55,54,32,40,95,54,55,56,32,40,95,55,56,49,32,34,110,111,77,+97,116,99,104,34,41,41,41,41,32,40,40,66,32,95,54,55,56,41,32,+95,55,56,48,41,41,41,41,32,40,40,66,32,95,54,55,56,41,32,95,+55,55,53,41,41,41,41,32,40,40,66,32,95,54,55,56,41,32,95,55,+55,53,41,41,41,41,32,40,40,65,32,58,54,53,57,32,40,40,40,67,+39,32,66,41,32,40,95,51,50,32,95,53,56,41,41,32,40,40,40,83,+39,32,83,41,32,40,40,66,32,40,83,32,95,54,54,48,41,41,32,40,+40,66,32,40,66,32,40,40,95,51,50,32,95,53,56,41,32,95,54,53,+52,41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,40,83,+39,32,40,95,51,50,32,95,53,56,41,41,41,32,40,40,67,32,66,41,+32,95,54,55,53,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,+95,50,54,49,32,40,95,51,52,32,95,53,56,41,41,41,41,41,32,40,+67,32,95,54,54,56,41,41,41,41,41,41,32,73,41,41,41,32,40,40,+65,32,58,54,54,48,32,40,40,67,32,40,40,67,32,40,40,80,32,40,+75,32,95,49,50,53,41,41,32,40,75,32,40,75,32,95,49,50,52,41,+41,41,41,32,40,75,32,40,75,32,95,49,50,52,41,41,41,41,32,40,+75,32,95,49,50,53,41,41,41,32,40,40,65,32,58,54,54,49,32,40,+95,54,55,56,32,40,95,55,56,49,32,34,61,61,34,41,41,41,32,40,+40,65,32,58,54,54,50,32,40,95,54,55,56,32,40,95,55,56,49,32,+34,61,61,34,41,41,41,32,40,40,65,32,58,54,54,51,32,40,95,54,+55,56,32,40,95,55,56,49,32,34,101,113,117,97,108,34,41,41,41,32,+40,40,65,32,58,54,54,52,32,40,40,66,32,89,41,32,40,40,66,32,+40,66,32,40,83,32,83,41,41,41,32,40,40,66,32,40,66,32,40,66,+32,40,66,32,40,67,32,66,41,41,41,41,41,32,40,40,66,32,40,66,+32,40,66,32,40,66,32,40,66,32,40,67,32,66,41,41,41,41,41,41,+32,40,40,40,83,39,32,66,41,32,40,40,66,32,40,67,39,32,40,83,+39,32,40,83,39,32,40,83,39,32,67,41,41,41,41,41,32,40,40,40,+83,39,32,40,67,39,32,40,67,39,32,66,41,41,41,32,40,40,66,32,+40,66,32,66,39,41,41,32,40,40,66,32,40,66,32,40,66,32,40,67,+39,32,67,39,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,85,+41,41,41,32,40,40,66,32,40,66,32,40,66,32,90,41,41,41,32,40,+40,40,67,39,32,66,41,32,40,66,39,32,40,66,39,32,95,54,54,53,+41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,83,39,32,95,51,+57,53,41,41,41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,+40,40,66,32,40,66,32,40,40,67,39,32,83,39,41,32,40,40,66,32,+83,41,32,40,40,40,67,39,32,40,67,39,32,40,83,39,32,80,41,41,+41,32,40,40,40,67,39,32,40,67,39,32,66,41,41,32,40,40,66,32,+40,66,32,95,54,53,54,41,41,32,95,55,54,51,41,41,32,40,85,32,+75,41,41,41,32,40,85,32,65,41,41,41,41,41,41,32,40,40,66,32,+40,66,32,40,66,32,40,66,32,40,95,50,54,49,32,95,52,50,56,41,+41,41,41,41,32,40,40,40,67,39,32,66,41,32,40,66,39,32,40,40,+66,32,40,67,39,32,95,52,54,51,41,41,32,40,40,67,39,32,95,51,+57,52,41,32,40,40,66,32,85,41,32,40,40,66,32,40,67,32,66,41,+41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,67,41,41,41,+32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,66,32,40,+66,32,40,67,32,67,39,41,41,41,32,40,40,66,32,40,66,32,90,41,+41,32,40,40,40,67,39,32,66,41,32,40,66,39,32,40,40,66,32,67,+41,32,40,40,40,67,39,32,67,41,32,40,95,50,48,50,32,95,56,57,+50,41,41,32,75,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,+79,41,41,32,40,67,32,80,41,41,32,75,41,41,41,41,41,32,40,75,+32,75,41,41,41,32,40,75,32,40,75,32,75,41,41,41,41,41,41,41,+41,41,32,40,40,40,67,39,32,40,67,39,32,79,41,41,32,40,40,67,+39,32,80,41,32,40,40,40,67,39,32,95,52,52,54,41,32,40,85,32,+65,41,41,32,95,57,49,52,41,41,41,32,75,41,41,41,41,41,32,40,+85,32,75,41,41,41,32,73,41,41,41,41,41,41,41,32,40,40,66,32,+40,66,32,40,66,32,90,41,41,41,32,40,40,66,32,40,66,32,40,66,+32,40,80,32,95,49,51,48,50,41,41,41,41,32,40,40,40,67,39,32,+40,67,39,32,40,67,39,32,40,67,39,32,80,41,41,41,41,32,40,40,+40,67,39,32,67,41,32,40,40,66,32,40,40,67,39,32,67,39,41,32,+67,39,41,41,32,40,40,66,32,67,41,32,40,67,32,95,54,54,56,41,+41,41,41,32,40,75,32,40,75,32,95,49,51,48,50,41,41,41,41,32,+40,75,32,40,75,32,95,49,51,48,50,41,41,41,41,41,41,41,41,32,+40,40,66,32,40,66,32,40,66,32,40,66,32,90,41,41,41,41,32,40,+40,66,32,40,66,32,40,66,32,40,66,32,67,41,41,41,41,32,40,40,+40,67,39,32,66,41,32,40,66,39,32,40,66,39,32,40,40,66,32,40,+67,39,32,95,54,57,48,41,41,32,40,40,40,67,39,32,67,41,32,40,+40,40,67,39,32,67,41,32,40,40,40,83,39,32,83,41,32,40,40,40,+83,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,+32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,66,32,40,83,32,+73,41,41,32,40,40,66,32,90,41,32,40,40,40,67,39,32,66,41,32,+40,95,54,57,48,32,95,54,54,49,41,41,32,95,54,55,56,41,41,41,+41,32,40,75,32,95,49,51,48,50,41,41,41,32,40,75,32,95,49,51,+48,50,41,41,41,32,40,75,32,95,49,51,48,50,41,41,41,32,40,40,+40,67,39,32,66,41,32,40,95,54,57,48,32,95,54,54,50,41,41,32,+40,40,66,32,95,54,55,56,41,32,40,40,66,32,95,55,55,53,41,32,+95,49,51,55,41,41,41,41,41,32,40,40,66,32,90,41,32,40,40,40,+67,39,32,66,41,32,40,95,54,57,48,32,95,54,54,51,41,41,32,95,+54,55,56,41,41,41,41,32,40,75,32,95,49,51,48,50,41,41,41,32,+40,75,32,95,49,51,48,50,41,41,41,41,41,41,32,67,41,41,41,41,+41,41,41,41,41,32,40,40,65,32,58,54,54,53,32,40,40,40,67,39,+32,66,41,32,95,54,52,55,41,32,40,95,51,57,52,32,40,85,32,40,+40,67,32,66,41,32,40,90,32,40,40,40,67,39,32,40,67,39,32,79,+41,41,32,40,67,32,95,54,52,54,41,41,32,75,41,41,41,41,41,41,+41,32,40,40,65,32,58,54,54,54,32,40,40,66,32,40,40,83,32,40,+40,40,67,39,32,40,83,39,32,67,41,41,32,40,40,40,67,39,32,66,+41,32,40,40,66,32,80,41,32,40,85,32,75,41,41,41,32,40,85,32,+75,41,41,41,32,40,85,32,65,41,41,41,32,40,40,66,32,40,40,89,+32,40,40,66,32,40,40,83,39,32,83,41,32,40,40,66,32,85,41,32,+40,40,40,67,39,32,80,41,32,95,52,50,51,41,32,95,52,54,49,41,+41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,83,32,66,41,41,+41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,90,+41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,+66,32,40,40,67,39,32,66,41,32,40,85,32,95,49,51,48,50,41,41,+41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,+66,32,40,66,32,90,41,41,41,41,41,41,32,40,40,40,67,39,32,40,+83,39,32,66,41,41,32,40,40,66,32,40,66,32,40,67,39,32,40,67,+39,32,40,67,39,32,67,41,41,41,41,41,32,40,40,66,32,40,66,32,+40,66,32,40,66,32,40,66,32,40,40,67,39,32,95,49,50,50,41,32,+95,55,57,50,41,41,41,41,41,41,32,40,40,40,67,39,32,40,83,39,+32,40,83,39,32,40,83,39,32,80,41,41,41,41,32,40,40,40,67,39,+32,66,41,32,66,41,32,40,67,32,95,52,54,50,41,41,41,32,40,40,+66,32,40,66,32,80,41,41,32,40,40,66,32,40,66,32,95,52,50,51,+41,41,32,40,67,32,95,52,54,50,41,41,41,41,41,41,41,32,40,40,+66,32,80,41,32,95,52,50,51,41,41,41,41,41,41,41,41,32,95,52,+54,49,41,41,32,40,85,32,65,41,41,41,41,32,40,95,52,50,54,32,+40,85,32,40,90,32,40,90,32,40,40,80,32,95,49,51,48,50,41,32,+40,90,32,40,40,66,32,95,49,50,50,41,32,95,55,57,50,41,41,41,+41,41,41,41,41,41,32,40,40,65,32,58,54,54,55,32,40,40,67,32,+40,40,40,83,39,32,67,39,41,32,40,40,66,32,83,39,41,32,40,40,+67,32,40,95,50,48,50,32,95,56,57,50,41,41,32,95,57,49,52,41,+41,41,32,95,55,50,48,41,41,32,73,41,41,32,40,40,65,32,58,54,+54,56,32,40,40,67,32,40,40,40,83,39,32,67,39,41,32,40,40,66,+32,83,39,41,32,40,40,67,32,40,95,50,48,50,32,95,56,57,50,41,+41,32,95,57,49,52,41,41,41,32,40,40,40,83,39,32,40,83,39,32,+83,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,83,41,+41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,+41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,66,32,+40,66,32,40,67,32,83,39,41,41,41,32,40,40,66,32,40,67,39,32,+67,41,41,32,40,40,66,32,67,41,32,40,95,50,48,50,32,95,56,57,+50,41,41,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,+41,41,32,75,41,41,32,40,40,40,83,39,32,66,41,32,40,40,66,32,+83,41,32,40,40,67,32,40,40,40,67,39,32,83,39,41,32,40,40,66,+32,95,51,57,54,41,32,40,67,32,40,95,50,48,50,32,95,56,57,50,+41,41,41,41,32,95,55,50,49,41,41,32,73,41,41,41,32,40,40,66,+32,40,66,32,90,41,41,32,40,40,40,83,39,32,40,83,39,32,40,83,+39,32,80,41,41,41,32,95,55,50,48,41,32,40,40,66,32,40,66,32,+90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,+67,39,32,95,54,55,54,41,41,32,95,54,55,55,41,41,41,41,41,41,+41,41,41,32,73,41,41,32,40,40,65,32,58,54,54,57,32,40,40,83,+32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,67,41,32,40,+40,40,67,39,32,83,41,32,40,40,40,67,39,32,67,41,32,40,40,40,+67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,+32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,+41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,+40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,+40,67,39,32,67,41,32,40,40,67,32,40,40,40,67,39,32,83,39,41,+32,40,40,80,32,40,75,32,95,50,53,41,41,32,40,90,32,95,54,54,+57,41,41,41,32,40,90,32,75,41,41,41,32,75,41,41,32,95,55,54,+53,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,+75,41,41,32,75,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,+41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,40,90,32,75,41,+41,41,41,32,40,90,32,75,41,41,41,32,40,75,32,95,54,54,57,41,+41,41,32,75,41,41,32,73,41,41,32,40,90,32,75,41,41,41,32,40,+95,49,51,48,51,32,40,40,80,32,95,56,51,55,41,32,95,56,48,56,+41,41,41,41,32,40,40,65,32,58,54,55,48,32,40,40,67,32,40,40,+67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,+67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,+67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,+80,32,40,75,32,95,49,51,48,50,41,41,32,40,40,40,67,39,32,66,+41,32,40,40,66,32,95,52,54,51,41,32,95,54,55,48,41,41,32,40,+40,67,32,79,41,32,75,41,41,41,41,32,40,75,32,40,75,32,95,49,+51,48,50,41,41,41,41,32,40,75,32,95,49,51,48,50,41,41,41,32,+40,75,32,40,75,32,95,52,54,49,41,41,41,41,32,40,75,32,40,75,+32,95,49,51,48,50,41,41,41,41,32,40,75,32,40,75,32,95,49,51,+48,50,41,41,41,41,32,40,75,32,95,49,51,48,50,41,41,41,32,40,+75,32,95,49,51,48,50,41,41,41,32,40,75,32,40,75,32,95,49,51,+48,50,41,41,41,41,32,40,75,32,40,75,32,95,49,51,48,50,41,41,+41,41,32,40,75,32,40,75,32,95,49,51,48,50,41,41,41,41,32,40,+75,32,40,75,32,40,75,32,95,49,51,48,50,41,41,41,41,41,32,40,+75,32,40,75,32,95,49,51,48,50,41,41,41,41,32,40,75,32,40,75,+32,95,49,51,48,50,41,41,41,41,32,40,75,32,95,49,51,48,50,41,+41,41,32,40,75,32,95,52,54,49,41,41,41,32,40,75,32,40,75,32,+95,49,51,48,50,41,41,41,41,32,40,40,65,32,58,54,55,49,32,40,+40,66,32,89,41,32,40,40,66,32,40,66,32,40,80,32,95,52,54,49,+41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,40,83,39,+32,67,41,41,32,40,66,32,95,52,53,50,41,41,41,32,40,40,67,39,+32,40,67,39,32,66,41,41,32,40,40,66,32,40,66,32,95,52,54,50,+41,41,32,95,52,54,50,41,41,41,41,41,41,32,40,40,65,32,58,54,+55,50,32,40,40,66,32,40,95,50,54,51,32,40,95,51,57,54,32,40,+40,95,50,54,51,32,40,40,67,32,40,95,52,57,57,32,95,50,56,50,+41,41,32,40,40,95,52,56,53,32,95,50,55,55,41,32,40,95,51,53,+57,32,35,49,41,41,41,41,32,95,52,49,49,41,41,41,41,32,95,54,+55,49,41,41,32,40,40,65,32,58,54,55,51,32,40,40,67,32,40,40,+40,67,39,32,66,41,32,40,40,40,83,39,32,40,95,54,55,50,32,40,+95,50,48,50,32,95,56,57,50,41,41,41,32,40,40,66,32,40,95,50,+54,49,32,40,95,51,57,54,32,40,40,67,32,40,95,50,48,51,32,95,+56,57,50,41,41,32,95,57,49,52,41,41,41,41,32,40,95,51,57,53,+32,95,53,54,53,41,41,41,32,73,41,41,32,40,40,66,32,90,41,32,+40,40,83,32,80,41,32,40,40,40,67,39,32,66,41,32,80,41,32,40,+90,32,40,90,32,40,40,40,83,39,32,95,50,54,49,41,32,40,40,66,+32,95,56,51,54,41,32,40,95,56,48,53,32,95,56,48,55,41,41,41,+32,40,40,66,32,40,95,52,54,51,32,34,100,117,112,108,105,99,97,116,+101,32,100,101,102,105,110,105,116,105,111,110,32,34,41,41,32,95,57,48,+50,41,41,41,41,41,41,41,41,41,32,40,95,50,52,32,34,99,104,101,+99,107,68,117,112,34,41,41,41,32,40,40,65,32,58,54,55,52,32,40,+40,83,32,73,41,32,40,40,40,83,39,32,40,67,39,32,67,41,41,32,+40,40,40,83,39,32,66,41,32,40,40,66,32,67,41,32,40,40,40,83,+39,32,80,41,32,75,41,32,40,90,32,75,41,41,41,41,32,40,40,40,+83,39,32,40,67,39,32,40,67,39,32,67,41,41,41,32,40,40,40,83,+39,32,66,41,32,40,66,39,32,40,40,66,32,67,41,32,40,40,40,83,+39,32,80,41,32,75,41,32,40,90,32,75,41,41,41,41,41,32,40,40,+40,67,39,32,40,83,39,32,40,67,39,32,40,67,39,32,67,41,41,41,+41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,+67,41,41,41,41,32,40,40,66,32,40,40,83,39,32,40,83,39,32,66,+41,41,32,40,40,66,32,40,66,32,40,67,39,32,83,39,41,41,41,32,+40,40,66,32,40,66,32,40,66,32,83,41,41,41,32,40,40,40,67,39,+32,40,67,39,32,40,67,39,32,40,67,39,32,95,53,57,41,41,41,41,+32,40,40,66,32,40,66,32,40,67,39,32,89,41,41,41,32,40,40,40,+67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,41,+32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,40,83,39,32,67,+41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,67,+32,40,40,83,32,73,41,32,40,90,32,40,95,51,52,32,95,53,56,41,+41,41,41,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,+39,32,66,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,83,39,+32,83,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,+32,40,67,39,32,40,67,39,32,83,41,41,41,41,41,32,40,40,40,67,+39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,83,41,+41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,67,+41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,40,67,39,32,67,+39,41,32,83,39,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,+40,67,39,32,40,67,39,32,40,83,39,32,67,41,41,41,41,41,32,40,+40,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,83,39,+32,67,41,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,+39,32,67,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,40,67,+39,32,83,39,41,32,67,39,41,41,41,41,32,40,40,40,67,39,32,40,+67,39,32,66,41,41,32,40,40,66,32,40,66,32,40,67,39,32,40,67,+39,32,67,41,41,41,41,32,40,40,66,32,40,66,32,67,41,41,32,40,+40,40,67,39,32,66,41,32,40,40,66,32,40,67,39,32,67,39,41,41,+32,40,40,66,32,40,66,32,95,49,50,49,41,41,32,40,67,32,40,95,+50,48,50,32,95,56,57,50,41,41,41,41,41,32,40,67,32,40,95,50,+48,50,32,95,56,57,50,41,41,41,41,41,41,32,40,40,66,32,40,40,+95,51,51,32,95,53,56,41,32,40,95,54,50,32,95,49,50,53,41,41,+41,32,40,95,51,52,32,95,53,56,41,41,41,41,41,32,40,90,32,75,+41,41,41,32,40,90,32,75,41,41,41,32,75,41,41,41,32,40,90,32,+75,41,41,41,32,40,90,32,75,41,41,41,32,75,41,41,41,32,40,40,+40,83,39,32,40,67,39,32,66,41,41,32,40,40,66,32,40,66,32,40,+95,49,52,32,95,53,55,41,41,41,32,40,66,32,40,40,95,50,55,54,+32,95,53,54,41,32,95,54,55,54,41,41,41,41,32,73,41,41,41,41,+32,40,40,67,39,32,66,41,32,40,40,66,32,40,95,50,55,54,32,95,+53,54,41,41,32,95,54,55,55,41,41,41,41,32,40,90,32,40,95,51,+52,32,95,53,56,41,41,41,41,41,32,95,49,50,52,41,41,41,41,41,+32,40,40,40,67,39,32,66,41,32,40,66,39,32,40,66,39,32,40,66,+39,32,40,66,39,32,40,66,39,32,80,41,41,41,41,41,41,32,40,40,+40,67,39,32,66,41,32,40,66,39,32,40,66,39,32,40,66,39,32,40,+66,39,32,80,41,41,41,41,41,32,40,40,40,67,39,32,66,41,32,40,+66,39,32,40,66,39,32,40,66,39,32,40,40,66,32,95,50,54,49,41,+32,95,54,55,55,41,41,41,41,41,32,40,40,66,32,40,40,67,39,32,+67,39,41,32,95,54,51,51,41,41,32,95,54,55,55,41,41,41,41,41,+41,32,95,54,55,53,41,41,32,40,40,67,32,95,57,48,55,41,32,40,+40,79,32,35,54,52,41,32,75,41,41,41,41,41,32,75,41,41,41,32,+75,41,41,41,32,40,40,65,32,58,54,55,53,32,40,40,66,32,90,41,+32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,85,41,41,41,41,+32,40,40,65,32,58,54,55,54,32,40,40,66,32,90,41,32,40,40,66,+32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,80,+41,41,41,41,32,40,40,65,32,58,54,55,55,32,40,40,66,32,90,41,+32,40,40,66,32,90,41,32,40,40,66,32,40,66,32,90,41,41,32,80,+41,41,41,41,32,40,40,65,32,58,54,55,56,32,40,90,32,40,90,32,+40,90,32,85,41,41,41,41,32,40,40,65,32,58,54,55,57,32,40,40,+95,50,48,49,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,+83,41,32,40,40,67,32,40,40,67,32,83,39,41,32,40,40,40,67,39,+32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,67,32,40,40,67,+32,67,39,41,32,40,95,50,48,50,32,95,56,57,50,41,41,41,32,40,+75,32,40,75,32,95,49,50,52,41,41,41,41,32,40,75,32,40,75,32,+95,49,50,52,41,41,41,41,32,40,75,32,95,49,50,52,41,41,41,41,+32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,67,32,40,+40,40,67,39,32,67,39,41,32,40,40,66,32,67,39,41,32,40,85,32,+40,75,32,95,49,50,52,41,41,41,41,32,40,40,40,67,39,32,66,41,+32,40,40,66,32,40,67,39,32,66,41,41,32,40,40,66,32,40,66,32,+95,49,50,49,41,41,32,40,95,50,48,50,32,95,54,55,57,41,41,41,+41,32,40,95,50,48,50,32,95,54,55,57,41,41,41,41,32,40,75,32,+40,75,32,95,49,50,52,41,41,41,41,32,40,75,32,95,49,50,52,41,+41,41,41,32,40,40,67,32,40,40,40,67,39,32,67,39,41,32,40,40,+66,32,67,39,41,32,40,40,80,32,40,75,32,95,49,50,52,41,41,32,+40,75,32,40,75,32,95,49,50,52,41,41,41,41,41,32,40,40,40,67,+39,32,66,41,32,40,40,66,32,40,67,39,32,66,41,41,32,40,40,66,+32,40,66,32,95,49,50,49,41,41,32,40,95,50,48,50,32,95,56,57,+50,41,41,41,41,32,40,95,50,48,50,32,95,54,55,57,41,41,41,41,+32,40,75,32,95,49,50,52,41,41,41,41,32,40,40,40,67,39,32,66,+41,32,40,40,67,32,40,40,80,32,40,75,32,95,49,50,52,41,41,32,+40,75,32,40,75,32,95,49,50,52,41,41,41,41,32,40,75,32,40,75,+32,95,49,50,52,41,41,41,41,32,40,95,50,48,50,32,95,55,56,51,+41,41,41,41,32,40,95,50,48,53,32,95,54,55,57,41,41,41,32,40,+40,65,32,58,54,56,48,32,75,41,32,40,40,65,32,58,54,56,49,32,+79,41,32,40,40,65,32,58,54,56,50,32,40,40,67,32,40,40,67,32,+40,40,80,32,40,75,32,95,54,56,48,41,41,32,95,54,56,49,41,41,+32,40,75,32,40,75,32,95,54,56,48,41,41,41,41,32,40,75,32,95,+54,56,48,41,41,41,32,40,40,65,32,58,54,56,51,32,40,40,66,32,+40,67,32,40,40,67,32,40,40,80,32,40,75,32,95,49,50,52,41,41,+32,40,75,32,40,75,32,95,49,50,52,41,41,41,41,32,40,75,32,40,+75,32,95,49,50,52,41,41,41,41,41,32,40,40,40,67,39,32,67,41,+32,40,40,66,32,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,+40,40,67,32,40,40,80,32,40,75,32,95,49,50,52,41,41,32,40,75,+32,95,49,50,52,41,41,41,32,40,75,32,95,49,50,52,41,41,41,32,+40,75,32,95,49,50,52,41,41,41,32,40,75,32,95,49,50,52,41,41,+41,32,40,75,32,95,49,50,52,41,41,41,41,32,40,95,50,48,50,32,+95,49,51,51,41,41,41,32,40,75,32,95,49,50,52,41,41,41,41,32,+40,40,65,32,58,54,56,52,32,40,95,54,56,51,32,40,40,79,32,35,+55,53,41,32,75,41,41,41,32,40,40,65,32,58,54,56,53,32,40,95,+54,56,51,32,40,40,79,32,35,55,51,41,32,75,41,41,41,32,40,40,+65,32,58,54,56,54,32,40,95,54,56,51,32,40,40,79,32,35,54,54,+41,32,75,41,41,41,32,40,40,65,32,58,54,56,55,32,40,95,54,56,+51,32,40,40,79,32,35,54,55,41,32,75,41,41,41,32,40,40,65,32,+58,54,56,56,32,40,95,54,56,51,32,40,40,79,32,35,56,57,41,32,+75,41,41,41,32,40,40,65,32,58,54,56,57,32,40,95,54,56,51,32,+40,40,79,32,35,56,48,41,32,75,41,41,41,32,40,40,65,32,58,54,+57,48,32,40,40,66,32,40,66,32,95,54,55,54,41,41,32,95,54,55,+54,41,41,32,40,40,65,32,58,54,57,49,32,40,40,66,32,40,66,32,+40,66,32,95,54,55,54,41,41,41,32,95,54,57,48,41,41,32,40,40,+65,32,58,54,57,50,32,40,95,54,55,56,32,40,95,55,56,49,32,40,+40,79,32,35,55,57,41,32,75,41,41,41,41,32,40,40,65,32,58,54,+57,51,32,40,95,54,55,56,32,40,95,55,56,49,32,40,40,79,32,35,+55,53,41,32,75,41,41,41,41,32,40,40,65,32,58,54,57,52,32,40,+95,54,55,56,32,40,95,55,56,49,32,40,40,79,32,35,54,55,41,32,+75,41,41,41,41,32,40,40,65,32,58,54,57,53,32,40,95,54,55,56,+32,40,95,55,56,49,32,40,40,79,32,35,55,51,41,32,75,41,41,41,+41,32,40,40,65,32,58,54,57,54,32,40,95,54,55,56,32,40,95,55,+56,49,32,40,40,79,32,35,55,53,41,32,75,41,41,41,41,32,40,40,+65,32,58,54,57,55,32,40,95,54,55,56,32,40,95,55,56,49,32,40,+40,79,32,35,56,51,41,32,75,41,41,41,41,32,40,40,65,32,58,54,+57,56,32,40,95,54,55,56,32,40,95,55,56,49,32,40,40,79,32,35,+56,48,41,32,75,41,41,41,41,32,40,40,65,32,58,54,57,57,32,40,+40,67,32,40,40,67,32,40,40,80,32,40,40,66,32,95,52,54,51,41,+32,95,57,48,50,41,41,32,40,40,66,32,40,66,32,40,95,50,54,51,+32,40,95,52,54,51,32,40,40,79,32,35,52,48,41,32,75,41,41,41,+41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,95,50,54,51,+41,32,95,54,57,57,41,41,32,40,40,66,32,40,95,50,54,51,32,40,+95,52,54,51,32,40,40,79,32,35,51,50,41,32,75,41,41,41,41,32,+40,40,40,67,39,32,95,50,54,51,41,32,95,54,57,57,41,32,40,95,+52,54,51,32,40,40,79,32,35,52,49,41,32,75,41,41,41,41,41,41,+41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,95,50,54,51,+41,32,40,40,66,32,95,52,54,51,41,32,40,40,66,32,40,95,52,54,+51,32,34,40,92,57,50,38,34,41,41,32,40,40,40,67,39,32,95,52,+54,51,41,32,95,57,48,50,41,32,40,40,79,32,35,51,50,41,32,75,+41,41,41,41,41,41,32,40,40,40,67,39,32,95,50,54,51,41,32,95,+54,57,57,41,32,40,95,52,54,51,32,40,40,79,32,35,52,49,41,32,+75,41,41,41,41,41,41,32,40,40,83,32,40,40,40,67,39,32,83,41,+32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,67,41,32,40,+40,40,67,39,32,83,41,32,40,40,40,67,39,32,67,41,32,40,40,40,+67,39,32,83,41,32,40,40,67,32,40,40,67,32,67,39,41,32,75,41,+41,32,40,75,32,95,50,53,41,41,41,32,75,41,41,32,40,75,32,95,+50,53,41,41,41,32,75,41,41,32,40,40,83,32,40,40,83,32,40,40,+40,67,39,32,40,95,52,57,57,32,95,50,56,50,41,41,32,95,52,49,+49,41,32,35,49,41,41,32,40,40,66,32,95,54,57,57,41,32,95,55,+48,49,41,41,41,32,40,40,66,32,95,52,54,51,41,32,95,55,48,48,+41,41,41,41,32,75,41,41,32,75,41,41,32,40,40,66,32,95,52,54,+51,41,32,95,56,54,50,41,41,41,41,32,40,40,65,32,58,55,48,48,+32,40,40,66,32,40,95,52,54,50,32,35,51,52,41,41,32,40,40,40,+67,39,32,95,52,54,51,41,32,40,95,51,57,52,32,40,40,83,32,40,+40,83,32,40,40,40,83,39,32,95,49,50,48,41,32,40,40,67,32,40,+95,50,48,50,32,95,49,51,49,41,41,32,35,51,52,41,41,32,40,40,+40,83,39,32,95,49,50,48,41,32,40,40,67,32,40,95,50,48,50,32,+95,49,51,49,41,41,32,35,57,50,41,41,32,40,40,40,83,39,32,95,+49,50,48,41,32,40,40,67,32,40,95,52,57,55,32,95,49,51,50,41,+41,32,35,51,50,41,41,32,40,40,67,32,40,95,52,57,57,32,95,49,+51,50,41,41,32,35,49,50,54,41,41,41,41,41,32,40,40,67,32,79,+41,32,75,41,41,41,32,40,40,66,32,40,95,52,54,50,32,35,57,50,+41,41,32,40,40,40,67,39,32,95,52,54,51,41,32,40,40,66,32,40,+95,49,53,57,48,32,95,50,56,51,41,41,32,95,49,51,55,41,41,32,+40,40,79,32,35,51,56,41,32,75,41,41,41,41,41,41,32,40,40,79,+32,35,51,52,41,32,75,41,41,41,41,32,40,40,65,32,58,55,48,49,+32,40,40,95,50,54,51,32,95,55,48,50,41,32,40,95,51,57,53,32,+40,40,95,50,54,51,32,95,54,55,56,41,32,40,40,95,50,54,51,32,+95,55,55,53,41,32,95,49,51,55,41,41,41,41,41,32,40,40,65,32,+58,55,48,50,32,40,40,95,51,57,55,32,40,95,54,57,48,32,95,54,+57,50,41,41,32,95,54,57,51,41,41,32,40,40,65,32,58,55,48,51,+32,40,40,95,50,54,51,32,95,55,49,55,41,32,95,55,48,52,41,41,+32,40,40,65,32,58,55,48,52,32,40,40,83,32,40,40,67,32,40,40,+67,32,40,40,83,32,73,41,32,75,41,41,32,40,40,40,67,39,32,66,+41,32,40,40,66,32,95,54,55,54,41,32,95,55,48,52,41,41,32,95,+55,48,52,41,41,41,32,95,55,48,53,41,41,32,75,41,41,32,40,40,+65,32,58,55,48,53,32,40,40,66,32,89,41,32,40,40,40,67,39,32,+40,67,39,32,83,41,41,32,40,40,40,67,39,32,40,83,39,32,67,41,+41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,80,41,32,40,40,+40,67,39,32,67,41,32,40,40,40,67,39,32,83,41,32,40,95,50,48,+50,32,95,56,57,50,41,41,32,40,40,66,32,95,55,48,54,41,32,95,+54,55,53,41,41,41,32,95,54,57,53,41,41,41,32,40,40,40,83,39,+32,40,67,39,32,66,41,41,32,40,66,32,95,55,48,55,41,41,32,73,+41,41,41,32,40,40,40,67,39,32,66,41,32,40,66,39,32,95,50,54,+49,41,41,32,95,55,48,53,41,41,41,32,40,90,32,95,55,48,54,41,+41,41,41,32,40,40,65,32,58,55,48,54,32,40,95,54,55,54,32,95,+54,57,54,41,41,32,40,40,65,32,58,55,48,55,32,40,40,67,32,40,+40,40,83,39,32,67,39,41,32,95,54,56,52,41,32,40,40,83,32,40,+40,40,67,39,32,83,39,41,32,40,40,66,32,83,41,32,95,54,56,50,+41,41,32,40,40,66,32,40,40,67,39,32,40,67,39,32,66,41,41,32,+40,67,32,95,54,56,52,41,41,41,32,40,40,83,32,40,40,40,83,39,+32,83,39,41,32,95,54,56,50,41,32,40,40,67,32,40,40,40,83,39,+32,83,39,41,32,95,54,56,53,41,32,40,67,32,95,55,49,50,41,41,+41,32,73,41,41,41,32,40,40,40,67,39,32,40,83,39,32,40,67,39,+32,66,41,41,41,32,40,40,66,32,40,66,32,40,67,32,95,54,56,52,+41,41,41,32,40,67,32,95,55,49,50,41,41,41,32,40,40,66,32,40,+66,32,95,55,48,54,41,41,32,95,54,55,54,41,41,41,41,41,41,32,+95,55,48,56,41,41,41,32,95,54,57,53,41,41,32,40,40,65,32,58,+55,48,56,32,40,40,40,83,39,32,83,41,32,40,40,66,32,40,83,32,+95,54,56,50,41,41,32,95,55,48,57,41,41,32,40,40,40,83,39,32,+40,67,39,32,40,67,39,32,66,41,41,41,32,40,40,66,32,40,66,32,+40,67,32,95,54,56,52,41,41,41,32,95,55,48,57,41,41,32,95,55,+49,48,41,41,41,32,40,40,65,32,58,55,48,57,32,40,40,83,32,40,+40,40,67,39,32,83,39,41,32,40,40,66,32,83,41,32,95,54,56,50,+41,41,32,40,40,66,32,40,40,83,39,32,40,67,39,32,66,41,41,32,+40,67,32,95,54,56,50,41,41,41,32,40,40,66,32,40,40,67,39,32,+66,41,32,40,40,66,32,40,67,39,32,66,41,41,32,40,67,32,95,54,+56,54,41,41,41,41,32,40,40,67,39,32,67,41,32,40,67,32,95,55,+49,53,41,41,41,41,41,41,32,40,95,54,57,48,32,95,54,57,55,41,+41,41,32,40,40,65,32,58,55,49,48,32,40,40,83,32,40,40,40,67,+39,32,83,39,41,32,40,40,66,32,83,41,32,95,54,56,50,41,41,32,+40,40,66,32,40,40,83,39,32,40,67,39,32,66,41,41,32,40,67,32,+95,54,56,50,41,41,41,32,40,40,40,83,39,32,40,67,39,32,40,83,+39,32,67,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,40,83,+39,32,83,39,41,32,95,54,56,54,41,41,41,41,32,40,40,66,32,40,+40,67,39,32,66,41,32,40,40,66,32,40,67,39,32,67,41,41,32,40,+67,32,40,40,40,67,39,32,67,39,41,32,40,40,66,32,95,49,50,49,+41,32,95,54,56,55,41,41,32,95,54,56,53,41,41,41,41,41,32,40,+67,32,40,95,54,57,48,32,95,54,57,56,41,41,41,41,41,32,40,40,+67,39,32,67,41,32,40,67,32,95,55,49,54,41,41,41,41,41,41,32,+95,55,49,49,41,41,32,40,40,65,32,58,55,49,49,32,40,95,54,57,+48,32,95,54,57,52,41,41,32,40,40,65,32,58,55,49,50,32,40,40,+83,32,40,40,40,67,39,32,83,39,41,32,40,40,66,32,83,41,32,95,+54,56,50,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,+67,41,41,41,32,40,40,66,32,67,41,32,40,40,66,32,40,40,67,39,+32,67,39,41,32,40,40,66,32,95,49,50,49,41,32,95,54,56,54,41,+41,41,32,40,40,66,32,40,40,67,39,32,95,49,50,49,41,32,95,54,+56,52,41,41,32,95,54,56,57,41,41,41,41,32,40,95,54,55,56,32,+40,95,55,56,49,32,40,40,79,32,35,55,57,41,32,75,41,41,41,41,+41,41,32,95,55,49,51,41,41,32,40,40,65,32,58,55,49,51,32,40,+40,40,83,39,32,83,41,32,40,40,66,32,40,40,67,39,32,83,41,32,+95,54,56,50,41,41,32,40,40,40,83,39,32,40,83,39,32,67,41,41,+32,40,40,66,32,40,66,32,40,40,83,39,32,83,39,41,32,95,54,56,+50,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,67,+41,41,41,32,40,40,40,67,39,32,67,39,41,32,40,40,66,32,67,39,+41,32,40,40,66,32,95,49,50,49,41,32,95,54,56,55,41,41,41,32,+40,40,40,67,39,32,66,41,32,40,40,66,32,95,49,50,49,41,32,95,+54,56,55,41,41,32,95,54,56,53,41,41,41,32,95,54,57,56,41,41,+41,32,40,40,66,32,40,66,32,40,67,39,32,67,41,41,41,32,40,40,+40,67,39,32,67,39,41,32,40,40,66,32,67,39,41,32,40,40,66,32,+95,49,50,49,41,32,95,54,56,56,41,41,41,32,40,40,40,67,39,32,+66,41,32,40,40,66,32,95,49,50,49,41,32,95,54,56,54,41,41,32,+95,54,56,52,41,41,41,41,41,41,32,95,55,49,52,41,41,32,40,40,+65,32,58,55,49,52,32,40,40,67,32,40,40,40,83,39,32,83,39,41,+32,95,54,56,53,41,32,40,95,54,57,48,32,40,95,54,55,56,32,40,+95,55,56,49,32,40,40,79,32,35,54,54,41,32,75,41,41,41,41,41,+41,32,73,41,41,32,40,40,65,32,58,55,49,53,32,40,95,54,57,49,+32,40,95,54,55,56,32,40,95,55,56,49,32,34,83,39,34,41,41,41,+41,32,40,40,65,32,58,55,49,54,32,40,95,54,57,49,32,40,95,54,+55,56,32,40,95,55,56,49,32,34,67,39,34,41,41,41,41,32,40,40,+65,32,58,55,49,55,32,40,40,67,32,40,40,83,32,95,54,56,50,41,+32,73,41,41,32,40,40,66,32,40,40,67,39,32,40,67,32,40,40,40,+67,39,32,67,41,32,40,40,83,32,40,40,40,67,39,32,83,39,41,32,+40,40,66,32,95,49,50,49,41,32,95,54,56,52,41,41,32,95,54,56,+53,41,41,32,40,40,40,67,39,32,67,41,32,40,40,83,32,40,40,40,+67,39,32,83,39,41,32,40,40,66,32,95,49,50,49,41,32,95,54,56,+54,41,41,32,95,54,56,52,41,41,32,40,40,40,67,39,32,67,41,32,+40,40,83,32,40,40,40,67,39,32,83,39,41,32,40,40,66,32,95,49,+50,49,41,32,95,54,56,55,41,41,32,95,54,56,53,41,41,32,40,40,+40,67,39,32,67,41,32,40,40,83,32,40,40,40,67,39,32,83,39,41,+32,40,40,66,32,95,49,50,49,41,32,95,54,56,54,41,41,32,95,54,+56,54,41,41,32,40,40,40,67,39,32,67,41,32,40,40,83,32,40,40,+40,67,39,32,83,39,41,32,40,40,66,32,95,49,50,49,41,32,95,54,+56,55,41,41,32,95,54,56,55,41,41,32,40,40,40,83,39,32,83,41,+32,40,40,66,32,40,83,32,95,54,56,50,41,41,32,95,54,55,54,41,+41,32,40,40,40,83,39,32,66,41,32,40,40,40,67,39,32,67,39,41,+32,40,40,66,32,95,49,50,49,41,32,95,54,56,56,41,41,32,95,54,+56,52,41,41,32,95,54,55,54,41,41,41,41,32,40,95,54,55,56,32,+40,95,55,56,49,32,40,40,79,32,35,56,50,41,32,75,41,41,41,41,+41,41,32,40,95,54,55,56,32,40,95,55,56,49,32,34,66,39,34,41,+41,41,41,41,32,40,95,54,55,56,32,40,95,55,56,49,32,40,40,79,+32,35,56,53,41,32,75,41,41,41,41,41,41,32,40,95,54,55,56,32,+40,95,55,56,49,32,40,40,79,32,35,57,48,41,32,75,41,41,41,41,+41,41,32,40,95,54,55,56,32,40,95,55,56,49,32,40,40,79,32,35,+54,53,41,32,75,41,41,41,41,41,41,32,95,55,49,55,41,41,32,95,+55,49,55,41,41,41,32,40,40,65,32,58,55,49,56,32,40,40,40,95,+49,53,56,56,32,40,95,49,53,57,50,32,95,55,49,56,41,41,32,40,+40,95,50,54,51,32,95,49,53,56,48,41,32,95,55,49,57,41,41,32,+40,95,49,53,57,52,32,95,55,49,56,41,41,41,32,40,40,65,32,58,+55,49,57,32,40,40,67,32,40,40,67,32,40,40,80,32,95,57,48,51,+41,32,40,40,66,32,40,66,32,40,95,50,54,49,32,95,49,53,52,53,+41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,95,49,53,+54,54,41,32,95,55,49,57,41,41,32,95,55,49,57,41,41,41,41,32,+40,40,66,32,40,66,32,40,95,50,54,49,32,95,49,53,52,53,41,41,+41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,95,49,53,54,54,+41,32,40,40,40,67,39,32,95,49,53,54,53,41,32,40,40,66,32,40,+95,49,53,54,53,32,40,95,49,53,51,53,32,40,40,79,32,35,57,50,+41,32,75,41,41,41,41,32,95,57,48,51,41,41,32,40,95,49,53,51,+53,32,40,40,79,32,35,52,54,41,32,75,41,41,41,41,41,32,95,55,+49,57,41,41,41,41,32,40,40,66,32,95,49,53,51,53,41,32,95,56,+54,50,41,41,41,32,40,40,65,32,58,55,50,48,32,40,40,66,32,89,+41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,+32,40,40,40,83,39,32,40,83,39,32,40,83,39,32,83,41,41,41,32,+40,40,40,67,39,32,66,41,32,40,40,66,32,40,83,39,32,67,41,41,+32,40,40,66,32,40,66,32,40,83,32,73,41,41,41,32,40,40,66,32,+40,67,39,32,67,41,41,32,40,40,66,32,67,41,32,40,67,32,40,95,+50,48,50,32,95,56,57,50,41,41,41,41,41,41,41,32,40,40,40,83,+39,32,40,83,39,32,40,67,39,32,66,41,41,41,32,40,66,32,40,66,+32,95,54,55,54,41,41,41,32,73,41,41,41,32,40,40,66,32,40,66,+32,40,66,32,67,41,41,41,32,40,40,40,67,39,32,66,41,32,40,66,+39,32,40,40,66,32,40,83,39,32,67,39,41,41,32,40,95,50,48,50,+32,95,56,57,50,41,41,41,41,32,40,40,40,83,39,32,40,83,39,32,+83,41,41,32,40,40,66,32,40,40,83,39,32,40,83,39,32,83,39,41,+41,32,40,40,66,32,40,67,32,40,95,52,51,50,32,95,56,57,50,41,+41,41,32,95,55,50,49,41,41,41,32,40,66,32,40,40,67,39,32,66,+41,32,95,54,55,55,41,41,41,41,32,40,40,40,67,39,32,40,83,39,+32,40,67,39,32,40,83,39,32,40,83,32,95,54,55,55,41,41,41,41,+41,32,40,40,40,67,39,32,40,67,39,32,66,41,41,32,40,40,66,32,+66,39,41,32,66,39,41,41,32,40,40,40,67,39,32,67,39,41,32,95,+55,50,48,41,32,95,54,55,53,41,41,41,32,40,40,66,32,40,66,32,+95,52,50,56,41,41,32,40,40,40,67,39,32,40,67,39,32,95,51,57,+52,41,41,32,40,40,40,67,39,32,40,67,39,32,66,41,41,32,40,40,+40,67,39,32,66,41,32,40,40,66,32,83,41,32,40,40,40,67,39,32,+40,67,39,32,95,49,50,50,41,41,32,40,40,66,32,40,67,32,40,95,+52,51,50,32,95,56,57,50,41,41,41,32,95,55,50,50,41,41,32,75,+41,41,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,40,+67,39,32,95,49,50,50,41,41,32,40,40,66,32,40,67,32,40,95,52,+51,50,32,95,56,57,50,41,41,41,32,95,55,50,50,41,41,32,75,41,+41,32,40,40,67,32,79,41,32,75,41,41,41,41,32,40,40,66,32,95,+56,57,55,41,32,40,40,66,32,40,95,52,54,51,32,40,40,79,32,35,+57,55,41,32,75,41,41,41,32,40,95,49,53,57,48,32,95,50,56,51,+41,41,41,41,41,32,40,40,95,49,56,52,32,95,49,57,56,41,32,35,+48,41,41,41,41,41,41,41,41,41,32,75,41,41,41,32,40,40,65,32,+58,55,50,49,32,40,40,67,32,40,40,67,32,40,40,80,32,40,40,67,+32,79,41,32,75,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,+32,95,52,54,51,41,32,95,55,50,49,41,41,32,95,55,50,49,41,41,+41,32,40,40,40,67,39,32,66,41,32,40,95,52,52,51,32,40,95,50,+48,50,32,95,56,57,50,41,41,41,32,95,55,50,49,41,41,41,32,40,+75,32,95,52,54,49,41,41,41,32,40,40,65,32,58,55,50,50,32,40,+40,67,32,40,40,67,32,40,40,80,32,40,40,67,32,79,41,32,75,41,+41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,95,52,54,51,41,+32,95,55,50,50,41,41,32,95,55,50,50,41,41,41,32,40,40,40,67,+39,32,66,41,32,95,52,54,50,41,32,95,55,50,50,41,41,41,32,40,+75,32,95,52,54,49,41,41,41,32,40,40,65,32,58,55,50,51,32,40,+40,66,32,40,66,32,67,41,41,32,80,41,41,32,40,40,65,32,58,55,+50,52,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,66,+32,90,41,32,85,41,41,41,41,32,40,40,65,32,58,55,50,53,32,40,+90,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,85,41,41,41,+41,32,40,40,65,32,58,55,50,54,32,40,90,32,40,90,32,40,40,66,+32,90,41,32,85,41,41,41,41,32,40,40,65,32,58,55,50,55,32,40,+90,32,40,90,32,40,90,32,85,41,41,41,41,32,40,40,65,32,58,55,+50,56,32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,+32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,+40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,+66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,+40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,+41,32,40,40,66,32,40,66,32,90,41,41,32,80,41,41,41,41,41,41,+41,41,41,41,41,32,40,40,65,32,58,55,50,57,32,40,40,66,32,90,+41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,+90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,+66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,+32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,+40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,+32,80,41,41,41,41,41,41,41,41,41,41,41,32,40,40,65,32,58,55,+51,48,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,66,+32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,+40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,+32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,+41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,+32,90,41,41,32,80,41,41,41,41,41,41,41,41,41,41,41,32,40,40,+65,32,58,55,51,49,32,40,40,66,32,90,41,32,40,40,66,32,90,41,+32,40,40,66,32,90,41,32,40,40,66,32,40,66,32,90,41,41,32,40,+40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,+32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,+41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,+32,90,41,41,32,80,41,41,41,41,41,41,41,41,41,41,41,32,40,40,+65,32,58,55,51,50,32,40,40,66,32,90,41,32,40,40,66,32,90,41,+32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,66,32,40,+66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,+32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,+40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,+32,80,41,41,41,41,41,41,41,41,41,41,41,32,40,40,65,32,58,55,+51,51,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,40,+66,32,90,41,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,+40,66,32,90,41,32,40,40,66,32,90,41,32,85,41,41,41,41,41,41,+41,41,41,41,41,32,40,40,65,32,58,55,51,52,32,40,40,66,32,40,+66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,+32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,+40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,+32,40,40,66,32,40,66,32,40,66,32,90,41,41,41,32,40,40,66,32,+40,66,32,40,66,32,90,41,41,41,32,40,40,66,32,40,66,32,40,66,+32,90,41,41,41,32,40,40,66,32,40,66,32,40,66,32,90,41,41,41,+32,40,40,66,32,40,66,32,67,41,41,32,80,41,41,41,41,41,41,41,+41,41,41,41,41,32,40,40,65,32,58,55,51,53,32,40,40,66,32,90,+41,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,66,32,+90,41,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,66,+32,90,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,+66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,80,41,41,+41,41,41,41,41,41,41,41,41,32,40,40,65,32,58,55,51,54,32,40,+40,66,32,40,66,32,40,66,32,90,41,41,41,32,40,40,66,32,40,66,+32,40,66,32,90,41,41,41,32,40,40,66,32,40,66,32,40,66,32,90,+41,41,41,32,40,40,66,32,40,66,32,40,66,32,90,41,41,41,32,40,+40,66,32,40,66,32,40,66,32,90,41,41,41,32,40,40,66,32,40,66,+32,40,66,32,90,41,41,41,32,40,40,66,32,40,66,32,40,66,32,90,+41,41,41,32,40,40,66,32,40,66,32,40,66,32,90,41,41,41,32,40,+40,66,32,40,66,32,40,66,32,40,66,32,90,41,41,41,41,32,40,40,+66,32,40,66,32,40,66,32,40,66,32,90,41,41,41,41,32,40,40,66,+32,40,66,32,40,66,32,67,41,41,41,32,40,40,66,32,40,66,32,67,+41,41,32,80,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,+65,32,58,55,51,55,32,40,40,66,32,40,66,32,40,66,32,90,41,41,+41,32,40,40,66,32,40,66,32,40,66,32,90,41,41,41,32,40,40,66,+32,40,66,32,40,66,32,90,41,41,41,32,40,40,66,32,40,66,32,40,+66,32,90,41,41,41,32,40,40,66,32,40,66,32,40,66,32,90,41,41,+41,32,40,40,66,32,40,66,32,40,66,32,90,41,41,41,32,40,40,66,+32,40,66,32,40,66,32,90,41,41,41,32,40,40,66,32,40,66,32,40,+66,32,90,41,41,41,32,40,40,66,32,40,66,32,40,66,32,90,41,41,+41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,90,41,41,41,41,+32,40,40,66,32,40,66,32,40,66,32,67,41,41,41,32,40,40,66,32,+40,66,32,67,41,41,32,80,41,41,41,41,41,41,41,41,41,41,41,41,+41,32,40,40,65,32,58,55,51,56,32,40,90,32,40,90,32,40,90,32,+40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,+32,85,41,41,41,41,41,41,41,41,41,41,41,32,40,40,65,32,58,55,+51,57,32,40,40,66,32,40,66,32,40,66,32,67,41,41,41,32,40,40,+66,32,40,66,32,67,41,41,32,80,41,41,41,32,40,40,65,32,58,55,+52,48,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,85,41,41,+41,32,40,40,65,32,58,55,52,49,32,40,90,32,40,40,66,32,90,41,+32,85,41,41,41,32,40,40,65,32,58,55,52,50,32,40,90,32,40,90,+32,85,41,41,41,32,40,40,65,32,58,55,52,51,32,40,40,66,32,90,+41,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,66,32,+90,41,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,66,+32,90,41,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,+66,32,90,41,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,+40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,+40,40,66,32,90,41,32,40,40,66,32,90,41,32,85,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,65,32,58,55,+52,52,32,40,40,66,32,90,41,32,40,40,66,32,40,66,32,90,41,41,+32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,+41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,+32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,+40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,+66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,+40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,+41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,+90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,+66,32,90,41,41,32,80,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,32,40,40,65,32,58,55,52,53,32,40,40,66,32,90,+41,32,40,40,66,32,90,41,32,40,40,66,32,40,66,32,90,41,41,32,+40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,+41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,+90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,+66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,+32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,+40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,+32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,+41,41,32,40,40,66,32,40,66,32,90,41,41,32,80,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,65,32,58,55,+52,54,32,40,90,32,40,90,32,40,90,32,40,40,66,32,90,41,32,40,+40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,+40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,66,32,90,41,+32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,66,32,90,+41,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,66,32,+90,41,32,40,40,66,32,90,41,32,85,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,32,40,40,65,32,58,55,52,55,32,40,+40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,+40,40,66,32,90,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,+66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,+40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,+41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,+90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,+66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,+32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,+40,66,32,40,66,32,90,41,41,32,80,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,32,40,40,65,32,58,55,52,56,32,40,+40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,+40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,66,32,40,66,+32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,+40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,+66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,+40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,+41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,+90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,+66,32,90,41,41,32,80,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,32,40,40,65,32,58,55,52,57,32,40,40,66,32,90,+41,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,66,32,+90,41,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,66,+32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,+40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,+32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,+41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,+32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,+40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,80,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,+65,32,58,55,53,48,32,40,90,32,40,90,32,40,90,32,40,90,32,40,+90,32,40,90,32,40,90,32,40,40,66,32,90,41,32,40,40,66,32,90,+41,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,66,32,+90,41,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,66,+32,90,41,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,85,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,+65,32,58,55,53,49,32,40,90,32,40,90,32,40,90,32,40,90,32,40,+90,32,40,90,32,40,90,32,40,90,32,40,40,66,32,90,41,32,40,40,+66,32,90,41,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,+40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,+40,40,66,32,90,41,32,40,40,66,32,90,41,32,85,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,65,32,58,55,+53,50,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,66,+32,90,41,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,+66,32,90,41,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,+40,66,32,90,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,+32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,+40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,+32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,+41,41,32,40,40,66,32,40,66,32,90,41,41,32,80,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,65,32,58,55,+53,51,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,66,+32,90,41,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,+66,32,90,41,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,+40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,66,32,40,66,32,+90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,+66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,+32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,+40,66,32,40,66,32,90,41,41,32,80,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,32,40,40,65,32,58,55,53,52,32,40,+40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,+40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,66,32,90,41,+32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,66,32,90,+41,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,66,32,+40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,+66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,+40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,+41,32,80,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,32,40,40,65,32,58,55,53,53,32,40,40,66,32,40,66,32,90,41,+41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,+90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,+66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,+32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,+40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,+32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,+41,41,32,40,40,66,32,40,66,32,40,66,32,90,41,41,41,32,40,40,+66,32,40,66,32,40,66,32,90,41,41,41,32,40,40,66,32,40,66,32,+40,66,32,90,41,41,41,32,40,40,66,32,40,66,32,40,66,32,90,41,+41,41,32,40,40,66,32,40,66,32,40,66,32,90,41,41,41,32,40,40,+66,32,40,66,32,67,41,41,32,80,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,32,40,40,65,32,58,55,53,54,32,40,+40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,+40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,66,32,90,41,+32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,66,32,90,+41,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,66,32,+90,41,32,40,40,66,32,90,41,32,40,40,66,32,40,66,32,90,41,41,+32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,+41,41,32,40,40,66,32,40,66,32,90,41,41,32,80,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,65,32,58,55,+53,55,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,66,+32,90,41,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,+66,32,90,41,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,+40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,+40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,66,32,90,41,+32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,+41,41,32,40,40,66,32,40,66,32,90,41,41,32,80,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,65,32,58,55,+53,56,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,+32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,+90,32,40,90,32,40,90,32,40,40,66,32,90,41,32,40,40,66,32,90,+41,32,85,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,32,40,40,65,32,58,55,53,57,32,40,90,32,40,90,32,40,90,32,+40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,+32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,+40,66,32,90,41,32,85,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,32,40,40,65,32,58,55,54,48,32,40,40,66,32,90,+41,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,66,32,+90,41,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,66,+32,90,41,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,+66,32,90,41,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,+40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,+40,40,66,32,90,41,32,79,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,32,40,40,65,32,58,55,54,49,32,40,40,66,32,40,+66,32,40,95,50,54,49,32,95,55,52,54,41,41,41,32,95,55,54,50,+41,41,32,40,40,65,32,58,55,54,50,32,40,40,40,67,39,32,40,67,+39,32,79,41,41,32,40,40,40,67,39,32,66,41,32,95,55,57,48,41,+32,40,40,40,67,39,32,95,55,57,49,41,32,40,40,40,67,39,32,79,+41,32,40,80,32,95,52,54,49,41,41,32,75,41,41,32,95,52,54,49,+41,41,41,32,75,41,41,32,40,40,65,32,58,55,54,51,32,40,40,66,+32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,80,+41,41,41,32,40,40,65,32,58,55,54,52,32,40,90,32,40,40,66,32,+90,41,32,85,41,41,41,32,40,40,65,32,58,55,54,53,32,40,40,66,+32,90,41,32,79,41,41,32,40,40,65,32,58,55,54,54,32,40,40,66,+32,90,41,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,+66,32,90,41,32,40,40,66,32,90,41,32,85,41,41,41,41,41,41,32,+40,40,65,32,58,55,54,55,32,40,40,66,32,90,41,32,40,40,66,32,+40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,+66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,+80,41,41,41,41,41,41,32,40,40,65,32,58,55,54,56,32,40,90,32,+40,90,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,66,+32,90,41,32,85,41,41,41,41,41,41,32,40,40,65,32,58,55,54,57,+32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,66,32,90,+41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,+90,41,41,32,80,41,41,41,41,41,41,32,40,40,65,32,58,55,55,48,+32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,66,32,90,+41,32,40,40,66,32,90,41,32,40,40,66,32,40,66,32,90,41,41,32,+80,41,41,41,41,41,41,32,40,40,65,32,58,55,55,49,32,40,40,66,+32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,+40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,+32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,67,+41,41,32,80,41,41,41,41,41,41,41,32,40,40,65,32,58,55,55,50,+32,40,40,67,32,40,40,80,32,65,41,32,73,41,41,32,40,75,32,40,+75,32,40,95,50,52,32,34,99,111,110,73,100,101,110,116,34,41,41,41,+41,41,32,40,40,65,32,58,55,55,51,32,40,40,67,32,40,40,80,32,+40,40,66,32,40,66,32,40,95,50,54,49,32,40,95,52,55,49,32,40,+95,50,52,32,34,99,111,110,65,114,105,116,121,34,41,41,41,41,41,32,+40,67,32,40,95,52,51,54,32,95,56,57,50,41,41,41,41,32,40,75,+32,35,49,41,41,41,32,40,75,32,40,75,32,35,48,41,41,41,41,32,+40,40,65,32,58,55,55,52,32,40,40,95,50,48,49,32,40,40,40,67,+39,32,83,41,32,40,40,67,32,40,40,67,32,83,39,41,32,40,90,32,+40,40,40,67,39,32,67,41,32,40,40,67,32,40,40,67,32,67,39,41,+32,40,90,32,40,95,50,48,50,32,95,56,57,50,41,41,41,41,32,40,+75,32,95,49,50,52,41,41,41,32,40,75,32,40,75,32,95,49,50,52,+41,41,41,41,41,41,32,40,40,67,32,40,40,40,67,39,32,67,39,41,+32,40,85,32,40,75,32,40,75,32,95,49,50,52,41,41,41,41,32,40,+95,50,48,50,32,95,56,57,50,41,41,41,32,40,75,32,40,75,32,95,+49,50,52,41,41,41,41,41,32,40,90,32,40,40,40,67,39,32,66,41,+32,40,40,80,32,40,75,32,40,75,32,95,49,50,52,41,41,41,32,40,+75,32,95,49,50,52,41,41,41,32,40,90,32,40,95,50,48,50,32,95,+55,56,51,41,41,41,41,41,41,32,40,95,50,48,53,32,95,55,55,52,+41,41,41,32,40,40,65,32,58,55,55,53,32,40,40,66,32,90,41,32,+40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,66,32,90,41,+32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,66,32,90,+41,32,85,41,41,41,41,41,41,41,41,32,40,40,65,32,58,55,55,54,+32,40,90,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,+66,32,90,41,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,+40,66,32,90,41,32,85,41,41,41,41,41,41,41,41,32,40,40,65,32,+58,55,55,55,32,40,90,32,40,90,32,40,40,66,32,90,41,32,40,40,+66,32,90,41,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,+40,66,32,90,41,32,85,41,41,41,41,41,41,41,41,32,40,40,65,32,+58,55,55,56,32,40,90,32,40,90,32,40,90,32,40,40,66,32,90,41,+32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,66,32,90,+41,32,85,41,41,41,41,41,41,41,41,32,40,40,65,32,58,55,55,57,+32,40,90,32,40,90,32,40,90,32,40,90,32,40,40,66,32,90,41,32,+40,40,66,32,90,41,32,40,40,66,32,90,41,32,85,41,41,41,41,41,+41,41,41,32,40,40,65,32,58,55,56,48,32,40,90,32,40,90,32,40,+90,32,40,90,32,40,90,32,40,40,66,32,90,41,32,40,40,66,32,90,+41,32,85,41,41,41,41,41,41,41,41,32,40,40,65,32,58,55,56,49,+32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,+40,66,32,90,41,32,85,41,41,41,41,41,41,41,41,32,40,40,65,32,+58,55,56,50,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,+40,90,32,40,90,32,85,41,41,41,41,41,41,41,41,32,40,40,65,32,+58,55,56,51,32,40,40,95,50,48,49,32,40,40,40,67,39,32,83,41,+32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,+40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,+67,39,32,83,41,32,40,40,67,32,40,40,67,32,83,39,41,32,40,40,+40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,+39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,+67,41,32,40,40,40,67,39,32,67,41,32,40,40,67,32,40,40,67,32,+67,39,41,32,40,95,50,48,50,32,95,50,56,49,41,41,41,32,40,75,+32,95,49,50,52,41,41,41,32,40,75,32,95,49,50,52,41,41,41,32,+40,75,32,95,49,50,52,41,41,41,32,40,75,32,95,49,50,52,41,41,+41,32,40,75,32,95,49,50,52,41,41,41,32,40,75,32,95,49,50,52,+41,41,41,32,40,75,32,95,49,50,52,41,41,41,41,32,40,40,40,67,+39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,+67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,+32,40,40,67,32,40,40,40,67,39,32,67,39,41,32,40,85,32,40,75,+32,95,49,50,52,41,41,41,32,40,95,50,48,50,32,95,51,48,53,41,+41,41,32,40,75,32,95,49,50,52,41,41,41,32,40,75,32,95,49,50,+52,41,41,41,32,40,75,32,95,49,50,52,41,41,41,32,40,75,32,95,+49,50,52,41,41,41,32,40,75,32,95,49,50,52,41,41,41,32,40,75,+32,95,49,50,52,41,41,41,41,32,40,40,40,67,39,32,67,41,32,40,+40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,+67,39,32,67,41,32,40,40,67,32,40,40,40,67,39,32,67,39,41,32,+40,40,80,32,40,75,32,95,49,50,52,41,41,32,40,75,32,95,49,50,+52,41,41,41,32,40,95,50,48,50,32,95,49,53,51,41,41,41,32,40,+75,32,95,49,50,52,41,41,41,32,40,75,32,95,49,50,52,41,41,41,+32,40,75,32,95,49,50,52,41,41,41,32,40,75,32,95,49,50,52,41,+41,41,32,40,75,32,95,49,50,52,41,41,41,41,32,40,40,40,67,39,+32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,+41,32,40,40,67,32,40,40,40,67,39,32,67,39,41,32,40,40,67,32,+40,40,80,32,40,75,32,95,49,50,52,41,41,32,40,75,32,95,49,50,+52,41,41,41,32,40,75,32,95,49,50,52,41,41,41,32,40,95,50,48,+50,32,40,95,53,49,55,32,95,51,48,53,41,41,41,41,32,40,75,32,+95,49,50,52,41,41,41,32,40,75,32,95,49,50,52,41,41,41,32,40,+75,32,95,49,50,52,41,41,41,32,40,75,32,95,49,50,52,41,41,41,+41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,+40,40,67,32,40,40,40,67,39,32,67,39,41,32,40,40,67,32,40,40,+67,32,40,40,80,32,40,75,32,95,49,50,52,41,41,32,40,75,32,95,+49,50,52,41,41,41,32,40,75,32,95,49,50,52,41,41,41,32,40,75,+32,95,49,50,52,41,41,41,32,40,95,50,48,50,32,95,49,51,49,41,+41,41,32,40,75,32,95,49,50,52,41,41,41,32,40,75,32,95,49,50,+52,41,41,41,32,40,75,32,95,49,50,52,41,41,41,41,32,40,40,40,+67,39,32,67,41,32,40,40,67,32,40,40,40,67,39,32,67,39,41,32,+40,40,67,32,40,40,67,32,40,40,67,32,40,40,80,32,40,75,32,95,+49,50,52,41,41,32,40,75,32,95,49,50,52,41,41,41,32,40,75,32,+95,49,50,52,41,41,41,32,40,75,32,95,49,50,52,41,41,41,32,40,+75,32,95,49,50,52,41,41,41,32,40,95,50,48,50,32,95,49,51,51,+41,41,41,32,40,75,32,95,49,50,52,41,41,41,32,40,75,32,95,49,+50,52,41,41,41,41,32,40,40,67,32,40,40,40,67,39,32,67,39,41,+32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,80,+32,40,75,32,95,49,50,52,41,41,32,40,75,32,95,49,50,52,41,41,+41,32,40,75,32,95,49,50,52,41,41,41,32,40,75,32,95,49,50,52,+41,41,41,32,40,75,32,95,49,50,52,41,41,41,32,40,75,32,95,49,+50,52,41,41,41,32,40,95,50,48,50,32,95,49,51,51,41,41,41,32,+40,75,32,95,49,50,52,41,41,41,41,32,40,40,40,67,39,32,66,41,+32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,+32,40,40,80,32,40,75,32,95,49,50,52,41,41,32,40,75,32,95,49,+50,52,41,41,41,32,40,75,32,95,49,50,52,41,41,41,32,40,75,32,+95,49,50,52,41,41,41,32,40,75,32,95,49,50,52,41,41,41,32,40,+75,32,95,49,50,52,41,41,41,32,40,75,32,95,49,50,52,41,41,41,+32,40,95,50,48,50,32,95,49,51,51,41,41,41,41,32,40,95,50,48,+53,32,95,55,56,51,41,41,41,32,40,40,65,32,58,55,56,52,32,40,+40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,+32,80,41,41,41,32,40,40,65,32,58,55,56,53,32,40,90,32,40,40,+66,32,90,41,32,85,41,41,41,32,40,40,65,32,58,55,56,54,32,40,+90,32,40,90,32,85,41,41,41,32,40,40,65,32,58,55,56,55,32,40,+40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,+32,80,41,41,41,32,40,40,65,32,58,55,56,56,32,40,40,66,32,90,+41,32,40,40,66,32,40,66,32,90,41,41,32,80,41,41,41,32,40,40,+65,32,58,55,56,57,32,40,40,66,32,90,41,32,79,41,41,32,40,40,+65,32,58,55,57,48,32,80,41,32,40,40,65,32,58,55,57,49,32,80,+41,32,40,40,65,32,58,55,57,50,32,40,40,67,32,40,40,67,32,40,+40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,+40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,+40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,80,32,40,+40,66,32,95,49,50,50,41,32,95,57,49,48,41,41,32,40,75,32,40,+75,32,95,49,50,52,41,41,41,41,32,40,75,32,40,75,32,95,49,50,+52,41,41,41,41,32,40,75,32,95,49,50,52,41,41,41,32,40,75,32,+40,75,32,95,49,50,52,41,41,41,41,32,40,75,32,40,75,32,95,49,+50,52,41,41,41,41,32,40,75,32,40,75,32,95,49,50,52,41,41,41,+41,32,40,75,32,95,49,50,52,41,41,41,32,40,75,32,95,49,50,52,+41,41,41,32,40,75,32,40,75,32,95,49,50,52,41,41,41,41,32,40,+75,32,40,75,32,95,49,50,52,41,41,41,41,32,40,75,32,40,75,32,+95,49,50,52,41,41,41,41,32,40,75,32,40,75,32,40,75,32,95,49,+50,52,41,41,41,41,41,32,40,75,32,40,75,32,95,49,50,52,41,41,+41,41,32,40,75,32,40,75,32,95,49,50,52,41,41,41,41,32,40,75,+32,95,49,50,52,41,41,41,32,40,75,32,95,49,50,52,41,41,41,32,+40,75,32,40,75,32,95,49,50,52,41,41,41,41,32,40,40,65,32,58,+55,57,51,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,+40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,+40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,+40,40,67,32,40,40,67,32,40,40,80,32,95,57,49,48,41,32,40,90,+32,95,55,57,51,41,41,41,32,40,75,32,40,75,32,95,49,50,53,41,+41,41,41,32,40,75,32,95,49,50,53,41,41,41,32,40,75,32,40,75,+32,95,49,50,53,41,41,41,41,32,40,75,32,40,75,32,95,49,50,53,+41,41,41,41,32,40,75,32,40,75,32,95,49,50,53,41,41,41,41,32,+40,75,32,95,49,50,53,41,41,41,32,40,75,32,95,49,50,53,41,41,+41,32,40,75,32,40,75,32,95,49,50,53,41,41,41,41,32,40,75,32,+40,75,32,95,49,50,53,41,41,41,41,32,40,75,32,40,75,32,95,49,+50,53,41,41,41,41,32,40,75,32,40,75,32,40,75,32,95,49,50,53,+41,41,41,41,41,32,40,75,32,40,75,32,95,49,50,53,41,41,41,41,+32,40,75,32,40,75,32,95,49,50,53,41,41,41,41,32,40,75,32,95,+49,50,53,41,41,41,32,40,75,32,95,49,50,53,41,41,41,32,40,75,+32,40,75,32,95,49,50,53,41,41,41,41,32,40,40,65,32,58,55,57,+52,32,40,40,95,50,54,51,32,40,95,51,57,54,32,40,40,40,83,39,+32,95,49,50,49,41,32,40,40,66,32,95,49,50,50,41,32,95,57,49,+48,41,41,32,40,40,66,32,95,49,50,50,41,32,95,57,49,53,41,41,+41,41,32,95,56,51,48,41,41,32,40,40,65,32,58,55,57,53,32,40,+40,66,32,40,66,32,40,66,32,67,41,41,41,32,40,40,66,32,40,66,+32,67,41,41,32,80,41,41,41,32,40,40,65,32,58,55,57,54,32,80,+41,32,40,40,65,32,58,55,57,55,32,40,40,40,95,49,53,56,56,32,+40,95,49,53,57,50,32,95,55,57,55,41,41,32,40,85,32,40,40,66,+32,40,66,32,40,95,52,54,51,32,40,40,79,32,35,52,48,41,32,75,+41,41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,95,52,+54,51,41,32,40,95,49,53,57,48,32,95,56,57,52,41,41,41,32,40,+40,66,32,40,95,52,54,51,32,34,58,58,34,41,41,32,40,40,40,67,+39,32,95,52,54,51,41,32,40,95,49,53,57,48,32,95,56,51,55,41,+41,32,40,40,79,32,35,52,49,41,32,75,41,41,41,41,41,41,41,32,+40,95,49,53,57,52,32,95,55,57,55,41,41,41,32,40,40,65,32,58,+55,57,56,32,40,85,32,75,41,41,32,40,40,65,32,58,55,57,57,32,+40,95,55,52,51,32,40,40,95,56,57,49,32,95,56,57,53,41,32,34,+80,114,105,109,105,116,105,118,101,115,46,84,121,112,101,34,41,41,41,32,+40,40,65,32,58,56,48,48,32,40,95,55,52,51,32,40,40,95,56,57,+49,32,95,56,57,53,41,32,34,80,114,105,109,105,116,105,118,101,115,46,+67,111,110,115,116,114,97,105,110,116,34,41,41,41,32,40,40,65,32,58,+56,48,49,32,40,40,40,67,39,32,66,41,32,95,56,57,56,41,32,40,+40,40,67,39,32,95,52,52,54,41,32,40,40,67,32,40,95,52,56,48,+32,95,50,55,55,41,41,32,35,49,41,41,32,35,52,52,41,41,41,32,+40,40,65,32,58,56,48,50,32,40,40,67,32,40,40,67,32,95,57,48,+48,41,32,95,52,55,54,41,41,32,40,40,40,67,39,32,66,41,32,40,+40,67,32,40,40,67,32,61,61,41,32,35,52,52,41,41,32,95,52,55,+54,41,41,32,40,40,66,32,95,52,55,55,41,32,40,40,40,67,39,32,+40,95,52,55,57,32,95,50,55,55,41,41,32,95,52,49,49,41,32,35,+50,41,41,41,41,41,32,40,40,65,32,58,56,48,51,32,40,40,40,67,+39,32,67,41,32,40,40,40,67,39,32,40,67,39,32,40,83,39,32,95,+55,54,49,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,+32,79,41,41,41,32,40,40,66,32,40,66,32,40,66,32,95,55,53,48,+41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,40,67,39,+32,95,51,57,52,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,+39,32,79,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,95,50,+54,49,32,95,55,52,51,41,41,41,41,32,40,40,66,32,67,41,32,40,+40,40,67,39,32,67,41,32,40,67,32,40,95,50,48,50,32,95,50,56,+49,41,41,41,32,95,57,49,52,41,41,41,41,32,75,41,41,41,32,40,+40,66,32,40,40,95,49,56,54,32,95,49,57,56,41,32,40,40,95,52,+56,53,32,95,50,55,55,41,32,40,95,51,53,57,32,35,48,41,41,41,+41,32,40,40,67,32,40,95,52,56,48,32,95,50,55,55,41,41,32,35,+49,41,41,41,41,41,32,75,41,41,32,95,55,52,51,41,41,32,40,95,+56,57,55,32,34,36,120,34,41,41,41,32,40,40,65,32,58,56,48,52,+32,85,41,32,40,40,65,32,58,56,48,53,32,40,85,32,73,41,41,32,+40,40,65,32,58,56,48,54,32,40,75,32,40,110,111,68,101,102,97,117,+108,116,32,34,72,97,115,76,111,99,46,103,101,116,83,76,111,99,34,41,+41,41,32,40,40,65,32,58,56,48,55,32,40,95,56,48,52,32,40,85,+32,75,41,41,41,32,40,40,65,32,58,56,48,56,32,40,95,56,48,52,+32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,+32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,+32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,+32,40,40,67,32,40,40,80,32,40,95,56,48,53,32,95,56,48,55,41,+41,32,40,90,32,40,95,56,48,53,32,95,56,48,56,41,41,41,41,32,+40,90,32,40,95,56,48,53,32,95,56,48,56,41,41,41,41,32,40,95,+56,48,53,32,40,95,56,48,57,32,95,56,49,53,41,41,41,41,32,75,+41,41,32,40,90,32,40,95,56,48,53,32,95,56,48,56,41,41,41,41,+32,40,90,32,40,95,56,48,53,32,40,95,56,48,57,32,95,56,49,52,+41,41,41,41,41,32,40,95,56,48,53,32,40,95,56,48,57,32,95,56,+48,56,41,41,41,41,32,40,95,56,48,53,32,95,56,49,50,41,41,41,+32,40,40,67,32,40,40,67,32,67,39,41,32,40,95,56,48,53,32,40,+95,56,48,57,32,95,56,49,51,41,41,41,41,32,40,95,56,48,53,32,+95,56,48,55,41,41,41,41,32,40,90,32,40,95,56,48,53,32,95,56,+48,56,41,41,41,41,32,40,90,32,40,95,56,48,53,32,95,56,48,55,+41,41,41,41,32,40,90,32,40,90,32,40,95,56,48,53,32,95,56,48,+56,41,41,41,41,41,32,40,90,32,40,95,56,48,53,32,95,56,48,56,+41,41,41,41,32,40,90,32,40,95,56,48,53,32,95,56,48,55,41,41,+41,41,32,40,75,32,40,95,50,52,32,34,103,101,116,83,76,111,99,32,+69,85,86,97,114,34,41,41,41,41,32,40,95,56,48,53,32,95,56,49,+49,41,41,41,32,40,40,83,32,40,40,67,32,67,39,41,32,40,95,56,+48,53,32,95,56,48,56,41,41,41,32,40,90,32,40,90,32,40,95,56,+48,53,32,40,95,56,48,57,32,95,56,49,48,41,41,41,41,41,41,41,+41,32,40,40,65,32,58,56,48,57,32,40,40,66,32,95,56,48,52,41,+32,40,40,66,32,40,80,32,40,95,50,52,32,34,103,101,116,83,76,111,+99,32,91,93,34,41,41,41,32,40,40,66,32,90,41,32,95,56,48,53,+41,41,41,41,32,40,40,65,32,58,56,49,48,32,40,95,56,48,52,32,+40,85,32,40,90,32,40,95,56,48,53,32,95,56,48,55,41,41,41,41,+41,32,40,40,65,32,58,56,49,49,32,40,95,56,48,52,32,40,40,67,+32,40,40,80,32,40,75,32,40,95,56,48,53,32,95,56,48,55,41,41,+41,32,40,95,56,48,53,32,95,56,48,55,41,41,41,32,75,41,41,41,+32,40,40,65,32,58,56,49,50,32,40,95,56,48,52,32,40,40,67,32,+40,40,67,32,40,40,67,32,40,40,67,32,40,40,80,32,40,95,56,48,+53,32,40,95,56,48,57,32,95,56,48,56,41,41,41,32,40,90,32,40,+95,56,48,53,32,95,56,48,56,41,41,41,41,32,40,95,56,48,53,32,+95,56,48,56,41,41,41,32,40,90,32,40,95,56,48,53,32,95,56,48,+56,41,41,41,41,32,40,90,32,40,95,56,48,53,32,95,56,48,56,41,+41,41,41,32,40,90,32,40,90,32,40,95,56,48,53,32,95,56,48,56,+41,41,41,41,41,41,32,40,40,65,32,58,56,49,51,32,40,95,56,48,+52,32,40,40,67,32,40,40,80,32,40,90,32,40,95,56,48,53,32,95,+56,48,56,41,41,41,32,40,95,56,48,53,32,95,56,48,56,41,41,41,+32,40,95,56,48,53,32,40,95,56,48,57,32,95,56,49,52,41,41,41,+41,41,32,40,40,65,32,58,56,49,52,32,40,95,56,48,52,32,40,40,+67,32,40,40,80,32,40,90,32,40,95,56,48,53,32,95,56,48,55,41,+41,41,32,40,90,32,40,95,56,48,53,32,95,56,48,56,41,41,41,41,+32,40,90,32,40,95,56,48,53,32,95,56,48,55,41,41,41,41,41,32,+40,40,65,32,58,56,49,53,32,40,95,56,48,52,32,40,85,32,40,40,+67,32,40,40,67,32,67,39,41,32,40,95,56,48,53,32,95,56,49,54,+41,41,41,32,40,90,32,40,95,56,48,53,32,95,56,48,56,41,41,41,+41,41,41,32,40,40,65,32,58,56,49,54,32,40,95,56,48,52,32,40,+85,32,40,90,32,40,95,56,48,53,32,40,95,56,48,57,32,95,56,49,+55,41,41,41,41,41,41,32,40,40,65,32,58,56,49,55,32,40,95,56,+48,52,32,40,85,32,40,40,83,32,40,40,67,32,67,39,41,32,40,95,+56,48,53,32,95,56,48,56,41,41,41,32,40,90,32,40,90,32,40,95,+56,48,53,32,40,95,56,48,57,32,95,56,49,51,41,41,41,41,41,41,+41,41,32,40,40,65,32,58,56,49,56,32,40,90,32,75,41,41,32,40,+40,65,32,58,56,49,57,32,40,75,32,75,41,41,32,40,40,65,32,58,+56,50,48,32,40,75,32,65,41,41,32,40,40,65,32,58,56,50,49,32,+40,40,95,50,48,49,32,40,40,40,67,39,32,83,41,32,40,40,67,32,+40,40,67,32,83,39,41,32,40,40,67,32,40,40,80,32,95,49,50,53,+41,32,95,49,50,52,41,41,32,95,49,50,52,41,41,41,32,40,40,67,+32,40,40,80,32,95,49,50,52,41,32,95,49,50,53,41,41,32,95,49,+50,52,41,41,41,32,40,40,67,32,40,40,80,32,95,49,50,52,41,32,+95,49,50,52,41,41,32,95,49,50,53,41,41,41,32,40,95,50,48,53,+32,95,56,50,49,41,41,41,32,40,40,65,32,58,56,50,50,32,40,40,+83,32,40,85,32,95,50,54,52,41,41,32,40,90,32,40,90,32,40,40,+66,32,89,41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,+40,40,83,39,32,40,67,39,32,40,67,39,32,67,41,41,41,32,40,40,+40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,32,40,40,40,+67,39,32,40,67,39,32,40,83,39,32,67,41,41,41,32,40,40,40,67,+39,32,40,67,39,32,40,67,39,32,83,41,41,41,32,40,40,40,67,39,+32,40,83,39,32,40,67,39,32,67,41,41,41,32,40,40,40,67,39,32,+40,67,39,32,40,67,39,32,83,41,41,41,32,40,40,40,67,39,32,40,+67,39,32,40,67,39,32,83,41,41,41,32,40,40,40,67,39,32,40,67,+39,32,40,67,39,32,83,41,41,41,32,40,40,40,67,39,32,40,67,39,+32,40,67,39,32,83,41,41,41,32,40,40,40,67,39,32,40,67,39,32,+40,67,39,32,83,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,+67,39,32,83,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,+39,32,83,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,+32,83,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,+83,41,41,41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,+40,40,67,39,32,40,67,39,32,40,67,39,32,83,39,41,41,41,32,40,+40,40,67,39,32,66,41,32,40,40,66,32,67,41,32,40,40,66,32,40,+83,32,73,41,41,32,40,40,66,32,40,40,67,39,32,66,41,32,40,40,+66,32,95,50,54,49,41,32,95,52,55,49,41,41,41,32,40,67,32,40,+95,52,51,54,32,95,56,57,50,41,41,41,41,41,41,32,40,40,40,83,+39,32,40,67,39,32,66,41,41,32,40,66,32,95,55,52,52,41,41,32,+73,41,41,41,32,40,90,32,75,41,41,41,32,75,41,41,32,40,90,32,+75,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,+32,75,41,41,32,75,41,41,32,40,90,32,75,41,41,41,32,40,90,32,+75,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,40,90,32,75,+41,41,41,41,32,40,66,32,95,55,53,54,41,41,41,32,40,90,32,75,+41,41,41,32,75,41,41,32,75,41,41,32,40,40,66,32,40,40,83,39,+32,66,41,32,40,40,66,32,95,50,54,49,41,32,95,55,54,48,41,41,+41,32,40,40,66,32,40,66,32,95,56,50,50,41,41,32,40,40,67,39,+32,95,51,57,52,41,32,40,40,66,32,40,83,32,73,41,41,32,40,40,+66,32,40,66,32,90,41,41,32,40,40,40,67,39,32,66,41,32,40,40,+66,32,67,41,32,40,40,40,67,39,32,40,67,39,32,95,49,50,50,41,+41,32,40,40,66,32,40,67,32,40,95,52,51,50,32,95,56,57,50,41,+41,41,32,40,95,51,57,53,32,95,55,57,56,41,41,41,32,75,41,41,+41,32,40,40,67,32,79,41,32,75,41,41,41,41,41,41,41,41,41,32,+40,95,50,52,32,34,115,117,98,115,116,32,117,110,105,109,112,108,101,109,+101,110,116,101,100,34,41,41,41,41,41,41,41,32,40,40,65,32,58,56,+50,51,32,95,56,50,52,41,32,40,40,65,32,58,56,50,52,32,40,40,+40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,+39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,+67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,+32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,+40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,+67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,+32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,+41,32,40,40,67,32,40,40,67,32,83,39,41,32,40,40,40,67,39,32,+67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,+32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,+40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,+67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,+32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,+41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,+40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,+67,32,40,40,67,32,67,39,41,32,40,95,50,48,50,32,95,56,57,50,+41,41,41,32,40,75,32,40,75,32,95,49,50,52,41,41,41,41,32,40,+75,32,40,75,32,95,49,50,52,41,41,41,41,32,40,75,32,95,49,50,+52,41,41,41,32,40,75,32,40,75,32,95,49,50,52,41,41,41,41,32,+40,75,32,40,75,32,95,49,50,52,41,41,41,41,32,40,75,32,40,75,+32,95,49,50,52,41,41,41,41,32,40,75,32,95,49,50,52,41,41,41,+32,40,75,32,95,49,50,52,41,41,41,32,40,75,32,40,75,32,95,49,+50,52,41,41,41,41,32,40,75,32,40,75,32,95,49,50,52,41,41,41,+41,32,40,75,32,40,75,32,95,49,50,52,41,41,41,41,32,40,75,32,+40,75,32,40,75,32,95,49,50,52,41,41,41,41,41,32,40,75,32,40,+75,32,95,49,50,52,41,41,41,41,32,40,75,32,40,75,32,95,49,50,+52,41,41,41,41,32,40,75,32,95,49,50,52,41,41,41,32,40,75,32,+95,49,50,52,41,41,41,32,40,75,32,40,75,32,95,49,50,52,41,41,+41,41,41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,+40,67,39,32,40,67,39,32,67,41,41,32,40,40,40,67,39,32,40,67,+39,32,67,41,41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,+40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,40,67,39,32,+40,67,39,32,67,41,41,32,40,40,40,67,39,32,40,67,39,32,67,41,+41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,40,67,+39,32,40,67,39,32,67,41,41,32,40,40,40,67,39,32,40,67,39,32,+67,41,41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,+40,67,39,32,40,67,39,32,67,41,41,32,40,40,40,67,39,32,40,67,+39,32,67,41,41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,+40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,67,32,40,40,+40,67,39,32,67,39,41,32,40,40,66,32,67,39,41,32,40,85,32,40,+75,32,95,49,50,52,41,41,41,41,32,40,40,40,67,39,32,66,41,32,+40,40,66,32,40,67,39,32,66,41,41,32,40,40,66,32,40,66,32,95,+49,50,49,41,41,32,95,56,50,52,41,41,41,32,95,56,50,52,41,41,+41,32,40,75,32,40,75,32,95,49,50,52,41,41,41,41,32,40,75,32,+95,49,50,52,41,41,41,32,40,75,32,40,75,32,95,49,50,52,41,41,+41,41,32,40,75,32,40,75,32,95,49,50,52,41,41,41,41,32,40,75,+32,40,75,32,95,49,50,52,41,41,41,41,32,40,75,32,95,49,50,52,+41,41,41,32,40,75,32,95,49,50,52,41,41,41,32,40,75,32,40,75,+32,95,49,50,52,41,41,41,41,32,40,75,32,40,75,32,95,49,50,52,+41,41,41,41,32,40,75,32,40,75,32,95,49,50,52,41,41,41,41,32,+40,75,32,40,75,32,40,75,32,95,49,50,52,41,41,41,41,41,32,40,+75,32,40,75,32,95,49,50,52,41,41,41,41,32,40,75,32,40,75,32,+95,49,50,52,41,41,41,41,32,40,75,32,95,49,50,52,41,41,41,32,+40,75,32,95,49,50,52,41,41,41,32,40,75,32,40,75,32,95,49,50,+52,41,41,41,41,41,32,40,75,32,40,75,32,95,49,50,52,41,41,41,+41,32,40,75,32,95,49,50,52,41,41,41,32,40,75,32,40,75,32,95,+49,50,52,41,41,41,41,32,40,75,32,40,75,32,95,49,50,52,41,41,+41,41,32,40,75,32,40,75,32,95,49,50,52,41,41,41,41,32,40,75,+32,95,49,50,52,41,41,41,32,40,75,32,95,49,50,52,41,41,41,32,+40,75,32,40,75,32,95,49,50,52,41,41,41,41,32,40,75,32,40,75,+32,95,49,50,52,41,41,41,41,32,40,75,32,40,75,32,95,49,50,52,+41,41,41,41,32,40,75,32,40,75,32,40,75,32,95,49,50,52,41,41,+41,41,41,32,40,75,32,40,75,32,95,49,50,52,41,41,41,41,32,40,+75,32,40,75,32,95,49,50,52,41,41,41,41,32,40,75,32,95,49,50,+52,41,41,41,32,40,75,32,95,49,50,52,41,41,41,32,40,75,32,40,+75,32,95,49,50,52,41,41,41,41,32,40,40,65,32,58,56,50,53,32,+40,40,67,32,40,40,80,32,40,40,40,67,39,32,66,41,32,95,52,54,+50,41,32,40,95,51,57,52,32,95,56,50,54,41,41,41,32,40,40,40,+67,39,32,66,41,32,40,40,66,32,95,52,54,51,41,32,95,56,50,57,+41,41,32,95,56,51,48,41,41,41,32,40,90,32,40,40,67,32,79,41,+32,75,41,41,41,41,32,40,40,65,32,58,56,50,54,32,40,85,32,40,+40,40,67,39,32,66,41,32,40,40,66,32,95,52,54,51,41,32,40,95,+51,57,52,32,95,56,50,57,41,41,41,32,95,56,50,55,41,41,41,32,+40,40,65,32,58,56,50,55,32,40,85,32,40,40,40,67,39,32,66,41,+32,40,40,66,32,95,52,54,51,41,32,40,95,51,57,52,32,95,56,50,+56,41,41,41,32,40,95,51,57,52,32,95,56,50,53,41,41,41,41,32,+40,40,65,32,58,56,50,56,32,40,85,32,40,40,40,67,39,32,66,41,+32,40,40,66,32,95,52,54,51,41,32,40,95,51,57,52,32,95,56,51,+51,41,41,41,32,95,56,51,48,41,41,41,32,40,40,65,32,58,56,50,+57,32,95,56,51,48,41,32,40,40,65,32,58,56,51,48,32,40,40,67,+32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,+32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,+32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,+32,40,40,80,32,40,40,67,32,79,41,32,75,41,41,32,40,40,40,67,+39,32,66,41,32,40,40,66,32,95,52,54,51,41,32,95,56,51,48,41,+41,32,95,56,51,48,41,41,41,32,40,40,40,67,39,32,66,41,32,40,+40,66,32,95,52,54,51,41,32,95,56,51,48,41,41,32,40,95,51,57,+52,32,40,85,32,40,40,40,67,39,32,66,41,32,95,52,54,50,41,32,+95,56,51,48,41,41,41,41,41,41,32,40,95,51,57,52,32,95,56,50,+54,41,41,41,32,40,75,32,40,75,32,95,52,54,49,41,41,41,41,32,+40,40,40,67,39,32,66,41,32,40,40,66,32,95,52,54,51,41,32,95,+56,51,48,41,41,32,40,95,51,57,52,32,95,56,51,50,41,41,41,41,+32,40,40,40,67,39,32,66,41,32,40,40,66,32,95,52,54,51,41,32,+40,95,51,57,52,32,95,56,50,53,41,41,41,32,95,56,51,48,41,41,+41,32,40,95,51,57,52,32,95,56,51,48,41,41,41,32,40,40,83,32,+40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,+40,67,39,32,83,41,32,40,40,67,32,40,40,40,67,39,32,83,39,41,+32,40,85,32,40,95,51,57,52,32,95,56,51,48,41,41,41,32,40,90,+32,75,41,41,41,32,75,41,41,32,40,90,32,75,41,41,41,32,40,90,+32,75,41,41,41,32,40,90,32,40,90,32,75,41,41,41,41,32,95,56,+51,49,41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,95,+52,54,51,41,32,40,40,95,52,55,48,32,95,52,54,49,41,32,40,40,+67,32,95,52,54,50,41,32,95,52,54,49,41,41,41,41,32,40,95,51,+57,52,32,95,56,51,51,41,41,41,41,32,40,40,66,32,40,67,32,95,+52,54,50,41,41,32,95,56,51,48,41,41,41,32,40,40,40,67,39,32,+66,41,32,95,52,54,50,41,32,95,56,51,48,41,41,41,32,40,40,40,+67,39,32,66,41,32,40,66,39,32,40,40,66,32,95,52,54,51,41,32,+95,56,51,48,41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,+32,95,52,54,51,41,32,95,56,51,48,41,41,32,95,56,51,48,41,41,+41,41,32,40,90,32,95,56,51,48,41,41,41,32,40,40,40,67,39,32,+66,41,32,95,52,54,50,41,32,95,56,51,48,41,41,41,32,40,75,32,+95,52,54,49,41,41,41,32,40,40,40,67,39,32,79,41,32,95,55,55,+50,41,32,75,41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,+32,95,52,54,51,41,32,40,95,51,57,53,32,40,85,32,75,41,41,41,+41,32,95,56,51,48,41,41,41,32,40,40,65,32,58,56,51,49,32,40,+40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,80,32,40,+95,51,57,52,32,95,56,51,48,41,41,32,40,40,40,67,39,32,66,41,+32,40,40,66,32,95,52,54,51,41,32,95,56,51,48,41,41,32,40,95,+51,57,52,32,95,56,51,51,41,41,41,41,32,95,56,51,48,41,41,32,+40,40,40,67,39,32,66,41,32,40,40,66,32,95,52,54,51,41,32,95,+56,51,48,41,41,32,95,56,51,48,41,41,41,32,40,40,40,67,39,32,+66,41,32,40,40,66,32,95,52,54,51,41,32,95,56,51,48,41,41,32,+95,56,51,48,41,41,41,32,40,40,40,67,39,32,66,41,32,40,66,39,+32,40,40,66,32,95,52,54,51,41,32,95,56,51,48,41,41,41,32,40,+40,40,67,39,32,66,41,32,40,40,66,32,95,52,54,51,41,32,95,56,+51,48,41,41,32,95,56,51,48,41,41,41,41,32,40,40,65,32,58,56,+51,50,32,40,85,32,40,40,40,67,39,32,66,41,32,40,40,66,32,95,+52,54,51,41,32,95,56,50,57,41,41,32,95,56,50,55,41,41,41,32,+40,40,65,32,58,56,51,51,32,40,40,67,32,40,40,80,32,40,40,40,+67,39,32,66,41,32,40,40,66,32,95,52,54,51,41,32,95,56,50,57,+41,41,32,95,56,51,48,41,41,32,95,56,51,48,41,41,32,40,95,51,+57,52,32,95,56,50,53,41,41,41,32,40,40,65,32,58,56,51,52,32,+40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,40,67,39,32,83,+41,41,32,40,40,40,83,39,32,40,67,39,32,67,41,41,32,40,40,40,+67,39,32,40,67,39,32,83,41,41,32,40,40,40,67,39,32,40,67,39,+32,83,41,41,32,40,40,40,67,39,32,40,67,39,32,83,41,41,32,40,+40,40,67,39,32,40,67,39,32,83,41,41,32,40,40,40,67,39,32,40,+67,39,32,83,41,41,32,40,40,40,67,39,32,40,67,39,32,83,41,41,+32,40,40,40,67,39,32,40,67,39,32,83,41,41,32,40,40,40,67,39,+32,40,67,39,32,83,41,41,32,40,40,40,67,39,32,40,67,39,32,83,+41,41,32,40,40,40,67,39,32,40,67,39,32,83,41,41,32,40,40,40,+67,39,32,40,67,39,32,83,41,41,32,40,40,40,83,39,32,40,67,39,+32,67,41,41,32,40,40,40,67,39,32,40,67,39,32,83,41,41,32,40,+40,40,67,39,32,67,41,32,40,40,40,67,39,32,40,67,39,32,83,39,+41,41,32,40,40,66,32,85,41,32,40,40,66,32,40,66,32,95,55,52,+51,41,41,32,95,57,48,49,41,41,41,32,40,90,32,75,41,41,41,32,+40,90,32,75,41,41,41,32,75,41,41,32,40,90,32,95,55,52,55,41,+41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,75,+41,41,32,75,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,+41,41,32,40,90,32,75,41,41,41,32,40,90,32,40,90,32,75,41,41,+41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,75,+41,41,32,40,40,66,32,40,66,32,95,55,53,57,41,41,32,95,56,51,+53,41,41,41,32,40,90,32,75,41,41,41,32,40,95,50,52,32,34,115,+101,116,83,76,111,99,69,120,112,114,34,41,41,41,32,40,40,65,32,58,+56,51,53,32,40,40,40,67,39,32,83,41,32,40,40,40,83,39,32,80,+41,32,40,40,66,32,40,40,67,39,32,66,41,32,95,55,54,51,41,41,+32,95,57,48,49,41,41,32,40,40,66,32,40,66,32,95,55,54,52,41,+41,32,95,57,48,49,41,41,41,32,40,90,32,75,41,41,41,32,40,40,+65,32,58,56,51,54,32,40,40,66,32,40,66,32,40,95,50,54,49,32,+95,50,52,41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,+95,52,54,51,41,32,95,57,49,54,41,41,32,40,95,52,54,51,32,34,+58,32,34,41,41,41,41,32,40,40,65,32,58,56,51,55,32,40,40,40,+95,49,53,56,56,32,40,95,49,53,57,50,32,95,56,51,55,41,41,32,+95,56,51,56,41,32,40,95,49,53,57,52,32,95,56,51,55,41,41,41,+32,40,40,65,32,58,56,51,56,32,40,40,95,50,54,51,32,95,49,53,+56,48,41,32,95,56,53,55,41,41,32,40,40,65,32,58,56,51,57,32,+40,40,95,50,54,51,32,95,49,53,56,48,41,32,95,56,53,50,41,41,+32,40,40,65,32,58,56,52,48,32,40,40,95,50,54,51,32,95,49,53,+56,48,41,32,95,56,54,52,41,41,32,40,40,65,32,58,56,52,49,32,+40,40,95,50,54,51,32,95,49,53,56,48,41,32,40,40,95,50,54,51,+32,95,49,53,52,48,41,32,40,95,51,57,53,32,95,56,54,52,41,41,+41,41,32,40,40,65,32,58,56,52,50,32,40,40,95,50,54,51,32,95,+49,53,56,48,41,32,95,56,54,55,41,41,32,40,40,65,32,58,56,52,+51,32,40,40,67,32,40,40,80,32,40,40,40,67,39,32,95,49,53,54,+53,41,32,95,57,48,51,41,32,40,95,49,53,51,53,32,34,40,46,46,+41,34,41,41,41,32,95,57,48,51,41,41,32,95,57,48,51,41,41,32,+40,40,65,32,58,56,52,52,32,40,40,67,32,40,40,67,32,40,40,67,+32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,+32,40,40,67,32,40,40,80,32,40,40,40,83,39,32,83,41,32,40,40,+66,32,85,41,32,40,40,66,32,40,95,49,53,54,54,32,40,95,49,53,+51,53,32,34,100,97,116,97,34,41,41,41,32,95,56,53,48,41,41,41,+32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,40,67,39,+32,66,41,32,40,40,66,32,95,49,53,54,54,41,32,40,40,40,67,39,+32,95,49,53,54,54,41,32,40,40,66,32,40,95,49,53,54,54,32,40,+95,49,53,51,53,32,34,100,97,116,97,34,41,41,41,32,95,56,53,48,+41,41,32,40,95,49,53,51,53,32,40,40,79,32,35,54,49,41,32,75,+41,41,41,41,41,32,40,40,66,32,95,49,53,51,57,41,32,40,40,66,+32,40,95,49,53,52,51,32,40,95,49,53,51,53,32,34,32,124,34,41,+41,41,32,40,95,51,57,53,32,95,56,52,56,41,41,41,41,41,41,41,+41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,95,49,53,54,54,+41,32,40,40,40,67,39,32,95,49,53,54,54,41,32,40,40,66,32,40,+95,49,53,54,54,32,40,95,49,53,51,53,32,34,110,101,119,116,121,112,+101,34,41,41,41,32,95,56,53,48,41,41,32,40,95,49,53,51,53,32,+40,40,79,32,35,54,49,41,32,75,41,41,41,41,41,32,95,56,52,56,+41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,95,49,53,+54,54,41,32,40,40,40,67,39,32,95,49,53,54,54,41,32,40,40,66,+32,40,95,49,53,54,54,32,40,95,49,53,51,53,32,34,116,121,112,101,+34,41,41,41,32,95,56,53,48,41,41,32,40,95,49,53,51,53,32,40,+40,79,32,35,54,49,41,32,75,41,41,41,41,41,32,95,56,54,55,41,+41,41,32,40,40,40,67,39,32,95,56,52,55,41,32,95,57,48,51,41,+32,40,95,49,53,51,53,32,40,40,79,32,35,54,49,41,32,75,41,41,+41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,95,49,53,+54,54,41,32,40,40,40,67,39,32,95,49,53,54,54,41,32,95,57,48,+51,41,32,40,95,49,53,51,53,32,34,58,58,34,41,41,41,41,32,95,+56,54,55,41,41,41,32,40,85,32,40,40,40,67,39,32,40,67,39,32,+40,67,39,32,66,41,41,41,32,40,40,66,32,40,66,32,40,66,32,95,+49,53,54,53,41,41,41,32,40,40,40,67,39,32,40,67,39,32,66,41,+41,32,40,40,66,32,40,66,32,95,49,53,54,53,41,41,32,40,40,40,+67,39,32,66,41,32,40,40,66,32,95,49,53,54,54,41,32,40,40,66,+32,40,95,49,53,54,54,32,40,95,49,53,51,53,32,34,105,109,112,111,+114,116,34,41,41,41,32,40,40,80,32,95,49,53,51,54,41,32,40,95,+49,53,51,53,32,34,113,117,97,108,105,102,105,101,100,34,41,41,41,41,+41,32,95,57,48,51,41,41,41,32,40,40,66,32,95,49,53,51,53,41,+32,40,40,95,52,55,48,32,75,41,32,40,40,95,50,54,51,32,40,95,+52,54,51,32,34,32,97,115,32,34,41,41,32,95,57,48,48,41,41,41,+41,41,41,32,40,40,80,32,95,49,53,51,54,41,32,40,85,32,40,40,+40,67,39,32,66,41,32,40,40,66,32,95,49,53,54,53,41,32,40,40,+66,32,95,49,53,51,53,41,32,40,40,80,32,75,41,32,34,32,104,105,+100,105,110,103,34,41,41,41,41,32,40,40,66,32,95,49,53,52,53,41,+32,40,40,66,32,40,95,50,54,49,32,95,49,53,51,57,41,41,32,40,+40,66,32,40,95,49,53,52,51,32,40,95,49,53,51,53,32,34,44,32,+34,41,41,41,32,40,95,51,57,53,32,95,56,52,51,41,41,41,41,41,+41,41,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,66,41,41,+32,40,40,66,32,40,66,32,95,49,53,54,54,41,41,32,40,40,40,67,+39,32,40,67,39,32,95,49,53,54,54,41,41,32,40,40,40,67,39,32,+66,41,32,40,40,66,32,95,49,53,54,54,41,32,40,40,66,32,95,49,+53,51,53,41,32,40,40,66,32,40,95,52,54,51,32,34,102,111,114,101,+105,103,110,32,105,109,112,111,114,116,32,99,99,97,108,108,32,34,41,41,+32,40,95,49,53,57,48,32,40,95,51,57,49,32,95,49,52,57,41,41,+41,41,41,41,32,95,57,48,51,41,41,32,40,95,49,53,51,53,32,34,+58,58,34,41,41,41,41,32,95,56,54,55,41,41,41,32,40,40,67,32,+66,41,32,40,40,66,32,40,40,67,39,32,40,67,39,32,95,49,53,54,+54,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,95,49,53,+54,54,41,32,40,40,66,32,95,49,53,51,53,41,32,40,40,66,32,40,+95,52,54,51,32,34,105,110,102,105,120,34,41,41,32,40,40,67,32,40,+40,80,32,40,40,79,32,35,49,48,56,41,32,75,41,41,32,40,40,79,+32,35,49,49,52,41,32,75,41,41,41,32,75,41,41,41,41,41,32,40,+40,66,32,95,49,53,51,53,41,32,40,95,49,53,57,48,32,95,50,56,+51,41,41,41,41,41,32,40,40,66,32,95,49,53,51,57,41,32,40,40,+66,32,40,95,49,53,52,51,32,40,95,49,53,51,53,32,34,44,32,34,+41,41,41,32,40,95,51,57,53,32,95,57,48,51,41,41,41,41,41,41,+41,32,40,40,66,32,40,66,32,40,66,32,95,56,53,52,41,41,41,32,+40,40,40,67,39,32,40,67,39,32,66,41,41,32,40,40,66,32,40,66,+32,95,49,53,54,54,41,41,32,40,40,40,67,39,32,66,41,32,40,40,+66,32,95,49,53,54,54,41,32,40,40,66,32,40,95,49,53,54,54,32,+40,95,49,53,51,53,32,34,99,108,97,115,115,34,41,41,41,32,95,56,+52,53,41,41,41,32,95,56,53,48,41,41,41,32,95,56,52,54,41,41,+41,41,32,40,40,66,32,40,66,32,40,66,32,95,56,53,52,41,41,41,+32,40,40,40,67,39,32,40,67,39,32,66,41,41,32,40,40,66,32,40,+66,32,95,49,53,54,54,41,41,32,40,40,40,67,39,32,66,41,32,40,+40,66,32,95,49,53,54,54,41,32,40,40,66,32,40,95,49,53,54,54,+32,40,95,49,53,51,53,32,34,105,110,115,116,97,110,99,101,34,41,41,+41,32,95,56,53,57,41,41,41,32,95,56,52,53,41,41,41,32,95,56,+54,55,41,41,41,41,32,40,40,66,32,40,95,49,53,54,54,32,40,95,+49,53,51,53,32,34,100,101,102,97,117,108,116,34,41,41,41,32,40,40,+66,32,95,49,53,52,53,41,32,40,40,66,32,95,49,53,51,57,41,32,+40,40,66,32,40,95,49,53,52,51,32,40,95,49,53,51,53,32,34,44,+32,34,41,41,41,32,40,95,51,57,53,32,95,56,54,55,41,41,41,41,+41,41,41,32,40,40,65,32,58,56,52,53,32,40,40,83,32,40,85,32,+95,49,53,51,54,41,41,32,40,90,32,40,90,32,40,40,40,67,39,32,+95,49,53,54,54,41,32,40,40,66,32,95,56,54,55,41,32,95,55,53,+48,41,41,32,40,95,49,53,51,53,32,34,61,62,34,41,41,41,41,41,+41,32,40,40,65,32,58,56,52,54,32,40,40,83,32,40,85,32,95,49,+53,51,54,41,41,32,40,90,32,40,90,32,40,40,66,32,40,95,49,53,+54,54,32,40,95,49,53,51,53,32,40,40,79,32,35,49,50,52,41,32,+75,41,41,41,41,32,40,40,66,32,95,49,53,51,57,41,32,40,40,66,+32,40,95,49,53,52,51,32,40,95,49,53,51,53,32,40,40,79,32,35,+52,52,41,32,75,41,41,41,41,32,40,95,51,57,53,32,40,85,32,40,+40,40,67,39,32,66,41,32,40,40,66,32,95,49,53,54,54,41,32,40,+40,40,67,39,32,95,49,53,54,54,41,32,40,40,66,32,95,49,53,51,+57,41,32,40,95,51,57,53,32,95,57,48,51,41,41,41,32,40,95,49,+53,51,53,32,40,40,79,32,35,52,53,41,32,75,41,41,41,41,41,32,+40,40,66,32,95,49,53,51,57,41,32,40,95,51,57,53,32,95,57,48,+51,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,65,32,58,56,+52,55,32,40,40,66,32,40,66,32,40,95,50,54,51,32,95,49,53,52,+48,41,41,41,32,40,40,66,32,40,66,32,95,51,57,53,41,41,32,40,+40,66,32,40,66,32,85,41,41,32,40,40,66,32,40,66,32,40,66,32,+40,66,32,95,49,53,55,48,41,41,41,41,32,40,40,40,67,39,32,66,+41,32,40,40,66,32,40,67,39,32,66,41,41,32,40,40,66,32,40,66,+32,79,41,41,32,40,40,40,67,39,32,66,41,32,95,49,53,54,54,41,+32,40,40,66,32,95,49,53,51,57,41,32,40,95,51,57,53,32,95,56,+54,54,41,41,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,79,+41,41,32,95,56,53,51,41,32,75,41,41,41,41,41,41,41,32,40,40,+65,32,58,56,52,56,32,40,85,32,40,40,40,67,39,32,40,67,39,32,+40,67,39,32,66,41,41,41,32,40,40,66,32,40,66,32,40,66,32,95,+49,53,54,54,41,41,41,32,40,40,40,67,39,32,40,67,39,32,66,41,+41,32,40,40,66,32,40,66,32,95,49,53,54,54,41,41,32,40,40,40,+67,39,32,66,41,32,40,40,66,32,95,49,53,54,54,41,32,95,56,53,+57,41,41,32,95,56,52,53,41,41,41,32,95,57,48,51,41,41,41,32,+40,40,80,32,40,40,66,32,95,49,53,51,57,41,32,40,95,51,57,53,+32,95,56,52,57,41,41,41,32,40,40,66,32,95,49,53,52,54,41,32,+40,40,66,32,40,95,50,54,49,32,95,49,53,51,57,41,41,32,40,95,+51,57,53,32,40,85,32,40,40,40,67,39,32,40,67,39,32,95,49,53,+54,53,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,95,49,+53,54,54,41,32,40,40,40,67,39,32,95,49,53,54,54,41,32,95,57,+48,51,41,32,40,95,49,53,51,53,32,34,58,58,34,41,41,41,41,32,+95,56,52,57,41,41,32,40,95,49,53,51,53,32,40,40,79,32,35,52,+52,41,32,75,41,41,41,41,41,41,41,41,41,41,41,32,40,40,65,32,+58,56,52,57,32,40,85,32,40,40,67,32,40,40,67,32,83,39,41,32,+95,56,54,55,41,41,32,40,40,66,32,40,95,49,53,54,53,32,40,95,+49,53,51,53,32,40,40,79,32,35,51,51,41,32,75,41,41,41,41,32,+95,56,54,55,41,41,41,41,32,40,40,65,32,58,56,53,48,32,40,85,+32,40,40,66,32,40,66,32,95,49,53,51,57,41,41,32,40,40,40,67,+39,32,66,41,32,40,40,66,32,95,52,54,50,41,32,95,57,48,51,41,+41,32,40,95,51,57,53,32,95,56,53,49,41,41,41,41,41,32,40,40,+65,32,58,56,53,49,32,40,85,32,40,40,66,32,40,66,32,40,95,50,+54,49,32,95,49,53,52,53,41,41,41,32,40,40,40,67,39,32,66,41,+32,40,40,66,32,95,49,53,54,53,41,32,40,40,40,67,39,32,95,49,+53,54,53,41,32,95,57,48,51,41,32,40,95,49,53,51,53,32,34,58,+58,34,41,41,41,41,32,95,56,54,56,41,41,41,41,32,40,40,65,32,+58,56,53,50,32,40,40,66,32,95,49,53,52,48,41,32,40,95,51,57,+53,32,40,40,83,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,+32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,+41,32,40,40,40,67,39,32,83,41,32,40,40,40,83,39,32,67,41,32,+40,40,40,83,39,32,67,41,32,40,40,40,67,39,32,83,41,32,40,40,+40,67,39,32,83,41,32,40,40,67,32,40,40,67,32,83,39,41,32,40,+90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,+41,41,32,40,90,32,75,41,41,41,32,40,90,32,40,90,32,95,56,52,+52,41,41,41,41,32,40,90,32,95,56,52,52,41,41,41,32,40,90,32,+40,90,32,75,41,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,+40,90,32,40,90,32,75,41,41,41,41,41,32,40,90,32,40,90,32,40,+90,32,75,41,41,41,41,41,32,75,41,41,32,40,40,40,67,39,32,95,+49,53,54,48,41,32,95,56,52,52,41,32,40,95,49,53,51,53,32,75,+41,41,41,41,41,41,32,40,40,65,32,58,56,53,51,32,40,40,66,32,+85,41,32,40,40,66,32,40,66,32,95,56,53,52,41,41,32,95,56,53,+53,41,41,41,32,40,40,65,32,58,56,53,52,32,40,40,40,83,39,32,+83,41,32,85,41,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,+40,40,40,67,39,32,66,41,32,40,40,66,32,95,49,53,54,48,41,32,+40,40,67,32,95,49,53,54,54,41,32,40,95,49,53,51,53,32,34,119,+104,101,114,101,34,41,41,41,41,32,40,40,66,32,40,95,49,53,52,49,+32,35,50,41,41,32,40,40,66,32,95,49,53,52,48,41,32,40,95,51,+57,53,32,95,56,54,52,41,41,41,41,41,41,41,41,32,40,40,65,32,+58,56,53,53,32,40,40,40,83,39,32,83,41,32,40,40,66,32,40,67,+32,83,41,41,32,40,40,66,32,40,66,32,40,67,32,66,41,41,41,32,+40,40,40,67,39,32,40,83,39,32,40,67,39,32,67,41,41,41,32,40,+40,66,32,40,66,32,40,66,32,40,67,32,67,39,41,41,41,41,32,40,+40,40,67,39,32,66,41,32,40,40,66,32,67,41,32,40,40,66,32,40,+67,32,67,39,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,+95,49,53,54,54,41,32,40,95,49,53,54,54,32,40,95,49,53,51,53,+32,75,41,41,41,41,32,95,56,53,55,41,41,41,41,32,40,90,32,75,+41,41,41,41,32,40,90,32,75,41,41,41,41,41,32,40,40,66,32,40,+66,32,95,49,53,52,48,41,41,32,40,40,66,32,95,51,57,53,41,32,+95,56,53,54,41,41,41,41,32,40,40,65,32,58,56,53,54,32,40,40,+66,32,85,41,32,40,40,40,67,39,32,40,67,39,32,66,41,41,32,40,+40,66,32,40,66,32,95,49,53,54,54,41,41,32,40,40,67,39,32,95,+49,53,54,54,41,32,40,40,66,32,40,95,49,53,54,54,32,40,95,49,+53,51,53,32,34,32,124,34,41,41,41,32,40,40,66,32,95,49,53,51,+57,41,32,40,40,66,32,40,95,49,53,52,51,32,40,95,49,53,51,53,+32,40,40,79,32,35,52,52,41,32,75,41,41,41,41,32,40,95,51,57,+53,32,95,56,54,51,41,41,41,41,41,41,41,32,95,56,53,55,41,41,+41,32,40,40,65,32,58,56,53,55,32,40,40,67,32,40,40,67,32,40,+40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,+40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,+40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,83,32,40,+85,32,40,40,66,32,40,40,83,32,40,40,40,83,39,32,95,57,49,49,+41,32,95,52,50,56,41,32,95,49,53,51,53,41,41,32,40,40,66,32,+95,49,53,52,53,41,32,95,49,53,51,53,41,41,41,32,40,40,66,32,+95,57,48,48,41,32,95,57,48,57,41,41,41,41,32,40,90,32,40,90,+32,40,95,56,53,56,32,95,52,54,49,41,41,41,41,41,32,40,40,66,+32,40,66,32,95,56,53,55,41,41,32,40,95,51,57,57,32,40,40,66,+32,85,41,32,40,40,66,32,40,66,32,95,55,52,52,41,41,32,40,40,+67,39,32,95,55,52,52,41,32,95,55,52,51,41,41,41,41,41,41,41,+32,40,40,66,32,40,95,50,54,49,32,95,49,53,52,53,41,41,32,40,+40,66,32,40,95,49,53,54,53,32,40,95,49,53,51,53,32,40,40,79,+32,35,57,50,41,32,75,41,41,41,41,32,40,40,95,56,52,55,32,95,+49,53,51,54,41,32,40,95,49,53,51,53,32,34,45,62,34,41,41,41,+41,41,41,32,40,75,32,40,40,66,32,95,49,53,51,53,41,32,95,56,+54,50,41,41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,+95,49,53,53,57,41,32,40,40,40,67,39,32,95,49,53,54,54,41,32,+40,40,66,32,40,95,49,53,54,54,32,40,95,49,53,51,53,32,34,99,+97,115,101,34,41,41,41,32,95,56,53,55,41,41,32,40,95,49,53,51,+53,32,34,111,102,34,41,41,41,41,32,40,40,66,32,40,95,49,53,52,+49,32,35,50,41,41,32,40,40,66,32,95,49,53,52,48,41,32,40,95,+51,57,53,32,95,56,54,53,41,41,41,41,41,41,32,40,40,40,67,39,+32,66,41,32,40,40,66,32,95,49,53,53,57,41,32,40,40,66,32,40,+95,49,53,53,57,32,40,95,49,53,51,53,32,34,108,101,116,34,41,41,+41,32,40,40,66,32,40,95,49,53,52,49,32,35,50,41,41,32,40,40,+66,32,95,49,53,52,48,41,32,40,95,51,57,53,32,95,56,54,52,41,+41,41,41,41,41,32,40,40,66,32,40,95,49,53,54,54,32,40,95,49,+53,51,53,32,34,105,110,34,41,41,41,32,95,56,53,55,41,41,41,41,+32,40,40,66,32,40,95,50,54,49,32,95,49,53,52,53,41,41,32,40,+40,66,32,40,95,50,54,49,32,95,49,53,51,57,41,41,32,40,40,66,+32,40,95,49,53,52,51,32,40,95,49,53,51,53,32,40,40,79,32,35,+52,52,41,32,75,41,41,41,41,32,40,95,51,57,53,32,95,56,53,55,+41,41,41,41,41,41,32,40,40,83,32,40,40,40,67,39,32,83,41,32,+40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,+67,32,40,40,40,67,39,32,83,39,41,32,40,85,32,40,95,56,54,57,+32,95,56,53,55,41,41,41,32,40,90,32,75,41,41,41,32,75,41,41,+32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,+40,90,32,75,41,41,41,41,32,95,56,54,48,41,41,41,32,40,40,40,+67,39,32,66,41,32,40,40,66,32,95,49,53,53,57,41,32,40,40,95,+52,55,48,32,40,95,49,53,51,53,32,34,100,111,34,41,41,32,40,40,+40,67,39,32,95,49,53,54,53,41,32,95,57,48,51,41,32,40,95,49,+53,51,53,32,34,46,100,111,34,41,41,41,41,41,32,40,40,66,32,40,+95,49,53,52,49,32,35,50,41,41,32,40,40,66,32,95,49,53,52,48,+41,32,40,95,51,57,53,32,95,56,54,51,41,41,41,41,41,41,32,40,+40,66,32,40,66,32,40,95,50,54,49,32,95,49,53,52,53,41,41,41,+32,40,40,40,67,39,32,66,41,32,40,40,66,32,95,49,53,54,54,41,+32,95,56,53,55,41,41,32,95,57,48,51,41,41,41,41,32,40,40,66,+32,40,66,32,40,95,50,54,49,32,95,49,53,52,53,41,41,41,32,40,+40,40,67,39,32,66,41,32,40,40,66,32,95,49,53,54,54,41,32,95,+57,48,51,41,41,32,95,56,53,55,41,41,41,41,32,40,40,66,32,40,+66,32,40,66,32,40,95,50,54,49,32,95,49,53,52,53,41,41,41,41,+32,40,40,66,32,40,66,32,40,66,32,95,49,53,55,48,41,41,41,32,+40,40,40,67,39,32,66,41,32,40,66,39,32,40,40,66,32,79,41,32,+40,40,66,32,40,95,49,53,54,54,32,40,95,49,53,51,53,32,34,105,+102,34,41,41,41,32,95,56,53,55,41,41,41,41,32,40,40,40,67,39,+32,66,41,32,40,40,66,32,79,41,32,40,40,66,32,40,95,49,53,54,+54,32,40,95,49,53,51,53,32,34,116,104,101,110,34,41,41,41,32,95,+56,53,55,41,41,41,32,40,40,40,67,39,32,79,41,32,40,40,66,32,+40,95,49,53,54,54,32,40,95,49,53,51,53,32,34,101,108,115,101,34,+41,41,41,32,95,56,53,55,41,41,32,75,41,41,41,41,41,41,41,32,+40,40,40,67,39,32,66,41,32,40,40,66,32,95,49,53,54,54,41,32,+40,40,40,67,39,32,95,49,53,54,54,41,32,95,56,53,55,41,32,40,+95,49,53,51,53,32,34,58,58,34,41,41,41,41,32,95,56,54,55,41,+41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,95,49,53,54,+53,41,32,40,40,40,67,39,32,95,49,53,54,53,41,32,95,57,48,51,+41,32,40,95,49,53,51,53,32,40,40,79,32,35,54,52,41,32,75,41,+41,41,41,41,32,95,56,53,55,41,41,41,32,40,40,66,32,95,49,53,+51,53,41,32,40,40,66,32,40,95,52,54,51,32,40,40,79,32,35,57,+55,41,32,75,41,41,41,32,40,95,49,53,57,48,32,95,50,56,51,41,+41,41,41,41,32,95,56,54,49,41,41,32,40,40,40,67,39,32,66,41,+32,40,40,66,32,95,49,53,54,54,41,32,95,56,53,57,41,41,32,95,+56,54,55,41,41,41,32,40,40,65,32,58,56,53,56,32,40,40,40,83,+39,32,83,41,32,40,40,40,67,39,32,40,67,39,32,83,41,41,32,40,+40,40,67,39,32,40,67,39,32,83,41,41,32,40,40,40,67,39,32,40,+67,39,32,83,41,41,32,40,40,40,67,39,32,40,67,39,32,83,41,41,+32,40,40,40,67,39,32,40,67,39,32,83,41,41,32,40,40,40,67,39,+32,40,67,39,32,83,41,41,32,40,40,40,67,39,32,40,67,39,32,83,+41,41,32,40,40,40,67,39,32,40,67,39,32,83,41,41,32,40,40,40,+67,39,32,40,67,39,32,83,41,41,32,40,40,40,67,39,32,40,67,39,+32,83,41,41,32,40,40,40,67,39,32,40,67,39,32,83,41,41,32,40,+40,40,67,39,32,40,67,39,32,83,41,41,32,40,40,40,67,39,32,40,+67,39,32,83,41,41,32,40,40,40,67,39,32,40,67,39,32,83,41,41,+32,40,40,40,67,39,32,40,67,39,32,83,41,41,32,40,40,40,67,39,+32,40,67,39,32,83,41,41,32,40,40,40,83,39,32,67,41,32,40,40,+66,32,40,67,32,67,39,41,41,32,40,40,40,67,39,32,40,67,39,32,+66,41,41,32,40,40,40,67,39,32,40,67,39,32,83,41,41,32,40,40,+40,83,39,32,66,41,32,40,40,66,32,40,83,39,32,83,41,41,32,40,+40,66,32,40,66,32,40,40,67,39,32,83,41,32,95,57,49,49,41,41,+41,32,40,40,40,67,39,32,66,41,32,83,41,32,40,40,66,32,40,40,+83,39,32,66,41,32,80,41,41,32,40,40,40,67,39,32,66,41,32,40,+40,66,32,40,67,39,32,40,67,39,32,80,41,41,41,32,40,40,66,32,+40,66,32,40,66,32,40,95,50,54,49,32,95,49,53,52,53,41,41,41,+41,32,40,40,40,67,39,32,40,67,39,32,66,41,41,32,40,40,66,32,+40,66,32,95,49,53,54,54,41,41,32,40,40,66,32,40,40,67,39,32,+95,49,53,54,54,41,32,95,56,53,55,41,41,32,95,49,53,51,53,41,+41,41,32,95,56,53,55,41,41,41,41,32,40,90,32,75,41,41,41,41,+41,41,41,32,40,40,40,83,39,32,66,41,32,40,40,66,32,40,83,39,+32,83,41,41,32,40,40,66,32,40,66,32,40,40,67,39,32,83,41,32,+95,57,49,49,41,41,41,32,40,40,40,67,39,32,66,41,32,83,41,32,+40,40,40,67,39,32,66,41,32,40,40,66,32,40,67,39,32,80,41,41,+32,40,40,66,32,40,66,32,40,95,50,54,49,32,95,49,53,52,53,41,+41,41,32,40,40,66,32,40,40,67,39,32,95,49,53,54,54,41,32,95,+56,53,55,41,41,32,95,49,53,51,53,41,41,41,41,32,40,90,32,75,+41,41,41,41,41,41,32,40,40,40,83,39,32,40,67,39,32,40,67,39,+32,67,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,67,32,40,+40,67,32,40,95,50,48,50,32,95,49,51,49,41,41,32,35,52,52,41,+41,41,41,41,32,40,40,66,32,67,41,32,40,40,66,32,40,40,67,39,+32,83,41,32,40,40,67,32,40,95,50,48,50,32,95,49,51,51,41,41,+32,34,91,93,34,41,41,41,32,40,40,40,83,39,32,67,41,32,40,40,+40,67,39,32,40,95,50,48,50,32,95,50,56,49,41,41,32,95,52,49,+49,41,32,35,49,41,41,32,40,40,66,32,95,56,53,55,41,32,40,40,+66,32,95,55,53,49,41,32,95,55,54,54,41,41,41,41,41,41,41,32,+40,40,66,32,95,56,53,55,41,32,95,55,53,48,41,41,41,41,41,32,+95,52,50,56,41,41,32,40,40,66,32,95,57,48,48,41,32,95,57,48,+57,41,41,41,41,32,40,40,66,32,40,67,39,32,95,56,53,56,41,41,+32,40,67,32,95,52,54,50,41,41,41,41,32,40,90,32,75,41,41,41,+32,75,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,+32,40,90,32,75,41,41,41,32,75,41,41,32,75,41,41,32,40,90,32,+75,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,+32,40,90,32,40,90,32,75,41,41,41,41,32,40,90,32,75,41,41,41,+32,40,90,32,75,41,41,41,32,75,41,41,32,75,41,41,32,40,90,32,+75,41,41,41,32,40,40,66,32,40,66,32,40,95,50,54,49,32,95,49,+53,52,53,41,41,41,32,40,40,66,32,40,66,32,95,49,53,51,57,41,+41,32,40,40,66,32,40,66,32,40,95,51,57,53,32,95,56,53,55,41,+41,41,32,40,67,32,95,52,54,50,41,41,41,41,41,41,32,40,40,65,+32,58,56,53,57,32,40,40,40,67,39,32,95,49,53,54,54,41,32,40,+40,66,32,40,95,49,53,54,54,32,40,95,49,53,51,53,32,34,102,111,+114,97,108,108,34,41,41,41,32,40,40,66,32,95,49,53,51,57,41,32,+40,95,51,57,53,32,95,56,53,49,41,41,41,41,32,40,95,49,53,51,+53,32,40,40,79,32,35,52,54,41,32,75,41,41,41,41,32,40,40,65,+32,58,56,54,48,32,40,75,32,40,95,49,53,51,53,32,34,60,60,76,+105,115,116,105,115,104,62,62,34,41,41,41,32,40,40,65,32,58,56,54,+49,32,40,40,67,32,40,40,80,32,40,75,32,95,57,48,51,41,41,32,+95,57,48,51,41,41,32,40,75,32,40,40,66,32,95,49,53,51,53,41,+32,95,56,54,50,41,41,41,41,32,40,40,65,32,58,56,54,50,32,40,+40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,+40,67,32,40,40,80,32,40,40,66,32,40,95,52,54,50,32,35,51,53,+41,41,32,40,95,49,53,57,48,32,95,50,56,51,41,41,41,32,40,40,+66,32,40,95,52,54,50,32,35,51,53,41,41,32,40,40,66,32,40,95,+52,54,50,32,35,51,53,41,41,32,40,95,49,53,57,48,32,95,51,48,+55,41,41,41,41,41,32,40,40,66,32,40,95,52,54,50,32,35,51,56,+41,41,32,40,95,49,53,57,48,32,95,49,53,53,41,41,41,41,32,40,+40,66,32,40,95,52,54,50,32,35,51,55,41,41,32,40,95,49,53,57,+48,32,40,95,53,50,49,32,95,51,48,55,41,41,41,41,41,32,40,95,+49,53,57,48,32,95,49,52,57,41,41,41,32,40,95,49,53,57,48,32,+40,95,51,57,49,32,95,49,52,57,41,41,41,41,32,73,41,41,32,40,+95,52,54,50,32,35,57,52,41,41,41,32,40,40,65,32,58,56,54,51,+32,40,40,67,32,40,40,80,32,40,40,40,67,39,32,66,41,32,40,40,+66,32,95,49,53,54,54,41,32,40,40,40,67,39,32,95,49,53,54,54,+41,32,95,56,54,54,41,32,40,95,49,53,51,53,32,34,60,45,34,41,+41,41,41,32,95,56,53,55,41,41,32,95,56,53,55,41,41,32,40,40,+66,32,40,95,49,53,53,57,32,40,95,49,53,51,53,32,34,108,101,116,+34,41,41,41,32,40,40,66,32,40,95,49,53,52,49,32,35,50,41,41,+32,40,40,66,32,95,49,53,52,48,41,32,40,95,51,57,53,32,95,56,+54,52,41,41,41,41,41,41,32,40,40,65,32,58,56,54,52,32,40,40,+67,32,40,40,80,32,40,40,66,32,40,66,32,95,56,52,52,41,41,32,+95,55,51,49,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,+95,49,53,54,54,41,32,40,40,40,67,39,32,95,49,53,54,54,41,32,+95,56,54,54,41,32,40,95,49,53,51,53,32,40,40,79,32,35,54,49,+41,32,75,41,41,41,41,41,32,95,56,53,55,41,41,41,32,40,40,40,+67,39,32,66,41,32,40,40,66,32,95,49,53,54,54,41,32,40,40,40,+67,39,32,95,49,53,54,54,41,32,95,57,48,51,41,32,40,95,49,53,+51,53,32,34,58,58,34,41,41,41,41,32,95,56,54,55,41,41,41,32,+40,40,65,32,58,56,54,53,32,40,85,32,40,40,40,67,39,32,66,41,+32,40,40,66,32,95,49,53,54,53,41,32,95,56,54,54,41,41,32,40,+95,56,53,51,32,40,95,49,53,51,53,32,34,45,62,34,41,41,41,41,+41,32,40,40,65,32,58,56,54,54,32,95,56,53,55,41,32,40,40,65,+32,58,56,54,55,32,95,56,53,55,41,32,40,40,65,32,58,56,54,56,+32,95,56,54,55,41,32,40,40,65,32,58,56,54,57,32,40,40,66,32,+40,66,32,40,95,50,54,49,32,95,49,53,52,55,41,41,41,32,40,40,+66,32,40,66,32,40,95,50,54,49,32,95,49,53,51,57,41,41,41,32,+40,40,66,32,40,66,32,40,95,49,53,52,51,32,40,95,49,53,51,53,+32,40,40,79,32,35,52,52,41,32,75,41,41,41,41,41,32,95,51,57,+53,41,41,41,41,32,40,40,65,32,58,56,55,48,32,40,40,67,32,40,+40,80,32,40,90,32,40,40,67,32,79,41,32,75,41,41,41,32,40,90,+32,95,55,57,52,41,41,41,32,40,75,32,40,75,32,95,52,54,49,41,+41,41,41,32,40,40,65,32,58,56,55,49,32,40,95,51,57,52,32,95,+56,55,48,41,41,32,40,40,65,32,58,56,55,50,32,80,41,32,40,40,+65,32,58,56,55,51,32,40,40,66,32,90,41,32,85,41,41,32,40,40,+65,32,58,56,55,52,32,40,90,32,85,41,41,32,40,40,65,32,58,56,+55,53,32,40,40,66,32,40,66,32,40,95,51,57,53,32,40,40,80,32,+40,85,32,40,90,32,40,90,32,95,56,55,51,41,41,41,41,32,40,40,+66,32,95,56,55,52,41,32,40,95,51,57,52,32,40,85,32,40,90,32,+40,90,32,40,40,67,32,79,41,32,75,41,41,41,41,41,41,41,41,41,+41,32,95,56,55,54,41,41,32,40,40,65,32,58,56,55,54,32,40,40,+66,32,40,83,32,40,85,32,95,52,54,49,41,41,41,32,40,40,66,32,+90,41,32,40,40,66,32,90,41,32,40,40,66,32,40,66,32,40,40,40,+83,39,32,40,67,32,40,40,40,67,39,32,40,83,39,32,95,51,57,53,+41,41,32,40,40,66,32,40,66,32,40,83,32,73,41,41,41,32,40,40,+40,83,39,32,40,67,39,32,66,41,41,32,40,40,66,32,40,66,32,40,+67,39,32,80,41,41,41,32,40,40,40,83,39,32,40,67,39,32,83,41,+41,32,40,40,66,32,40,40,67,39,32,83,41,32,40,40,66,32,40,83,+32,40,95,52,51,52,32,40,95,50,48,50,32,95,50,56,49,41,41,41,+41,32,95,50,57,55,41,41,41,32,40,66,32,95,56,55,51,41,41,41,+32,40,40,66,32,40,66,32,95,56,55,52,41,41,32,40,40,67,32,40,+67,39,32,79,41,41,32,75,41,41,41,41,41,32,40,40,66,32,90,41,+32,40,40,66,32,90,41,32,40,40,66,32,40,66,32,95,56,55,52,41,+41,32,40,40,40,67,39,32,67,41,32,40,40,66,32,89,41,32,40,40,+66,32,40,66,32,40,67,32,66,41,41,41,32,40,40,40,67,39,32,66,+41,32,40,66,39,32,40,40,66,32,40,67,39,32,66,41,41,32,40,66,+32,95,52,54,50,41,41,41,41,32,95,51,57,55,41,41,41,41,32,95,+52,54,49,41,41,41,41,41,41,41,32,95,56,56,56,41,41,41,32,40,+85,32,75,41,41,32,40,85,32,65,41,41,41,41,32,95,56,56,50,41,+41,41,41,41,32,40,40,65,32,58,56,55,55,32,95,50,57,54,41,32,+40,40,65,32,58,56,55,56,32,40,40,40,83,39,32,95,51,57,52,41,+32,40,40,66,32,40,40,83,39,32,95,51,57,52,41,32,40,40,40,67,+39,32,40,67,39,32,79,41,41,32,80,41,32,75,41,41,41,32,95,50,+57,55,41,41,32,95,56,55,55,41,41,32,40,40,65,32,58,56,55,57,+32,40,40,66,32,40,95,51,57,55,32,40,85,32,40,40,40,67,39,32,+66,41,32,40,95,50,57,56,32,95,52,54,51,41,41,32,40,40,67,32,+79,41,32,75,41,41,41,41,41,32,40,40,66,32,95,50,57,51,41,32,+40,40,67,32,95,52,49,50,41,32,40,95,52,52,55,32,95,52,54,49,+41,41,41,41,41,32,40,40,65,32,58,56,56,48,32,40,40,40,83,39,+32,95,56,55,57,41,32,95,56,55,55,41,32,95,56,56,49,41,41,32,+40,40,65,32,58,56,56,49,32,40,40,66,32,40,95,51,57,52,32,40,+85,32,40,40,40,67,39,32,40,67,39,32,79,41,41,32,40,67,32,80,+41,41,32,75,41,41,41,41,32,95,56,55,56,41,41,32,40,40,65,32,+58,56,56,50,32,40,40,40,83,39,32,83,41,32,40,40,40,67,39,32,+40,67,39,32,40,83,39,32,80,41,41,41,32,40,40,66,32,40,66,32,+40,66,32,95,50,57,51,41,41,41,32,40,40,40,67,39,32,40,67,39,+32,40,83,39,32,95,51,57,52,41,41,41,32,40,40,66,32,40,66,32,+40,66,32,85,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,+32,85,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,90,41,41,+41,32,40,40,66,32,40,66,32,40,66,32,90,41,41,41,32,40,40,40,+67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,79,+41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,40,67,39,+32,66,41,32,80,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,+95,52,55,52,41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,+32,40,67,39,32,67,41,41,32,40,40,40,67,39,32,40,67,39,32,40,+67,39,32,89,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,+39,32,40,67,39,32,40,67,39,32,67,41,41,41,41,41,32,40,40,66,+32,40,66,32,40,66,32,40,66,32,40,40,83,39,32,83,41,32,40,95,+52,57,57,32,95,50,56,50,41,41,41,41,41,41,32,40,40,40,67,39,+32,40,67,39,32,40,67,39,32,40,67,39,32,40,83,39,32,83,41,41,+41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,40,67,39,+32,40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,41,41,32,+40,40,40,83,39,32,40,83,39,32,40,83,39,32,66,41,41,41,32,40,+40,66,32,40,66,32,40,66,32,40,67,39,32,40,83,39,32,83,41,41,+41,41,41,32,40,40,40,67,39,32,40,67,39,32,66,41,41,32,40,40,+66,32,66,39,41,32,40,40,66,32,66,39,41,32,40,66,32,67,41,41,+41,41,32,40,40,67,32,67,39,41,32,40,40,67,32,40,95,52,55,57,+32,95,50,55,55,41,41,32,35,49,41,41,41,41,41,32,40,40,40,67,+39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,83,39,32,67,41,+41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,66,41,41,32,40,+40,66,32,66,39,41,32,40,40,66,32,66,39,41,32,40,40,66,32,40,+66,32,67,41,41,32,67,41,41,41,41,32,40,40,67,32,40,67,39,32,+66,41,41,32,40,40,67,32,40,95,52,56,48,32,95,50,55,55,41,41,+32,35,49,41,41,41,41,32,95,52,55,55,41,41,41,41,32,40,40,66,+32,95,50,57,55,41,32,40,40,66,32,95,50,57,51,41,32,40,95,51,+57,52,32,40,85,32,40,40,66,32,85,41,32,40,90,32,40,40,66,32,+90,41,32,40,40,40,67,39,32,40,67,39,32,79,41,41,32,80,41,32,+75,41,41,41,41,41,41,41,41,41,41,32,40,40,40,83,39,32,66,41,+32,40,95,52,55,57,32,95,50,55,55,41,41,32,40,40,40,67,39,32,+40,67,39,32,40,95,51,54,54,32,95,50,55,56,41,41,41,32,40,67,+32,40,95,52,56,48,32,95,50,55,55,41,41,41,32,40,40,95,52,56,+53,32,95,50,55,55,41,32,40,95,51,53,57,32,35,50,41,41,41,41,+41,41,41,32,95,52,55,54,41,41,32,35,48,41,41,41,32,40,40,40,+67,39,32,40,95,52,56,48,32,95,50,55,55,41,41,32,95,52,49,49,+41,32,35,49,41,41,41,41,41,32,75,41,41,41,41,41,41,32,73,41,+41,41,32,40,40,66,32,95,50,57,55,41,32,95,50,57,51,41,41,41,+32,40,40,66,32,40,66,32,40,95,52,49,50,32,40,40,95,49,56,52,+32,95,49,57,56,41,32,40,40,95,52,56,53,32,95,50,55,55,41,32,+40,95,51,53,57,32,35,48,41,41,41,41,41,41,32,40,40,66,32,95,+52,53,52,41,32,40,40,66,32,40,67,32,66,41,41,32,40,40,66,32,+90,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,67,+32,66,41,41,32,40,40,66,32,90,41,32,40,66,32,90,41,41,41,41,+41,41,41,41,41,41,32,40,40,65,32,58,56,56,51,32,40,40,83,32,+95,56,56,52,41,32,95,56,55,55,41,41,32,40,40,65,32,58,56,56,+52,32,40,40,66,32,40,66,32,40,95,50,54,49,32,95,53,54,54,41,+41,41,32,40,40,40,67,39,32,89,41,32,40,40,66,32,40,66,32,40,+40,83,39,32,80,41,32,40,40,67,32,80,41,32,95,52,54,49,41,41,+41,41,32,40,40,40,67,39,32,40,83,39,32,40,83,39,32,67,41,41,+41,32,40,40,66,32,40,66,32,40,40,83,39,32,40,83,39,32,83,39,+41,41,32,40,67,32,95,51,48,49,41,41,41,41,32,40,40,66,32,40,+40,83,39,32,66,41,32,40,40,66,32,83,41,32,40,40,66,32,40,40,+67,39,32,67,39,41,32,40,40,66,32,40,83,39,32,40,40,83,39,32,+80,41,32,40,85,32,75,41,41,41,41,32,40,40,40,67,39,32,40,67,+39,32,66,41,41,32,40,40,66,32,40,66,32,95,52,54,50,41,41,32,+40,40,40,67,39,32,66,41,32,95,56,55,50,41,32,40,85,32,65,41,+41,41,41,32,40,85,32,65,41,41,41,41,41,32,40,40,67,32,67,39,+41,32,40,85,32,75,41,41,41,41,41,41,32,40,40,66,32,40,67,32,+40,40,40,67,39,32,67,39,41,32,83,39,41,32,40,67,32,95,51,48,+50,41,41,41,41,32,95,50,57,55,41,41,41,41,32,73,41,41,41,32,+95,51,48,48,41,41,41,32,40,40,65,32,58,56,56,53,32,40,85,32,+40,40,66,32,40,40,67,39,32,95,50,54,51,41,32,95,56,56,54,41,+41,32,95,52,54,50,41,41,41,32,40,40,65,32,58,56,56,54,32,40,+40,66,32,40,95,50,54,49,32,40,40,95,51,57,55,32,95,50,54,51,+41,32,95,50,54,52,41,41,41,32,40,95,51,57,53,32,95,56,56,53,+41,41,41,32,40,40,65,32,58,56,56,55,32,40,40,40,67,39,32,95,+56,56,54,41,32,95,56,56,51,41,32,95,52,54,49,41,41,32,40,40,+65,32,58,56,56,56,32,40,40,83,32,95,56,56,52,41,32,40,40,66,+32,95,52,50,51,41,32,40,40,66,32,95,56,56,55,41,32,95,56,56,+48,41,41,41,41,32,40,40,65,32,58,56,56,57,32,40,40,40,83,39,+32,66,41,32,40,66,39,32,115,101,113,41,41,32,40,40,66,32,40,40,+83,39,32,66,41,32,115,101,113,41,41,32,40,40,66,32,40,66,32,40,+83,32,115,101,113,41,41,41,32,40,40,66,32,40,66,32,67,41,41,32,+80,41,41,41,41,41,32,40,40,65,32,58,56,57,48,32,40,40,40,95,+49,53,56,56,32,40,95,49,53,57,50,32,95,56,57,48,41,41,32,40,+85,32,40,40,40,67,39,32,66,41,32,40,66,39,32,40,40,66,32,95,+52,54,51,41,32,40,95,49,53,57,48,32,40,95,51,57,49,32,95,49,+52,57,41,41,41,41,41,32,40,40,66,32,40,66,32,40,95,52,54,51,+32,40,40,79,32,35,52,52,41,32,75,41,41,41,41,32,40,40,40,67,+39,32,66,41,32,40,40,66,32,95,52,54,51,41,32,40,95,49,53,57,+48,32,95,50,56,51,41,41,41,32,40,40,66,32,40,95,52,54,51,32,+40,40,79,32,35,53,56,41,32,75,41,41,41,32,40,95,49,53,57,48,+32,95,50,56,51,41,41,41,41,41,41,41,32,40,95,49,53,57,52,32,+95,56,57,48,41,41,41,32,40,40,65,32,58,56,57,49,32,40,40,40,+83,39,32,66,41,32,115,101,113,41,32,80,41,41,32,40,40,65,32,58,+56,57,50,32,40,40,95,50,48,49,32,40,40,67,32,66,41,32,40,90,+32,40,40,67,32,66,41,32,40,90,32,40,95,50,48,50,32,95,49,51,+51,41,41,41,41,41,41,32,40,95,50,48,53,32,95,56,57,50,41,41,+41,32,40,40,65,32,58,56,57,51,32,40,40,40,40,40,40,40,40,95,+52,57,52,32,95,56,57,50,41,32,40,40,67,32,66,41,32,40,90,32,+40,40,67,32,66,41,32,40,90,32,40,95,52,57,54,32,95,49,51,52,+41,41,41,41,41,41,32,40,40,67,32,66,41,32,40,90,32,40,40,67,+32,66,41,32,40,90,32,40,95,52,57,55,32,95,49,51,52,41,41,41,+41,41,41,32,40,40,67,32,66,41,32,40,90,32,40,40,67,32,66,41,+32,40,90,32,40,95,52,57,56,32,95,49,51,52,41,41,41,41,41,41,+32,40,40,67,32,66,41,32,40,90,32,40,40,67,32,66,41,32,40,90,+32,40,95,52,57,57,32,95,49,51,52,41,41,41,41,41,41,32,40,40,+67,32,66,41,32,40,90,32,40,40,67,32,66,41,32,40,90,32,40,95,+53,48,48,32,95,49,51,52,41,41,41,41,41,41,32,40,95,53,48,56,+32,95,56,57,51,41,41,32,40,95,53,48,57,32,95,56,57,51,41,41,+41,32,40,40,65,32,58,56,57,52,32,40,40,40,95,49,53,56,56,32,+40,95,49,53,57,50,32,95,56,57,52,41,41,32,95,57,48,50,41,32,+40,95,49,53,57,52,32,95,56,57,52,41,41,41,32,40,40,65,32,58,+56,57,53,32,40,40,40,95,56,56,57,32,75,41,32,35,48,41,32,35,+48,41,41,32,40,40,65,32,58,56,57,54,32,40,85,32,40,75,32,40,+40,40,67,39,32,66,41,32,40,40,67,32,40,40,67,32,61,61,41,32,+35,48,41,41,32,95,49,50,52,41,41,32,40,40,67,32,40,40,67,32,+40,40,67,32,61,61,41,32,35,48,41,41,32,95,49,50,52,41,41,32,+95,49,50,53,41,41,41,41,41,32,40,40,65,32,58,56,57,55,32,40,+95,56,57,49,32,95,56,57,53,41,41,32,40,40,65,32,58,56,57,56,+32,95,56,57,49,41,32,40,40,65,32,58,56,57,57,32,40,40,66,32,+40,67,32,66,41,41,32,40,40,66,32,40,67,39,32,40,67,39,32,95,+56,57,49,41,41,41,32,95,56,56,57,41,41,41,32,40,40,65,32,58,+57,48,48,32,40,85,32,65,41,41,32,40,40,65,32,58,57,48,49,32,+40,40,66,32,85,41,32,40,90,32,95,56,57,49,41,41,41,32,40,40,+65,32,58,57,48,50,32,40,85,32,65,41,41,32,40,40,65,32,58,57,+48,51,32,40,85,32,40,75,32,95,49,53,51,53,41,41,41,32,40,40,+65,32,58,57,48,52,32,40,40,66,32,85,41,32,40,90,32,40,95,50,+48,50,32,95,49,51,51,41,41,41,41,32,40,40,65,32,58,57,48,53,+32,40,40,67,32,66,41,32,40,90,32,40,40,67,32,66,41,32,40,40,+66,32,40,40,67,39,32,66,41,32,95,56,57,49,41,41,32,40,40,40,+67,39,32,66,41,32,95,52,54,51,41,32,40,95,52,54,51,32,40,40,+79,32,35,52,54,41,32,75,41,41,41,41,41,41,41,41,32,40,40,65,+32,58,57,48,54,32,73,41,32,40,40,65,32,58,57,48,55,32,40,40,+67,32,66,41,32,40,40,66,32,40,40,67,39,32,66,41,32,95,56,57,+49,41,41,32,40,67,32,95,52,54,51,41,41,41,41,32,40,40,65,32,+58,57,48,56,32,40,40,83,32,40,85,32,75,41,41,32,40,40,66,32,+90,41,32,40,40,40,83,39,32,67,41,32,40,67,32,95,57,49,50,41,+41,32,40,40,67,32,40,40,83,32,40,95,52,50,53,32,40,40,67,32,+40,95,50,48,51,32,95,49,51,49,41,41,32,35,52,54,41,41,41,32,+73,41,41,32,40,40,40,67,39,32,66,41,32,40,40,67,32,40,40,67,+32,61,61,41,32,35,52,54,41,41,32,95,50,53,41,41,32,95,57,48,+56,41,41,41,41,41,41,32,40,40,65,32,58,57,48,57,32,40,85,32,+40,40,40,67,39,32,66,41,32,95,56,57,49,41,32,95,57,48,56,41,+41,41,32,40,40,65,32,58,57,49,48,32,40,85,32,40,75,32,40,40,+40,83,39,32,40,40,83,39,32,95,49,50,48,41,32,95,49,51,57,41,+41,32,40,40,66,32,40,40,83,39,32,95,49,50,48,41,32,40,40,67,+32,40,95,50,48,50,32,95,49,51,49,41,41,32,35,53,56,41,41,41,+32,40,40,66,32,40,40,67,39,32,95,49,50,48,41,32,40,40,67,32,+40,95,50,48,50,32,95,49,51,49,41,41,32,35,52,52,41,41,41,32,+40,40,40,83,39,32,95,49,50,48,41,32,40,40,67,32,40,95,50,48,+50,32,95,49,51,51,41,41,32,34,91,93,34,41,41,32,40,40,67,32,+40,95,50,48,50,32,95,49,51,51,41,41,32,34,40,41,34,41,41,41,+41,41,32,95,52,50,56,41,41,41,41,32,40,40,65,32,58,57,49,49,+32,40,40,67,32,40,95,52,51,50,32,95,49,51,49,41,41,32,34,64,+92,57,50,38,61,43,45,58,60,62,46,33,35,36,37,94,38,42,47,124,+126,63,34,41,41,32,40,40,65,32,58,57,49,50,32,40,40,40,83,39,+32,95,49,50,48,41,32,95,57,49,51,41,32,40,40,40,83,39,32,95,+49,50,48,41,32,95,49,51,57,41,32,40,40,40,83,39,32,95,49,50,+48,41,32,95,49,52,49,41,32,40,40,67,32,40,95,50,48,50,32,95,+49,51,49,41,41,32,35,51,57,41,41,41,41,41,32,40,40,65,32,58,+57,49,51,32,40,40,40,83,39,32,95,49,50,48,41,32,95,49,51,56,+41,32,40,40,67,32,40,95,50,48,50,32,95,49,51,49,41,41,32,35,+57,53,41,41,41,32,40,40,65,32,58,57,49,52,32,40,95,56,57,55,+32,40,40,79,32,35,57,53,41,32,75,41,41,41,32,40,40,65,32,58,+57,49,53,32,40,85,32,40,75,32,40,40,80,32,95,49,50,52,41,32,+40,40,40,67,39,32,66,41,32,40,40,67,32,40,40,67,32,61,61,41,+32,35,57,53,41,41,32,95,49,50,52,41,41,32,40,40,80,32,95,49,+50,53,41,32,40,75,32,40,75,32,95,49,50,52,41,41,41,41,41,41,+41,41,32,40,40,65,32,58,57,49,54,32,40,85,32,40,40,67,32,40,+40,40,83,39,32,67,39,41,32,40,40,66,32,67,39,41,32,95,51,57,+50,41,41,32,40,40,40,67,39,32,66,41,32,40,66,39,32,40,40,66,+32,95,52,54,51,41,32,40,95,49,53,57,48,32,40,95,51,57,49,32,+95,49,52,57,41,41,41,41,41,32,40,40,40,67,39,32,67,41,32,40,+40,83,32,40,40,40,67,39,32,83,39,41,32,40,40,66,32,95,49,50,+49,41,32,40,40,67,32,40,95,50,48,50,32,95,50,56,49,41,41,32,+35,48,41,41,41,32,40,40,67,32,40,95,50,48,50,32,95,50,56,49,+41,41,32,35,48,41,41,41,32,40,40,66,32,40,66,32,40,95,52,54,+51,32,34,58,32,108,105,110,101,32,34,41,41,41,32,40,40,40,67,39,+32,66,41,32,40,40,66,32,95,52,54,51,41,32,40,95,49,53,57,48,+32,95,50,56,51,41,41,41,32,40,40,66,32,40,95,52,54,51,32,34,+44,32,99,111,108,32,34,41,41,32,40,95,49,53,57,48,32,95,50,56,+51,41,41,41,41,41,41,32,75,41,41,41,41,32,34,110,111,32,108,111,+99,97,116,105,111,110,34,41,41,41,32,40,40,65,32,58,57,49,55,32,+40,90,32,75,41,41,32,40,40,65,32,58,57,49,56,32,40,40,66,32,+90,41,32,40,40,66,32,40,66,32,90,41,41,32,80,41,41,41,32,40,+40,65,32,58,57,49,57,32,40,40,66,32,40,66,32,40,66,32,40,66,+32,90,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,+90,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,67,+41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,67,41,41,41,32,+40,40,66,32,40,66,32,67,41,41,32,80,41,41,41,41,41,41,32,40,+40,65,32,58,57,50,48,32,95,57,49,55,41,32,40,40,65,32,58,57,+50,49,32,95,57,49,56,41,32,40,40,65,32,58,57,50,50,32,40,40,+95,50,54,51,32,40,95,51,57,53,32,95,53,54,54,41,41,32,95,57,+50,51,41,41,32,40,40,65,32,58,57,50,51,32,40,40,67,32,40,89,+32,40,40,66,32,40,40,67,39,32,83,41,32,40,40,67,32,83,41,32,+40,40,67,39,32,40,67,39,32,95,52,54,50,41,41,32,80,41,41,41,+41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,40,83,39,32,66,+41,32,40,40,66,32,40,67,39,32,66,41,41,32,40,40,66,32,66,39,+41,32,66,39,41,41,41,32,40,40,66,32,40,66,32,40,40,67,39,32,+40,67,39,32,66,41,41,32,40,40,66,32,40,66,32,95,52,54,50,41,+41,32,80,41,41,41,41,32,67,41,41,41,41,41,41,32,95,52,54,49,+41,41,32,40,40,65,32,58,57,50,52,32,40,95,57,50,53,32,95,50,+54,53,41,41,32,40,40,65,32,58,57,50,53,32,40,40,40,67,39,32,+95,51,57,55,41,32,40,40,66,32,95,50,54,56,41,32,95,57,51,48,+41,41,32,95,57,50,48,41,41,32,40,40,65,32,58,57,50,54,32,40,+40,67,32,40,40,80,32,35,48,41,32,40,75,32,40,75,32,35,49,41,+41,41,41,32,40,75,32,40,90,32,40,90,32,75,41,41,41,41,41,32,+40,40,65,32,58,57,50,55,32,40,40,40,83,39,32,40,83,39,32,40,+83,39,32,83,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,+39,32,40,67,39,32,83,41,41,41,41,32,40,40,67,32,40,40,40,67,+39,32,67,39,41,32,40,40,66,32,67,39,41,32,40,40,66,32,67,39,+41,32,83,39,41,41,41,32,40,40,40,67,39,32,40,67,39,32,67,41,+41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,83,39,41,41,+41,32,40,40,66,32,40,66,32,85,41,41,32,95,57,49,56,41,41,32,+40,90,32,75,41,41,41,32,40,90,32,40,90,32,40,90,32,40,90,32,+75,41,41,41,41,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,+40,90,32,40,90,32,40,90,32,75,41,41,41,41,41,41,32,40,40,40,+67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,32,40,40,66,32,+40,66,32,67,41,41,32,40,40,40,83,39,32,67,39,41,32,95,57,49,+57,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,40,95,52,55,+57,32,95,50,55,55,41,41,32,40,40,40,67,39,32,40,95,52,55,57,+32,95,50,55,55,41,41,32,95,57,50,54,41,32,35,49,41,41,41,32,+95,57,50,54,41,41,41,41,32,73,41,41,41,32,40,40,65,32,58,57,+50,56,32,40,40,66,32,89,41,32,40,40,40,83,39,32,66,41,32,40,+40,66,32,67,41,32,40,40,66,32,40,80,32,95,52,55,54,41,41,32,+40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,40,67,39,32,67,+39,41,41,32,40,40,40,67,39,32,67,41,32,40,95,52,57,54,32,95,+56,57,51,41,41,32,95,52,55,54,41,41,32,95,52,55,55,41,41,32,+95,52,55,54,41,41,41,41,32,40,40,66,32,40,66,32,90,41,41,32,+40,40,40,67,39,32,40,83,39,32,40,67,39,32,40,67,39,32,40,67,+39,32,66,41,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,+67,39,32,40,67,39,32,66,41,41,41,41,32,40,66,39,32,40,40,66,+32,67,41,32,40,95,52,57,54,32,95,56,57,51,41,41,41,41,32,95,+52,55,55,41,41,32,73,41,41,41,41,41,32,40,40,65,32,58,57,50,+57,32,40,95,57,51,48,32,95,50,54,53,41,41,32,40,40,65,32,58,+57,51,48,32,40,40,66,32,40,66,32,40,66,32,89,41,41,41,32,40,+40,66,32,40,40,83,39,32,40,83,39,32,40,83,39,32,67,41,41,41,+32,40,40,40,67,39,32,40,67,39,32,66,41,41,32,40,40,66,32,40,+66,32,80,41,41,32,95,57,49,56,41,41,32,40,40,40,67,39,32,66,+41,32,66,41,32,40,40,40,67,39,32,67,41,32,40,40,95,57,49,57,+32,95,57,49,55,41,32,35,49,41,41,32,95,57,49,55,41,41,41,41,+41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,90,41,41,41,41,+32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,40,83,39,32,40,+83,39,32,40,83,39,32,40,83,39,32,83,41,41,41,41,41,41,41,32,+40,40,66,32,40,40,83,39,32,66,41,32,40,40,66,32,40,67,39,32,+40,83,39,32,67,41,41,41,32,40,40,40,67,39,32,66,41,32,40,66,+39,32,40,40,66,32,40,83,39,32,83,39,41,41,32,40,40,66,32,40,+66,32,83,39,41,41,32,40,95,52,57,54,32,95,56,57,51,41,41,41,+41,41,32,40,66,32,95,57,51,55,41,41,41,41,41,32,40,40,67,39,+32,66,41,32,40,40,66,32,40,67,39,32,66,41,41,32,40,67,32,95,+57,50,55,41,41,41,41,41,32,40,40,67,39,32,40,67,39,32,40,67,+39,32,66,41,41,41,32,95,57,51,55,41,41,41,41,41,41,32,40,40,+65,32,58,57,51,49,32,40,40,66,32,89,41,32,40,40,40,83,39,32,+66,41,32,40,40,66,32,67,41,32,40,40,66,32,40,83,32,40,85,32,+95,57,49,55,41,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,+40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,66,32,67,41,32,+40,40,40,67,39,32,40,67,39,32,40,95,50,48,50,32,95,53,49,48,+41,41,41,32,40,95,52,57,54,32,95,56,57,51,41,41,32,95,53,49,+53,41,41,41,32,95,57,49,55,41,41,41,41,41,32,40,40,66,32,40,+66,32,90,41,41,32,40,40,40,67,39,32,40,83,39,32,40,83,39,32,+40,83,39,32,40,83,39,32,83,41,41,41,41,41,32,40,40,40,67,39,+32,40,67,39,32,40,83,39,32,67,41,41,41,32,40,40,40,67,39,32,+66,41,32,40,66,39,32,40,40,66,32,40,83,39,32,67,39,41,41,32,+40,40,66,32,40,66,32,83,39,41,41,32,40,95,52,57,54,32,95,56,+57,51,41,41,41,41,41,32,40,66,32,95,57,51,55,41,41,41,32,40,+40,40,83,39,32,83,41,32,40,40,40,67,39,32,67,41,32,40,40,67,+32,40,67,39,32,83,39,41,41,32,40,90,32,75,41,41,41,32,40,90,+32,40,90,32,40,90,32,40,90,32,75,41,41,41,41,41,41,32,40,40,+40,83,39,32,83,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,+39,32,40,67,39,32,83,39,41,41,32,85,41,32,40,90,32,75,41,41,+41,32,40,90,32,40,90,32,40,90,32,40,90,32,75,41,41,41,41,41,+41,32,40,40,40,83,39,32,83,41,32,40,40,83,32,40,40,40,67,39,+32,83,39,41,32,40,40,66,32,40,95,52,57,57,32,95,50,56,50,41,+41,32,95,57,50,54,41,41,32,95,57,50,54,41,41,32,40,40,40,67,+39,32,66,41,32,40,40,40,67,39,32,83,41,32,40,40,67,32,40,40,+40,67,39,32,83,39,41,32,95,57,50,55,41,32,40,85,32,40,90,32,+75,41,41,41,41,32,40,85,32,40,75,32,75,41,41,41,41,32,40,85,+32,40,75,32,65,41,41,41,41,32,95,57,51,50,41,41,41,32,40,40,+66,32,40,67,32,40,67,32,40,40,83,32,40,40,40,83,39,32,95,57,+50,55,41,32,40,85,32,40,75,32,65,41,41,41,32,40,85,32,40,90,+32,75,41,41,41,41,32,40,85,32,40,75,32,75,41,41,41,41,41,41,+32,95,57,51,51,41,41,41,41,41,41,32,40,40,67,39,32,40,67,39,+32,40,67,39,32,66,41,41,41,32,95,57,51,55,41,41,41,41,41,41,+32,40,40,65,32,58,57,51,50,32,40,40,67,32,40,40,80,32,95,50,+53,41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,80,41,32,+95,57,49,55,41,41,41,32,40,90,32,40,40,40,83,39,32,40,83,39,+32,40,83,39,32,83,41,41,41,32,40,40,40,67,39,32,40,67,39,32,+40,67,39,32,67,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,+67,39,32,40,67,39,32,83,39,41,41,41,41,32,40,40,40,67,39,32,+66,41,32,40,66,39,32,66,41,41,32,40,40,66,32,40,66,32,67,41,+41,32,80,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,40,90,+32,40,90,32,40,90,32,75,41,41,41,41,41,41,32,40,40,40,67,39,+32,66,41,32,40,66,39,32,40,66,39,32,95,57,51,50,41,41,41,32,+40,40,66,32,40,66,32,40,66,32,40,40,67,39,32,40,67,39,32,66,+41,41,32,40,40,66,32,40,66,32,67,41,41,32,80,41,41,41,41,41,+32,40,40,66,32,40,66,32,67,41,41,32,40,40,66,32,67,41,32,40,+67,32,95,57,51,55,41,41,41,41,41,41,41,41,41,32,40,40,65,32,+58,57,51,51,32,40,40,67,32,40,40,80,32,95,50,53,41,32,40,40,+40,67,39,32,40,67,39,32,67,41,41,32,80,41,32,95,57,49,55,41,+41,41,32,40,90,32,40,40,40,83,39,32,40,83,39,32,40,83,39,32,+83,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,67,+41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,40,67,+39,32,83,39,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,85,+41,41,41,32,40,40,67,39,32,40,67,39,32,67,41,41,32,80,41,41,+41,32,40,90,32,75,41,41,41,32,40,90,32,40,90,32,40,90,32,40,+90,32,75,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,+40,67,32,95,57,51,51,41,41,41,41,32,40,40,66,32,40,66,32,40,+66,32,40,40,67,39,32,40,67,39,32,66,41,41,32,40,40,66,32,40,+66,32,67,41,41,32,80,41,41,41,41,41,32,95,57,51,55,41,41,41,+41,41,41,32,40,40,65,32,58,57,51,52,32,35,51,41,32,40,40,65,+32,58,57,51,53,32,35,50,41,32,40,40,65,32,58,57,51,54,32,35,+48,41,32,40,40,65,32,58,57,51,55,32,40,40,66,32,89,41,32,40,+40,40,83,39,32,40,67,39,32,40,83,39,32,40,83,39,32,83,41,41,+41,41,32,40,40,40,83,39,32,66,41,32,40,66,39,32,40,66,39,32,+40,40,66,32,83,41,32,40,40,40,67,39,32,40,67,39,32,40,95,52,+57,56,32,95,50,56,50,41,41,41,32,40,40,40,67,39,32,66,41,32,+40,40,66,32,40,95,52,55,57,32,95,50,55,55,41,41,32,95,57,50,+54,41,41,32,95,57,50,54,41,41,32,35,49,41,41,41,41,41,32,40,+40,40,83,39,32,66,41,32,40,40,66,32,40,83,39,32,40,83,39,32,+83,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,40,+67,39,32,83,41,41,41,41,32,40,40,40,67,39,32,66,41,32,40,66,+39,32,40,66,39,32,67,41,41,41,32,40,40,66,32,40,66,32,40,67,+39,32,67,41,41,41,32,40,40,66,32,40,67,39,32,67,41,41,32,40,+40,67,39,32,40,67,39,32,95,57,51,55,41,41,32,40,40,40,67,39,+32,67,41,32,40,40,95,57,49,57,32,95,57,49,55,41,32,35,49,41,+41,32,95,57,49,55,41,41,41,41,41,41,32,40,90,32,40,90,32,40,+90,32,40,90,32,75,41,41,41,41,41,41,41,32,40,40,66,32,40,40,+67,39,32,40,83,39,32,40,83,39,32,83,41,41,41,32,40,40,40,67,+39,32,40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,41,32,+40,40,66,32,40,66,32,40,66,32,82,41,41,41,32,40,40,40,67,39,+32,40,67,39,32,40,67,39,32,66,41,41,41,32,40,66,32,66,39,41,+41,32,40,40,40,67,39,32,67,41,32,40,40,95,57,49,57,32,95,57,+49,55,41,32,35,49,41,41,32,95,57,49,55,41,41,41,41,32,40,90,+32,40,90,32,40,90,32,40,90,32,75,41,41,41,41,41,41,41,32,40,+40,40,83,39,32,40,83,39,32,40,83,39,32,83,41,41,41,32,40,40,+40,83,39,32,66,41,32,40,66,39,32,40,40,66,32,83,41,32,40,40,+66,32,40,40,67,39,32,40,95,52,57,57,32,95,50,56,50,41,41,32,+95,57,50,54,41,41,32,40,40,40,67,39,32,40,95,52,55,57,32,95,+50,55,55,41,41,32,40,40,66,32,40,40,95,52,56,49,32,95,50,55,+55,41,32,95,57,51,52,41,41,32,95,57,50,54,41,41,32,95,57,51,+54,41,41,41,41,41,32,40,40,40,83,39,32,40,83,39,32,40,83,39,+32,83,41,41,41,32,40,40,40,83,39,32,66,41,32,40,66,39,32,40,+40,40,67,39,32,83,39,41,32,40,40,66,32,40,95,52,57,57,32,95,+50,56,50,41,41,32,95,57,50,54,41,41,32,40,40,40,67,39,32,40,+95,52,55,57,32,95,50,55,55,41,41,32,40,40,66,32,40,40,95,52,+56,49,32,95,50,55,55,41,32,95,57,51,52,41,41,32,95,57,50,54,+41,41,32,95,57,51,54,41,41,41,41,32,95,57,50,55,41,41,32,40,+40,40,83,39,32,66,41,32,40,66,39,32,40,66,39,32,40,40,80,32,+95,50,53,41,32,40,75,32,40,75,32,95,50,53,41,41,41,41,41,41,+32,40,40,66,32,40,66,32,40,66,32,40,66,32,90,41,41,41,41,32,+40,40,66,32,40,66,32,40,66,32,40,66,32,90,41,41,41,41,32,40,+40,66,32,40,66,32,40,66,32,40,66,32,90,41,41,41,41,32,40,40,+40,83,39,32,40,83,39,32,40,83,39,32,40,83,39,32,40,67,39,32,+67,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,+40,40,67,39,32,67,41,32,40,40,66,32,40,40,67,39,32,40,95,52,+57,55,32,95,50,56,50,41,41,32,95,57,50,54,41,41,32,40,40,66,+32,40,40,95,52,56,49,32,95,50,55,55,41,32,95,57,51,53,41,41,+32,95,57,50,54,41,41,41,41,41,41,41,32,95,57,52,49,41,41,32,+95,57,51,57,41,41,41,41,41,41,41,41,32,40,40,66,32,40,66,32,+40,66,32,40,83,32,40,40,80,32,95,50,53,41,32,40,75,32,40,75,+32,95,50,53,41,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,+66,32,40,66,32,90,41,41,41,41,32,40,40,66,32,40,66,32,40,66,+32,40,66,32,90,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,+40,66,32,90,41,41,41,41,32,40,40,40,83,39,32,40,83,39,32,40,+83,39,32,40,83,39,32,40,67,39,32,67,41,41,41,41,41,32,40,40,+66,32,40,66,32,40,66,32,40,66,32,40,67,32,40,40,40,67,39,32,+67,39,41,32,40,40,66,32,40,95,52,57,55,32,95,50,56,50,41,41,+32,95,57,50,54,41,41,32,40,40,66,32,40,40,95,52,56,49,32,95,+50,55,55,41,32,95,57,51,53,41,41,32,95,57,50,54,41,41,41,41,+41,41,41,32,95,57,52,48,41,41,32,95,57,51,56,41,41,41,41,41,+41,41,41,41,41,32,95,57,50,55,41,41,41,32,40,40,65,32,58,57,+51,56,32,40,40,66,32,40,66,32,40,66,32,40,67,32,40,40,80,32,+95,50,53,41,32,40,75,32,40,75,32,95,50,53,41,41,41,41,41,41,+41,32,40,40,66,32,40,66,32,40,66,32,90,41,41,41,32,40,40,66,+32,40,66,32,40,66,32,40,66,32,95,57,50,55,41,41,41,41,32,95,+57,50,55,41,41,41,41,32,40,40,65,32,58,57,51,57,32,40,40,40,+67,39,32,66,41,32,40,66,39,32,40,66,39,32,40,40,80,32,95,50,+53,41,32,40,75,32,40,75,32,95,50,53,41,41,41,41,41,41,32,40,+40,66,32,40,66,32,40,66,32,90,41,41,41,32,40,40,66,32,40,66,+32,40,66,32,40,40,67,39,32,40,67,39,32,40,67,39,32,66,41,41,+41,32,95,57,50,55,41,41,41,41,32,40,40,66,32,40,66,32,67,41,+41,32,40,40,66,32,67,41,32,40,67,32,95,57,50,55,41,41,41,41,+41,41,41,32,40,40,65,32,58,57,52,48,32,40,40,66,32,40,66,32,+40,66,32,40,67,32,40,40,80,32,95,50,53,41,32,40,75,32,40,75,+32,95,50,53,41,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,+66,32,90,41,41,41,32,40,40,40,83,39,32,40,83,39,32,40,83,39,+32,67,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,40,67,39,+32,83,39,41,32,40,40,66,32,83,39,41,32,40,40,66,32,83,39,41,+32,40,85,32,95,50,53,41,41,41,41,41,41,41,32,40,40,40,67,39,+32,40,67,39,32,40,67,39,32,66,41,41,41,32,40,40,66,32,40,66,+32,66,39,41,41,32,40,40,66,32,40,66,32,66,39,41,41,32,40,40,+66,32,40,66,32,40,66,32,40,67,39,32,67,41,41,41,41,32,40,40,+66,32,40,66,32,40,66,32,95,57,50,55,41,41,41,32,40,40,40,67,+39,32,40,67,39,32,67,41,41,32,95,57,50,55,41,32,95,57,49,55,+41,41,41,41,41,41,32,40,95,57,50,55,32,95,57,49,55,41,41,41,+41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,+32,90,41,41,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,+67,39,32,66,41,41,41,32,40,40,66,32,40,66,32,66,39,41,41,32,+40,40,66,32,40,66,32,66,39,41,41,32,40,40,66,32,40,66,32,40,+66,32,40,67,39,32,40,67,39,32,40,67,39,32,66,41,41,41,41,41,+41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,95,57,50,55,41,+41,41,41,32,95,57,50,55,41,41,41,41,41,32,40,40,66,32,40,66,+32,67,41,41,32,40,40,66,32,67,41,32,40,67,32,95,57,50,55,41,+41,41,41,41,41,41,41,41,32,40,40,65,32,58,57,52,49,32,40,40,+40,67,39,32,66,41,32,40,66,39,32,40,66,39,32,40,40,80,32,95,+50,53,41,32,40,75,32,40,75,32,95,50,53,41,41,41,41,41,41,32,+40,40,66,32,40,66,32,40,66,32,90,41,41,41,32,40,40,40,83,39,+32,40,83,39,32,40,83,39,32,40,83,39,32,40,83,39,32,40,83,39,+32,67,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,+66,32,40,66,32,40,66,32,40,80,32,95,50,53,41,41,41,41,41,41,+41,32,40,40,66,32,40,66,32,40,66,32,40,40,67,39,32,40,67,39,+32,40,67,39,32,40,67,39,32,67,41,41,41,41,32,40,40,66,32,40,+66,32,40,66,32,95,57,50,55,41,41,41,32,40,40,40,67,39,32,40,+67,39,32,67,41,41,32,95,57,50,55,41,32,95,57,49,55,41,41,41,+41,41,41,32,40,95,57,50,55,32,95,57,49,55,41,41,41,41,32,40,+40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,90,41,+41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,40,67,39,+32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,+32,66,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,+66,32,95,57,50,55,41,41,41,41,32,95,57,50,55,41,41,41,41,41,+32,40,40,66,32,40,66,32,67,41,41,32,40,40,66,32,67,41,32,40,+67,32,95,57,50,55,41,41,41,41,41,41,41,41,41,32,40,40,65,32,+58,57,52,50,32,40,85,32,40,40,66,32,40,66,32,40,66,32,90,41,+41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,+40,95,51,51,32,95,49,52,53,50,41,32,40,40,95,50,54,49,32,40,+40,95,52,53,32,95,49,52,53,50,41,32,40,95,49,50,50,32,95,49,+51,51,57,41,41,41,32,40,95,50,52,32,34,73,110,116,101,114,97,99,+116,105,118,101,32,109,104,115,32,110,111,116,32,97,118,97,105,108,97,98,+108,101,32,119,104,101,110,32,99,111,109,112,105,108,101,100,32,119,105,116,+104,32,103,104,99,34,41,41,41,41,41,41,41,41,32,40,40,66,32,40,+66,32,40,66,32,40,66,32,40,66,32,40,40,95,51,51,32,95,49,52,+53,50,41,32,40,95,49,52,55,50,32,34,87,101,108,99,111,109,101,32,+116,111,32,105,110,116,101,114,97,99,116,105,118,101,32,77,105,99,114,111,+72,115,33,34,41,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,+66,32,40,66,32,40,66,32,40,40,40,83,39,32,40,95,51,50,32,95,+49,52,53,50,41,41,32,95,54,49,52,41,32,40,40,40,67,39,32,40,+67,39,32,40,95,51,50,32,95,49,52,53,50,41,41,41,32,40,40,66,+32,40,66,32,40,95,49,48,56,57,32,95,57,52,52,41,41,41,32,40,+40,66,32,67,41,32,40,80,32,95,57,52,51,41,41,41,41,32,40,75,+32,40,40,95,51,52,32,95,49,52,53,50,41,32,95,49,51,52,49,41,+41,41,41,41,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,+67,39,32,67,41,41,41,32,95,54,48,48,41,32,95,49,50,53,41,41,+41,41,41,41,41,32,40,40,65,32,58,57,52,51,32,40,40,95,52,54,+51,32,34,109,111,100,117,108,101,32,34,41,32,40,40,95,52,54,51,32,+95,57,53,49,41,32,40,40,95,52,54,51,32,34,40,109,111,100,117,108,+101,32,34,41,32,40,40,95,52,54,51,32,95,57,53,49,41,32,34,41,+32,119,104,101,114,101,92,49,48,38,105,109,112,111,114,116,32,80,114,101,+108,117,100,101,92,49,48,38,100,101,102,97,117,108,116,32,40,73,110,116,+101,103,101,114,44,32,68,111,117,98,108,101,41,92,49,48,38,34,41,41,+41,41,41,32,40,40,65,32,58,57,52,52,32,40,40,40,95,51,51,32,+95,49,48,57,50,41,32,95,57,52,56,41,32,40,40,40,95,51,51,32,+95,49,48,57,50,41,32,40,40,95,50,54,49,32,95,49,48,57,56,41,+32,40,95,49,52,55,50,32,34,84,121,112,101,32,39,58,113,117,105,116,+39,32,116,111,32,113,117,105,116,44,32,39,58,104,101,108,112,39,32,102,+111,114,32,104,101,108,112,34,41,41,41,32,95,57,52,53,41,41,41,32,+40,40,65,32,58,57,52,53,32,40,40,40,95,51,50,32,95,49,48,57,+50,41,32,40,40,95,50,54,49,32,95,49,48,57,56,41,32,40,40,95,+49,52,50,49,32,34,46,109,104,115,105,34,41,32,34,62,32,34,41,41,+41,32,40,40,80,32,95,57,52,53,41,32,40,40,83,32,40,85,32,95,+57,52,53,41,41,32,40,40,40,67,39,32,40,67,39,32,66,41,41,32,+40,40,66,32,40,67,32,40,40,67,32,61,61,41,32,35,53,56,41,41,+41,32,40,40,40,67,39,32,40,95,51,51,32,95,49,48,57,50,41,41,+32,95,57,53,53,41,32,95,57,52,53,41,41,41,32,40,40,40,67,39,+32,40,95,51,50,32,95,49,48,57,50,41,41,32,95,57,52,54,41,32,+40,40,80,32,40,40,95,50,54,49,32,95,49,48,57,56,41,32,40,95,+49,52,55,50,32,34,66,121,101,34,41,41,41,32,95,57,52,53,41,41,+41,41,41,41,41,32,40,40,65,32,58,57,52,54,32,40,40,67,32,40,+40,67,32,95,49,54,48,56,41,32,40,40,95,51,52,32,95,49,48,57,+50,41,32,95,49,50,53,41,41,41,32,40,40,66,32,40,40,67,39,32,+40,83,32,40,85,32,40,40,40,95,51,51,32,95,49,48,57,50,41,32,+40,40,95,50,54,49,32,95,49,48,57,56,41,32,40,95,49,52,55,50,+32,34,85,110,114,101,99,111,103,110,105,122,101,100,32,99,111,109,109,97,+110,100,34,41,41,41,32,40,40,95,51,52,32,95,49,48,57,50,41,32,+95,49,50,53,41,41,41,41,41,32,40,40,66,32,40,66,32,40,67,32,+66,41,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,40,67,+39,32,66,41,32,40,40,66,32,67,41,32,40,40,66,32,40,67,32,67,+39,41,41,32,40,40,66,32,85,41,32,95,49,54,48,57,41,41,41,41,+32,40,90,32,40,90,32,40,40,40,67,39,32,40,95,51,51,32,95,49,+48,57,50,41,41,32,40,40,66,32,40,95,50,54,49,32,95,49,48,57,+56,41,41,32,40,40,66,32,40,95,50,54,49,32,95,49,52,55,50,41,+41,32,40,40,66,32,40,95,52,54,51,32,34,65,109,98,105,103,117,111,+117,115,32,99,111,109,109,97,110,100,58,32,34,41,41,32,40,40,66,32,+95,49,54,48,57,41,32,40,95,51,57,53,32,95,53,54,53,41,41,41,+41,41,41,32,40,40,95,51,52,32,95,49,48,57,50,41,32,95,49,50,+53,41,41,41,41,41,41,41,41,41,32,40,40,40,67,39,32,95,51,57,+54,41,32,40,40,40,67,39,32,95,50,54,51,41,32,40,95,52,49,56,+32,95,49,51,49,41,41,32,95,53,54,53,41,41,32,95,57,52,55,41,+41,41,41,32,40,40,65,32,58,57,52,55,32,40,40,79,32,40,40,80,+32,34,113,117,105,116,34,41,32,40,40,95,50,54,49,32,95,50,54,53,+41,32,40,40,95,51,52,32,95,49,48,57,50,41,32,95,49,50,52,41,+41,41,41,32,40,40,79,32,40,40,80,32,34,99,108,101,97,114,34,41,+32,40,40,95,50,54,49,32,95,50,54,53,41,32,40,40,40,95,51,51,+32,95,49,48,57,50,41,32,40,95,57,53,48,32,40,95,50,54,53,32,+95,57,52,51,41,41,41,32,40,40,40,95,51,51,32,95,49,48,57,50,+41,32,40,40,95,50,54,49,32,95,49,48,57,53,41,32,40,85,32,40,+40,66,32,90,41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,+80,41,32,95,54,49,49,41,41,41,41,41,32,40,40,95,51,52,32,95,+49,48,57,50,41,32,95,49,50,53,41,41,41,41,41,41,32,40,40,79,+32,40,40,80,32,34,114,101,108,111,97,100,34,41,32,40,40,95,50,54,+49,32,95,50,54,53,41,32,40,40,40,95,51,51,32,95,49,48,57,50,+41,32,40,40,95,50,54,49,32,95,49,48,57,53,41,32,40,85,32,40,+40,66,32,90,41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,+80,41,32,95,54,49,49,41,41,41,41,41,32,40,40,40,95,51,51,32,+95,49,48,57,50,41,32,95,57,52,56,41,32,40,40,95,51,52,32,95,+49,48,57,50,41,32,95,49,50,53,41,41,41,41,41,41,32,40,40,79,+32,40,40,80,32,34,100,101,108,101,116,101,34,41,32,40,40,40,67,39,+32,40,95,51,51,32,95,49,48,57,50,41,41,32,40,40,66,32,95,57,+53,48,41,32,40,40,66,32,40,95,50,54,51,32,95,49,54,48,55,41,+41,32,40,40,40,67,39,32,95,50,54,51,41,32,40,40,66,32,95,51,+57,54,41,32,40,40,66,32,40,95,50,54,51,32,95,49,50,50,41,41,+32,40,95,52,49,56,32,95,49,51,49,41,41,41,41,32,95,49,54,48,+54,41,41,41,41,32,40,40,95,51,52,32,95,49,48,57,50,41,32,95,+49,50,53,41,41,41,41,32,40,40,79,32,40,40,80,32,34,104,101,108,+112,34,41,32,40,75,32,40,40,40,95,51,51,32,95,49,48,57,50,41,+32,40,40,95,50,54,49,32,95,49,48,57,56,41,32,40,95,49,52,55,+50,32,95,57,52,57,41,41,41,32,40,40,95,51,52,32,95,49,48,57,+50,41,32,95,49,50,53,41,41,41,41,41,32,75,41,41,41,41,41,41,+32,40,40,65,32,58,57,52,56,32,40,40,40,95,51,50,32,95,49,48,+57,50,41,32,95,49,48,57,55,41,32,40,85,32,40,90,32,40,90,32,+40,40,40,67,39,32,40,95,51,50,32,95,49,48,57,50,41,41,32,95,+57,53,54,41,32,40,40,80,32,40,40,66,32,40,95,50,54,49,32,95,+49,48,57,56,41,41,32,95,57,53,52,41,41,32,40,75,32,40,40,95,+51,52,32,95,49,48,57,50,41,32,95,49,51,52,49,41,41,41,41,41,+41,41,41,41,32,40,40,65,32,58,57,52,57,32,34,67,111,109,109,97,+110,100,115,58,92,49,48,38,32,32,58,113,117,105,116,32,32,32,32,32,+32,113,117,105,116,32,77,105,99,114,111,72,115,92,49,48,38,32,32,58,+114,101,108,111,97,100,32,32,32,32,114,101,108,111,97,100,32,109,111,100,+117,108,101,115,92,49,48,38,32,32,58,99,108,101,97,114,32,32,32,32,+32,99,108,101,97,114,32,97,108,108,32,100,101,102,105,110,105,116,105,111,+110,115,92,49,48,38,32,32,58,100,101,108,101,116,101,32,100,32,32,100,+101,108,101,116,101,32,100,101,102,105,110,105,116,105,111,110,40,115,41,32,+100,92,49,48,38,32,32,58,104,101,108,112,32,32,32,32,32,32,116,104,+105,115,32,116,101,120,116,92,49,48,38,32,32,101,120,112,114,32,32,32,+32,32,32,32,101,118,97,108,117,97,116,101,32,101,120,112,114,101,115,115,+105,111,110,92,49,48,38,32,32,100,101,102,110,32,32,32,32,32,32,32,+97,100,100,32,116,111,112,32,108,101,118,101,108,32,100,101,102,105,110,105,+116,105,111,110,92,49,48,38,34,41,32,40,40,65,32,58,57,53,48,32,+40,40,66,32,40,95,50,54,49,32,95,49,48,57,53,41,41,32,40,40,+66,32,85,41,32,40,40,66,32,40,66,32,40,66,32,67,41,41,41,32,+40,66,32,80,41,41,41,41,41,32,40,40,65,32,58,57,53,49,32,34,+73,110,116,101,114,97,99,116,105,118,101,34,41,32,40,40,65,32,58,57,+53,50,32,34,95,105,116,34,41,32,40,40,65,32,58,57,53,51,32,40,+40,66,32,40,95,52,54,51,32,95,57,53,50,41,41,32,40,40,66,32,+40,95,52,54,51,32,34,32,58,58,32,73,79,32,40,41,92,49,48,38,+34,41,41,32,40,40,66,32,40,95,52,54,51,32,95,57,53,50,41,41,+32,40,40,66,32,40,95,52,54,51,32,34,32,61,32,112,114,105,110,116,+79,114,82,117,110,32,40,34,41,41,32,40,40,67,32,95,52,54,51,41,+32,34,41,92,49,48,38,34,41,41,41,41,41,41,32,40,40,65,32,58,+57,53,52,32,40,40,66,32,40,95,50,54,49,32,95,49,52,55,50,41,+41,32,40,95,52,54,51,32,34,69,114,114,111,114,58,32,34,41,41,41,+32,40,40,65,32,58,57,53,53,32,40,40,66,32,40,40,95,51,50,32,+95,49,48,57,50,41,32,95,49,48,57,55,41,41,32,40,40,66,32,85,+41,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,40,83,+39,32,83,41,32,40,40,40,67,39,32,40,67,39,32,83,41,41,32,40,+40,66,32,40,66,32,40,67,32,40,40,95,57,57,55,32,95,57,57,57,+41,32,75,41,41,41,41,32,40,40,66,32,90,41,32,40,40,40,83,39,+32,66,41,32,40,40,67,32,40,40,95,57,57,55,32,95,49,48,48,48,+41,32,75,41,41,32,40,40,66,32,40,95,50,54,49,32,95,49,48,57,+56,41,41,32,40,40,66,32,95,57,53,52,41,32,95,50,54,41,41,41,+41,32,40,40,66,32,90,41,32,40,40,40,67,39,32,40,67,39,32,40,+95,51,50,32,95,49,48,57,50,41,41,41,32,40,40,66,32,40,66,32,+95,57,53,54,41,41,32,40,40,66,32,40,67,32,95,52,54,51,41,41,+32,40,40,66,32,40,95,52,54,51,32,40,40,79,32,35,49,48,41,32,+75,41,41,41,32,95,57,53,51,41,41,41,41,32,40,40,80,32,40,40,+66,32,40,95,50,54,49,32,95,49,48,57,56,41,41,32,95,57,53,52,+41,41,32,95,57,53,55,41,41,41,41,41,41,41,32,40,90,32,40,40,+40,83,39,32,40,95,51,50,32,95,49,48,57,50,41,41,32,95,57,53,+54,41,32,40,40,66,32,40,80,32,40,40,66,32,40,95,50,54,49,32,+95,49,48,57,56,41,41,32,95,57,53,52,41,41,41,32,40,90,32,40,+40,66,32,95,57,53,48,41,32,95,50,54,53,41,41,41,41,41,41,41,+32,40,40,66,32,40,67,32,95,52,54,51,41,41,32,40,40,67,32,95,+52,54,51,41,32,40,40,79,32,35,49,48,41,32,75,41,41,41,41,41,+41,41,41,41,32,40,40,65,32,58,57,53,54,32,40,40,66,32,40,40,+95,51,50,32,95,49,48,57,50,41,32,95,49,48,57,55,41,41,32,40,+40,66,32,85,41,32,40,40,67,32,40,40,40,67,39,32,67,39,41,32,+40,40,66,32,67,39,41,32,40,40,66,32,67,39,41,32,40,66,39,32,+40,40,66,32,40,95,51,51,32,95,49,48,57,50,41,41,32,40,40,66,+32,40,95,50,54,49,32,95,49,48,57,56,41,41,32,40,95,49,52,55,+52,32,40,40,95,52,54,51,32,95,57,53,49,41,32,34,46,104,115,34,+41,41,41,41,41,41,41,41,32,40,40,66,32,40,40,83,39,32,40,67,+39,32,40,83,39,32,40,95,51,50,32,95,49,48,57,50,41,41,41,41,+32,40,40,66,32,40,66,32,40,66,32,40,95,50,54,49,32,95,49,48,+57,56,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,95,50,+54,49,32,95,50,56,41,41,41,41,32,40,40,66,32,67,41,32,95,54,+49,51,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,80,+32,40,40,66,32,40,95,51,52,32,95,49,48,57,50,41,41,32,95,49,+55,52,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,85,41,+41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,66,41,41,+41,32,40,40,66,32,40,66,32,40,66,32,40,67,39,32,40,95,51,51,+32,95,49,48,57,50,41,41,41,41,41,32,40,40,66,32,40,66,32,40,+66,32,40,66,32,95,49,48,57,54,41,41,41,41,32,40,40,40,67,39,+32,40,67,39,32,66,41,41,32,40,40,66,32,66,39,41,32,40,40,66,+32,40,66,32,67,41,41,32,80,41,41,41,32,95,54,49,50,41,41,41,+41,32,40,40,66,32,40,95,51,52,32,95,49,48,57,50,41,41,32,95,+49,55,53,41,41,41,41,41,41,41,32,40,95,56,57,55,32,95,57,53,+49,41,41,41,41,41,32,40,40,65,32,58,57,53,55,32,40,40,66,32,+40,40,40,67,39,32,40,95,51,50,32,95,49,48,57,50,41,41,32,40,+40,66,32,40,95,50,54,49,32,95,49,48,57,56,41,41,32,40,40,66,+32,95,50,56,41,32,40,40,83,32,95,49,52,56,49,41,32,40,95,51,+52,32,95,49,52,53,50,41,41,41,41,41,32,40,40,66,32,40,95,50,+54,49,32,95,49,48,57,56,41,41,32,40,40,80,32,95,57,53,52,41,+32,40,40,40,67,39,32,40,95,51,50,32,95,49,52,53,50,41,41,32,+95,50,56,41,32,40,40,80,32,95,57,53,52,41,32,40,75,32,40,40,+95,51,52,32,95,49,52,53,50,41,32,95,49,51,52,49,41,41,41,41,+41,41,41,41,32,40,40,66,32,95,49,54,49,51,41,32,40,40,66,32,+95,49,49,48,50,41,32,40,80,32,40,95,56,57,55,32,40,40,95,52,+54,51,32,95,57,53,49,41,32,40,40,95,52,54,51,32,40,40,79,32,+35,52,54,41,32,75,41,41,32,95,57,53,50,41,41,41,41,41,41,41,+41,32,40,40,65,32,58,57,53,56,32,40,40,66,32,40,66,32,40,66,+32,90,41,41,41,32,40,40,66,32,40,66,32,40,66,32,90,41,41,41,+32,40,40,66,32,40,66,32,40,66,32,90,41,41,41,32,40,40,66,32,+40,66,32,40,66,32,90,41,41,41,32,40,40,66,32,40,66,32,40,66,+32,90,41,41,41,32,40,40,66,32,40,66,32,40,66,32,90,41,41,41,+32,40,40,66,32,40,66,32,40,66,32,90,41,41,41,32,40,40,66,32,+40,66,32,40,66,32,90,41,41,41,32,40,40,66,32,40,66,32,67,41,+41,32,80,41,41,41,41,41,41,41,41,41,41,32,40,40,65,32,58,57,+53,57,32,40,40,66,32,90,41,32,40,40,66,32,40,66,32,90,41,41,+32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,+41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,+32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,+40,66,32,90,41,41,32,80,41,41,41,41,41,41,41,41,41,32,40,40,+65,32,58,57,54,48,32,40,40,66,32,90,41,32,40,40,66,32,90,41,+32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,+41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,+32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,+40,66,32,90,41,41,32,80,41,41,41,41,41,41,41,41,41,32,40,40,+65,32,58,57,54,49,32,40,40,66,32,90,41,32,40,40,66,32,90,41,+32,40,40,66,32,90,41,32,40,40,66,32,40,66,32,90,41,41,32,40,+40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,+32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,+41,41,32,80,41,41,41,41,41,41,41,41,41,32,40,40,65,32,58,57,+54,50,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,66,+32,90,41,32,40,40,66,32,90,41,32,40,40,66,32,40,66,32,90,41,+41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,+90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,80,41,41,41,41,+41,41,41,41,41,32,40,40,65,32,58,57,54,51,32,40,40,66,32,90,+41,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,66,32,+90,41,32,40,40,66,32,90,41,32,40,40,66,32,40,66,32,90,41,41,+32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,+41,41,32,80,41,41,41,41,41,41,41,41,41,32,40,40,65,32,58,57,+54,52,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,66,+32,90,41,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,+66,32,90,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,+40,66,32,90,41,41,32,80,41,41,41,41,41,41,41,41,41,32,40,40,+65,32,58,57,54,53,32,40,90,32,40,90,32,40,90,32,40,90,32,40,+90,32,40,90,32,40,90,32,40,40,66,32,90,41,32,85,41,41,41,41,+41,41,41,41,41,32,40,40,65,32,58,57,54,54,32,40,90,32,40,90,+32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,85,+41,41,41,41,41,41,41,41,41,32,40,40,65,32,58,57,54,55,32,40,+40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,+40,67,32,40,40,67,32,40,40,80,32,40,75,32,40,40,66,32,40,66,+32,40,95,52,51,49,32,40,40,79,32,35,52,54,41,32,75,41,41,41,+41,32,40,40,40,67,39,32,66,41,32,95,52,54,51,41,32,40,40,67,+32,79,41,32,75,41,41,41,41,41,32,40,75,32,40,95,49,53,57,48,+32,40,95,51,57,49,32,95,49,52,57,41,41,41,41,41,32,40,75,32,+40,95,49,53,57,48,32,95,49,52,57,41,41,41,41,32,40,75,32,40,+95,49,53,57,48,32,95,51,48,55,41,41,41,41,32,40,75,32,40,95,+49,53,57,48,32,40,95,53,50,49,32,95,51,48,55,41,41,41,41,41,+32,40,75,32,40,40,67,32,79,41,32,75,41,41,41,41,32,40,75,32,+40,95,52,54,51,32,34,69,82,82,79,82,32,34,41,41,41,41,32,40,+75,32,34,84,66,114,97,99,101,34,41,41,41,32,40,75,32,34,84,73,+110,100,101,110,116,34,41,41,41,32,40,40,65,32,58,57,54,56,32,40,+85,32,40,90,32,40,40,40,67,39,32,80,41,32,40,40,67,32,40,95,+52,55,57,32,95,50,55,55,41,41,32,35,49,41,41,32,40,40,95,52,+56,53,32,95,50,55,55,41,32,40,95,51,53,57,32,35,49,41,41,41,+41,41,41,32,40,40,65,32,58,57,54,57,32,40,40,67,32,66,41,32,+40,40,66,32,40,40,67,39,32,66,41,32,80,41,41,32,40,67,32,40,+95,52,55,57,32,95,50,55,55,41,41,41,41,41,32,40,40,65,32,58,+57,55,48,32,80,41,32,40,40,65,32,58,57,55,49,32,40,85,32,65,+41,41,32,40,40,65,32,58,57,55,50,32,40,40,95,50,54,51,32,40,+95,57,56,53,32,95,52,54,49,41,41,32,40,95,57,55,51,32,40,40,+95,57,55,48,32,35,49,41,32,35,49,41,41,41,41,32,40,40,65,32,+58,57,55,51,32,40,40,66,32,89,41,32,40,40,40,83,39,32,66,41,+32,40,40,66,32,83,41,32,40,40,66,32,40,67,32,83,41,41,32,40,+40,66,32,40,40,67,39,32,40,67,39,32,66,41,41,32,40,67,32,40,+40,67,32,61,61,41,32,35,51,50,41,41,41,41,32,40,40,66,32,95,+57,55,51,41,32,40,40,67,32,95,57,54,57,41,32,35,49,41,41,41,+41,41,41,32,40,40,40,83,39,32,66,41,32,40,40,66,32,83,41,32,+40,40,66,32,40,67,32,83,41,41,32,40,40,66,32,40,40,67,39,32,+40,67,39,32,66,41,41,32,40,67,32,40,40,67,32,61,61,41,32,35,+49,48,41,41,41,41,32,40,40,66,32,40,66,32,95,57,55,56,41,41,+32,40,40,66,32,95,57,55,51,41,32,95,57,54,56,41,41,41,41,41,+41,32,40,40,66,32,40,40,67,39,32,83,41,32,40,40,66,32,40,67,+32,83,41,41,32,40,40,67,39,32,40,67,39,32,66,41,41,32,40,67,+32,40,40,67,32,61,61,41,32,35,49,51,41,41,41,41,41,41,32,40,+40,40,83,39,32,83,41,32,40,40,66,32,40,67,32,83,41,41,32,40,+40,66,32,40,40,83,39,32,40,67,39,32,66,41,41,32,40,67,32,40,+40,67,32,61,61,41,32,35,49,50,51,41,41,41,41,32,40,40,66,32,+40,83,32,80,41,41,32,40,40,66,32,40,40,67,39,32,40,67,39,32,+66,41,41,32,40,67,32,40,40,67,32,61,61,41,32,35,52,53,41,41,+41,41,32,40,40,40,67,39,32,95,57,55,54,41,32,40,40,67,32,95,+57,54,57,41,32,35,50,41,41,32,35,49,41,41,41,41,41,41,32,40,+40,40,83,39,32,83,41,32,40,40,66,32,40,67,32,83,41,41,32,40,+40,66,32,40,40,83,39,32,40,67,39,32,66,41,41,32,40,67,32,40,+40,67,32,61,61,41,32,35,52,53,41,41,41,41,32,40,40,66,32,40,+83,32,80,41,41,32,40,40,66,32,40,40,83,39,32,40,67,39,32,66,+41,41,32,40,67,32,40,40,67,32,61,61,41,32,35,52,53,41,41,41,+41,32,40,40,40,67,39,32,67,41,32,40,40,66,32,40,40,67,39,32,+83,39,41,32,40,40,66,32,83,41,32,40,40,67,39,32,40,40,80,32,+95,49,50,53,41,32,40,90,32,40,40,66,32,95,49,50,50,41,32,95,+57,49,49,41,41,41,41,32,40,85,32,65,41,41,41,41,41,32,40,40,+66,32,40,67,39,32,95,57,55,55,41,41,32,40,40,40,67,39,32,66,+41,32,40,40,66,32,95,50,54,49,41,32,95,57,54,57,41,41,32,40,+40,66,32,40,40,95,52,55,57,32,95,50,55,55,41,32,40,40,95,52,+56,53,32,95,50,55,55,41,32,40,95,51,53,57,32,35,50,41,41,41,+41,32,40,40,66,32,95,52,49,49,41,32,40,85,32,75,41,41,41,41,+41,41,41,32,40,95,52,50,54,32,40,40,67,32,40,95,50,48,50,32,+95,49,51,49,41,41,32,35,52,53,41,41,41,41,41,41,41,41,32,40,+40,40,83,39,32,83,41,32,40,40,66,32,40,67,32,83,41,41,32,40,+40,66,32,40,40,67,39,32,40,83,39,32,66,41,41,32,40,67,32,95,+57,49,51,41,41,41,32,40,40,66,32,40,66,32,40,67,32,40,95,52,+50,54,32,95,57,49,50,41,41,41,41,32,40,40,40,83,39,32,40,67,+39,32,40,83,39,32,66,41,41,41,32,40,40,40,67,39,32,66,41,32,+40,66,39,32,40,40,67,32,95,57,56,51,41,32,95,52,54,49,41,41,+41,32,95,52,54,50,41,41,32,40,40,66,32,40,66,32,95,57,55,51,+41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,95,50,54,49,+41,32,95,57,54,57,41,41,32,40,40,66,32,40,40,95,52,55,57,32,+95,50,55,55,41,32,40,40,95,52,56,53,32,95,50,55,55,41,32,40,+95,51,53,57,32,35,49,41,41,41,41,32,95,52,49,49,41,41,41,41,+41,41,41,41,32,40,40,40,83,39,32,83,41,32,40,40,66,32,40,83,+32,83,41,41,32,40,40,66,32,40,66,32,40,66,32,90,41,41,41,32,+40,40,66,32,40,66,32,40,40,67,39,32,67,41,32,40,67,32,95,49,+51,57,41,41,41,41,32,40,40,67,32,40,40,83,32,95,57,56,50,41,+32,73,41,41,32,95,52,54,49,41,41,41,41,41,32,40,40,40,83,39,+32,83,41,32,40,40,66,32,40,67,32,83,41,41,32,40,40,66,32,40,+40,83,39,32,40,67,39,32,66,41,41,32,40,67,32,40,40,67,32,61,+61,41,32,35,52,56,41,41,41,41,32,40,40,66,32,40,83,32,80,41,+41,32,40,40,66,32,40,40,67,39,32,40,67,39,32,66,41,41,32,40,+67,32,40,40,40,67,39,32,40,95,50,48,50,32,95,49,51,49,41,41,+32,95,49,52,55,41,32,35,49,50,48,41,41,41,41,32,95,57,55,52,+41,41,41,41,41,32,40,40,40,83,39,32,83,41,32,40,40,66,32,40,+67,32,83,41,41,32,40,40,66,32,40,40,83,39,32,40,67,39,32,66,+41,41,32,40,67,32,40,40,67,32,61,61,41,32,35,52,53,41,41,41,+41,32,40,40,66,32,40,40,83,39,32,83,41,32,85,41,41,32,40,40,+66,32,40,66,32,40,66,32,90,41,41,41,32,40,40,66,32,40,40,67,+39,32,66,41,32,40,40,66,32,67,41,32,40,67,32,95,49,52,49,41,+41,41,41,32,40,40,67,32,95,57,55,53,41,32,40,40,79,32,35,52,+53,41,32,75,41,41,41,41,41,41,41,41,32,40,40,40,83,39,32,83,+41,32,40,40,66,32,40,83,32,83,41,41,32,40,40,66,32,40,66,32,+40,66,32,90,41,41,41,32,40,40,66,32,40,66,32,40,40,67,39,32,+67,41,32,40,67,32,95,49,52,49,41,41,41,41,32,40,40,67,32,95,+57,55,53,41,32,75,41,41,41,41,41,32,40,40,40,83,39,32,83,41,+32,40,40,66,32,40,67,32,83,41,41,32,40,40,66,32,40,40,67,39,+32,40,83,39,32,66,41,41,32,40,67,32,95,57,49,49,41,41,41,32,+40,40,66,32,40,66,32,40,67,32,40,95,52,50,54,32,95,57,49,49,+41,41,41,41,32,40,40,40,83,39,32,40,67,39,32,40,83,39,32,66,+41,41,41,32,40,40,66,32,40,66,32,40,66,32,95,52,54,50,41,41,+41,32,40,40,40,67,39,32,66,41,32,40,66,39,32,40,40,67,32,95,+57,53,56,41,32,95,52,54,49,41,41,41,32,95,52,54,50,41,41,41,+32,40,40,66,32,40,66,32,95,57,55,51,41,41,32,40,40,40,67,39,+32,66,41,32,40,40,66,32,95,50,54,49,41,32,95,57,54,57,41,41,+32,40,40,66,32,40,40,95,52,55,57,32,95,50,55,55,41,32,40,40,+95,52,56,53,32,95,50,55,55,41,32,40,95,51,53,57,32,35,49,41,+41,41,41,32,95,52,49,49,41,41,41,41,41,41,41,41,32,40,40,40,+83,39,32,83,41,32,40,40,66,32,40,67,32,83,41,41,32,40,40,66,+32,40,40,67,39,32,40,83,39,32,66,41,41,32,40,67,32,95,57,56,+49,41,41,41,32,40,40,40,83,39,32,40,67,39,32,66,41,41,32,40,+40,66,32,40,66,32,95,52,54,50,41,41,32,95,57,54,51,41,41,32,+40,40,66,32,95,57,55,51,41,32,40,40,67,32,95,57,54,57,41,32,+35,49,41,41,41,41,41,41,32,40,40,40,83,39,32,83,41,32,40,40,+66,32,40,67,32,83,41,41,32,40,40,66,32,40,40,67,39,32,40,67,+39,32,66,41,41,32,40,67,32,40,40,67,32,61,61,41,32,35,51,52,+41,41,41,41,32,40,40,40,83,39,32,67,41,32,40,40,67,32,40,40,+67,32,40,40,67,32,40,40,83,32,95,57,55,57,41,32,95,57,53,57,+41,41,32,35,51,52,41,41,32,35,48,41,41,32,95,52,54,49,41,41,+32,40,40,66,32,40,40,67,39,32,66,41,32,40,66,39,32,95,52,54,+50,41,41,41,32,40,40,66,32,40,66,32,95,57,55,51,41,41,32,40,+40,40,67,39,32,66,41,32,40,40,66,32,95,50,54,49,41,32,95,57,+54,57,41,41,32,40,40,95,52,55,57,32,95,50,55,55,41,32,40,40,+95,52,56,53,32,95,50,55,55,41,32,40,95,51,53,57,32,35,50,41,+41,41,41,41,41,41,41,41,41,32,40,40,40,83,39,32,83,41,32,40,+40,66,32,40,67,32,83,41,41,32,40,40,66,32,40,40,67,39,32,40,+67,39,32,66,41,41,32,40,67,32,40,40,67,32,61,61,41,32,35,51,+57,41,41,41,41,32,40,40,40,83,39,32,67,41,32,40,40,67,32,40,+40,67,32,40,40,67,32,40,40,83,32,95,57,55,57,41,32,40,40,40,+83,39,32,67,41,32,40,40,66,32,40,67,32,83,41,41,32,40,40,40,+67,39,32,66,41,32,40,40,66,32,40,67,39,32,80,41,41,32,95,57,+54,48,41,41,32,40,90,32,75,41,41,41,41,32,40,40,67,32,95,57,+54,52,41,32,34,73,108,108,101,103,97,108,32,67,104,97,114,32,108,105,+116,101,114,97,108,34,41,41,41,41,32,35,51,57,41,41,32,35,48,41,+41,32,95,52,54,49,41,41,32,40,40,66,32,40,40,67,39,32,66,41,+32,40,66,39,32,95,52,54,50,41,41,41,32,40,40,66,32,40,66,32,+95,57,55,51,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,+95,50,54,49,41,32,95,57,54,57,41,41,32,40,40,95,52,55,57,32,+95,50,55,55,41,32,40,40,95,52,56,53,32,95,50,55,55,41,32,40,+95,51,53,57,32,35,50,41,41,41,41,41,41,41,41,41,41,32,40,40,+66,32,40,80,32,95,52,54,49,41,41,32,40,40,66,32,90,41,32,40,+40,40,67,39,32,40,67,39,32,79,41,41,32,40,40,40,67,39,32,66,+41,32,40,40,66,32,95,50,54,49,41,32,95,57,54,52,41,41,32,40,+40,66,32,40,95,52,54,51,32,34,85,110,114,101,99,111,103,110,105,122,+101,100,32,105,110,112,117,116,58,32,34,41,41,32,40,95,49,53,57,48,+32,95,49,52,57,41,41,41,41,32,75,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,32,40,40,65,32,58,57,55,52,32,+40,40,66,32,40,67,32,40,95,52,50,54,32,95,49,52,50,41,41,41,+32,40,40,40,83,39,32,40,83,39,32,66,41,41,32,40,40,66,32,40,+66,32,95,52,54,50,41,41,32,40,40,40,67,39,32,66,41,32,95,57,+54,49,41,32,95,57,56,54,41,41,41,32,40,40,66,32,40,66,32,95,+57,55,51,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,95,+50,54,49,41,32,95,57,54,57,41,41,32,40,40,40,67,39,32,40,95,+52,55,57,32,95,50,55,55,41,41,32,95,52,49,49,41,32,35,50,41,+41,41,41,41,41,32,40,40,65,32,58,57,55,53,32,40,40,66,32,40,+66,32,40,67,32,40,95,52,50,54,32,95,49,52,49,41,41,41,41,32,+40,40,40,83,39,32,40,83,39,32,40,83,39,32,83,41,41,41,32,40,+40,66,32,40,66,32,40,66,32,40,83,32,40,40,40,83,39,32,95,49,+50,48,41,32,95,51,57,50,41,32,40,40,40,83,39,32,95,49,50,48,+41,32,40,40,66,32,95,49,50,50,41,32,40,40,40,67,39,32,40,95,+50,48,50,32,95,49,51,49,41,41,32,95,52,50,56,41,32,35,52,54,+41,41,41,32,40,40,40,67,39,32,40,95,50,48,50,32,95,49,51,51,+41,41,32,40,95,52,48,57,32,35,50,41,41,32,34,46,46,34,41,41,+41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,40,67,39,+32,40,95,52,50,54,32,95,49,52,49,41,41,32,95,52,50,57,41,41,+41,41,32,40,40,40,67,39,32,66,41,32,40,66,39,32,40,66,39,32,+40,40,66,32,67,41,32,40,40,66,32,40,40,67,39,32,67,41,32,40,+40,67,32,40,40,40,83,39,32,83,39,41,32,40,40,66,32,83,39,41,+32,40,40,80,32,95,52,55,54,41,32,40,40,40,83,39,32,83,41,32,+40,40,66,32,40,67,32,83,41,41,32,40,40,66,32,40,40,83,39,32,+40,67,39,32,66,41,41,32,40,67,32,40,40,67,32,61,61,41,32,35,+52,53,41,41,41,41,32,40,40,66,32,40,40,83,39,32,83,41,32,85,+41,41,32,40,40,66,32,40,66,32,40,66,32,90,41,41,41,32,40,40,+40,67,39,32,40,67,39,32,66,41,41,32,40,40,66,32,40,66,32,67,+41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,66,41,41,+41,32,40,40,40,67,39,32,67,39,41,32,40,40,66,32,95,49,50,49,+41,32,40,40,40,67,39,32,40,95,50,48,50,32,95,49,51,49,41,41,+32,95,49,52,55,41,32,35,49,48,49,41,41,41,32,95,49,52,49,41,+41,32,40,40,66,32,95,52,55,55,41,32,40,40,40,83,39,32,80,41,+32,40,40,66,32,40,95,52,54,50,32,35,49,48,49,41,41,32,40,40,+66,32,40,95,52,54,50,32,35,52,53,41,41,32,40,85,32,75,41,41,+41,41,32,40,85,32,65,41,41,41,41,41,41,32,40,95,52,50,54,32,+95,49,52,49,41,41,41,41,41,41,41,32,40,40,40,83,39,32,83,41,+32,40,40,66,32,40,67,32,83,41,41,32,40,40,66,32,40,40,83,39,+32,40,67,39,32,66,41,41,32,40,67,32,40,40,67,32,61,61,41,32,+35,52,51,41,41,41,41,32,40,40,66,32,40,40,83,39,32,83,41,32,+85,41,41,32,40,40,66,32,40,66,32,40,66,32,90,41,41,41,32,40,+40,40,67,39,32,40,67,39,32,66,41,41,32,40,40,66,32,40,66,32,+67,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,66,41,+41,41,32,40,40,40,67,39,32,67,39,41,32,40,40,66,32,95,49,50,+49,41,32,40,40,40,67,39,32,40,95,50,48,50,32,95,49,51,49,41,+41,32,95,49,52,55,41,32,35,49,48,49,41,41,41,32,95,49,52,49,+41,41,32,40,40,66,32,95,52,55,55,41,32,40,40,40,83,39,32,80,+41,32,40,40,66,32,40,95,52,54,50,32,35,49,48,49,41,41,32,40,+40,66,32,40,95,52,54,50,32,35,52,51,41,41,32,40,85,32,75,41,+41,41,41,32,40,85,32,65,41,41,41,41,41,41,32,40,95,52,50,54,+32,95,49,52,49,41,41,41,41,41,41,41,32,40,40,66,32,40,83,32,+40,85,32,95,52,55,54,41,41,41,32,40,40,66,32,40,66,32,90,41,+41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,67,41,32,40,40,+40,67,39,32,40,67,39,32,66,41,41,32,40,40,67,32,40,40,40,67,+39,32,67,39,41,32,40,40,66,32,95,49,50,49,41,32,40,40,40,67,+39,32,40,95,50,48,50,32,95,49,51,49,41,41,32,95,49,52,55,41,+32,35,49,48,49,41,41,41,32,95,49,52,49,41,41,32,95,52,55,54,+41,41,32,40,40,66,32,95,52,55,55,41,32,40,40,40,83,39,32,80,+41,32,40,40,66,32,40,95,52,54,50,32,35,49,48,49,41,41,32,40,+85,32,75,41,41,41,32,40,85,32,65,41,41,41,41,41,41,32,40,95,+52,50,54,32,95,49,52,49,41,41,41,41,41,41,41,41,41,32,40,67,+32,80,41,41,41,32,40,40,66,32,40,66,32,85,41,41,32,40,40,66,+32,40,67,32,66,41,41,32,95,52,54,51,41,41,41,41,41,32,40,40,+40,83,39,32,40,83,39,32,66,41,41,32,40,40,66,32,40,66,32,95,+52,54,50,41,41,32,40,40,40,67,39,32,66,41,32,95,57,54,50,41,+32,95,49,54,49,50,41,41,41,32,40,40,66,32,40,66,32,95,57,55,+51,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,95,50,54,+49,41,32,95,57,54,57,41,41,32,95,52,49,49,41,41,41,41,41,41,+41,41,32,40,40,40,67,39,32,66,41,32,40,66,39,32,95,52,54,51,+41,41,32,40,40,40,67,39,32,66,41,32,95,52,54,51,41,32,40,95,+52,54,50,32,35,52,54,41,41,41,41,41,41,41,32,40,40,40,67,39,+32,66,41,32,40,66,39,32,40,40,40,83,39,32,67,39,41,32,40,40,+66,32,40,83,39,32,95,52,54,50,41,41,32,40,40,40,67,39,32,66,+41,32,95,57,54,49,41,32,95,51,52,53,41,41,41,32,40,40,66,32,+40,67,39,32,95,57,55,51,41,41,32,40,40,40,67,39,32,66,41,32,+40,40,66,32,95,50,54,49,41,32,95,57,54,57,41,41,32,95,52,49,+49,41,41,41,41,41,32,95,52,54,51,41,41,41,41,32,40,40,65,32,+58,57,55,54,32,40,40,66,32,89,41,32,40,40,40,83,39,32,40,67,+39,32,67,41,41,32,40,40,66,32,40,66,32,40,40,83,39,32,83,39,+41,32,40,40,67,32,61,61,41,32,35,48,41,41,41,41,32,40,40,40,+83,39,32,66,41,32,40,40,66,32,40,83,39,32,83,41,41,32,40,40,+66,32,40,66,32,40,67,32,83,41,41,41,32,40,40,66,32,40,66,32,+40,40,83,39,32,40,67,39,32,66,41,41,32,40,67,32,40,40,67,32,+61,61,41,32,35,49,50,51,41,41,41,41,41,32,40,40,66,32,40,66,+32,40,83,32,80,41,41,41,32,40,40,66,32,40,66,32,40,40,67,39,+32,40,67,39,32,66,41,41,32,40,67,32,40,40,67,32,61,61,41,32,+35,52,53,41,41,41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,+66,32,95,57,55,54,41,32,40,40,67,32,95,57,54,57,41,32,35,50,+41,41,41,32,40,40,67,32,40,95,52,55,57,32,95,50,55,55,41,41,+32,35,49,41,41,41,41,41,41,41,41,32,40,40,40,83,39,32,66,41,+32,40,40,66,32,40,83,39,32,83,41,41,32,40,40,66,32,40,66,32,+40,67,32,83,41,41,41,32,40,40,66,32,40,66,32,40,40,83,39,32,+40,67,39,32,66,41,41,32,40,67,32,40,40,67,32,61,61,41,32,35,+52,53,41,41,41,41,41,32,40,40,66,32,40,66,32,40,83,32,80,41,+41,41,32,40,40,66,32,40,66,32,40,40,67,39,32,40,67,39,32,66,+41,41,32,40,67,32,40,40,67,32,61,61,41,32,35,49,50,53,41,41,+41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,95,57,55,+54,41,32,40,40,67,32,95,57,54,57,41,32,35,50,41,41,41,32,40,+40,67,32,40,95,52,56,48,32,95,50,55,55,41,41,32,35,49,41,41,+41,41,41,41,41,41,32,40,40,40,83,39,32,66,41,32,40,40,66,32,+40,83,39,32,83,41,41,32,40,40,66,32,40,66,32,40,67,32,83,41,+41,41,32,40,40,66,32,40,66,32,40,40,67,39,32,40,67,39,32,66,+41,41,32,40,67,32,40,40,67,32,61,61,41,32,35,49,48,41,41,41,+41,41,32,40,40,66,32,95,57,55,54,41,32,95,57,54,56,41,41,41,+41,41,32,40,40,66,32,40,40,67,39,32,40,83,39,32,83,41,41,32,+40,40,66,32,40,66,32,40,67,32,83,41,41,41,32,40,66,32,40,40,+67,39,32,40,67,39,32,66,41,41,32,40,67,32,40,40,67,32,61,61,+41,32,35,49,51,41,41,41,41,41,41,41,32,40,40,40,83,39,32,66,+41,32,40,40,66,32,80,41,32,40,40,40,67,39,32,79,41,32,40,40,+67,32,95,57,54,52,41,32,34,85,110,99,108,111,115,101,100,32,123,45,+32,99,111,109,109,101,110,116,34,41,41,32,75,41,41,41,32,40,40,66,+32,90,41,32,40,40,66,32,95,57,55,54,41,32,40,40,67,32,95,57,+54,57,41,32,35,49,41,41,41,41,41,41,41,41,41,41,32,95,57,55,+51,41,41,41,32,40,40,65,32,58,57,55,55,32,40,40,66,32,89,41,+32,40,40,40,67,39,32,66,41,32,40,40,66,32,83,41,32,40,40,66,+32,40,83,32,83,41,41,32,40,40,66,32,40,66,32,40,66,32,90,41,+41,41,32,40,40,66,32,40,66,32,40,40,67,39,32,67,41,32,40,67,+32,40,40,67,32,61,61,41,32,35,49,48,41,41,41,41,41,32,95,57,+55,51,41,41,41,41,41,32,40,40,66,32,40,80,32,95,52,54,49,41,+41,32,75,41,41,41,41,32,40,40,65,32,58,57,55,56,32,40,40,83,+32,40,40,83,32,83,41,32,40,40,66,32,40,66,32,90,41,41,32,40,+40,66,32,40,40,67,39,32,67,41,32,40,40,40,83,39,32,67,41,32,+40,40,40,83,39,32,67,41,32,40,40,40,83,39,32,67,41,32,40,40,+40,83,39,32,67,41,32,40,40,40,83,39,32,67,41,32,40,40,40,83,+39,32,67,41,32,40,40,40,83,39,32,80,41,32,40,90,32,40,90,32,+75,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,+32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,+75,41,41,41,32,40,90,32,75,41,41,41,32,75,41,41,41,32,75,41,+41,41,41,32,40,40,40,83,39,32,95,52,54,50,41,32,40,40,66,32,+95,57,54,54,41,32,95,57,56,52,41,41,32,73,41,41,41,32,40,40,+65,32,58,57,55,57,32,40,40,66,32,89,41,32,40,40,40,67,39,32,+66,41,32,40,66,39,32,40,40,66,32,40,83,39,32,40,83,39,32,66,+41,41,41,32,40,40,66,32,40,66,32,40,66,32,83,41,41,41,32,40,+40,66,32,40,66,32,40,66,32,85,41,41,41,32,40,40,40,67,39,32,+40,67,39,32,40,67,39,32,67,41,41,41,32,40,40,66,32,40,66,32,+80,41,41,32,40,40,40,67,39,32,66,41,32,95,57,54,52,41,32,40,+40,66,32,40,95,52,54,51,32,34,85,110,109,97,116,99,104,101,100,32,+34,41,41,32,40,40,67,32,79,41,32,75,41,41,41,41,41,32,95,52,+54,49,41,41,41,41,41,41,32,40,40,40,83,39,32,40,83,39,32,40,+83,39,32,40,83,39,32,40,83,39,32,40,67,39,32,40,67,39,32,66,+41,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,+32,40,66,32,40,66,32,40,67,32,40,40,67,32,61,61,41,32,35,57,+50,41,41,41,41,41,41,41,41,32,40,40,66,32,40,40,83,39,32,40,+83,39,32,40,83,39,32,40,83,39,32,83,41,41,41,41,32,40,40,66,+32,40,66,32,40,66,32,40,66,32,40,67,32,83,41,41,41,41,41,32,+40,40,66,32,40,40,67,39,32,66,41,32,40,66,39,32,40,40,66,32,+40,67,39,32,40,67,39,32,66,41,41,41,32,40,40,66,32,67,41,32,+40,95,50,48,50,32,95,49,51,49,41,41,41,41,41,41,32,40,40,66,+32,40,66,32,40,66,32,67,41,41,41,32,40,40,66,32,40,67,39,32,+80,41,41,32,40,40,67,32,66,41,32,95,52,50,51,41,41,41,41,41,+41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,+80,32,40,40,40,110,111,77,97,116,99,104,32,34,115,114,99,47,77,105,+99,114,111,72,115,47,76,101,120,46,104,115,34,41,32,35,49,53,56,41,+32,35,49,41,41,41,41,41,41,41,32,40,40,40,67,39,32,40,67,39,+32,40,67,39,32,40,67,39,32,66,41,41,41,41,32,40,40,66,32,40,+66,32,40,66,32,66,39,41,41,41,32,40,40,67,32,40,67,39,32,40,+67,39,32,66,41,41,41,32,40,40,67,32,40,95,52,55,57,32,95,50,+55,55,41,41,32,35,49,41,41,41,41,32,40,67,32,95,52,54,50,41,+41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,40,67,39,+32,66,41,32,40,40,66,32,67,41,32,40,40,66,32,95,57,56,48,41,+32,40,40,67,32,40,95,52,55,57,32,95,50,55,55,41,41,32,35,49,+41,41,41,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,+39,32,66,41,41,41,32,40,40,66,32,40,66,32,66,39,41,41,32,40,+66,32,40,66,32,67,41,41,41,41,32,40,67,32,95,52,54,50,41,41,+41,41,41,41,41,32,40,40,65,32,58,57,56,48,32,40,40,40,83,39,+32,83,41,32,40,40,66,32,40,67,32,83,41,41,32,40,40,66,32,40,+40,67,39,32,40,67,39,32,66,41,41,32,40,67,32,40,40,67,32,61,+61,41,32,35,49,49,48,41,41,41,41,32,40,40,66,32,67,41,32,40,+40,66,32,40,80,32,35,49,48,41,41,32,40,40,67,32,40,95,52,55,+57,32,95,50,55,55,41,41,32,35,49,41,41,41,41,41,41,32,40,40,+40,83,39,32,83,41,32,40,40,66,32,40,67,32,83,41,41,32,40,40,+66,32,40,40,67,39,32,40,67,39,32,66,41,41,32,40,67,32,40,40,+67,32,61,61,41,32,35,49,49,52,41,41,41,41,32,40,40,66,32,67,+41,32,40,40,66,32,40,80,32,35,49,51,41,41,32,40,40,67,32,40,+95,52,55,57,32,95,50,55,55,41,41,32,35,49,41,41,41,41,41,41,+32,40,40,40,83,39,32,83,41,32,40,40,66,32,40,67,32,83,41,41,+32,40,40,66,32,40,40,67,39,32,40,67,39,32,66,41,41,32,40,67,+32,40,40,67,32,61,61,41,32,35,49,49,54,41,41,41,41,32,40,40,+66,32,67,41,32,40,40,66,32,40,80,32,35,57,41,41,32,40,40,67,+32,40,95,52,55,57,32,95,50,55,55,41,41,32,35,49,41,41,41,41,+41,41,32,40,40,40,83,39,32,83,41,32,40,40,66,32,40,67,32,83,+41,41,32,40,40,66,32,40,40,67,39,32,40,67,39,32,66,41,41,32,+40,67,32,40,40,67,32,61,61,41,32,35,57,56,41,41,41,41,32,40,+40,66,32,67,41,32,40,40,66,32,40,80,32,35,56,41,41,32,40,40,+67,32,40,95,52,55,57,32,95,50,55,55,41,41,32,35,49,41,41,41,+41,41,41,32,40,40,40,83,39,32,80,41,32,40,40,40,67,39,32,67,+41,32,40,80,32,35,56,56,41,41,32,95,52,54,49,41,41,32,40,40,+66,32,40,66,32,67,41,41,32,40,40,66,32,40,67,32,80,41,41,32,+40,40,67,32,40,95,52,55,57,32,95,50,55,55,41,41,32,35,49,41,+41,41,41,41,41,41,41,41,32,40,40,65,32,58,57,56,49,32,40,40,+67,32,40,95,52,51,50,32,95,49,51,49,41,41,32,34,40,41,91,93,+44,123,125,96,59,34,41,41,32,40,40,65,32,58,57,56,50,32,40,40,+66,32,40,66,32,40,66,32,40,67,32,40,95,52,50,54,32,95,57,49,+50,41,41,41,41,41,32,40,40,40,83,39,32,40,83,39,32,40,83,39,+32,40,83,39,32,83,41,41,41,41,32,40,40,66,32,40,66,32,40,66,+32,40,66,32,40,67,32,83,41,41,41,41,41,32,40,40,66,32,40,66,+32,40,66,32,40,66,32,40,40,83,39,32,40,67,39,32,66,41,41,32,+40,67,32,40,40,67,32,61,61,41,32,35,52,54,41,41,41,41,41,41,+41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,40,83,39,32,+83,41,32,85,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,+40,66,32,40,66,32,40,66,32,90,41,41,41,41,41,41,32,40,40,40,+83,39,32,40,83,39,32,40,83,39,32,40,83,39,32,40,67,39,32,40,+83,39,32,67,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,+32,40,66,32,40,40,67,39,32,66,41,32,40,40,66,32,67,41,32,40,+40,66,32,40,40,83,39,32,67,39,41,32,95,49,51,57,41,41,32,40,+40,40,67,39,32,67,41,32,40,40,66,32,40,40,83,39,32,83,39,41,+32,95,49,51,56,41,41,32,40,40,40,67,39,32,40,67,39,32,66,41,+41,32,40,67,32,95,57,49,49,41,41,32,40,85,32,95,57,49,49,41,+41,41,41,32,40,85,32,95,57,49,50,41,41,41,41,41,41,41,41,41,+32,40,40,40,67,39,32,40,67,39,32,66,41,41,32,40,40,66,32,40,+66,32,83,41,41,32,40,40,66,32,40,67,39,32,95,57,56,50,41,41,+32,40,40,40,67,39,32,66,41,32,40,40,66,32,95,50,54,49,41,32,+95,57,54,57,41,41,32,40,40,66,32,40,40,95,52,55,57,32,95,50,+55,55,41,32,40,40,95,52,56,53,32,95,50,55,55,41,32,40,95,51,+53,57,32,35,49,41,41,41,41,32,95,52,49,49,41,41,41,41,41,32,+40,67,32,95,52,54,50,41,41,41,41,32,40,40,66,32,40,66,32,40,+66,32,40,66,32,40,40,67,39,32,67,41,32,40,67,32,95,52,50,54,+41,41,41,41,41,41,32,40,40,66,32,40,40,67,39,32,40,67,39,32,+40,83,39,32,40,83,39,32,66,41,41,41,41,32,40,40,40,67,39,32,+66,41,32,40,66,39,32,95,57,56,51,41,41,32,40,40,66,32,40,66,+32,95,52,50,51,41,41,32,40,67,32,95,52,54,50,41,41,41,41,41,+32,40,40,66,32,40,66,32,40,66,32,95,57,55,51,41,41,41,32,40,+40,40,67,39,32,66,41,32,40,66,39,32,40,40,66,32,95,50,54,49,+41,32,95,57,54,57,41,41,41,32,40,40,40,67,39,32,66,41,32,40,+40,66,32,40,95,52,55,57,32,95,50,55,55,41,41,32,40,40,66,32,+40,40,95,52,55,57,32,95,50,55,55,41,32,40,40,95,52,56,53,32,+95,50,55,55,41,32,40,95,51,53,57,32,35,49,41,41,41,41,32,95,+52,49,49,41,41,41,32,95,52,49,49,41,41,41,41,41,41,41,41,41,+41,41,32,40,40,66,32,40,40,67,39,32,40,67,39,32,40,83,39,32,+66,41,41,41,32,40,40,66,32,40,66,32,40,66,32,95,52,54,50,41,+41,41,32,40,40,40,67,39,32,66,41,32,95,57,53,56,41,32,95,52,+50,51,41,41,41,41,32,40,40,66,32,40,66,32,95,57,55,51,41,41,+32,40,40,40,67,39,32,66,41,32,40,40,66,32,95,50,54,49,41,32,+95,57,54,57,41,41,32,95,52,49,49,41,41,41,41,41,41,32,40,40,+65,32,58,57,56,51,32,40,40,66,32,40,66,32,40,40,83,39,32,67,+41,32,40,40,67,32,40,40,40,67,39,32,83,39,41,32,40,40,66,32,+83,39,41,32,40,40,67,32,40,95,52,51,50,32,95,49,51,51,41,41,+32,40,40,79,32,34,108,101,116,34,41,32,40,40,79,32,34,119,104,101,+114,101,34,41,32,40,40,79,32,34,100,111,34,41,32,40,40,79,32,34,+111,102,34,41,32,75,41,41,41,41,41,41,41,32,40,67,32,95,52,54,+50,41,41,41,32,40,40,66,32,40,67,32,95,52,54,50,41,41,32,40,+40,83,32,40,40,83,32,83,41,32,40,40,40,83,39,32,40,67,39,32,+40,67,39,32,66,41,41,41,32,40,40,40,67,39,32,40,83,39,32,67,+41,41,32,40,40,40,67,39,32,40,83,39,32,67,41,41,32,40,40,66,+32,40,40,83,39,32,67,41,32,40,40,40,83,39,32,67,41,32,40,40,+40,83,39,32,67,41,32,40,40,40,83,39,32,67,41,32,40,40,40,83,+39,32,80,41,32,40,90,32,40,90,32,75,41,41,41,32,40,90,32,75,+41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,+40,90,32,75,41,41,41,41,32,40,40,66,32,90,41,32,40,40,67,39,+32,67,41,32,40,67,32,40,40,67,32,61,61,41,32,35,49,50,51,41,+41,41,41,41,41,32,40,90,32,75,41,41,41,32,75,41,41,32,40,40,+66,32,90,41,32,40,40,40,67,39,32,83,41,32,40,40,66,32,40,67,+32,83,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,40,67,+39,32,40,83,39,32,67,41,41,32,40,40,40,67,39,32,40,83,39,32,+67,41,41,32,40,40,40,67,39,32,40,83,39,32,67,41,41,32,40,40,+66,32,40,40,83,39,32,67,41,32,40,40,40,83,39,32,67,41,32,40,+40,40,83,39,32,67,41,32,40,40,40,83,39,32,67,41,32,40,40,40,+83,39,32,80,41,32,40,90,32,40,90,32,75,41,41,41,32,40,90,32,+75,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,+32,40,90,32,75,41,41,41,41,32,40,40,66,32,90,41,32,40,40,67,+39,32,67,41,32,40,67,32,40,40,67,32,61,61,41,32,35,49,50,51,+41,41,41,41,41,41,32,40,90,32,75,41,41,41,32,75,41,41,32,75,+41,41,41,41,32,40,40,40,83,39,32,95,52,54,50,41,32,40,40,66,+32,95,57,54,53,41,32,95,57,56,52,41,41,32,73,41,41,41,41,41,+41,32,40,40,40,83,39,32,95,52,54,50,41,32,40,40,66,32,95,57,+54,53,41,32,95,57,56,52,41,41,32,73,41,41,41,41,41,41,41,32,+95,57,53,56,41,41,32,40,40,65,32,58,57,56,52,32,40,40,80,32,+40,40,95,57,55,48,32,35,48,41,32,35,49,41,41,32,40,90,32,40,+40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,+40,67,32,40,40,67,32,40,40,80,32,40,90,32,75,41,41,32,75,41,+41,32,75,41,41,32,75,41,41,32,75,41,41,32,75,41,41,32,75,41,+41,32,73,41,41,32,73,41,41,41,41,32,40,40,65,32,58,57,56,53,+32,40,40,66,32,89,41,32,40,40,40,83,39,32,40,83,39,32,83,41,+41,32,40,40,40,67,39,32,40,83,39,32,40,83,39,32,66,41,41,41,+32,40,40,40,67,39,32,66,41,32,40,66,39,32,83,41,41,32,40,40,+66,32,40,40,83,39,32,40,83,39,32,66,41,41,32,66,39,41,41,32,+40,40,66,32,40,66,32,40,40,83,39,32,66,41,32,40,66,39,32,40,+40,66,32,40,67,39,32,66,41,41,32,40,40,40,83,39,32,67,41,32,+40,40,40,83,39,32,67,41,32,40,40,40,83,39,32,67,41,32,40,40,+40,83,39,32,67,41,32,40,40,40,83,39,32,67,41,32,40,40,40,83,+39,32,67,41,32,40,40,40,83,39,32,80,41,32,40,90,32,40,90,32,+75,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,+32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,+75,41,41,41,32,40,90,32,75,41,41,41,32,75,41,41,41,41,41,41,+32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,+67,39,32,40,67,39,32,66,41,41,41,41,41,41,32,40,40,66,32,40,+40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,83,39,32,+67,41,41,41,41,41,32,40,40,66,32,40,66,32,40,40,83,39,32,66,+41,32,40,66,39,32,40,40,66,32,83,41,32,40,67,32,40,95,50,48,+50,32,95,50,56,49,41,41,41,41,41,41,41,32,40,40,66,32,40,40,+67,39,32,40,67,39,32,66,41,41,32,40,40,66,32,66,39,41,32,40,+40,66,32,40,66,32,67,41,41,32,40,40,67,39,32,67,41,32,40,67,+32,40,95,52,57,55,32,95,50,56,50,41,41,41,41,41,41,41,32,40,+40,66,32,40,66,32,40,40,67,39,32,95,52,54,50,41,32,40,40,40,+67,39,32,95,57,54,51,41,32,95,57,56,52,41,32,35,49,50,53,41,+41,41,41,32,40,67,32,95,57,56,53,41,41,41,41,41,41,32,40,40,+83,39,32,95,52,54,50,41,32,40,40,40,67,39,32,95,57,54,51,41,+32,95,57,56,52,41,32,35,53,57,41,41,41,41,32,95,57,55,49,41,+41,41,41,41,32,40,40,66,32,40,67,32,83,41,41,32,40,40,66,32,+40,40,67,39,32,40,67,39,32,66,41,41,32,40,40,40,83,39,32,67,+41,32,40,40,40,83,39,32,67,41,32,40,40,40,83,39,32,67,41,32,+40,40,40,83,39,32,67,41,32,40,40,40,83,39,32,67,41,32,40,40,+40,83,39,32,67,41,32,40,40,40,83,39,32,80,41,32,40,90,32,40,+90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,+41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,40,+90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,75,41,41,41,32,+90,41,41,41,41,32,40,40,40,83,39,32,66,41,32,40,40,66,32,83,+41,32,40,40,40,67,39,32,40,83,39,32,66,41,41,32,40,40,83,32,+40,40,40,67,39,32,83,39,41,32,83,39,41,32,40,40,67,32,83,41,+32,40,40,40,83,39,32,67,41,32,40,40,40,83,39,32,40,67,39,32,+67,39,41,41,32,40,40,40,83,39,32,67,41,32,40,40,40,83,39,32,+67,41,32,40,40,40,83,39,32,67,41,32,40,40,40,83,39,32,67,41,+32,40,40,40,83,39,32,67,41,32,40,40,40,83,39,32,80,41,32,40,+90,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,40,90,+32,75,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,+41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,40,40,+40,67,39,32,40,67,39,32,66,41,41,32,40,40,40,67,39,32,66,41,+32,40,40,66,32,83,41,32,40,67,32,40,40,67,32,40,95,52,57,57,+32,95,50,56,50,41,41,32,35,48,41,41,41,41,32,40,40,40,83,39,+32,66,41,32,40,40,66,32,95,52,54,50,41,32,40,40,40,67,39,32,+95,57,54,51,41,32,95,57,56,52,41,32,35,49,50,51,41,41,41,32,+40,40,67,39,32,95,57,56,53,41,32,40,40,67,32,79,41,32,75,41,+41,41,41,41,32,95,57,55,49,41,41,41,32,75,41,41,41,41,32,40,+40,40,67,39,32,40,83,39,32,66,41,41,32,40,40,66,32,40,66,32,+40,83,39,32,66,41,41,41,32,40,40,66,32,40,40,67,39,32,66,41,+32,83,41,41,32,40,40,40,67,39,32,40,67,39,32,40,83,39,32,67,+41,41,41,32,40,40,66,32,40,66,32,40,40,83,39,32,40,67,39,32,+67,39,41,41,32,40,40,40,83,39,32,67,41,32,40,40,40,83,39,32,+67,41,32,40,40,40,83,39,32,67,41,32,40,40,40,83,39,32,67,41,+32,40,40,40,83,39,32,67,41,32,40,40,40,83,39,32,80,41,32,40,+90,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,40,90,+32,75,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,+41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,41,41,32,+40,40,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,66,41,+41,41,41,32,40,40,66,32,40,40,67,39,32,40,67,39,32,66,41,41,+32,40,40,66,32,40,66,32,83,41,41,32,40,40,66,32,67,41,32,40,+67,32,40,95,52,57,57,32,95,50,56,50,41,41,41,41,41,41,32,40,+40,66,32,40,40,83,39,32,66,41,32,40,40,66,32,95,52,54,50,41,+32,40,40,40,67,39,32,95,57,54,51,41,32,95,57,56,52,41,32,35,+49,50,51,41,41,41,41,32,40,40,66,32,40,67,39,32,95,57,56,53,+41,41,32,40,67,32,95,52,54,50,41,41,41,41,41,32,95,57,55,49,+41,41,41,32,75,41,41,41,41,32,40,40,66,32,40,40,83,39,32,40,+67,39,32,66,41,41,32,40,67,32,40,40,67,32,61,61,41,32,35,48,+41,41,41,41,32,40,40,67,32,40,83,39,32,66,41,41,32,40,40,40,+83,39,32,40,67,39,32,40,67,39,32,67,41,41,41,32,40,40,40,83,+39,32,40,67,39,32,40,67,39,32,67,41,41,41,32,40,40,40,83,39,+32,40,67,39,32,67,41,41,32,40,40,40,83,39,32,66,41,32,40,40,+66,32,40,83,39,32,67,39,41,41,32,40,40,40,83,39,32,67,41,32,+40,40,40,83,39,32,67,41,32,40,40,40,83,39,32,67,41,32,40,40,+40,83,39,32,80,41,32,40,90,32,40,90,32,75,41,41,41,32,40,90,+32,75,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,+41,32,40,90,32,75,41,41,41,41,32,40,40,66,32,40,66,32,40,66,+32,90,41,41,41,32,40,40,40,67,39,32,66,41,32,40,66,39,32,40,+66,39,32,40,40,66,32,67,41,32,40,67,32,40,40,67,32,61,61,41,+32,35,49,50,53,41,41,41,41,41,41,32,40,40,66,32,40,40,67,39,+32,66,41,32,95,52,54,50,41,41,32,95,57,56,53,41,41,41,41,41,+32,40,90,32,75,41,41,41,32,75,41,41,32,75,41,41,41,41,41,41,+32,40,40,67,32,83,41,32,40,40,66,32,90,41,32,40,40,40,83,39,+32,67,41,32,40,40,40,83,39,32,67,41,32,40,40,40,83,39,32,67,+41,32,40,40,40,83,39,32,67,41,32,40,40,40,83,39,32,67,41,32,+40,40,40,83,39,32,67,41,32,40,40,40,83,39,32,67,41,32,40,40,+40,83,39,32,80,41,32,40,90,32,40,90,32,75,41,41,41,32,40,90,+32,75,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,+41,32,40,90,32,75,41,41,41,32,40,40,40,67,39,32,66,41,32,40,+40,66,32,67,41,32,40,67,32,40,40,67,32,61,61,41,32,35,49,50,+53,41,41,41,41,32,40,40,40,67,39,32,95,52,54,50,41,32,40,40,+67,32,95,57,54,52,41,32,34,108,97,121,111,117,116,32,101,114,114,111,+114,32,125,34,41,41,32,95,52,54,49,41,41,41,41,32,40,90,32,75,+41,41,41,32,75,41,41,32,75,41,41,41,41,41,41,32,40,40,40,83,+39,32,66,41,32,40,40,66,32,83,41,32,40,40,66,32,40,67,32,83,+41,41,32,40,40,40,67,39,32,40,83,39,32,40,67,39,32,67,41,41,+41,32,40,40,40,67,39,32,40,83,39,32,40,67,39,32,67,41,41,41,+32,40,40,40,67,39,32,40,83,39,32,67,41,41,32,40,40,66,32,40,+40,83,39,32,40,83,39,32,67,39,41,41,32,40,40,40,83,39,32,67,+41,32,40,40,40,83,39,32,67,41,32,40,40,40,83,39,32,67,41,32,+40,40,40,83,39,32,80,41,32,40,90,32,40,90,32,75,41,41,41,32,+40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,+41,41,41,32,40,90,32,75,41,41,41,41,32,40,40,66,32,40,66,32,+40,66,32,90,41,41,41,32,40,40,66,32,40,40,67,39,32,66,41,32,+40,66,39,32,40,40,66,32,67,41,32,40,67,32,40,40,67,32,61,61,+41,32,35,49,50,51,41,41,41,41,41,41,32,40,40,66,32,40,40,67,+39,32,66,41,32,95,52,54,50,41,41,32,40,40,66,32,95,57,56,53,+41,32,40,95,52,54,50,32,40,40,95,52,56,53,32,95,50,55,55,41,+32,40,95,51,53,57,32,35,48,41,41,41,41,41,41,41,41,41,32,40,+90,32,75,41,41,41,32,75,41,41,32,75,41,41,41,41,32,40,40,40,+67,39,32,66,41,32,40,40,66,32,67,41,32,40,40,66,32,40,83,32,+73,41,41,32,40,40,40,67,39,32,67,41,32,40,40,67,32,40,40,40,+67,39,32,83,39,41,32,83,39,41,32,40,40,40,67,39,32,66,41,32,+40,85,32,95,52,54,49,41,41,32,40,90,32,75,41,41,41,41,32,40,+40,66,32,90,41,32,40,40,40,67,39,32,66,41,32,40,40,67,32,67,+39,41,32,40,40,66,32,40,95,52,54,50,32,40,40,95,57,54,51,32,+40,40,95,57,55,48,32,35,48,41,32,35,48,41,41,32,35,49,50,53,+41,41,41,32,40,40,67,32,95,57,56,53,41,32,95,52,54,49,41,41,+41,41,32,40,90,32,75,41,41,41,41,41,32,40,40,40,110,111,77,97,+116,99,104,32,34,115,114,99,47,77,105,99,114,111,72,115,47,76,101,120,+46,104,115,34,41,32,35,50,49,57,41,32,35,49,41,41,41,41,41,32,+40,40,67,39,32,66,41,32,95,52,54,50,41,41,41,41,41,41,41,32,+40,40,65,32,58,57,56,54,32,40,40,95,51,57,57,32,40,40,40,67,+39,32,66,41,32,40,40,66,32,40,95,52,55,57,32,95,51,48,56,41,+41,32,40,40,67,32,40,95,52,56,49,32,95,51,48,56,41,41,32,40,+40,95,52,56,53,32,95,51,48,56,41,32,40,95,51,53,57,32,35,49,+54,41,41,41,41,41,32,40,40,66,32,40,95,51,55,50,32,95,50,55,+56,41,41,32,95,49,52,54,41,41,41,32,40,95,51,53,57,32,35,48,+41,41,41,32,40,40,65,32,58,57,56,55,32,34,118,53,46,49,92,49,+48,38,34,41,32,40,40,65,32,58,57,56,56,32,34,48,46,56,34,41,+32,40,40,65,32,58,57,56,57,32,40,40,40,95,51,50,32,95,49,52,+53,50,41,32,95,49,52,50,54,41,32,40,40,66,32,40,40,95,51,50,+32,95,49,52,53,50,41,32,40,95,49,52,50,57,32,34,77,72,83,68,+73,82,34,41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,+40,67,32,40,40,40,83,39,32,83,41,32,40,40,40,67,39,32,67,41,+32,40,40,66,32,40,40,83,39,32,67,39,41,32,40,40,95,52,51,50,+32,95,49,51,51,41,32,34,45,45,118,101,114,115,105,111,110,34,41,41,+41,32,40,40,66,32,40,67,32,40,40,40,67,39,32,83,39,41,32,40,+95,51,57,54,32,40,40,95,50,54,51,32,40,40,67,32,40,95,50,48,+51,32,95,49,51,51,41,41,32,40,40,79,32,35,52,53,41,32,75,41,+41,41,32,40,95,52,48,57,32,35,49,41,41,41,41,32,95,57,52,50,+41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,80,41,+41,41,32,40,40,40,67,39,32,40,67,39,32,66,41,41,32,95,57,57,+48,41,32,40,95,56,57,56,32,40,40,40,95,56,56,57,32,34,99,111,+109,109,97,110,100,45,108,105,110,101,34,41,32,35,48,41,32,35,48,41,+41,41,41,32,40,75,32,40,75,32,40,95,50,52,32,34,85,115,97,103,+101,58,32,109,104,115,32,91,45,118,93,32,91,45,108,93,32,91,45,114,+93,32,91,45,99,93,32,91,45,105,80,65,84,72,93,32,91,45,111,70,+73,76,69,93,32,91,77,111,100,117,108,101,78,97,109,101,93,34,41,41,+41,41,41,41,41,32,40,40,95,50,54,49,32,95,49,52,55,50,41,32,+40,40,95,52,54,51,32,34,77,105,99,114,111,72,115,44,32,118,101,114,+115,105,111,110,32,34,41,32,40,40,95,52,54,51,32,95,57,56,56,41,+32,40,40,95,52,54,51,32,34,44,32,99,111,109,98,105,110,97,116,111,+114,32,102,105,108,101,32,118,101,114,115,105,111,110,32,34,41,32,95,57,+56,55,41,41,41,41,41,41,32,40,40,40,67,39,32,83,41,32,40,40,+40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,66,32,+40,83,32,40,40,40,83,39,32,95,54,48,48,41,32,40,40,66,32,95,+52,49,49,41,32,40,95,51,57,54,32,40,40,67,32,40,95,50,48,50,+32,95,49,51,51,41,41,32,34,45,118,34,41,41,41,41,32,40,40,95,+52,51,50,32,95,49,51,51,41,32,34,45,114,34,41,41,41,41,32,40,+40,66,32,40,66,32,40,95,52,54,50,32,40,40,79,32,35,52,54,41,+32,75,41,41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,+95,52,54,50,41,32,40,40,67,32,95,52,54,51,41,32,34,47,108,105,+98,34,41,41,41,32,40,40,66,32,95,52,55,50,41,32,40,95,51,57,+53,32,40,40,95,52,49,54,32,95,49,51,49,41,32,34,45,105,34,41,+41,41,41,41,41,41,32,40,40,66,32,40,95,50,54,49,32,95,52,50,+56,41,41,32,40,40,40,67,39,32,95,52,54,51,41,32,40,40,66,32,+95,52,55,50,41,32,40,95,51,57,53,32,40,40,95,52,49,54,32,95,+49,51,49,41,32,34,45,111,34,41,41,41,41,32,40,40,79,32,34,111,+117,116,46,99,111,109,98,34,41,32,75,41,41,41,41,41,32,40,40,95,+52,51,50,32,95,49,51,51,41,32,34,45,108,34,41,41,41,32,40,40,+95,52,51,50,32,95,49,51,51,41,32,34,45,99,34,41,41,41,41,41,+32,40,95,52,50,52,32,40,40,67,32,40,95,50,48,51,32,95,49,51,+51,41,41,32,34,45,45,34,41,41,41,41,32,40,95,52,55,49,32,40,+40,79,32,35,52,54,41,32,75,41,41,41,41,41,41,32,40,40,65,32,+58,57,57,48,32,40,40,40,67,39,32,83,41,32,40,40,66,32,40,40,+83,39,32,83,39,41,32,95,54,48,54,41,41,32,40,40,66,32,40,40,+83,39,32,40,83,39,32,40,95,51,50,32,95,49,52,53,50,41,41,41,+32,95,54,49,53,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,+32,40,40,95,51,50,32,95,49,52,53,50,41,32,95,49,52,55,57,41,+41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,66,41,41,32,40,+40,66,32,40,66,32,40,67,39,32,67,41,41,41,32,40,40,40,67,39,+32,40,67,39,32,40,83,39,32,40,67,39,32,67,41,41,41,41,32,40,+40,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,67,41,41,+41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,+32,40,67,39,32,83,39,41,41,41,41,41,32,40,40,66,32,40,66,32,+40,66,32,40,66,32,40,66,32,67,41,41,41,41,41,32,40,40,66,32,+40,40,83,39,32,66,41,32,40,66,39,32,40,66,39,32,40,40,66,32,+40,83,39,32,66,41,41,32,40,40,66,32,40,66,32,40,95,51,51,32,+95,49,52,53,50,41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,+66,32,95,50,54,49,41,32,40,40,66,32,40,95,52,53,32,95,49,52,+53,50,41,41,32,40,40,40,67,39,32,40,95,52,57,57,32,95,50,56,+50,41,41,32,95,54,48,49,41,32,35,48,41,41,41,41,32,40,40,66,+32,40,95,50,54,49,32,95,49,52,55,50,41,41,32,40,40,66,32,40,+95,52,54,51,32,34,116,111,112,32,108,101,118,101,108,32,100,101,102,110,+115,58,32,34,41,41,32,40,95,49,53,57,48,32,95,50,56,51,41,41,+41,41,41,41,41,41,41,41,32,40,40,66,32,40,40,83,39,32,40,83,+39,32,66,41,41,32,40,40,66,32,66,39,41,32,40,40,66,32,66,39,+41,32,40,40,66,32,66,39,41,32,40,40,66,32,40,66,32,40,95,51,+51,32,95,49,52,53,50,41,41,41,32,40,40,40,67,39,32,66,41,32,+40,40,66,32,95,50,54,49,41,32,40,40,66,32,40,95,52,53,32,95,+49,52,53,50,41,41,32,40,40,40,67,39,32,40,95,52,57,57,32,95,+50,56,50,41,41,32,95,54,48,49,41,32,35,49,41,41,41,41,32,40,+40,95,52,52,32,95,49,52,53,50,41,32,40,85,32,40,40,66,32,40,+66,32,40,95,50,54,49,32,95,49,52,55,50,41,41,41,32,40,40,40,+67,39,32,66,41,32,40,40,66,32,95,52,54,51,41,32,95,57,48,50,+41,41,32,40,40,66,32,40,95,52,54,51,32,34,32,61,32,34,41,41,+32,40,40,67,32,95,54,57,57,41,32,75,41,41,41,41,41,41,41,41,+41,41,41,41,41,32,40,40,40,67,39,32,67,41,32,40,40,66,32,40,+40,83,39,32,83,39,41,32,40,40,66,32,67,39,41,32,40,40,66,32,+83,39,41,32,40,40,66,32,67,39,41,32,40,40,66,32,67,39,41,32,+95,54,48,50,41,41,41,41,41,41,32,40,40,40,67,39,32,40,67,39,+32,66,41,41,32,40,40,66,32,40,66,32,40,67,39,32,66,41,41,41,+32,40,40,66,32,40,66,32,66,39,41,41,32,40,40,66,32,40,66,32,+66,39,41,41,32,40,40,66,32,40,66,32,40,66,32,40,40,83,39,32,+40,95,51,51,32,95,49,52,53,50,41,41,32,40,40,40,67,39,32,95,+49,52,56,49,41,32,95,52,49,49,41,32,40,40,95,51,52,32,95,49,+52,53,50,41,32,95,49,51,52,49,41,41,41,41,41,41,32,40,40,66,+32,40,66,32,40,66,32,40,66,32,40,40,95,51,50,32,95,49,52,53,+50,41,32,95,49,52,55,57,41,41,41,41,41,32,40,40,66,32,40,40,+83,39,32,40,67,39,32,66,41,41,32,40,40,66,32,40,66,32,40,67,+39,32,40,95,51,51,32,95,49,52,53,50,41,41,41,41,32,40,40,40,+67,39,32,66,41,32,40,66,39,32,40,40,66,32,95,50,54,49,41,32,+40,40,66,32,40,95,52,53,32,95,49,52,53,50,41,41,32,40,40,40,+67,39,32,40,95,52,57,57,32,95,50,56,50,41,41,32,95,54,48,49,+41,32,35,48,41,41,41,41,41,32,40,40,66,32,40,66,32,40,95,50,+54,49,32,95,49,52,55,50,41,41,41,32,40,40,66,32,40,66,32,40,+95,52,54,51,32,34,102,105,110,97,108,32,112,97,115,115,32,32,32,32,+32,32,32,32,32,32,32,32,34,41,41,41,32,40,40,40,67,39,32,40,+67,39,32,95,52,54,51,41,41,32,40,40,66,32,40,66,32,40,95,49,+54,49,48,32,35,54,41,41,41,32,40,40,66,32,40,66,32,40,95,49,+53,57,48,32,95,50,56,51,41,41,41,32,40,67,32,40,95,52,56,48,+32,95,50,55,55,41,41,41,41,41,32,34,109,115,34,41,41,41,41,41,+41,41,32,40,40,40,67,39,32,40,83,39,32,67,41,41,32,40,40,40,+67,39,32,40,67,39,32,40,83,39,32,83,41,41,41,32,40,40,66,32,+40,66,32,40,66,32,40,83,32,40,40,95,52,50,48,32,95,49,51,49,+41,32,34,46,99,111,109,98,34,41,41,41,41,41,32,40,40,40,67,39,+32,40,67,39,32,40,83,39,32,83,41,41,41,32,40,40,66,32,40,66,+32,40,66,32,40,83,32,40,40,95,52,50,48,32,95,49,51,49,41,32,+34,46,99,34,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,+40,66,32,40,40,95,51,50,32,95,49,52,53,50,41,32,40,95,49,52,+56,52,32,34,109,104,115,99,46,99,34,41,41,41,41,41,41,32,40,40,+66,32,40,66,32,40,66,32,40,66,32,85,41,41,41,41,32,40,40,66,+32,40,66,32,40,40,67,39,32,66,41,32,40,66,39,32,40,40,66,32,+40,83,39,32,40,95,51,51,32,95,49,52,53,50,41,41,41,32,40,40,+66,32,40,40,67,39,32,95,50,54,49,41,32,95,49,52,55,49,41,41,+32,95,57,57,52,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,+66,32,40,66,32,40,40,67,39,32,40,95,51,51,32,95,49,52,53,50,+41,41,32,95,49,52,53,57,41,41,41,41,41,32,40,40,66,32,40,66,+32,40,66,32,40,66,32,40,40,95,51,50,32,95,49,52,53,50,41,32,+95,49,52,55,57,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,+32,40,66,32,40,66,32,40,40,95,51,50,32,95,49,52,53,50,41,32,+40,95,49,52,50,57,32,34,77,72,83,67,67,34,41,41,41,41,41,41,+41,32,40,40,66,32,40,40,67,39,32,66,41,32,40,40,66,32,40,83,+39,32,40,67,39,32,66,41,41,41,32,40,40,40,83,39,32,66,41,32,+40,66,39,32,40,40,66,32,40,83,39,32,40,95,51,51,32,95,49,52,+53,50,41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,95,+50,54,49,41,32,40,40,66,32,40,95,52,53,32,95,49,52,53,50,41,+41,32,40,40,40,67,39,32,40,95,52,57,57,32,95,50,56,50,41,41,+32,95,54,48,49,41,32,35,48,41,41,41,41,32,40,40,66,32,40,95,+50,54,49,32,95,49,52,55,50,41,41,32,40,40,66,32,40,95,52,54,+51,32,34,69,120,101,99,117,116,101,58,32,34,41,41,32,40,95,49,53,+57,48,32,40,95,51,57,49,32,95,49,52,57,41,41,41,41,41,41,41,+41,32,40,40,66,32,40,66,32,40,66,32,40,40,67,39,32,40,95,51,+51,32,95,49,52,53,50,41,41,32,95,49,52,57,49,41,41,41,41,32,+40,40,66,32,40,40,67,39,32,66,41,32,40,40,66,32,40,95,51,51,+32,95,49,52,53,50,41,41,32,95,49,52,50,53,41,41,41,32,40,40,+66,32,40,66,32,40,40,95,51,50,32,95,49,52,53,50,41,32,95,49,+52,55,57,41,41,41,32,40,40,40,67,39,32,66,41,32,40,66,39,32,+40,40,66,32,95,50,54,49,41,32,40,40,66,32,40,95,52,53,32,95,+49,52,53,50,41,41,32,40,40,40,67,39,32,40,95,52,57,57,32,95,+50,56,50,41,41,32,95,54,48,49,41,32,35,48,41,41,41,41,41,32,+40,40,66,32,40,66,32,40,95,50,54,49,32,95,49,52,55,50,41,41,+41,32,40,40,66,32,40,66,32,40,95,52,54,51,32,34,67,32,99,111,+109,112,105,108,97,116,105,111,110,32,32,32,32,32,32,32,32,32,34,41,+41,41,32,40,40,40,67,39,32,40,67,39,32,95,52,54,51,41,41,32,+40,40,66,32,40,66,32,40,95,49,54,49,48,32,35,54,41,41,41,32,+40,40,66,32,40,66,32,40,95,49,53,57,48,32,95,50,56,51,41,41,+41,32,40,67,32,40,95,52,56,48,32,95,50,55,55,41,41,41,41,41,+32,34,109,115,34,41,41,41,41,41,41,41,41,41,41,41,32,40,40,66,+32,40,66,32,40,40,67,39,32,66,41,32,40,40,66,32,95,50,54,49,+41,32,40,40,95,52,54,48,32,95,49,51,49,41,32,34,36,73,78,34,+41,41,41,41,41,32,40,40,66,32,40,40,67,39,32,66,41,32,40,40,+95,52,54,48,32,95,49,51,49,41,32,34,36,79,85,84,34,41,41,41,+32,40,40,66,32,95,52,55,49,41,32,40,40,66,32,40,95,52,54,51,+32,34,99,99,32,45,119,32,45,87,97,108,108,32,45,79,51,32,34,41,+41,32,40,40,67,32,95,52,54,51,41,32,34,47,115,114,99,47,114,117,+110,116,105,109,101,47,101,118,97,108,46,99,32,36,73,78,32,45,108,109,+32,45,111,32,36,79,85,84,34,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,32,40,40,66,32,40,40,67,39,32,95,50,54,49,41,32,95,+49,52,55,52,41,41,32,95,57,57,52,41,41,41,41,32,40,67,32,95,+49,52,55,52,41,41,41,32,95,54,48,52,41,41,41,41,41,41,41,41,+32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,95,52,54,51,32,+95,57,56,55,41,41,41,41,41,32,40,40,66,32,40,66,32,40,40,67,+39,32,66,41,32,40,40,66,32,95,52,54,51,41,32,40,95,49,53,57,+48,32,95,50,56,51,41,41,41,41,41,32,40,40,66,32,40,66,32,40,+66,32,40,95,52,54,51,32,40,40,79,32,35,49,48,41,32,75,41,41,+41,41,41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,+66,32,40,40,67,39,32,67,41,32,40,40,66,32,40,40,83,39,32,95,+51,57,55,41,32,40,40,66,32,40,67,32,66,41,41,32,40,40,66,32,+40,66,32,40,67,32,66,41,41,41,32,40,40,66,32,40,66,32,90,41,+41,32,40,40,66,32,40,66,32,40,40,67,39,32,66,41,32,40,40,66,+32,95,50,54,51,41,32,40,40,66,32,95,52,54,51,41,32,40,40,66,+32,40,95,52,54,51,32,34,40,40,65,32,58,34,41,41,32,40,40,40,+67,39,32,95,52,54,51,41,32,40,95,49,53,57,48,32,95,50,56,51,+41,41,32,40,40,79,32,35,51,50,41,32,75,41,41,41,41,41,41,41,+41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,40,67,39,32,95,+50,54,51,41,41,32,40,40,66,32,40,66,32,95,54,57,57,41,41,32,+40,40,66,32,89,41,32,40,40,40,67,39,32,40,67,39,32,83,41,41,+32,40,40,40,67,39,32,40,67,39,32,83,41,41,32,40,40,40,67,39,+32,66,41,32,80,41,32,40,40,40,83,39,32,40,67,39,32,66,41,41,+32,40,66,32,95,54,55,54,41,41,32,73,41,41,41,32,40,90,32,75,+41,41,41,32,75,41,41,41,41,41,32,40,40,66,32,40,95,50,54,51,+32,40,95,52,54,51,32,34,41,32,34,41,41,41,32,40,40,67,32,95,+50,54,51,41,32,40,95,52,54,51,32,40,40,79,32,35,52,49,41,32,+75,41,41,41,41,41,41,41,41,41,41,41,32,40,40,66,32,40,66,32,+95,54,57,57,41,41,32,85,41,41,41,41,32,40,40,67,32,95,52,49,+50,41,32,40,40,95,49,56,52,32,95,49,57,56,41,32,40,40,95,52,+56,53,32,95,50,55,55,41,32,40,95,51,53,57,32,35,48,41,41,41,+41,41,41,32,75,41,41,41,41,41,41,41,32,40,40,66,32,40,66,32,+95,49,49,48,49,41,41,32,40,67,32,80,41,41,41,41,41,41,41,32,+40,40,66,32,40,40,83,39,32,95,50,54,49,41,32,40,40,66,32,95,+52,55,49,41,32,40,40,66,32,40,95,50,54,49,32,95,50,52,41,41,+32,40,40,66,32,40,95,52,54,51,32,34,109,97,105,110,58,32,102,105,+110,100,73,100,101,110,116,58,32,34,41,41,32,95,57,48,50,41,41,41,+41,41,32,40,67,32,95,57,50,56,41,41,41,41,32,95,57,50,54,41,+41,32,40,40,66,32,95,57,50,52,41,32,40,40,66,32,40,95,51,57,+52,32,40,85,32,40,40,67,32,66,41,32,40,40,66,32,90,41,32,40,+40,40,67,39,32,40,67,39,32,79,41,41,32,40,40,66,32,40,67,32,+80,41,41,32,40,40,66,32,40,95,50,54,49,32,95,54,55,53,41,41,+32,40,40,66,32,40,95,50,54,49,32,95,56,57,55,41,41,32,40,40,+66,32,40,95,52,54,51,32,40,40,79,32,35,57,53,41,32,75,41,41,+41,32,40,95,49,53,57,48,32,95,50,56,51,41,41,41,41,41,41,32,+75,41,41,41,41,41,41,32,40,40,67,32,95,52,49,50,41,32,40,40,+95,49,56,52,32,95,49,57,56,41,32,35,48,41,41,41,41,41,41,41,+32,40,40,67,32,95,57,48,53,41,32,40,95,56,57,55,32,34,109,97,+105,110,34,41,41,41,41,41,41,41,32,95,57,57,49,41,41,32,40,40,+65,32,58,57,57,49,32,40,40,40,83,39,32,40,67,39,32,40,95,51,+50,32,95,49,52,53,50,41,41,41,32,40,40,40,67,39,32,67,41,32,+95,54,49,51,41,32,95,54,49,49,41,41,32,40,40,66,32,85,41,32,+40,90,32,40,40,66,32,40,40,83,39,32,40,95,51,50,32,95,49,52,+53,50,41,41,32,40,40,40,67,39,32,95,49,52,56,49,41,32,95,50,+49,41,32,40,40,95,51,52,32,95,49,52,53,50,41,32,95,49,51,52,+49,41,41,41,41,32,40,40,66,32,40,66,32,85,41,41,32,40,40,40,+67,39,32,66,41,32,40,40,66,32,40,95,51,50,32,95,49,52,53,50,+41,41,32,40,40,40,67,39,32,95,49,52,54,52,41,32,95,54,48,52,+41,32,95,49,52,52,55,41,41,41,32,40,40,40,67,39,32,40,83,39,+32,40,95,51,51,32,95,49,52,53,50,41,41,41,32,40,67,32,95,49,+52,53,52,41,41,32,95,49,52,53,57,41,41,41,41,41,41,41,41,32,+40,40,65,32,58,57,57,50,32,40,40,66,32,89,41,32,40,40,66,32,+40,66,32,40,83,32,40,85,32,95,52,54,49,41,41,41,41,32,40,40,+66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,+40,40,66,32,40,40,67,39,32,66,41,32,40,40,66,32,40,40,83,39,+32,95,52,54,50,41,32,40,85,32,75,41,41,41,32,40,40,67,32,66,+41,32,40,85,32,65,41,41,41,41,41,32,95,52,50,50,41,41,41,41,+41,41,32,40,40,65,32,58,57,57,51,32,40,95,51,57,52,32,40,40,+40,67,39,32,95,52,54,51,41,32,40,40,66,32,40,95,49,53,57,48,+32,95,50,56,51,41,41,32,95,49,51,55,41,41,32,40,40,79,32,35,+52,52,41,32,75,41,41,41,41,32,40,40,65,32,58,57,57,52,32,40,+40,66,32,40,95,50,54,49,32,95,49,54,48,55,41,41,32,40,40,66,+32,40,95,52,54,51,32,40,40,79,32,34,115,116,97,116,105,99,32,117,+110,115,105,103,110,101,100,32,99,104,97,114,32,100,97,116,97,91,93,32,+61,32,123,34,41,32,75,41,41,41,32,40,40,40,83,39,32,95,52,54,+51,41,32,40,40,66,32,40,95,51,57,53,32,95,57,57,51,41,41,32,+40,95,57,57,50,32,35,50,48,41,41,41,32,40,40,66,32,40,79,32,+34,125,59,34,41,41,32,40,40,66,32,40,79,32,34,117,110,115,105,103,+110,101,100,32,99,104,97,114,32,42,99,111,109,98,101,120,112,114,32,61,+32,100,97,116,97,59,34,41,41,32,40,40,40,67,39,32,79,41,32,40,+40,66,32,40,95,52,54,51,32,34,105,110,116,32,99,111,109,98,101,120,+112,114,108,101,110,32,61,32,34,41,41,32,40,40,40,67,39,32,95,52,+54,51,41,32,40,40,66,32,40,95,49,53,57,48,32,95,50,56,51,41,+41,32,95,52,49,49,41,41,32,40,40,79,32,35,53,57,41,32,75,41,+41,41,41,32,75,41,41,41,41,41,41,41,32,40,40,65,32,58,57,57,+53,32,95,49,53,48,53,41,32,40,40,65,32,58,57,57,54,32,40,40,+40,67,39,32,40,67,39,32,67,41,41,32,40,40,40,67,39,32,40,67,+39,32,67,41,41,32,95,57,57,55,41,32,95,50,52,41,41,32,73,41,+41,32,40,40,65,32,58,57,57,55,32,40,40,40,67,39,32,40,67,39,+32,66,41,41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,+40,40,67,39,32,40,83,39,32,83,41,41,32,40,67,32,95,49,53,49,+51,41,41,32,40,40,66,32,40,66,32,40,66,32,40,95,50,54,49,32,+95,49,55,52,41,41,41,41,32,95,49,48,56,55,41,41,41,32,40,40,+67,32,40,40,67,32,83,41,32,40,40,66,32,40,67,32,66,41,41,32,+40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,67,32,40,40,+67,32,67,39,41,32,95,49,55,53,41,41,41,32,40,90,32,75,41,41,+41,41,41,41,32,40,40,95,50,54,49,32,95,49,55,52,41,32,34,65,+109,98,105,103,117,111,117,115,58,34,41,41,41,41,32,95,57,55,50,41,+41,32,40,40,65,32,58,57,57,56,32,40,40,40,95,51,50,32,95,49,+53,48,50,41,32,95,49,53,50,48,41,32,40,40,66,32,40,95,49,51,+32,95,49,53,48,49,41,41,32,40,40,66,32,95,57,56,52,41,32,40,+40,67,32,79,41,32,75,41,41,41,41,41,32,40,40,65,32,58,57,57,+57,32,40,40,40,95,49,54,32,95,49,53,48,49,41,32,95,49,48,48,+49,41,32,95,49,53,49,55,41,41,32,40,40,65,32,58,49,48,48,48,+32,40,40,40,95,49,54,32,95,49,53,48,49,41,32,95,49,48,54,55,+41,32,95,49,53,49,55,41,41,32,40,40,65,32,58,49,48,48,49,32,+40,40,40,95,49,52,32,95,49,53,48,49,41,32,40,40,40,95,49,52,+32,95,49,53,48,49,41,32,40,40,40,95,50,55,54,32,95,49,53,48,+48,41,32,95,55,50,51,41,32,40,40,40,95,49,53,32,95,49,53,48,+49,41,32,40,95,49,48,51,51,32,34,109,111,100,117,108,101,34,41,41,+32,95,49,48,48,55,41,41,41,32,40,40,40,95,49,54,32,95,49,53,+48,49,41,32,40,40,40,95,49,53,32,95,49,53,48,49,41,32,40,95,+49,48,49,51,32,35,52,48,41,41,32,40,40,95,49,53,50,53,32,95,+49,48,51,50,41,32,40,95,49,48,49,51,32,35,52,52,41,41,41,41,+32,40,95,49,48,49,51,32,35,52,49,41,41,41,41,32,40,40,40,95,+49,53,32,95,49,53,48,49,41,32,40,95,49,48,51,51,32,34,119,104,+101,114,101,34,41,41,32,40,95,49,48,51,52,32,95,49,48,51,53,41,+41,41,41,32,40,40,65,32,58,49,48,48,50,32,40,40,40,95,51,50,+32,95,49,53,48,50,41,32,95,57,57,53,41,32,40,40,66,32,40,95,+49,53,49,54,32,34,81,73,100,101,110,116,34,41,41,32,40,40,40,67,+39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,+67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,+32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,+40,40,67,39,32,80,41,32,40,40,66,32,40,66,32,40,66,32,40,83,+32,40,40,40,67,39,32,95,49,48,56,53,41,32,95,52,50,56,41,32,+95,52,55,54,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,+40,66,32,95,52,55,55,41,41,41,41,32,95,49,48,56,54,41,41,41,+32,40,75,32,40,75,32,95,52,55,54,41,41,41,41,32,40,75,32,40,+75,32,95,52,55,54,41,41,41,41,32,40,75,32,40,75,32,95,52,55,+54,41,41,41,41,32,40,75,32,40,75,32,95,52,55,54,41,41,41,41,+32,40,75,32,40,75,32,95,52,55,54,41,41,41,41,32,40,75,32,40,+75,32,95,52,55,54,41,41,41,41,32,40,75,32,95,52,55,54,41,41,+41,32,40,75,32,95,52,55,54,41,41,41,41,41,32,40,40,65,32,58,+49,48,48,51,32,40,40,40,95,51,50,32,95,49,53,48,50,41,32,95,+57,57,53,41,32,40,40,66,32,40,95,49,53,49,54,32,34,85,73,100,+101,110,116,34,41,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,+39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,+67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,+32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,80,41,32,40,+40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,66,32,40,66,32,+40,67,32,67,39,41,41,41,32,40,40,66,32,40,66,32,40,83,32,40,+40,40,67,39,32,95,49,51,57,41,32,95,52,50,56,41,32,95,52,55,+54,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,95,52,55,55,+41,41,41,32,95,56,57,57,41,41,41,41,32,40,75,32,40,75,32,95,+52,55,54,41,41,41,41,32,40,75,32,40,75,32,95,52,55,54,41,41,+41,41,32,40,75,32,40,75,32,95,52,55,54,41,41,41,41,32,40,75,+32,40,75,32,95,52,55,54,41,41,41,41,32,40,75,32,40,75,32,95,+52,55,54,41,41,41,41,32,40,75,32,40,75,32,95,52,55,54,41,41,+41,41,32,40,75,32,40,75,32,95,52,55,54,41,41,41,41,32,40,75,+32,95,52,55,54,41,41,41,32,40,75,32,95,52,55,54,41,41,41,41,+41,32,40,40,65,32,58,49,48,48,52,32,40,40,95,49,53,48,56,32,+95,49,48,48,51,41,32,95,49,48,48,54,41,41,32,40,40,65,32,58,+49,48,48,53,32,40,40,95,49,53,48,56,32,95,49,48,48,52,41,32,+40,95,49,48,50,57,32,95,49,48,50,48,41,41,41,32,40,40,65,32,+58,49,48,48,54,32,40,40,40,95,51,50,32,95,49,53,48,50,41,32,+95,57,57,53,41,32,40,40,66,32,40,40,95,51,50,32,95,49,53,48,+50,41,32,95,57,57,56,41,41,32,40,40,66,32,40,66,32,40,40,40,+83,39,32,95,49,53,48,56,41,32,40,40,40,83,39,32,95,49,53,48,+56,41,32,40,40,40,67,39,32,40,95,50,55,54,32,95,49,53,48,48,+41,41,32,40,40,67,32,95,50,54,51,41,32,40,95,51,57,53,32,40,+95,50,54,53,32,35,52,52,41,41,41,41,32,40,40,40,95,49,54,32,+95,49,53,48,49,41,32,40,40,40,95,49,53,32,95,49,53,48,49,41,+32,40,95,49,48,49,51,32,35,52,48,41,41,32,40,95,49,53,49,49,+32,40,95,49,48,49,51,32,35,52,52,41,41,41,41,32,40,95,49,48,+49,51,32,35,52,49,41,41,41,41,32,40,40,40,67,39,32,40,95,50,+55,51,32,95,49,53,48,48,41,41,32,40,85,32,34,40,41,34,41,41,+32,40,40,40,95,49,53,32,95,49,53,48,49,41,32,40,95,49,48,49,+51,32,35,52,48,41,41,32,40,95,49,48,49,51,32,35,52,49,41,41,+41,41,41,32,40,40,40,67,39,32,40,95,50,55,51,32,95,49,53,48,+48,41,41,32,40,85,32,34,91,93,34,41,41,32,40,40,40,95,49,53,+32,95,49,53,48,49,41,32,40,95,49,48,49,51,32,35,57,49,41,41,+32,40,95,49,48,49,51,32,35,57,51,41,41,41,41,41,41,32,95,56,+57,57,41,41,41,41,32,40,40,65,32,58,49,48,48,55,32,40,40,40,+95,51,50,32,95,49,53,48,50,41,32,95,57,57,53,41,32,40,40,66,+32,40,95,49,53,49,54,32,34,85,81,73,100,101,110,116,34,41,41,32,+40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,+40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,+39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,+67,41,32,40,40,40,67,39,32,80,41,32,40,40,66,32,40,66,32,40,+66,32,40,83,32,40,40,40,67,39,32,95,49,51,57,41,32,95,52,50,+56,41,32,95,52,55,54,41,41,41,41,41,32,40,40,66,32,40,66,32,+40,66,32,40,66,32,95,52,55,55,41,41,41,41,32,95,49,48,56,54,+41,41,41,32,40,75,32,40,75,32,95,52,55,54,41,41,41,41,32,40,+75,32,40,75,32,95,52,55,54,41,41,41,41,32,40,75,32,40,75,32,+95,52,55,54,41,41,41,41,32,40,75,32,40,75,32,95,52,55,54,41,+41,41,41,32,40,75,32,40,75,32,95,52,55,54,41,41,41,41,32,40,+75,32,40,75,32,95,52,55,54,41,41,41,41,32,40,75,32,95,52,55,+54,41,41,41,32,40,75,32,95,52,55,54,41,41,41,41,41,32,40,40,+65,32,58,49,48,48,56,32,40,40,95,49,53,48,56,32,95,49,48,48,+55,41,32,95,49,48,48,54,41,41,32,40,40,65,32,58,49,48,48,57,+32,40,40,40,95,51,50,32,95,49,53,48,50,41,32,95,57,57,53,41,+32,40,40,66,32,40,95,49,53,49,54,32,34,76,73,100,101,110,116,34,+41,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,+32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,+40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,+67,39,32,67,41,32,40,40,40,67,39,32,80,41,32,40,40,40,67,39,+32,40,67,39,32,67,41,41,32,40,40,66,32,40,66,32,40,67,32,67,+39,41,41,41,32,40,40,66,32,40,66,32,40,83,32,40,40,67,32,40,+40,40,83,39,32,95,49,50,49,41,32,40,40,66,32,95,57,49,51,41,+32,95,52,50,56,41,41,32,40,40,66,32,95,49,50,50,41,32,40,40,+67,32,40,95,52,51,50,32,95,49,51,51,41,41,32,95,49,48,49,50,+41,41,41,41,32,95,52,55,54,41,41,41,41,32,40,40,66,32,40,66,+32,40,66,32,95,52,55,55,41,41,41,32,95,56,57,57,41,41,41,41,+32,40,75,32,40,75,32,95,52,55,54,41,41,41,41,32,40,75,32,40,+75,32,95,52,55,54,41,41,41,41,32,40,75,32,40,75,32,95,52,55,+54,41,41,41,41,32,40,75,32,40,75,32,95,52,55,54,41,41,41,41,+32,40,75,32,40,75,32,95,52,55,54,41,41,41,41,32,40,75,32,40,+75,32,95,52,55,54,41,41,41,41,32,40,75,32,40,75,32,95,52,55,+54,41,41,41,41,32,40,75,32,95,52,55,54,41,41,41,32,40,75,32,+95,52,55,54,41,41,41,41,41,32,40,40,65,32,58,49,48,49,48,32,+40,40,40,95,51,50,32,95,49,53,48,50,41,32,95,57,57,53,41,32,+40,40,66,32,40,95,49,53,49,54,32,34,76,81,73,100,101,110,116,34,+41,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,+32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,+40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,+67,39,32,67,41,32,40,40,40,67,39,32,80,41,32,40,40,66,32,40,+66,32,40,66,32,40,83,32,40,40,67,32,40,40,40,83,39,32,95,49,+50,49,41,32,40,40,66,32,95,57,49,51,41,32,95,52,50,56,41,41,+32,40,40,66,32,95,49,50,50,41,32,40,40,67,32,40,95,52,51,50,+32,95,49,51,51,41,41,32,95,49,48,49,50,41,41,41,41,32,95,52,+55,54,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,+32,95,52,55,55,41,41,41,41,32,95,49,48,56,54,41,41,41,32,40,+75,32,40,75,32,95,52,55,54,41,41,41,41,32,40,75,32,40,75,32,+95,52,55,54,41,41,41,41,32,40,75,32,40,75,32,95,52,55,54,41,+41,41,41,32,40,75,32,40,75,32,95,52,55,54,41,41,41,41,32,40,+75,32,40,75,32,95,52,55,54,41,41,41,41,32,40,75,32,40,75,32,+95,52,55,54,41,41,41,41,32,40,75,32,95,52,55,54,41,41,41,32,+40,75,32,95,52,55,54,41,41,41,41,41,32,40,40,65,32,58,49,48,+49,49,32,40,40,95,49,53,48,56,32,95,49,48,48,52,41,32,40,95,+49,48,50,57,32,95,49,48,49,55,41,41,41,32,40,40,65,32,58,49,+48,49,50,32,40,40,79,32,34,99,97,115,101,34,41,32,40,40,79,32,+34,99,108,97,115,115,34,41,32,40,40,79,32,34,100,97,116,97,34,41,+32,40,40,79,32,34,100,101,102,97,117,108,116,34,41,32,40,40,79,32,+34,100,111,34,41,32,40,40,79,32,34,101,108,115,101,34,41,32,40,40,+79,32,34,102,111,114,97,108,108,34,41,32,40,40,79,32,34,102,111,114,+101,105,103,110,34,41,32,40,40,79,32,34,105,102,34,41,32,40,40,79,+32,34,105,109,112,111,114,116,34,41,32,40,40,79,32,34,105,110,34,41,+32,40,40,79,32,34,105,110,102,105,120,34,41,32,40,40,79,32,34,105,+110,102,105,120,108,34,41,32,40,40,79,32,34,105,110,102,105,120,114,34,+41,32,40,40,79,32,34,105,110,115,116,97,110,99,101,34,41,32,40,40,+79,32,34,108,101,116,34,41,32,40,40,79,32,34,109,111,100,117,108,101,+34,41,32,40,40,79,32,34,110,101,119,116,121,112,101,34,41,32,40,40,+79,32,34,111,102,34,41,32,40,40,79,32,34,112,114,105,109,105,116,105,+118,101,34,41,32,40,40,79,32,34,116,104,101,110,34,41,32,40,40,79,+32,34,116,121,112,101,34,41,32,40,40,79,32,34,119,104,101,114,101,34,+41,32,75,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,32,40,40,65,32,58,49,48,49,51,32,40,40,+66,32,40,40,95,50,55,51,32,95,49,53,48,48,41,32,95,49,51,52,+49,41,41,32,40,40,40,83,39,32,95,49,53,49,53,41,32,40,40,67,+32,79,41,32,75,41,41,32,40,40,40,67,39,32,67,41,32,40,40,40,+67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,66,32,40,+67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,80,32,40,75,+32,40,75,32,40,75,32,95,49,50,52,41,41,41,41,32,40,75,32,40,+75,32,95,49,50,52,41,41,41,41,32,40,75,32,40,75,32,95,49,50,+52,41,41,41,41,32,40,75,32,40,75,32,95,49,50,52,41,41,41,41,+32,40,75,32,40,75,32,95,49,50,52,41,41,41,41,41,32,40,90,32,+40,95,50,48,50,32,95,49,51,49,41,41,41,41,32,40,75,32,40,75,+32,95,49,50,52,41,41,41,41,32,40,75,32,95,49,50,52,41,41,41,+32,40,75,32,95,49,50,52,41,41,41,41,41,32,40,40,65,32,58,49,+48,49,52,32,40,40,66,32,40,40,95,50,55,51,32,95,49,53,48,48,+41,32,95,49,51,52,49,41,41,32,40,40,83,32,95,49,53,49,53,41,+32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,+40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,+67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,+32,67,41,32,40,40,40,67,39,32,80,41,32,40,90,32,40,40,40,67,+39,32,67,41,32,40,40,66,32,40,67,32,67,39,41,41,32,40,67,32,+40,95,50,48,50,32,95,49,51,51,41,41,41,41,32,40,75,32,40,75,+32,95,49,50,52,41,41,41,41,41,32,40,75,32,40,75,32,95,49,50,+52,41,41,41,41,32,40,75,32,40,75,32,95,49,50,52,41,41,41,41,+32,40,75,32,40,75,32,95,49,50,52,41,41,41,41,32,40,75,32,40,+75,32,95,49,50,52,41,41,41,41,32,40,75,32,40,75,32,95,49,50,+52,41,41,41,41,32,40,75,32,40,75,32,95,49,50,52,41,41,41,41,+32,40,75,32,95,49,50,52,41,41,41,32,40,75,32,95,49,50,52,41,+41,41,41,41,32,40,40,65,32,58,49,48,49,53,32,40,40,95,49,53,+48,56,32,95,49,48,49,54,41,32,40,40,40,95,49,54,32,95,49,53,+48,49,41,32,40,40,40,95,49,53,32,95,49,53,48,49,41,32,40,95,+49,48,49,51,32,35,57,54,41,41,32,95,49,48,48,50,41,41,32,40,+95,49,48,49,51,32,35,57,54,41,41,41,41,32,40,40,65,32,58,49,+48,49,54,32,40,40,40,95,51,50,32,95,49,53,48,50,41,32,95,57,+57,53,41,32,40,40,66,32,40,95,49,53,49,54,32,34,81,83,121,109,+79,112,101,114,34,41,41,32,40,40,40,67,39,32,67,41,32,40,40,40,+67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,+32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,+41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,80,41,32,+40,40,66,32,40,66,32,40,66,32,40,83,32,40,40,67,32,40,40,40,+83,39,32,95,49,50,49,41,32,40,40,66,32,95,49,50,50,41,32,40,+40,66,32,95,49,48,56,53,41,32,95,52,50,56,41,41,41,32,40,40,+66,32,95,49,50,50,41,32,40,40,67,32,40,95,52,51,50,32,95,49,+51,51,41,41,32,95,49,48,50,53,41,41,41,41,32,95,52,55,54,41,+41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,95,52,+55,55,41,41,41,41,32,95,49,48,56,54,41,41,41,32,40,75,32,40,+75,32,95,52,55,54,41,41,41,41,32,40,75,32,40,75,32,95,52,55,+54,41,41,41,41,32,40,75,32,40,75,32,95,52,55,54,41,41,41,41,+32,40,75,32,40,75,32,95,52,55,54,41,41,41,41,32,40,75,32,40,+75,32,95,52,55,54,41,41,41,41,32,40,75,32,40,75,32,95,52,55,+54,41,41,41,41,32,40,75,32,95,52,55,54,41,41,41,32,40,75,32,+95,52,55,54,41,41,41,41,41,32,40,40,65,32,58,49,48,49,55,32,+40,40,40,95,51,50,32,95,49,53,48,50,41,32,95,57,57,53,41,32,+40,40,66,32,40,95,49,53,49,54,32,34,83,121,109,79,112,101,114,34,+41,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,+32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,+40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,+67,39,32,67,41,32,40,40,40,67,39,32,80,41,32,40,40,40,67,39,+32,40,67,39,32,67,41,41,32,40,40,66,32,40,66,32,40,67,32,67,+39,41,41,41,32,40,40,66,32,40,66,32,40,83,32,40,40,67,32,40,+40,40,83,39,32,95,49,50,49,41,32,40,40,66,32,95,49,50,50,41,+32,40,40,66,32,95,49,48,56,53,41,32,95,52,50,56,41,41,41,32,+40,40,66,32,95,49,50,50,41,32,40,40,67,32,40,95,52,51,50,32,+95,49,51,51,41,41,32,95,49,48,50,53,41,41,41,41,32,95,52,55,+54,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,95,52,55,55,+41,41,41,32,95,56,57,57,41,41,41,41,32,40,75,32,40,75,32,95,+52,55,54,41,41,41,41,32,40,75,32,40,75,32,95,52,55,54,41,41,+41,41,32,40,75,32,40,75,32,95,52,55,54,41,41,41,41,32,40,75,+32,40,75,32,95,52,55,54,41,41,41,41,32,40,75,32,40,75,32,95,+52,55,54,41,41,41,41,32,40,75,32,40,75,32,95,52,55,54,41,41,+41,41,32,40,75,32,40,75,32,95,52,55,54,41,41,41,41,32,40,75,+32,95,52,55,54,41,41,41,32,40,75,32,95,52,55,54,41,41,41,41,+41,32,40,40,65,32,58,49,48,49,56,32,40,40,40,95,51,50,32,95,+49,53,48,50,41,32,95,49,48,49,54,41,32,40,40,40,83,39,32,40,+95,51,51,32,95,49,53,48,50,41,41,32,40,40,66,32,40,95,49,48,+32,95,49,53,48,52,41,41,32,95,49,48,49,57,41,41,32,40,95,49,+51,32,95,49,53,48,49,41,41,41,41,32,40,40,65,32,58,49,48,49,+57,32,40,40,95,50,54,51,32,40,40,67,32,40,95,50,48,50,32,95,+49,51,49,41,41,32,35,53,56,41,41,32,40,40,95,50,54,51,32,95,+52,50,56,41,32,95,57,48,48,41,41,41,32,40,40,65,32,58,49,48,+50,48,32,40,40,40,95,51,50,32,95,49,53,48,50,41,32,95,49,48,+49,55,41,32,40,40,40,83,39,32,40,95,51,51,32,95,49,53,48,50,+41,41,32,40,40,66,32,40,95,49,48,32,95,49,53,48,52,41,41,32,+95,49,48,49,57,41,41,32,40,95,49,51,32,95,49,53,48,49,41,41,+41,41,32,40,40,65,32,58,49,48,50,49,32,40,40,40,95,51,50,32,+95,49,53,48,50,41,32,95,49,48,49,54,41,32,40,40,40,83,39,32,+40,95,51,51,32,95,49,53,48,50,41,41,32,40,40,66,32,40,95,49,+48,32,95,49,53,48,52,41,41,32,40,40,66,32,95,49,50,50,41,32,+95,49,48,49,57,41,41,41,32,40,95,49,51,32,95,49,53,48,49,41,+41,41,41,32,40,40,65,32,58,49,48,50,50,32,40,40,95,49,53,48,+56,32,95,49,48,50,49,41,32,95,49,48,50,51,41,41,32,40,40,65,+32,58,49,48,50,51,32,40,40,40,95,51,50,32,95,49,53,48,50,41,+32,95,57,57,53,41,32,40,40,66,32,40,95,49,53,49,54,32,34,45,+62,34,41,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,+67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,+32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,+40,40,67,39,32,67,41,32,40,40,40,67,39,32,80,41,32,40,40,66,+32,40,66,32,40,66,32,40,83,32,40,40,67,32,40,40,67,32,101,113,+117,97,108,41,32,34,45,62,34,41,41,32,95,52,55,54,41,41,41,41,+41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,95,52,55,55,41,+41,41,41,32,95,49,48,56,54,41,41,41,32,40,75,32,40,75,32,95,+52,55,54,41,41,41,41,32,40,75,32,40,75,32,95,52,55,54,41,41,+41,41,32,40,75,32,40,75,32,95,52,55,54,41,41,41,41,32,40,75,+32,40,75,32,95,52,55,54,41,41,41,41,32,40,75,32,40,75,32,95,+52,55,54,41,41,41,41,32,40,75,32,40,75,32,95,52,55,54,41,41,+41,41,32,40,75,32,95,52,55,54,41,41,41,32,40,75,32,95,52,55,+54,41,41,41,41,41,32,40,40,65,32,58,49,48,50,52,32,40,40,40,+95,51,50,32,95,49,53,48,50,41,32,95,49,48,49,55,41,32,40,40,+40,83,39,32,40,95,51,51,32,95,49,53,48,50,41,41,32,40,40,66,+32,40,95,49,48,32,95,49,53,48,52,41,41,32,40,40,66,32,95,49,+50,50,41,32,95,49,48,49,57,41,41,41,32,40,95,49,51,32,95,49,+53,48,49,41,41,41,41,32,40,40,65,32,58,49,48,50,53,32,40,40,+79,32,40,40,79,32,35,54,49,41,32,75,41,41,32,40,40,79,32,40,+40,79,32,35,49,50,52,41,32,75,41,41,32,40,40,79,32,34,58,58,+34,41,32,40,40,79,32,34,60,45,34,41,32,40,40,79,32,40,40,79,+32,35,54,52,41,32,75,41,41,32,40,40,79,32,34,46,46,34,41,32,+40,40,79,32,34,45,62,34,41,32,75,41,41,41,41,41,41,41,41,32,+40,40,65,32,58,49,48,50,54,32,40,40,95,49,53,48,56,32,95,49,+48,48,56,41,32,40,95,49,48,50,57,32,95,49,48,49,56,41,41,41,+32,40,40,65,32,58,49,48,50,55,32,40,40,95,49,53,48,56,32,95,+49,48,49,48,41,32,40,95,49,48,50,57,32,95,49,48,50,50,41,41,+41,32,40,40,65,32,58,49,48,50,56,32,40,40,95,49,53,48,56,32,+95,49,48,48,57,41,32,40,95,49,48,50,57,32,95,49,48,50,52,41,+41,41,32,40,40,65,32,58,49,48,50,57,32,40,40,40,67,39,32,40,+95,49,54,32,95,49,53,48,49,41,41,32,40,40,95,49,53,32,95,49,+53,48,49,41,32,40,95,49,48,49,51,32,35,52,48,41,41,41,32,40,+95,49,48,49,51,32,35,52,49,41,41,41,32,40,40,65,32,58,49,48,+51,48,32,40,40,40,95,51,50,32,95,49,53,48,50,41,32,95,57,57,+53,41,32,40,40,66,32,40,95,49,53,49,54,32,34,108,105,116,101,114,+97,108,34,41,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,+32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,+41,32,40,40,40,83,39,32,67,41,32,40,40,40,83,39,32,67,41,32,+40,40,40,83,39,32,67,41,32,40,40,66,32,40,80,32,40,75,32,40,+75,32,40,75,32,95,52,55,54,41,41,41,41,41,32,40,40,66,32,40,+67,32,66,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,95,+52,55,55,41,41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,+32,40,67,39,32,40,67,39,32,95,55,52,55,41,41,41,32,95,56,56,+57,41,41,32,95,55,56,48,41,41,41,41,41,32,40,40,66,32,40,67,+32,66,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,95,52,+55,55,41,41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,+40,67,39,32,40,67,39,32,95,55,52,55,41,41,41,32,95,56,56,57,+41,41,32,95,55,55,57,41,41,41,41,41,32,40,40,66,32,40,67,32,+66,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,95,52,55,+55,41,41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,40,+67,39,32,40,67,39,32,95,55,52,55,41,41,41,32,95,56,56,57,41,+41,32,95,55,55,54,41,41,41,41,41,32,40,40,66,32,40,67,32,66,+41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,95,52,55,55,+41,41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,40,67,+39,32,40,67,39,32,95,55,52,55,41,41,41,32,95,56,56,57,41,41,+32,95,55,55,56,41,41,41,41,41,32,40,75,32,40,75,32,95,52,55,+54,41,41,41,41,32,40,75,32,40,75,32,95,52,55,54,41,41,41,41,+32,40,75,32,95,52,55,54,41,41,41,32,40,75,32,95,52,55,54,41,+41,41,41,41,32,40,40,65,32,58,49,48,51,49,32,40,40,95,49,53,+49,54,32,34,115,116,114,105,110,103,34,41,32,40,40,67,32,40,40,67,+32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,+32,40,40,80,32,40,75,32,40,75,32,40,75,32,95,52,55,54,41,41,+41,41,32,40,75,32,95,52,55,55,41,41,41,32,40,75,32,40,75,32,+95,52,55,54,41,41,41,41,32,40,75,32,40,75,32,95,52,55,54,41,+41,41,41,32,40,75,32,40,75,32,95,52,55,54,41,41,41,41,32,40,+75,32,40,75,32,95,52,55,54,41,41,41,41,32,40,75,32,40,75,32,+95,52,55,54,41,41,41,41,32,40,75,32,95,52,55,54,41,41,41,32,+40,75,32,95,52,55,54,41,41,41,41,32,40,40,65,32,58,49,48,51,+50,32,40,40,95,49,53,48,56,32,40,40,95,49,53,48,56,32,40,40,+95,49,53,48,56,32,40,40,40,95,50,55,54,32,95,49,53,48,48,41,+32,95,55,50,52,41,32,40,40,40,95,49,53,32,95,49,53,48,49,41,+32,40,95,49,48,51,51,32,34,109,111,100,117,108,101,34,41,41,32,95,+49,48,48,56,41,41,41,32,40,40,40,95,50,55,54,32,95,49,53,48,+48,41,32,95,55,50,53,41,32,40,40,40,95,49,54,32,95,49,53,48,+49,41,32,40,40,40,95,49,54,32,95,49,53,48,49,41,32,40,40,40,+95,49,54,32,95,49,53,48,49,41,32,95,49,48,50,54,41,32,40,95,+49,48,49,51,32,35,52,48,41,41,41,32,40,95,49,48,49,52,32,34,+46,46,34,41,41,41,32,40,95,49,48,49,51,32,35,52,49,41,41,41,+41,41,32,40,40,40,95,50,55,54,32,95,49,53,48,48,41,32,95,55,+50,54,41,32,95,49,48,50,54,41,41,41,32,40,40,40,95,50,55,54,+32,95,49,53,48,48,41,32,95,55,50,55,41,32,95,49,48,50,55,41,+41,41,32,40,40,65,32,58,49,48,51,51,32,40,40,66,32,40,40,95,+50,55,51,32,95,49,53,48,48,41,32,95,49,51,52,49,41,41,32,40,+40,83,32,95,49,53,49,53,41,32,40,40,40,67,39,32,67,41,32,40,+40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,+67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,+32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,80,+41,32,40,90,32,40,40,40,67,39,32,67,41,32,40,40,66,32,40,67,+32,67,39,41,41,32,40,95,50,48,50,32,95,49,51,51,41,41,41,32,+40,75,32,40,75,32,95,49,50,52,41,41,41,41,41,32,40,75,32,40,+75,32,95,49,50,52,41,41,41,41,32,40,75,32,40,75,32,95,49,50,+52,41,41,41,41,32,40,75,32,40,75,32,95,49,50,52,41,41,41,41,+32,40,75,32,40,75,32,95,49,50,52,41,41,41,41,32,40,75,32,40,+75,32,95,49,50,52,41,41,41,41,32,40,75,32,40,75,32,95,49,50,+52,41,41,41,41,32,40,75,32,95,49,50,52,41,41,41,32,40,75,32,+95,49,50,52,41,41,41,41,41,32,40,40,65,32,58,49,48,51,52,32,+40,40,66,32,40,40,95,51,51,32,95,49,53,48,50,41,32,40,95,49,+48,49,51,32,35,49,50,51,41,41,41,32,40,40,40,67,39,32,40,95,+51,50,32,95,49,53,48,50,41,41,32,40,40,67,32,95,49,53,50,52,+41,32,40,95,49,48,49,51,32,35,53,57,41,41,41,32,40,40,66,32,+40,40,95,51,51,32,95,49,53,48,50,41,32,40,95,49,53,49,50,32,+40,95,49,48,49,51,32,35,53,57,41,41,41,41,32,40,40,66,32,40,+40,95,51,51,32,95,49,53,48,50,41,32,40,95,49,48,49,51,32,35,+49,50,53,41,41,41,32,40,95,49,51,32,95,49,53,48,49,41,41,41,+41,41,41,32,40,40,65,32,58,49,48,51,53,32,40,40,95,49,53,48,+56,32,40,40,95,49,53,48,56,32,40,40,95,49,53,48,56,32,40,40,+95,49,53,48,56,32,40,40,95,49,53,48,56,32,40,40,95,49,53,48,+56,32,40,40,95,49,53,48,56,32,40,40,95,49,53,48,56,32,40,40,+95,49,53,48,56,32,40,40,95,49,53,48,56,32,40,40,40,95,49,52,+32,95,49,53,48,49,41,32,40,40,40,95,50,55,54,32,95,49,53,48,+48,41,32,95,55,50,56,41,32,40,40,40,95,49,53,32,95,49,53,48,+49,41,32,40,95,49,48,51,51,32,34,100,97,116,97,34,41,41,32,95,+49,48,52,50,41,41,41,32,40,40,95,49,53,48,56,32,40,40,40,95,+49,53,32,95,49,53,48,49,41,32,40,95,49,48,49,52,32,40,40,79,+32,35,54,49,41,32,75,41,41,41,32,40,40,95,49,53,50,51,32,95,+49,48,51,55,41,32,40,95,49,48,49,52,32,40,40,79,32,35,49,50,+52,41,32,75,41,41,41,41,41,32,40,40,95,49,51,32,95,49,53,48,+49,41,32,95,52,54,49,41,41,41,41,32,40,40,40,95,49,52,32,95,+49,53,48,49,41,32,40,40,40,95,50,55,54,32,95,49,53,48,48,41,+32,95,55,50,57,41,32,40,40,40,95,49,53,32,95,49,53,48,49,41,+32,40,95,49,48,51,51,32,34,110,101,119,116,121,112,101,34,41,41,32,+95,49,48,52,50,41,41,41,32,40,40,40,95,49,53,32,95,49,53,48,+49,41,32,40,95,49,48,49,52,32,40,40,79,32,35,54,49,41,32,75,+41,41,41,32,40,40,40,95,49,52,32,95,49,53,48,49,41,32,40,40,+40,95,50,55,54,32,95,49,53,48,48,41,32,40,40,95,55,57,53,32,+95,52,54,49,41,32,95,52,54,49,41,41,32,95,49,48,48,53,41,41,+32,40,40,40,95,51,50,32,95,49,53,48,50,41,32,95,49,48,51,56,+41,32,40,40,40,83,39,32,40,95,51,51,32,95,49,53,48,50,41,41,+32,40,40,66,32,40,95,50,54,49,32,40,95,49,48,32,95,49,53,48,+52,41,41,41,32,40,40,40,67,39,32,40,95,50,48,50,32,95,50,56,+49,41,41,32,40,40,95,49,55,55,32,95,52,49,49,41,32,95,52,49,+49,41,41,32,35,49,41,41,41,32,40,95,49,51,32,95,49,53,48,49,+41,41,41,41,41,41,41,41,32,40,40,40,95,49,52,32,95,49,53,48,+49,41,32,40,40,40,95,50,55,54,32,95,49,53,48,48,41,32,95,55,+51,48,41,32,40,40,40,95,49,53,32,95,49,53,48,49,41,32,40,95,+49,48,51,51,32,34,116,121,112,101,34,41,41,32,95,49,48,52,50,41,+41,41,32,40,40,40,95,49,53,32,95,49,53,48,49,41,32,40,95,49,+48,49,52,32,40,40,79,32,35,54,49,41,32,75,41,41,41,32,95,49,+48,52,55,41,41,41,41,32,40,40,40,95,50,55,54,32,95,49,53,48,+48,41,32,40,95,50,54,56,32,95,55,51,49,41,41,32,95,49,48,54,+48,41,41,41,32,40,40,40,95,49,52,32,95,49,53,48,49,41,32,40,+40,40,95,50,55,54,32,95,49,53,48,48,41,32,95,55,51,50,41,32,+40,40,40,95,49,54,32,95,49,53,48,49,41,32,95,49,48,50,56,41,+32,40,95,49,48,49,52,32,34,58,58,34,41,41,41,41,32,95,49,48,+52,55,41,41,41,32,40,40,40,95,50,55,54,32,95,49,53,48,48,41,+32,95,55,51,51,41,32,40,40,40,95,49,53,32,95,49,53,48,49,41,+32,40,95,49,48,51,51,32,34,105,109,112,111,114,116,34,41,41,32,95,+49,48,52,51,41,41,41,41,32,40,40,40,95,49,52,32,95,49,53,48,+49,41,32,40,40,40,95,49,52,32,95,49,53,48,49,41,32,40,40,40,+95,50,55,54,32,95,49,53,48,48,41,32,95,55,51,52,41,32,40,40,+40,95,49,53,32,95,49,53,48,49,41,32,40,40,40,95,49,53,32,95,+49,53,48,49,41,32,40,40,40,95,49,53,32,95,49,53,48,49,41,32,+40,95,49,48,51,51,32,34,102,111,114,101,105,103,110,34,41,41,32,40,+95,49,48,51,51,32,34,105,109,112,111,114,116,34,41,41,41,32,40,95,+49,48,51,51,32,34,99,99,97,108,108,34,41,41,41,32,95,49,48,51,+49,41,41,41,32,95,49,48,48,57,41,41,32,40,40,40,95,49,53,32,+95,49,53,48,49,41,32,40,95,49,48,49,52,32,34,58,58,34,41,41,+32,95,49,48,52,55,41,41,41,41,32,40,40,40,95,49,52,32,95,49,+53,48,49,41,32,40,40,40,95,50,55,54,32,95,49,53,48,48,41,32,+95,55,51,53,41,32,40,40,40,95,49,52,32,95,49,53,48,49,41,32,+40,40,40,95,50,55,54,32,95,49,53,48,48,41,32,80,41,32,40,40,+95,49,53,48,56,32,40,40,95,49,53,48,56,32,40,40,40,95,50,55,+51,32,95,49,53,48,48,41,32,95,56,49,56,41,32,40,95,49,48,51,+51,32,34,105,110,102,105,120,108,34,41,41,41,32,40,40,40,95,50,55,+51,32,95,49,53,48,48,41,32,95,56,49,57,41,32,40,95,49,48,51,+51,32,34,105,110,102,105,120,114,34,41,41,41,41,32,40,40,40,95,50,+55,51,32,95,49,53,48,48,41,32,95,56,50,48,41,32,40,95,49,48,+51,51,32,34,105,110,102,105,120,34,41,41,41,41,41,32,40,40,95,49,+53,49,54,32,34,100,105,103,105,116,34,41,32,40,40,67,32,40,40,67,+32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,+32,40,40,80,32,40,75,32,40,75,32,40,75,32,95,52,55,54,41,41,+41,41,32,40,75,32,40,75,32,95,52,55,54,41,41,41,41,32,40,75,+32,40,75,32,95,52,55,54,41,41,41,41,32,40,75,32,40,40,66,32,+40,40,83,32,40,40,67,32,40,40,40,83,39,32,95,49,50,49,41,32,+40,40,95,52,57,56,32,95,50,56,50,41,32,40,40,95,52,56,53,32,+95,50,55,55,41,32,40,95,51,53,57,32,35,45,50,41,41,41,41,32,+40,40,67,32,40,95,52,57,56,32,95,50,56,50,41,41,32,35,57,41,+41,41,32,95,52,55,54,41,41,32,95,52,55,55,41,41,32,95,51,54,+48,41,41,41,41,32,40,75,32,40,75,32,95,52,55,54,41,41,41,41,+32,40,75,32,40,75,32,95,52,55,54,41,41,41,41,32,40,75,32,40,+75,32,95,52,55,54,41,41,41,41,32,40,75,32,95,52,55,54,41,41,+41,32,40,75,32,95,52,55,54,41,41,41,41,41,41,32,40,40,95,49,+53,50,51,32,95,49,48,53,48,41,32,40,95,49,48,49,51,32,35,52,+52,41,41,41,41,41,32,40,40,40,95,49,52,32,95,49,53,48,49,41,+32,40,40,40,95,49,52,32,95,49,53,48,49,41,32,40,40,40,95,49,+52,32,95,49,53,48,49,41,32,40,40,40,95,50,55,54,32,95,49,53,+48,48,41,32,95,55,51,54,41,32,40,40,40,95,49,53,32,95,49,53,+48,49,41,32,40,95,49,48,51,51,32,34,99,108,97,115,115,34,41,41,+32,95,49,48,51,54,41,41,41,32,95,49,48,52,50,41,41,32,40,40,+95,49,53,48,56,32,40,40,40,95,49,53,32,95,49,53,48,49,41,32,+40,95,49,48,49,52,32,40,40,79,32,35,49,50,52,41,32,75,41,41,+41,32,40,40,95,49,53,50,51,32,40,40,40,95,49,52,32,95,49,53,+48,49,41,32,40,40,40,95,50,55,54,32,95,49,53,48,48,41,32,80,+41,32,40,95,49,53,49,49,32,95,49,48,48,57,41,41,41,32,40,40,+40,95,49,53,32,95,49,53,48,49,41,32,40,95,49,48,49,52,32,34,+45,62,34,41,41,32,40,95,49,53,49,49,32,95,49,48,48,57,41,41,+41,41,32,40,95,49,48,49,51,32,35,52,52,41,41,41,41,32,40,40,+95,49,51,32,95,49,53,48,49,41,32,95,52,54,49,41,41,41,41,32,+40,95,49,48,54,53,32,95,49,48,56,51,41,41,41,41,32,40,40,40,+95,49,52,32,95,49,53,48,49,41,32,40,40,40,95,49,52,32,95,49,+53,48,49,41,32,40,40,40,95,49,52,32,95,49,53,48,49,41,32,40,+40,40,95,50,55,54,32,95,49,53,48,48,41,32,95,55,51,55,41,32,+40,40,40,95,49,53,32,95,49,53,48,49,41,32,40,95,49,48,51,51,+32,34,105,110,115,116,97,110,99,101,34,41,41,32,95,49,48,52,56,41,+41,41,32,95,49,48,51,54,41,41,32,95,49,48,53,50,41,41,32,40,+95,49,48,54,53,32,95,49,48,56,51,41,41,41,41,32,40,40,40,95,+50,55,54,32,95,49,53,48,48,41,32,95,55,51,56,41,32,40,40,40,+95,49,53,32,95,49,53,48,49,41,32,40,95,49,48,51,51,32,34,100,+101,102,97,117,108,116,34,41,41,32,40,95,49,48,50,57,32,40,40,95,+49,53,50,52,32,95,49,48,52,55,41,32,40,95,49,48,49,51,32,35,+52,52,41,41,41,41,41,41,41,32,40,40,65,32,58,49,48,51,54,32,+40,40,95,49,53,48,56,32,40,40,40,95,49,54,32,95,49,53,48,49,+41,32,40,40,95,49,53,48,56,32,40,95,49,48,50,57,32,40,95,49,+53,49,48,32,95,49,48,52,55,41,41,41,32,40,40,40,95,50,55,54,+32,95,49,53,48,48,41,32,40,40,67,32,95,52,54,50,41,32,95,52,+54,49,41,41,32,95,49,48,53,50,41,41,41,32,40,95,49,48,49,52,+32,34,61,62,34,41,41,41,32,40,40,95,49,51,32,95,49,53,48,49,+41,32,95,52,54,49,41,41,41,32,40,40,65,32,58,49,48,51,55,32,+40,40,95,49,53,48,56,32,40,40,40,95,49,52,32,95,49,53,48,49,+41,32,40,40,40,95,49,52,32,95,49,53,48,49,41,32,40,40,40,95,+49,52,32,95,49,53,48,49,41,32,40,40,40,95,50,55,54,32,95,49,+53,48,48,41,32,95,55,57,53,41,32,95,49,48,52,56,41,41,32,95,+49,48,51,54,41,41,32,95,49,48,48,53,41,41,32,95,49,48,51,56,+41,41,32,40,40,40,95,49,52,32,95,49,53,48,49,41,32,40,40,40,+95,49,52,32,95,49,53,48,49,41,32,40,40,40,95,49,52,32,95,49,+53,48,49,41,32,40,40,40,95,49,52,32,95,49,53,48,49,41,32,40,+40,40,95,50,55,54,32,95,49,53,48,48,41,32,40,40,40,67,39,32,+40,67,39,32,66,41,41,32,40,40,66,32,40,66,32,40,67,39,32,66,+41,41,41,32,95,55,57,53,41,41,32,40,40,66,32,40,66,32,95,49,+55,52,41,41,32,40,40,40,67,39,32,66,41,32,79,41,32,40,40,67,+32,79,41,32,75,41,41,41,41,41,32,95,49,48,52,56,41,41,32,95,+49,48,51,54,41,41,32,95,49,48,51,57,41,41,32,95,49,48,50,48,+41,41,32,95,49,48,51,57,41,41,41,32,40,40,65,32,58,49,48,51,+56,32,40,40,95,49,53,48,56,32,40,40,40,95,50,55,54,32,95,49,+53,48,48,41,32,95,49,55,52,41,32,40,95,49,53,49,48,32,95,49,+48,51,57,41,41,41,32,40,40,40,95,50,55,54,32,95,49,53,48,48,+41,32,95,49,55,53,41,32,40,40,40,95,49,54,32,95,49,53,48,49,+41,32,40,40,40,95,49,53,32,95,49,53,48,49,41,32,40,95,49,48,+49,51,32,35,49,50,51,41,41,32,40,40,95,49,53,50,52,32,40,40,+40,95,49,52,32,95,49,53,48,49,41,32,40,40,40,95,50,55,54,32,+95,49,53,48,48,41,32,80,41,32,40,40,40,95,49,54,32,95,49,53,+48,49,41,32,95,49,48,50,56,41,32,40,95,49,48,49,52,32,34,58,+58,34,41,41,41,41,32,95,49,48,52,48,41,41,32,40,95,49,48,49,+51,32,35,52,52,41,41,41,41,32,40,95,49,48,49,51,32,35,49,50,+53,41,41,41,41,41,32,40,40,65,32,58,49,48,51,57,32,40,40,40,+95,49,52,32,95,49,53,48,49,41,32,40,40,40,95,50,55,54,32,95,+49,53,48,48,41,32,80,41,32,95,49,48,52,49,41,41,32,95,49,48,+53,51,41,41,32,40,40,65,32,58,49,48,52,48,32,40,40,40,95,49,+52,32,95,49,53,48,49,41,32,40,40,40,95,50,55,54,32,95,49,53,+48,48,41,32,80,41,32,95,49,48,52,49,41,41,32,95,49,48,52,55,+41,41,32,40,40,65,32,58,49,48,52,49,32,40,40,95,49,53,48,56,+32,40,40,40,95,50,55,51,32,95,49,53,48,48,41,32,95,49,50,53,+41,32,40,95,49,48,49,52,32,40,40,79,32,35,51,51,41,32,75,41,+41,41,41,32,40,40,95,49,51,32,95,49,53,48,49,41,32,95,49,50,+52,41,41,41,32,40,40,65,32,58,49,48,52,50,32,40,40,95,49,53,+48,56,32,40,40,40,95,49,52,32,95,49,53,48,49,41,32,40,40,40,+95,50,55,54,32,95,49,53,48,48,41,32,80,41,32,95,49,48,49,49,+41,41,32,40,95,49,53,49,48,32,95,49,48,52,53,41,41,41,32,40,+40,40,95,49,52,32,95,49,53,48,49,41,32,40,40,40,95,49,52,32,+95,49,53,48,49,41,32,40,40,40,95,50,55,54,32,95,49,53,48,48,+41,32,40,40,66,32,40,40,67,39,32,66,41,32,80,41,41,32,40,40,+40,67,39,32,66,41,32,79,41,32,40,40,67,32,79,41,32,75,41,41,+41,41,32,95,49,48,52,53,41,41,32,95,49,48,49,55,41,41,32,95,+49,48,52,53,41,41,41,32,40,40,65,32,58,49,48,52,51,32,40,40,+40,95,49,52,32,95,49,53,48,49,41,32,40,40,40,95,49,52,32,95,+49,53,48,49,41,32,40,40,40,95,49,52,32,95,49,53,48,49,41,32,+40,40,40,95,50,55,54,32,95,49,53,48,48,41,32,95,55,51,57,41,+32,40,40,95,49,53,48,56,32,40,40,40,95,50,55,51,32,95,49,53,+48,48,41,32,95,49,50,53,41,32,40,95,49,48,51,51,32,34,113,117,+97,108,105,102,105,101,100,34,41,41,41,32,40,40,95,49,51,32,95,49,+53,48,49,41,32,95,49,50,52,41,41,41,41,32,95,49,48,48,55,41,+41,32,40,95,49,53,49,50,32,40,40,40,95,49,53,32,95,49,53,48,+49,41,32,40,95,49,48,51,51,32,34,97,115,34,41,41,32,95,49,48,+48,56,41,41,41,41,32,40,95,49,53,49,50,32,40,40,40,95,49,52,+32,95,49,53,48,49,41,32,40,40,40,95,50,55,54,32,95,49,53,48,+48,41,32,80,41,32,40,40,40,95,51,32,95,49,53,48,52,41,32,40,+40,40,95,50,55,51,32,95,49,53,48,48,41,32,95,49,50,53,41,32,+40,95,49,48,51,51,32,34,104,105,100,105,110,103,34,41,41,41,32,40,+40,95,49,51,32,95,49,53,48,49,41,32,95,49,50,52,41,41,41,41,+32,40,95,49,48,50,57,32,40,40,95,49,53,50,53,32,95,49,48,52,+52,41,32,40,95,49,48,49,51,32,35,52,52,41,41,41,41,41,41,41,+32,40,40,65,32,58,49,48,52,52,32,40,40,95,49,53,48,56,32,40,+40,95,49,53,48,56,32,40,40,40,95,50,55,54,32,95,49,53,48,48,+41,32,95,55,52,48,41,32,40,40,40,95,49,54,32,95,49,53,48,49,+41,32,40,40,40,95,49,54,32,95,49,53,48,49,41,32,40,40,40,95,+49,54,32,95,49,53,48,49,41,32,95,49,48,50,54,41,32,40,95,49,+48,49,51,32,35,52,48,41,41,41,32,40,95,49,48,49,52,32,34,46,+46,34,41,41,41,32,40,95,49,48,49,51,32,35,52,49,41,41,41,41,+32,40,40,40,95,50,55,54,32,95,49,53,48,48,41,32,95,55,52,49,+41,32,95,49,48,50,54,41,41,41,32,40,40,40,95,50,55,54,32,95,+49,53,48,48,41,32,95,55,52,50,41,32,95,49,48,50,55,41,41,41,+32,40,40,65,32,58,49,48,52,53,32,40,40,95,49,53,48,56,32,40,+40,40,95,50,55,54,32,95,49,53,48,48,41,32,40,40,67,32,95,55,+57,54,41,32,95,55,57,57,41,41,32,95,49,48,50,56,41,41,32,40,+95,49,48,50,57,32,40,40,40,95,49,52,32,95,49,53,48,49,41,32,+40,40,40,95,50,55,54,32,95,49,53,48,48,41,32,95,55,57,54,41,+32,95,49,48,50,56,41,41,32,40,40,40,95,49,53,32,95,49,53,48,+49,41,32,40,95,49,48,49,52,32,34,58,58,34,41,41,32,95,49,48,+52,54,41,41,41,41,41,32,40,40,65,32,58,49,48,52,54,32,95,49,+48,52,55,41,32,40,40,65,32,58,49,48,52,55,32,40,40,40,95,51,+50,32,95,49,53,48,50,41,32,95,49,48,52,56,41,32,40,40,66,32,+40,40,95,51,50,32,95,49,53,48,50,41,32,95,49,48,52,57,41,41,+32,40,40,66,32,40,66,32,40,95,50,54,49,32,40,95,49,51,32,95,+49,53,48,49,41,41,41,41,32,40,40,67,32,40,40,40,83,39,32,83,+39,41,32,95,51,57,50,41,32,95,55,54,48,41,41,32,73,41,41,41,+41,41,32,40,40,65,32,58,49,48,52,56,32,40,40,95,49,53,48,56,+32,40,40,40,95,49,54,32,95,49,53,48,49,41,32,40,40,40,95,49,+53,32,95,49,53,48,49,41,32,40,95,49,48,51,51,32,34,102,111,114,+97,108,108,34,41,41,32,40,95,49,53,49,49,32,95,49,48,52,53,41,+41,41,32,40,95,49,48,49,52,32,40,40,79,32,35,52,54,41,32,75,+41,41,41,41,32,40,40,95,49,51,32,95,49,53,48,49,41,32,95,52,+54,49,41,41,41,32,40,40,65,32,58,49,48,52,57,32,40,40,95,49,+48,56,49,32,95,49,48,53,48,41,32,95,49,48,53,49,41,41,32,40,+40,65,32,58,49,48,53,48,32,40,40,95,49,53,48,56,32,40,40,95,+49,53,48,56,32,95,49,48,49,53,41,32,40,40,40,95,50,55,51,32,+95,49,53,48,48,41,32,40,95,56,57,55,32,34,45,62,34,41,41,32,+40,95,49,48,49,52,32,34,45,62,34,41,41,41,41,32,40,40,40,95,+50,55,51,32,95,49,53,48,48,41,32,40,95,56,57,55,32,34,61,62,+34,41,41,32,40,95,49,48,49,52,32,34,61,62,34,41,41,41,41,32,+40,40,65,32,58,49,48,53,49,32,95,49,48,53,50,41,32,40,40,65,+32,58,49,48,53,50,32,40,40,40,95,51,50,32,95,49,53,48,50,41,+32,95,49,48,53,51,41,32,40,40,66,32,40,40,95,51,50,32,95,49,+53,48,50,41,32,40,95,49,53,49,48,32,95,49,48,53,51,41,41,41,+32,40,40,66,32,40,66,32,40,40,95,51,50,32,95,49,53,48,50,41,+32,40,95,49,53,49,50,32,40,40,40,95,49,53,32,95,49,53,48,49,+41,32,40,95,49,48,49,52,32,34,58,58,34,41,41,32,95,49,48,52,+55,41,41,41,41,41,32,40,40,66,32,40,66,32,40,40,67,39,32,40,+66,32,40,95,50,54,49,32,40,95,49,51,32,95,49,53,48,49,41,41,+41,41,32,40,67,32,40,40,83,32,95,52,55,48,41,32,95,55,53,54,+41,41,41,41,41,32,40,95,51,57,57,32,95,55,52,52,41,41,41,41,+41,41,32,40,40,65,32,58,49,48,53,51,32,40,40,95,49,53,48,56,+32,40,40,95,49,53,48,56,32,40,40,95,49,53,48,56,32,40,40,95,+49,53,48,56,32,40,40,40,95,50,55,54,32,95,49,53,48,48,41,32,+95,55,52,51,41,32,95,49,48,50,55,41,41,32,40,40,40,95,50,55,+54,32,95,49,53,48,48,41,32,95,55,52,51,41,32,95,49,48,50,54,+41,41,41,32,95,49,48,51,48,41,41,32,40,40,40,95,50,55,54,32,+95,49,53,48,48,41,32,95,49,48,56,52,41,32,40,40,40,95,49,54,+32,95,49,53,48,49,41,32,40,40,40,95,49,53,32,95,49,53,48,49,+41,32,40,95,49,48,49,51,32,35,52,48,41,41,32,40,40,95,49,53,+50,51,32,95,49,48,52,55,41,32,40,95,49,48,49,51,32,35,52,52,+41,41,41,41,32,40,95,49,48,49,51,32,35,52,49,41,41,41,41,41,+32,40,40,40,95,50,55,54,32,95,49,53,48,48,41,32,40,40,95,50,+54,51,32,95,55,53,49,41,32,40,40,95,50,54,51,32,95,55,54,54,+41,32,40,40,67,32,95,52,54,50,41,32,95,52,54,49,41,41,41,41,+32,40,40,40,95,49,54,32,95,49,53,48,49,41,32,40,40,40,95,49,+53,32,95,49,53,48,49,41,32,40,95,49,48,49,51,32,35,57,49,41,+41,32,95,49,48,52,55,41,41,32,40,95,49,48,49,51,32,35,57,51,+41,41,41,41,41,32,40,40,65,32,58,49,48,53,52,32,40,40,95,49,+53,48,56,32,40,40,95,49,53,48,56,32,40,40,95,49,53,48,56,32,+40,40,95,49,53,48,56,32,40,40,40,95,51,50,32,95,49,53,48,50,+41,32,95,49,48,50,56,41,32,40,40,40,83,39,32,95,49,53,48,56,+41,32,40,40,40,67,39,32,40,95,50,55,54,32,95,49,53,48,48,41,+41,32,95,55,53,55,41,32,40,40,40,95,49,53,32,95,49,53,48,49,+41,32,40,95,49,48,49,52,32,40,40,79,32,35,54,52,41,32,75,41,+41,41,32,95,49,48,53,52,41,41,41,32,40,40,66,32,40,95,49,51,+32,95,49,53,48,49,41,41,32,95,55,52,51,41,41,41,41,32,40,40,+40,95,50,55,54,32,95,49,53,48,48,41,32,95,55,52,51,41,32,95,+49,48,50,54,41,41,41,32,95,49,48,51,48,41,41,32,40,40,40,95,+50,55,54,32,95,49,53,48,48,41,32,95,49,48,56,52,41,32,40,40,+40,95,49,54,32,95,49,53,48,49,41,32,40,40,40,95,49,53,32,95,+49,53,48,49,41,32,40,95,49,48,49,51,32,35,52,48,41,41,32,40,+40,95,49,53,50,51,32,95,49,48,53,53,41,32,40,95,49,48,49,51,+32,35,52,52,41,41,41,41,32,40,95,49,48,49,51,32,35,52,49,41,+41,41,41,41,32,40,40,40,95,50,55,54,32,95,49,53,48,48,41,32,+40,40,95,50,54,51,32,95,55,53,49,41,32,95,55,54,54,41,41,32,+40,40,40,95,49,54,32,95,49,53,48,49,41,32,40,40,40,95,49,53,+32,95,49,53,48,49,41,32,40,95,49,48,49,51,32,35,57,49,41,41,+32,40,40,95,49,53,50,51,32,95,49,48,53,53,41,32,40,95,49,48,+49,51,32,35,52,52,41,41,41,41,32,40,95,49,48,49,51,32,35,57,+51,41,41,41,41,41,32,40,40,65,32,58,49,48,53,53,32,95,49,48,+53,54,41,32,40,40,65,32,58,49,48,53,54,32,40,40,95,49,48,56,+49,32,95,49,48,49,53,41,32,95,49,48,53,55,41,41,32,40,40,65,+32,58,49,48,53,55,32,95,49,48,53,56,41,32,40,40,65,32,58,49,+48,53,56,32,40,40,40,95,51,50,32,95,49,53,48,50,41,32,95,49,+48,53,52,41,32,40,40,66,32,40,40,95,51,50,32,95,49,53,48,50,+41,32,40,95,49,53,49,48,32,95,49,48,53,52,41,41,41,32,40,40,+40,83,39,32,40,83,39,32,40,95,51,51,32,95,49,53,48,50,41,41,+41,32,40,40,66,32,40,66,32,40,95,49,48,32,95,49,53,48,52,41,+41,41,32,40,40,66,32,40,40,67,39,32,95,49,50,48,41,32,95,51,+57,50,41,41,32,95,55,57,51,41,41,41,32,40,40,66,32,40,66,32,+40,95,50,54,49,32,40,95,49,51,32,95,49,53,48,49,41,41,41,41,+32,40,95,51,57,57,32,95,55,52,52,41,41,41,41,41,41,32,40,40,+65,32,58,49,48,53,57,32,40,40,40,95,51,50,32,95,49,53,48,50,+41,32,95,49,48,53,53,41,32,40,40,40,83,39,32,40,95,51,51,32,+95,49,53,48,50,41,41,32,40,40,66,32,40,95,49,48,32,95,49,53,+48,52,41,41,32,40,40,66,32,95,49,50,50,41,32,95,55,57,50,41,+41,41,32,40,95,49,51,32,95,49,53,48,49,41,41,41,41,32,40,40,+65,32,58,49,48,54,48,32,40,40,40,95,51,50,32,95,49,53,48,50,+41,32,40,95,49,48,54,49,32,40,75,32,40,75,32,95,49,50,53,41,+41,41,41,32,40,85,32,40,40,66,32,40,83,32,73,41,41,32,40,40,+40,83,39,32,40,83,39,32,40,83,39,32,67,41,41,41,32,40,40,66,+32,40,66,32,40,40,67,39,32,40,67,39,32,66,41,41,32,80,41,41,+41,32,40,40,40,67,39,32,40,67,39,32,40,83,39,32,67,41,41,41,+32,40,40,66,32,40,66,32,40,66,32,40,67,32,67,39,41,41,41,41,+32,40,40,66,32,40,66,32,40,66,32,85,41,41,41,32,40,40,66,32,+40,66,32,40,40,83,39,32,40,67,39,32,66,41,41,32,85,41,41,41,+32,40,40,66,32,40,66,32,40,66,32,90,41,41,41,32,40,40,40,67,+39,32,40,67,39,32,40,83,39,32,40,67,39,32,80,41,41,41,41,32,+40,40,40,67,39,32,40,67,39,32,66,41,41,32,40,40,66,32,40,66,+32,80,41,41,32,40,40,66,32,40,66,32,40,95,49,51,32,95,49,53,+48,49,41,41,41,32,40,40,40,67,39,32,66,41,32,80,41,32,40,40,+67,32,79,41,32,75,41,41,41,41,41,32,40,90,32,75,41,41,41,32,+40,90,32,75,41,41,41,41,41,41,41,32,40,90,32,75,41,41,41,41,+32,40,40,40,83,39,32,66,41,32,40,40,66,32,40,67,39,32,40,95,+51,50,32,95,49,53,48,50,41,41,41,32,40,40,66,32,40,66,32,95,+49,53,49,48,41,41,32,40,40,66,32,40,66,32,40,40,95,49,53,32,+95,49,53,48,49,41,32,40,95,49,48,49,51,32,35,53,57,41,41,41,+41,32,40,40,66,32,40,66,32,95,49,48,54,49,41,41,32,40,40,40,+67,39,32,66,41,32,40,40,66,32,40,67,39,32,66,41,41,32,40,40,+66,32,40,66,32,95,49,50,49,41,41,32,40,67,32,40,95,50,48,50,+32,95,56,57,50,41,41,41,41,41,32,40,40,66,32,40,67,32,40,95,+50,48,50,32,95,50,56,49,41,41,41,32,95,52,49,49,41,41,41,41,+41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,95,49,51,32,95,+49,53,48,49,41,41,41,41,32,40,40,40,67,39,32,66,41,32,40,66,+39,32,80,41,41,32,40,40,40,67,39,32,66,41,32,95,52,54,50,41,+32,40,95,51,57,53,32,95,53,54,54,41,41,41,41,41,41,41,41,41,+41,32,40,40,65,32,58,49,48,54,49,32,40,40,66,32,40,40,95,51,+50,32,95,49,53,48,50,41,32,95,49,48,54,50,41,41,32,40,40,66,+32,85,41,32,40,40,66,32,40,66,32,40,66,32,40,40,95,51,50,32,+95,49,53,48,50,41,32,40,95,49,48,54,51,32,40,95,49,48,49,52,+32,40,40,79,32,35,54,49,41,32,75,41,41,41,41,41,41,41,32,40,+40,40,67,39,32,40,83,39,32,40,83,39,32,66,41,41,41,32,40,40,+66,32,40,66,32,40,66,32,40,95,51,51,32,95,49,53,48,50,41,41,+41,41,32,40,40,66,32,40,66,32,40,66,32,40,95,49,48,32,95,49,+53,48,52,41,41,41,41,32,40,40,67,32,40,67,39,32,66,41,41,32,+95,52,49,49,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,+95,49,51,32,95,49,53,48,49,41,41,41,41,32,40,40,40,67,39,32,+66,41,32,40,66,39,32,80,41,41,32,95,55,57,48,41,41,41,41,41,+41,41,32,40,40,65,32,58,49,48,54,50,32,40,40,40,40,83,39,32,+95,49,53,48,56,41,32,40,40,95,51,32,95,49,53,48,52,41,32,40,+40,40,95,49,52,32,95,49,53,48,49,41,32,40,40,40,95,50,55,54,+32,95,49,53,48,48,41,32,80,41,32,95,49,48,50,56,41,41,32,40,+95,49,53,49,48,32,95,49,48,53,52,41,41,41,41,32,40,40,40,67,+39,32,40,95,49,52,32,95,49,53,48,49,41,41,32,40,40,66,32,40,+40,95,50,55,54,32,95,49,53,48,48,41,32,40,40,67,32,66,41,32,+40,40,66,32,40,40,67,39,32,66,41,32,80,41,41,32,40,67,32,95,+52,54,51,41,41,41,41,41,32,95,49,48,50,57,41,41,32,40,95,49,+53,49,48,32,95,49,48,53,52,41,41,41,32,40,40,40,95,49,52,32,+95,49,53,48,49,41,32,40,40,40,95,49,52,32,95,49,53,48,49,41,+32,40,40,40,95,50,55,54,32,95,49,53,48,48,41,32,40,40,66,32,+40,40,67,39,32,66,41,32,80,41,41,32,40,40,40,67,39,32,66,41,+32,79,41,32,40,40,67,32,79,41,32,75,41,41,41,41,32,95,49,48,+53,56,41,41,32,40,40,40,95,51,50,32,95,49,53,48,50,41,32,95,+49,48,49,53,41,32,40,40,40,83,39,32,40,95,51,51,32,95,49,53,+48,50,41,41,32,40,40,66,32,40,95,49,48,32,95,49,53,48,52,41,+41,32,40,40,66,32,95,49,50,50,41,32,95,57,49,48,41,41,41,32,+40,95,49,51,32,95,49,53,48,49,41,41,41,41,41,32,95,49,48,53,+56,41,41,41,32,40,40,65,32,58,49,48,54,51,32,40,40,40,67,39,+32,40,95,51,50,32,95,49,53,48,50,41,41,32,95,49,48,54,52,41,+32,40,40,66,32,40,40,95,51,50,32,95,49,53,48,50,41,32,40,95,+49,48,54,53,32,95,49,48,56,50,41,41,41,32,40,40,66,32,40,66,+32,40,95,49,51,32,95,49,53,48,49,41,41,41,32,95,55,57,49,41,+41,41,41,32,40,40,65,32,58,49,48,54,52,32,40,40,40,83,39,32,+95,49,53,48,56,41,32,40,40,66,32,95,49,53,49,49,41,32,40,40,+66,32,40,40,95,49,52,32,95,49,53,48,49,41,32,40,40,40,95,50,+55,54,32,95,49,53,48,48,41,32,80,41,32,40,40,40,95,49,53,32,+95,49,53,48,49,41,32,40,95,49,48,49,52,32,40,40,79,32,35,49,+50,52,41,32,75,41,41,41,32,40,40,95,49,53,50,51,32,95,49,48,+54,54,41,32,40,95,49,48,49,51,32,35,52,52,41,41,41,41,41,41,+32,40,40,67,32,40,95,49,53,32,95,49,53,48,49,41,41,32,95,49,+48,54,55,41,41,41,41,32,40,40,66,32,40,40,95,50,55,54,32,95,+49,53,48,48,41,32,40,40,40,67,39,32,79,41,32,40,80,32,95,52,+54,49,41,41,32,75,41,41,41,32,40,40,67,32,40,95,49,53,32,95,+49,53,48,49,41,41,32,95,49,48,54,55,41,41,41,41,32,40,40,65,+32,58,49,48,54,53,32,40,40,40,67,39,32,95,49,53,48,56,41,32,+40,40,66,32,40,40,95,49,53,32,95,49,53,48,49,41,32,40,95,49,+48,51,51,32,34,119,104,101,114,101,34,41,41,41,32,95,49,48,51,52,+41,41,32,40,40,95,49,51,32,95,49,53,48,49,41,32,95,52,54,49,+41,41,41,32,40,40,65,32,58,49,48,54,54,32,40,40,95,49,53,48,+56,32,40,40,95,49,53,48,56,32,40,40,40,95,49,52,32,95,49,53,+48,49,41,32,40,40,40,95,50,55,54,32,95,49,53,48,48,41,32,95,+55,56,52,41,32,40,40,40,95,49,54,32,95,49,53,48,49,41,32,95,+49,48,53,53,41,32,40,95,49,48,49,52,32,34,60,45,34,41,41,41,+41,32,95,49,48,54,55,41,41,32,40,40,40,95,50,55,54,32,95,49,+53,48,48,41,32,95,55,56,54,41,32,40,40,40,95,49,53,32,95,49,+53,48,49,41,32,40,95,49,48,51,51,32,34,108,101,116,34,41,41,32,+40,95,49,48,51,52,32,95,49,48,56,50,41,41,41,41,41,32,40,40,+40,95,50,55,54,32,95,49,53,48,48,41,32,95,55,56,53,41,32,95,+49,48,54,55,41,41,41,32,40,40,65,32,58,49,48,54,55,32,95,49,+48,56,48,41,32,40,40,65,32,58,49,48,54,56,32,40,40,95,49,53,+48,56,32,40,40,95,49,53,48,56,32,40,40,95,49,53,48,56,32,40,+40,95,49,53,48,56,32,40,40,95,49,53,48,56,32,95,49,48,54,57,+41,32,95,49,48,55,48,41,41,32,95,49,48,55,49,41,41,32,95,49,+48,55,51,41,41,32,95,49,48,55,53,41,41,32,95,49,48,55,52,41,+41,32,40,40,65,32,58,49,48,54,57,32,40,40,40,95,51,50,32,95,+49,53,48,50,41,32,95,49,48,55,56,41,32,40,40,66,32,40,40,95,+51,50,32,95,49,53,48,50,41,32,40,95,49,53,49,48,32,95,49,48,+55,56,41,41,41,32,40,40,66,32,40,66,32,40,40,95,51,50,32,95,+49,53,48,50,41,32,40,95,49,53,49,50,32,40,40,40,95,49,53,32,+95,49,53,48,49,41,32,40,95,49,48,49,52,32,34,58,58,34,41,41,+32,95,49,48,52,55,41,41,41,41,41,32,40,40,66,32,40,66,32,40,+40,67,39,32,40,66,32,40,95,50,54,49,32,40,95,49,51,32,95,49,+53,48,49,41,41,41,41,32,40,67,32,40,40,83,32,95,52,55,48,41,+32,95,55,53,54,41,41,41,41,41,32,40,95,51,57,57,32,95,55,52,+52,41,41,41,41,41,41,32,40,40,65,32,58,49,48,55,48,32,40,40,+40,95,49,52,32,95,49,53,48,49,41,32,40,40,40,95,50,55,54,32,+95,49,53,48,48,41,32,95,55,54,49,41,32,40,40,40,95,49,53,32,+95,49,53,48,49,41,32,40,95,49,48,49,52,32,40,40,79,32,35,57,+50,41,32,75,41,41,41,32,40,95,49,53,49,49,32,95,49,48,53,52,+41,41,41,41,32,40,40,40,95,49,53,32,95,49,53,48,49,41,32,40,+95,49,48,49,52,32,34,45,62,34,41,41,32,95,49,48,54,55,41,41,+41,32,40,40,65,32,58,49,48,55,49,32,40,40,40,95,49,52,32,95,+49,53,48,49,41,32,40,40,40,95,50,55,54,32,95,49,53,48,48,41,+32,95,55,52,56,41,32,40,40,40,95,49,53,32,95,49,53,48,49,41,+32,40,95,49,48,51,51,32,34,99,97,115,101,34,41,41,32,95,49,48,+54,55,41,41,41,32,40,40,40,95,49,53,32,95,49,53,48,49,41,32,+40,95,49,48,51,51,32,34,111,102,34,41,41,32,40,95,49,48,51,52,+32,95,49,48,55,50,41,41,41,41,32,40,40,65,32,58,49,48,55,50,+32,40,40,40,95,49,52,32,95,49,53,48,49,41,32,40,40,40,95,50,+55,54,32,95,49,53,48,48,41,32,80,41,32,95,49,48,53,53,41,41,+32,40,95,49,48,54,51,32,40,95,49,48,49,52,32,34,45,62,34,41,+41,41,41,32,40,40,65,32,58,49,48,55,51,32,40,40,40,95,49,52,+32,95,49,53,48,49,41,32,40,40,40,95,50,55,54,32,95,49,53,48,+48,41,32,95,55,52,57,41,32,40,40,40,95,49,53,32,95,49,53,48,+49,41,32,40,95,49,48,51,51,32,34,108,101,116,34,41,41,32,40,95,+49,48,51,52,32,95,49,48,56,50,41,41,41,41,32,40,40,40,95,49,+53,32,95,49,53,48,49,41,32,40,95,49,48,51,51,32,34,105,110,34,+41,41,32,95,49,48,54,55,41,41,41,32,40,40,65,32,58,49,48,55,+52,32,40,40,40,95,49,52,32,95,49,53,48,49,41,32,40,40,40,95,+50,55,54,32,95,49,53,48,48,41,32,95,55,53,50,41,32,40,40,95,+49,53,48,56,32,40,40,40,95,50,55,54,32,95,49,53,48,48,41,32,+95,52,55,55,41,32,95,49,48,55,54,41,41,32,40,40,40,95,50,55,+51,32,95,49,53,48,48,41,32,95,52,55,54,41,32,40,95,49,48,51,+51,32,34,100,111,34,41,41,41,41,41,32,40,95,49,48,51,52,32,95,+49,48,54,54,41,41,41,32,40,40,65,32,58,49,48,55,53,32,40,40,+40,95,49,52,32,95,49,53,48,49,41,32,40,40,40,95,49,52,32,95,+49,53,48,49,41,32,40,40,40,95,50,55,54,32,95,49,53,48,48,41,+32,95,55,53,53,41,32,40,40,40,95,49,53,32,95,49,53,48,49,41,+32,40,95,49,48,51,51,32,34,105,102,34,41,41,32,95,49,48,54,55,+41,41,41,32,40,40,40,95,49,53,32,95,49,53,48,49,41,32,40,95,+49,48,51,51,32,34,116,104,101,110,34,41,41,32,95,49,48,54,55,41,+41,41,32,40,40,40,95,49,53,32,95,49,53,48,49,41,32,40,95,49,+48,51,51,32,34,101,108,115,101,34,41,41,32,95,49,48,54,55,41,41,+41,32,40,40,65,32,58,49,48,55,54,32,40,40,40,95,51,50,32,95,+49,53,48,50,41,32,95,57,57,53,41,32,40,40,66,32,40,95,49,53,+49,54,32,34,81,117,97,108,68,111,34,41,41,32,40,40,40,67,39,32,+67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,+32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,+40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,+67,39,32,80,41,32,40,40,66,32,40,66,32,40,40,83,39,32,66,41,+32,40,85,32,95,52,55,54,41,41,41,41,32,40,40,66,32,40,66,32,+40,66,32,90,41,41,41,32,40,40,66,32,40,66,32,40,66,32,90,41,+41,41,32,40,40,66,32,40,66,32,40,66,32,40,67,32,40,40,67,32,+40,40,67,32,101,113,117,97,108,41,32,34,100,111,34,41,41,32,95,52,+55,54,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,95,52,+55,55,41,41,41,32,40,40,40,67,39,32,40,67,39,32,66,41,41,32,+95,56,57,57,41,32,40,95,52,51,49,32,40,40,79,32,35,52,54,41,+32,75,41,41,41,41,41,41,41,41,41,32,40,75,32,40,75,32,95,52,+55,54,41,41,41,41,32,40,75,32,40,75,32,95,52,55,54,41,41,41,+41,32,40,75,32,40,75,32,95,52,55,54,41,41,41,41,32,40,75,32,+40,75,32,95,52,55,54,41,41,41,41,32,40,75,32,40,75,32,95,52,+55,54,41,41,41,41,32,40,75,32,40,75,32,95,52,55,54,41,41,41,+41,32,40,75,32,95,52,55,54,41,41,41,32,40,75,32,95,52,55,54,+41,41,41,41,41,32,40,40,65,32,58,49,48,55,55,32,40,40,95,49,+53,48,56,32,95,49,48,49,53,41,32,40,40,40,95,49,52,32,95,49,+53,48,49,41,32,40,40,40,95,49,52,32,95,49,53,48,49,41,32,40,+40,40,95,50,55,54,32,95,49,53,48,48,41,32,95,56,57,57,41,32,+95,57,57,53,41,41,32,95,57,57,56,41,41,32,40,40,40,95,50,55,+51,32,95,49,53,48,48,41,32,40,40,79,32,35,52,52,41,32,75,41,+41,32,40,95,49,48,49,51,32,35,52,52,41,41,41,41,41,32,40,40,+65,32,58,49,48,55,56,32,40,40,95,49,53,48,56,32,40,40,95,49,+53,48,56,32,40,40,95,49,53,48,56,32,40,40,95,49,53,48,56,32,+40,40,95,49,53,48,56,32,40,40,95,49,53,48,56,32,40,40,95,49,+53,48,56,32,40,40,40,95,50,55,54,32,95,49,53,48,48,41,32,95,+55,52,51,41,32,95,49,48,50,55,41,41,32,40,40,40,95,50,55,54,+32,95,49,53,48,48,41,32,95,55,52,51,41,32,95,49,48,50,54,41,+41,41,32,95,49,48,51,48,41,41,32,40,40,40,95,50,55,54,32,95,+49,53,48,48,41,32,95,49,48,56,52,41,32,40,40,40,95,49,54,32,+95,49,53,48,49,41,32,40,40,40,95,49,53,32,95,49,53,48,49,41,+32,40,95,49,48,49,51,32,35,52,48,41,41,32,40,40,95,49,53,50,+51,32,95,49,48,54,55,41,32,40,95,49,48,49,51,32,35,52,52,41,+41,41,41,32,40,95,49,48,49,51,32,35,52,49,41,41,41,41,41,32,+40,40,40,95,50,55,54,32,95,49,53,48,48,41,32,95,55,53,49,41,+32,40,40,40,95,49,54,32,95,49,53,48,49,41,32,40,40,40,95,49,+53,32,95,49,53,48,49,41,32,40,95,49,48,49,51,32,35,57,49,41,+41,32,95,49,48,55,57,41,41,32,40,95,49,48,49,51,32,35,57,51,+41,41,41,41,41,32,40,40,40,95,49,52,32,95,49,53,48,49,41,32,+40,40,40,95,50,55,54,32,95,49,53,48,48,41,32,95,55,53,51,41,+32,40,40,40,95,49,53,32,95,49,53,48,49,41,32,40,95,49,48,49,+51,32,35,52,48,41,41,32,95,49,48,54,56,41,41,41,32,40,40,40,+95,49,54,32,95,49,53,48,49,41,32,95,49,48,55,55,41,32,40,95,+49,48,49,51,32,35,52,49,41,41,41,41,41,32,40,40,40,95,49,52,+32,95,49,53,48,49,41,32,40,40,40,95,50,55,54,32,95,49,53,48,+48,41,32,95,55,53,52,41,32,40,40,40,95,49,53,32,95,49,53,48,+49,41,32,40,95,49,48,49,51,32,35,52,48,41,41,32,95,49,48,55,+55,41,41,41,32,40,40,40,95,49,54,32,95,49,53,48,49,41,32,95,+49,48,54,56,41,32,40,95,49,48,49,51,32,35,52,49,41,41,41,41,+41,32,40,40,40,95,50,55,54,32,95,49,53,48,48,41,32,40,40,95,+50,54,51,32,40,95,55,52,55,32,95,56,57,53,41,41,32,95,55,56,+49,41,41,32,40,40,40,95,49,53,32,95,49,53,48,49,41,32,40,95,+49,48,51,51,32,34,112,114,105,109,105,116,105,118,101,34,41,41,32,95,+49,48,51,49,41,41,41,41,32,40,40,65,32,58,49,48,55,57,32,40,+40,40,95,51,50,32,95,49,53,48,50,41,32,95,49,48,54,55,41,32,+40,40,40,83,39,32,95,49,53,48,56,41,32,40,40,40,83,39,32,95,+49,53,48,56,41,32,40,40,40,83,39,32,95,49,53,48,56,41,32,40,+40,40,83,39,32,95,49,53,48,56,41,32,40,40,66,32,40,40,95,49,+53,32,95,49,53,48,49,41,32,40,95,49,48,49,51,32,35,52,52,41,+41,41,32,40,40,66,32,40,40,95,51,50,32,95,49,53,48,50,41,32,+95,49,48,54,55,41,41,32,40,40,40,83,39,32,40,83,39,32,95,49,+53,48,56,41,41,32,40,40,40,83,39,32,40,83,39,32,95,49,53,48,+56,41,41,32,40,40,40,83,39,32,40,83,39,32,95,49,53,48,56,41,+41,32,40,40,40,67,39,32,40,67,39,32,40,95,50,55,54,32,95,49,+53,48,48,41,41,41,32,40,40,66,32,40,66,32,40,66,32,95,55,54,+54,41,41,41,32,40,40,40,67,39,32,66,41,32,40,66,39,32,95,52,+54,50,41,41,32,95,52,54,50,41,41,41,32,40,95,49,53,49,49,32,+40,40,40,95,49,53,32,95,49,53,48,49,41,32,40,95,49,48,49,51,+32,35,52,52,41,41,32,95,49,48,54,55,41,41,41,41,32,40,40,40,+67,39,32,40,67,39,32,40,95,50,55,54,32,95,49,53,48,48,41,41,+41,32,95,55,55,49,41,32,40,40,40,95,49,53,32,95,49,53,48,49,+41,32,40,95,49,48,49,52,32,34,46,46,34,41,41,32,95,49,48,54,+55,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,95,50,55,+51,32,95,49,53,48,48,41,41,41,32,95,55,55,48,41,32,40,95,49,+48,49,52,32,34,46,46,34,41,41,41,41,32,40,40,66,32,40,66,32,+40,95,49,51,32,95,49,53,48,49,41,41,41,32,40,40,66,32,40,66,+32,95,55,54,54,41,41,32,40,40,40,67,39,32,66,41,32,79,41,32,+40,40,67,32,79,41,32,75,41,41,41,41,41,41,41,41,32,40,40,40,+67,39,32,40,95,50,55,54,32,95,49,53,48,48,41,41,32,95,55,54,+55,41,32,40,40,40,95,49,53,32,95,49,53,48,49,41,32,40,95,49,+48,49,52,32,40,40,79,32,35,49,50,52,41,32,75,41,41,41,32,40,+40,95,49,53,50,51,32,95,49,48,54,54,41,32,40,95,49,48,49,51,+32,35,52,52,41,41,41,41,41,41,32,40,40,40,67,39,32,40,95,50,+55,54,32,95,49,53,48,48,41,41,32,95,55,54,57,41,32,40,40,40,+95,49,53,32,95,49,53,48,49,41,32,40,95,49,48,49,52,32,34,46,+46,34,41,41,32,95,49,48,54,55,41,41,41,41,32,40,40,40,67,39,+32,40,95,50,55,51,32,95,49,53,48,48,41,41,32,95,55,54,56,41,+32,40,95,49,48,49,52,32,34,46,46,34,41,41,41,41,32,40,40,66,+32,40,95,49,51,32,95,49,53,48,49,41,41,32,40,40,66,32,95,55,+54,54,41,32,40,40,67,32,79,41,32,75,41,41,41,41,41,41,32,40,+40,65,32,58,49,48,56,48,32,40,40,95,49,48,56,49,32,95,49,48,+49,53,41,32,95,49,48,54,56,41,41,32,40,40,65,32,58,49,48,56,+49,32,40,40,66,32,40,40,83,39,32,40,95,49,52,32,95,49,53,48,+49,41,41,32,40,40,95,50,55,54,32,95,49,53,48,48,41,32,40,40,+40,83,39,32,83,41,32,85,41,32,40,40,66,32,90,41,32,40,40,66,+32,90,41,32,95,55,52,53,41,41,41,41,41,41,32,40,40,66,32,40,+66,32,95,49,53,49,48,41,41,32,40,40,66,32,40,95,49,52,32,95,+49,53,48,49,41,41,32,40,40,95,50,55,54,32,95,49,53,48,48,41,+32,80,41,41,41,41,41,32,40,40,65,32,58,49,48,56,50,32,40,40,+95,49,53,48,56,32,40,40,40,95,49,52,32,95,49,53,48,49,41,32,+40,40,40,95,50,55,54,32,95,49,53,48,48,41,32,95,55,56,56,41,+32,40,40,40,95,49,54,32,95,49,53,48,49,41,32,95,49,48,53,57,+41,32,40,95,49,48,49,52,32,40,40,79,32,35,54,49,41,32,75,41,+41,41,41,41,32,95,49,48,54,55,41,41,32,95,49,48,56,51,41,41,+32,40,40,65,32,58,49,48,56,51,32,40,40,95,49,53,48,56,32,40,+40,40,95,50,55,54,32,95,49,53,48,48,41,32,40,95,50,54,56,32,+95,55,56,55,41,41,32,95,49,48,54,48,41,41,32,40,40,40,95,49,+52,32,95,49,53,48,49,41,32,40,40,40,95,50,55,54,32,95,49,53,+48,48,41,32,95,55,56,57,41,32,40,40,40,95,49,54,32,95,49,53,+48,49,41,32,95,49,48,50,56,41,32,40,95,49,48,49,52,32,34,58,+58,34,41,41,41,41,32,95,49,48,52,55,41,41,41,32,40,40,65,32,+58,49,48,56,52,32,40,40,83,32,40,85,32,40,95,50,52,32,34,101,+84,117,112,108,101,34,41,41,41,32,40,40,66,32,40,67,32,80,41,41,+32,40,90,32,40,90,32,95,55,53,48,41,41,41,41,41,32,40,40,65,+32,58,49,48,56,53,32,40,40,40,83,39,32,95,49,50,48,41,32,95,+57,49,51,41,32,95,49,51,57,41,41,32,40,40,65,32,58,49,48,56,+54,32,40,40,40,67,39,32,40,67,39,32,66,41,41,32,40,40,66,32,+66,39,41,32,95,56,57,57,41,41,32,40,40,66,32,40,66,32,40,95,+52,51,49,32,40,40,79,32,35,52,54,41,32,75,41,41,41,41,32,40,+40,40,67,39,32,66,41,32,95,52,54,51,41,32,40,40,67,32,79,41,+32,75,41,41,41,41,41,32,40,40,65,32,58,49,48,56,55,32,40,90,+32,40,40,66,32,85,41,32,40,90,32,40,40,67,32,40,40,40,67,39,+32,83,39,41,32,40,40,66,32,67,39,41,32,40,40,66,32,40,67,39,+32,95,52,54,51,41,41,32,40,40,66,32,40,66,32,95,57,49,54,41,+41,32,40,40,67,32,40,40,40,67,39,32,83,39,41,32,95,56,56,57,+41,32,40,85,32,75,41,41,41,32,40,85,32,65,41,41,41,41,41,41,+32,40,40,66,32,40,66,32,40,95,52,54,51,32,34,58,92,49,48,38,+34,41,41,41,32,40,40,66,32,40,66,32,40,95,52,54,51,32,34,32,+32,102,111,117,110,100,58,32,32,32,32,34,41,41,41,32,40,40,40,67,+39,32,66,41,32,40,40,66,32,95,52,54,51,41,32,40,40,66,32,95,+52,50,56,41,32,40,40,40,67,39,32,95,52,54,51,41,32,40,95,51,+57,53,32,95,57,54,55,41,41,32,40,40,79,32,34,69,79,70,34,41,+32,75,41,41,41,41,41,32,40,40,66,32,40,95,52,54,51,32,40,40,+79,32,35,49,48,41,32,75,41,41,41,32,40,40,66,32,40,95,52,54,+51,32,34,32,32,101,120,112,101,99,116,101,100,58,32,34,41,41,32,40,+40,66,32,95,49,54,48,57,41,32,40,95,52,52,52,32,95,49,51,51,+41,41,41,41,41,41,41,41,41,32,95,57,56,52,41,41,41,41,41,32,+40,40,65,32,58,49,48,56,56,32,85,41,32,40,40,65,32,58,49,48,+56,57,32,40,85,32,73,41,41,32,40,40,65,32,58,49,48,57,48,32,+40,40,95,50,55,49,32,40,40,66,32,40,66,32,40,95,50,54,49,32,+95,49,48,56,56,41,41,41,32,40,40,66,32,40,40,67,39,32,40,67,+39,32,40,95,51,50,32,95,49,52,53,50,41,41,41,32,95,49,48,56,+57,41,41,32,40,40,66,32,85,41,32,40,40,66,32,40,66,32,40,66,+32,40,95,51,52,32,95,49,52,53,50,41,41,41,41,32,40,66,32,80,+41,41,41,41,41,41,32,40,95,50,55,53,32,95,49,48,57,48,41,41,+41,32,40,40,65,32,58,49,48,57,49,32,40,40,40,40,40,95,49,49,+32,95,49,48,57,48,41,32,40,40,66,32,40,95,50,54,49,32,95,49,+48,56,56,41,41,32,40,40,66,32,40,66,32,40,95,51,52,32,95,49,+52,53,50,41,41,41,32,80,41,41,41,32,40,95,51,56,32,95,49,48,+57,50,41,41,32,40,40,66,32,40,66,32,40,95,50,54,49,32,95,49,+48,56,56,41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,+40,67,39,32,40,95,51,50,32,95,49,52,53,50,41,41,41,32,95,49,+48,56,57,41,41,32,40,40,66,32,85,41,32,40,90,32,95,49,48,56,+57,41,41,41,41,41,32,40,95,50,48,32,95,49,48,57,49,41,41,41,+32,40,40,65,32,58,49,48,57,50,32,40,40,40,40,95,51,48,32,95,+49,48,57,49,41,32,40,40,66,32,40,66,32,40,95,50,54,49,32,95,+49,48,56,56,41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,+32,40,67,39,32,40,95,51,50,32,95,49,52,53,50,41,41,41,32,95,+49,48,56,57,41,41,32,40,40,66,32,85,41,32,40,66,32,95,49,48,+56,57,41,41,41,41,41,32,40,95,49,53,32,95,49,48,57,49,41,41,+32,40,95,51,55,32,95,49,48,57,50,41,41,41,32,40,40,65,32,58,+49,48,57,51,32,40,40,95,51,57,32,95,49,48,57,50,41,32,95,50,+52,41,41,32,40,40,65,32,58,49,48,57,52,32,40,40,66,32,40,95,+50,54,49,32,95,49,48,56,56,41,41,32,40,40,66,32,40,66,32,40,+95,51,52,32,95,49,52,53,50,41,41,41,32,40,40,67,32,40,83,39,+32,80,41,41,32,73,41,41,41,41,32,40,40,65,32,58,49,48,57,53,+32,40,40,66,32,40,95,50,54,49,32,95,49,48,56,56,41,41,32,40,+40,66,32,40,66,32,40,95,51,52,32,95,49,52,53,50,41,41,41,32,+40,66,32,40,80,32,95,49,51,52,49,41,41,41,41,41,32,40,40,65,+32,58,49,48,57,54,32,40,40,66,32,40,95,50,54,49,32,95,49,48,+56,56,41,41,32,40,90,32,40,40,66,32,40,95,51,52,32,95,49,52,+53,50,41,41,32,40,80,32,95,49,51,52,49,41,41,41,41,41,32,40,+40,65,32,58,49,48,57,55,32,40,40,95,50,54,49,32,95,49,48,56,+56,41,32,40,40,66,32,40,95,51,52,32,95,49,52,53,50,41,41,32,+40,40,83,32,80,41,32,73,41,41,41,41,32,40,40,65,32,58,49,48,+57,56,32,40,40,66,32,40,95,50,54,49,32,95,49,48,56,56,41,41,+32,40,40,40,67,39,32,66,41,32,40,95,51,50,32,95,49,52,53,50,+41,41,32,40,40,66,32,40,66,32,40,95,51,52,32,95,49,52,53,50,+41,41,41,32,40,67,32,80,41,41,41,41,41,32,40,40,65,32,58,49,+48,57,57,32,95,53,57,41,32,40,40,65,32,58,49,49,48,48,32,95,+56,51,54,41,32,40,40,65,32,58,49,49,48,49,32,40,40,66,32,40,+40,95,51,50,32,95,49,52,53,50,41,32,95,49,52,50,54,41,41,32,+40,40,66,32,40,40,67,39,32,95,49,52,50,55,41,32,40,40,40,67,+39,32,40,95,52,55,57,32,95,50,55,55,41,41,32,40,40,66,32,95,+52,49,49,41,32,40,95,52,50,52,32,40,40,67,32,40,95,50,48,51,+32,95,49,51,51,41,41,32,34,45,45,34,41,41,41,41,32,35,49,41,+41,41,32,40,40,66,32,40,95,50,54,49,32,95,49,54,49,51,41,41,+32,95,49,49,48,50,41,41,41,41,32,40,40,65,32,58,49,49,48,50,+32,40,85,32,40,40,40,67,39,32,67,41,32,40,40,67,39,32,67,41,+32,40,40,66,32,40,83,32,73,41,41,32,40,40,66,32,40,66,32,89,+41,41,32,40,40,66,32,40,66,32,40,66,32,95,57,50,52,41,41,41,+32,40,40,67,39,32,40,67,39,32,95,51,57,52,41,41,32,40,40,66,+32,40,66,32,85,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,+39,32,40,67,39,32,79,41,41,41,41,32,40,40,66,32,40,66,32,40,+40,67,39,32,66,41,32,80,41,41,41,32,40,66,32,95,49,49,48,51,+41,41,41,32,75,41,41,41,41,41,41,41,41,32,40,40,66,32,40,40,+83,39,32,95,50,54,49,41,32,40,40,66,32,95,52,55,49,41,32,40,+40,66,32,40,95,50,54,49,32,95,50,52,41,41,32,40,40,66,32,40,+95,52,54,51,32,34,116,114,97,110,115,108,97,116,101,58,32,110,111,116,+32,102,111,117,110,100,32,34,41,41,32,95,57,48,50,41,41,41,41,41,+32,40,67,32,95,57,50,56,41,41,41,41,41,32,40,40,65,32,58,49,+49,48,51,32,40,40,66,32,89,41,32,40,40,40,67,39,32,40,67,39,+32,83,41,41,32,40,40,40,67,39,32,40,83,39,32,67,41,41,32,40,+40,40,67,39,32,40,67,39,32,40,67,39,32,83,39,41,41,41,32,40,+40,40,67,39,32,66,41,32,80,41,32,40,40,40,83,39,32,40,67,39,+32,66,41,41,32,40,66,32,95,49,54,49,51,41,41,32,73,41,41,41,+32,40,90,32,75,41,41,41,32,40,40,40,83,39,32,40,67,39,32,67,+41,41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,40,+83,39,32,40,67,39,32,67,41,41,32,40,40,40,67,39,32,40,83,39,+32,67,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,67,41,+32,40,40,40,67,39,32,67,41,32,40,40,66,32,40,80,32,95,49,54,+49,51,41,41,32,40,40,67,32,66,41,32,95,54,51,53,41,41,41,32,+95,49,54,49,51,41,41,41,32,75,41,41,32,75,41,41,32,40,40,67,+32,66,41,32,95,55,48,49,41,41,41,32,40,40,40,83,39,32,95,50,+54,49,41,32,40,40,66,32,95,52,55,49,41,32,40,40,66,32,40,95,+50,54,49,32,95,50,52,41,41,32,40,95,52,54,51,32,34,116,114,97,+110,115,58,32,110,111,32,112,114,105,109,111,112,32,34,41,41,41,41,32,+40,40,67,32,40,95,52,51,54,32,95,49,51,51,41,41,32,95,49,49,+48,52,41,41,41,41,32,40,40,67,32,66,41,32,40,40,66,32,40,95,+54,55,54,32,40,95,54,55,56,32,40,95,55,56,49,32,34,100,121,110,+115,121,109,34,41,41,41,41,32,40,40,66,32,95,54,55,56,41,32,95,+55,56,48,41,41,41,41,41,41,32,40,40,66,32,40,95,50,54,49,32,+95,50,52,41,41,32,40,40,66,32,40,95,52,54,51,32,34,116,114,97,+110,115,58,32,105,109,112,111,115,115,105,98,108,101,58,32,34,41,41,32,+40,95,49,53,57,48,32,95,55,49,56,41,41,41,41,41,41,32,40,40,+65,32,58,49,49,48,52,32,40,40,79,32,40,40,80,32,40,40,79,32,+35,54,54,41,32,75,41,41,32,66,41,41,32,40,40,79,32,40,40,80,+32,40,40,79,32,35,55,57,41,32,75,41,41,32,79,41,41,32,40,40,+79,32,40,40,80,32,40,40,79,32,35,55,53,41,32,75,41,41,32,75,+41,41,32,40,40,79,32,40,40,80,32,34,67,39,34,41,32,67,39,41,+41,32,40,40,79,32,40,40,80,32,40,40,79,32,35,54,55,41,32,75,+41,41,32,67,41,41,32,40,40,79,32,40,40,80,32,40,40,79,32,35,+54,53,41,32,75,41,41,32,65,41,41,32,40,40,79,32,40,40,80,32,+34,83,39,34,41,32,83,39,41,41,32,40,40,79,32,40,40,80,32,40,+40,79,32,35,56,48,41,32,75,41,41,32,80,41,41,32,40,40,79,32,+40,40,80,32,40,40,79,32,35,55,51,41,32,75,41,41,32,73,41,41,+32,40,40,79,32,40,40,80,32,40,40,79,32,35,56,51,41,32,75,41,+41,32,83,41,41,32,40,40,79,32,40,40,80,32,40,40,79,32,35,56,+53,41,32,75,41,41,32,85,41,41,32,40,40,79,32,40,40,80,32,40,+40,79,32,35,56,57,41,32,75,41,41,32,89,41,41,32,40,40,79,32,+40,40,80,32,34,66,39,34,41,32,66,39,41,41,32,40,40,79,32,40,+40,80,32,40,40,79,32,35,57,48,41,32,75,41,41,32,90,41,41,32,+40,40,79,32,40,40,80,32,40,40,79,32,35,56,50,41,32,75,41,41,+32,82,41,41,32,40,40,79,32,40,40,80,32,40,40,79,32,35,52,51,+41,32,75,41,41,32,43,41,41,32,40,40,79,32,40,40,80,32,40,40,+79,32,35,52,53,41,32,75,41,41,32,45,41,41,32,40,40,79,32,40,+40,80,32,40,40,79,32,35,52,50,41,32,75,41,41,32,42,41,41,32,+40,40,79,32,40,40,80,32,34,113,117,111,116,34,41,32,113,117,111,116,+41,41,32,40,40,79,32,40,40,80,32,34,114,101,109,34,41,32,114,101,+109,41,41,32,40,40,79,32,40,40,80,32,34,117,113,117,111,116,34,41,+32,117,113,117,111,116,41,41,32,40,40,79,32,40,40,80,32,34,117,114,+101,109,34,41,32,117,114,101,109,41,41,32,40,40,79,32,40,40,80,32,+34,110,101,103,34,41,32,110,101,103,41,41,32,40,40,79,32,40,40,80,+32,34,97,110,100,34,41,32,97,110,100,41,41,32,40,40,79,32,40,40,+80,32,34,111,114,34,41,32,111,114,41,41,32,40,40,79,32,40,40,80,+32,34,120,111,114,34,41,32,120,111,114,41,41,32,40,40,79,32,40,40,+80,32,34,105,110,118,34,41,32,105,110,118,41,41,32,40,40,79,32,40,+40,80,32,34,115,104,108,34,41,32,115,104,108,41,41,32,40,40,79,32,+40,40,80,32,34,115,104,114,34,41,32,115,104,114,41,41,32,40,40,79,+32,40,40,80,32,34,97,115,104,114,34,41,32,97,115,104,114,41,41,32,+40,40,79,32,40,40,80,32,34,115,117,98,116,114,97,99,116,34,41,32,+115,117,98,116,114,97,99,116,41,41,32,40,40,79,32,40,40,80,32,34,+61,61,34,41,32,61,61,41,41,32,40,40,79,32,40,40,80,32,34,47,+61,34,41,32,47,61,41,41,32,40,40,79,32,40,40,80,32,40,40,79,+32,35,54,48,41,32,75,41,41,32,60,41,41,32,40,40,79,32,40,40,+80,32,34,60,61,34,41,32,60,61,41,41,32,40,40,79,32,40,40,80,+32,40,40,79,32,35,54,50,41,32,75,41,41,32,62,41,41,32,40,40,+79,32,40,40,80,32,34,62,61,34,41,32,62,61,41,41,32,40,40,79,+32,40,40,80,32,34,117,60,34,41,32,117,60,41,41,32,40,40,79,32,+40,40,80,32,34,117,60,61,34,41,32,117,60,61,41,41,32,40,40,79,+32,40,40,80,32,34,117,62,34,41,32,117,62,41,41,32,40,40,79,32,+40,40,80,32,34,117,62,61,34,41,32,117,62,61,41,41,32,40,40,79,+32,40,40,80,32,34,102,97,100,100,34,41,32,102,97,100,100,41,41,32,+40,40,79,32,40,40,80,32,34,102,115,117,98,34,41,32,102,115,117,98,+41,41,32,40,40,79,32,40,40,80,32,34,102,109,117,108,34,41,32,102,+109,117,108,41,41,32,40,40,79,32,40,40,80,32,34,102,100,105,118,34,+41,32,102,100,105,118,41,41,32,40,40,79,32,40,40,80,32,34,102,101,+113,34,41,32,102,101,113,41,41,32,40,40,79,32,40,40,80,32,34,102,+110,101,34,41,32,102,110,101,41,41,32,40,40,79,32,40,40,80,32,34,+102,108,116,34,41,32,102,108,116,41,41,32,40,40,79,32,40,40,80,32,+34,102,108,101,34,41,32,102,108,101,41,41,32,40,40,79,32,40,40,80,+32,34,102,103,116,34,41,32,102,103,116,41,41,32,40,40,79,32,40,40,+80,32,34,102,103,101,34,41,32,102,103,101,41,41,32,40,40,79,32,40,+40,80,32,34,102,110,101,103,34,41,32,102,110,101,103,41,41,32,40,40,+79,32,40,40,80,32,34,102,115,104,111,119,34,41,32,102,115,104,111,119,+41,41,32,40,40,79,32,40,40,80,32,34,102,114,101,97,100,34,41,32,+102,114,101,97,100,41,41,32,40,40,79,32,40,40,80,32,34,105,116,111,+102,34,41,32,105,116,111,102,41,41,32,40,40,79,32,40,40,80,32,34,+115,101,113,34,41,32,115,101,113,41,41,32,40,40,79,32,40,40,80,32,+34,101,114,114,111,114,34,41,32,101,114,114,111,114,41,41,32,40,40,79,+32,40,40,80,32,34,101,113,117,97,108,34,41,32,101,113,117,97,108,41,+41,32,40,40,79,32,40,40,80,32,34,99,111,109,112,97,114,101,34,41,+32,99,111,109,112,97,114,101,41,41,32,40,40,79,32,40,40,80,32,34,+114,110,102,34,41,32,114,110,102,41,41,32,40,40,79,32,40,40,80,32,+34,110,111,77,97,116,99,104,34,41,32,110,111,77,97,116,99,104,41,41,+32,40,40,79,32,40,40,80,32,34,110,111,68,101,102,97,117,108,116,34,+41,32,110,111,68,101,102,97,117,108,116,41,41,32,40,40,79,32,40,40,+80,32,34,73,79,46,62,62,61,34,41,32,73,79,46,62,62,61,41,41,+32,40,40,79,32,40,40,80,32,34,73,79,46,62,62,34,41,32,73,79,+46,62,62,41,41,32,40,40,79,32,40,40,80,32,34,73,79,46,114,101,+116,117,114,110,34,41,32,73,79,46,114,101,116,117,114,110,41,41,32,40,+40,79,32,40,40,80,32,34,73,79,46,112,114,105,110,116,34,41,32,73,+79,46,112,114,105,110,116,41,41,32,40,40,79,32,40,40,80,32,34,73,+79,46,115,101,114,105,97,108,105,122,101,34,41,32,73,79,46,115,101,114,+105,97,108,105,122,101,41,41,32,40,40,79,32,40,40,80,32,34,73,79,+46,100,101,115,101,114,105,97,108,105,122,101,34,41,32,73,79,46,100,101,+115,101,114,105,97,108,105,122,101,41,41,32,40,40,79,32,40,40,80,32,+34,73,79,46,115,116,100,105,110,34,41,32,73,79,46,115,116,100,105,110,+41,41,32,40,40,79,32,40,40,80,32,34,73,79,46,115,116,100,111,117,+116,34,41,32,73,79,46,115,116,100,111,117,116,41,41,32,40,40,79,32,+40,40,80,32,34,73,79,46,115,116,100,101,114,114,34,41,32,73,79,46,+115,116,100,101,114,114,41,41,32,40,40,79,32,40,40,80,32,34,73,79,+46,103,101,116,65,114,103,115,34,41,32,73,79,46,103,101,116,65,114,103,+115,41,41,32,40,40,79,32,40,40,80,32,34,73,79,46,100,114,111,112,+65,114,103,115,34,41,32,73,79,46,100,114,111,112,65,114,103,115,41,41,+32,40,40,79,32,40,40,80,32,34,73,79,46,112,101,114,102,111,114,109,+73,79,34,41,32,73,79,46,112,101,114,102,111,114,109,73,79,41,41,32,+40,40,79,32,40,40,80,32,34,73,79,46,99,97,116,99,104,34,41,32,+73,79,46,99,97,116,99,104,41,41,32,40,40,79,32,40,40,80,32,34,+100,121,110,115,121,109,34,41,32,100,121,110,115,121,109,41,41,32,40,40,+79,32,40,40,80,32,34,110,101,119,67,65,83,116,114,105,110,103,34,41,+32,110,101,119,67,65,83,116,114,105,110,103,41,41,32,40,40,79,32,40,+40,80,32,34,112,101,101,107,67,65,83,116,114,105,110,103,34,41,32,112,+101,101,107,67,65,83,116,114,105,110,103,41,41,32,40,40,79,32,40,40,+80,32,34,116,111,73,110,116,34,41,32,116,111,73,110,116,41,41,32,40,+40,79,32,40,40,80,32,34,116,111,80,116,114,34,41,32,116,111,80,116,+114,41,41,32,40,40,79,32,40,40,80,32,34,116,111,68,98,108,34,41,+32,116,111,68,98,108,41,41,32,75,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,65,32,58,49,49,+48,53,32,34,68,97,116,97,46,66,111,111,108,95,84,121,112,101,46,34,+41,32,40,40,65,32,58,49,49,48,54,32,34,68,97,116,97,46,76,105,+115,116,95,84,121,112,101,46,34,41,32,40,40,65,32,58,49,49,48,55,+32,34,80,114,105,109,105,116,105,118,101,115,46,73,110,116,34,41,32,40,+40,65,32,58,49,49,48,56,32,34,80,114,105,109,105,116,105,118,101,115,+46,87,111,114,100,34,41,32,40,40,65,32,58,49,49,48,57,32,34,80,+114,105,109,105,116,105,118,101,115,46,68,111,117,98,108,101,34,41,32,40,+40,65,32,58,49,49,49,48,32,34,80,114,105,109,105,116,105,118,101,115,+46,67,104,97,114,34,41,32,40,40,65,32,58,49,49,49,49,32,34,68,+97,116,97,46,73,110,116,101,103,101,114,95,84,121,112,101,46,73,110,116,+101,103,101,114,34,41,32,40,40,65,32,58,49,49,49,50,32,34,80,114,+105,109,105,116,105,118,101,115,46,126,34,41,32,40,40,65,32,58,49,49,+49,51,32,34,80,114,105,109,105,116,105,118,101,115,46,61,62,34,41,32,+40,40,65,32,58,49,49,49,52,32,34,80,114,105,109,105,116,105,118,101,+115,46,45,62,34,41,32,40,40,65,32,58,49,49,49,53,32,40,40,66,+32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,67,+41,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,+32,40,66,32,40,66,32,67,41,41,41,41,41,41,32,40,40,66,32,40,+66,32,40,66,32,40,66,32,40,66,32,67,41,41,41,41,41,32,40,40,+66,32,40,66,32,40,66,32,40,66,32,67,41,41,41,41,32,40,40,66,+32,40,66,32,40,66,32,67,41,41,41,32,40,40,66,32,40,66,32,67,+41,41,32,80,41,41,41,41,41,41,41,32,40,40,65,32,58,49,49,49,+54,32,40,85,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,+40,75,32,65,41,41,41,41,41,41,41,41,32,40,40,65,32,58,49,49,+49,55,32,40,40,66,32,40,66,32,67,41,41,32,80,41,41,32,40,40,+65,32,58,49,49,49,56,32,80,41,32,40,40,65,32,58,49,49,49,57,+32,80,41,32,40,40,65,32,58,49,49,50,48,32,40,40,95,50,48,49,+32,40,40,67,32,66,41,32,40,40,66,32,90,41,32,40,40,67,32,66,+41,32,40,40,66,32,90,41,32,40,40,40,67,39,32,66,41,32,40,40,+66,32,40,95,50,48,50,32,95,56,57,50,41,41,32,95,49,49,51,54,+41,41,32,95,49,49,51,54,41,41,41,41,41,41,32,40,95,50,48,53,+32,95,49,49,50,48,41,41,41,32,40,40,65,32,58,49,49,50,49,32,+40,85,32,65,41,41,32,40,40,65,32,58,49,49,50,50,32,40,40,66,+32,40,66,32,67,41,41,32,80,41,41,32,40,40,65,32,58,49,49,50,+51,32,40,40,66,32,85,41,32,40,40,66,32,40,40,67,39,32,40,67,+39,32,67,41,41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,+40,40,40,83,39,32,66,41,32,40,40,66,32,40,67,39,32,83,39,41,+41,32,40,40,66,32,40,40,67,39,32,67,39,41,32,40,40,66,32,95,+49,48,57,57,41,32,95,49,50,50,52,41,41,41,32,40,40,40,67,39,+32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,+41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,+40,40,67,32,40,40,40,67,39,32,83,39,41,32,95,49,49,55,51,41,+32,40,85,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,75,+41,41,41,41,41,41,41,41,32,40,85,32,40,75,32,40,90,32,40,90,+32,40,90,32,40,90,32,75,41,41,41,41,41,41,41,41,32,40,85,32,+40,75,32,40,75,32,40,90,32,40,90,32,40,90,32,75,41,41,41,41,+41,41,41,41,32,40,85,32,40,75,32,40,75,32,40,75,32,40,90,32,+40,90,32,75,41,41,41,41,41,41,41,41,32,40,85,32,40,75,32,40,+75,32,40,75,32,40,75,32,40,90,32,75,41,41,41,41,41,41,41,41,+32,40,85,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,75,+41,41,41,41,41,41,41,41,32,40,85,32,40,75,32,40,75,32,40,75,+32,40,75,32,40,75,32,65,41,41,41,41,41,41,41,41,41,41,32,40,+40,40,83,39,32,40,67,39,32,66,41,41,32,40,40,66,32,40,66,32,+40,83,39,32,83,41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,+66,32,40,67,39,32,40,83,39,32,83,41,41,41,32,40,40,66,32,40,+67,39,32,40,67,39,32,67,41,41,41,32,40,40,40,67,39,32,40,67,+39,32,40,67,39,32,83,41,41,41,32,40,40,40,67,39,32,40,83,39,+32,40,67,39,32,67,41,41,41,32,40,40,40,67,39,32,40,67,39,32,+40,67,39,32,83,41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,+66,32,67,41,32,40,40,40,67,39,32,40,67,39,32,67,39,41,41,32,+40,40,40,67,39,32,66,41,32,95,49,49,50,52,41,32,40,40,66,32,+40,95,52,52,53,32,40,40,95,50,54,57,32,40,95,50,48,50,32,95,+56,57,50,41,41,32,95,53,54,53,41,41,41,32,40,40,66,32,95,51,+57,51,41,32,40,40,66,32,40,95,51,57,52,32,40,85,32,40,75,32,+40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,40,+67,32,79,41,32,75,41,41,41,41,41,41,41,41,41,41,41,32,95,57,+50,50,41,41,41,41,41,32,40,40,66,32,95,51,57,51,41,32,40,85,+32,40,90,32,75,41,41,41,41,41,41,32,40,40,66,32,95,57,50,51,+41,32,95,49,49,52,51,41,41,41,32,40,40,66,32,95,51,57,51,41,+32,40,85,32,40,75,32,75,41,41,41,41,41,32,40,40,66,32,95,57,+50,51,41,32,95,49,49,53,48,41,41,41,32,40,40,66,32,95,51,57,+51,41,32,40,85,32,40,75,32,65,41,41,41,41,41,41,41,32,40,40,+66,32,40,66,32,40,66,32,40,95,50,54,49,32,95,52,49,53,41,41,+41,41,32,40,40,67,39,32,40,67,39,32,95,51,57,53,41,41,32,40,+40,40,83,39,32,67,41,32,40,40,40,83,39,32,67,41,32,40,40,40,+83,39,32,67,41,32,40,40,66,32,40,67,32,95,49,49,50,54,41,41,+32,95,49,49,52,49,41,41,32,95,49,49,52,50,41,41,32,95,49,49,+52,53,41,41,32,95,49,49,52,56,41,41,41,41,41,41,32,40,40,66,+32,40,66,32,40,66,32,40,66,32,95,57,50,52,41,41,41,41,32,40,+40,66,32,40,66,32,40,66,32,40,66,32,40,95,51,57,52,32,40,85,+32,40,40,40,67,39,32,40,67,39,32,79,41,41,32,80,41,32,75,41,+41,41,41,41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,+40,67,39,32,40,67,39,32,95,52,54,50,41,41,41,32,40,40,40,67,+39,32,66,41,32,40,66,39,32,80,41,41,32,95,49,49,51,50,41,41,+41,32,40,95,51,57,52,32,40,85,32,40,40,67,32,66,41,32,40,90,+32,40,40,66,32,40,66,32,90,41,41,32,40,40,40,67,39,32,40,67,+39,32,40,67,39,32,79,41,41,41,32,40,40,67,39,32,40,67,39,32,+80,41,41,32,95,52,55,49,41,41,32,75,41,41,41,41,41,41,41,41,+41,41,41,41,32,95,49,49,51,52,41,41,41,32,40,95,51,57,53,32,+95,49,49,50,53,41,41,41,41,32,40,40,65,32,58,49,49,50,52,32,+40,40,66,32,40,66,32,40,40,83,39,32,66,41,32,40,66,39,32,40,+66,39,32,40,40,66,32,40,83,39,32,66,41,41,32,40,40,66,32,40,+66,32,95,49,52,56,49,41,41,32,40,40,40,67,39,32,66,41,32,40,+40,66,32,95,49,52,56,49,41,32,40,89,32,40,40,66,32,40,80,32,+95,49,51,52,49,41,41,32,40,40,66,32,40,67,32,66,41,41,32,40,+40,66,32,90,41,32,40,40,66,32,40,66,32,90,41,41,32,40,66,32,+40,67,32,95,49,52,56,49,41,41,41,41,41,41,41,41,41,32,40,89,+32,40,40,66,32,40,80,32,95,49,51,52,49,41,41,32,40,40,66,32,+40,67,32,66,41,41,32,40,40,66,32,90,41,32,40,66,32,40,67,32,+95,49,52,56,49,41,41,41,41,41,41,41,41,41,41,41,41,41,41,32,+95,49,49,49,53,41,41,32,40,40,65,32,58,49,49,50,53,32,40,40,+83,32,73,41,32,40,40,66,32,40,83,32,66,41,41,32,40,40,66,32,+40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,+66,32,40,66,32,90,41,41,32,40,40,40,67,39,32,66,41,32,40,66,+39,32,80,41,41,32,40,40,66,32,40,66,32,85,41,41,32,40,40,66,+32,40,40,67,39,32,66,41,32,66,41,41,32,40,40,40,67,39,32,66,+41,32,40,40,66,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,+39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,67,41,+41,41,41,41,41,41,41,41,32,40,40,67,32,40,40,40,67,39,32,83,+39,41,32,40,40,66,32,67,39,41,32,40,40,66,32,67,39,41,32,40,+40,66,32,67,39,41,32,40,40,66,32,67,39,41,32,40,40,66,32,67,+39,41,32,40,40,66,32,67,39,41,32,40,40,66,32,67,39,41,32,40,+40,66,32,67,39,41,32,40,40,66,32,67,39,41,32,40,66,39,32,80,+41,41,41,41,41,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,+66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,67,39,+32,67,41,41,41,41,41,41,41,41,41,32,40,40,40,83,39,32,40,67,+39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,+39,32,66,41,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,+32,40,66,32,40,66,32,40,66,32,40,66,32,40,83,39,32,67,41,41,+41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,+40,66,32,40,66,32,40,67,39,32,67,41,41,41,41,41,41,41,32,40,+40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,67,39,32,67,+41,41,41,41,41,41,32,40,40,66,32,40,40,67,39,32,40,67,39,32,+66,41,41,32,40,40,66,32,40,66,32,67,39,41,41,32,40,40,66,32,+40,66,32,67,39,41,41,32,95,49,49,49,53,41,41,41,41,32,40,40,+66,32,40,66,32,40,40,83,39,32,40,83,39,32,95,50,54,49,41,41,+32,40,40,66,32,40,66,32,95,51,57,53,41,41,32,40,40,66,32,40,+66,32,40,83,32,73,41,41,41,32,40,40,66,32,40,66,32,40,66,32,+40,66,32,90,41,41,41,41,32,40,40,66,32,40,66,32,67,41,41,32,+40,40,40,67,39,32,40,67,39,32,40,83,39,32,67,39,41,41,41,32,+67,41,32,40,40,40,67,39,32,67,41,32,95,49,49,49,55,41,32,95,+52,54,49,41,41,41,41,41,41,41,41,41,32,40,40,66,32,40,67,39,+32,40,67,39,32,95,51,57,54,41,41,41,32,40,40,66,32,40,66,32,+40,66,32,85,41,41,41,32,40,40,66,32,40,66,32,40,66,32,90,41,+41,41,32,40,40,66,32,40,66,32,40,66,32,90,41,41,41,32,40,40,+66,32,40,40,67,39,32,66,41,32,67,41,41,32,40,40,66,32,95,52,+54,51,41,32,40,95,51,57,52,32,40,40,67,32,40,40,80,32,40,75,+32,75,41,41,32,40,40,67,32,79,41,32,75,41,41,41,32,40,75,32,+75,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,66,+32,40,67,39,32,95,51,57,54,41,41,32,40,40,66,32,40,66,32,85,+41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,82,41,+32,40,95,51,57,52,32,40,40,67,32,40,40,80,32,40,75,32,75,41,+41,32,40,75,32,75,41,41,41,32,40,40,67,32,79,41,32,75,41,41,+41,41,41,41,41,41,41,41,41,32,40,95,51,57,52,32,40,40,67,32,+40,40,80,32,40,40,67,32,79,41,32,75,41,41,32,40,75,32,75,41,+41,41,32,40,75,32,75,41,41,41,41,41,41,32,40,40,67,39,32,40,+67,39,32,40,95,50,48,51,32,95,49,49,55,41,41,41,32,40,95,52,+51,50,32,95,56,57,50,41,41,41,41,41,41,41,41,41,41,41,41,32,+40,40,65,32,58,49,49,50,54,32,40,40,40,67,39,32,40,67,39,32,+40,83,39,32,40,67,39,32,40,67,39,32,67,41,41,41,41,41,32,40,+40,40,67,39,32,40,83,39,32,40,67,39,32,40,67,39,32,40,83,39,+32,67,41,41,41,41,41,32,40,40,40,67,39,32,66,41,32,40,66,39,+32,40,66,39,32,40,66,39,32,40,40,66,32,80,41,32,40,40,40,67,+39,32,67,41,32,40,40,40,67,39,32,83,41,32,40,67,32,95,57,50,+56,41,41,32,40,40,40,83,39,32,95,50,54,49,41,32,40,40,66,32,+95,56,51,54,41,32,40,95,56,48,53,32,95,56,48,55,41,41,41,32,+40,40,66,32,40,95,52,54,51,32,34,117,110,100,101,102,105,110,101,100,+32,109,111,100,117,108,101,58,32,34,41,41,32,95,57,48,50,41,41,41,+41,32,40,85,32,40,75,32,40,75,32,40,90,32,40,40,66,32,90,41,+32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,67,+41,41,32,80,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,+66,32,40,40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,32,+40,40,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,83,41,+41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,40,67,+39,32,40,67,39,32,40,67,39,32,67,41,41,41,41,41,41,32,40,40,+40,67,39,32,40,67,39,32,66,41,41,32,40,40,66,32,40,66,32,40,+67,39,32,40,67,39,32,40,83,39,32,80,41,41,41,41,41,32,40,40,+40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,+79,41,41,41,41,41,32,40,40,66,32,40,66,32,40,40,67,39,32,40,+67,39,32,66,41,41,32,95,49,49,49,55,41,41,41,32,95,49,49,51,+51,41,41,32,75,41,41,41,32,40,40,40,67,39,32,83,41,32,40,40,+40,67,39,32,67,41,32,40,67,32,95,57,50,56,41,41,32,95,52,54,+49,41,41,32,40,40,40,67,39,32,40,67,39,32,79,41,41,32,80,41,+32,75,41,41,41,41,32,95,52,54,49,41,41,32,95,49,49,50,56,41,+41,41,32,40,67,32,95,49,49,50,55,41,41,41,41,32,40,40,66,32,+40,40,67,39,32,83,41,32,40,40,40,67,39,32,40,67,39,32,83,41,+41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,+67,41,41,41,41,32,40,40,66,32,40,40,67,39,32,40,67,39,32,66,+41,41,32,40,40,66,32,40,66,32,80,41,41,32,40,40,40,67,39,32,+40,67,39,32,79,41,41,32,40,40,40,67,39,32,67,41,32,95,49,49,+49,55,41,32,95,52,54,49,41,41,32,75,41,41,41,41,32,40,40,40,+67,39,32,83,41,32,40,40,40,67,39,32,67,41,32,40,67,32,95,57,+50,56,41,41,32,95,52,54,49,41,41,32,40,40,40,67,39,32,40,67,+39,32,79,41,41,32,80,41,32,75,41,41,41,41,32,95,52,54,49,41,+41,32,95,49,49,50,56,41,41,41,32,40,67,32,95,49,49,50,55,41,+41,41,41,32,40,40,66,32,40,66,32,40,67,32,40,40,80,32,95,52,+54,49,41,32,95,52,54,49,41,41,41,41,32,40,40,40,67,39,32,40,+67,39,32,79,41,41,32,40,40,66,32,40,83,32,95,49,49,49,56,41,+41,32,40,67,32,95,49,49,50,55,41,41,41,32,75,41,41,41,41,32,+40,40,65,32,58,49,49,50,55,32,40,40,40,83,39,32,66,41,32,40,+40,66,32,95,50,54,49,41,32,40,40,40,67,39,32,95,49,55,55,41,+32,40,40,66,32,95,56,51,54,41,32,40,95,56,48,53,32,95,56,48,+55,41,41,41,32,95,50,54,52,41,41,41,32,40,95,49,51,51,51,32,+34,101,120,112,111,114,116,34,41,41,41,32,40,40,65,32,58,49,49,50,+56,32,40,40,67,32,40,40,67,32,66,41,32,40,40,66,32,90,41,32,+40,40,40,83,39,32,67,41,32,40,40,40,83,39,32,67,41,32,40,40,+40,83,39,32,67,41,32,40,40,40,83,39,32,67,41,32,40,40,40,83,+39,32,67,41,32,40,40,40,83,39,32,67,41,32,40,40,40,83,39,32,+67,41,32,40,40,40,83,39,32,67,41,32,40,40,40,83,39,32,67,41,+32,40,40,40,83,39,32,67,41,32,40,40,40,83,39,32,67,41,32,40,+40,40,83,39,32,67,41,32,40,40,40,83,39,32,67,41,32,40,40,40,+83,39,32,67,41,32,40,40,40,83,39,32,67,41,32,40,40,40,83,39,+32,67,41,32,40,40,66,32,40,80,32,73,41,41,32,40,90,32,75,41,+41,41,32,40,90,32,75,41,41,41,32,75,41,41,32,40,90,32,75,41,+41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,75,+41,41,32,75,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,+41,41,32,40,90,32,75,41,41,41,32,40,90,32,40,90,32,75,41,41,+41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,75,+41,41,32,75,41,41,32,40,90,32,75,41,41,41,41,41,32,40,95,50,+52,32,34,116,121,81,73,100,101,110,116,34,41,41,41,32,40,40,65,32,+58,49,49,50,57,32,40,40,66,32,40,95,50,54,51,32,95,55,52,51,+41,41,32,95,56,57,56,41,41,32,40,40,65,32,58,49,49,51,48,32,+40,40,67,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,+41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,+40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,+40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,+39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,+83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,+32,40,40,40,67,39,32,83,41,32,40,40,67,32,40,40,40,67,39,32,+83,39,41,32,40,40,80,32,73,41,32,40,90,32,95,49,49,51,48,41,+41,41,32,40,90,32,75,41,41,41,32,75,41,41,32,40,90,32,75,41,+41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,75,+41,41,32,75,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,+41,41,32,40,90,32,75,41,41,41,32,40,90,32,40,90,32,75,41,41,+41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,75,+41,41,32,75,41,41,32,40,90,32,75,41,41,41,32,40,95,50,52,32,+34,103,101,116,65,112,112,67,111,110,34,41,41,41,32,40,40,65,32,58,+49,49,51,49,32,40,40,89,32,40,40,40,67,39,32,40,67,39,32,67,+41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,+41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,+32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,32,+40,40,40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,32,40,+40,40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,32,40,40,+40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,32,40,40,40,+67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,32,40,40,40,67,+39,32,40,67,39,32,40,67,39,32,83,41,41,41,32,40,40,40,67,39,+32,40,67,39,32,40,67,39,32,83,41,41,41,32,40,40,40,67,39,32,+40,67,39,32,40,67,39,32,83,41,41,41,32,40,40,40,67,39,32,40,+67,39,32,40,67,39,32,83,41,41,41,32,40,40,40,67,39,32,40,67,+39,32,40,67,39,32,83,41,41,41,32,40,40,40,67,39,32,40,67,39,+32,40,67,39,32,83,41,41,41,32,40,40,40,67,39,32,40,67,39,32,+40,67,39,32,83,41,41,41,32,40,40,40,67,39,32,40,67,39,32,67,+41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,83,39,41,+41,41,32,40,40,66,32,40,40,83,39,32,80,41,32,40,67,32,80,41,+41,41,32,40,40,40,67,39,32,66,41,32,67,39,41,32,40,67,32,95,+52,54,50,41,41,41,41,32,40,90,32,75,41,41,41,32,75,41,41,32,+40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,+41,41,41,32,75,41,41,32,75,41,41,32,40,90,32,75,41,41,41,32,+40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,40,+90,32,75,41,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,+41,41,41,32,75,41,41,32,75,41,41,32,40,90,32,75,41,41,41,32,+40,95,50,52,32,34,103,101,116,65,112,112,34,41,41,41,32,95,52,54,+49,41,41,32,40,40,65,32,58,49,49,51,50,32,40,40,40,67,39,32,+83,41,32,40,40,40,67,39,32,40,83,39,32,83,41,41,32,40,40,40,+67,39,32,40,83,39,32,40,83,39,32,67,41,41,41,32,40,40,40,67,+39,32,40,67,39,32,40,67,39,32,40,67,39,32,67,41,41,41,41,32,+40,40,40,83,39,32,40,67,39,32,40,83,39,32,40,67,39,32,67,41,+41,41,41,32,40,40,40,67,39,32,40,83,39,32,40,67,39,32,40,67,+39,32,67,41,41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,+32,40,67,39,32,40,67,39,32,67,41,41,41,32,40,40,40,83,39,32,+83,41,32,40,40,40,83,39,32,40,67,39,32,67,39,41,41,32,40,40,+66,32,40,66,32,67,39,41,41,32,40,40,66,32,40,83,32,95,49,49,+49,53,41,41,32,40,40,67,39,32,95,51,57,52,41,32,40,40,40,67,+39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,+67,41,32,40,40,66,32,40,67,32,40,40,67,32,40,40,67,32,40,40,+67,32,40,40,67,32,40,40,67,32,40,40,80,32,40,75,32,40,75,32,+75,41,41,41,32,40,75,32,40,75,32,75,41,41,41,41,32,40,75,32,+40,75,32,75,41,41,41,41,32,40,75,32,40,75,32,75,41,41,41,41,+32,40,75,32,40,75,32,75,41,41,41,41,32,40,75,32,75,41,41,41,+32,40,75,32,40,75,32,40,75,32,75,41,41,41,41,41,41,32,40,40,+66,32,40,66,32,95,51,57,52,41,41,32,40,40,40,67,39,32,40,67,+39,32,40,67,39,32,79,41,41,41,32,40,40,66,32,40,67,39,32,80,+41,41,32,95,57,48,53,41,41,32,75,41,41,41,41,32,40,75,32,40,+75,32,40,75,32,40,75,32,75,41,41,41,41,41,41,32,40,75,32,40,+75,32,40,75,32,40,75,32,75,41,41,41,41,41,41,32,40,75,32,75,+41,41,41,41,41,41,32,40,40,40,83,39,32,40,83,39,32,40,83,39,+32,95,52,54,51,41,41,41,32,40,40,67,39,32,40,67,39,32,95,51,+57,52,41,41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,+40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,40,67,39,32,40,+67,39,32,67,41,41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,+32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,40,67,39,+32,40,67,39,32,67,41,41,32,40,40,40,67,39,32,40,67,39,32,67,+41,41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,40,+67,39,32,40,67,39,32,67,41,41,32,40,40,40,67,39,32,40,67,39,+32,80,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,+40,66,32,85,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,+40,67,39,32,40,67,39,32,40,67,39,32,79,41,41,41,32,40,40,66,+32,83,41,32,40,83,32,95,49,49,49,55,41,41,41,32,75,41,41,41,+41,41,32,40,75,32,40,75,32,75,41,41,41,41,32,40,75,32,40,75,+32,75,41,41,41,41,32,40,75,32,40,75,32,75,41,41,41,41,32,40,+75,32,40,75,32,75,41,41,41,41,32,40,75,32,75,41,41,41,32,40,+75,32,40,75,32,40,75,32,75,41,41,41,41,41,32,40,75,32,40,75,+32,75,41,41,41,41,32,40,75,32,40,75,32,40,75,32,40,75,32,75,+41,41,41,41,41,41,32,40,75,32,40,75,32,40,75,32,40,75,32,75,+41,41,41,41,41,41,32,40,75,32,75,41,41,41,41,32,40,40,40,83,+39,32,40,83,39,32,40,83,39,32,95,52,54,51,41,41,41,32,40,40,+67,39,32,40,67,39,32,95,51,57,52,41,41,32,40,40,40,67,39,32,+40,67,39,32,67,41,41,32,40,40,40,67,39,32,40,67,39,32,67,41,+41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,40,67,+39,32,40,67,39,32,67,41,41,32,40,40,40,67,39,32,40,67,39,32,+67,41,41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,+40,67,39,32,40,67,39,32,67,41,41,32,40,40,40,67,39,32,40,67,+39,32,67,41,41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,+40,40,66,32,40,66,32,40,80,32,40,75,32,40,75,32,75,41,41,41,+41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,+32,85,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,40,67,+39,32,40,67,39,32,40,67,39,32,79,41,41,41,32,40,40,66,32,83,+41,32,40,83,32,95,49,49,49,55,41,41,41,32,75,41,41,41,41,41,+41,32,40,75,32,40,75,32,75,41,41,41,41,32,40,75,32,40,75,32,+75,41,41,41,41,32,40,75,32,40,75,32,75,41,41,41,41,32,40,75,+32,75,41,41,41,32,40,75,32,40,75,32,40,75,32,75,41,41,41,41,+41,32,40,75,32,40,75,32,75,41,41,41,41,32,40,75,32,40,75,32,+40,75,32,40,75,32,75,41,41,41,41,41,41,32,40,75,32,40,75,32,+40,75,32,40,75,32,75,41,41,41,41,41,41,32,40,75,32,75,41,41,+41,41,32,40,40,40,83,39,32,40,83,39,32,40,67,39,32,95,52,54,+51,41,41,41,32,40,40,67,39,32,40,67,39,32,95,51,57,52,41,41,+32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,40,67,39,+32,40,67,39,32,67,41,41,32,40,40,66,32,40,66,32,40,67,32,40,+40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,+40,67,32,40,40,80,32,40,75,32,40,75,32,75,41,41,41,32,40,75,+32,40,75,32,75,41,41,41,41,32,40,75,32,40,75,32,75,41,41,41,+41,32,40,75,32,40,75,32,75,41,41,41,41,32,40,75,32,40,75,32,+75,41,41,41,41,32,40,75,32,75,41,41,41,32,40,75,32,40,75,32,+40,75,32,75,41,41,41,41,41,32,40,75,32,40,75,32,75,41,41,41,+41,41,41,32,40,40,66,32,90,41,32,40,40,66,32,40,66,32,90,41,+41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,+85,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,40,67,39,+32,40,67,39,32,40,67,39,32,79,41,41,41,32,40,40,66,32,83,41,+32,40,83,32,95,49,49,49,55,41,41,41,32,75,41,41,41,41,41,41,+41,41,32,40,75,32,40,75,32,40,75,32,40,75,32,75,41,41,41,41,+41,41,32,40,75,32,75,41,41,41,41,32,40,40,67,39,32,95,51,57,+52,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,+32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,+40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,+67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,66,32,40,+67,32,40,40,80,32,40,75,32,40,75,32,75,41,41,41,32,40,75,32,+40,75,32,75,41,41,41,41,41,32,40,40,66,32,90,41,32,40,40,66,+32,85,41,32,40,40,66,32,90,41,32,40,40,40,67,39,32,40,67,39,+32,79,41,41,32,40,40,40,67,39,32,67,41,32,40,83,32,95,49,49,+49,55,41,41,32,95,52,54,49,41,41,32,75,41,41,41,41,41,41,32,+40,75,32,40,75,32,75,41,41,41,41,32,40,75,32,40,75,32,75,41,+41,41,41,32,40,75,32,75,41,41,41,32,40,75,32,40,75,32,40,75,+32,75,41,41,41,41,41,32,40,75,32,40,75,32,75,41,41,41,41,32,+40,75,32,40,75,32,40,75,32,40,75,32,75,41,41,41,41,41,41,32,+40,75,32,40,75,32,40,75,32,40,75,32,75,41,41,41,41,41,41,32,+40,75,32,75,41,41,41,41,41,41,41,41,32,40,40,67,39,32,95,51,+57,52,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,+41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,+40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,+40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,66,32,+40,67,32,40,40,80,32,40,75,32,40,75,32,75,41,41,41,32,40,75,+32,40,75,32,75,41,41,41,41,41,32,40,40,66,32,40,67,32,66,41,+41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,+79,41,41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,40,+67,39,32,66,41,41,32,40,40,66,32,40,66,32,80,41,41,32,95,57,+48,53,41,41,41,32,40,67,32,95,55,54,48,41,41,41,32,75,41,41,+41,41,32,40,75,32,40,75,32,75,41,41,41,41,32,40,75,32,40,75,+32,75,41,41,41,41,32,40,75,32,75,41,41,41,32,40,75,32,40,75,+32,40,75,32,75,41,41,41,41,41,32,40,75,32,40,75,32,75,41,41,+41,41,32,40,75,32,40,75,32,40,75,32,40,75,32,75,41,41,41,41,+41,41,32,40,75,32,40,75,32,40,75,32,40,75,32,75,41,41,41,41,+41,41,32,40,75,32,75,41,41,41,41,41,41,32,40,40,66,32,95,57,+50,51,41,32,95,49,49,52,56,41,41,41,32,40,40,66,32,95,57,50,+51,41,32,95,49,49,53,48,41,41,41,32,40,40,67,39,32,95,51,57,+52,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,+32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,+40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,66,+32,40,67,32,40,40,67,32,40,40,67,32,40,40,80,32,40,75,32,40,+75,32,75,41,41,41,32,40,75,32,40,75,32,75,41,41,41,41,32,40,+75,32,40,75,32,75,41,41,41,41,32,40,75,32,40,75,32,75,41,41,+41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,79,41,+41,41,32,40,40,66,32,40,40,83,39,32,66,41,32,95,49,49,49,56,+41,41,32,40,40,66,32,40,66,32,95,49,49,49,57,41,41,32,40,40,+66,32,40,66,32,95,55,52,51,41,41,32,95,57,48,53,41,41,41,41,+32,75,41,41,41,32,40,75,32,75,41,41,41,32,40,75,32,40,75,32,+40,75,32,75,41,41,41,41,41,32,40,75,32,40,75,32,75,41,41,41,+41,32,40,75,32,40,75,32,40,75,32,40,75,32,75,41,41,41,41,41,+41,32,40,75,32,40,75,32,40,75,32,40,75,32,75,41,41,41,41,41,+41,32,40,75,32,75,41,41,41,41,41,32,95,49,51,48,50,41,41,32,+40,40,40,67,39,32,66,41,32,40,66,39,32,40,40,40,83,39,32,95,+49,49,51,51,41,32,95,49,49,52,50,41,32,95,49,49,52,53,41,41,+41,32,95,57,48,53,41,41,41,32,40,40,40,67,39,32,40,67,39,32,+67,41,41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,+66,32,40,40,67,39,32,40,67,39,32,40,95,49,51,51,51,32,75,41,+41,41,32,95,57,48,53,41,41,32,95,49,49,52,49,41,41,32,40,75,+32,95,49,51,48,50,41,41,41,32,73,41,41,41,32,95,49,49,52,55,+41,41,32,40,40,65,32,58,49,49,51,51,32,40,40,40,67,39,32,66,+41,32,40,66,39,32,40,40,66,32,95,51,57,53,41,32,40,40,66,32,+40,40,83,39,32,95,49,49,49,56,41,32,95,57,48,57,41,41,32,40,+40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,67,32,+40,95,49,51,51,51,32,75,41,41,41,32,40,75,32,95,49,51,48,50,+41,41,41,32,73,41,41,41,41,41,32,40,40,66,32,40,66,32,40,95,+50,54,49,32,40,95,52,55,49,32,95,52,54,49,41,41,41,41,32,40,+67,32,95,57,50,56,41,41,41,41,32,40,40,65,32,58,49,49,51,52,+32,40,40,67,32,40,40,40,83,39,32,40,67,39,32,67,41,41,32,40,+40,40,83,39,32,40,83,39,32,67,41,41,32,40,40,40,83,39,32,40,+67,39,32,67,41,41,32,40,40,40,83,39,32,40,67,39,32,67,41,41,+32,40,40,40,83,39,32,40,67,39,32,67,41,41,32,40,40,40,83,39,+32,66,41,32,40,40,66,32,80,41,32,40,40,66,32,95,57,50,52,41,+32,40,95,51,57,52,32,40,85,32,40,75,32,40,85,32,40,75,32,40,+90,32,40,90,32,40,90,32,40,90,32,40,90,32,75,41,41,41,41,41,+41,41,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,95,50,54,+49,32,40,95,49,51,51,52,32,40,95,52,51,56,32,95,49,49,50,48,+41,41,41,41,41,32,40,40,67,39,32,95,51,57,52,41,32,40,40,66,+32,85,41,32,40,40,66,32,40,66,32,85,41,41,32,40,40,66,32,40,+66,32,90,41,41,32,40,40,66,32,40,66,32,40,66,32,90,41,41,41,+32,40,40,66,32,40,66,32,40,66,32,90,41,41,41,32,40,40,66,32,+40,66,32,40,66,32,90,41,41,41,32,40,40,66,32,40,66,32,40,66,+32,90,41,41,41,32,40,40,66,32,40,66,32,40,66,32,90,41,41,41,+32,40,40,66,32,40,66,32,40,66,32,95,51,57,52,41,41,41,32,40,+40,66,32,40,66,32,40,66,32,85,41,41,41,32,40,40,66,32,40,66,+32,40,66,32,40,66,32,90,41,41,41,41,32,40,66,32,40,66,32,40,+66,32,40,40,67,39,32,95,51,57,52,41,32,40,40,40,67,39,32,40,+67,39,32,79,41,41,32,40,40,66,32,40,67,32,80,41,41,32,40,40,+67,32,79,41,32,75,41,41,41,32,75,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,32,40,40,66,32,95,57,50,52,+41,32,40,95,51,57,52,32,40,85,32,40,75,32,40,85,32,40,75,32,+40,75,32,40,75,32,40,90,32,40,90,32,40,90,32,75,41,41,41,41,+41,41,41,41,41,41,41,41,41,32,40,40,66,32,40,95,50,54,49,32,+95,57,50,52,41,41,32,40,95,51,57,52,32,40,85,32,40,75,32,40,+85,32,40,75,32,40,75,32,40,75,32,40,75,32,40,90,32,40,90,32,+75,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,66,32,40,+95,50,54,49,32,40,95,57,50,53,32,95,49,49,51,53,41,41,41,32,+40,95,51,57,52,32,40,85,32,40,75,32,40,85,32,40,75,32,40,75,+32,40,75,32,40,75,32,40,75,32,40,90,32,75,41,41,41,41,41,41,+41,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,95,50,54,49,+32,40,95,49,51,51,52,32,40,95,52,51,56,32,95,49,49,50,48,41,+41,41,41,41,32,40,40,67,39,32,95,51,57,52,41,32,40,40,66,32,+85,41,32,40,40,66,32,40,66,32,85,41,41,32,40,40,66,32,40,66,+32,90,41,41,32,40,40,66,32,40,66,32,40,66,32,90,41,41,41,32,+40,40,66,32,40,66,32,40,66,32,40,66,32,90,41,41,41,41,32,40,+40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,90,41,41,41,41,+41,32,40,40,40,83,39,32,40,83,39,32,40,83,39,32,66,41,41,41,+32,40,40,66,32,40,66,32,66,39,41,41,32,40,40,66,32,40,66,32,+40,66,32,40,67,39,32,95,52,54,51,41,41,41,41,32,40,40,66,32,+40,66,32,40,66,32,95,51,57,52,41,41,41,32,40,40,66,32,40,66,+32,40,66,32,85,41,41,41,32,40,66,32,40,66,32,40,66,32,40,40,+67,39,32,95,51,57,52,41,32,40,40,40,67,39,32,40,67,39,32,79,+41,41,32,40,40,66,32,40,67,32,80,41,41,32,40,40,67,32,79,41,+32,75,41,41,41,32,75,41,41,41,41,41,41,41,41,41,41,32,40,40,+40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,66,41,41,41,+41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,95,52,54,51,41,+41,41,41,32,40,40,66,32,40,66,32,40,66,32,95,51,57,52,41,41,+41,32,40,40,66,32,40,66,32,40,66,32,85,41,41,41,32,40,40,66,+32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,+40,66,32,40,66,32,40,66,32,95,51,57,52,41,41,41,32,40,40,66,+32,40,66,32,40,66,32,85,41,41,41,32,40,66,32,40,66,32,40,66,+32,40,40,67,39,32,95,51,57,52,41,32,40,40,40,67,39,32,40,67,+39,32,79,41,41,32,40,40,66,32,40,67,32,80,41,41,32,40,40,67,+32,79,41,32,75,41,41,41,32,75,41,41,41,41,41,41,41,41,41,41,+41,41,41,32,40,95,51,57,52,32,40,85,32,40,40,66,32,85,41,32,+40,90,32,40,90,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,+40,40,66,32,40,67,32,40,40,40,67,39,32,40,67,39,32,79,41,41,+32,40,40,66,32,40,83,32,80,41,41,32,40,40,40,67,39,32,40,67,+39,32,79,41,41,32,40,40,67,39,32,95,49,49,49,57,41,32,95,55,+52,51,41,41,32,75,41,41,41,32,75,41,41,41,32,95,49,50,53,49,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+32,40,40,66,32,40,95,50,54,49,32,95,57,50,52,41,41,32,40,95,+51,57,52,32,40,85,32,40,40,67,32,66,41,32,40,90,32,40,90,32,+40,40,66,32,90,41,32,40,40,67,32,66,41,32,40,40,66,32,90,41,+32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,+41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,+32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,+40,66,32,40,67,32,40,40,67,39,32,95,51,57,52,41,32,40,40,66,+32,85,41,32,40,40,66,32,90,41,32,40,40,40,67,39,32,40,67,39,+32,40,67,39,32,79,41,41,41,32,40,40,40,83,39,32,40,67,39,32,+66,41,41,32,40,40,66,32,40,66,32,80,41,41,32,95,57,48,53,41,+41,32,40,40,66,32,95,51,57,52,41,32,40,40,66,32,85,41,32,40,+40,66,32,90,41,32,40,40,40,67,39,32,40,67,39,32,79,41,41,32,+95,57,48,53,41,32,75,41,41,41,41,41,41,32,75,41,41,41,41,41,+41,41,32,40,67,32,95,52,55,49,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,32,40,40,40,67,39,32,66,41,32,66,41,+32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,40,+66,32,90,41,41,41,32,40,40,66,32,40,40,67,39,32,40,67,39,32,+66,41,41,32,40,40,40,83,39,32,67,41,32,40,40,66,32,40,67,32,+83,39,41,41,32,40,40,40,83,39,32,66,41,32,79,41,32,40,40,40,+67,39,32,40,67,39,32,79,41,41,32,40,67,32,95,57,48,53,41,41,+32,75,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,79,41,41,+32,40,67,32,95,57,48,53,41,41,32,75,41,41,41,41,32,95,52,55,+49,41,41,41,41,41,41,32,40,40,65,32,58,49,49,51,53,32,40,40,+67,32,66,41,32,40,40,40,67,39,32,66,41,32,40,66,39,32,66,41,+41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,90,41,41,41,41,+32,40,40,66,32,40,66,32,67,41,41,32,40,40,40,67,39,32,66,41,+32,40,40,66,32,40,67,39,32,67,39,41,41,32,40,40,66,32,40,66,+32,95,49,49,50,50,41,41,32,40,40,66,32,40,67,32,40,95,51,57,+55,32,40,40,95,50,54,49,32,95,50,54,56,41,32,40,95,57,51,48,+32,75,41,41,41,41,41,32,95,57,50,51,41,41,41,41,32,40,95,52,+51,57,32,95,49,49,51,55,41,41,41,41,41,41,41,32,40,40,65,32,+58,49,49,51,54,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,+67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,+67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,+67,32,40,40,67,32,40,40,67,32,40,40,80,32,73,41,32,40,75,32,+40,75,32,95,49,51,48,50,41,41,41,41,32,40,75,32,40,75,32,95,+49,51,48,50,41,41,41,41,32,40,75,32,95,49,51,48,50,41,41,41,+32,40,75,32,40,75,32,95,49,51,48,50,41,41,41,41,32,40,75,32,+40,75,32,95,49,51,48,50,41,41,41,41,32,40,75,32,40,75,32,95,+49,51,48,50,41,41,41,41,32,40,75,32,95,49,51,48,50,41,41,41,+32,40,75,32,95,49,51,48,50,41,41,41,32,40,75,32,40,75,32,95,+49,51,48,50,41,41,41,41,32,40,75,32,40,75,32,95,49,51,48,50,+41,41,41,41,32,40,75,32,40,75,32,95,49,51,48,50,41,41,41,41,+32,40,75,32,40,75,32,40,75,32,95,49,51,48,50,41,41,41,41,41,+32,40,75,32,40,75,32,95,49,51,48,50,41,41,41,41,32,40,75,32,+40,75,32,95,49,51,48,50,41,41,41,41,32,40,75,32,95,49,51,48,+50,41,41,41,32,95,55,55,50,41,41,32,40,75,32,40,75,32,95,49,+51,48,50,41,41,41,41,32,40,40,65,32,58,49,49,51,55,32,40,40,+67,32,66,41,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,+40,67,32,66,41,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,+95,56,50,52,41,41,41,41,41,41,41,32,40,40,65,32,58,49,49,51,+56,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,+32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,67,+41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,66,32,40,66,32,+40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,+32,40,66,32,40,66,32,67,41,41,41,41,41,41,41,41,41,41,41,32,+40,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,+66,32,40,66,32,40,66,32,40,66,32,67,41,41,41,41,41,41,41,41,+41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,+66,32,40,66,32,40,66,32,40,66,32,67,41,41,41,41,41,41,41,41,+41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,+32,40,66,32,40,66,32,67,41,41,41,41,41,41,41,41,32,40,40,66,+32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,67,+41,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,+32,40,66,32,40,66,32,67,41,41,41,41,41,41,32,40,40,66,32,40,+66,32,40,66,32,40,66,32,40,66,32,67,41,41,41,41,41,32,40,40,+66,32,40,66,32,40,66,32,40,66,32,67,41,41,41,41,32,40,40,66,+32,40,66,32,40,66,32,67,41,41,41,32,40,40,66,32,40,66,32,67,+41,41,32,80,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,65,+32,58,49,49,51,57,32,75,41,32,40,40,65,32,58,49,49,52,48,32,+65,41,32,40,40,65,32,58,49,49,52,49,32,40,85,32,40,75,32,40,+75,32,40,75,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,+40,90,32,40,90,32,40,90,32,75,41,41,41,41,41,41,41,41,41,41,+41,41,41,32,40,40,65,32,58,49,49,52,50,32,40,85,32,40,75,32,+40,75,32,40,75,32,40,75,32,40,75,32,40,90,32,40,90,32,40,90,+32,40,90,32,40,90,32,40,90,32,75,41,41,41,41,41,41,41,41,41,+41,41,41,41,32,40,40,65,32,58,49,49,52,51,32,40,85,32,40,75,+32,40,75,32,40,75,32,40,75,32,40,90,32,40,90,32,40,90,32,40,+90,32,40,90,32,40,90,32,40,90,32,75,41,41,41,41,41,41,41,41,+41,41,41,41,41,32,40,40,65,32,58,49,49,52,52,32,40,85,32,40,+75,32,40,75,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,+40,90,32,40,90,32,40,90,32,40,90,32,75,41,41,41,41,41,41,41,+41,41,41,41,41,41,32,40,40,65,32,58,49,49,52,53,32,40,85,32,+40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,90,+32,40,90,32,40,90,32,40,90,32,40,90,32,75,41,41,41,41,41,41,+41,41,41,41,41,41,41,32,40,40,65,32,58,49,49,52,54,32,40,85,+32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,+75,32,40,90,32,40,90,32,40,90,32,40,90,32,75,41,41,41,41,41,+41,41,41,41,41,41,41,41,32,40,40,65,32,58,49,49,52,55,32,40,+85,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,+40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,75,41,41,41,41,+41,41,41,41,41,41,41,41,41,32,40,40,65,32,58,49,49,52,56,32,+40,85,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,+32,40,75,32,40,75,32,40,75,32,40,90,32,40,90,32,75,41,41,41,+41,41,41,41,41,41,41,41,41,41,32,40,40,65,32,58,49,49,52,57,+32,40,85,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,+75,32,40,75,32,40,75,32,40,90,32,40,90,32,40,90,32,75,41,41,+41,41,41,41,41,41,41,41,41,41,41,32,40,40,65,32,58,49,49,53,+48,32,40,85,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,+40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,90,32,40,90,+32,40,85,32,75,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+32,40,40,65,32,58,49,49,53,49,32,40,85,32,40,75,32,40,75,32,+40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,+32,40,75,32,40,90,32,40,90,32,40,85,32,65,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,32,40,40,65,32,58,49,49,53,50,32,+40,85,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,+32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,75,41,41,41,+41,41,41,41,41,41,41,41,41,41,32,40,40,65,32,58,49,49,53,51,+32,40,85,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,+75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,65,41,41,+41,41,41,41,41,41,41,41,41,41,41,32,40,40,65,32,58,49,49,53,+52,32,40,40,66,32,40,40,95,51,50,32,95,53,56,41,32,95,54,51,+41,41,32,40,40,66,32,85,41,32,40,40,66,32,40,66,32,40,66,32,+40,66,32,40,66,32,90,41,41,41,41,41,32,40,40,66,32,40,66,32,+40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,+32,40,66,32,40,66,32,40,66,32,40,66,32,95,54,50,41,41,41,41,+41,41,41,41,41,41,41,41,41,32,40,40,67,39,32,40,67,39,32,40,+67,39,32,40,67,39,32,67,41,41,41,41,32,95,49,49,51,56,41,41,+41,41,41,41,32,40,40,65,32,58,49,49,53,53,32,40,40,66,32,40,+40,95,51,50,32,95,53,56,41,32,95,54,51,41,41,32,40,40,66,32,+85,41,32,40,40,66,32,40,66,32,40,66,32,90,41,41,41,32,40,40,+66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,+40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,95,54,+50,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,67,39,32,+40,67,39,32,67,41,41,32,95,49,49,51,56,41,41,41,41,41,41,32,+40,40,65,32,58,49,49,53,54,32,40,40,66,32,40,40,95,51,50,32,+95,53,56,41,32,95,54,51,41,41,32,40,40,66,32,85,41,32,40,40,+66,32,40,66,32,40,66,32,40,66,32,90,41,41,41,41,32,40,40,66,+32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,+66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,95,54,50,+41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,67,39,32,40,+67,39,32,40,67,39,32,67,41,41,41,32,95,49,49,51,56,41,41,41,+41,41,41,32,40,40,65,32,58,49,49,53,55,32,40,40,66,32,40,40,+95,51,50,32,95,53,56,41,32,95,54,51,41,41,32,40,40,66,32,85,+41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,+32,40,66,32,90,41,41,41,41,41,41,41,32,40,40,66,32,40,66,32,+40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,+32,40,66,32,40,66,32,40,66,32,40,66,32,95,54,50,41,41,41,41,+41,41,41,41,41,41,41,41,41,32,40,40,67,39,32,40,67,39,32,40,+67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,67,41,41,41,41,+41,41,32,95,49,49,51,56,41,41,41,41,41,41,32,40,40,65,32,58,+49,49,53,56,32,40,40,66,32,40,40,95,51,50,32,95,53,56,41,32,+95,54,51,41,41,32,40,40,66,32,85,41,32,40,40,66,32,40,66,32,+40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,90,41,+41,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,+32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,+66,32,40,66,32,40,66,32,95,54,50,41,41,41,41,41,41,41,41,41,+41,41,41,41,32,40,40,67,39,32,40,67,39,32,40,67,39,32,40,67,+39,32,40,67,39,32,40,67,39,32,40,67,39,32,67,41,41,41,41,41,+41,41,32,95,49,49,51,56,41,41,41,41,41,41,32,40,40,65,32,58,+49,49,53,57,32,40,40,66,32,40,40,95,51,50,32,95,53,56,41,32,+95,54,51,41,41,32,40,40,66,32,85,41,32,40,40,66,32,40,66,32,+40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,+32,40,66,32,40,66,32,40,40,67,39,32,66,41,32,66,41,41,41,41,+41,41,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,+66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,+40,66,32,40,66,32,90,41,41,41,41,41,41,41,41,41,41,41,41,32,+40,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,+66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,+40,66,32,95,54,50,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,+40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,67,41,+41,41,41,41,41,41,41,41,41,41,41,32,40,40,66,32,40,40,67,39,+32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,+32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,67,39,41,+41,41,41,41,41,41,41,41,41,32,95,49,49,51,56,41,41,32,80,41,+41,41,41,41,41,41,41,32,40,40,65,32,58,49,49,54,48,32,40,40,+66,32,40,40,95,51,50,32,95,53,56,41,32,95,54,51,41,41,32,40,+40,66,32,85,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,+66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,+40,40,67,39,32,66,41,32,66,41,41,41,41,41,41,41,41,41,41,41,+41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,+32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,+66,32,90,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,66,+32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,+66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,+95,54,50,41,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,+66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,+40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,67,41,41,41,41,+41,41,41,41,41,41,41,41,32,40,40,66,32,40,40,67,39,32,40,67,+39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,+39,32,40,67,39,32,40,67,39,32,40,67,39,32,67,39,41,41,41,41,+41,41,41,41,41,41,32,95,49,49,51,56,41,41,32,40,67,32,80,41,+41,41,41,41,41,41,41,41,32,40,40,65,32,58,49,49,54,49,32,40,+40,66,32,40,40,95,51,50,32,95,53,56,41,32,95,54,51,41,41,32,+40,40,66,32,85,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,+40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,+32,90,41,41,41,41,41,41,41,41,41,41,41,32,40,40,66,32,40,66,+32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,+66,32,40,66,32,40,66,32,40,66,32,40,66,32,95,54,50,41,41,41,+41,41,41,41,41,41,41,41,41,41,32,40,40,67,39,32,40,67,39,32,+40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,+40,67,39,32,40,67,39,32,40,67,39,32,67,41,41,41,41,41,41,41,+41,41,41,32,95,49,49,51,56,41,41,41,41,41,41,32,40,40,65,32,+58,49,49,54,50,32,40,40,66,32,40,40,95,51,50,32,95,53,56,41,+32,95,54,51,41,41,32,40,40,66,32,85,41,32,40,40,66,32,40,66,+32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,+66,32,40,66,32,40,66,32,40,66,32,90,41,41,41,41,41,41,41,41,+41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,66,+32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,+66,32,40,66,32,95,54,50,41,41,41,41,41,41,41,41,41,41,41,41,+41,32,40,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,+67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,+67,39,32,40,67,39,32,67,41,41,41,41,41,41,41,41,41,41,41,32,+95,49,49,51,56,41,41,41,41,41,41,32,40,40,65,32,58,49,49,54,+51,32,40,40,66,32,40,66,32,40,40,95,51,50,32,95,53,56,41,32,+40,95,54,52,32,95,49,49,52,57,41,41,41,41,32,40,40,40,67,39,+32,66,41,32,40,66,39,32,40,40,66,32,40,95,51,51,32,95,53,56,+41,41,32,95,49,49,53,56,41,41,41,32,40,40,40,67,39,32,66,41,+32,40,95,51,50,32,95,53,56,41,41,32,40,40,40,67,39,32,66,41,+32,40,40,66,32,40,95,51,51,32,95,53,56,41,41,32,95,49,49,53,+56,41,41,32,40,95,51,52,32,95,53,56,41,41,41,41,41,41,32,40,+40,65,32,58,49,49,54,52,32,40,40,66,32,40,40,95,51,50,32,95,+53,56,41,32,95,54,51,41,41,32,40,40,66,32,85,41,32,40,40,66,+32,40,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,+39,32,66,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,+66,32,40,66,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,+32,40,67,39,32,40,67,39,32,40,67,39,32,40,95,51,51,32,95,53,+56,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,66,32,40,+66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,+40,66,32,40,66,32,40,66,32,40,66,32,95,54,50,41,41,41,41,41,+41,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,67,41,+41,41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,95,49,49,+51,56,41,32,95,49,49,56,49,41,41,41,41,41,41,32,40,40,40,67,+39,32,66,41,32,40,95,51,50,32,95,53,56,41,41,32,40,40,66,32,+40,66,32,40,40,95,51,50,32,95,53,56,41,32,95,54,51,41,41,41,+32,40,40,66,32,40,66,32,85,41,41,32,40,40,66,32,40,66,32,40,+66,32,40,66,32,90,41,41,41,41,32,40,40,40,67,39,32,66,41,32,+40,40,66,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,+40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,+40,67,39,32,40,67,39,32,40,67,39,32,40,95,51,51,32,95,53,56,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,66,32,40,+66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,+40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,95,54,50,41,41,+41,41,41,41,41,41,41,41,41,41,41,32,40,40,67,39,32,40,67,39,+32,40,67,39,32,40,67,39,32,67,41,41,41,41,32,40,40,66,32,40,+66,32,40,66,32,67,41,41,41,32,95,49,49,51,56,41,41,41,41,41,+32,40,95,51,52,32,95,53,56,41,41,41,41,41,41,41,41,41,41,32,+40,40,65,32,58,49,49,54,53,32,40,40,66,32,40,66,32,40,40,95,+51,50,32,95,53,56,41,32,95,54,51,41,41,41,32,40,40,66,32,40,+66,32,85,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,+66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,+40,66,32,40,66,32,40,66,32,40,66,32,40,95,50,54,49,32,95,54,+50,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,+66,32,40,66,32,40,40,67,39,32,40,67,39,32,40,67,39,32,40,67,+39,32,40,67,39,32,40,67,39,32,66,41,41,41,41,41,41,32,95,49,+49,51,56,41,41,41,32,95,57,50,57,41,41,41,41,41,32,40,40,65,+32,58,49,49,54,54,32,40,40,66,32,40,66,32,40,40,95,51,50,32,+95,53,56,41,32,95,54,51,41,41,41,32,40,40,66,32,40,66,32,85,+41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,+66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,+40,66,32,40,66,32,40,66,32,40,95,50,54,49,32,95,54,50,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,66,32,40,+66,32,40,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,+67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,66,+41,41,41,41,41,41,41,41,41,32,95,49,49,51,56,41,41,41,32,95,+57,50,57,41,41,41,41,41,32,40,40,65,32,58,49,49,54,55,32,40,+40,40,67,39,32,40,95,51,50,32,95,53,56,41,41,32,40,40,95,52,+51,32,95,53,56,41,32,40,85,32,40,40,66,32,40,66,32,40,66,32,+40,40,67,39,32,66,41,32,40,40,66,32,40,95,51,50,32,95,53,56,+41,41,32,95,49,49,57,54,41,41,41,41,41,32,40,40,66,32,40,40,+83,39,32,40,83,39,32,66,41,41,32,40,40,40,67,39,32,40,67,39,+32,67,39,41,41,32,40,40,66,32,40,66,32,67,41,41,32,80,41,41,+32,95,49,49,51,49,41,41,41,32,40,40,40,83,39,32,66,41,32,40,+66,39,32,40,40,66,32,40,83,39,32,40,67,39,32,40,67,39,32,83,+41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,+40,66,32,40,66,32,40,40,67,39,32,67,39,41,32,40,40,66,32,67,+39,41,32,83,39,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,+67,41,41,32,40,40,66,32,40,66,32,40,40,67,39,32,67,39,41,32,+83,39,41,41,41,32,40,40,66,32,40,66,32,40,67,32,66,41,41,41,+32,40,40,66,32,40,66,32,40,40,83,39,32,66,41,32,80,41,41,41,+32,40,40,40,67,39,32,40,67,39,32,40,83,39,32,40,67,39,32,40,+67,39,32,67,41,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,+40,83,39,32,40,67,39,32,40,67,39,32,67,41,41,41,41,41,32,40,+40,40,67,39,32,40,67,39,32,40,83,39,32,40,67,39,32,40,67,39,+32,67,41,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,83,+39,32,40,67,39,32,40,67,39,32,67,41,41,41,41,41,32,40,40,40,+67,39,32,40,67,39,32,40,83,39,32,40,67,39,32,40,67,39,32,67,+41,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,83,39,32,+40,67,39,32,40,67,39,32,67,41,41,41,41,41,32,40,40,40,67,39,+32,40,67,39,32,40,83,39,32,40,67,39,32,40,67,39,32,67,41,41,+41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,83,39,32,40,67,+39,32,40,67,39,32,67,41,41,41,41,41,32,40,40,40,67,39,32,40,+67,39,32,40,83,39,32,40,67,39,32,40,67,39,32,67,41,41,41,41,+41,32,40,40,40,67,39,32,40,67,39,32,40,83,39,32,40,67,39,32,+40,67,39,32,67,41,41,41,41,41,32,40,40,40,67,39,32,40,67,39,+32,40,83,39,32,40,67,39,32,40,67,39,32,67,41,41,41,41,41,32,+40,40,40,67,39,32,40,67,39,32,40,83,39,32,40,67,39,32,40,67,+39,32,67,41,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,+83,39,32,40,67,39,32,40,67,39,32,67,41,41,41,41,41,32,40,40,+40,67,39,32,40,67,39,32,40,83,39,32,40,67,39,32,40,67,39,32,+67,41,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,83,39,+32,40,67,39,32,40,67,39,32,67,41,41,41,41,41,32,40,40,40,67,+39,32,40,67,39,32,40,83,39,32,40,67,39,32,40,67,39,32,67,41,+41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,83,39,32,40,+67,39,32,67,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,+66,32,40,67,32,67,39,41,41,41,41,41,32,40,40,40,67,39,32,40,+67,39,32,66,41,41,32,40,40,66,32,40,66,32,40,67,39,32,67,41,+41,41,32,40,40,66,32,40,66,32,40,66,32,40,67,32,67,39,41,41,+41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,95,50,54,+49,32,40,95,51,52,32,95,53,56,41,41,41,41,41,41,32,40,40,66,+32,40,66,32,40,40,67,39,32,66,41,32,80,41,41,41,32,40,40,66,+32,67,41,32,40,40,40,67,39,32,40,67,39,32,95,49,49,50,50,41,+41,32,40,67,32,95,57,50,49,41,41,32,95,52,54,49,41,41,41,41,+41,41,41,32,40,90,32,75,41,41,41,41,32,40,90,32,75,41,41,41,+32,40,90,32,75,41,41,41,32,75,41,41,32,40,90,32,75,41,41,41,+32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,75,41,41,+32,75,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,+32,40,90,32,75,41,41,41,32,40,90,32,40,90,32,75,41,41,41,41,+32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,75,41,41,+32,75,41,41,32,40,90,32,75,41,41,41,41,41,41,32,40,90,32,75,+41,41,41,41,32,40,90,32,75,41,41,41,41,41,32,40,40,66,32,40,+66,32,40,66,32,40,66,32,85,41,41,41,41,32,40,40,40,67,39,32,+66,41,32,40,40,66,32,40,67,39,32,40,67,39,32,40,67,39,32,40,+67,39,32,40,66,32,40,95,50,54,49,32,40,95,51,52,32,95,53,56,+41,41,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,+40,67,39,32,66,41,32,40,66,39,32,80,41,41,41,41,41,32,40,40,+66,32,40,66,32,40,67,39,32,40,67,39,32,40,95,49,49,50,50,32,+95,57,50,48,41,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,+40,67,39,32,40,67,39,32,79,41,41,41,41,32,40,40,40,67,39,32,+40,67,39,32,66,41,41,32,40,40,66,32,40,66,32,40,83,39,32,67,+41,41,41,32,40,40,40,67,39,32,66,41,32,40,66,39,32,80,41,41,+32,40,40,67,39,32,95,51,57,53,41,32,95,56,50,50,41,41,41,41,+32,40,40,67,39,32,95,51,57,53,41,32,95,56,50,50,41,41,41,32,+75,41,41,41,41,41,32,40,40,67,32,40,95,52,49,51,32,40,40,40,+67,39,32,66,41,32,40,40,66,32,80,41,32,95,55,57,56,41,41,32,+95,55,53,56,41,41,41,32,40,40,40,95,49,56,53,32,95,49,57,56,+41,32,40,40,95,52,56,53,32,95,50,55,55,41,32,40,95,51,53,57,+32,35,45,49,41,41,41,32,40,40,95,52,56,53,32,95,50,55,55,41,+32,40,95,51,53,57,32,35,45,50,41,41,41,41,41,41,41,41,41,41,+41,41,32,40,40,66,32,40,40,95,51,50,32,95,53,56,41,32,40,95,+54,52,32,95,49,49,53,48,41,41,41,32,40,40,66,32,40,66,32,40,+95,50,54,49,32,95,49,49,53,57,41,41,41,32,40,67,32,40,95,51,+57,55,32,40,40,95,50,54,49,32,95,50,54,56,41,32,40,95,57,51,+48,32,95,49,49,51,53,41,41,41,41,41,41,41,41,32,40,40,65,32,+58,49,49,54,56,32,40,40,66,32,40,40,67,39,32,40,95,51,50,32,+95,53,56,41,41,32,95,49,49,57,54,41,41,32,40,40,66,32,40,66,+32,40,40,95,51,50,32,95,53,56,41,32,95,54,51,41,41,41,32,40,+40,66,32,40,66,32,85,41,41,32,40,40,66,32,40,66,32,40,66,32,+40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,+32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,95,50,54,+49,32,95,54,50,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,32,40,40,66,32,40,66,32,40,40,67,39,32,40,67,39,32,40,67,+39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,+39,32,40,67,39,32,40,67,39,32,40,67,39,32,66,41,41,41,41,41,+41,41,41,41,41,41,32,95,49,49,51,56,41,41,41,32,40,40,66,32,+40,66,32,95,52,54,50,41,41,32,80,41,41,41,41,41,41,41,32,40,+40,65,32,58,49,49,54,57,32,40,40,67,32,83,41,32,40,40,66,32,+40,67,32,66,41,41,32,40,40,66,32,40,66,32,40,40,67,39,32,40,+67,39,32,95,50,54,49,41,41,32,95,49,49,55,48,41,41,41,32,40,+67,32,95,49,49,54,57,41,41,41,41,41,32,40,40,65,32,58,49,49,+55,48,32,40,40,66,32,40,40,67,39,32,66,41,32,40,40,66,32,40,+95,51,50,32,95,53,56,41,41,32,40,40,40,67,39,32,40,95,51,50,+32,95,53,56,41,41,32,95,49,49,57,54,41,32,95,49,49,57,55,41,+41,41,41,32,40,40,66,32,40,66,32,40,40,83,39,32,40,95,51,51,+32,95,53,56,41,41,32,40,40,40,67,39,32,95,50,54,49,41,32,40,+40,66,32,40,95,52,53,32,95,53,56,41,41,32,40,40,66,32,95,49,+50,50,41,32,40,40,66,32,95,51,57,50,41,32,40,40,66,32,95,49,+51,49,50,41,32,40,40,67,32,79,41,32,75,41,41,41,41,41,41,32,+95,49,51,48,50,41,41,41,41,32,40,40,40,83,39,32,40,83,39,32,+83,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,83,41,+41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,+41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,+32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,32,+40,40,40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,32,40,+40,40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,32,40,40,+40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,32,40,40,40,+67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,32,40,40,40,67,+39,32,40,67,39,32,40,67,39,32,83,41,41,41,32,40,40,40,67,39,+32,40,67,39,32,40,67,39,32,83,41,41,41,32,40,40,40,67,39,32,+40,67,39,32,40,67,39,32,83,41,41,41,32,40,40,40,67,39,32,40,+67,39,32,40,67,39,32,83,41,41,41,32,40,40,40,67,39,32,40,67,+39,32,40,67,39,32,83,41,41,41,32,40,40,40,67,39,32,40,67,39,+32,40,67,39,32,83,41,41,41,32,40,40,40,67,39,32,40,67,39,32,+40,67,39,32,83,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,+67,39,32,83,41,41,41,32,40,40,66,32,40,66,32,40,67,32,40,40,+67,32,83,39,41,32,75,41,41,41,41,32,40,40,40,67,39,32,40,67,+39,32,40,83,39,32,40,67,39,32,67,41,41,41,41,32,40,40,40,67,+39,32,40,67,39,32,40,83,39,32,40,67,39,32,67,41,41,41,41,32,+40,40,40,67,39,32,40,67,39,32,40,83,39,32,40,67,39,32,67,41,+41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,83,39,32,40,67,+39,32,67,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,83,+39,32,40,67,39,32,67,41,41,41,41,32,40,40,40,67,39,32,40,67,+39,32,40,83,39,32,40,67,39,32,67,41,41,41,41,32,40,40,40,67,+39,32,40,67,39,32,40,83,39,32,40,67,39,32,67,41,41,41,41,32,+40,40,40,67,39,32,40,67,39,32,40,83,39,32,40,67,39,32,67,41,+41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,83,39,32,40,67,+39,32,67,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,83,+39,32,40,67,39,32,67,41,41,41,41,32,40,40,40,67,39,32,40,67,+39,32,40,83,39,32,40,67,39,32,67,41,41,41,41,32,40,40,40,67,+39,32,40,67,39,32,40,83,39,32,40,67,39,32,67,41,41,41,41,32,+40,40,40,67,39,32,40,67,39,32,40,83,39,32,40,67,39,32,67,41,+41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,83,39,32,40,67,+39,32,67,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,83,+39,32,40,67,39,32,67,41,41,41,41,32,40,40,40,67,39,32,40,67,+39,32,40,83,39,32,67,41,41,41,32,40,40,66,32,40,66,32,40,40,+83,39,32,40,67,39,32,67,39,41,41,32,40,40,66,32,85,41,32,75,+41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,83,39,32,40,+67,39,32,40,67,39,32,67,41,41,41,41,41,32,40,40,40,67,39,32,+40,67,39,32,40,83,39,32,40,67,39,32,40,67,39,32,67,41,41,41,+41,41,32,40,40,40,67,39,32,40,67,39,32,40,83,39,32,40,67,39,+32,40,67,39,32,67,41,41,41,41,41,32,40,40,40,67,39,32,40,67,+39,32,40,83,39,32,40,67,39,32,40,67,39,32,67,41,41,41,41,41,+32,40,40,40,67,39,32,40,67,39,32,40,83,39,32,40,67,39,32,40,+67,39,32,67,41,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,+40,83,39,32,40,67,39,32,40,67,39,32,67,41,41,41,41,41,32,40,+40,40,67,39,32,40,67,39,32,40,83,39,32,40,67,39,32,40,67,39,+32,67,41,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,83,+39,32,40,67,39,32,40,67,39,32,67,41,41,41,41,41,32,40,40,40,+67,39,32,40,67,39,32,40,83,39,32,40,67,39,32,40,67,39,32,67,+41,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,83,39,32,+40,67,39,32,40,67,39,32,67,41,41,41,41,41,32,40,40,40,67,39,+32,40,67,39,32,40,83,39,32,40,67,39,32,40,67,39,32,67,41,41,+41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,83,39,32,40,67,+39,32,40,67,39,32,67,41,41,41,41,41,32,40,40,40,67,39,32,40,+67,39,32,40,83,39,32,40,67,39,32,40,67,39,32,67,41,41,41,41,+41,32,40,40,40,67,39,32,40,67,39,32,40,83,39,32,40,67,39,32,+40,67,39,32,67,41,41,41,41,41,32,40,40,40,67,39,32,40,67,39,+32,40,83,39,32,40,67,39,32,40,67,39,32,67,41,41,41,41,41,32,+40,40,40,67,39,32,40,67,39,32,40,83,39,32,40,67,39,32,40,67,+39,32,67,41,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,+83,39,32,40,67,39,32,67,41,41,41,41,32,40,40,66,32,40,66,32,+40,66,32,40,66,32,40,67,32,67,39,41,41,41,41,41,32,40,40,66,+32,40,66,32,40,40,67,39,32,66,41,32,40,66,39,32,40,40,66,32,+67,41,32,40,67,32,40,40,67,32,40,95,50,48,50,32,95,56,57,50,+41,41,32,40,95,56,57,55,32,95,49,49,49,50,41,41,41,41,41,41,+41,41,32,40,40,66,32,40,67,39,32,67,41,41,32,40,40,66,32,67,+41,32,95,49,49,55,50,41,41,41,41,41,32,40,90,32,75,41,41,41,+32,40,90,32,75,41,41,41,32,75,41,41,32,40,90,32,75,41,41,41,+32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,75,41,41,+32,75,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,+32,40,90,32,75,41,41,41,32,40,90,32,40,90,32,75,41,41,41,41,+32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,75,41,41,+32,75,41,41,32,40,90,32,75,41,41,41,41,32,40,90,32,75,41,41,+41,32,75,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,+41,32,40,90,32,75,41,41,41,32,75,41,41,32,75,41,41,32,40,90,+32,75,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,+41,32,40,90,32,40,90,32,75,41,41,41,41,32,40,90,32,75,41,41,+41,32,40,90,32,75,41,41,41,32,75,41,41,32,75,41,41,32,40,90,+32,75,41,41,41,41,32,40,90,32,75,41,41,41,32,75,41,41,32,40,+90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,+41,41,32,75,41,41,32,75,41,41,32,40,90,32,75,41,41,41,32,40,+90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,40,90,+32,75,41,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,+41,41,32,75,41,41,32,75,41,41,32,40,90,32,75,41,41,41,32,40,+40,66,32,67,41,32,95,49,49,55,49,41,41,41,41,41,32,40,40,65,+32,58,49,49,55,49,32,40,40,66,32,40,66,32,40,66,32,40,40,95,+51,50,32,95,53,56,41,32,40,95,54,52,32,95,49,49,53,48,41,41,+41,41,41,32,40,40,40,67,39,32,40,67,39,32,66,41,41,32,40,40,+66,32,66,39,41,32,40,40,66,32,40,66,32,40,95,51,50,32,95,53,+56,41,41,41,32,40,40,66,32,95,49,51,49,55,41,32,95,55,52,51,+41,41,41,41,32,40,40,66,32,40,66,32,40,40,67,39,32,40,95,51,+51,32,95,53,56,41,41,32,95,49,49,54,55,41,41,41,32,40,40,40,+67,39,32,66,41,32,40,95,51,50,32,95,53,56,41,41,32,40,40,40,+67,39,32,66,41,32,40,40,66,32,40,95,51,51,32,95,53,56,41,41,+32,95,49,49,53,57,41,41,32,40,95,51,52,32,95,53,56,41,41,41,+41,41,41,41,32,40,40,65,32,58,49,49,55,50,32,40,75,32,40,40,+66,32,40,66,32,40,66,32,40,40,95,51,50,32,95,53,56,41,32,40,+95,54,52,32,95,49,49,53,49,41,41,41,41,41,32,40,40,40,67,39,+32,40,67,39,32,66,41,41,32,40,40,66,32,40,66,32,40,83,39,32,+40,95,51,51,32,95,53,56,41,41,41,41,32,40,40,66,32,40,66,32,+40,66,32,95,49,49,54,48,41,41,41,32,95,49,51,51,48,41,41,41,+32,40,40,40,67,39,32,66,41,32,40,95,51,50,32,95,53,56,41,41,+32,40,40,40,67,39,32,66,41,32,40,40,66,32,40,95,51,51,32,95,+53,56,41,41,32,95,49,49,54,48,41,41,32,40,95,51,52,32,95,53,+56,41,41,41,41,41,41,41,32,40,40,65,32,58,49,49,55,51,32,40,+40,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,+32,40,67,39,32,40,67,39,32,67,41,41,41,41,41,41,41,32,40,40,+40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,+40,67,39,32,40,67,39,32,67,41,41,41,41,41,41,41,32,40,40,40,+67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,66,+41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,+66,32,40,67,39,32,67,41,41,41,41,41,41,32,40,40,66,32,40,66,+32,40,66,32,40,66,32,40,67,39,32,67,41,41,41,41,41,32,40,40,+40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,+67,41,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,+32,40,67,39,32,40,67,39,32,67,41,41,41,41,41,32,40,40,40,67,+39,32,40,67,39,32,40,67,39,32,40,67,39,32,66,41,41,41,41,32,+40,40,40,67,39,32,40,67,39,32,66,41,41,32,40,40,67,32,95,49,+49,51,56,41,32,35,49,41,41,32,40,40,67,32,40,95,51,57,55,32,+40,95,50,54,56,32,95,49,51,51,56,41,41,41,32,95,49,49,56,50,+41,41,41,32,40,40,67,32,40,95,51,57,55,32,40,95,50,54,56,32,+95,49,51,51,56,41,41,41,32,95,49,49,56,51,41,41,41,32,95,50,+57,48,41,41,32,95,49,49,51,57,41,41,41,41,32,40,40,67,32,80,+41,32,95,52,54,49,41,41,41,32,95,52,54,49,41,41,32,95,52,54,+49,41,41,32,40,40,65,32,58,49,49,55,52,32,95,55,57,57,41,32,+40,40,65,32,58,49,49,55,53,32,40,40,95,49,49,57,48,32,95,55,+57,57,41,32,95,55,57,57,41,41,32,40,40,65,32,58,49,49,55,54,+32,40,40,95,50,54,49,32,40,95,49,49,57,48,32,95,55,57,57,41,+41,32,40,40,95,49,49,57,48,32,95,55,57,57,41,32,95,55,57,57,+41,41,41,32,40,40,65,32,58,49,49,55,55,32,40,40,95,50,54,49,+32,40,95,49,49,57,48,32,95,56,48,48,41,41,32,40,40,95,49,49,+57,48,32,95,55,57,57,41,32,95,55,57,57,41,41,41,32,40,40,65,+32,58,49,49,55,56,32,40,40,95,49,49,57,48,32,95,55,57,57,41,+32,40,40,95,49,49,57,48,32,95,55,57,57,41,32,95,56,48,48,41,+41,41,32,40,40,65,32,58,49,49,55,57,32,40,40,40,95,56,56,57,+32,34,98,117,105,108,116,105,110,34,41,32,35,48,41,32,35,48,41,41,+32,40,40,65,32,58,49,49,56,48,32,40,95,56,57,56,32,95,49,49,+55,57,41,41,32,40,40,65,32,58,49,49,56,49,32,40,40,40,66,32,+95,49,51,51,53,41,32,40,40,40,83,39,32,79,41,32,40,40,66,32,+40,80,32,40,95,49,49,56,48,32,34,80,114,105,109,105,116,105,118,101,+115,46,84,121,112,101,34,41,41,41,32,40,40,40,67,39,32,79,41,32,+40,40,80,32,34,80,114,105,109,105,116,105,118,101,115,46,84,121,112,101,+34,41,32,95,49,49,55,52,41,41,32,75,41,41,41,32,40,40,40,83,+39,32,79,41,32,40,40,66,32,40,80,32,40,95,49,49,56,48,32,34,+84,121,112,101,34,41,41,41,32,40,40,40,67,39,32,79,41,32,40,40,+80,32,34,80,114,105,109,105,116,105,118,101,115,46,84,121,112,101,34,41,+32,95,49,49,55,52,41,41,32,75,41,41,41,32,40,40,40,83,39,32,+79,41,32,40,40,66,32,40,80,32,40,95,49,49,56,48,32,34,67,111,+110,115,116,114,97,105,110,116,34,41,41,41,32,40,40,40,67,39,32,79,+41,32,40,40,80,32,34,80,114,105,109,105,116,105,118,101,115,46,67,111,+110,115,116,114,97,105,110,116,34,41,32,95,49,49,55,52,41,41,32,75,+41,41,41,32,40,40,40,83,39,32,79,41,32,40,40,66,32,40,80,32,+40,95,49,49,56,48,32,34,80,114,105,109,105,116,105,118,101,115,46,67,+111,110,115,116,114,97,105,110,116,34,41,41,41,32,40,40,40,67,39,32,+79,41,32,40,40,80,32,34,80,114,105,109,105,116,105,118,101,115,46,67,+111,110,115,116,114,97,105,110,116,34,41,32,95,49,49,55,52,41,41,32,+75,41,41,41,32,40,40,40,83,39,32,79,41,32,40,40,66,32,40,80,+32,40,95,49,49,56,48,32,95,49,49,49,52,41,41,41,32,40,40,40,+67,39,32,79,41,32,40,40,80,32,95,49,49,49,52,41,32,95,49,49,+55,54,41,41,32,75,41,41,41,32,40,40,40,67,39,32,79,41,32,40,+40,66,32,40,80,32,40,95,49,49,56,48,32,34,45,62,34,41,41,41,+32,40,40,40,67,39,32,79,41,32,40,40,80,32,95,49,49,49,52,41,+32,95,49,49,55,54,41,41,32,75,41,41,41,32,75,41,41,41,41,41,+41,41,32,40,40,66,32,95,49,49,49,57,41,32,40,40,66,32,95,55,+52,51,41,32,95,49,49,56,48,41,41,41,41,32,40,40,65,32,58,49,+49,56,50,32,40,40,40,83,32,40,40,40,67,39,32,40,67,39,32,40,+40,83,39,32,95,52,54,51,41,32,40,40,40,83,39,32,79,41,32,40,+40,66,32,40,80,32,40,95,49,49,56,48,32,34,45,62,34,41,41,41,+32,40,40,40,67,39,32,79,41,32,40,40,80,32,95,49,49,49,52,41,+32,95,49,49,55,54,41,41,32,75,41,41,41,32,40,40,40,83,39,32,+79,41,32,40,40,66,32,40,80,32,40,95,49,49,56,48,32,34,61,62,+34,41,41,41,32,40,40,40,67,39,32,79,41,32,40,40,80,32,95,49,+49,49,51,41,32,95,49,49,55,55,41,41,32,75,41,41,41,32,40,40,+40,83,39,32,79,41,32,40,40,66,32,40,80,32,40,95,49,49,56,48,+32,40,40,79,32,35,49,50,54,41,32,75,41,41,41,41,32,40,40,40,+67,39,32,79,41,32,40,40,80,32,95,49,49,49,50,41,32,95,49,49,+55,56,41,41,32,75,41,41,41,32,40,40,40,67,39,32,79,41,32,40,+40,66,32,40,80,32,40,95,49,49,56,48,32,40,40,95,52,54,51,32,+95,49,49,48,54,41,32,34,91,93,34,41,41,41,41,32,40,40,40,67,+39,32,79,41,32,40,40,80,32,40,40,95,52,54,51,32,95,49,49,48,+54,41,32,34,91,93,34,41,41,32,95,49,49,55,53,41,41,32,75,41,+41,41,32,75,41,41,41,41,41,41,41,32,40,40,40,67,39,32,40,67,+39,32,40,67,39,32,95,51,57,53,41,41,41,32,40,40,40,67,39,32,+40,67,39,32,40,67,39,32,40,83,39,32,40,83,32,80,41,41,41,41,+41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,+40,67,39,32,79,41,41,41,41,41,32,40,40,66,32,40,66,32,40,40,+67,39,32,66,41,32,40,40,66,32,40,67,39,32,95,50,54,49,41,41,+32,40,40,67,32,66,41,32,95,57,48,48,41,41,41,41,41,32,40,40,+40,67,39,32,66,41,32,40,66,39,32,40,40,66,32,95,50,54,49,41,+32,40,40,66,32,95,55,54,48,41,32,40,40,40,67,39,32,79,41,32,+40,40,67,32,95,55,57,54,41,32,95,49,49,55,52,41,41,32,75,41,+41,41,41,41,32,40,40,40,83,39,32,66,41,32,40,95,51,57,55,32,+95,49,49,57,48,41,41,32,40,67,32,95,52,52,54,41,41,41,41,41,+32,75,41,41,32,40,95,56,48,49,32,95,49,49,55,57,41,41,41,32,+40,40,40,95,49,56,54,32,95,49,57,56,41,32,40,40,95,52,56,53,+32,95,50,55,55,41,32,40,95,51,53,57,32,35,50,41,41,41,32,40,+40,95,52,56,53,32,95,50,55,55,41,32,40,95,51,53,57,32,35,49,+48,41,41,41,41,41,32,40,40,66,32,95,49,49,49,57,41,32,40,40,+66,32,95,55,52,51,41,32,95,49,49,56,48,41,41,41,41,32,95,55,+52,51,41,32,40,95,56,57,55,32,40,40,79,32,35,49,48,55,41,32,+75,41,41,41,41,32,40,40,65,32,58,49,49,56,51,32,40,40,95,51,+57,53,32,40,40,83,32,40,40,40,67,39,32,83,41,32,40,40,40,83,+39,32,40,67,39,32,40,67,39,32,40,83,32,80,41,41,41,41,32,40,+40,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,79,41,41,+41,41,32,40,40,40,67,39,32,66,41,32,40,66,39,32,40,40,66,32,+40,83,39,32,95,50,54,49,41,41,32,40,40,66,32,40,66,32,95,49,+49,49,57,41,41,32,40,40,66,32,40,66,32,40,95,50,54,49,32,95,+55,53,57,41,41,41,32,40,40,40,67,39,32,40,83,39,32,95,55,54,+51,41,41,32,40,40,40,67,39,32,40,67,39,32,79,41,41,32,40,67,+32,80,41,41,32,75,41,41,32,73,41,41,41,41,41,41,32,40,40,40,+67,39,32,66,41,32,40,66,39,32,40,40,66,32,95,50,54,49,41,32,+95,55,54,48,41,41,41,32,40,40,40,83,39,32,40,67,39,32,40,95,+51,57,55,32,95,49,49,56,56,41,41,41,32,40,67,32,95,49,49,56,+55,41,41,32,73,41,41,41,41,32,75,41,41,32,40,95,56,48,49,32,+95,49,49,55,57,41,41,41,32,40,95,51,57,53,32,95,49,49,56,53,+41,41,41,32,40,40,66,32,40,95,51,57,52,32,40,40,40,67,39,32,+79,41,32,40,40,40,67,39,32,95,55,57,54,41,32,40,40,66,32,95,+56,57,55,41,32,40,40,66,32,40,95,52,54,51,32,40,40,79,32,35,+57,55,41,32,75,41,41,41,32,40,95,49,53,57,48,32,95,50,56,51,+41,41,41,41,32,95,55,57,57,41,41,32,75,41,41,41,32,40,40,95,+49,56,54,32,95,49,57,56,41,32,40,40,95,52,56,53,32,95,50,55,+55,41,32,40,95,51,53,57,32,35,49,41,41,41,41,41,41,32,40,40,+40,95,49,56,54,32,95,49,57,56,41,32,40,40,95,52,56,53,32,95,+50,55,55,41,32,40,95,51,53,57,32,35,50,41,41,41,32,40,40,95,+52,56,53,32,95,50,55,55,41,32,40,95,51,53,57,32,35,49,48,41,+41,41,41,41,32,40,40,65,32,58,49,49,56,52,32,95,55,52,51,41,+32,40,40,65,32,58,49,49,56,53,32,40,85,32,40,90,32,95,55,52,+51,41,41,41,32,40,40,65,32,58,49,49,56,54,32,95,55,52,52,41,+32,40,40,65,32,58,49,49,56,55,32,40,40,66,32,40,95,51,57,57,+32,95,49,49,56,54,41,41,32,95,49,49,56,52,41,41,32,40,40,65,+32,58,49,49,56,56,32,40,40,66,32,95,49,49,56,54,41,32,40,95,+49,49,56,54,32,40,40,95,49,50,57,56,32,95,49,49,55,57,41,32,+34,80,114,105,109,105,116,105,118,101,115,46,45,62,34,41,41,41,41,32,+40,40,65,32,58,49,49,56,57,32,40,40,66,32,95,49,49,56,54,41,+32,40,95,49,49,56,54,32,40,40,95,49,50,57,56,32,95,49,49,55,+57,41,32,34,80,114,105,109,105,116,105,118,101,115,46,61,62,34,41,41,+41,41,32,40,40,65,32,58,49,49,57,48,32,95,49,49,56,56,41,32,+40,40,65,32,58,49,49,57,49,32,40,40,67,32,40,40,67,32,40,40,+67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,+67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,+67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,80,32,40,75,+32,95,52,55,54,41,41,32,40,40,40,67,39,32,67,41,32,40,40,40,+67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,+32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,+41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,+40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,+40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,+39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,+67,41,32,40,40,67,32,40,40,40,67,39,32,67,39,41,32,40,85,32,+40,75,32,95,52,55,54,41,41,41,32,40,40,40,67,39,32,40,67,39,+32,67,41,41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,+40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,40,67,39,32,40,+67,39,32,67,41,41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,+32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,40,67,39,+32,40,67,39,32,67,41,41,32,40,40,40,67,39,32,40,67,39,32,67,+41,41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,40,+67,39,32,40,67,39,32,67,41,41,32,40,40,40,67,39,32,40,67,39,+32,67,41,41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,+40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,40,67,39,32,40,+67,39,32,67,41,41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,+32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,40,67,39,+32,67,41,32,40,40,66,32,40,67,32,67,39,41,41,32,40,40,66,32,+40,66,32,40,67,32,40,40,67,32,40,40,40,83,39,32,95,49,50,48,+41,32,40,95,57,48,52,32,34,45,62,34,41,41,32,40,95,57,48,52,+32,34,80,114,105,109,105,116,105,118,101,115,46,45,62,34,41,41,41,32,+95,52,55,54,41,41,41,41,32,40,40,66,32,40,66,32,95,52,55,55,+41,41,32,40,67,32,80,41,41,41,41,41,32,40,75,32,40,75,32,95,+52,55,54,41,41,41,41,32,40,75,32,40,75,32,95,52,55,54,41,41,+41,41,32,40,75,32,95,52,55,54,41,41,41,32,40,75,32,40,75,32,+95,52,55,54,41,41,41,41,32,40,75,32,40,75,32,95,52,55,54,41,+41,41,41,32,40,75,32,40,75,32,95,52,55,54,41,41,41,41,32,40,+75,32,95,52,55,54,41,41,41,32,40,75,32,95,52,55,54,41,41,41,+32,40,75,32,40,75,32,95,52,55,54,41,41,41,41,32,40,75,32,40,+75,32,95,52,55,54,41,41,41,41,32,40,75,32,40,75,32,95,52,55,+54,41,41,41,41,32,40,75,32,40,75,32,40,75,32,95,52,55,54,41,+41,41,41,41,32,40,75,32,40,75,32,95,52,55,54,41,41,41,41,32,+40,75,32,40,75,32,95,52,55,54,41,41,41,41,32,40,75,32,95,52,+55,54,41,41,41,32,40,75,32,95,52,55,54,41,41,41,32,40,75,32,+40,75,32,95,52,55,54,41,41,41,41,41,32,40,75,32,40,75,32,95,+52,55,54,41,41,41,41,32,40,75,32,95,52,55,54,41,41,41,32,40,+75,32,40,75,32,95,52,55,54,41,41,41,41,32,40,75,32,40,75,32,+95,52,55,54,41,41,41,41,32,40,75,32,40,75,32,95,52,55,54,41,+41,41,41,32,40,75,32,95,52,55,54,41,41,41,32,40,75,32,95,52,+55,54,41,41,41,32,40,75,32,40,75,32,95,52,55,54,41,41,41,41,+32,40,75,32,40,75,32,95,52,55,54,41,41,41,41,32,40,75,32,40,+75,32,95,52,55,54,41,41,41,41,32,40,75,32,40,75,32,40,75,32,+95,52,55,54,41,41,41,41,41,32,40,75,32,40,75,32,95,52,55,54,+41,41,41,41,32,40,75,32,40,75,32,95,52,55,54,41,41,41,41,32,+40,75,32,95,52,55,54,41,41,41,32,40,75,32,95,52,55,54,41,41,+41,32,40,75,32,40,75,32,95,52,55,54,41,41,41,41,41,32,40,75,+32,40,75,32,95,52,55,54,41,41,41,41,32,40,75,32,95,52,55,54,+41,41,41,32,40,75,32,40,75,32,95,52,55,54,41,41,41,41,32,40,+75,32,40,75,32,95,52,55,54,41,41,41,41,32,40,75,32,40,75,32,+95,52,55,54,41,41,41,41,32,40,75,32,95,52,55,54,41,41,41,32,+40,75,32,95,52,55,54,41,41,41,32,40,75,32,40,75,32,95,52,55,+54,41,41,41,41,32,40,75,32,40,75,32,95,52,55,54,41,41,41,41,+32,40,75,32,40,75,32,95,52,55,54,41,41,41,41,32,40,75,32,40,+75,32,40,75,32,95,52,55,54,41,41,41,41,41,32,40,75,32,40,75,+32,95,52,55,54,41,41,41,41,32,40,75,32,40,75,32,95,52,55,54,+41,41,41,41,32,40,75,32,95,52,55,54,41,41,41,32,40,75,32,95,+52,55,54,41,41,41,32,40,75,32,40,75,32,95,52,55,54,41,41,41,+41,32,40,40,65,32,58,49,49,57,50,32,40,40,67,32,40,40,67,32,+40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,+40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,+40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,80,32,+40,75,32,95,52,55,54,41,41,32,40,40,40,67,39,32,67,41,32,40,+40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,+67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,+32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,+41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,+40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,+40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,+39,32,67,41,32,40,40,67,32,40,40,40,67,39,32,67,39,41,32,40,+85,32,40,75,32,95,52,55,54,41,41,41,32,40,40,40,67,39,32,40,+67,39,32,67,41,41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,+32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,40,67,39,+32,40,67,39,32,67,41,41,32,40,40,40,67,39,32,40,67,39,32,67,+41,41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,40,+67,39,32,40,67,39,32,67,41,41,32,40,40,40,67,39,32,40,67,39,+32,67,41,41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,+40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,40,67,39,32,40,+67,39,32,67,41,41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,+32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,40,67,39,+32,40,67,39,32,67,41,41,32,40,40,40,67,39,32,40,67,39,32,67,+41,41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,40,+67,39,32,67,41,32,40,40,66,32,40,67,32,67,39,41,41,32,40,40,+66,32,40,66,32,40,67,32,40,40,67,32,40,40,40,83,39,32,95,49,+50,48,41,32,40,95,57,48,52,32,34,61,62,34,41,41,32,40,95,57,+48,52,32,34,80,114,105,109,105,116,105,118,101,115,46,61,62,34,41,41,+41,32,95,52,55,54,41,41,41,41,32,40,40,66,32,40,66,32,95,52,+55,55,41,41,32,40,67,32,80,41,41,41,41,41,32,40,75,32,40,75,+32,95,52,55,54,41,41,41,41,32,40,75,32,40,75,32,95,52,55,54,+41,41,41,41,32,40,75,32,95,52,55,54,41,41,41,32,40,75,32,40,+75,32,95,52,55,54,41,41,41,41,32,40,75,32,40,75,32,95,52,55,+54,41,41,41,41,32,40,75,32,40,75,32,95,52,55,54,41,41,41,41,+32,40,75,32,95,52,55,54,41,41,41,32,40,75,32,95,52,55,54,41,+41,41,32,40,75,32,40,75,32,95,52,55,54,41,41,41,41,32,40,75,+32,40,75,32,95,52,55,54,41,41,41,41,32,40,75,32,40,75,32,95,+52,55,54,41,41,41,41,32,40,75,32,40,75,32,40,75,32,95,52,55,+54,41,41,41,41,41,32,40,75,32,40,75,32,95,52,55,54,41,41,41,+41,32,40,75,32,40,75,32,95,52,55,54,41,41,41,41,32,40,75,32,+95,52,55,54,41,41,41,32,40,75,32,95,52,55,54,41,41,41,32,40,+75,32,40,75,32,95,52,55,54,41,41,41,41,41,32,40,75,32,40,75,+32,95,52,55,54,41,41,41,41,32,40,75,32,95,52,55,54,41,41,41,+32,40,75,32,40,75,32,95,52,55,54,41,41,41,41,32,40,75,32,40,+75,32,95,52,55,54,41,41,41,41,32,40,75,32,40,75,32,95,52,55,+54,41,41,41,41,32,40,75,32,95,52,55,54,41,41,41,32,40,75,32,+95,52,55,54,41,41,41,32,40,75,32,40,75,32,95,52,55,54,41,41,+41,41,32,40,75,32,40,75,32,95,52,55,54,41,41,41,41,32,40,75,+32,40,75,32,95,52,55,54,41,41,41,41,32,40,75,32,40,75,32,40,+75,32,95,52,55,54,41,41,41,41,41,32,40,75,32,40,75,32,95,52,+55,54,41,41,41,41,32,40,75,32,40,75,32,95,52,55,54,41,41,41,+41,32,40,75,32,95,52,55,54,41,41,41,32,40,75,32,95,52,55,54,+41,41,41,32,40,75,32,40,75,32,95,52,55,54,41,41,41,41,41,32,+40,75,32,40,75,32,95,52,55,54,41,41,41,41,32,40,75,32,95,52,+55,54,41,41,41,32,40,75,32,40,75,32,95,52,55,54,41,41,41,41,+32,40,75,32,40,75,32,95,52,55,54,41,41,41,41,32,40,75,32,40,+75,32,95,52,55,54,41,41,41,41,32,40,75,32,95,52,55,54,41,41,+41,32,40,75,32,95,52,55,54,41,41,41,32,40,75,32,40,75,32,95,+52,55,54,41,41,41,41,32,40,75,32,40,75,32,95,52,55,54,41,41,+41,41,32,40,75,32,40,75,32,95,52,55,54,41,41,41,41,32,40,75,+32,40,75,32,40,75,32,95,52,55,54,41,41,41,41,41,32,40,75,32,+40,75,32,95,52,55,54,41,41,41,41,32,40,75,32,40,75,32,95,52,+55,54,41,41,41,41,32,40,75,32,95,52,55,54,41,41,41,32,40,75,+32,95,52,55,54,41,41,41,32,40,75,32,40,75,32,95,52,55,54,41,+41,41,41,32,40,40,65,32,58,49,49,57,51,32,40,40,66,32,40,66,+32,40,40,95,51,50,32,95,53,56,41,32,95,54,51,41,41,41,32,40,+40,66,32,40,66,32,85,41,41,32,40,40,66,32,40,66,32,40,66,32,+40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,+32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,95,54,50,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,66,32,40,+66,32,40,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,+67,39,32,40,67,39,32,40,67,39,32,66,41,41,41,41,41,41,41,32,+95,49,49,51,56,41,41,41,32,95,50,57,50,41,41,41,41,41,32,40,+40,65,32,58,49,49,57,52,32,40,40,66,32,95,54,52,41,32,40,40,+40,67,39,32,95,50,54,51,41,32,95,50,57,49,41,32,95,49,49,52,+54,41,41,41,32,40,40,65,32,58,49,49,57,53,32,40,40,40,83,39,+32,67,41,32,40,40,66,32,40,67,32,83,39,41,41,32,40,40,66,32,+67,41,32,95,49,50,54,52,41,41,41,32,40,40,66,32,67,41,32,95,+49,49,57,57,41,41,41,32,40,40,65,32,58,49,49,57,54,32,40,40,+89,32,40,40,40,67,39,32,40,83,39,32,67,41,41,32,40,40,40,67,+39,32,40,67,39,32,67,41,41,32,40,40,40,67,39,32,40,83,39,32,+83,41,41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,+40,67,39,32,40,67,39,32,67,41,41,32,40,40,40,67,39,32,40,67,+39,32,67,41,41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,+40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,40,67,39,32,+40,67,39,32,67,41,41,32,40,40,40,67,39,32,40,67,39,32,67,41,+41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,40,67,+39,32,40,67,39,32,67,41,41,32,40,40,40,67,39,32,40,67,39,32,+67,41,41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,+40,67,39,32,40,67,39,32,67,41,41,32,40,40,40,67,39,32,40,67,+39,32,67,41,41,32,40,40,66,32,40,40,83,39,32,67,41,32,40,40,+66,32,40,83,32,73,41,41,32,40,40,66,32,40,66,32,40,66,32,40,+40,95,51,50,32,95,53,56,41,32,40,95,54,52,32,95,49,49,52,51,+41,41,41,41,41,32,40,40,40,83,39,32,40,67,39,32,40,83,39,32,+67,41,41,41,32,40,40,66,32,40,66,32,40,40,67,39,32,67,41,32,+95,57,50,56,41,41,41,32,40,40,66,32,40,66,32,40,95,50,54,49,+32,40,95,51,52,32,95,53,56,41,41,41,41,32,40,67,32,40,95,51,+57,57,32,95,49,49,56,54,41,41,41,41,41,32,40,40,66,32,40,66,+32,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,+40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,+40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,+40,40,67,32,40,40,80,32,40,75,32,95,49,51,48,50,41,41,32,40,+75,32,40,75,32,95,49,51,48,50,41,41,41,41,32,40,75,32,40,75,+32,95,49,51,48,50,41,41,41,41,32,40,75,32,95,49,51,48,50,41,+41,41,32,40,75,32,40,75,32,95,49,51,48,50,41,41,41,41,32,40,+75,32,40,75,32,95,49,51,48,50,41,41,41,41,32,40,75,32,40,75,+32,95,49,51,48,50,41,41,41,41,32,40,75,32,95,49,51,48,50,41,+41,41,32,40,75,32,95,49,51,48,50,41,41,41,32,40,75,32,40,75,+32,95,49,51,48,50,41,41,41,41,32,40,75,32,40,75,32,95,49,51,+48,50,41,41,41,41,32,40,75,32,40,75,32,95,49,51,48,50,41,41,+41,41,32,40,75,32,40,75,32,40,75,32,95,49,51,48,50,41,41,41,+41,41,32,40,75,32,40,75,32,95,49,51,48,50,41,41,41,41,32,40,+75,32,40,75,32,95,49,51,48,50,41,41,41,41,32,40,75,32,95,49,+51,48,50,41,41,41,32,40,75,32,95,49,51,48,50,41,41,41,41,41,+32,40,40,40,67,39,32,66,41,32,40,40,66,32,67,41,32,40,40,40,+83,39,32,40,83,39,32,67,39,41,41,32,40,40,66,32,40,40,67,39,+32,40,95,50,48,51,32,95,50,56,49,41,41,32,95,52,49,49,41,41,+32,95,52,49,49,41,41,32,40,40,66,32,40,66,32,40,66,32,40,95,+50,54,49,32,95,49,49,57,54,41,41,41,41,32,40,40,66,32,40,66,+32,95,56,50,50,41,41,32,40,40,67,39,32,95,52,49,50,41,32,40,+95,51,57,53,32,95,55,57,56,41,41,41,41,41,41,41,32,40,40,40,+67,39,32,95,50,54,49,41,32,40,40,66,32,95,49,49,48,48,41,32,+40,95,56,48,53,32,95,56,48,55,41,41,41,32,34,98,97,100,32,115,+121,110,111,110,121,109,32,117,115,101,34,41,41,41,41,41,41,41,41,32,+40,40,66,32,40,66,32,40,66,32,40,40,67,39,32,40,95,51,50,32,+95,53,56,41,41,32,95,49,49,57,54,41,41,41,41,32,40,40,40,67,+39,32,66,41,32,67,39,41,32,40,67,32,95,52,54,50,41,41,41,41,+41,32,40,75,32,40,75,32,95,49,51,48,50,41,41,41,41,32,40,75,+32,95,49,51,48,50,41,41,41,32,40,75,32,40,75,32,95,49,51,48,+50,41,41,41,41,32,40,75,32,40,75,32,95,49,51,48,50,41,41,41,+41,32,40,75,32,40,75,32,95,49,51,48,50,41,41,41,41,32,40,75,+32,95,49,51,48,50,41,41,41,32,40,75,32,95,49,51,48,50,41,41,+41,32,40,75,32,40,75,32,95,49,51,48,50,41,41,41,41,32,40,75,+32,40,75,32,95,49,51,48,50,41,41,41,41,32,40,75,32,40,75,32,+95,49,51,48,50,41,41,41,41,32,40,75,32,40,75,32,40,75,32,95,+49,51,48,50,41,41,41,41,41,32,40,90,32,95,49,49,57,54,41,41,+41,32,40,75,32,40,75,32,95,49,51,48,50,41,41,41,41,32,40,40,+66,32,90,41,32,40,40,66,32,40,66,32,40,95,50,54,49,32,40,95,+51,52,32,95,53,56,41,41,41,41,32,40,67,32,40,95,51,57,57,32,+95,49,49,56,54,41,41,41,41,41,41,32,40,75,32,95,49,51,48,50,+41,41,41,32,40,40,40,67,39,32,66,41,32,40,66,39,32,40,40,67,+32,95,51,57,50,41,32,95,49,51,48,50,41,41,41,32,40,40,40,67,+39,32,66,41,32,40,40,66,32,40,95,50,55,54,32,95,53,54,41,41,+32,95,55,54,48,41,41,32,95,49,49,57,54,41,41,41,41,32,95,52,+54,49,41,41,32,40,40,65,32,58,49,49,57,55,32,40,40,67,32,40,+40,67,32,40,40,83,32,40,40,67,32,40,40,67,32,40,40,67,32,40,+40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,+40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,+40,67,32,40,40,83,32,73,41,32,40,90,32,40,95,51,52,32,95,53,+56,41,41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,40,+95,51,50,32,95,53,56,41,41,32,95,49,49,57,55,41,41,32,40,40,+40,67,39,32,66,41,32,40,40,66,32,40,95,51,50,32,95,53,56,41,+41,32,95,49,49,57,55,41,41,32,40,40,66,32,40,66,32,40,95,50,+54,49,32,40,95,51,52,32,95,53,56,41,41,41,41,32,95,55,52,52,+41,41,41,41,41,32,40,75,32,40,75,32,95,49,51,48,50,41,41,41,+41,32,40,75,32,95,49,51,48,50,41,41,41,32,40,75,32,40,75,32,+95,49,51,48,50,41,41,41,41,32,40,75,32,40,75,32,95,49,51,48,+50,41,41,41,41,32,40,75,32,40,75,32,95,49,51,48,50,41,41,41,+41,32,40,75,32,95,49,51,48,50,41,41,41,32,40,75,32,95,49,51,+48,50,41,41,41,32,40,75,32,40,75,32,95,49,51,48,50,41,41,41,+41,32,40,75,32,40,75,32,95,49,51,48,50,41,41,41,41,32,40,75,+32,40,75,32,95,49,51,48,50,41,41,41,41,32,40,75,32,40,75,32,+40,75,32,95,49,51,48,50,41,41,41,41,41,32,40,40,66,32,40,40,+67,39,32,40,95,50,55,54,32,95,53,54,41,41,32,40,95,50,54,54,+32,95,55,53,54,41,41,41,32,95,49,49,57,55,41,41,41,32,40,75,+32,40,75,32,95,49,51,48,50,41,41,41,41,32,40,40,66,32,40,40,+83,39,32,40,95,51,50,32,95,53,56,41,41,32,95,49,49,57,52,41,+41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,80,41,32,40,95,+51,52,32,95,53,56,41,41,41,32,40,40,66,32,40,40,67,39,32,40,+95,51,50,32,95,53,56,41,41,32,95,49,49,57,55,41,41,32,40,40,+40,67,39,32,40,83,39,32,40,95,51,51,32,95,53,56,41,41,41,32,+95,49,49,57,51,41,32,40,95,51,52,32,95,53,56,41,41,41,41,41,+41,41,32,40,75,32,95,49,51,48,50,41,41,41,32,40,40,40,67,39,+32,66,41,32,40,40,66,32,40,95,50,55,54,32,95,53,54,41,41,32,+95,55,54,48,41,41,32,95,49,49,57,55,41,41,41,32,40,40,65,32,+58,49,49,57,56,32,40,40,66,32,40,66,32,40,40,95,51,50,32,95,+53,56,41,32,40,95,54,52,32,95,49,49,52,57,41,41,41,41,32,40,+40,40,67,39,32,66,41,32,40,66,39,32,40,40,66,32,95,50,54,49,+41,32,95,49,49,48,48,41,41,41,32,40,40,66,32,40,40,67,39,32,+95,52,54,51,41,32,40,40,80,32,34,116,121,112,101,34,41,32,34,107,+105,110,100,34,41,41,41,32,40,95,52,54,51,32,34,32,101,114,114,111,+114,58,32,34,41,41,41,41,41,32,40,40,65,32,58,49,49,57,57,32,+40,40,66,32,40,40,67,39,32,66,41,32,40,40,66,32,40,95,51,50,+32,95,53,56,41,41,32,95,49,49,57,54,41,41,41,32,40,40,66,32,+40,40,67,39,32,66,41,32,40,40,66,32,40,95,51,50,32,95,53,56,+41,41,32,95,49,49,57,54,41,41,41,32,95,49,50,48,48,41,41,41,+32,40,40,65,32,58,49,50,48,48,32,40,40,66,32,89,41,32,40,40,+66,32,40,66,32,40,40,83,39,32,83,41,32,40,40,40,67,39,32,40,+67,39,32,83,41,41,32,40,40,40,67,39,32,40,67,39,32,83,41,41,+32,40,40,40,67,39,32,40,67,39,32,83,41,41,32,40,40,40,67,39,+32,40,67,39,32,83,41,41,32,40,40,40,67,39,32,40,67,39,32,83,+41,41,32,40,40,40,67,39,32,40,67,39,32,83,41,41,32,40,40,40,+67,39,32,40,67,39,32,83,41,41,32,40,40,40,67,39,32,40,67,39,+32,83,41,41,32,40,40,40,67,39,32,40,67,39,32,83,41,41,32,40,+40,40,67,39,32,40,67,39,32,83,41,41,32,40,40,40,67,39,32,40,+67,39,32,83,41,41,32,40,40,40,67,39,32,40,67,39,32,83,41,41,+32,40,40,40,67,39,32,40,67,39,32,83,41,41,32,40,40,40,67,39,+32,40,67,39,32,83,41,41,32,40,40,40,67,39,32,40,67,39,32,83,+41,41,32,40,40,40,67,39,32,40,67,39,32,83,41,41,32,40,40,67,+32,40,40,40,67,39,32,67,39,41,32,83,39,41,32,40,40,40,67,39,+32,40,83,39,32,67,41,41,32,40,40,40,67,39,32,40,83,39,32,67,+41,41,32,40,40,40,67,39,32,40,83,39,32,67,41,41,32,40,40,40,+67,39,32,40,83,39,32,67,41,41,32,40,40,40,67,39,32,40,83,39,+32,67,41,41,32,40,40,40,67,39,32,40,83,39,32,67,41,41,32,40,+40,40,67,39,32,40,83,39,32,67,41,41,32,40,40,40,67,39,32,40,+83,39,32,67,41,41,32,40,40,40,67,39,32,40,83,39,32,67,41,41,+32,40,40,40,67,39,32,40,83,39,32,67,41,41,32,40,40,40,67,39,+32,40,83,39,32,67,41,41,32,40,40,40,67,39,32,40,83,39,32,67,+41,41,32,40,40,40,67,39,32,40,83,39,32,67,41,41,32,40,40,40,+67,39,32,40,83,39,32,67,41,41,32,40,40,40,67,39,32,40,83,39,+32,67,41,41,32,40,40,40,67,39,32,40,83,39,32,67,41,41,32,40,+40,67,32,40,40,40,67,39,32,83,39,41,32,67,39,41,32,40,40,40,+67,39,32,40,67,39,32,67,41,41,32,40,40,67,39,32,67,41,32,40,+95,50,48,50,32,95,56,57,50,41,41,41,32,40,40,95,51,52,32,95,+53,56,41,32,95,49,51,52,49,41,41,41,41,32,40,90,32,75,41,41,+41,32,40,90,32,75,41,41,41,32,75,41,41,32,40,90,32,75,41,41,+41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,75,41,+41,32,75,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,+41,32,40,90,32,75,41,41,41,32,40,90,32,40,90,32,75,41,41,41,+41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,75,41,+41,32,75,41,41,32,40,90,32,75,41,41,41,41,32,40,90,32,75,41,+41,41,32,40,90,32,75,41,41,41,32,75,41,41,32,40,90,32,75,41,+41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,75,+41,41,32,75,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,+41,41,32,40,90,32,75,41,41,41,32,40,90,32,40,90,32,75,41,41,+41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,75,+41,41,32,75,41,41,32,40,90,32,75,41,41,41,41,41,32,40,40,66,+32,40,40,67,39,32,40,83,39,32,83,41,41,32,40,40,40,67,39,32,+40,67,39,32,40,67,39,32,83,41,41,41,32,40,40,40,67,39,32,40,+67,39,32,40,67,39,32,83,41,41,41,32,40,40,40,67,39,32,40,67,+39,32,40,83,39,32,83,41,41,41,32,40,40,40,67,39,32,40,67,39,+32,40,67,39,32,83,41,41,41,32,40,40,40,67,39,32,40,67,39,32,+40,67,39,32,83,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,+67,39,32,83,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,+39,32,83,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,+32,83,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,+83,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,83,+41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,83,41,+41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,+41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,+32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,32,+40,40,40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,32,40,+40,40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,32,40,40,+66,32,40,40,67,39,32,66,41,32,40,40,67,32,83,39,41,32,75,41,+41,41,32,40,40,40,67,39,32,40,67,39,32,40,83,39,32,40,67,39,+32,67,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,83,39,+32,40,67,39,32,67,41,41,41,41,32,40,40,40,67,39,32,40,67,39,+32,40,83,39,32,40,67,39,32,67,41,41,41,41,32,40,40,40,67,39,+32,40,67,39,32,40,83,39,32,40,67,39,32,67,41,41,41,41,32,40,+40,40,67,39,32,40,67,39,32,40,83,39,32,40,67,39,32,67,41,41,+41,41,32,40,40,40,67,39,32,40,67,39,32,40,83,39,32,40,67,39,+32,67,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,83,39,+32,40,67,39,32,67,41,41,41,41,32,40,40,40,67,39,32,40,67,39,+32,40,83,39,32,40,67,39,32,67,41,41,41,41,32,40,40,40,67,39,+32,40,67,39,32,40,83,39,32,40,67,39,32,67,41,41,41,41,32,40,+40,40,67,39,32,40,67,39,32,40,83,39,32,40,67,39,32,67,41,41,+41,41,32,40,40,40,67,39,32,40,67,39,32,40,83,39,32,40,67,39,+32,67,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,83,39,+32,40,67,39,32,67,41,41,41,41,32,40,40,40,67,39,32,40,67,39,+32,40,83,39,32,40,67,39,32,67,41,41,41,41,32,40,40,40,67,39,+32,40,67,39,32,40,83,39,32,40,67,39,32,67,41,41,41,41,32,40,+40,40,67,39,32,40,67,39,32,40,83,39,32,40,67,39,32,67,41,41,+41,41,32,40,40,40,67,39,32,40,67,39,32,83,41,41,32,40,40,66,+32,40,40,67,39,32,40,67,39,32,67,39,41,41,32,40,40,66,32,40,+66,32,67,39,41,41,32,40,40,67,32,66,41,32,75,41,41,41,41,32,+40,40,40,83,39,32,40,67,39,32,66,41,41,32,40,40,66,32,40,66,+32,40,67,39,32,66,41,41,41,32,40,66,32,40,66,32,40,95,51,51,+32,95,53,56,41,41,41,41,41,32,73,41,41,41,32,40,90,32,75,41,+41,41,32,75,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,+41,41,32,40,90,32,75,41,41,41,32,75,41,41,32,75,41,41,32,40,+90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,+41,41,32,40,90,32,40,90,32,75,41,41,41,41,32,40,90,32,75,41,+41,41,32,40,90,32,75,41,41,41,32,75,41,41,32,75,41,41,32,40,+90,32,75,41,41,41,41,32,40,90,32,75,41,41,41,32,75,41,41,32,+40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,+41,41,41,32,75,41,41,32,75,41,41,32,40,90,32,75,41,41,41,32,+40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,40,+90,32,75,41,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,+41,41,41,32,40,40,40,67,39,32,40,83,39,32,67,41,41,32,40,40,+40,67,39,32,83,41,32,40,40,40,67,39,32,40,83,39,32,67,39,41,+41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,+40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,+40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,+39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,+83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,+32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,+40,67,32,40,40,67,32,83,39,41,32,75,41,41,32,40,90,32,75,41,+41,41,32,40,90,32,75,41,41,41,32,75,41,41,32,40,90,32,75,41,+41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,75,+41,41,32,75,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,+41,41,32,40,90,32,75,41,41,41,32,40,90,32,40,90,32,75,41,41,+41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,40,+40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,67,39,32,67,41,+32,40,95,50,48,50,32,95,50,56,49,41,41,41,32,40,40,95,51,52,+32,95,53,56,41,32,95,49,51,52,49,41,41,41,41,32,75,41,41,32,+40,90,32,75,41,41,41,41,32,75,41,41,32,40,90,32,75,41,41,41,+41,32,40,40,40,83,39,32,40,83,39,32,83,41,41,32,40,40,40,67,+39,32,40,67,39,32,40,67,39,32,83,41,41,41,32,40,40,40,67,39,+32,40,67,39,32,40,67,39,32,83,41,41,41,32,40,40,66,32,40,40,+67,39,32,66,41,32,40,40,66,32,67,41,32,40,40,40,67,39,32,83,+41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,+40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,+40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,+39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,+83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,+32,40,40,40,67,39,32,83,41,32,40,40,67,32,40,40,67,32,83,39,+41,32,75,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,+41,32,75,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,+41,32,40,90,32,75,41,41,41,32,75,41,41,32,75,41,41,32,40,90,+32,75,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,+41,32,40,90,32,40,90,32,75,41,41,41,41,32,40,90,32,75,41,41,+41,32,40,90,32,75,41,41,41,41,41,32,40,40,66,32,67,41,32,95,+49,50,48,49,41,41,41,32,75,41,41,32,40,90,32,75,41,41,41,32,+40,40,40,83,39,32,40,83,39,32,83,41,41,32,40,40,40,67,39,32,+40,67,39,32,40,67,39,32,83,41,41,41,32,40,40,40,67,39,32,40,+67,39,32,40,67,39,32,83,41,41,41,32,40,40,66,32,40,66,32,40,+40,67,39,32,67,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,+39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,+83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,+32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,+40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,+67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,+32,83,41,32,40,40,67,32,40,40,67,32,83,39,41,32,75,41,41,32,+40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,75,41,41,32,+40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,+41,41,41,32,75,41,41,32,75,41,41,32,40,90,32,75,41,41,41,32,+40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,40,+90,32,75,41,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,+41,41,41,41,41,32,40,40,66,32,67,41,32,95,49,50,48,49,41,41,+41,32,75,41,41,32,40,90,32,75,41,41,41,32,40,40,66,32,40,66,+32,40,66,32,40,40,95,51,50,32,95,53,56,41,32,40,95,54,52,32,+95,49,49,52,57,41,41,41,41,41,32,40,40,40,83,39,32,40,83,39,+32,40,83,39,32,80,41,41,41,32,95,49,51,50,55,41,32,40,40,40,+67,39,32,66,41,32,40,66,39,32,40,40,66,32,95,50,54,49,41,32,+95,49,49,57,56,41,41,41,32,40,40,66,32,40,66,32,40,95,52,54,+51,32,34,99,97,110,110,111,116,32,117,110,105,102,121,32,34,41,41,41,+32,40,40,40,67,39,32,66,41,32,40,40,66,32,95,52,54,51,41,32,+95,56,51,56,41,41,32,40,40,66,32,40,95,52,54,51,32,34,32,97,+110,100,32,34,41,41,32,95,56,51,56,41,41,41,41,41,41,41,41,41,+41,41,41,32,40,40,65,32,58,49,50,48,49,32,40,40,66,32,40,40,+83,39,32,66,41,32,40,40,66,32,40,95,51,50,32,95,53,56,41,41,+32,95,49,49,57,52,41,41,41,32,40,40,40,83,39,32,40,67,39,32,+40,83,39,32,80,41,41,41,32,95,49,50,48,50,41,32,40,40,66,32,+67,41,32,95,49,49,57,57,41,41,41,41,32,40,40,65,32,58,49,50,+48,50,32,40,40,40,83,39,32,40,83,39,32,83,41,41,32,40,40,40,+67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,32,40,40,40,67,+39,32,40,67,39,32,40,67,39,32,83,41,41,41,32,40,40,66,32,40,+66,32,40,40,83,39,32,67,41,32,40,40,40,67,39,32,83,41,32,40,+40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,+67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,+32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,+41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,+40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,+40,67,39,32,83,41,32,40,40,67,32,40,40,67,32,83,39,41,32,75,+41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,75,+41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,40,+90,32,75,41,41,41,32,75,41,41,32,75,41,41,32,40,90,32,75,41,+41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,40,+90,32,40,90,32,75,41,41,41,41,32,40,90,32,75,41,41,41,32,40,+90,32,75,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,+40,67,39,32,40,95,51,50,32,95,53,56,41,41,32,95,49,49,57,52,+41,41,41,41,32,40,40,66,32,40,40,83,39,32,40,67,39,32,80,41,+41,32,95,49,49,57,51,41,41,32,40,40,40,67,39,32,66,41,32,95,+49,49,57,57,41,32,95,55,53,56,41,41,41,41,41,32,75,41,41,32,+40,90,32,75,41,41,41,32,40,40,66,32,40,66,32,40,40,83,39,32,+40,95,51,50,32,95,53,56,41,41,32,40,40,66,32,95,49,51,48,54,+41,32,40,40,67,32,79,41,32,75,41,41,41,41,41,32,40,40,66,32,+40,40,83,39,32,40,83,39,32,67,41,41,32,40,40,40,83,39,32,66,+41,32,40,40,66,32,67,41,32,40,95,52,51,52,32,40,95,50,48,50,+32,95,50,56,49,41,41,41,41,32,95,49,49,57,51,41,41,41,32,40,+40,40,67,39,32,66,41,32,40,66,39,32,40,40,66,32,95,50,54,49,+41,32,95,49,49,57,56,41,41,41,32,40,40,66,32,40,66,32,40,95,+52,54,51,32,34,99,121,99,108,105,99,32,34,41,41,41,32,40,40,40,+67,39,32,66,41,32,40,40,66,32,95,52,54,51,41,32,40,40,66,32,+95,56,51,56,41,32,95,55,53,56,41,41,41,32,40,40,66,32,40,95,+52,54,51,32,34,32,61,32,34,41,41,32,95,56,51,56,41,41,41,41,+41,41,41,41,32,40,40,65,32,58,49,50,48,51,32,40,40,40,95,51,+50,32,95,53,56,41,32,95,54,51,41,32,40,85,32,40,40,66,32,40,+66,32,40,66,32,40,66,32,40,66,32,40,66,32,90,41,41,41,41,41,+41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,+32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,95,+54,50,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,40,67,39,+32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,+32,67,41,41,41,41,41,41,32,95,49,49,51,56,41,32,95,50,57,48,+41,41,41,41,41,41,32,40,40,65,32,58,49,50,48,52,32,40,40,40,+95,50,55,54,32,95,53,54,41,32,95,55,53,56,41,32,95,49,50,48,+53,41,41,32,40,40,65,32,58,49,50,48,53,32,40,40,40,95,51,50,+32,95,53,56,41,32,95,54,51,41,32,40,85,32,40,40,40,67,39,32,+40,83,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,+40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,+40,67,39,32,67,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,+40,67,39,32,66,41,32,40,40,66,32,40,67,39,32,40,67,39,32,40,+67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,+67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,+95,51,51,32,95,53,56,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,+32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,+66,32,95,54,50,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,+40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,+32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,40,83,39,+32,95,50,54,49,41,32,95,49,52,56,49,41,41,41,41,41,41,41,41,+41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,+66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,+67,41,41,41,41,41,41,41,41,41,41,41,32,40,40,66,32,40,66,32,+40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,+32,40,66,32,67,41,41,41,41,41,41,41,41,41,41,32,40,40,66,32,+40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,+32,40,66,32,67,41,41,41,41,41,41,41,41,41,32,40,40,66,32,40,+66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,+67,41,41,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,+40,66,32,40,66,32,40,66,32,40,66,32,67,41,41,41,41,41,41,41,+32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,+67,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,+32,40,66,32,67,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,+32,40,66,32,67,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,+67,41,41,41,32,40,40,66,32,40,66,32,67,41,41,32,40,40,66,32,+67,41,32,95,49,49,51,56,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,32,40,95,51,52,32,95,53,56,41,41,41,32,40,40,67,32,+40,95,52,55,57,32,95,50,55,55,41,41,32,35,49,41,41,41,41,41,+32,40,40,65,32,58,49,50,48,54,32,40,40,66,32,40,66,32,40,40,+95,51,50,32,95,53,56,41,32,95,49,50,48,53,41,41,41,32,40,40,+66,32,40,66,32,40,66,32,40,95,50,54,49,32,40,95,51,52,32,95,+53,56,41,41,41,41,41,32,40,40,40,67,39,32,66,41,32,40,66,39,+32,40,40,66,32,95,50,54,49,41,32,95,56,57,56,41,41,41,32,40,+40,40,67,39,32,66,41,32,95,52,54,51,41,32,40,40,66,32,40,95,+52,54,51,32,40,40,79,32,35,51,54,41,32,75,41,41,41,32,40,95,+49,53,57,48,32,95,50,56,51,41,41,41,41,41,41,41,32,40,40,65,+32,58,49,50,48,55,32,40,40,66,32,40,66,32,40,40,95,51,50,32,+95,53,56,41,32,40,95,54,52,32,95,49,49,52,50,41,41,41,41,32,+40,40,40,67,39,32,40,83,39,32,67,41,41,32,40,40,40,67,39,32,+40,83,39,32,67,41,41,32,95,49,51,51,51,41,32,40,40,66,32,95,+49,49,48,48,41,32,40,95,56,48,53,32,95,56,48,55,41,41,41,41,+32,40,40,66,32,85,41,32,40,40,66,32,40,66,32,40,66,32,40,95,+51,52,32,95,53,56,41,41,41,41,32,40,40,66,32,40,66,32,80,41,+41,32,40,40,66,32,95,56,51,52,41,32,40,95,56,48,53,32,95,56,+48,55,41,41,41,41,41,41,41,41,32,40,40,65,32,58,49,50,48,56,+32,40,40,66,32,40,40,95,51,50,32,95,53,56,41,32,40,95,54,52,+32,95,49,49,52,57,41,41,41,32,40,40,67,39,32,95,49,50,48,55,+41,32,40,40,80,32,34,118,97,108,117,101,34,41,32,34,116,121,112,101,+34,41,41,41,41,32,40,40,65,32,58,49,50,48,57,32,40,40,83,32,+73,41,32,40,40,66,32,40,40,83,39,32,83,41,32,40,40,66,32,40,+40,67,39,32,67,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,+39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,+83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,+32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,+40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,+67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,+32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,+41,32,40,40,67,32,40,40,67,32,83,39,41,32,75,41,41,32,40,90,+32,75,41,41,41,32,40,90,32,75,41,41,41,32,75,41,41,32,40,90,+32,75,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,+41,32,75,41,41,32,75,41,41,32,40,90,32,75,41,41,41,32,40,90,+32,75,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,40,90,32,+75,41,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,+41,32,75,41,41,32,75,41,41,41,32,40,40,40,67,39,32,40,67,39,+32,40,67,39,32,40,95,51,50,32,95,53,56,41,41,41,41,32,95,49,+50,49,48,41,32,95,49,50,48,57,41,41,41,41,32,40,40,40,67,39,+32,66,41,32,40,40,66,32,67,41,32,40,40,66,32,40,67,32,95,49,+49,57,50,41,41,32,40,95,51,52,32,95,53,56,41,41,41,41,32,40,+40,66,32,85,41,32,40,40,40,83,39,32,66,41,32,40,66,39,32,40,+40,66,32,40,95,51,50,32,95,53,56,41,41,32,40,40,40,67,39,32,+95,49,50,48,54,41,32,40,95,56,48,53,32,95,56,48,56,41,41,32,+34,100,105,99,116,34,41,41,41,41,32,40,40,66,32,40,40,67,39,32,+66,41,32,40,40,66,32,40,83,39,32,40,95,51,51,32,95,53,56,41,+41,41,32,40,67,32,95,49,49,54,56,41,41,41,41,32,40,40,66,32,+40,66,32,40,66,32,95,49,50,48,57,41,41,41,32,40,40,66,32,40,+67,39,32,80,41,41,32,40,40,40,67,39,32,66,41,32,95,55,52,52,+41,32,95,55,52,51,41,41,41,41,41,41,41,41,41,41,32,40,40,65,+32,58,49,50,49,48,32,40,40,40,83,39,32,67,41,32,40,40,66,32,+40,40,83,39,32,83,39,41,32,95,51,57,50,41,41,32,40,40,66,32,+40,40,83,39,32,66,41,32,40,40,66,32,40,95,51,50,32,95,53,56,+41,41,32,40,40,95,52,51,32,95,53,56,41,32,40,95,50,54,53,32,+95,49,50,48,52,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,+32,40,66,32,40,95,51,52,32,95,53,56,41,41,41,41,41,32,40,40,+40,67,39,32,66,41,32,40,66,39,32,40,66,39,32,80,41,41,41,32,+40,40,66,32,40,67,39,32,95,56,50,50,41,41,32,40,40,66,32,95,+52,49,50,41,32,40,95,51,57,53,32,95,55,57,56,41,41,41,41,41,+41,41,41,32,40,40,66,32,40,66,32,40,95,51,52,32,95,53,56,41,+41,41,32,80,41,41,41,32,40,40,65,32,58,49,50,49,49,32,40,40,+83,32,40,40,67,32,66,41,32,40,40,40,67,39,32,66,41,32,40,40,+66,32,67,41,32,40,40,40,83,39,32,67,41,32,40,40,40,83,39,32,+67,41,32,40,40,40,83,39,32,67,41,32,40,40,40,83,39,32,67,41,+32,40,40,40,83,39,32,67,41,32,40,40,40,83,39,32,67,41,32,40,+40,40,83,39,32,67,41,32,40,40,40,83,39,32,67,41,32,40,40,40,+83,39,32,67,41,32,40,40,40,83,39,32,67,41,32,40,40,40,83,39,+32,67,41,32,40,40,40,83,39,32,67,41,32,40,40,40,83,39,32,67,+41,32,40,40,40,83,39,32,67,41,32,40,40,40,83,39,32,67,41,32,+40,40,40,83,39,32,80,41,32,75,41,32,40,90,32,75,41,41,41,32,+40,90,32,75,41,41,41,32,75,41,41,32,40,90,32,75,41,41,41,32,+40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,75,41,41,32,+75,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,+40,90,32,75,41,41,41,32,40,90,32,40,90,32,75,41,41,41,41,32,+40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,75,41,41,32,+75,41,41,41,32,95,49,50,49,48,41,41,41,32,40,95,51,52,32,95,+53,56,41,41,41,32,40,40,65,32,58,49,50,49,50,32,40,40,66,32,+40,66,32,40,66,32,40,40,95,51,50,32,95,53,56,41,32,40,95,54,+52,32,95,49,49,52,50,41,41,41,41,41,32,40,40,66,32,40,66,32,+40,66,32,40,66,32,95,49,49,53,52,41,41,41,41,32,40,40,40,67,+39,32,66,41,32,40,66,39,32,95,49,51,51,55,41,41,32,40,67,32,+95,49,49,49,57,41,41,41,41,41,32,40,40,65,32,58,49,50,49,51,+32,40,40,66,32,40,66,32,40,66,32,40,40,95,51,50,32,95,53,56,+41,32,40,95,54,52,32,95,49,49,52,55,41,41,41,41,41,32,40,40,+66,32,40,66,32,40,66,32,40,66,32,40,40,95,51,50,32,95,53,56,+41,32,40,95,54,52,32,95,49,49,52,50,41,41,41,41,41,41,32,40,+40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,95,49,49,53,52,+41,41,41,41,41,32,40,40,40,83,39,32,40,83,39,32,40,83,39,32,+66,41,41,41,32,40,40,66,32,40,66,32,66,39,41,41,32,40,40,40,+67,39,32,66,41,32,40,66,39,32,95,49,51,51,56,41,41,32,40,40,+40,67,39,32,40,67,39,32,79,41,41,32,40,67,32,95,49,49,49,57,+41,41,32,75,41,41,41,41,32,40,40,40,67,39,32,66,41,32,40,66,+39,32,40,40,66,32,40,67,39,32,95,49,51,51,56,41,41,32,40,67,+32,95,57,48,53,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,+79,41,41,32,40,67,32,95,49,49,49,57,41,41,32,75,41,41,41,41,+41,41,41,32,40,40,65,32,58,49,50,49,52,32,40,40,66,32,40,66,+32,40,40,95,51,50,32,95,53,56,41,32,40,95,54,52,32,95,49,49,+52,55,41,41,41,41,32,40,40,40,83,39,32,40,67,39,32,66,41,41,+32,95,49,50,49,51,41,32,40,40,66,32,40,66,32,95,55,52,51,41,+41,32,40,67,32,95,57,48,53,41,41,41,41,41,32,40,40,65,32,58,+49,50,49,53,32,40,40,40,83,39,32,40,67,39,32,95,50,54,49,41,+41,32,95,49,50,49,50,41,32,95,55,52,51,41,41,32,40,40,65,32,+58,49,50,49,54,32,40,40,95,52,52,32,95,53,56,41,32,40,95,50,+54,56,32,95,49,50,49,53,41,41,41,32,40,40,65,32,58,49,50,49,+55,32,40,40,66,32,40,66,32,40,40,95,51,50,32,95,53,56,41,32,+40,95,54,52,32,95,49,49,52,49,41,41,41,41,32,40,40,66,32,40,+66,32,40,66,32,95,49,49,53,53,41,41,41,32,40,40,40,83,39,32,+66,41,32,95,49,51,51,55,41,32,40,40,66,32,95,49,49,49,57,41,+32,95,55,52,51,41,41,41,41,41,32,40,40,65,32,58,49,50,49,56,+32,40,40,95,52,52,32,95,53,56,41,32,40,95,50,54,56,32,95,49,+50,49,55,41,41,41,32,40,40,65,32,58,49,50,49,57,32,40,40,66,+32,40,66,32,40,40,95,51,50,32,95,53,56,41,32,40,95,54,52,32,+95,49,49,52,51,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,+95,49,49,53,54,41,41,41,32,95,57,50,57,41,41,41,32,40,40,65,+32,58,49,50,50,48,32,40,40,66,32,40,66,32,40,40,95,51,50,32,+95,53,56,41,32,95,54,51,41,41,41,32,40,40,66,32,40,66,32,85,+41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,+32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,+32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,+32,40,67,39,32,40,95,51,51,32,95,53,56,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,+40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,+32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,95,50,54,+49,32,95,54,50,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,32,40,40,66,32,40,66,32,40,40,67,39,32,40,67,39,32,66,41,+41,32,95,49,49,51,56,41,41,41,32,95,57,50,57,41,41,41,32,40,+40,95,51,52,32,95,53,56,41,32,95,49,51,52,49,41,41,41,41,41,+32,40,40,65,32,58,49,50,50,49,32,40,40,66,32,40,66,32,40,66,+32,40,40,95,51,50,32,95,53,56,41,32,40,95,54,52,32,95,49,49,+52,50,41,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,66,41,+41,32,40,40,66,32,66,39,41,32,40,40,66,32,40,66,32,40,95,51,+51,32,95,53,56,41,41,41,32,95,49,50,49,53,41,41,41,32,40,40,+40,67,39,32,66,41,32,40,95,51,50,32,95,53,56,41,41,32,40,40,+40,67,39,32,66,41,32,40,40,66,32,40,95,51,51,32,95,53,56,41,+41,32,95,49,49,53,52,41,41,32,40,95,51,52,32,95,53,56,41,41,+41,41,41,41,32,40,40,65,32,58,49,50,50,50,32,40,40,66,32,40,+66,32,40,40,95,51,50,32,95,53,56,41,32,40,95,54,52,32,95,49,+49,52,50,41,41,41,41,32,40,40,40,67,39,32,66,41,32,40,66,39,+32,40,40,66,32,40,95,51,51,32,95,53,56,41,41,32,95,49,50,49,+54,41,41,41,32,40,40,40,67,39,32,66,41,32,40,95,51,50,32,95,+53,56,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,40,95,+51,51,32,95,53,56,41,41,32,95,49,49,53,52,41,41,32,40,95,51,+52,32,95,53,56,41,41,41,41,41,41,32,40,40,65,32,58,49,50,50,+51,32,40,40,66,32,40,66,32,40,40,95,51,50,32,95,53,56,41,32,+40,95,54,52,32,95,49,49,52,49,41,41,41,41,32,40,40,40,67,39,+32,66,41,32,40,66,39,32,40,40,66,32,40,95,51,51,32,95,53,56,+41,41,32,40,40,66,32,95,49,50,49,56,41,32,40,95,51,57,53,32,+40,85,32,80,41,41,41,41,41,41,32,40,40,40,67,39,32,66,41,32,+40,95,51,50,32,95,53,56,41,41,32,40,40,40,67,39,32,66,41,32,+40,40,66,32,40,95,51,51,32,95,53,56,41,41,32,95,49,49,53,53,+41,41,32,40,95,51,52,32,95,53,56,41,41,41,41,41,41,32,40,40,+65,32,58,49,50,50,52,32,40,40,40,83,39,32,40,95,51,51,32,95,+53,56,41,41,32,40,40,95,52,52,32,95,53,56,41,32,95,49,50,50,+54,41,41,32,40,40,40,67,39,32,40,95,51,50,32,95,53,56,41,41,+32,95,49,50,50,55,41,32,40,40,40,83,39,32,40,95,51,51,32,95,+53,56,41,41,32,40,40,95,52,52,32,95,53,56,41,32,95,49,50,51,+53,41,41,32,40,40,40,67,39,32,40,95,51,50,32,95,53,56,41,41,+32,95,49,50,50,56,41,32,40,40,40,83,39,32,40,95,51,51,32,95,+53,56,41,41,32,95,49,50,50,53,41,32,95,49,50,52,56,41,41,41,+41,41,41,32,40,40,65,32,58,49,50,50,53,32,40,40,66,32,40,95,+50,54,49,32,95,49,49,54,50,41,41,32,40,40,66,32,40,95,50,54,+49,32,95,52,53,53,41,41,32,40,40,66,32,40,95,52,54,50,32,95,+52,54,49,41,41,32,40,95,51,57,52,32,40,40,67,32,40,40,67,32,+40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,+40,40,67,32,40,40,67,32,40,40,80,32,40,75,32,40,75,32,75,41,+41,41,32,40,75,32,40,75,32,75,41,41,41,41,32,40,75,32,40,75,+32,75,41,41,41,41,32,40,75,32,40,75,32,75,41,41,41,41,32,40,+75,32,40,75,32,75,41,41,41,41,32,40,75,32,75,41,41,41,32,40,+75,32,40,75,32,40,75,32,75,41,41,41,41,41,32,40,75,32,40,75,+32,75,41,41,41,41,32,40,75,32,40,75,32,40,75,32,40,75,32,75,+41,41,41,41,41,41,32,40,75,32,40,75,32,40,75,32,40,75,32,75,+41,41,41,41,41,41,32,40,40,67,32,79,41,32,75,41,41,41,41,41,+41,41,32,40,40,65,32,58,49,50,50,54,32,40,40,67,32,40,40,40,+67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,+32,83,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,83,+41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,+40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,+67,32,40,40,67,32,83,39,41,32,40,90,32,75,41,41,41,32,40,90,+32,75,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,+41,32,40,90,32,75,41,41,41,32,75,41,41,32,40,90,32,40,90,32,+75,41,41,41,41,32,40,40,66,32,40,66,32,40,40,95,51,50,32,95,+53,56,41,32,40,95,54,52,32,95,49,49,52,55,41,41,41,41,32,40,+40,66,32,40,67,39,32,40,95,52,52,32,95,53,56,41,41,41,32,40,+40,67,39,32,40,67,39,32,95,49,50,50,48,41,41,32,95,57,48,53,+41,41,41,41,41,32,40,90,32,40,90,32,40,90,32,75,41,41,41,41,+41,32,40,90,32,40,90,32,40,90,32,75,41,41,41,41,41,32,75,41,+41,32,40,40,95,51,52,32,95,53,56,41,32,95,49,51,52,49,41,41,+41,32,40,40,65,32,58,49,50,50,55,32,40,40,66,32,40,95,50,54,+49,32,95,49,49,54,52,41,41,32,40,40,40,67,39,32,40,95,51,50,+32,95,53,56,41,41,32,40,40,95,52,51,32,95,53,56,41,32,95,49,+50,50,57,41,41,32,40,40,40,83,39,32,40,95,51,51,32,95,53,56,+41,41,32,40,40,95,52,52,32,95,53,56,41,32,95,49,50,51,49,41,+41,32,40,40,95,52,51,32,95,53,56,41,32,95,49,50,51,54,41,41,+41,41,41,32,40,40,65,32,58,49,50,50,56,32,40,40,66,32,40,95,+50,54,49,32,95,49,49,54,52,41,41,32,40,40,40,67,39,32,40,95,+51,50,32,95,53,56,41,41,32,40,40,95,52,51,32,95,53,56,41,32,+95,49,50,52,48,41,41,32,40,40,40,67,39,32,40,95,51,50,32,95,+53,56,41,41,32,40,40,66,32,40,40,95,52,51,32,95,53,56,41,32,+95,49,50,52,54,41,41,32,95,51,57,51,41,41,32,40,40,66,32,40,+95,51,52,32,95,53,56,41,41,32,95,51,57,51,41,41,41,41,41,32,+40,40,65,32,58,49,50,50,57,32,40,40,66,32,40,40,95,51,51,32,+95,53,56,41,32,95,49,50,48,51,41,41,32,40,40,83,32,40,40,40,+67,39,32,83,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,+32,67,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,+41,32,40,40,40,67,39,32,83,41,32,40,40,67,32,40,40,40,67,39,+32,83,39,41,32,40,40,67,32,40,40,80,32,40,40,67,32,66,41,32,+40,40,66,32,40,66,32,40,40,67,39,32,95,50,54,49,41,32,40,40,+67,32,95,49,50,51,48,41,32,95,55,57,57,41,41,41,41,32,40,40,+66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,40,66,32,40,+95,50,54,49,32,40,95,51,52,32,95,53,56,41,41,41,41,41,32,40,+40,67,39,32,40,67,39,32,95,55,50,56,41,41,32,80,41,41,41,41,+41,41,32,40,40,67,32,66,41,32,40,40,66,32,40,66,32,40,40,67,+39,32,95,50,54,49,41,32,40,40,67,32,95,49,50,51,48,41,32,95,+55,57,57,41,41,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,+40,66,32,40,66,32,40,66,32,40,95,50,54,49,32,40,95,51,52,32,+95,53,56,41,41,41,41,41,32,40,40,67,39,32,40,67,39,32,95,55,+50,57,41,41,32,80,41,41,41,41,41,41,41,32,40,40,67,32,66,41,+32,40,40,40,83,39,32,40,83,39,32,83,41,41,32,40,40,40,67,39,+32,40,67,39,32,40,67,39,32,83,41,41,41,32,40,40,40,67,39,32,+40,67,39,32,40,67,39,32,83,41,41,41,32,40,40,40,67,39,32,40,+67,39,32,40,67,39,32,83,41,41,41,32,40,40,40,67,39,32,40,67,+39,32,40,67,39,32,83,41,41,41,32,40,40,40,67,39,32,66,41,32,+40,66,39,32,40,40,66,32,67,41,32,40,40,40,67,39,32,83,41,32,+40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,+40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,+39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,+83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,+32,40,40,40,67,39,32,83,41,32,40,40,67,32,40,40,67,32,83,39,+41,32,75,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,+41,32,75,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,+41,32,40,90,32,75,41,41,41,32,75,41,41,32,75,41,41,32,40,90,+32,75,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,+41,32,40,90,32,40,90,32,75,41,41,41,41,41,41,32,40,40,66,32,+40,40,67,39,32,66,41,32,40,40,66,32,40,67,39,32,95,50,54,49,+41,41,32,95,49,50,51,48,41,41,41,32,40,40,66,32,40,66,32,40,+66,32,40,66,32,40,95,50,54,49,32,40,95,51,52,32,95,53,56,41,+41,41,41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,40,+67,39,32,66,41,41,32,40,40,66,32,40,66,32,95,55,51,48,41,41,+32,80,41,41,41,32,95,55,53,54,41,41,41,41,41,32,40,90,32,75,+41,41,41,32,75,41,41,32,75,41,41,32,40,90,32,75,41,41,41,32,+40,40,66,32,40,66,32,40,40,67,39,32,95,50,54,49,41,32,40,40,+67,32,95,49,50,51,48,41,32,95,55,57,57,41,41,41,41,32,40,40,+66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,40,66,32,40,+95,50,54,49,32,40,95,51,52,32,95,53,56,41,41,41,41,41,32,40,+40,67,39,32,40,67,39,32,95,55,51,48,41,41,32,80,41,41,41,41,+41,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,+32,75,41,41,32,40,90,32,40,90,32,75,41,41,41,41,32,40,90,32,+75,41,41,41,32,40,40,66,32,40,40,67,39,32,66,41,32,66,41,41,+32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,40,67,39,32,95,+50,54,49,41,32,40,40,67,32,95,49,50,51,48,41,32,95,56,48,48,+41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,+90,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,+66,32,40,95,50,54,49,32,40,95,51,52,32,95,53,56,41,41,41,41,+41,41,41,32,40,40,66,32,40,66,32,40,67,39,32,67,41,41,41,32,+40,40,40,67,39,32,67,39,41,32,40,40,66,32,67,39,41,32,95,55,+51,54,41,41,32,80,41,41,41,41,41,41,41,41,32,40,40,40,67,39,+32,66,41,32,40,66,39,32,40,66,39,32,40,40,66,32,95,50,54,49,+41,32,40,40,67,32,95,49,50,51,48,41,32,95,56,48,48,41,41,41,+41,41,32,40,40,66,32,40,66,32,40,66,32,90,41,41,41,32,40,40,+66,32,40,66,32,40,66,32,40,66,32,40,95,50,54,49,32,40,95,51,+52,32,95,53,56,41,41,41,41,41,41,32,40,40,66,32,40,66,32,67,+41,41,32,40,40,66,32,67,41,32,40,67,32,95,55,51,55,41,41,41,+41,41,41,41,41,32,75,41,41,32,40,95,51,52,32,95,53,56,41,41,+41,41,32,40,40,65,32,58,49,50,51,48,32,40,40,40,67,39,32,40,+67,39,32,66,41,41,32,40,40,66,32,40,66,32,40,95,51,50,32,95,+53,56,41,41,41,32,40,40,66,32,40,66,32,40,95,50,54,49,32,95,+49,49,54,52,41,41,41,32,40,67,32,40,40,40,67,39,32,89,41,32,+40,40,40,67,39,32,66,41,32,40,40,66,32,40,83,39,32,80,41,41,+32,40,40,40,67,39,32,66,41,32,40,40,66,32,40,95,51,50,32,95,+53,56,41,41,32,95,49,50,53,52,41,41,32,40,40,66,32,40,66,32,+40,95,51,52,32,95,53,56,41,41,41,32,40,40,66,32,80,41,32,95,+52,50,51,41,41,41,41,41,32,40,40,66,32,40,66,32,40,67,32,66,+41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,40,67,+39,32,40,95,51,50,32,95,53,56,41,41,32,95,49,50,53,52,41,41,+41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,40,83,39,32,40,+83,39,32,95,50,54,49,41,41,32,95,49,50,50,49,41,41,41,41,32,+40,40,40,67,39,32,66,41,32,40,40,66,32,67,39,41,32,67,39,41,+41,32,40,40,67,39,32,40,67,39,32,95,52,54,50,41,41,32,95,55,+57,54,41,41,41,41,41,41,41,32,95,52,54,49,41,41,41,41,41,32,+85,41,41,32,40,40,65,32,58,49,50,51,49,32,40,40,67,32,40,40,+40,67,39,32,67,41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,+32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,32,+40,40,40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,32,40,+40,40,67,39,32,40,67,39,32,40,83,39,32,67,41,41,41,32,40,40,+40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,32,40,40,40,+67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,32,40,40,40,67,+39,32,40,67,39,32,40,67,39,32,83,41,41,41,32,40,40,40,67,39,+32,40,67,39,32,67,41,41,32,40,40,40,67,39,32,40,67,39,32,40,+67,39,32,83,39,41,41,41,32,40,40,40,67,39,32,40,67,39,32,67,+41,41,32,40,40,67,32,40,40,40,67,39,32,83,39,41,32,83,39,41,+32,40,40,66,32,40,66,32,40,83,32,66,41,41,41,32,40,40,66,32,+40,66,32,40,66,32,40,66,32,90,41,41,41,41,32,40,40,66,32,40,+66,32,40,40,67,39,32,66,41,32,40,66,39,32,40,40,66,32,40,95,+51,51,32,95,53,56,41,41,32,40,40,67,32,95,49,50,51,51,41,32,+95,55,57,57,41,41,41,41,41,41,32,40,40,66,32,40,40,67,39,32,+66,41,32,67,41,41,32,40,40,66,32,40,66,32,40,95,50,54,49,32,+40,95,52,52,52,32,95,56,57,50,41,41,41,41,32,95,51,57,52,41,+41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,83,32,66,41,41,+41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,90,41,41,41,41,+32,40,40,66,32,40,66,32,40,40,67,39,32,66,41,32,40,66,39,32,+40,40,66,32,40,95,51,51,32,95,53,56,41,41,32,40,40,67,32,95,+49,50,51,51,41,32,95,55,57,57,41,41,41,41,41,41,32,40,40,67,+39,32,66,41,32,67,41,41,41,41,41,41,32,40,40,40,67,39,32,66,+41,32,95,49,50,51,51,41,32,95,49,50,51,50,41,41,41,32,40,90,+32,75,41,41,41,32,40,90,32,75,41,41,41,32,75,41,41,32,40,90,+32,40,90,32,75,41,41,41,41,32,40,90,32,75,41,41,41,32,40,90,+32,40,40,66,32,90,41,32,40,40,66,32,40,83,32,66,41,41,32,40,+40,66,32,40,66,32,40,66,32,90,41,41,41,32,40,40,66,32,40,40,+67,39,32,66,41,32,40,66,39,32,40,40,66,32,40,95,51,51,32,95,+53,56,41,41,32,40,40,67,32,95,49,50,51,51,41,32,95,56,48,48,+41,41,41,41,41,32,40,40,40,67,39,32,66,41,32,67,41,32,40,95,+51,57,52,32,40,40,67,32,40,40,80,32,40,75,32,40,75,32,75,41,+41,41,32,40,75,32,40,75,32,75,41,41,41,41,32,40,90,32,40,40,+66,32,40,95,51,57,52,32,40,40,67,32,79,41,32,75,41,41,41,32,+40,40,83,32,79,41,32,40,40,40,67,39,32,79,41,32,95,49,50,52,+51,41,32,75,41,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,+90,32,40,90,32,40,90,32,75,41,41,41,41,41,32,75,41,41,32,40,+40,95,51,52,32,95,53,56,41,32,95,49,51,52,49,41,41,41,32,40,+40,66,32,40,66,32,40,40,95,51,50,32,95,53,56,41,32,40,95,54,+52,32,95,49,49,52,55,41,41,41,41,32,40,40,40,67,39,32,66,41,+32,40,40,66,32,40,83,39,32,95,49,49,54,53,41,41,32,40,67,32,+95,57,48,53,41,41,41,32,40,40,67,39,32,95,51,57,53,41,32,95,+57,48,53,41,41,41,41,41,32,40,85,32,40,75,32,40,75,32,40,40,+40,83,39,32,80,41,32,40,90,32,40,40,67,32,79,41,32,75,41,41,+41,32,40,40,40,67,39,32,66,41,32,95,52,54,50,41,32,40,95,51,+57,53,32,95,53,54,53,41,41,41,41,41,41,41,41,32,40,40,65,32,+58,49,50,51,50,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,+67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,+67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,+67,32,40,40,67,32,40,40,67,32,40,40,80,32,40,75,32,95,55,57,+57,41,41,32,40,75,32,40,75,32,95,55,57,57,41,41,41,41,32,40,+75,32,40,75,32,95,55,57,57,41,41,41,41,32,40,75,32,95,55,57,+57,41,41,41,32,40,75,32,40,75,32,95,55,57,57,41,41,41,41,32,+40,75,32,40,75,32,95,55,57,57,41,41,41,41,32,40,75,32,40,75,+32,95,55,57,57,41,41,41,41,32,40,75,32,95,55,57,57,41,41,41,+32,40,75,32,95,55,57,57,41,41,41,32,40,75,32,40,75,32,95,55,+57,57,41,41,41,41,32,40,75,32,40,75,32,95,55,57,57,41,41,41,+41,32,40,75,32,40,75,32,95,55,57,57,41,41,41,41,32,40,75,32,+40,75,32,40,75,32,95,55,57,57,41,41,41,41,41,32,65,41,41,32,+40,75,32,40,75,32,95,55,57,57,41,41,41,41,32,40,75,32,95,55,+57,57,41,41,41,32,40,75,32,95,55,57,57,41,41,41,32,40,75,32,+40,75,32,95,55,57,57,41,41,41,41,32,40,40,65,32,58,49,50,51,+51,32,40,40,67,32,66,41,32,40,40,66,32,40,40,67,39,32,66,41,+32,95,49,50,49,52,41,41,32,40,67,32,95,49,50,51,52,41,41,41,+41,32,40,40,65,32,58,49,50,51,52,32,40,67,32,40,95,51,57,55,+32,40,85,32,40,75,32,95,49,49,57,48,41,41,41,41,41,32,40,40,+65,32,58,49,50,51,53,32,40,40,67,32,40,40,40,67,39,32,83,41,+32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,+40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,+67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,+32,83,41,32,40,40,40,67,39,32,67,41,32,40,40,67,32,40,40,67,+32,83,39,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,+32,40,40,67,32,66,41,32,40,40,66,32,40,40,67,39,32,66,41,32,+40,40,40,83,39,32,40,83,39,32,40,95,51,51,32,95,53,56,41,41,+41,32,95,49,50,49,57,41,32,40,40,66,32,40,66,32,40,40,95,51,+50,32,95,53,56,41,32,40,95,54,52,32,95,49,49,52,55,41,41,41,+41,32,40,40,66,32,40,67,39,32,95,49,50,49,57,41,41,32,40,67,+32,95,57,48,53,41,41,41,41,41,41,32,40,67,32,95,55,54,48,41,+41,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,+32,75,41,41,32,40,90,32,40,90,32,75,41,41,41,41,32,40,90,32,+75,41,41,41,32,40,90,32,40,90,32,40,90,32,75,41,41,41,41,41,+32,40,90,32,40,90,32,40,90,32,75,41,41,41,41,41,32,75,41,41,+32,40,40,95,51,52,32,95,53,56,41,32,95,49,51,52,49,41,41,41,+32,40,40,65,32,58,49,50,51,54,32,40,40,66,32,40,40,95,51,51,+32,95,53,56,41,32,95,49,50,48,51,41,41,32,40,40,83,32,40,40,+40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,+39,32,67,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,+67,41,32,40,40,40,67,39,32,83,41,32,40,40,67,32,40,40,40,67,+39,32,67,39,41,32,40,40,67,32,40,40,80,32,40,40,83,32,66,41,+32,40,40,66,32,90,41,32,40,40,66,32,40,66,32,40,40,67,39,32,+95,50,54,49,41,32,95,49,50,51,56,41,41,41,32,40,40,40,67,39,+32,66,41,32,40,40,66,32,40,95,50,55,54,32,95,53,54,41,41,32,+95,55,50,56,41,41,32,40,40,95,52,51,32,95,53,56,41,32,95,49,+50,51,57,41,41,41,41,41,41,32,40,40,83,32,66,41,32,40,40,66,+32,90,41,32,40,40,66,32,40,66,32,40,40,67,39,32,95,50,54,49,+41,32,95,49,50,51,56,41,41,41,32,40,40,40,67,39,32,66,41,32,+40,40,66,32,40,95,50,55,54,32,95,53,54,41,41,32,95,55,50,57,+41,41,32,95,49,50,51,57,41,41,41,41,41,41,32,40,40,83,32,66,+41,32,40,40,66,32,90,41,32,40,40,66,32,40,66,32,40,40,67,39,+32,95,50,54,49,41,32,95,49,50,51,56,41,41,41,32,40,40,40,67,+39,32,66,41,32,40,40,66,32,40,95,50,55,54,32,95,53,54,41,41,+32,95,55,51,48,41,41,32,95,49,50,53,52,41,41,41,41,41,41,32,+40,90,32,75,41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,+32,40,95,50,55,54,32,95,53,54,41,41,32,95,55,51,50,41,41,32,+40,95,49,50,53,51,32,95,55,57,57,41,41,41,41,32,75,41,41,32,+40,40,40,67,39,32,40,67,39,32,66,41,41,32,40,40,66,32,40,66,+32,40,95,50,55,54,32,95,53,54,41,41,41,32,95,55,51,52,41,41,+32,40,95,49,50,53,51,32,95,55,57,57,41,41,41,41,32,40,90,32,+75,41,41,41,32,40,40,66,32,40,40,83,39,32,66,41,32,66,41,41,+32,40,40,66,32,40,66,32,40,66,32,90,41,41,41,32,40,40,66,32,+40,66,32,40,66,32,40,66,32,40,40,67,39,32,95,50,54,49,41,32,+95,49,50,51,56,41,41,41,41,41,32,40,40,40,67,39,32,40,67,39,+32,40,67,39,32,66,41,41,41,32,40,40,66,32,40,66,32,40,66,32,+40,95,49,52,32,95,53,55,41,41,41,41,32,40,40,40,67,39,32,40,+67,39,32,66,41,41,32,40,40,66,32,40,66,32,40,95,49,52,32,95,+53,55,41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,40,+95,49,52,32,95,53,55,41,41,32,40,40,66,32,40,40,95,50,55,54,+32,95,53,54,41,32,95,55,51,54,41,41,32,95,49,50,51,55,41,41,+41,32,40,95,51,52,32,95,53,56,41,41,41,41,32,40,40,95,52,51,+32,95,53,56,41,32,40,85,32,40,40,67,32,40,40,40,67,39,32,67,+39,41,32,40,40,66,32,40,83,39,32,40,95,49,52,32,95,53,55,41,+41,41,32,40,40,66,32,40,66,32,40,40,95,50,55,54,32,95,53,54,+41,32,80,41,41,41,32,40,67,32,40,95,52,51,32,95,53,56,41,41,+41,41,41,32,40,67,32,40,95,52,51,32,95,53,56,41,41,41,41,32,+40,40,40,83,39,32,40,95,51,50,32,95,53,56,41,41,32,40,95,49,+50,48,55,32,34,102,117,110,100,101,112,34,41,41,32,40,90,32,40,95,+51,52,32,95,53,56,41,41,41,41,41,41,41,41,41,32,40,40,95,52,+51,32,95,53,56,41,32,40,40,83,32,40,40,40,67,39,32,67,41,32,+40,40,67,32,40,40,67,32,83,39,41,32,40,90,32,75,41,41,41,32,+40,90,32,75,41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,+32,40,95,50,55,54,32,95,53,54,41,41,32,95,55,56,57,41,41,32,+40,95,49,50,53,53,32,40,95,49,50,53,56,32,95,55,57,57,41,41,+41,41,41,32,40,95,51,52,32,95,53,56,41,41,41,41,41,41,41,41,+41,32,40,40,40,83,39,32,66,41,32,40,66,39,32,40,66,39,32,40,+40,66,32,95,50,54,49,41,32,95,49,50,51,56,41,41,41,41,32,40,+40,40,67,39,32,40,67,39,32,40,67,39,32,66,41,41,41,32,40,40,+66,32,40,66,32,40,66,32,40,95,49,52,32,95,53,55,41,41,41,41,+32,40,40,40,67,39,32,40,67,39,32,66,41,41,32,40,40,66,32,40,+66,32,40,95,49,52,32,95,53,55,41,41,41,32,40,40,40,67,39,32,+66,41,32,40,40,66,32,40,95,50,55,54,32,95,53,54,41,41,32,95,+55,51,55,41,41,32,95,49,50,51,55,41,41,41,32,40,95,49,50,53,+51,32,95,56,48,48,41,41,41,41,32,40,95,51,52,32,95,53,56,41,+41,41,41,41,32,40,40,66,32,40,40,95,50,55,54,32,95,53,54,41,+32,95,55,51,56,41,41,32,40,40,95,52,51,32,95,53,56,41,32,40,+95,49,50,53,51,32,95,55,57,57,41,41,41,41,41,32,40,95,51,52,+32,95,53,56,41,41,41,41,32,40,40,65,32,58,49,50,51,55,32,40,+40,95,52,51,32,95,53,56,41,32,40,95,49,50,53,51,32,95,56,48,+48,41,41,41,32,40,40,65,32,58,49,50,51,56,32,40,40,67,32,83,+41,32,40,40,66,32,40,67,32,66,41,41,32,40,40,66,32,40,66,32,+40,40,67,39,32,40,67,39,32,95,50,54,49,41,41,32,95,49,50,50,+49,41,41,41,32,40,67,32,95,49,50,51,56,41,41,41,41,41,32,40,+40,65,32,58,49,50,51,57,32,40,85,32,40,40,40,83,39,32,66,41,+32,40,66,39,32,40,66,39,32,40,40,66,32,95,50,54,49,41,32,95,+49,50,51,56,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,+67,39,32,66,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,95,+49,52,32,95,53,55,41,41,41,41,32,40,40,40,67,39,32,40,67,39,+32,66,41,41,32,40,40,66,32,40,66,32,40,95,49,52,32,95,53,55,+41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,40,95,50,+55,54,32,95,53,54,41,41,32,95,55,57,53,41,41,32,95,49,50,51,+55,41,41,41,32,40,95,49,51,32,95,53,55,41,41,41,41,32,40,40,+95,49,55,55,32,40,40,66,32,40,40,95,50,55,54,32,95,53,54,41,+32,95,49,55,52,41,41,32,40,40,95,52,51,32,95,53,56,41,32,40,+85,32,40,40,40,67,39,32,66,41,32,40,40,66,32,40,95,50,55,54,+32,95,53,54,41,41,32,80,41,41,32,40,95,49,50,53,53,32,40,95,+49,50,53,56,32,95,55,57,57,41,41,41,41,41,41,41,32,40,40,66,+32,40,40,95,50,55,54,32,95,53,54,41,32,95,49,55,53,41,41,32,+40,40,95,52,51,32,95,53,56,41,32,40,85,32,40,40,66,32,85,41,+32,40,40,40,67,39,32,40,67,39,32,66,41,41,32,40,40,66,32,40,+66,32,40,95,50,55,54,32,95,53,54,41,41,41,32,40,40,40,67,39,+32,66,41,32,40,40,66,32,95,50,54,51,41,32,80,41,41,32,80,41,+41,41,32,40,95,49,50,53,53,32,40,95,49,50,53,56,32,95,55,57,+57,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,65,32,58,49,+50,52,48,32,40,40,83,32,40,40,40,67,39,32,83,41,32,40,40,40,+67,39,32,83,41,32,40,40,40,83,39,32,67,41,32,40,40,40,67,39,+32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,+41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,+40,40,40,67,39,32,83,41,32,40,40,67,32,40,40,67,32,83,39,41,+32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,+75,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,+32,75,41,41,32,40,90,32,40,90,32,75,41,41,41,41,32,40,90,32,+75,41,41,41,32,40,40,66,32,40,66,32,40,40,67,39,32,66,41,32,+66,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,66,+32,40,66,32,40,40,95,51,50,32,95,53,56,41,32,40,95,54,52,32,+95,49,49,52,55,41,41,41,41,41,41,41,41,32,40,40,40,67,39,32,+40,67,39,32,40,67,39,32,40,83,39,32,40,67,39,32,40,67,39,32,+67,41,41,41,41,41,41,32,40,40,66,32,40,40,67,39,32,40,67,39,+32,66,41,41,32,40,40,66,32,40,66,32,40,83,39,32,40,83,39,32,+40,83,39,32,40,83,39,32,40,95,51,51,32,95,53,56,41,41,41,41,+41,41,41,32,40,40,66,32,40,66,32,40,40,67,39,32,66,41,32,40,+40,66,32,40,67,39,32,66,41,41,32,40,40,66,32,40,66,32,95,49,+49,54,54,41,41,32,40,67,32,95,57,48,53,41,41,41,41,41,41,32,+40,40,40,67,39,32,66,41,32,40,40,66,32,40,83,39,32,40,67,39,+32,67,41,41,41,32,40,40,40,67,39,32,40,67,39,32,66,41,41,32,+40,40,66,32,40,66,32,67,41,41,32,40,40,40,67,39,32,40,67,39,+32,67,41,41,32,40,67,32,80,41,41,32,40,95,55,53,56,32,35,48,+41,41,41,41,32,40,95,51,57,53,32,40,40,67,32,40,40,40,67,39,+32,67,41,32,40,40,67,32,40,40,67,32,83,39,41,32,40,90,32,75,+41,41,41,32,40,90,32,75,41,41,41,32,75,41,41,32,40,40,40,110,+111,77,97,116,99,104,32,34,115,114,99,47,77,105,99,114,111,72,115,47,+84,121,112,101,67,104,101,99,107,46,104,115,34,41,32,35,49,49,53,55,+41,32,35,50,53,41,41,41,41,41,41,32,40,40,67,39,32,95,49,50,+52,49,41,32,40,95,51,57,53,32,95,55,57,56,41,41,41,41,41,41,+41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,+32,40,95,50,54,49,32,40,95,51,52,32,95,53,56,41,41,41,41,41,+41,41,41,32,40,40,40,67,39,32,66,41,32,40,66,39,32,40,66,39,+32,40,66,39,32,40,66,39,32,95,52,54,50,41,41,41,41,41,32,40,+40,66,32,40,66,32,40,66,32,40,66,32,95,51,57,52,41,41,41,41,+32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,67,32,40,40,80,+32,40,75,32,40,75,32,95,49,51,48,50,41,41,41,32,40,75,32,40,+75,32,95,49,51,48,50,41,41,41,41,41,41,41,41,32,40,40,40,67,+39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,83,39,32,67,41,+41,41,41,41,32,40,40,66,32,40,40,83,39,32,40,67,39,32,40,67,+39,32,66,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,67,39,+32,40,83,39,32,79,41,41,41,41,41,32,40,40,66,32,40,66,32,40,+66,32,40,66,32,40,40,67,39,32,95,50,54,49,41,32,95,55,51,50,+41,41,41,41,41,32,40,40,66,32,40,40,83,39,32,66,41,32,40,66,+39,32,40,40,66,32,95,50,54,49,41,32,95,55,54,48,41,41,41,41,+32,40,40,66,32,40,66,32,40,66,32,95,49,49,56,57,41,41,41,32,+40,40,40,67,39,32,66,41,32,40,40,66,32,40,67,39,32,95,49,49,+56,55,41,41,32,40,67,32,95,57,48,53,41,41,41,32,40,95,51,57,+53,32,40,40,95,50,54,51,32,95,55,52,51,41,32,95,55,57,56,41,+41,41,41,41,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,+67,39,32,40,67,39,32,79,41,41,41,41,32,40,40,66,32,40,40,67,+39,32,40,83,39,32,40,67,39,32,95,50,54,49,41,41,41,32,40,40,+40,67,39,32,40,67,39,32,40,83,39,32,80,41,41,41,32,40,40,66,+32,40,66,32,40,67,32,95,55,51,49,41,41,41,32,40,40,40,67,39,+32,40,67,39,32,79,41,41,32,40,40,66,32,40,66,32,40,95,50,54,+49,32,40,95,55,57,48,32,95,52,54,49,41,41,41,41,32,40,40,40,+67,39,32,40,67,39,32,95,55,57,49,41,41,32,40,40,40,67,39,32,+40,67,39,32,79,41,41,32,40,40,66,32,40,66,32,40,80,32,95,52,+54,49,41,41,41,32,40,40,66,32,40,66,32,40,95,55,52,52,32,95,+49,50,52,50,41,41,41,32,40,40,66,32,40,66,32,40,95,55,52,55,+32,95,56,57,53,41,41,41,32,40,40,66,32,40,66,32,95,55,56,48,+41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,95,52,54,51,+41,32,95,57,48,48,41,41,32,40,40,66,32,40,95,52,54,51,32,40,+40,79,32,35,52,54,41,32,75,41,41,41,32,95,57,48,48,41,41,41,+41,41,41,41,32,75,41,41,32,95,52,54,49,41,41,41,32,75,41,41,+41,32,95,55,51,49,41,41,41,32,40,40,66,32,40,67,32,40,95,52,+51,54,32,95,56,57,50,41,41,41,32,40,95,51,57,52,32,40,40,67,+32,40,40,80,32,40,40,40,67,39,32,40,67,39,32,79,41,41,32,80,+41,32,75,41,41,32,40,75,32,40,75,32,75,41,41,41,41,32,40,75,+32,40,75,32,75,41,41,41,41,41,41,41,32,75,41,41,41,32,95,49,+50,52,51,41,41,41,41,41,41,41,32,40,95,51,57,52,32,40,40,83,+32,40,40,80,32,40,75,32,40,75,32,75,41,41,41,32,40,75,32,40,+75,32,75,41,41,41,41,32,40,90,32,40,90,32,40,40,67,32,79,41,+32,75,41,41,41,41,41,41,41,41,41,41,32,40,90,32,40,90,32,40,+90,32,75,41,41,41,41,41,32,75,41,41,32,40,40,66,32,40,95,51,+52,32,95,53,56,41,41,32,40,40,67,32,79,41,32,75,41,41,41,41,+32,40,40,65,32,58,49,50,52,49,32,40,40,40,83,39,32,83,41,32,+40,40,66,32,85,41,32,40,40,40,67,39,32,79,41,32,40,40,40,83,+39,32,80,41,32,40,95,51,57,53,32,40,95,50,54,53,32,95,49,50,+53,41,41,41,32,40,95,51,57,53,32,40,95,50,54,53,32,95,49,50,+52,41,41,41,41,32,75,41,41,41,32,40,40,66,32,90,41,32,40,40,+66,32,90,41,32,40,40,66,32,95,51,57,53,41,32,40,40,66,32,85,+41,32,40,40,40,83,39,32,40,67,39,32,66,41,41,32,40,40,66,32,+40,66,32,80,41,41,32,40,40,67,39,32,95,51,57,53,41,32,40,67,+32,40,95,52,51,50,32,95,56,57,50,41,41,41,41,41,32,40,40,67,+39,32,95,51,57,53,41,32,40,67,32,40,95,52,51,50,32,95,56,57,+50,41,41,41,41,41,41,41,41,41,41,32,40,40,65,32,58,49,50,52,+50,32,40,40,95,50,54,49,32,40,95,55,52,55,32,95,56,57,53,41,+41,32,40,95,55,56,49,32,34,110,111,68,101,102,97,117,108,116,34,41,+41,41,32,40,40,65,32,58,49,50,52,51,32,40,40,67,32,95,57,48,+55,41,32,34,36,100,102,108,116,34,41,41,32,40,40,65,32,58,49,50,+52,52,32,40,40,83,32,83,41,32,40,40,66,32,90,41,32,40,40,66,+32,90,41,32,40,40,66,32,95,49,49,56,57,41,32,95,49,50,52,53,+41,41,41,41,41,32,40,40,65,32,58,49,50,52,53,32,40,40,83,32,+40,85,32,40,95,50,52,32,34,116,117,112,108,101,67,111,110,115,116,114,+97,105,110,116,115,34,41,41,41,32,40,40,66,32,40,67,32,80,41,41,+32,40,90,32,40,90,32,40,40,40,83,39,32,95,49,49,56,55,41,32,+40,40,66,32,40,95,56,48,49,32,95,56,57,53,41,41,32,95,52,49,+49,41,41,32,73,41,41,41,41,41,41,32,40,40,65,32,58,49,50,52,+54,32,40,40,83,32,40,40,40,67,39,32,83,41,32,40,40,40,83,39,+32,67,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,+41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,+40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,+40,67,39,32,83,41,32,40,40,67,32,40,40,67,32,83,39,41,32,40,+90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,+41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,75,+41,41,32,40,90,32,40,90,32,75,41,41,41,41,32,40,90,32,75,41,+41,41,32,40,90,32,40,90,32,40,90,32,75,41,41,41,41,41,32,40,+40,40,67,39,32,40,67,39,32,40,67,39,32,40,83,39,32,67,41,41,+41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,40,83,39,+32,40,67,39,32,40,67,39,32,40,40,83,39,32,40,95,51,50,32,95,+53,56,41,41,32,40,40,67,32,95,49,50,48,54,41,32,34,105,110,115,+116,34,41,41,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,+32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,40,95,51,+50,32,95,53,56,41,32,40,95,54,52,32,95,49,49,52,56,41,41,41,+41,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,+32,40,66,32,40,40,83,39,32,40,83,39,32,66,41,41,32,40,40,66,+32,40,66,32,40,67,39,32,40,95,51,50,32,95,53,56,41,41,41,41,+32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,40,83,39,+32,66,41,32,40,40,66,32,67,41,32,95,57,50,56,41,41,32,40,40,+66,32,40,40,67,39,32,95,50,54,49,41,32,95,49,49,48,48,41,41,+32,40,40,66,32,40,95,52,54,51,32,34,110,111,116,32,97,32,99,108,+97,115,115,32,34,41,41,32,95,57,48,50,41,41,41,41,32,40,95,51,+52,32,95,53,56,41,41,41,41,41,41,41,41,41,32,40,40,66,32,40,+66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,+85,41,41,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,+40,66,32,40,66,32,40,66,32,40,66,32,90,41,41,41,41,41,41,41,+32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,+40,66,32,40,66,32,90,41,41,41,41,41,41,41,41,32,40,40,66,32,+40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,+32,40,66,32,40,66,32,40,66,32,40,40,95,51,50,32,95,53,56,41,+32,40,95,54,52,32,95,49,49,52,55,41,41,41,41,41,41,41,41,41,+41,41,41,41,32,40,40,66,32,40,40,83,39,32,40,83,39,32,40,83,+39,32,66,41,41,41,32,40,40,66,32,40,66,32,66,39,41,41,32,40,+40,66,32,40,66,32,66,39,41,41,32,40,40,66,32,40,66,32,40,66,+32,40,83,39,32,66,41,41,41,41,32,40,40,66,32,40,66,32,40,66,+32,66,39,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,+40,67,39,32,40,67,39,32,40,95,51,51,32,95,53,56,41,41,41,41,+41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,+40,66,32,95,49,49,54,55,41,41,41,41,41,41,32,40,40,40,67,39,+32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,+32,79,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,+66,32,40,67,39,32,67,41,41,41,41,41,32,40,40,66,32,40,66,32,+40,67,39,32,40,67,39,32,67,41,41,41,41,32,40,40,66,32,40,67,+39,32,40,67,39,32,67,41,41,41,32,40,40,67,39,32,40,67,39,32,+80,41,41,32,40,40,66,32,40,66,32,40,95,50,54,49,32,95,55,52,+51,41,41,41,32,40,67,32,95,57,48,53,41,41,41,41,41,41,41,32,+75,41,41,41,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,+32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,+66,32,40,95,51,52,32,95,53,56,41,41,41,41,41,41,41,41,41,41,+41,32,40,40,40,67,39,32,66,41,32,40,66,39,32,40,66,39,32,40,+66,39,32,40,66,39,32,40,66,39,32,40,66,39,32,40,66,39,32,40,+66,39,32,79,41,41,41,41,41,41,41,41,41,32,40,40,40,67,39,32,+40,67,39,32,40,67,39,32,66,41,41,41,32,40,40,66,32,40,66,32,+66,39,41,41,32,40,40,66,32,40,66,32,66,39,41,41,32,40,40,66,+32,40,66,32,40,66,32,40,83,39,32,66,41,41,41,41,32,40,40,66,+32,40,66,32,40,66,32,66,39,41,41,41,32,40,40,66,32,40,66,32,+40,66,32,40,66,32,79,41,41,41,41,32,40,40,66,32,40,66,32,40,+66,32,40,67,32,95,55,51,50,41,41,41,41,32,40,40,40,67,39,32,+66,41,32,40,66,39,32,40,40,66,32,95,50,54,49,41,32,95,49,50,+52,55,41,41,41,32,95,49,50,52,52,41,41,41,41,41,41,41,41,32,+40,40,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,+39,32,40,67,39,32,79,41,41,41,41,41,41,32,40,40,66,32,40,66,+32,40,66,32,40,40,67,39,32,66,41,32,40,66,39,32,40,40,66,32,+95,50,54,49,41,32,95,55,51,49,41,41,41,41,41,41,32,40,40,66,+32,40,66,32,40,66,32,40,66,32,40,66,32,40,95,50,54,49,32,40,+95,55,54,50,32,95,52,54,49,41,41,41,41,41,41,41,32,40,40,66,+32,40,40,67,39,32,66,41,32,40,66,39,32,40,66,39,32,40,40,66,+32,40,95,51,57,57,32,95,55,52,52,41,41,32,40,40,66,32,40,95,+50,54,49,32,95,55,52,51,41,41,32,95,49,50,53,49,41,41,41,41,+41,41,32,40,40,66,32,40,40,83,39,32,40,67,39,32,66,41,41,32,+40,40,66,32,40,66,32,95,52,54,51,41,41,32,40,40,66,32,95,51,+57,53,41,32,40,40,66,32,95,50,54,53,41,32,40,40,66,32,40,95,+50,54,49,32,95,55,52,51,41,41,32,40,40,67,32,95,56,57,56,41,+32,34,100,105,99,116,36,34,41,41,41,41,41,41,41,32,40,40,66,32,+40,66,32,95,51,57,53,41,41,32,40,40,66,32,40,40,67,39,32,40,+83,39,32,95,50,54,49,41,41,32,40,40,66,32,40,66,32,95,52,55,+49,41,41,32,40,40,66,32,40,66,32,40,95,50,54,49,32,95,55,52,+51,41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,95,50,+54,49,41,32,95,57,48,49,41,41,32,95,49,50,52,51,41,41,41,41,+41,32,40,40,66,32,40,67,32,40,95,52,51,54,32,95,56,57,50,41,+41,41,32,40,95,51,57,52,32,40,40,67,32,40,40,80,32,40,40,40,+67,39,32,40,67,39,32,79,41,41,32,40,40,40,67,39,32,66,41,32,+80,41,32,95,55,52,54,41,41,32,75,41,41,32,40,75,32,40,75,32,+75,41,41,41,41,32,40,75,32,40,75,32,75,41,41,41,41,41,41,41,+41,41,41,41,41,32,75,41,41,41,41,41,41,41,41,41,41,41,41,32,+40,95,56,48,53,32,95,56,48,56,41,41,41,32,95,49,49,51,48,41,+41,41,32,75,41,41,32,40,40,66,32,40,95,51,52,32,95,53,56,41,+41,32,40,40,67,32,79,41,32,75,41,41,41,41,32,40,40,65,32,58,+49,50,52,55,32,40,40,83,32,83,41,32,40,40,66,32,90,41,32,40,+40,66,32,90,41,32,95,55,54,48,41,41,41,41,32,40,40,65,32,58,+49,50,52,56,32,40,40,40,83,39,32,40,95,51,51,32,95,53,56,41,+41,32,40,40,95,52,52,32,95,53,56,41,32,95,49,50,52,57,41,41,+32,40,40,95,52,51,32,95,53,56,41,32,40,40,66,32,40,40,95,51,+51,32,95,53,56,41,32,95,49,50,48,51,41,41,32,95,49,50,53,50,+41,41,41,41,32,40,40,65,32,58,49,50,52,57,32,40,40,66,32,40,+40,95,51,50,32,95,53,56,41,32,40,95,54,52,32,95,49,49,52,55,+41,41,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,40,+67,39,32,83,41,41,32,40,40,40,67,39,32,40,67,39,32,83,41,41,+32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,40,67,39,+32,40,67,39,32,83,41,41,32,40,40,40,67,39,32,40,67,39,32,67,+41,41,32,40,40,40,67,39,32,40,67,39,32,83,41,41,32,40,40,40,+67,39,32,40,67,39,32,67,41,41,32,40,40,40,67,39,32,67,41,32,+40,40,40,67,39,32,40,67,39,32,83,39,41,41,32,40,40,67,32,40,+40,67,32,83,39,41,32,40,40,66,32,40,67,32,66,41,41,32,40,40,+40,67,39,32,40,83,39,32,40,67,39,32,40,67,39,32,40,95,52,52,+32,95,53,56,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,+40,66,32,85,41,41,41,41,32,40,40,40,83,39,32,66,41,32,40,40,+66,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,83,41,+41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,66,+32,40,40,67,39,32,67,39,41,32,95,49,50,49,51,41,41,41,41,41,+41,32,40,40,66,32,40,66,32,40,40,83,39,32,66,41,32,40,66,39,+32,40,66,39,32,40,40,66,32,95,50,54,49,41,32,95,55,54,48,41,+41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,40,67,39,+32,66,41,32,40,66,39,32,40,40,66,32,95,50,54,49,41,32,95,55,+54,48,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,+40,67,39,32,66,41,32,40,40,66,32,95,50,54,49,41,32,95,49,50,+52,52,41,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,+39,32,66,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,95,51,+57,55,32,40,40,95,50,54,51,32,95,49,49,56,56,41,32,95,53,54,+54,41,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,66,41,41,+32,40,40,66,32,40,66,32,40,95,51,57,57,32,95,49,49,56,54,41,+41,41,32,40,40,66,32,40,66,32,95,49,49,56,52,41,41,32,95,57,+48,53,41,41,41,32,40,95,51,57,53,32,95,49,49,56,53,41,41,41,+41,32,40,40,95,49,55,55,32,95,50,54,52,41,32,40,95,51,57,53,+32,95,53,54,54,41,41,41,41,41,41,41,41,41,32,40,40,66,32,40,+66,32,40,66,32,40,95,50,54,49,32,95,55,53,57,41,41,41,41,32,+40,40,40,83,39,32,40,67,39,32,66,41,41,32,40,40,66,32,40,66,+32,95,55,54,51,41,41,32,40,40,66,32,95,51,57,52,41,32,40,40,+66,32,85,41,32,40,90,32,40,40,40,67,39,32,40,67,39,32,40,67,+39,32,40,67,39,32,79,41,41,41,41,32,40,40,40,67,39,32,66,41,+32,40,40,66,32,40,67,39,32,66,41,41,32,40,40,66,32,40,66,32,+80,41,41,32,95,57,48,53,41,41,41,32,40,40,66,32,40,40,67,39,+32,40,95,52,55,57,32,95,50,55,55,41,41,32,40,40,95,49,55,55,+32,95,52,49,49,41,32,95,52,49,49,41,41,41,32,40,40,67,32,40,+40,67,32,95,51,57,50,41,32,35,49,41,41,32,35,48,41,41,41,41,+32,75,41,41,41,41,41,41,32,95,57,48,53,41,41,41,41,41,32,73,+41,41,41,41,32,40,40,66,32,40,67,32,66,41,41,32,40,40,66,32,+40,40,67,39,32,66,41,32,66,41,41,32,40,40,66,32,40,66,32,90,+41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,40,83,39,32,+40,67,39,32,40,67,39,32,83,41,41,41,32,40,40,66,32,40,66,32,+40,66,32,40,40,67,39,32,67,39,41,32,95,49,50,49,51,41,41,41,+41,32,40,40,66,32,40,66,32,40,40,83,39,32,66,41,32,40,40,66,+32,95,50,54,49,41,32,95,55,54,48,41,41,41,41,32,40,40,66,32,+40,66,32,40,66,32,40,66,32,40,95,50,54,49,32,40,95,55,54,48,+32,95,52,54,49,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,+66,32,40,40,67,39,32,95,49,49,56,56,41,32,40,40,66,32,40,95,+50,54,49,32,95,53,54,54,41,41,32,40,40,66,32,40,95,50,54,49,+32,95,52,50,56,41,41,32,40,40,95,49,55,55,32,95,50,54,52,41,+32,40,95,51,57,53,32,95,53,54,54,41,41,41,41,41,41,41,41,32,+40,40,40,67,39,32,40,67,39,32,66,41,41,32,40,40,66,32,40,66,+32,40,95,51,57,57,32,95,49,49,56,54,41,41,41,32,40,40,66,32,+40,66,32,95,49,49,56,52,41,41,32,95,57,48,53,41,41,41,32,40,+95,51,57,53,32,95,49,49,56,53,41,41,41,41,41,41,41,32,40,40,+66,32,40,66,32,40,95,50,54,49,32,95,55,53,57,41,41,41,32,40,+40,66,32,40,66,32,95,55,54,52,41,41,32,95,57,48,53,41,41,41,+41,41,41,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,+41,41,32,95,49,50,49,52,41,41,32,75,41,41,32,40,75,32,95,49,+50,49,52,41,41,41,32,40,90,32,75,41,41,41,32,40,40,66,32,40,+40,67,39,32,66,41,32,66,41,41,32,40,40,66,32,40,66,32,40,67,+39,32,67,41,41,41,32,40,40,66,32,40,67,39,32,67,41,41,32,95,+49,50,53,48,41,41,41,41,41,32,40,90,32,40,90,32,40,90,32,75,+41,41,41,41,41,32,75,41,41,32,40,40,95,51,52,32,95,53,56,41,+32,95,49,51,52,49,41,41,41,41,32,40,40,65,32,58,49,50,53,48,+32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,40,95,+51,50,32,95,53,56,41,32,40,95,54,52,32,95,49,49,52,55,41,41,+41,41,41,41,41,32,40,40,40,67,39,32,40,83,39,32,40,67,39,32,+40,67,39,32,40,67,39,32,83,41,41,41,41,41,32,40,40,40,67,39,+32,40,67,39,32,40,67,39,32,40,67,39,32,66,41,41,41,41,32,40,+40,66,32,40,66,32,40,66,32,40,66,32,40,67,39,32,67,41,41,41,+41,41,32,40,40,40,83,39,32,40,67,39,32,40,67,39,32,40,67,39,+32,40,67,39,32,40,67,39,32,83,41,41,41,41,41,41,32,40,40,40,+67,39,32,40,67,39,32,40,83,39,32,40,67,39,32,40,67,39,32,40,+83,39,32,40,67,39,32,83,41,41,41,41,41,41,41,32,40,40,40,67,+39,32,66,41,32,40,40,66,32,40,67,39,32,40,67,39,32,40,67,39,+32,40,67,39,32,40,67,39,32,40,67,39,32,67,41,41,41,41,41,41,+41,32,40,40,66,32,40,66,32,40,66,32,40,40,83,39,32,66,41,32,+40,66,39,32,40,40,66,32,40,67,39,32,40,83,39,32,40,67,39,32,+40,95,51,51,32,95,53,56,41,41,41,41,41,32,40,40,66,32,40,66,+32,40,40,67,39,32,83,41,32,40,67,32,95,49,50,49,51,41,41,41,+41,32,40,40,66,32,40,66,32,40,66,32,40,95,50,54,49,32,95,55,+53,57,41,41,41,41,32,40,40,40,83,39,32,40,67,39,32,40,83,39,+32,95,55,54,51,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,+67,39,32,79,41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,+32,40,67,39,32,80,41,41,32,95,57,48,53,41,41,32,95,52,49,49,+41,41,32,75,41,41,32,95,57,48,53,41,41,41,41,41,41,41,41,41,+32,40,40,66,32,40,40,83,39,32,66,41,32,40,40,66,32,40,67,39,+32,40,83,39,32,40,83,39,32,66,41,41,41,41,32,40,40,66,32,40,+66,32,40,66,32,40,66,32,40,95,51,51,32,95,53,56,41,41,41,41,+41,32,40,40,66,32,40,66,32,40,66,32,40,95,52,52,32,95,53,56,+41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,67,32,40,40,+80,32,40,75,32,40,75,32,95,49,51,48,50,41,41,41,32,40,75,32,+40,75,32,95,49,51,48,50,41,41,41,41,41,41,41,32,40,40,40,67,+39,32,66,41,32,40,40,66,32,40,67,39,32,83,41,41,32,40,40,66,+32,40,66,32,40,40,67,39,32,67,39,41,32,95,49,50,49,51,41,41,+41,32,40,40,40,83,39,32,66,41,32,40,66,39,32,40,40,66,32,95,+50,54,49,41,32,95,55,54,48,41,41,41,32,40,40,66,32,40,66,32,+95,49,49,56,57,41,41,32,40,40,66,32,40,67,32,95,49,49,56,55,+41,41,32,40,95,51,57,53,32,40,40,95,50,54,51,32,95,55,52,51,+41,32,95,55,57,56,41,41,41,41,41,41,41,41,32,40,40,66,32,40,+66,32,40,95,50,54,49,32,95,55,52,51,41,41,41,32,95,57,48,53,+41,41,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,+40,67,39,32,66,41,32,40,66,39,32,95,49,49,54,54,41,41,41,41,+41,32,40,40,40,67,39,32,40,83,39,32,66,41,41,32,40,40,66,32,+40,66,32,40,67,39,32,40,67,39,32,67,41,41,41,41,32,40,40,40,+67,39,32,40,67,39,32,66,41,41,32,40,40,66,32,40,66,32,40,67,+39,32,67,41,41,41,32,40,40,66,32,40,66,32,67,41,41,32,40,67,+32,80,41,41,41,41,32,40,95,51,57,53,32,40,40,67,32,40,40,40,+67,39,32,67,41,32,40,40,67,32,40,40,67,32,83,39,41,32,40,90,+32,75,41,41,41,32,40,90,32,75,41,41,41,32,75,41,41,32,40,40,+40,110,111,77,97,116,99,104,32,34,115,114,99,47,77,105,99,114,111,72,+115,47,84,121,112,101,67,104,101,99,107,46,104,115,34,41,32,35,49,50,+54,57,41,32,35,50,53,41,41,41,41,41,41,32,40,40,66,32,95,49,+50,52,49,41,32,40,95,51,57,53,32,95,55,57,56,41,41,41,41,41,+41,41,41,32,95,49,50,53,49,41,41,32,40,40,40,83,39,32,66,41,+32,40,66,39,32,40,40,66,32,95,50,54,49,41,32,95,55,54,48,41,+41,41,32,40,40,66,32,40,66,32,40,95,51,57,55,32,95,49,49,56,+56,41,41,41,32,40,40,66,32,40,67,32,95,49,49,56,55,41,41,32,+40,95,51,57,53,32,95,49,49,56,53,41,41,41,41,41,41,32,40,40,+40,67,39,32,66,41,32,95,52,54,51,41,32,40,95,51,57,53,32,40,+40,67,32,40,40,40,67,39,32,67,41,32,40,40,67,32,40,40,67,32,+83,39,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,+65,41,41,32,40,40,40,110,111,77,97,116,99,104,32,34,115,114,99,47,+77,105,99,114,111,72,115,47,84,121,112,101,67,104,101,99,107,46,104,115,+34,41,32,35,49,50,54,56,41,32,35,50,53,41,41,41,41,41,41,41,+32,40,95,51,57,52,32,40,40,83,32,40,40,80,32,40,75,32,40,75,+32,75,41,41,41,32,40,75,32,40,75,32,75,41,41,41,41,32,40,90,+32,40,90,32,40,40,67,32,79,41,32,75,41,41,41,41,41,41,41,32,+40,67,32,95,57,48,53,41,41,41,41,32,40,40,65,32,58,49,50,53,+49,32,40,40,67,32,95,57,48,55,41,32,34,36,67,34,41,41,32,40,+40,65,32,58,49,50,53,50,32,40,40,83,32,40,40,40,67,39,32,83,+41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,+40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,67,41,32,40,40,+40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,+39,32,67,41,32,40,40,40,67,39,32,83,41,32,40,40,67,32,40,40,+67,32,83,39,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,+41,32,40,90,32,75,41,41,41,32,40,40,40,83,39,32,66,41,32,40,+40,66,32,40,95,51,50,32,95,53,56,41,41,32,40,95,49,50,48,55,+32,34,116,121,112,101,32,115,105,103,110,97,116,117,114,101,34,41,41,41,+32,40,40,66,32,40,66,32,85,41,41,32,40,40,66,32,90,41,32,40,+40,66,32,40,66,32,40,66,32,40,40,95,51,50,32,95,53,56,41,32,+40,95,54,52,32,95,49,49,52,55,41,41,41,41,41,32,40,40,66,32,+40,40,67,39,32,40,67,39,32,66,41,41,32,40,40,66,32,40,66,32,+40,95,51,50,32,95,53,56,41,41,41,32,40,67,32,40,95,49,50,55,+54,32,95,49,50,53,41,41,41,41,41,32,40,40,66,32,40,66,32,40,+66,32,40,40,95,51,51,32,95,53,56,41,32,95,49,51,50,54,41,41,+41,41,32,40,40,66,32,40,66,32,40,66,32,40,95,50,54,49,32,40,+95,51,52,32,95,53,56,41,41,41,41,41,32,40,40,66,32,40,66,32,+95,55,51,49,41,41,32,40,67,32,95,57,48,53,41,41,41,41,41,41,+41,41,41,41,41,32,40,90,32,75,41,41,41,32,75,41,41,32,40,40,+66,32,40,66,32,40,66,32,40,40,95,51,50,32,95,53,56,41,32,40,+95,54,52,32,95,49,49,52,55,41,41,41,41,41,32,40,40,66,32,40,+66,32,40,66,32,40,66,32,40,95,51,52,32,95,53,56,41,41,41,41,+41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,67,39,41,32,95,+55,51,52,41,41,32,40,67,32,95,57,48,53,41,41,41,41,41,41,32,+40,90,32,75,41,41,41,32,40,90,32,40,90,32,40,90,32,75,41,41,+41,41,41,32,40,90,32,40,90,32,40,90,32,75,41,41,41,41,41,32,+75,41,41,32,40,95,51,52,32,95,53,56,41,41,41,32,40,40,65,32,+58,49,50,53,51,32,40,95,49,50,54,48,32,95,49,50,53,53,41,41,+32,40,40,65,32,58,49,50,53,52,32,40,40,66,32,40,40,95,50,55,+54,32,95,53,54,41,32,95,53,54,53,41,41,32,40,95,49,50,53,57,+32,95,49,50,53,53,41,41,41,32,40,40,65,32,58,49,50,53,53,32,+40,40,66,32,40,66,32,40,95,49,49,54,51,32,95,49,49,52,48,41,+41,41,32,40,40,40,67,39,32,66,41,32,95,49,50,54,54,41,32,95,+49,50,57,55,41,41,41,32,40,40,65,32,58,49,50,53,54,32,40,40,+66,32,40,95,50,54,51,32,95,49,49,54,52,41,41,32,95,49,50,53,+53,41,41,32,40,40,65,32,58,49,50,53,55,32,40,40,66,32,90,41,+32,85,41,41,32,40,40,65,32,58,49,50,53,56,32,40,90,32,85,41,+41,32,40,40,65,32,58,49,50,53,57,32,40,40,66,32,40,66,32,40,+40,95,51,50,32,95,53,56,41,32,95,49,50,48,53,41,41,41,32,40,+40,40,67,39,32,40,67,39,32,40,83,39,32,40,95,51,50,32,95,53,+56,41,41,41,41,32,40,40,67,32,67,39,41,32,95,49,50,53,55,41,+41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,40,95,51,50,32,+95,53,56,41,41,32,95,49,50,54,51,41,41,32,40,40,66,32,40,66,+32,40,95,51,52,32,95,53,56,41,41,41,32,80,41,41,41,41,41,32,+40,40,65,32,58,49,50,54,48,32,40,40,67,32,66,41,32,95,49,50,+53,56,41,41,32,40,40,65,32,58,49,50,54,49,32,40,95,49,50,53,+57,32,95,49,50,54,54,41,41,32,40,40,65,32,58,49,50,54,50,32,+40,40,67,32,40,40,40,83,39,32,67,39,41,32,95,49,49,57,50,41,+32,40,95,49,50,54,48,32,95,49,50,54,54,41,41,41,32,40,85,32,+40,75,32,40,75,32,95,50,53,41,41,41,41,41,32,40,40,65,32,58,+49,50,54,51,32,40,40,66,32,40,40,95,51,50,32,95,53,56,41,32,+40,95,54,52,32,95,49,49,52,54,41,41,41,32,40,40,40,67,39,32,+67,41,32,40,40,40,83,39,32,67,41,32,95,50,57,49,41,32,40,40,+66,32,40,95,51,52,32,95,53,56,41,41,32,95,55,53,56,41,41,41,+32,40,95,51,52,32,95,53,56,41,41,41,41,32,40,40,65,32,58,49,+50,54,52,32,40,40,66,32,40,66,32,40,66,32,40,40,95,51,50,32,+95,53,56,41,32,40,95,54,52,32,95,49,49,52,54,41,41,41,41,41,+32,40,40,66,32,40,40,67,39,32,40,83,39,32,67,41,41,32,40,40,+40,83,39,32,66,41,32,40,40,66,32,83,41,32,95,50,57,49,41,41,+32,40,40,66,32,40,66,32,40,66,32,95,49,49,53,55,41,41,41,32,+95,50,57,50,41,41,41,41,32,40,40,66,32,67,41,32,95,49,49,57,+57,41,41,41,41,32,40,40,65,32,58,49,50,54,53,32,40,40,80,32,+95,49,50,54,51,41,32,40,95,51,52,32,95,53,56,41,41,41,32,40,+40,65,32,58,49,50,54,54,32,40,40,40,67,39,32,40,67,39,32,40,+95,51,50,32,95,53,56,41,41,41,32,95,49,50,54,55,41,32,40,95,+51,52,32,95,53,56,41,41,41,32,40,40,65,32,58,49,50,54,55,32,+40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,40,83,39,32,67,+41,41,32,40,40,40,83,39,32,40,67,39,32,40,67,39,32,67,41,41,+41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,+32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,40,67,39,+32,40,67,39,32,40,67,39,32,83,39,41,41,41,32,40,40,40,83,39,+32,40,67,39,32,83,41,41,32,40,40,40,83,39,32,40,67,39,32,83,+41,41,32,40,40,40,83,39,32,40,67,39,32,83,41,41,32,40,40,40,+83,39,32,40,67,39,32,67,41,41,32,40,40,40,83,39,32,40,67,39,+32,83,41,41,32,40,40,40,83,39,32,40,67,39,32,83,41,41,32,40,+40,40,83,39,32,40,67,39,32,83,41,41,32,40,40,40,83,39,32,40,+67,39,32,67,41,41,32,40,40,40,83,39,32,40,67,39,32,67,41,41,+32,40,40,40,83,39,32,40,83,39,32,83,41,41,32,40,40,40,83,39,+32,40,67,39,32,67,41,41,32,40,40,40,83,39,32,40,67,39,32,67,+41,41,32,40,40,40,83,39,32,67,41,32,40,40,66,32,40,83,32,83,+39,41,41,32,40,40,40,83,39,32,40,67,39,32,40,67,39,32,83,41,+41,41,32,40,40,66,32,40,66,32,40,66,32,40,83,32,40,95,57,48,+52,32,34,100,105,99,116,36,34,41,41,41,41,41,32,40,40,40,67,39,+32,66,41,32,40,40,66,32,40,67,39,32,67,41,41,32,40,40,66,32,+40,66,32,40,83,32,95,57,49,53,41,41,41,32,40,40,66,32,40,66,+32,40,40,67,39,32,40,95,51,50,32,95,53,56,41,41,32,95,49,50,+48,56,41,41,41,32,40,40,66,32,40,66,32,85,41,41,32,40,40,66,+32,40,66,32,40,66,32,40,40,67,39,32,40,95,51,50,32,95,53,56,+41,41,32,40,40,83,32,40,40,40,67,39,32,83,41,32,40,40,40,67,+39,32,83,41,32,40,40,40,83,39,32,67,41,32,40,40,40,67,39,32,+83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,+32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,+40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,+67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,+32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,+41,32,40,40,40,67,39,32,83,41,32,40,40,67,32,40,40,67,32,83,+39,41,32,75,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,+41,41,32,75,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,+41,41,32,40,90,32,75,41,41,41,32,75,41,41,32,75,41,41,32,40,+90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,+41,41,32,40,90,32,40,90,32,75,41,41,41,41,32,40,90,32,75,41,+41,41,32,40,90,32,75,41,41,41,32,40,40,40,67,39,32,66,41,32,+40,40,66,32,40,95,50,55,50,32,95,53,54,41,41,32,95,52,55,49,+41,41,32,95,49,49,57,52,41,41,41,32,75,41,41,32,40,90,32,75,+41,41,41,32,40,95,51,52,32,95,53,56,41,41,41,41,41,41,32,40,+40,67,39,32,40,67,39,32,67,41,41,32,95,49,51,49,54,41,41,41,+41,41,41,41,32,40,95,49,51,48,51,32,40,40,80,32,95,56,51,55,+41,32,95,56,48,56,41,41,41,41,41,32,40,40,66,32,40,40,67,39,+32,40,95,51,50,32,95,53,56,41,41,32,40,40,40,67,39,32,95,49,+50,48,54,41,32,40,95,56,48,53,32,95,56,48,55,41,41,32,34,100,+105,99,116,36,34,41,41,41,32,40,40,40,67,39,32,40,83,39,32,40,+95,51,51,32,95,53,56,41,41,41,32,40,40,40,67,39,32,66,41,32,+40,85,32,40,75,32,95,49,51,48,50,41,41,41,32,95,49,49,54,56,+41,41,32,40,40,66,32,40,95,51,52,32,95,53,56,41,41,32,95,55,+52,51,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,40,67,39,+32,66,41,32,40,40,66,32,40,95,51,50,32,95,53,56,41,41,32,95,+49,50,54,49,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,85,+41,41,41,32,40,40,66,32,40,40,83,39,32,66,41,32,40,66,39,32,+40,40,66,32,40,67,39,32,40,95,51,50,32,95,53,56,41,41,41,32,+95,49,50,55,50,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,+40,66,32,85,41,41,41,41,32,40,40,66,32,40,66,32,40,40,67,39,+32,66,41,32,40,40,66,32,40,67,39,32,66,41,41,32,40,40,66,32,+40,66,32,40,95,51,50,32,95,53,56,41,41,41,32,95,49,51,49,51,+41,41,41,41,41,32,40,40,67,39,32,40,67,39,32,40,67,39,32,67,+41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,67,39,41,+32,95,49,51,49,54,41,41,32,95,55,52,52,41,41,41,41,41,41,41,+41,41,32,40,40,66,32,40,40,67,39,32,40,67,39,32,40,95,51,50,+32,95,53,56,41,41,41,32,95,49,50,55,49,41,41,32,95,49,50,54,+54,41,41,41,32,95,49,50,55,53,41,41,32,40,40,40,67,39,32,40,+67,39,32,40,67,39,32,40,67,39,32,67,41,41,41,41,32,40,40,40,+83,39,32,40,67,39,32,40,67,39,32,40,83,39,32,40,83,39,32,67,+41,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,+40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,41,41,41,32,+40,40,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,+39,32,40,67,39,32,83,41,41,41,41,41,41,32,40,40,40,67,39,32,+40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,+83,41,41,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,+39,32,40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,41,41,+41,32,40,40,40,83,39,32,40,83,39,32,40,83,39,32,40,83,39,32,+40,67,39,32,40,83,39,32,67,41,41,41,41,41,41,32,40,40,40,67,+39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,+39,32,83,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,+40,66,32,40,40,83,39,32,66,41,32,40,40,67,32,67,39,41,32,75,+41,41,41,41,41,41,32,40,40,40,83,39,32,66,41,32,40,66,39,32,+40,66,39,32,40,66,39,32,40,40,66,32,40,67,39,32,66,41,41,32,+40,40,66,32,40,66,32,40,95,51,50,32,95,53,56,41,41,41,32,85,+41,41,41,41,41,41,32,40,40,40,83,39,32,66,41,32,40,66,39,32,+40,40,66,32,40,83,39,32,40,67,39,32,40,67,39,32,67,41,41,41,+41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,67,32,83,41,+41,41,41,41,32,40,40,40,83,39,32,40,83,39,32,40,67,39,32,40,+83,39,32,40,67,39,32,67,41,41,41,41,41,32,40,40,66,32,40,66,+32,40,66,32,40,66,32,40,66,32,40,83,32,40,40,67,32,40,95,50,+48,50,32,95,56,57,50,41,41,32,40,95,56,57,55,32,95,49,49,48,+55,41,41,41,41,41,41,41,41,32,40,40,40,83,39,32,40,83,39,32,+40,67,39,32,40,83,39,32,40,67,39,32,67,41,41,41,41,41,32,40,+40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,83,32,40,40,+67,32,40,95,50,48,50,32,95,56,57,50,41,41,32,40,95,56,57,55,+32,95,49,49,48,56,41,41,41,41,41,41,41,41,32,40,40,40,83,39,+32,40,83,39,32,40,67,39,32,66,41,41,41,32,40,40,66,32,40,66,+32,40,66,32,40,67,39,32,67,41,41,41,41,32,40,40,66,32,40,66,+32,40,66,32,40,66,32,40,83,32,40,40,67,32,40,95,50,48,50,32,+95,56,57,50,41,41,32,40,95,56,57,55,32,95,49,49,48,57,41,41,+41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,40,67,39,+32,67,41,32,40,67,32,40,40,67,32,40,95,50,48,50,32,95,56,57,+50,41,41,32,40,95,56,57,55,32,95,49,49,49,49,41,41,41,41,41,+41,41,32,95,49,50,54,57,41,41,41,41,32,40,40,40,67,39,32,40,+67,39,32,66,41,41,32,95,49,50,54,57,41,32,40,40,66,32,95,55,+55,55,41,32,95,51,54,51,41,41,41,41,41,32,40,40,40,67,39,32,+83,41,32,40,40,40,67,39,32,40,67,39,32,67,39,41,41,32,95,49,+50,55,48,41,32,40,40,66,32,95,55,55,53,41,32,95,51,54,48,41,+41,41,32,40,40,67,32,95,49,50,57,56,41,32,95,49,49,48,56,41,+41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,66,41,41,32,95,+49,50,54,57,41,32,40,40,66,32,95,55,55,53,41,32,95,51,54,48,+41,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,40,+67,39,32,40,95,51,50,32,95,53,56,41,41,32,40,40,66,32,95,49,+50,54,49,41,32,40,40,66,32,95,55,52,51,41,32,40,40,67,32,95,+56,57,56,41,32,34,102,114,111,109,73,110,116,101,103,101,114,34,41,41,+41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,85,41,41,41,+32,40,40,66,32,40,66,32,40,40,83,39,32,66,41,32,40,40,66,32,+40,67,39,32,40,95,51,50,32,95,53,56,41,41,41,32,95,49,50,55,+50,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,85,+41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,90,41,41,41,32,+40,40,67,39,32,40,67,39,32,40,67,39,32,67,41,41,41,32,40,40,+66,32,40,40,67,39,32,66,41,32,95,49,51,49,54,41,41,32,40,67,+32,95,55,52,52,41,41,41,41,41,41,41,41,41,41,41,41,32,75,41,+41,32,40,40,40,83,39,32,66,41,32,40,66,39,32,40,66,39,32,40,+40,66,32,40,67,39,32,66,41,41,32,40,40,66,32,40,66,32,40,95,+51,50,32,95,53,56,41,41,41,32,85,41,41,41,41,41,32,40,40,40,+83,39,32,66,41,32,40,66,39,32,40,40,66,32,40,83,39,32,40,67,+39,32,67,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,67,32,+83,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,40,67,39,+32,67,41,32,40,67,32,40,40,67,32,40,95,50,48,50,32,95,56,57,+50,41,41,32,40,95,56,57,55,32,95,49,49,48,57,41,41,41,41,41,+41,41,32,40,40,40,67,39,32,40,67,39,32,66,41,41,32,95,49,50,+54,57,41,32,40,40,66,32,95,55,55,55,41,32,40,95,50,53,54,32,+95,49,53,50,41,41,41,41,41,41,41,41,32,40,40,66,32,40,66,32,+40,66,32,40,40,67,39,32,40,95,51,50,32,95,53,56,41,41,32,40,+40,66,32,95,49,50,54,49,41,32,40,40,66,32,95,55,52,51,41,32,+40,40,67,32,95,56,57,56,41,32,34,102,114,111,109,82,97,116,105,111,+110,97,108,34,41,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,+66,32,85,41,41,41,32,40,40,66,32,40,66,32,40,40,83,39,32,66,+41,32,40,40,66,32,40,67,39,32,40,95,51,50,32,95,53,56,41,41,+41,32,95,49,50,55,50,41,41,41,41,32,40,40,66,32,40,66,32,40,+66,32,40,66,32,85,41,41,41,41,32,40,40,66,32,40,66,32,40,66,+32,90,41,41,41,32,40,40,67,39,32,40,67,39,32,40,67,39,32,67,+41,41,41,32,40,40,66,32,40,40,67,39,32,66,41,32,95,49,51,49,+54,41,41,32,40,67,32,95,55,52,52,41,41,41,41,41,41,41,41,41,+41,41,41,32,75,41,41,32,75,41,41,32,75,41,41,32,75,41,41,32,+95,49,50,54,57,41,41,32,40,40,80,32,40,75,32,40,40,95,49,51,+32,95,53,55,41,32,95,52,55,54,41,41,41,32,40,40,40,67,39,32,+40,95,51,50,32,95,53,56,41,41,32,40,40,40,67,39,32,40,95,51,+50,32,95,53,56,41,41,32,95,49,49,57,55,41,32,95,49,49,57,54,+41,41,32,40,40,67,32,40,40,40,67,39,32,83,41,32,40,40,40,67,+39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,+83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,+32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,+40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,+67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,+32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,+41,32,40,40,67,32,40,40,40,67,39,32,83,39,41,32,40,85,32,40,+40,66,32,40,95,49,51,32,95,53,55,41,41,32,95,52,55,55,41,41,+41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,75,41,+41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,40,90,+32,75,41,41,41,32,75,41,41,32,75,41,41,32,40,90,32,75,41,41,+41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,40,90,+32,40,90,32,75,41,41,41,41,32,40,90,32,75,41,41,41,32,40,90,+32,75,41,41,41,32,75,41,41,32,75,41,41,32,40,90,32,75,41,41,+41,32,40,40,95,49,51,32,95,53,55,41,32,95,52,55,54,41,41,41,+41,41,41,41,32,40,40,66,32,40,40,67,39,32,66,41,32,40,40,66,+32,40,95,51,50,32,95,53,56,41,41,32,95,49,50,54,49,41,41,41,+32,40,40,66,32,40,66,32,85,41,41,32,40,40,40,67,39,32,66,41,+32,40,66,39,32,40,66,39,32,40,40,66,32,40,95,51,50,32,95,53,+56,41,41,32,95,49,50,54,53,41,41,41,41,32,40,40,40,67,39,32,+66,41,32,40,40,66,32,40,67,39,32,40,67,39,32,40,95,51,50,32,+95,53,56,41,41,41,41,32,40,40,67,39,32,40,67,39,32,40,95,52,+51,32,95,53,56,41,41,41,32,40,67,32,95,49,50,56,51,41,41,41,+41,32,40,40,66,32,40,66,32,40,95,51,52,32,95,53,56,41,41,41,+32,95,55,52,56,41,41,41,41,41,41,41,32,40,40,66,32,40,40,67,+39,32,66,41,32,40,40,66,32,95,50,54,49,41,32,95,49,50,57,52,+41,41,41,32,40,40,40,67,39,32,40,67,39,32,66,41,41,32,40,40,+66,32,40,66,32,40,95,51,50,32,95,53,56,41,41,41,32,95,49,50,+54,54,41,41,32,40,40,66,32,40,66,32,40,95,51,52,32,95,53,56,+41,41,41,32,95,55,52,57,41,41,41,41,41,32,40,40,66,32,40,66,+32,40,40,83,39,32,40,95,51,50,32,95,53,56,41,41,32,40,40,66,+32,40,40,95,50,55,50,32,95,53,54,41,32,95,52,49,52,41,41,32,+40,40,95,52,51,32,95,53,56,41,32,95,49,50,54,49,41,41,41,41,+41,32,40,40,66,32,40,66,32,40,66,32,85,41,41,41,32,40,40,40,+67,39,32,40,67,39,32,40,67,39,32,66,41,41,41,32,40,40,66,32,+40,66,32,40,66,32,40,67,39,32,40,95,51,51,32,95,53,56,41,41,+41,41,41,32,40,40,40,67,39,32,40,83,39,32,66,41,41,32,40,40,+66,32,66,39,41,32,40,67,32,95,49,49,57,53,41,41,41,32,40,40,+66,32,40,66,32,95,49,49,56,55,41,41,32,40,40,40,67,39,32,66,+41,32,95,56,48,49,41,32,95,52,49,49,41,41,41,41,41,32,40,40,+66,32,40,95,51,52,32,95,53,56,41,41,32,95,55,53,48,41,41,41,+41,41,41,32,40,40,40,83,39,32,40,83,39,32,67,41,41,32,40,40,+40,83,39,32,40,83,39,32,67,41,41,32,40,40,40,83,39,32,40,83,+39,32,67,41,41,32,40,40,40,83,39,32,40,83,39,32,67,41,41,32,+40,40,40,83,39,32,40,83,39,32,80,41,41,32,40,40,66,32,40,66,+32,40,66,32,40,40,95,51,50,32,95,53,56,41,32,95,49,50,48,52,+41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,66,41,41,32,40,+40,66,32,40,66,32,40,83,39,32,40,95,51,51,32,95,53,56,41,41,+41,41,32,40,40,40,67,39,32,40,83,39,32,66,41,41,32,40,67,32,+95,49,49,57,53,41,41,32,40,40,66,32,95,49,49,56,54,41,32,95,+49,51,48,48,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,+95,51,50,32,95,53,56,41,41,41,32,40,40,67,39,32,40,95,52,51,+32,95,53,56,41,41,32,95,49,50,54,50,41,41,32,40,40,66,32,40,+95,51,52,32,95,53,56,41,41,32,40,40,66,32,95,55,53,49,41,32,+95,55,54,54,41,41,41,41,41,41,32,40,40,66,32,40,40,83,39,32,+40,67,39,32,40,67,39,32,40,95,51,50,32,95,53,56,41,41,41,41,+32,40,40,40,67,39,32,40,67,39,32,89,41,41,32,40,40,66,32,40,+40,67,39,32,66,41,32,40,40,66,32,40,83,39,32,80,41,41,32,40,+40,40,67,39,32,66,41,32,40,40,66,32,40,95,51,50,32,95,53,56,+41,41,32,95,49,50,54,49,41,41,32,40,40,66,32,40,66,32,40,95,+51,52,32,95,53,56,41,41,41,32,40,40,66,32,80,41,32,95,52,50,+51,41,41,41,41,41,41,32,40,40,40,67,39,32,40,83,39,32,40,83,+39,32,40,67,39,32,83,41,41,41,41,32,40,40,40,67,39,32,40,83,+39,32,40,83,39,32,67,41,41,41,32,40,40,66,32,40,66,32,40,66,+32,40,67,32,83,39,41,41,41,41,32,40,40,66,32,40,66,32,40,66,+32,40,66,32,40,66,32,40,66,32,40,40,95,51,50,32,95,53,56,41,+32,95,49,50,48,52,41,41,41,41,41,41,41,32,40,40,40,67,39,32,+66,41,32,40,66,39,32,40,66,39,32,40,66,39,32,40,40,66,32,40,+67,39,32,40,83,39,32,40,95,51,50,32,95,53,56,41,41,41,41,32,+40,40,66,32,40,67,39,32,95,49,50,56,52,41,41,32,40,40,66,32,+95,49,49,56,54,41,32,95,49,51,48,48,41,41,41,41,41,41,41,32,+40,40,66,32,40,66,32,40,66,32,40,40,67,39,32,40,67,39,32,66,+41,41,32,40,40,66,32,40,66,32,95,50,54,49,41,41,32,40,67,32,+95,49,50,56,56,41,41,41,41,41,41,32,40,40,40,67,39,32,66,41,+32,40,40,66,32,67,39,41,32,67,39,41,41,32,40,40,67,39,32,40,+67,39,32,95,52,54,50,41,41,32,40,67,32,95,55,56,52,41,41,41,+41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,40,67,39,+32,40,95,51,50,32,95,53,56,41,41,32,40,40,40,83,39,32,95,49,+50,56,52,41,32,40,40,66,32,95,49,51,48,49,41,32,40,95,56,48,+53,32,95,56,48,56,41,41,41,32,73,41,41,41,41,41,32,40,40,40,+67,39,32,66,41,32,67,39,41,32,40,40,67,39,32,95,52,54,50,41,+32,95,55,56,53,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,+32,40,40,67,39,32,95,50,54,49,41,32,95,49,50,57,52,41,41,41,+41,32,40,40,40,67,39,32,66,41,32,67,39,41,32,40,40,67,39,32,+95,52,54,50,41,32,95,55,56,54,41,41,41,41,41,41,32,95,52,54,+49,41,41,41,32,40,40,66,32,40,66,32,85,41,41,32,40,40,66,32,+40,66,32,40,66,32,85,41,41,41,32,40,40,40,67,39,32,40,67,39,+32,66,41,41,32,40,40,66,32,66,39,41,32,40,40,66,32,40,66,32,+40,67,39,32,40,95,51,51,32,95,53,56,41,41,41,41,32,40,40,40,+67,39,32,40,83,39,32,66,41,41,32,40,67,32,95,49,49,57,53,41,+41,32,40,40,66,32,95,49,49,56,54,41,32,95,49,51,48,48,41,41,+41,41,41,32,40,40,66,32,40,66,32,40,95,51,52,32,95,53,56,41,+41,41,32,40,40,66,32,40,66,32,95,55,53,49,41,41,32,40,67,32,+95,55,54,55,41,41,41,41,41,41,41,41,41,32,40,40,40,67,39,32,+66,41,32,40,66,39,32,95,49,50,54,54,41,41,32,40,40,40,67,39,+32,66,41,32,40,40,67,32,95,49,50,54,56,41,32,34,70,114,111,109,+34,41,41,32,40,40,67,32,79,41,32,75,41,41,41,41,41,32,40,40,+40,67,39,32,66,41,32,40,66,39,32,40,66,39,32,95,49,50,54,54,+41,41,41,32,40,40,40,67,39,32,66,41,32,40,66,39,32,40,40,67,+32,95,49,50,54,56,41,32,34,70,114,111,109,84,111,34,41,41,41,32,+40,40,40,67,39,32,66,41,32,79,41,32,40,40,67,32,79,41,32,75,+41,41,41,41,41,41,32,40,40,40,67,39,32,66,41,32,40,66,39,32,+40,66,39,32,95,49,50,54,54,41,41,41,32,40,40,40,67,39,32,66,+41,32,40,66,39,32,40,40,67,32,95,49,50,54,56,41,32,34,70,114,+111,109,84,104,101,110,34,41,41,41,32,40,40,40,67,39,32,66,41,32,+79,41,32,40,40,67,32,79,41,32,75,41,41,41,41,41,41,32,40,40,+40,67,39,32,66,41,32,40,66,39,32,40,66,39,32,40,66,39,32,95,+49,50,54,54,41,41,41,41,32,40,40,40,67,39,32,66,41,32,40,66,+39,32,40,66,39,32,40,40,67,32,95,49,50,54,56,41,32,34,70,114,+111,109,84,104,101,110,84,111,34,41,41,41,41,32,40,40,40,67,39,32,+66,41,32,40,66,39,32,79,41,41,32,40,40,40,67,39,32,66,41,32,+79,41,32,40,40,67,32,79,41,32,75,41,41,41,41,41,41,41,41,32,+40,40,66,32,40,66,32,40,66,32,40,80,32,95,49,51,48,50,41,41,+41,41,32,40,40,40,83,39,32,40,83,39,32,66,41,41,32,40,40,66,+32,40,66,32,40,83,39,32,83,41,41,41,32,40,40,66,32,40,66,32,+40,66,32,85,41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,+32,67,41,32,40,40,40,67,39,32,40,67,39,32,83,41,41,32,40,40,+66,32,40,67,32,40,40,67,32,67,39,41,32,40,90,32,75,41,41,41,+41,32,95,49,50,54,54,41,41,32,75,41,41,41,32,40,40,40,67,39,+32,95,50,54,49,41,32,95,49,49,48,48,41,32,34,98,97,100,32,102,+105,110,97,108,32,100,111,32,115,116,97,116,101,109,101,110,116,34,41,41,+41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,90,41,41,+41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,90,41,41,41,+41,32,40,40,40,83,39,32,40,67,39,32,40,83,39,32,40,67,39,32,+83,41,41,41,41,32,40,40,40,83,39,32,40,83,39,32,40,83,39,32,+67,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,67,32,83,39,+41,41,41,41,32,40,40,40,67,39,32,66,41,32,40,66,39,32,40,66,+39,32,40,66,39,32,40,66,39,32,95,49,50,54,54,41,41,41,41,41,+32,40,40,40,83,39,32,40,83,39,32,66,41,41,32,40,40,66,32,66,+39,41,32,40,40,66,32,40,66,32,40,67,39,32,95,55,52,52,41,41,+41,32,40,40,66,32,40,66,32,95,55,52,52,41,41,32,40,40,66,32,+40,66,32,95,55,52,51,41,41,32,40,40,40,83,39,32,95,52,55,48,+41,32,40,40,67,32,95,56,57,56,41,32,34,62,62,61,34,41,41,32,+40,40,66,32,40,67,32,95,57,48,53,41,41,32,40,40,67,32,95,56,+57,56,41,32,34,62,62,61,34,41,41,41,41,41,41,41,41,32,40,40,+40,83,39,32,66,41,32,40,66,39,32,40,66,39,32,40,40,66,32,95,+55,54,49,41,32,40,40,40,67,39,32,79,41,32,40,40,67,32,95,49,+49,50,57,41,32,34,36,120,34,41,41,32,75,41,41,41,41,41,32,40,+40,40,67,39,32,66,41,32,40,66,39,32,40,66,39,32,40,40,66,32,+95,55,52,56,41,32,40,40,67,32,95,49,49,50,57,41,32,34,36,120,+34,41,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,+32,79,41,41,41,32,40,40,66,32,40,66,32,40,67,32,80,41,41,41,+32,40,40,40,67,39,32,40,67,39,32,95,55,57,49,41,41,32,40,40,+40,67,39,32,40,67,39,32,79,41,41,32,40,40,66,32,40,66,32,40,+80,32,95,52,54,49,41,41,41,32,95,55,53,50,41,41,32,75,41,41,+32,95,52,54,49,41,41,41,32,75,41,41,41,41,41,41,41,32,40,40,+40,67,39,32,66,41,32,40,66,39,32,40,66,39,32,40,66,39,32,95,+49,50,54,54,41,41,41,41,32,40,40,40,67,39,32,40,83,39,32,66,+41,41,32,40,40,66,32,40,66,32,40,67,39,32,95,55,52,52,41,41,+41,32,40,40,66,32,40,66,32,95,55,52,52,41,41,32,40,40,66,32,+40,66,32,95,55,52,51,41,41,32,40,40,40,83,39,32,95,52,55,48,+41,32,40,40,67,32,95,56,57,56,41,32,34,62,62,34,41,41,32,40,+40,66,32,40,67,32,95,57,48,53,41,41,32,40,40,67,32,95,56,57,+56,41,32,34,62,62,34,41,41,41,41,41,41,41,32,95,55,53,50,41,+41,41,41,32,40,40,40,67,39,32,66,41,32,40,66,39,32,40,66,39,+32,95,49,50,54,54,41,41,41,32,40,40,66,32,40,66,32,40,67,32,+95,55,52,57,41,41,41,32,95,55,53,50,41,41,41,41,41,41,41,41,+41,32,40,40,40,67,39,32,66,41,32,40,66,39,32,95,49,50,54,54,+41,41,32,40,40,67,39,32,95,55,52,52,41,32,95,55,52,51,41,41,+41,41,32,40,40,40,67,39,32,66,41,32,40,40,40,67,39,32,67,39,+41,32,40,40,66,32,67,39,41,32,40,66,39,32,95,49,50,54,54,41,+41,41,32,40,40,66,32,40,66,32,40,40,83,39,32,95,55,54,49,41,+32,40,40,67,32,79,41,32,75,41,41,41,41,32,40,40,66,32,40,67,+39,32,95,55,52,52,41,41,32,40,40,66,32,95,55,52,52,41,32,95,+55,52,51,41,41,41,41,41,32,40,40,67,32,95,49,49,50,57,41,32,+34,36,120,34,41,41,41,41,32,40,40,66,32,40,66,32,40,40,67,39,+32,66,41,32,40,66,39,32,40,40,66,32,40,95,51,50,32,95,53,56,+41,41,32,40,40,40,83,39,32,95,49,50,54,50,41,32,40,40,66,32,+95,49,51,48,49,41,32,40,95,56,48,53,32,95,56,48,56,41,41,41,+32,73,41,41,41,41,41,41,32,40,40,67,32,40,40,40,67,39,32,67,+39,41,32,40,40,66,32,83,39,41,32,40,40,66,32,83,39,41,32,83,+39,41,41,41,32,40,40,66,32,40,40,67,39,32,66,41,32,40,66,39,+32,40,66,39,32,40,40,66,32,40,95,51,50,32,95,53,56,41,41,32,+95,49,50,54,49,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,+32,40,66,32,85,41,41,41,41,32,40,40,66,32,40,40,67,39,32,66,+41,32,40,66,39,32,40,66,39,32,40,66,39,32,40,40,66,32,40,95,+51,50,32,95,53,56,41,41,32,95,49,50,54,49,41,41,41,41,41,41,+32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,85,41,41,+41,41,41,32,40,40,40,83,39,32,66,41,32,40,66,39,32,40,40,66,+32,40,67,39,32,40,83,39,32,66,41,41,41,32,40,40,66,32,40,66,+32,40,66,32,40,83,39,32,40,95,51,50,32,95,53,56,41,41,41,41,+41,32,95,49,50,56,55,41,41,41,41,32,40,40,40,83,39,32,66,41,+32,40,66,39,32,40,40,66,32,40,83,39,32,40,67,39,32,40,67,39,+32,66,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,+40,95,51,50,32,95,53,56,41,41,41,41,41,32,40,40,66,32,40,67,+39,32,67,41,41,32,95,49,50,56,55,41,41,41,41,41,32,40,40,40,+67,39,32,66,41,32,40,40,66,32,40,67,39,32,40,67,39,32,66,41,+41,41,32,40,40,66,32,40,66,32,66,39,41,41,32,40,40,66,32,40,+66,32,40,66,32,40,95,51,51,32,95,53,56,41,41,41,41,32,95,49,+50,54,52,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,95,+51,52,32,95,53,56,41,41,41,41,32,95,55,53,53,41,41,41,41,41,+41,41,41,41,41,32,40,40,40,67,39,32,66,41,32,40,66,39,32,40,+40,66,32,40,83,39,32,40,95,51,50,32,95,53,56,41,41,41,32,95,+49,51,49,51,41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,+32,40,67,39,32,66,41,41,32,40,40,66,32,40,66,32,40,95,51,50,+32,95,53,56,41,41,41,32,95,49,51,49,51,41,41,41,32,40,40,66,+32,40,66,32,40,66,32,40,95,51,52,32,95,53,56,41,41,41,41,32,+95,55,53,53,41,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,+66,32,40,40,67,39,32,40,95,51,50,32,95,53,56,41,41,32,40,95,+49,50,53,54,32,40,95,49,50,53,56,32,95,55,57,57,41,41,41,41,+41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,40,83,39,+32,40,95,51,50,32,95,53,56,41,41,41,41,41,32,40,40,67,39,32,+40,67,39,32,67,41,41,32,95,49,51,49,54,41,41,32,40,67,32,95,+49,51,49,51,41,41,41,41,41,32,40,90,32,75,41,41,41,32,75,41,+41,32,75,41,41,32,40,40,66,32,40,40,67,39,32,66,41,32,40,40,+66,32,95,50,54,49,41,32,40,40,67,32,95,49,50,51,48,41,32,95,+55,57,57,41,41,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,+40,40,67,39,32,40,67,39,32,40,83,39,32,40,95,51,50,32,95,53,+56,41,41,41,41,32,40,40,66,32,40,66,32,40,67,32,95,49,50,51,+56,41,41,41,32,95,49,50,54,54,41,41,32,40,40,66,32,40,66,32,+40,95,51,52,32,95,53,56,41,41,41,32,95,55,54,48,41,41,41,41,+41,41,32,40,40,66,32,40,95,50,54,49,32,95,50,52,41,41,32,40,+40,66,32,40,95,52,54,51,32,34,116,99,69,120,112,114,58,32,34,41,+41,32,40,40,40,83,39,32,95,52,54,51,41,32,40,40,66,32,40,95,+49,53,57,48,32,95,56,57,48,41,41,32,40,95,56,48,53,32,95,56,+48,56,41,41,41,32,40,40,66,32,40,95,52,54,51,32,40,40,79,32,+35,51,50,41,32,75,41,41,41,32,40,95,49,53,57,48,32,95,56,51,+55,41,41,41,41,41,41,41,32,40,95,56,48,53,32,95,56,48,56,41,+41,41,32,40,40,65,32,58,49,50,54,56,32,40,40,66,32,40,66,32,+40,95,51,57,57,32,95,55,52,52,41,41,41,32,40,40,66,32,40,66,+32,95,55,52,51,41,41,32,40,40,40,67,39,32,66,41,32,95,56,57,+56,41,32,40,95,52,54,51,32,34,101,110,117,109,34,41,41,41,41,41,+32,40,40,65,32,58,49,50,54,57,32,40,40,40,83,39,32,40,83,39,+32,83,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,83,+41,41,41,32,40,40,66,32,40,66,32,40,40,83,39,32,67,41,32,40,+40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,+67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,67,32,40,+40,67,32,83,39,41,32,75,41,41,32,75,41,41,32,75,41,41,32,75,+41,41,32,75,41,41,32,75,41,41,41,41,32,40,40,66,32,40,66,32,+90,41,41,32,40,40,66,32,40,66,32,40,66,32,40,40,95,51,50,32,+95,53,56,41,32,95,49,50,48,52,41,41,41,41,32,95,49,50,55,48,+41,41,41,41,32,75,41,41,32,40,40,40,67,39,32,40,83,39,32,83,+41,41,32,95,49,50,55,48,41,32,40,40,40,67,39,32,67,41,32,40,+40,40,67,39,32,67,41,32,40,40,40,83,39,32,67,41,32,40,40,40,+83,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,83,39,+32,67,41,32,40,40,40,83,39,32,80,41,32,40,90,32,40,40,67,32,+95,49,50,57,56,41,32,95,49,49,48,55,41,41,41,32,40,90,32,40,+40,67,32,95,49,50,57,56,41,32,95,49,49,49,49,41,41,41,41,32,+40,90,32,40,40,67,32,95,49,50,57,56,41,32,95,49,49,48,57,41,+41,41,41,32,40,75,32,95,49,51,48,50,41,41,41,32,40,90,32,40,+40,67,32,95,49,50,57,56,41,32,95,49,49,49,48,41,41,41,41,32,+40,90,32,40,40,40,83,39,32,95,49,49,56,54,41,32,95,49,51,48,+48,41,32,40,40,67,32,95,49,50,57,56,41,32,95,49,49,49,48,41,+41,41,41,41,32,40,75,32,95,49,51,48,50,41,41,41,32,40,75,32,+95,49,51,48,50,41,41,41,41,41,32,40,40,65,32,58,49,50,55,48,+32,40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,40,83,39,32,+66,41,32,95,49,51,49,54,41,32,95,55,52,55,41,41,41,32,40,40,+65,32,58,49,50,55,49,32,40,40,66,32,40,66,32,40,40,95,51,50,+32,95,53,56,41,32,40,95,54,52,32,95,49,49,52,52,41,41,41,41,+32,40,40,66,32,40,40,67,39,32,40,67,39,32,40,95,51,50,32,95,+53,56,41,41,41,32,40,40,67,39,32,40,95,52,51,32,95,53,56,41,+41,32,40,40,66,32,85,41,32,40,40,66,32,40,40,83,39,32,66,41,+32,40,40,66,32,40,95,51,50,32,95,53,56,41,41,32,95,49,50,48,+56,41,41,41,32,40,40,66,32,40,66,32,40,66,32,85,41,41,41,32,+40,40,66,32,40,66,32,40,66,32,90,41,41,41,32,40,40,66,32,40,+66,32,40,66,32,40,66,32,40,95,51,52,32,95,53,56,41,41,41,41,+41,32,40,40,66,32,40,66,32,40,67,39,32,80,41,41,41,32,40,40,+66,32,40,40,67,39,32,66,41,32,40,40,66,32,80,41,32,95,55,52,+51,41,41,41,32,40,40,40,67,39,32,66,41,32,95,49,50,55,51,41,+32,95,49,49,51,54,41,41,41,41,41,41,41,41,41,41,41,32,40,40,+66,32,40,66,32,40,95,50,54,49,32,40,95,51,52,32,95,53,56,41,+41,41,41,32,40,40,40,67,39,32,40,40,89,32,40,40,40,83,39,32,+40,67,32,40,40,40,83,39,32,40,67,39,32,80,41,41,32,40,40,66,+32,40,66,32,40,83,32,40,40,40,67,39,32,83,39,41,32,40,40,66,+32,83,39,41,32,83,41,41,32,40,40,40,67,39,32,40,67,39,32,40,+83,39,32,40,67,39,32,80,41,41,41,41,32,40,40,67,32,40,40,40,+67,39,32,67,39,41,32,40,40,66,32,83,39,41,32,67,39,41,41,32,+40,40,40,67,39,32,66,41,32,67,41,32,40,90,32,75,41,41,41,41,+32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,41,41,41,32,+40,40,40,83,39,32,66,41,32,40,40,66,32,40,83,39,32,83,41,41,+32,40,40,66,32,40,66,32,40,67,32,83,39,41,41,41,32,40,40,66,+32,40,66,32,40,80,32,95,49,51,48,50,41,41,41,32,40,40,66,32,+40,66,32,40,67,32,66,41,41,41,32,40,40,66,32,40,66,32,40,67,+39,32,67,41,41,41,32,40,40,40,67,39,32,40,67,39,32,66,41,41,+32,40,40,40,67,39,32,66,41,32,67,39,41,32,40,67,32,95,52,54,+50,41,41,41,32,40,40,67,32,79,41,32,75,41,41,41,41,41,41,41,+41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,67,+32,66,41,41,41,41,41,41,32,40,40,66,32,40,40,83,39,32,40,83,+39,32,66,41,41,32,40,40,66,32,40,66,32,40,83,39,32,40,83,39,+32,40,83,39,32,66,41,41,41,41,41,32,40,40,66,32,40,66,32,40,+40,67,39,32,66,41,32,66,41,41,41,32,40,40,40,67,39,32,40,67,+39,32,40,67,39,32,67,41,41,41,32,40,66,32,67,41,41,32,95,52,+54,49,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,+32,40,66,32,40,66,32,40,66,32,90,41,41,41,41,41,41,41,32,40,+40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,+32,90,41,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,+40,66,32,40,66,32,40,66,32,40,66,32,85,41,41,41,41,41,41,41,+32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,40,83,39,32,66,+41,32,40,66,39,32,40,66,39,32,40,66,39,32,40,85,32,95,49,51,+48,50,41,41,41,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,+66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,+40,67,32,66,41,41,41,41,41,41,41,41,41,41,32,40,40,66,32,40,+66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,+40,66,32,40,66,32,40,83,32,66,41,41,41,41,41,41,41,41,41,41,+41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,+32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,+66,32,85,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,40,+67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,+67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,+67,39,32,40,67,39,32,66,41,41,41,41,41,41,41,41,41,41,41,41,+32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,+40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,67,+39,32,67,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,66,+32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,+40,67,39,32,40,83,39,32,66,41,41,32,40,40,66,32,66,39,41,32,+40,40,66,32,66,39,41,32,40,40,66,32,40,66,32,40,83,39,32,83,+41,41,41,32,40,40,66,32,40,40,67,39,32,66,41,32,40,40,66,32,+40,67,39,32,95,49,50,49,41,41,32,40,67,32,40,95,50,48,50,32,+95,50,56,49,41,41,41,41,41,32,40,40,40,67,39,32,40,83,39,32,+95,49,50,48,41,41,32,40,67,32,40,95,50,48,51,32,95,56,50,49,+41,41,41,32,40,40,67,32,40,95,50,48,50,32,95,56,50,49,41,41,+32,95,56,50,48,41,41,41,41,41,41,41,41,41,41,41,41,41,41,32,+40,40,40,67,39,32,66,41,32,40,40,66,32,40,83,39,32,40,67,39,+32,66,41,41,41,32,40,40,66,32,40,66,32,66,39,41,41,32,40,40,+66,32,40,66,32,66,39,41,41,32,40,40,66,32,40,66,32,40,66,32,+40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,+67,41,41,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,+40,40,67,39,32,66,41,32,40,66,39,32,40,66,39,32,40,40,66,32,+40,67,39,32,67,41,41,32,40,40,40,83,39,32,66,41,32,40,40,66,+32,40,83,39,32,95,49,50,48,41,41,32,40,67,32,40,95,52,57,55,+32,95,50,56,50,41,41,41,41,32,40,40,66,32,40,40,67,39,32,66,+41,32,40,40,66,32,95,49,50,49,41,32,40,40,67,32,40,95,50,48,+50,32,95,56,50,49,41,41,32,95,56,49,56,41,41,41,41,32,40,67,+32,40,95,50,48,50,32,95,50,56,49,41,41,41,41,41,41,41,41,41,+41,41,32,40,40,66,32,40,66,32,40,66,32,40,67,39,32,67,41,41,+41,41,32,40,40,40,67,39,32,40,67,39,32,66,41,41,32,40,40,66,+32,66,39,41,32,40,40,40,67,39,32,66,41,32,67,39,41,32,40,67,+32,95,52,54,50,41,41,41,41,32,40,67,32,95,52,54,50,41,41,41,+41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,67,39,32,67,41,+41,41,32,40,66,32,67,41,41,41,41,41,41,32,40,40,40,67,39,32,+95,56,51,54,41,32,40,95,56,48,53,32,95,56,48,56,41,41,32,34,+97,109,98,105,103,117,111,117,115,32,111,112,101,114,97,116,111,114,32,101,+120,112,114,101,115,115,105,111,110,34,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,32,40,40,66,32,40,40,67,39,32,66,41,32,40,66,39,+32,40,66,39,32,40,85,32,95,49,51,48,50,41,41,41,41,41,32,40,+40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,80,32,95,49,+51,48,50,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,+40,67,39,32,40,67,39,32,67,41,41,41,41,41,32,40,40,40,67,39,+32,66,41,32,40,40,66,32,67,39,41,32,40,40,66,32,67,39,41,32,+67,39,41,41,41,32,40,40,66,32,40,66,32,40,66,32,95,52,54,50,+41,41,41,32,40,40,66,32,40,67,39,32,95,55,52,52,41,41,32,95,+55,52,52,41,41,41,41,41,41,41,41,41,32,40,85,32,65,41,41,32,+40,85,32,75,41,41,41,32,75,41,41,32,40,40,67,32,79,41,32,75,+41,41,32,95,52,54,49,41,41,41,41,41,32,40,40,65,32,58,49,50,+55,50,32,40,40,40,67,39,32,67,41,32,40,40,66,32,40,83,32,95,+49,49,57,49,41,41,32,40,40,66,32,40,66,32,40,40,95,51,50,32,+95,53,56,41,32,95,49,50,48,52,41,41,41,32,40,40,66,32,40,66,+32,40,66,32,40,40,95,51,50,32,95,53,56,41,32,95,49,50,48,52,+41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,83,39,32,40,+83,39,32,40,95,51,51,32,95,53,56,41,41,41,41,41,32,40,40,40,+67,39,32,40,67,39,32,66,41,41,32,40,40,66,32,66,39,41,32,95,+49,49,57,57,41,41,32,95,49,49,56,56,41,41,32,40,40,66,32,40,+66,32,40,95,51,52,32,95,53,56,41,41,41,32,80,41,41,41,41,41,+41,32,40,95,51,52,32,95,53,56,41,41,41,32,40,40,65,32,58,49,+50,55,51,32,40,40,66,32,40,66,32,40,95,50,54,49,32,40,95,52,+55,49,32,40,40,80,32,95,56,49,56,41,32,40,40,95,52,56,53,32,+95,50,55,55,41,32,40,95,51,53,57,32,35,57,41,41,41,41,41,41,+41,32,40,67,32,95,57,50,56,41,41,41,32,40,40,65,32,58,49,50,+55,52,32,40,40,67,32,95,49,50,48,54,41,32,34,97,100,105,99,116,+34,41,41,32,40,40,65,32,58,49,50,55,53,32,40,40,40,67,39,32,+66,41,32,40,40,66,32,40,95,51,50,32,95,53,56,41,41,32,95,49,+50,54,53,41,41,32,40,40,66,32,40,66,32,40,40,95,50,55,54,32,+95,53,54,41,32,95,55,52,54,41,41,41,32,40,67,32,40,95,49,50,+55,54,32,95,49,50,52,41,41,41,41,41,32,40,40,65,32,58,49,50,+55,54,32,40,40,66,32,89,41,32,40,40,66,32,40,40,83,39,32,83,+41,32,40,40,66,32,40,40,67,39,32,83,39,41,32,40,40,66,32,67,+41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,+40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,+40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,+39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,+83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,+32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,+40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,67,+32,40,40,67,32,83,39,41,32,75,41,41,32,40,90,32,75,41,41,41,+32,40,90,32,75,41,41,41,32,75,41,41,32,40,90,32,75,41,41,41,+32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,75,41,41,+32,75,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,+32,40,90,32,75,41,41,41,32,40,90,32,40,90,32,75,41,41,41,41,+32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,75,41,41,+32,75,41,41,41,41,32,40,40,66,32,40,66,32,40,40,67,39,32,66,+41,32,40,40,66,32,95,50,54,49,41,32,95,49,50,50,51,41,41,41,+41,32,67,41,41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,+32,67,41,32,40,40,66,32,40,40,83,39,32,83,39,41,32,95,49,49,+57,50,41,41,32,40,40,66,32,40,66,32,40,40,83,39,32,40,95,51,+50,32,95,53,56,41,41,32,40,40,40,67,39,32,95,49,50,48,54,41,+32,40,95,56,48,53,32,40,95,56,48,57,32,95,56,49,53,41,41,41,+32,34,102,99,110,83,34,41,41,41,41,32,40,40,40,67,39,32,40,67,+39,32,40,67,39,32,66,41,41,41,32,40,40,66,32,40,66,32,40,66,+32,40,95,51,50,32,95,53,56,41,41,41,41,32,40,40,40,67,39,32,+66,41,32,40,66,39,32,40,40,66,32,95,50,54,49,41,32,95,49,51,+50,48,41,41,41,32,40,40,66,32,40,95,52,51,32,95,53,56,41,41,+32,95,49,50,55,55,41,41,41,41,32,40,40,66,32,85,41,32,40,40,+66,32,40,40,83,39,32,83,41,32,40,40,66,32,85,41,32,40,95,51,+52,32,95,53,56,41,41,41,41,32,40,40,66,32,40,66,32,90,41,41,+32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,40,+66,32,40,95,51,52,32,95,53,56,41,41,41,41,32,40,40,40,67,39,+32,40,67,39,32,40,67,39,32,79,41,41,41,32,40,40,66,32,40,66,+32,40,66,32,40,95,50,54,49,32,40,95,55,57,48,32,95,52,54,49,+41,41,41,41,41,32,40,40,40,83,39,32,66,41,32,40,66,39,32,40,+40,66,32,95,55,57,49,41,32,40,40,40,67,39,32,79,41,32,40,40,+66,32,40,80,32,95,52,54,49,41,41,32,95,55,52,51,41,41,32,75,+41,41,41,41,32,40,40,66,32,40,66,32,40,40,67,39,32,95,52,54,+51,41,32,95,49,50,56,53,41,41,41,32,40,40,40,67,39,32,40,67,+39,32,79,41,41,32,95,55,56,55,41,32,75,41,41,41,41,41,32,75,+41,41,41,41,41,41,41,41,41,41,41,32,40,40,66,32,40,66,32,85,+41,41,32,40,40,40,67,39,32,40,83,39,32,40,67,39,32,40,67,39,+32,40,40,83,39,32,40,95,51,50,32,95,53,56,41,41,32,95,49,50,+55,52,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,+32,40,40,67,39,32,66,41,32,40,40,66,32,40,95,51,50,32,95,53,+56,41,41,32,40,40,67,32,95,49,50,48,54,41,32,34,102,99,110,68,+34,41,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,40,67,39,+32,66,41,32,40,40,66,32,40,83,39,32,66,41,41,32,40,40,66,32,+40,66,32,95,50,54,49,41,41,32,40,67,32,95,49,49,55,48,41,41,+41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,66,+41,41,41,32,40,40,66,32,40,66,32,66,39,41,41,32,40,40,66,32,+40,66,32,40,66,32,40,95,51,50,32,95,53,56,41,41,41,41,32,67,+41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,95,51,52,32,95,+53,56,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,+32,79,41,41,41,32,40,40,40,83,39,32,66,41,32,40,40,66,32,83,+41,32,40,40,66,32,40,67,32,83,41,41,32,40,40,66,32,40,66,32,+40,67,32,66,41,41,41,32,40,40,40,67,39,32,40,83,39,32,40,67,+39,32,67,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,67,32,+67,39,41,41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,+67,41,32,40,40,66,32,40,67,32,67,39,41,41,32,40,40,66,32,95,+55,57,48,41,32,40,40,40,67,39,32,79,41,32,95,55,52,51,41,32,+75,41,41,41,41,41,32,40,90,32,75,41,41,41,41,32,40,90,32,75,+41,41,41,41,41,41,32,40,40,40,67,39,32,66,41,32,40,66,39,32,+40,40,66,32,95,50,54,49,41,32,40,40,66,32,95,55,57,48,41,32,+40,40,40,67,39,32,79,41,32,95,55,52,51,41,32,75,41,41,41,41,+41,32,40,40,40,83,39,32,66,41,32,40,40,66,32,95,55,57,49,41,+32,40,40,40,67,39,32,79,41,32,40,40,66,32,40,80,32,95,52,54,+49,41,41,32,95,55,52,51,41,41,32,75,41,41,41,32,40,40,40,67,+39,32,40,67,39,32,79,41,41,32,95,55,56,55,41,32,75,41,41,41,+41,41,32,75,41,41,41,41,41,41,32,40,95,56,48,53,32,40,95,56,+48,57,32,95,56,49,53,41,41,41,41,41,41,41,41,32,40,40,65,32,+58,49,50,55,55,32,40,40,66,32,85,41,32,40,40,40,67,39,32,40,+67,39,32,66,41,41,32,40,40,66,32,40,66,32,95,50,54,49,41,41,+32,95,49,50,55,56,41,41,32,40,40,40,67,39,32,40,67,39,32,66,+41,41,32,40,40,66,32,40,66,32,40,95,51,50,32,95,53,56,41,41,+41,32,40,67,32,95,49,50,55,57,41,41,41,32,40,40,66,32,40,66,+32,40,95,51,52,32,95,53,56,41,41,41,32,95,55,57,48,41,41,41,+41,41,32,40,40,65,32,58,49,50,55,56,32,40,40,40,83,39,32,67,+41,32,40,40,66,32,40,67,32,83,39,41,41,32,40,40,67,32,80,41,+32,95,52,54,49,41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,+66,32,40,83,39,32,66,41,41,32,40,40,66,32,40,66,32,40,95,51,+50,32,95,53,56,41,41,41,32,40,40,67,39,32,95,49,50,55,50,41,+32,40,95,56,48,53,32,95,56,48,56,41,41,41,41,41,32,40,40,66,+32,40,66,32,40,66,32,85,41,41,41,32,40,40,66,32,40,40,67,39,+32,66,41,32,40,40,66,32,40,67,39,32,66,41,41,32,40,40,66,32,+40,66,32,95,50,54,49,41,41,32,40,67,32,95,49,50,56,56,41,41,+41,41,41,32,40,40,66,32,40,40,67,39,32,40,67,39,32,66,41,41,+32,40,40,66,32,40,66,32,95,50,54,49,41,41,32,40,67,32,95,49,+50,55,56,41,41,41,41,32,40,40,40,67,39,32,66,41,32,40,67,39,+32,66,41,41,32,95,52,54,50,41,41,41,41,41,41,41,32,40,40,65,+32,58,49,50,55,57,32,40,40,66,32,85,41,32,40,40,66,32,40,66,+32,40,40,67,39,32,95,50,54,49,41,32,95,49,50,57,52,41,41,41,+32,40,40,40,67,39,32,40,67,39,32,66,41,41,32,40,40,66,32,40,+66,32,40,95,51,50,32,95,53,56,41,41,41,32,40,40,66,32,40,95,+52,51,32,95,53,56,41,41,32,95,49,50,56,48,41,41,41,32,40,40,+66,32,40,66,32,40,95,51,52,32,95,53,56,41,41,41,32,40,67,32,+95,55,57,49,41,41,41,41,41,41,32,40,40,65,32,58,49,50,56,48,+32,40,40,66,32,85,41,32,40,40,66,32,40,40,67,39,32,66,41,32,+40,40,66,32,95,50,54,49,41,32,95,49,50,56,49,41,41,41,32,40,+40,40,67,39,32,40,67,39,32,66,41,41,32,40,40,66,32,40,66,32,+40,95,51,50,32,95,53,56,41,41,41,32,95,49,50,56,52,41,41,32,+40,40,66,32,40,66,32,40,95,51,52,32,95,53,56,41,41,41,32,80,+41,41,41,41,41,32,40,40,65,32,58,49,50,56,49,32,40,40,67,32,+40,40,67,32,83,39,41,32,40,85,32,95,52,54,49,41,41,41,32,40,+40,66,32,40,40,67,39,32,66,41,32,40,40,66,32,95,50,54,49,41,+32,95,49,50,56,50,41,41,41,32,40,40,66,32,40,40,67,39,32,66,+41,32,40,40,66,32,95,50,54,49,41,32,95,49,50,56,49,41,41,41,+32,40,40,40,67,39,32,66,41,32,66,41,32,95,52,54,50,41,41,41,+41,41,32,40,40,65,32,58,49,50,56,50,32,40,40,40,67,39,32,83,+41,32,40,40,67,32,40,40,67,32,83,39,41,32,40,40,66,32,40,66,+32,40,40,67,39,32,40,95,51,50,32,95,53,56,41,41,32,95,49,50,+54,49,41,41,41,32,40,40,66,32,40,66,32,85,41,41,32,40,40,66,+32,40,40,67,39,32,66,41,32,40,40,66,32,40,67,39,32,95,50,54,+49,41,41,32,40,67,32,95,49,50,56,56,41,41,41,41,32,40,40,40,+67,39,32,66,41,32,66,41,32,40,67,32,95,55,56,52,41,41,41,41,+41,41,41,32,40,40,66,32,40,40,67,39,32,40,95,51,50,32,95,53,+56,41,41,32,40,40,40,83,39,32,95,49,50,56,52,41,32,40,40,66,+32,95,49,51,48,49,41,32,40,95,56,48,53,32,95,56,48,56,41,41,+41,32,73,41,41,41,32,40,40,67,32,66,41,32,95,55,56,53,41,41,+41,41,32,40,40,66,32,40,40,67,39,32,95,50,54,49,41,32,95,49,+50,57,52,41,41,32,40,40,67,32,66,41,32,95,55,56,54,41,41,41,+41,32,40,40,65,32,58,49,50,56,51,32,40,40,66,32,40,66,32,85,+41,41,32,40,40,66,32,40,40,67,39,32,40,67,39,32,66,41,41,32,+40,40,66,32,40,66,32,95,50,54,49,41,41,32,95,49,50,56,56,41,+41,41,32,40,40,40,67,39,32,40,67,39,32,66,41,41,32,40,40,66,+32,40,66,32,40,95,51,50,32,95,53,56,41,41,41,32,95,49,50,55,+57,41,41,32,40,40,66,32,40,66,32,40,95,51,52,32,95,53,56,41,+41,41,32,80,41,41,41,41,41,32,40,40,65,32,58,49,50,56,52,32,+40,40,40,67,39,32,40,67,39,32,40,95,51,50,32,95,53,56,41,41,+41,32,40,40,66,32,40,66,32,40,95,50,54,49,32,95,49,51,49,57,+41,41,41,32,95,49,50,54,50,41,41,32,40,85,32,40,40,40,83,39,+32,67,41,32,40,40,66,32,40,83,32,95,51,57,50,41,41,32,40,40,+66,32,40,66,32,40,95,50,54,49,32,40,95,51,52,32,95,53,56,41,+41,41,41,32,40,40,67,39,32,95,55,52,57,41,32,95,49,50,56,53,+41,41,41,41,32,40,95,51,52,32,95,53,56,41,41,41,41,41,32,40,+40,65,32,58,49,50,56,53,32,40,95,51,57,52,32,40,85,32,40,40,+40,67,39,32,40,67,39,32,79,41,41,32,40,40,40,67,39,32,66,41,+32,95,55,56,55,41,32,40,40,40,67,39,32,79,41,32,40,40,66,32,+40,95,55,57,48,32,95,52,54,49,41,41,32,40,40,40,67,39,32,95,+55,57,49,41,32,40,40,40,67,39,32,79,41,32,40,80,32,95,52,54,+49,41,41,32,75,41,41,32,95,52,54,49,41,41,41,32,75,41,41,41,+32,75,41,41,41,41,32,40,40,65,32,58,49,50,56,54,32,40,40,40,+83,39,32,40,83,39,32,80,41,41,32,40,40,66,32,67,41,32,95,49,+50,54,52,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,+40,95,51,50,32,95,53,56,41,41,41,41,32,40,40,66,32,67,41,32,+40,40,67,32,95,49,50,56,55,41,32,95,50,53,41,41,41,32,40,75,+32,40,40,95,51,52,32,95,53,56,41,32,95,49,51,52,49,41,41,41,+41,41,32,40,40,65,32,58,49,50,56,55,32,40,40,66,32,40,66,32,+40,66,32,40,40,83,39,32,40,95,51,50,32,95,53,56,41,41,32,95,+49,51,48,57,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,+66,32,85,41,41,41,41,32,40,40,40,83,39,32,40,67,39,32,40,83,+39,32,66,41,41,41,32,40,40,66,32,40,66,32,66,39,41,41,32,40,+40,66,32,40,66,32,40,66,32,40,67,39,32,40,95,51,50,32,95,53,+56,41,41,41,41,41,32,95,49,51,49,52,41,41,41,32,40,40,66,32,+40,40,67,39,32,40,67,39,32,66,41,41,32,40,40,66,32,66,39,41,+32,40,40,66,32,40,66,32,40,95,51,50,32,95,53,56,41,41,41,32,+40,40,66,32,40,66,32,95,49,51,48,53,41,41,32,40,40,40,67,39,+32,66,41,32,79,41,32,40,40,67,32,79,41,32,75,41,41,41,41,41,+41,41,32,40,40,40,67,39,32,40,67,39,32,66,41,41,32,40,40,66,+32,40,66,32,40,67,39,32,40,95,51,51,32,95,53,56,41,41,41,41,+32,40,40,66,32,40,40,67,39,32,40,67,39,32,95,50,54,49,41,41,+32,40,40,66,32,40,66,32,40,95,52,53,32,95,53,56,41,41,41,32,+40,40,66,32,40,66,32,95,49,50,50,41,41,32,40,40,66,32,40,66,+32,95,51,57,50,41,41,32,40,40,67,39,32,95,51,57,54,41,32,40,+67,32,40,95,52,51,50,32,95,56,57,50,41,41,41,41,41,41,41,41,+32,40,40,67,32,95,49,49,57,56,41,32,34,83,117,98,115,117,109,112,+116,105,111,110,32,99,104,101,99,107,32,102,97,105,108,101,100,34,41,41,+41,41,32,40,95,51,52,32,95,53,56,41,41,41,41,41,41,41,32,40,+40,65,32,58,49,50,56,56,32,40,40,40,83,39,32,40,83,39,32,83,+41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,+41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,+32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,32,+40,40,40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,32,40,+40,40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,32,40,40,+40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,32,40,40,40,+67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,32,40,40,40,67,+39,32,40,67,39,32,40,67,39,32,83,41,41,41,32,40,40,40,67,39,+32,40,67,39,32,40,67,39,32,83,41,41,41,32,40,40,40,67,39,32,+40,67,39,32,40,67,39,32,83,41,41,41,32,40,40,40,67,39,32,40,+67,39,32,40,67,39,32,83,41,41,41,32,40,40,40,67,39,32,40,67,+39,32,40,67,39,32,83,41,41,41,32,40,40,40,67,39,32,40,67,39,+32,40,67,39,32,83,41,41,41,32,40,40,40,67,39,32,40,67,39,32,+40,67,39,32,83,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,+67,39,32,83,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,+39,32,83,41,41,41,32,40,40,40,67,39,32,67,41,32,40,40,66,32,+40,40,83,39,32,67,39,41,32,83,39,41,41,32,40,40,66,32,40,66,+32,40,66,32,40,40,67,39,32,83,41,32,40,40,67,39,32,95,49,50,+50,41,32,95,57,49,48,41,41,41,41,41,32,40,40,40,67,39,32,66,+41,32,40,66,39,32,40,40,66,32,40,67,39,32,95,50,54,49,41,41,+32,40,40,66,32,40,66,32,95,49,50,50,50,41,41,32,40,40,40,67,+39,32,40,67,39,32,79,41,41,32,40,67,32,80,41,41,32,75,41,41,+41,41,41,32,85,41,41,41,41,32,40,90,32,75,41,41,41,32,40,90,+32,75,41,41,41,32,75,41,41,32,40,90,32,75,41,41,41,32,40,90,+32,75,41,41,41,32,40,90,32,75,41,41,41,32,75,41,41,32,75,41,+41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,40,90,+32,75,41,41,41,32,40,90,32,40,90,32,75,41,41,41,41,32,40,90,+32,75,41,41,41,32,40,90,32,75,41,41,41,32,75,41,41,32,75,41,+41,32,40,90,32,75,41,41,41,32,40,40,40,67,39,32,40,83,39,32,+40,67,39,32,40,40,83,39,32,40,95,51,51,32,95,53,56,41,41,32,+95,49,50,57,50,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,+40,40,67,39,32,40,95,51,50,32,95,53,56,41,41,32,40,40,95,52,+51,32,95,53,56,41,32,40,40,40,67,39,32,40,95,50,55,54,32,95,+53,54,41,41,32,80,41,32,95,49,50,48,52,41,41,41,41,41,41,32,+40,40,66,32,40,66,32,40,66,32,40,40,67,39,32,95,50,54,49,41,+32,95,49,50,50,50,41,41,41,41,32,40,40,40,67,39,32,40,67,39,+32,66,41,41,32,40,40,66,32,40,66,32,40,95,51,50,32,95,53,56,+41,41,41,32,95,49,50,56,57,41,41,32,40,40,66,32,85,41,32,40,+90,32,40,40,66,32,40,66,32,40,40,83,39,32,40,95,51,50,32,95,+53,56,41,41,32,40,95,49,50,57,51,32,35,48,41,41,41,41,32,40,+40,66,32,40,66,32,40,66,32,85,41,41,41,32,40,40,67,39,32,66,+41,32,40,40,66,32,95,50,54,49,41,32,95,49,49,54,57,41,41,41,+41,41,41,41,41,41,41,32,95,55,57,52,41,41,41,32,40,40,65,32,+58,49,50,56,57,32,40,95,49,50,54,48,32,95,49,50,57,49,41,41,+32,40,40,65,32,58,49,50,57,48,32,40,95,49,50,53,57,32,95,49,+50,57,49,41,41,32,40,40,65,32,58,49,50,57,49,32,40,40,66,32,+89,41,32,40,40,40,67,39,32,40,67,39,32,83,41,41,32,40,40,40,+67,39,32,40,67,39,32,40,83,39,32,67,41,41,41,32,40,40,40,67,+39,32,40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,41,32,+40,40,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,83,41,+41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,40,67,+39,32,83,41,41,41,41,32,40,40,40,83,39,32,40,83,39,32,40,67,+39,32,40,83,39,32,67,41,41,41,41,32,40,40,40,83,39,32,40,67,+39,32,40,67,39,32,40,83,39,32,67,41,41,41,41,32,40,40,40,67,+39,32,40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,41,32,+40,40,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,83,41,+41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,40,67,+39,32,83,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,+39,32,40,67,39,32,83,41,41,41,41,32,40,40,40,83,39,32,40,67,+39,32,40,67,39,32,40,83,39,32,83,41,41,41,41,32,40,40,40,83,+39,32,40,67,39,32,40,67,39,32,40,83,39,32,67,41,41,41,41,32,+40,40,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,83,41,+41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,40,67,+39,32,83,41,41,41,41,32,40,40,40,83,39,32,40,67,39,32,40,67,+39,32,67,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,+32,40,67,39,32,67,39,41,41,41,41,32,40,40,40,67,39,32,66,41,+32,40,40,66,32,40,67,39,32,67,41,41,32,40,40,40,83,39,32,67,+41,32,40,40,66,32,40,83,32,83,39,41,41,32,40,40,40,83,39,32,+66,41,32,40,40,66,32,40,67,39,32,67,41,41,32,40,40,66,32,40,+66,32,40,83,32,95,57,49,53,41,41,41,32,40,40,40,83,39,32,40,+83,39,32,83,41,41,32,40,40,66,32,40,66,32,40,83,32,95,57,49,+48,41,41,41,32,40,40,40,67,39,32,66,41,32,40,66,39,32,40,40,+66,32,40,95,51,50,32,95,53,56,41,41,32,95,49,50,54,53,41,41,+41,32,40,40,66,32,40,40,67,39,32,66,41,32,40,40,66,32,40,95,+51,50,32,95,53,56,41,41,32,95,49,50,48,56,41,41,41,32,40,40,+66,32,40,66,32,85,41,41,32,40,40,40,67,39,32,40,67,39,32,66,+41,41,32,40,40,66,32,40,66,32,40,67,39,32,40,95,51,51,32,95,+53,56,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,+32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,66,32,40,+66,32,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,+32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,+32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,80,+32,40,75,32,95,49,51,48,50,41,41,32,40,75,32,40,75,32,95,49,+51,48,50,41,41,41,41,32,40,75,32,40,75,32,95,49,51,48,50,41,+41,41,41,32,40,75,32,95,49,51,48,50,41,41,41,32,40,75,32,40,+75,32,95,49,51,48,50,41,41,41,41,32,40,75,32,40,75,32,95,49,+51,48,50,41,41,41,41,32,40,75,32,40,75,32,95,49,51,48,50,41,+41,41,41,32,40,75,32,95,49,51,48,50,41,41,41,32,40,75,32,95,+49,51,48,50,41,41,41,32,40,75,32,40,75,32,95,49,51,48,50,41,+41,41,41,32,40,75,32,40,75,32,95,49,51,48,50,41,41,41,41,32,+40,75,32,40,75,32,95,49,51,48,50,41,41,41,41,32,40,75,32,40,+75,32,40,75,32,95,49,51,48,50,41,41,41,41,41,32,40,75,32,40,+75,32,95,49,51,48,50,41,41,41,41,32,40,75,32,40,75,32,95,49,+51,48,50,41,41,41,41,41,41,32,40,40,66,32,67,41,32,95,49,50,+54,52,41,41,41,32,40,75,32,95,49,51,48,50,41,41,41,32,40,75,+32,40,75,32,95,49,51,48,50,41,41,41,41,41,32,40,40,66,32,40,+95,51,52,32,95,53,56,41,41,32,40,67,32,40,40,80,32,95,52,54,+49,41,32,95,52,54,49,41,41,41,41,41,41,41,41,41,32,40,40,66,+32,40,66,32,40,40,67,39,32,40,95,51,50,32,95,53,56,41,41,32,+95,49,50,48,56,41,41,41,32,40,40,66,32,40,66,32,40,40,83,39,+32,40,95,51,51,32,95,53,56,41,41,32,40,85,32,40,75,32,40,40,+67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,+67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,+67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,+67,32,40,40,80,32,40,75,32,95,50,53,41,41,32,40,75,32,40,75,+32,95,50,53,41,41,41,41,32,40,75,32,40,75,32,95,50,53,41,41,+41,41,32,40,75,32,95,50,53,41,41,41,32,40,75,32,40,75,32,95,+50,53,41,41,41,41,32,40,75,32,40,75,32,95,50,53,41,41,41,41,+32,40,75,32,40,75,32,95,50,53,41,41,41,41,32,40,75,32,95,50,+53,41,41,41,32,40,75,32,95,50,53,41,41,41,32,40,75,32,40,75,+32,95,50,53,41,41,41,41,32,40,75,32,40,75,32,95,50,53,41,41,+41,41,32,40,75,32,40,75,32,95,50,53,41,41,41,41,32,40,75,32,+40,75,32,40,75,32,95,50,53,41,41,41,41,41,32,40,75,32,40,75,+32,95,50,53,41,41,41,41,32,40,75,32,40,75,32,95,50,53,41,41,+41,41,32,40,75,32,95,50,53,41,41,41,32,40,75,32,95,50,53,41,+41,41,32,40,75,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,+67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,+67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,+67,32,40,40,67,32,40,40,67,32,40,40,80,32,40,75,32,95,50,53,+41,41,32,40,75,32,40,75,32,95,50,53,41,41,41,41,32,40,75,32,+40,75,32,95,50,53,41,41,41,41,32,40,75,32,95,50,53,41,41,41,+32,40,75,32,40,75,32,95,50,53,41,41,41,41,32,40,75,32,40,75,+32,95,50,53,41,41,41,41,32,40,75,32,40,75,32,95,50,53,41,41,+41,41,32,40,75,32,95,50,53,41,41,41,32,40,75,32,95,50,53,41,+41,41,32,40,75,32,40,75,32,95,50,53,41,41,41,41,32,40,75,32,+40,75,32,95,50,53,41,41,41,41,32,40,75,32,40,75,32,95,50,53,+41,41,41,41,32,40,75,32,40,75,32,40,75,32,95,50,53,41,41,41,+41,41,32,40,75,32,40,75,32,95,50,53,41,41,41,41,32,40,75,32,+40,75,32,95,50,53,41,41,41,41,32,40,75,32,95,50,53,41,41,41,+32,40,75,32,95,50,53,41,41,41,32,40,75,32,40,75,32,40,40,95,+51,52,32,95,53,56,41,32,95,49,51,52,49,41,41,41,41,41,41,41,+41,41,41,41,32,40,40,66,32,40,66,32,40,40,67,39,32,40,95,51,+50,32,95,53,56,41,41,32,95,49,50,49,49,41,41,41,32,40,40,40,+67,39,32,40,67,39,32,67,41,41,32,40,40,66,32,40,66,32,40,67,+32,66,41,41,41,32,40,40,66,32,40,66,32,40,40,67,39,32,66,41,+32,40,40,66,32,67,41,32,40,40,40,83,39,32,67,41,32,40,40,40,+83,39,32,67,41,32,40,40,40,83,39,32,67,41,32,40,40,40,83,39,+32,67,41,32,40,40,40,83,39,32,67,41,32,40,40,40,83,39,32,67,+41,32,40,40,40,83,39,32,67,41,32,40,40,40,83,39,32,67,41,32,+40,40,40,83,39,32,67,41,32,40,40,40,83,39,32,67,41,32,40,40,+40,83,39,32,67,41,32,40,40,40,83,39,32,67,41,32,40,40,40,83,+39,32,67,41,32,40,40,40,83,39,32,67,41,32,40,40,40,83,39,32,+67,41,32,40,40,40,83,39,32,80,41,32,75,41,32,40,90,32,75,41,+41,41,32,40,90,32,75,41,41,41,32,75,41,41,32,40,90,32,75,41,+41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,75,+41,41,32,75,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,+41,41,32,40,90,32,75,41,41,41,32,40,90,32,40,90,32,75,41,41,+41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,75,+41,41,32,75,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,+40,40,67,39,32,40,83,39,32,40,95,51,50,32,95,53,56,41,41,41,+32,95,49,51,48,56,41,41,41,41,32,40,40,66,32,40,66,32,40,66,+32,40,66,32,85,41,41,41,41,32,40,40,66,32,40,40,83,39,32,40,+67,39,32,40,67,39,32,66,41,41,41,32,40,40,66,32,40,66,32,40,+66,32,40,67,39,32,40,95,51,50,32,95,53,56,41,41,41,41,41,32,+40,40,66,32,40,40,83,39,32,40,67,39,32,67,41,41,32,40,40,66,+32,40,66,32,40,67,32,95,49,49,57,50,41,41,41,32,40,40,66,32,+40,66,32,40,95,51,52,32,95,53,56,41,41,41,32,40,40,66,32,67,+41,32,40,80,32,95,52,54,49,41,41,41,41,41,41,32,40,40,66,32,+40,66,32,85,41,41,32,40,40,40,67,39,32,66,41,32,40,66,39,32,+40,66,39,32,40,40,66,32,40,95,51,50,32,95,53,56,41,41,32,95,+49,50,55,52,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,+66,32,40,95,51,52,32,95,53,56,41,41,41,41,41,32,40,40,66,32,+40,66,32,40,67,39,32,67,41,41,41,32,40,40,66,32,40,40,67,39,+32,40,83,39,32,80,41,41,32,40,40,40,67,39,32,40,67,39,32,79,+41,41,32,40,67,32,80,41,41,32,75,41,41,41,32,40,40,40,67,39,+32,66,41,32,95,55,52,52,41,32,95,55,52,51,41,41,41,41,41,41,+41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,85,41,41,41,32,+40,40,40,67,39,32,40,67,39,32,66,41,41,32,40,40,66,32,66,39,+41,32,40,40,66,32,40,66,32,40,67,39,32,40,67,39,32,40,95,51,+50,32,95,53,56,41,41,41,41,41,32,40,40,67,32,40,40,40,67,39,+32,83,39,41,32,40,40,66,32,83,39,41,32,83,39,41,41,32,40,40,+40,67,39,32,66,41,32,40,40,66,32,40,67,39,32,40,67,39,32,40,+95,51,51,32,95,53,56,41,41,41,41,32,40,40,66,32,67,41,32,95,+49,50,54,52,41,41,41,32,40,95,51,52,32,95,53,56,41,41,41,41,+32,40,40,66,32,40,66,32,67,41,41,32,95,49,50,56,55,41,41,41,+41,41,32,40,40,66,32,40,66,32,40,66,32,40,95,51,52,32,95,53,+56,41,41,41,41,32,40,40,66,32,40,66,32,67,41,41,32,80,41,41,+41,41,41,41,41,41,41,41,32,40,40,40,110,111,77,97,116,99,104,32,+34,115,114,99,47,77,105,99,114,111,72,115,47,84,121,112,101,67,104,101,+99,107,46,104,115,34,41,32,35,49,56,49,52,41,32,35,49,55,41,41,+41,41,41,41,41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,+32,40,95,51,50,32,95,53,56,41,41,32,95,49,50,54,53,41,41,32,+40,90,32,40,40,66,32,40,95,51,52,32,95,53,56,41,41,32,40,67,+32,40,40,80,32,95,52,54,49,41,32,95,52,54,49,41,41,41,41,41,+41,41,41,32,40,40,66,32,40,66,32,40,40,67,39,32,66,41,32,40,+40,66,32,40,95,51,50,32,95,53,56,41,41,32,95,49,50,57,48,41,+41,41,41,32,40,40,66,32,40,66,32,40,66,32,85,41,41,41,32,40,+40,66,32,40,66,32,40,66,32,40,67,32,66,41,41,41,41,32,40,40,+66,32,40,40,83,39,32,66,41,32,40,40,66,32,40,67,39,32,66,41,+41,32,40,40,66,32,66,39,41,32,40,40,66,32,66,39,41,32,40,40,+66,32,40,66,32,40,95,51,50,32,95,53,56,41,41,41,32,95,49,50,+55,50,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,+66,32,40,66,32,40,66,32,85,41,41,41,41,41,41,32,40,40,66,32,+40,66,32,40,40,67,39,32,66,41,32,40,66,39,32,40,66,39,32,40,+40,66,32,40,67,39,32,66,41,41,32,40,40,66,32,40,66,32,40,95,+51,50,32,95,53,56,41,41,41,32,40,67,32,95,49,50,56,57,41,41,+41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,+40,66,32,40,66,32,85,41,41,41,41,41,41,32,40,40,40,67,39,32,+40,67,39,32,66,41,41,32,40,40,66,32,66,39,41,32,40,40,66,32,+66,39,41,32,40,40,66,32,40,66,32,40,67,39,32,66,41,41,41,32,+40,40,66,32,40,66,32,66,39,41,41,32,40,40,66,32,40,66,32,66,+39,41,41,32,40,40,66,32,40,66,32,40,66,32,40,95,51,51,32,95,+53,56,41,41,41,41,32,40,40,67,39,32,67,41,32,95,49,50,56,54,+41,41,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,+66,32,40,66,32,40,66,32,40,95,51,52,32,95,53,56,41,41,41,41,+41,41,41,32,40,40,40,67,39,32,40,67,39,32,66,41,41,32,40,40,+66,32,40,66,32,40,67,39,32,40,67,39,32,66,41,41,41,41,32,40,+40,66,32,40,66,32,40,66,32,40,66,32,67,41,41,41,41,32,40,40,+40,67,39,32,66,41,32,40,40,66,32,40,67,39,32,66,41,41,32,40,+40,66,32,40,66,32,80,41,41,32,95,52,54,51,41,41,41,32,95,52,+54,51,41,41,41,41,32,95,55,52,52,41,41,41,41,41,41,41,41,41,+41,41,41,41,32,40,40,67,39,32,40,67,39,32,40,95,51,50,32,95,+53,56,41,41,41,32,95,49,50,55,49,41,41,41,32,75,41,41,32,40,+40,40,67,39,32,40,67,39,32,40,67,39,32,40,95,51,50,32,95,53,+56,41,41,41,41,32,40,40,40,83,39,32,40,83,39,32,83,41,41,32,+40,40,40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,32,40,+40,40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,32,40,40,+40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,32,40,40,40,+67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,32,40,40,40,67,+39,32,40,67,39,32,40,67,39,32,83,41,41,41,32,40,40,40,67,39,+32,40,67,39,32,40,67,39,32,83,41,41,41,32,40,40,66,32,40,66,+32,40,67,32,40,40,67,32,67,39,41,32,75,41,41,41,41,32,40,40,+40,67,39,32,40,67,39,32,66,41,41,32,95,49,50,54,57,41,32,40,+40,66,32,95,55,55,53,41,32,95,51,54,48,41,41,41,41,32,75,41,+41,32,75,41,41,32,75,41,41,32,75,41,41,32,75,41,41,32,75,41,+41,32,95,49,50,54,57,41,41,32,40,40,66,32,40,95,51,52,32,95,+53,56,41,41,32,40,67,32,40,40,80,32,95,52,54,49,41,32,95,52,+54,49,41,41,41,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,+75,41,41,41,32,40,40,66,32,40,66,32,40,40,83,39,32,40,95,51,+50,32,95,53,56,41,41,32,40,40,66,32,40,40,95,50,55,50,32,95,+53,54,41,32,95,52,49,52,41,41,32,40,40,95,52,51,32,95,53,56,+41,32,95,49,50,57,48,41,41,41,41,41,32,40,40,66,32,40,66,32,+40,66,32,85,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,+39,32,66,41,41,41,32,40,40,66,32,40,66,32,40,66,32,67,41,41,+41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,+66,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,+95,51,51,32,95,53,56,41,41,41,41,41,32,40,40,40,67,39,32,40,+83,39,32,66,41,41,32,40,40,66,32,66,39,41,32,40,67,32,95,49,+49,57,53,41,41,41,32,40,40,66,32,40,66,32,95,49,49,56,55,41,+41,32,40,40,40,67,39,32,66,41,32,95,56,48,49,41,32,95,52,49,+49,41,41,41,41,41,32,40,40,66,32,40,95,51,52,32,95,53,56,41,+41,32,40,40,40,83,39,32,67,41,32,40,40,40,83,39,32,80,41,32,+40,40,66,32,95,51,57,51,41,32,40,85,32,40,90,32,75,41,41,41,+41,32,40,40,66,32,95,51,57,51,41,32,40,85,32,40,75,32,75,41,+41,41,41,41,32,40,40,66,32,95,55,53,48,41,32,40,85,32,40,75,+32,65,41,41,41,41,41,41,41,41,32,95,52,49,53,41,41,41,41,41,+32,40,40,40,67,39,32,40,67,39,32,40,83,39,32,67,41,41,41,32,+40,40,40,67,39,32,40,67,39,32,40,83,39,32,67,41,41,41,32,40,+40,40,67,39,32,40,67,39,32,40,83,39,32,67,41,41,41,32,40,40,+40,67,39,32,40,67,39,32,40,83,39,32,67,41,41,41,32,40,40,40,+67,39,32,40,67,39,32,66,41,41,32,40,40,66,32,40,66,32,80,41,+41,32,40,40,66,32,40,66,32,40,66,32,40,40,95,51,50,32,95,53,+56,41,32,95,49,50,48,52,41,41,41,41,32,40,40,40,67,39,32,40,+67,39,32,66,41,41,32,40,40,66,32,40,66,32,40,83,39,32,40,95,+51,51,32,95,53,56,41,41,41,41,32,40,40,40,67,39,32,40,83,39,+32,66,41,41,32,40,67,32,95,49,49,57,53,41,41,32,40,40,66,32,+95,49,49,56,54,41,32,95,49,51,48,48,41,41,41,41,32,40,40,40,+67,39,32,40,67,39,32,40,95,51,50,32,95,53,56,41,41,41,32,40,+40,67,39,32,40,95,52,51,32,95,53,56,41,41,32,95,49,50,56,57,+41,41,32,40,40,66,32,40,40,66,32,40,95,51,52,32,95,53,56,41,+41,32,40,40,40,83,39,32,67,41,32,40,40,40,83,39,32,80,41,32,+40,40,66,32,95,51,57,51,41,32,40,85,32,40,90,32,75,41,41,41,+41,32,40,40,66,32,95,51,57,51,41,32,40,85,32,40,75,32,75,41,+41,41,41,41,32,40,40,66,32,95,55,53,49,41,32,40,40,66,32,95,+55,54,54,41,32,40,85,32,40,75,32,65,41,41,41,41,41,41,41,32,+95,52,49,53,41,41,41,41,41,41,32,40,90,32,75,41,41,41,32,75,+41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,40,+90,32,40,90,32,75,41,41,41,41,41,32,40,90,32,75,41,41,41,32,+40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,40,+90,32,75,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,40,+67,39,32,40,95,51,50,32,95,53,56,41,41,32,40,95,49,50,53,54,+32,40,95,49,50,53,56,32,95,55,57,57,41,41,41,41,41,41,32,40,+40,40,67,39,32,40,67,39,32,66,41,41,32,40,40,66,32,40,66,32,+40,83,39,32,40,95,51,51,32,95,53,56,41,41,41,41,32,40,40,67,+39,32,67,41,32,95,49,50,56,54,41,41,41,32,40,67,32,95,49,50,+56,57,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,40,+83,39,32,66,41,32,40,40,66,32,40,95,51,50,32,95,53,56,41,41,+32,95,49,50,48,56,41,41,41,41,41,32,40,40,66,32,40,66,32,40,+66,32,40,66,32,40,66,32,85,41,41,41,41,41,32,40,40,66,32,40,+66,32,40,66,32,40,66,32,90,41,41,41,41,32,40,40,66,32,40,40,+67,39,32,66,41,32,40,66,39,32,40,40,66,32,40,67,39,32,66,41,+41,32,40,66,32,40,95,51,50,32,95,53,56,41,41,41,41,41,41,32,+40,40,66,32,40,66,32,40,66,32,40,66,32,85,41,41,41,41,32,40,+40,40,67,39,32,66,41,32,40,66,39,32,40,66,39,32,40,66,39,32,+40,66,39,32,40,66,39,32,40,40,66,32,40,95,51,50,32,95,53,56,+41,41,32,95,49,50,54,53,41,41,41,41,41,41,41,32,40,40,40,67,+39,32,66,41,32,40,40,66,32,40,67,39,32,66,41,41,32,40,40,66,+32,66,39,41,32,40,40,66,32,66,39,41,32,40,40,66,32,40,66,32,+40,67,39,32,40,95,51,51,32,95,53,56,41,41,41,41,32,40,40,40,+67,39,32,40,67,39,32,67,41,41,32,40,40,40,67,39,32,67,41,32,+40,40,66,32,40,40,67,39,32,67,39,41,32,40,40,67,32,40,40,67,+32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,+32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,+32,40,40,67,32,40,40,80,32,40,75,32,95,49,51,48,50,41,41,32,+40,75,32,40,75,32,95,49,51,48,50,41,41,41,41,32,40,75,32,40,+75,32,95,49,51,48,50,41,41,41,41,32,40,75,32,95,49,51,48,50,+41,41,41,32,40,75,32,40,75,32,95,49,51,48,50,41,41,41,41,32,+40,75,32,40,75,32,95,49,51,48,50,41,41,41,41,32,40,75,32,40,+75,32,95,49,51,48,50,41,41,41,41,32,40,75,32,95,49,51,48,50,+41,41,41,32,40,75,32,95,49,51,48,50,41,41,41,32,40,75,32,40,+75,32,95,49,51,48,50,41,41,41,41,32,40,75,32,40,75,32,95,49,+51,48,50,41,41,41,41,32,40,75,32,40,75,32,95,49,51,48,50,41,+41,41,41,32,40,75,32,40,75,32,40,75,32,95,49,51,48,50,41,41,+41,41,41,32,40,75,32,40,75,32,95,49,51,48,50,41,41,41,41,32,+40,75,32,40,75,32,95,49,51,48,50,41,41,41,41,41,32,40,40,66,+32,67,41,32,95,49,50,54,52,41,41,41,32,40,75,32,95,49,51,48,+50,41,41,41,32,40,75,32,40,75,32,95,49,51,48,50,41,41,41,41,+41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,95,+51,52,32,95,53,56,41,41,41,41,41,32,40,40,66,32,40,40,67,39,+32,40,67,39,32,66,41,41,32,40,40,66,32,40,66,32,67,41,41,32,+80,41,41,41,32,95,55,53,55,41,41,41,41,41,41,41,41,41,41,41,+32,75,41,41,32,75,41,41,32,40,90,32,75,41,41,41,32,40,40,66,+32,40,95,50,54,49,32,95,50,52,41,41,32,40,40,66,32,40,95,52,+54,51,32,34,116,99,80,97,116,58,32,34,41,41,32,40,40,40,83,39,+32,95,52,54,51,41,32,40,40,66,32,40,95,49,53,57,48,32,95,56,+57,48,41,41,32,40,95,56,48,53,32,95,56,48,56,41,41,41,32,40,+40,66,32,40,95,52,54,51,32,40,40,79,32,35,51,50,41,32,75,41,+41,41,32,40,95,49,53,57,48,32,95,56,51,55,41,41,41,41,41,41,+41,32,40,95,56,48,53,32,95,56,48,56,41,41,41,41,32,40,40,65,+32,58,49,50,57,50,32,40,40,40,83,39,32,95,50,54,49,41,32,40,+40,66,32,40,95,52,53,32,95,53,56,41,41,32,40,95,52,53,55,32,+95,56,57,50,41,41,41,32,40,40,66,32,40,40,40,83,39,32,95,50,+54,49,41,32,40,40,66,32,95,49,49,48,48,41,32,40,95,56,48,53,+32,95,56,48,55,41,41,41,32,40,40,66,32,40,95,52,54,51,32,34,+77,117,108,116,105,112,108,121,32,100,101,102,105,110,101,100,58,32,34,41,+41,32,95,57,48,50,41,41,41,32,95,52,50,56,41,41,41,32,40,40,+65,32,58,49,50,57,51,32,40,40,66,32,89,41,32,40,40,40,83,39,+32,40,67,39,32,83,41,41,32,40,40,40,67,39,32,40,67,39,32,40,+67,39,32,83,41,41,41,32,40,40,40,83,39,32,40,67,39,32,40,67,+39,32,67,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,+32,83,41,41,41,32,40,40,40,67,39,32,40,83,39,32,40,67,39,32,+67,41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,40,67,+39,32,67,41,41,32,40,40,40,67,39,32,40,67,39,32,83,41,41,32,+40,40,40,67,39,32,40,67,39,32,83,41,41,32,40,40,40,67,39,32,+40,67,39,32,83,41,41,32,40,40,40,67,39,32,40,67,39,32,83,41,+41,32,40,40,40,67,39,32,40,67,39,32,83,41,41,32,40,40,40,67,+39,32,40,67,39,32,83,41,41,32,40,40,40,67,39,32,40,67,39,32,+83,41,41,32,40,40,40,67,39,32,40,67,39,32,83,41,41,32,40,40,+40,67,39,32,40,67,39,32,83,41,41,32,40,40,40,67,39,32,40,67,+39,32,83,41,41,32,40,40,40,67,39,32,40,67,39,32,83,41,41,32,+40,40,66,32,40,67,32,40,40,67,32,67,39,41,32,75,41,41,41,32,+40,40,40,67,39,32,40,67,39,32,66,41,41,32,40,40,66,32,40,66,+32,40,95,51,51,32,95,53,56,41,41,41,32,40,40,66,32,95,49,50,+57,51,41,32,40,40,67,32,40,95,52,55,57,32,95,50,55,55,41,41,+32,35,49,41,41,41,41,32,40,95,49,50,57,51,32,35,48,41,41,41,+41,32,40,90,32,75,41,41,41,32,75,41,41,32,40,90,32,75,41,41,+41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,75,41,+41,32,75,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,+41,32,40,90,32,75,41,41,41,32,40,90,32,40,90,32,75,41,41,41,+41,41,32,90,41,41,32,75,41,41,32,75,41,41,32,40,40,40,67,39,+32,83,41,32,40,40,40,67,39,32,40,83,39,32,67,41,41,32,40,40,+40,83,39,32,66,41,32,40,40,66,32,83,41,32,40,95,52,57,55,32,+95,50,56,50,41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,+32,67,41,32,40,40,40,67,39,32,67,41,32,40,95,52,57,57,32,95,+50,56,50,41,41,32,40,40,95,51,52,32,95,53,56,41,32,95,49,51,+52,49,41,41,41,41,32,40,40,40,67,39,32,95,49,49,48,48,41,32,+40,95,56,48,53,32,95,56,49,49,41,41,32,34,116,111,111,32,109,97,+110,121,32,97,114,103,117,109,101,110,116,115,34,41,41,41,41,32,40,40,+40,67,39,32,95,49,49,48,48,41,32,40,95,56,48,53,32,95,56,49,+49,41,41,32,34,116,111,111,32,102,101,119,32,97,114,103,117,109,101,110,+116,115,34,41,41,41,32,95,55,55,51,41,41,41,32,40,90,32,75,41,+41,41,32,40,40,66,32,40,83,32,40,40,40,67,39,32,67,41,32,40,+40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,+67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,+32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,+41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,83,41,32,+40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,67,41,32,40,40,+40,67,39,32,67,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,+39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,67,32,40,40,+67,32,67,39,41,32,75,41,41,32,40,75,32,40,75,32,95,49,51,48,+50,41,41,41,41,32,40,75,32,40,75,32,95,49,51,48,50,41,41,41,+41,32,40,75,32,95,49,51,48,50,41,41,41,32,40,90,32,75,41,41,+41,32,40,75,32,40,75,32,95,49,51,48,50,41,41,41,41,32,40,75,+32,40,75,32,95,49,51,48,50,41,41,41,41,32,75,41,41,32,40,40,+40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,+39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,+80,41,32,75,41,32,40,75,32,40,75,32,95,49,51,48,50,41,41,41,+41,32,40,75,32,95,49,51,48,50,41,41,41,32,40,75,32,40,75,32,+95,49,51,48,50,41,41,41,41,32,40,75,32,40,75,32,95,49,51,48,+50,41,41,41,41,32,40,75,32,40,75,32,40,75,32,95,49,51,48,50,+41,41,41,41,41,41,32,40,75,32,40,75,32,95,49,51,48,50,41,41,+41,41,32,40,75,32,40,75,32,95,49,51,48,50,41,41,41,41,32,40,+75,32,40,75,32,95,49,51,48,50,41,41,41,41,32,40,75,32,40,75,+32,40,75,32,95,49,51,48,50,41,41,41,41,41,32,40,75,32,40,75,+32,95,49,51,48,50,41,41,41,41,32,40,75,32,40,75,32,95,49,51,+48,50,41,41,41,41,32,40,75,32,95,49,51,48,50,41,41,41,32,40,+75,32,95,49,51,48,50,41,41,41,32,40,75,32,40,75,32,95,49,51,+48,50,41,41,41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,67,+32,40,40,67,32,40,95,50,48,51,32,95,50,56,49,41,41,32,35,48,+41,41,32,40,40,95,51,52,32,95,53,56,41,32,95,49,51,52,49,41,+41,41,32,40,40,40,67,39,32,95,49,49,48,48,41,32,40,95,56,48,+53,32,95,56,48,56,41,41,32,34,66,97,100,32,112,97,116,116,101,114,+110,34,41,41,41,41,41,41,32,40,40,65,32,58,49,50,57,52,32,40,+40,40,83,39,32,40,67,39,32,40,40,83,39,32,40,95,51,51,32,95,+53,56,41,41,32,95,49,50,57,50,41,41,41,32,40,40,40,83,39,32,+66,41,32,40,40,66,32,40,67,39,32,40,95,51,50,32,95,53,56,41,+41,41,32,40,40,66,32,40,95,52,51,32,95,53,56,41,41,32,40,40,+66,32,95,49,50,57,53,41,32,40,40,66,32,95,57,50,52,41,32,40,+95,51,57,52,32,40,40,67,32,40,40,80,32,40,75,32,40,75,32,75,+41,41,41,32,40,75,32,40,75,32,75,41,41,41,41,32,40,40,40,67,+39,32,40,67,39,32,79,41,41,32,80,41,32,75,41,41,41,41,41,41,+41,41,32,40,40,66,32,40,66,32,40,40,67,39,32,95,50,54,49,41,+32,95,49,50,50,50,41,41,41,32,40,40,66,32,40,95,51,50,32,95,+53,56,41,41,32,40,40,95,52,51,32,95,53,56,41,32,95,49,50,57,+54,41,41,41,41,41,32,95,56,55,49,41,41,32,40,40,65,32,58,49,+50,57,53,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,+41,32,40,67,32,95,57,50,56,41,41,32,40,40,66,32,40,40,95,51,+50,32,95,53,56,41,32,95,49,50,48,52,41,41,32,40,40,66,32,40,+66,32,40,95,51,52,32,95,53,56,41,41,41,32,80,41,41,41,41,32,+40,40,66,32,40,40,67,39,32,40,95,51,50,32,95,53,56,41,41,32,+40,40,66,32,40,95,50,54,49,32,95,49,49,54,52,41,41,32,40,95,+49,50,53,53,32,40,95,49,50,53,56,32,95,55,57,57,41,41,41,41,+41,32,40,40,66,32,40,66,32,40,95,51,52,32,95,53,56,41,41,41,+32,80,41,41,41,41,32,40,40,65,32,58,49,50,57,54,32,40,40,83,+32,40,40,80,32,40,40,40,83,39,32,66,41,32,40,40,66,32,40,95,+51,50,32,95,53,56,41,41,32,95,49,50,48,56,41,41,32,40,40,66,+32,40,66,32,85,41,41,32,40,40,66,32,90,41,32,40,40,66,32,40,+40,67,39,32,40,67,39,32,40,95,51,50,32,95,53,56,41,41,41,32,+40,67,32,40,95,49,50,55,54,32,95,49,50,52,41,41,41,41,32,40,+40,66,32,40,66,32,40,95,50,54,49,32,40,95,51,52,32,95,53,56,+41,41,41,41,32,95,55,56,55,41,41,41,41,41,41,32,40,40,40,83,+39,32,66,41,32,40,40,66,32,40,95,51,50,32,95,53,56,41,41,32,+95,49,50,57,48,41,41,32,40,40,66,32,40,66,32,85,41,41,32,40,+40,66,32,40,66,32,40,67,32,66,41,41,41,32,40,40,40,67,39,32,+66,41,32,40,66,39,32,40,40,66,32,40,67,39,32,40,67,39,32,66,+41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,95,51,51,32,95,+53,56,41,41,41,41,32,40,40,66,32,40,40,67,39,32,40,67,39,32,+95,50,54,49,41,41,32,40,40,66,32,40,66,32,40,95,52,53,32,95,+53,56,41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,95,+49,50,48,41,32,40,40,66,32,95,49,50,50,41,32,95,51,57,50,41,+41,41,32,40,40,66,32,95,49,50,50,41,32,95,51,57,50,41,41,41,+41,41,32,40,40,40,67,39,32,95,49,49,48,48,41,32,40,95,56,48,+53,32,95,56,48,56,41,41,32,34,101,120,105,115,116,101,110,116,105,97,+108,115,32,110,111,116,32,97,108,108,111,119,101,100,32,105,110,32,112,97,+116,116,101,114,110,32,98,105,110,100,105,110,103,34,41,41,41,41,41,41,+32,40,40,40,67,39,32,40,67,39,32,66,41,41,32,40,40,66,32,40,+66,32,40,95,51,50,32,95,53,56,41,41,41,32,40,67,32,95,49,50,+56,52,41,41,41,32,40,40,66,32,40,66,32,40,95,50,54,49,32,40,+95,51,52,32,95,53,56,41,41,41,41,32,95,55,56,56,41,41,41,41,+41,41,41,41,32,40,90,32,40,90,32,40,95,51,52,32,95,53,56,41,+41,41,41,41,32,40,40,65,32,58,49,50,57,55,32,40,40,67,32,40,+40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,+40,67,32,40,40,67,32,40,40,67,32,40,40,83,32,40,40,83,32,40,+40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,+40,67,32,40,40,83,32,73,41,32,75,41,41,32,40,40,40,67,39,32,+66,41,32,40,40,66,32,95,55,52,52,41,32,95,49,50,57,55,41,41,+32,95,49,50,57,55,41,41,41,32,40,40,40,67,39,32,66,41,32,40,+40,66,32,95,55,52,53,41,32,95,49,50,57,55,41,41,32,40,95,51,+57,52,32,40,85,32,40,40,40,67,39,32,40,67,39,32,79,41,41,32,+40,40,40,67,39,32,66,41,32,80,41,32,95,49,50,57,55,41,41,32,+75,41,41,41,41,41,41,32,40,75,32,95,49,51,48,50,41,41,41,32,+40,75,32,40,75,32,95,49,51,48,50,41,41,41,41,32,40,75,32,40,+75,32,95,49,51,48,50,41,41,41,41,32,40,75,32,40,75,32,95,49,+51,48,50,41,41,41,41,32,40,40,40,67,39,32,40,83,39,32,95,49,+49,56,55,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,95,+56,48,49,41,32,40,95,56,48,53,32,95,56,48,56,41,41,41,32,95,+52,49,49,41,41,32,40,95,51,57,53,32,95,49,50,57,55,41,41,41,+41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,+40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,+40,67,39,32,80,41,32,40,40,66,32,40,80,32,95,49,51,48,50,41,+41,32,40,40,40,67,39,32,40,67,39,32,80,41,41,32,40,40,40,67,+39,32,66,41,32,40,40,66,32,95,49,49,56,54,41,32,40,40,66,32,+95,49,51,48,48,41,32,40,95,56,48,53,32,95,56,48,56,41,41,41,+41,32,95,49,50,57,55,41,41,32,40,75,32,40,75,32,95,49,51,48,+50,41,41,41,41,41,32,40,75,32,40,75,32,95,49,51,48,50,41,41,+41,41,32,40,75,32,95,49,51,48,50,41,41,41,32,40,75,32,40,75,+32,95,49,51,48,50,41,41,41,41,32,40,75,32,40,75,32,95,49,51,+48,50,41,41,41,41,32,40,75,32,40,75,32,40,75,32,95,49,51,48,+50,41,41,41,41,41,41,32,40,75,32,40,75,32,95,49,51,48,50,41,+41,41,41,32,40,75,32,40,75,32,95,49,51,48,50,41,41,41,41,32,+40,75,32,40,75,32,95,49,51,48,50,41,41,41,41,32,40,75,32,40,+75,32,40,75,32,95,49,51,48,50,41,41,41,41,41,32,40,40,66,32,+95,55,53,54,41,32,95,49,50,57,55,41,41,41,32,40,75,32,40,75,+32,95,49,51,48,50,41,41,41,41,32,40,75,32,95,49,51,48,50,41,+41,41,32,40,75,32,95,49,51,48,50,41,41,41,32,40,40,40,67,39,+32,66,41,32,95,55,54,48,41,32,95,49,50,57,55,41,41,41,32,40,+40,65,32,58,49,50,57,56,32,40,40,66,32,40,95,50,54,51,32,95,+49,49,56,52,41,41,32,95,56,57,56,41,41,32,40,40,65,32,58,49,+50,57,57,32,40,40,40,67,39,32,95,50,54,49,41,32,95,56,57,56,+41,32,40,40,95,52,54,51,32,95,49,49,48,54,41,32,34,91,93,34,+41,41,41,32,40,40,65,32,58,49,51,48,48,32,40,40,95,50,54,51,+32,95,49,49,56,52,41,32,95,49,50,57,57,41,41,32,40,40,65,32,+58,49,51,48,49,32,40,40,40,67,39,32,95,50,54,49,41,32,95,49,+50,57,56,41,32,40,40,95,52,54,51,32,95,49,49,48,53,41,32,34,+66,111,111,108,34,41,41,41,32,40,40,65,32,58,49,51,48,50,32,40,+95,50,52,32,34,105,109,112,111,115,115,105,98,108,101,34,41,41,32,40,+40,65,32,58,49,51,48,51,32,40,40,66,32,40,66,32,40,95,50,54,+49,32,95,50,52,41,41,41,32,40,40,66,32,40,66,32,40,95,52,54,+51,32,34,105,109,112,111,115,115,105,98,108,101,58,32,34,41,41,41,32,+40,40,40,83,39,32,40,83,39,32,95,52,54,51,41,41,32,40,40,66,+32,40,66,32,40,95,49,53,57,48,32,95,56,57,48,41,41,41,32,40,+40,66,32,95,56,48,53,41,32,40,85,32,65,41,41,41,41,32,40,40,+66,32,40,66,32,40,95,52,54,51,32,40,40,79,32,35,51,50,41,32,+75,41,41,41,41,32,40,40,66,32,95,49,53,57,48,41,32,40,85,32,+75,41,41,41,41,41,41,41,32,40,40,65,32,58,49,51,48,52,32,40,+40,66,32,85,41,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,+40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,66,32,90,41,+32,40,40,66,32,90,41,32,40,40,66,32,40,66,32,40,66,32,40,95,+52,54,51,32,34,84,109,111,100,117,108,101,32,34,41,41,41,41,32,40,+40,66,32,40,40,67,39,32,66,41,32,40,40,66,32,95,52,54,51,41,+32,95,57,48,50,41,41,41,32,40,40,66,32,40,66,32,40,95,52,54,+51,32,40,40,79,32,35,49,48,41,32,75,41,41,41,41,32,40,40,67,+32,40,67,39,32,95,52,54,51,41,41,32,40,40,79,32,35,49,48,41,+32,75,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,65,32,+58,49,51,48,53,32,40,40,40,67,39,32,40,95,51,50,32,95,53,56,+41,41,32,40,40,95,52,51,32,95,53,56,41,32,95,49,49,57,55,41,+41,32,40,40,66,32,40,95,51,52,32,95,53,56,41,41,32,95,49,51,+49,49,41,41,41,32,40,40,65,32,58,49,51,48,54,32,40,40,40,67,+39,32,40,95,51,50,32,95,53,56,41,41,32,40,40,95,52,51,32,95,+53,56,41,32,95,49,49,57,55,41,41,32,40,40,66,32,40,95,51,52,+32,95,53,56,41,41,32,95,49,51,49,50,41,41,41,32,40,40,65,32,+58,49,51,48,55,32,40,95,54,52,32,40,40,95,50,54,51,32,40,95,+51,57,53,32,95,49,49,50,49,41,41,32,40,40,95,50,54,51,32,95,+49,51,51,54,41,32,95,49,49,52,50,41,41,41,41,32,40,40,65,32,+58,49,51,48,56,32,40,40,40,83,39,32,66,41,32,40,40,66,32,40,+95,51,50,32,95,53,56,41,41,32,40,40,95,52,51,32,95,53,56,41,+32,40,40,95,50,54,51,32,95,49,51,49,48,41,32,95,55,57,56,41,+41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,95,51,52,32,95,+53,56,41,41,41,41,32,40,40,66,32,40,66,32,40,83,32,80,41,41,+41,32,40,40,66,32,40,67,39,32,95,56,50,50,41,41,32,40,40,40,+67,39,32,66,41,32,40,40,66,32,95,52,49,50,41,32,40,95,51,57,+53,32,95,55,57,56,41,41,41,32,40,95,51,57,53,32,95,55,52,51,+41,41,41,41,41,41,41,32,40,40,65,32,58,49,51,48,57,32,40,40,+83,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,83,41,32,+40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,+40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,+39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,+83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,+32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,+40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,+67,39,32,83,41,32,40,40,83,32,40,40,67,32,67,39,41,32,75,41,+41,32,40,40,67,32,40,40,40,67,39,32,67,39,41,32,40,40,66,32,+67,39,41,32,95,49,49,57,49,41,41,32,40,40,40,67,39,32,66,41,+32,40,40,66,32,40,95,51,50,32,95,53,56,41,41,32,95,49,51,48,+57,41,41,32,40,40,66,32,85,41,32,40,40,40,67,39,32,66,41,32,+40,66,39,32,40,40,66,32,40,95,51,50,32,95,53,56,41,41,32,95,+49,51,48,57,41,41,41,32,40,40,66,32,40,66,32,85,41,41,32,40,+40,66,32,40,66,32,40,66,32,40,66,32,40,95,51,52,32,95,53,56,+41,41,41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,40,+67,39,32,66,41,41,32,40,40,66,32,40,66,32,80,41,41,32,95,52,+54,51,41,41,41,32,95,55,52,52,41,41,41,41,41,41,41,41,32,40,+85,32,40,40,66,32,40,40,67,39,32,40,95,51,50,32,95,53,56,41,+41,32,95,49,51,48,57,41,41,32,40,40,66,32,85,41,32,40,40,66,+32,40,66,32,40,66,32,40,95,51,52,32,95,53,56,41,41,41,41,32,+40,40,66,32,40,40,67,39,32,66,41,32,80,41,41,32,95,49,49,56,+56,41,41,41,41,41,41,41,41,32,40,90,32,75,41,41,41,32,75,41,+41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,40,90,+32,75,41,41,41,32,75,41,41,32,75,41,41,32,40,90,32,75,41,41,+41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,40,90,+32,40,90,32,75,41,41,41,41,32,40,90,32,75,41,41,41,32,40,90,+32,75,41,41,41,32,75,41,41,32,75,41,41,32,40,40,40,67,39,32,+40,67,39,32,40,95,51,50,32,95,53,56,41,41,41,32,95,49,51,48,+56,41,32,40,85,32,40,40,66,32,40,40,67,39,32,40,95,51,50,32,+95,53,56,41,41,32,95,49,51,48,57,41,41,32,40,40,66,32,85,41,+32,40,40,66,32,40,66,32,40,66,32,40,95,51,52,32,95,53,56,41,+41,41,41,32,40,40,66,32,40,66,32,80,41,41,32,95,52,54,51,41,+41,41,41,41,41,41,41,32,40,40,66,32,40,95,51,52,32,95,53,56,+41,41,32,40,80,32,95,52,54,49,41,41,41,41,32,40,40,65,32,58,+49,51,49,48,32,40,40,66,32,40,40,95,51,50,32,95,53,56,41,32,+95,49,50,48,53,41,41,32,40,40,66,32,40,66,32,40,95,51,52,32,+95,53,56,41,41,41,32,40,40,40,83,39,32,66,41,32,40,40,66,32,+95,56,57,56,41,32,40,95,56,48,53,32,95,56,48,55,41,41,41,32,+40,40,40,67,39,32,66,41,32,40,40,66,32,95,52,54,51,41,32,95,+57,48,48,41,41,32,40,40,66,32,40,95,52,54,51,32,40,40,79,32,+35,51,53,41,32,75,41,41,41,32,40,95,49,53,57,48,32,95,50,56,+51,41,41,41,41,41,41,41,32,40,40,65,32,58,49,51,49,49,32,40,+40,95,51,57,55,32,40,40,89,32,40,40,66,32,40,40,83,39,32,40,+83,39,32,83,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,+32,83,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,+83,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,83,+41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,83,41,+41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,+41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,+32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,32,+40,40,40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,32,40,+40,40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,32,40,40,+40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,32,40,40,40,+67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,32,40,40,40,67,+39,32,40,67,39,32,40,67,39,32,83,41,41,41,32,40,40,40,67,39,+32,40,67,39,32,40,67,39,32,83,41,41,41,32,40,40,40,67,39,32,+40,67,39,32,40,67,39,32,83,41,41,41,32,40,40,40,67,39,32,40,+67,39,32,40,67,39,32,83,41,41,41,32,40,40,40,67,39,32,40,67,+39,32,67,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,+83,39,41,41,41,32,40,40,66,32,40,67,32,66,41,41,32,40,40,40,+67,39,32,40,83,39,32,67,41,41,32,40,40,40,67,39,32,66,41,32,+40,40,66,32,83,41,32,40,67,32,40,95,52,51,50,32,95,56,57,50,+41,41,41,41,32,40,40,40,83,39,32,67,41,32,40,40,40,83,39,32,+83,41,32,40,67,32,40,95,52,51,50,32,95,56,57,50,41,41,41,32,+40,40,40,83,39,32,67,41,32,40,40,66,32,40,83,32,95,57,49,48,+41,41,32,40,67,32,95,52,54,50,41,41,41,32,73,41,41,41,32,73,+41,41,41,32,73,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,+75,41,41,41,32,75,41,41,32,40,90,32,75,41,41,41,32,40,90,32,+75,41,41,41,32,40,90,32,75,41,41,41,32,75,41,41,32,75,41,41,+32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,+75,41,41,41,32,40,90,32,40,90,32,75,41,41,41,41,32,40,90,32,+75,41,41,41,32,40,90,32,75,41,41,41,32,75,41,41,32,75,41,41,+32,40,90,32,75,41,41,41,41,32,40,40,40,83,39,32,40,83,39,32,+40,67,39,32,83,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,+67,39,32,67,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,+39,32,83,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,+32,67,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,+67,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,67,+41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,67,41,+41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,67,41,41,+41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,67,41,41,41,+32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,67,41,41,41,32,+40,40,40,67,39,32,40,67,39,32,40,67,39,32,67,41,41,41,32,40,+40,40,67,39,32,40,67,39,32,40,67,39,32,67,41,41,41,32,40,40,+40,67,39,32,40,67,39,32,40,67,39,32,67,41,41,41,32,40,40,40,+67,39,32,40,67,39,32,40,67,39,32,67,41,41,41,32,40,40,40,67,+39,32,40,67,39,32,40,67,39,32,67,41,41,41,32,40,40,40,67,39,+32,40,67,39,32,67,41,41,32,40,40,66,32,40,66,32,40,40,67,39,+32,67,39,41,32,40,85,32,40,75,32,95,50,53,41,41,41,41,41,32,+40,40,40,83,39,32,40,83,39,32,66,41,41,32,40,66,32,40,67,39,+32,66,41,41,41,32,40,66,32,67,41,41,41,41,32,40,75,32,40,75,+32,95,50,53,41,41,41,41,32,40,75,32,95,50,53,41,41,41,32,40,+75,32,40,75,32,95,50,53,41,41,41,41,32,40,75,32,40,75,32,95,+50,53,41,41,41,41,32,40,75,32,40,75,32,95,50,53,41,41,41,41,+32,40,75,32,95,50,53,41,41,41,32,40,75,32,95,50,53,41,41,41,+32,40,75,32,40,75,32,95,50,53,41,41,41,41,32,40,75,32,40,75,+32,95,50,53,41,41,41,41,32,40,75,32,40,75,32,95,50,53,41,41,+41,41,32,40,75,32,40,75,32,40,75,32,95,50,53,41,41,41,41,41,+32,40,75,32,40,75,32,95,50,53,41,41,41,41,32,40,75,32,40,75,+32,95,50,53,41,41,41,41,32,75,41,41,32,40,75,32,95,50,53,41,+41,41,32,40,40,66,32,40,66,32,40,67,39,32,67,41,41,41,32,40,+40,40,67,39,32,66,41,32,66,41,32,40,40,67,39,32,95,52,54,51,+41,32,40,95,51,57,53,32,95,55,57,56,41,41,41,41,41,41,41,32,+95,52,54,49,41,41,32,95,52,54,49,41,41,32,40,40,65,32,58,49,+51,49,50,32,40,40,95,51,57,55,32,40,89,32,40,40,40,83,39,32,+40,67,39,32,83,41,41,32,40,40,40,67,39,32,40,67,39,32,67,41,+41,32,40,40,40,67,39,32,40,67,39,32,83,41,41,32,40,40,40,67,+39,32,40,67,39,32,67,41,41,32,40,40,40,67,39,32,40,67,39,32,+67,41,41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,+40,67,39,32,40,67,39,32,67,41,41,32,40,40,40,67,39,32,40,67,+39,32,67,41,41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,+40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,40,67,39,32,+40,67,39,32,67,41,41,32,40,40,40,67,39,32,40,67,39,32,67,41,+41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,40,67,+39,32,40,67,39,32,67,41,41,32,40,40,40,67,39,32,40,67,39,32,+67,41,41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,+66,32,40,67,32,40,40,67,32,83,39,41,32,75,41,41,41,32,40,40,+40,83,39,32,66,41,32,40,67,39,32,66,41,41,32,67,41,41,41,32,+40,75,32,40,75,32,95,50,53,41,41,41,41,32,40,75,32,95,50,53,+41,41,41,32,40,75,32,40,75,32,95,50,53,41,41,41,41,32,40,75,+32,40,75,32,95,50,53,41,41,41,41,32,40,75,32,40,75,32,95,50,+53,41,41,41,41,32,40,75,32,95,50,53,41,41,41,32,40,75,32,95,+50,53,41,41,41,32,40,75,32,40,75,32,95,50,53,41,41,41,41,32,+40,75,32,40,75,32,95,50,53,41,41,41,41,32,40,75,32,40,75,32,+95,50,53,41,41,41,41,32,40,75,32,40,75,32,40,75,32,95,50,53,+41,41,41,41,41,32,40,75,32,40,75,32,95,50,53,41,41,41,41,32,+40,75,32,40,75,32,95,50,53,41,41,41,41,32,40,40,40,83,39,32,+67,41,32,40,40,40,83,39,32,83,41,32,40,67,32,40,95,52,51,50,+32,95,50,56,49,41,41,41,32,40,67,32,95,52,54,50,41,41,41,32,+73,41,41,41,32,40,75,32,95,50,53,41,41,41,32,40,40,66,32,90,+41,32,67,41,41,41,41,32,95,52,54,49,41,41,32,40,40,65,32,58,+49,51,49,51,32,40,40,66,32,40,40,83,39,32,40,95,51,50,32,95,+53,56,41,41,32,95,49,51,48,57,41,41,32,40,40,66,32,40,66,32,+85,41,41,32,40,40,40,83,39,32,66,41,32,40,66,39,32,40,40,66,+32,40,67,39,32,40,95,51,50,32,95,53,56,41,41,41,32,40,67,32,+95,49,50,54,50,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,+67,41,41,32,40,40,66,32,40,66,32,40,40,83,39,32,83,39,41,32,+95,51,57,50,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,+32,40,40,95,51,50,32,95,53,56,41,32,95,49,51,48,55,41,41,41,+41,41,32,40,40,66,32,40,40,67,39,32,66,41,32,40,66,39,32,40,+40,66,32,40,67,39,32,40,95,51,50,32,95,53,56,41,41,41,32,40,+40,66,32,40,66,32,95,49,51,48,53,41,41,32,95,52,54,50,41,41,+41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,40,67,39,+32,66,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,40,67,+39,32,40,95,51,51,32,95,53,56,41,41,41,32,40,40,66,32,40,40,+83,39,32,95,50,54,49,41,32,40,40,66,32,40,95,52,53,32,95,53,+56,41,41,32,40,40,66,32,95,49,50,50,41,32,95,51,57,50,41,41,+41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,95,50,54,49,+41,32,40,40,66,32,95,49,49,57,56,41,32,40,95,56,48,53,32,95,+56,48,56,41,41,41,41,32,40,40,66,32,40,95,52,54,51,32,34,110,+111,116,32,112,111,108,121,109,111,114,112,104,105,99,32,101,110,111,117,103,+104,58,32,34,41,41,32,40,40,66,32,95,49,54,48,57,41,32,40,95,+51,57,53,32,95,57,48,50,41,41,41,41,41,41,41,32,40,95,51,52,+32,95,53,56,41,41,41,41,32,40,40,67,39,32,95,51,57,54,41,32,+40,67,32,40,95,52,51,50,32,95,56,57,50,41,41,41,41,41,41,41,+41,32,40,95,51,52,32,95,53,56,41,41,41,41,41,41,32,40,40,65,+32,58,49,51,49,52,32,40,40,66,32,89,41,32,40,40,66,32,40,40,+67,39,32,40,83,39,32,83,41,41,32,40,40,66,32,40,66,32,40,40,+83,39,32,83,39,41,32,40,40,66,32,67,41,32,40,40,40,67,39,32,+83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,+32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,+40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,+67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,+32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,+41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,+40,40,40,67,39,32,83,41,32,40,40,67,32,40,40,67,32,83,39,41,+32,75,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,+32,75,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,+32,40,90,32,75,41,41,41,32,75,41,41,32,75,41,41,32,40,90,32,+75,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,+32,40,90,32,40,90,32,75,41,41,41,41,32,40,90,32,75,41,41,41,+32,40,90,32,75,41,41,41,32,75,41,41,32,75,41,41,41,41,41,32,+40,40,66,32,40,66,32,40,66,32,90,41,41,41,32,40,40,66,32,40,+66,32,40,66,32,90,41,41,41,32,40,40,66,32,40,40,67,39,32,40,+67,39,32,66,41,41,32,40,40,66,32,40,66,32,40,95,51,50,32,95,+53,56,41,41,41,32,40,40,66,32,40,66,32,95,49,50,48,57,41,41,+32,80,41,41,41,41,32,40,40,66,32,40,66,32,85,41,41,32,40,67,+39,32,67,41,41,41,41,41,41,41,41,32,40,40,40,83,39,32,40,83,+39,32,40,83,39,32,67,41,41,41,32,40,40,66,32,40,66,32,40,66,+32,40,83,32,95,49,49,57,49,41,41,41,41,32,40,40,40,83,39,32,+40,83,39,32,67,41,41,32,40,40,66,32,40,66,32,40,40,83,39,32,+83,39,41,32,95,49,49,57,49,41,41,41,32,40,40,40,67,39,32,66,+41,32,40,40,66,32,40,67,39,32,40,67,39,32,40,95,51,51,32,95,+53,56,41,41,41,41,32,95,49,49,57,57,41,41,32,40,95,51,52,32,+95,53,56,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,85,41,+41,41,32,40,40,40,83,39,32,66,41,32,40,40,66,32,40,67,39,32,+66,41,41,32,40,40,66,32,66,39,41,32,40,40,66,32,40,66,32,40,+95,51,50,32,95,53,56,41,41,41,32,95,49,50,55,50,41,41,41,41,+32,40,40,66,32,40,66,32,40,66,32,40,66,32,85,41,41,41,41,32,+95,49,51,49,53,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,+66,32,85,41,41,41,32,40,40,40,83,39,32,66,41,32,40,40,66,32,+40,67,39,32,66,41,41,32,40,40,66,32,66,39,41,32,40,40,66,32,+40,66,32,40,95,51,50,32,95,53,56,41,41,41,32,95,49,50,55,50,+41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,85,41,+41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,67,39,32,67,41,+41,41,41,32,40,40,66,32,40,66,32,40,67,39,32,67,41,41,41,32,+95,49,51,49,53,41,41,41,41,41,41,41,41,41,32,40,40,65,32,58,+49,51,49,53,32,40,40,40,83,39,32,66,41,32,40,40,66,32,40,67,+39,32,66,41,41,32,40,40,66,32,40,66,32,40,67,39,32,66,41,41,+41,32,40,40,66,32,40,66,32,40,66,32,40,95,51,50,32,95,53,56,+41,41,41,41,32,40,40,66,32,67,41,32,40,40,67,32,95,49,50,56,+55,41,32,95,50,53,41,41,41,41,41,41,32,40,40,66,32,40,66,32,+40,66,32,90,41,41,41,32,95,49,51,49,52,41,41,41,32,40,40,65,+32,58,49,51,49,54,32,40,40,40,83,39,32,40,83,39,32,40,83,39,+32,80,41,41,41,32,40,40,66,32,40,40,67,39,32,40,67,39,32,66,+41,41,32,40,40,66,32,40,66,32,40,95,51,50,32,95,53,56,41,41,+41,32,40,40,66,32,40,66,32,95,49,50,48,57,41,41,32,80,41,41,+41,41,32,40,40,66,32,40,66,32,85,41,41,32,40,40,40,67,39,32,+40,67,39,32,66,41,41,32,40,40,66,32,40,66,32,40,67,39,32,40,+95,51,51,32,95,53,56,41,41,41,41,32,95,49,50,54,52,41,41,32,+40,95,51,52,32,95,53,56,41,41,41,41,41,32,95,49,51,49,52,41,+41,32,40,40,65,32,58,49,51,49,55,32,40,40,66,32,40,40,67,39,+32,40,95,51,50,32,95,53,56,41,41,32,95,49,49,57,54,41,41,32,+40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,67,41,32,40,40,+40,67,39,32,40,67,39,32,83,39,41,41,32,40,40,66,32,40,66,32,+67,41,41,32,40,40,40,83,39,32,40,67,39,32,67,41,41,32,40,40,+66,32,40,66,32,40,40,83,39,32,83,39,41,32,95,56,48,50,41,41,+41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,40,95,51,50,+32,95,53,56,41,32,40,95,54,52,32,95,49,49,52,56,41,41,41,41,+41,41,32,40,40,40,67,39,32,40,67,39,32,40,83,39,32,40,67,39,+32,66,41,41,41,41,32,40,40,40,83,39,32,66,41,32,40,40,66,32,+40,67,39,32,40,67,39,32,40,83,39,32,40,95,51,50,32,95,53,56,+41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,+40,95,50,55,54,32,95,53,54,41,32,95,51,57,51,41,41,41,41,41,+32,40,40,40,67,39,32,40,67,39,32,66,41,41,32,40,40,66,32,66,+39,41,32,40,40,66,32,40,66,32,40,95,52,51,32,95,53,56,41,41,+41,32,40,40,66,32,40,66,32,85,41,41,32,40,40,66,32,40,66,32,+40,66,32,95,49,51,49,55,41,41,41,32,40,40,67,39,32,40,67,39,+32,95,55,52,52,41,41,32,40,40,66,32,40,66,32,95,55,52,51,41,+41,32,40,40,66,32,40,66,32,40,95,50,54,49,32,95,57,48,54,41,+41,41,32,95,49,51,49,56,41,41,41,41,41,41,41,41,32,40,40,66,+32,40,66,32,40,95,52,49,50,32,40,40,95,49,56,52,32,95,49,57,+56,41,32,40,40,95,52,56,53,32,95,50,55,55,41,32,40,95,51,53,+57,32,35,49,41,41,41,41,41,41,32,40,40,40,67,39,32,40,83,39,+32,95,51,57,53,41,41,32,40,40,66,32,40,66,32,95,56,50,50,41,+41,32,40,40,67,39,32,95,52,49,50,41,32,40,40,66,32,40,95,51,+57,53,32,95,55,57,56,41,41,32,40,85,32,40,90,32,40,90,32,40,+90,32,75,41,41,41,41,41,41,41,41,32,40,85,32,40,75,32,40,90,+32,40,90,32,75,41,41,41,41,41,41,41,41,41,41,32,40,40,66,32,+40,66,32,40,66,32,40,66,32,40,95,50,54,49,32,40,95,51,52,32,+95,53,56,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,+95,52,54,50,41,41,41,32,40,40,40,67,39,32,40,67,39,32,66,41,+41,32,40,40,66,32,40,66,32,67,41,41,32,40,40,66,32,67,41,32,+40,40,40,67,39,32,67,41,32,40,40,67,32,80,41,32,95,52,54,49,+41,41,32,95,52,54,49,41,41,41,41,32,40,85,32,40,75,32,40,75,+32,40,75,32,65,41,41,41,41,41,41,41,41,41,32,40,40,66,32,40,+66,32,40,95,50,54,49,32,40,95,52,55,49,32,95,49,51,48,50,41,+41,41,41,32,95,57,50,56,41,41,41,41,41,32,40,40,66,32,90,41,+32,40,40,66,32,40,66,32,40,40,95,50,55,54,32,95,53,54,41,32,+95,51,57,51,41,41,41,32,40,40,40,67,39,32,40,83,39,32,40,95,+52,51,32,95,53,56,41,41,41,32,40,40,66,32,40,66,32,85,41,41,+32,40,40,66,32,40,66,32,40,66,32,95,49,51,49,55,41,41,41,32,+40,40,67,39,32,40,67,39,32,95,55,52,52,41,41,32,40,40,66,32,+40,67,32,95,56,48,51,41,41,32,95,52,49,49,41,41,41,41,41,32,+40,95,52,49,50,32,40,40,95,49,56,52,32,95,49,57,56,41,32,40,+40,95,52,56,53,32,95,50,55,55,41,32,40,95,51,53,57,32,35,48,+41,41,41,41,41,41,41,41,41,41,32,40,85,32,65,41,41,41,32,40,+85,32,75,41,41,41,32,95,49,49,51,49,41,41,41,32,40,40,65,32,+58,49,51,49,56,32,40,40,40,67,39,32,66,41,32,95,57,48,55,41,+32,40,40,66,32,40,95,52,54,51,32,34,36,115,117,112,101,114,34,41,+41,32,40,95,49,53,57,48,32,95,50,56,51,41,41,41,41,32,40,40,+65,32,58,49,51,49,57,32,40,40,66,32,40,40,95,51,50,32,95,53,+56,41,32,40,95,54,52,32,95,49,49,53,50,41,41,41,32,40,40,66,+32,40,66,32,40,40,95,51,51,32,95,53,56,41,32,40,95,49,49,54,+49,32,95,52,54,49,41,41,41,41,32,40,40,40,67,39,32,66,41,32,+40,95,51,50,32,95,53,56,41,41,32,40,40,66,32,40,66,32,40,40,+95,51,50,32,95,53,56,41,32,95,49,51,50,51,41,41,41,32,40,40,+66,32,40,66,32,40,66,32,40,40,95,51,50,32,95,53,56,41,32,40,+95,54,52,32,95,49,49,53,50,41,41,41,41,41,32,40,40,40,67,39,+32,66,41,32,40,66,39,32,40,40,66,32,40,67,39,32,40,95,51,51,+32,95,53,56,41,41,41,32,40,40,66,32,40,66,32,95,49,49,54,49,+41,41,32,40,67,32,95,52,54,51,41,41,41,41,41,32,40,40,66,32,+40,66,32,40,95,51,52,32,95,53,56,41,41,41,32,80,41,41,41,41,+41,41,41,41,32,40,40,65,32,58,49,51,50,48,32,40,40,67,32,40,+40,67,32,83,39,41,32,95,49,51,49,57,41,41,32,40,40,67,32,40,+95,51,50,32,95,53,56,41,41,32,40,40,66,32,40,40,95,51,50,32,+95,53,56,41,32,95,49,51,50,51,41,41,32,40,40,66,32,40,66,32,+40,40,95,51,50,32,95,53,56,41,32,40,95,54,52,32,95,49,49,53,+50,41,41,41,41,32,40,40,66,32,40,66,32,40,40,67,39,32,40,95,+51,50,32,95,53,56,41,41,32,40,40,66,32,95,49,51,48,54,41,32,+40,95,51,57,53,32,95,53,54,54,41,41,41,41,41,32,40,40,66,32,+40,66,32,40,40,67,39,32,40,95,51,50,32,95,53,56,41,41,32,40,+40,66,32,40,40,95,50,55,54,32,95,53,54,41,32,95,51,57,51,41,+41,32,40,40,95,52,51,32,95,53,56,41,32,95,49,51,50,50,41,41,+41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,95,51,52,32,95,+53,56,41,41,41,41,32,40,40,40,67,39,32,66,41,32,40,66,39,32,+80,41,41,32,95,52,54,51,41,41,41,41,41,41,41,41,41,32,40,40,+65,32,58,49,51,50,49,32,40,40,66,32,85,41,32,40,90,32,40,40,+40,67,39,32,66,41,32,40,40,66,32,40,95,50,55,54,32,95,53,54,+41,41,32,40,95,52,51,50,32,95,50,56,49,41,41,41,32,40,40,66,+32,95,49,51,48,54,41,32,40,40,67,32,79,41,32,75,41,41,41,41,+41,41,32,40,40,65,32,58,49,51,50,50,32,40,40,66,32,40,40,95,+51,50,32,95,53,56,41,32,95,54,51,41,41,32,40,40,40,83,39,32,+40,83,39,32,40,95,51,50,32,95,53,56,41,41,41,32,40,40,40,67,+39,32,66,41,32,40,40,66,32,40,95,53,49,32,95,53,56,41,41,32,+95,49,51,50,49,41,41,32,95,49,49,53,50,41,41,32,40,40,66,32,+40,66,32,85,41,41,32,40,40,40,67,39,32,40,83,39,32,40,67,39,+32,40,67,39,32,89,41,41,41,41,32,40,40,66,32,40,66,32,40,66,+32,40,66,32,40,66,32,40,80,32,40,40,95,51,52,32,95,53,56,41,+32,95,52,54,49,41,41,41,41,41,41,41,32,40,40,40,67,39,32,66,+41,32,40,66,39,32,40,66,39,32,40,66,39,32,40,40,66,32,40,67,+39,32,66,41,41,32,40,40,66,32,40,66,32,40,95,51,51,32,95,53,+56,41,41,41,32,95,49,49,57,51,41,41,41,41,41,41,32,40,40,66,+32,40,40,67,39,32,66,41,32,40,66,39,32,40,66,39,32,40,40,66,+32,40,95,51,51,32,95,53,56,41,41,32,95,49,49,54,49,41,41,41,+41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,40,95,51,+50,32,95,53,56,41,32,95,49,51,50,51,41,41,41,41,41,32,40,40,+66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,40,95,51,50,32,+95,53,56,41,32,40,95,54,52,32,95,49,49,53,50,41,41,41,41,41,+41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,40,67,39,32,+40,67,39,32,66,41,41,41,32,40,40,66,32,40,66,32,40,66,32,67,+41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,67,32,95,51,57,+50,41,41,41,41,32,40,66,39,32,40,40,66,32,40,95,51,51,32,95,+53,56,41,41,32,95,54,50,41,41,41,41,41,41,32,40,40,40,67,39,+32,66,41,32,40,40,66,32,40,95,51,51,32,95,53,56,41,41,32,95,+49,49,54,49,41,41,32,40,95,51,52,32,95,53,56,41,41,41,41,41,+41,41,41,41,32,95,49,49,53,51,41,41,41,41,41,32,40,40,65,32,+58,49,51,50,51,32,40,40,40,95,51,50,32,95,53,56,41,32,40,95,+54,52,32,95,49,49,53,50,41,41,32,40,40,67,32,40,40,83,32,95,+51,57,50,41,32,40,40,40,67,39,32,40,95,51,50,32,95,53,56,41,+41,32,40,40,95,52,51,32,95,53,56,41,32,40,85,32,40,40,66,32,+40,40,67,39,32,40,95,51,50,32,95,53,56,41,41,32,95,49,49,57,+55,41,41,32,40,40,66,32,40,66,32,40,95,51,52,32,95,53,56,41,+41,41,32,80,41,41,41,41,41,32,40,40,66,32,40,40,95,51,50,32,+95,53,56,41,32,40,95,54,52,32,95,49,49,53,48,41,41,41,32,40,+40,40,67,39,32,40,67,39,32,40,95,51,50,32,95,53,56,41,41,41,+32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,+67,32,40,40,40,67,39,32,89,41,32,40,40,40,67,39,32,83,41,32,+40,40,40,67,39,32,40,83,39,32,67,41,41,32,40,40,40,67,39,32,+40,67,39,32,40,83,39,32,40,67,39,32,67,41,41,41,41,32,40,40,+40,67,39,32,40,67,39,32,40,83,39,32,40,67,39,32,67,41,41,41,+41,32,40,40,40,67,39,32,40,67,39,32,40,83,39,32,40,67,39,32,+80,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,+67,32,40,40,40,67,39,32,83,39,41,32,83,39,41,32,40,40,66,32,+40,66,32,40,95,51,52,32,95,53,56,41,41,41,32,80,41,41,41,41,+41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,+40,66,32,40,83,32,66,41,41,41,41,41,41,41,32,40,40,40,67,39,+32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,+32,40,67,39,32,40,67,39,32,83,41,41,41,41,41,41,41,41,32,40,+40,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,+32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,67,39,41,+41,41,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,+66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,67,41,41,+41,41,41,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,+39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,+39,32,40,67,39,32,67,41,41,41,41,41,41,41,41,41,32,40,40,40,+67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,+67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,83,+39,41,41,41,41,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,+66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,+40,66,32,67,41,41,41,41,41,41,41,41,41,41,32,40,40,40,67,39,+32,40,67,39,32,40,83,39,32,40,67,39,32,40,83,39,32,40,83,39,+32,40,67,39,32,40,83,39,32,66,41,41,41,41,41,41,41,41,32,40,+40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,+32,40,66,32,40,83,39,32,67,41,41,41,41,41,41,41,41,41,32,40,+40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,+32,40,66,32,40,66,32,40,40,83,39,32,83,39,41,32,95,56,48,50,+41,41,41,41,41,41,41,41,41,41,32,40,40,40,67,39,32,40,83,39,+32,40,67,39,32,40,67,39,32,40,83,39,32,40,83,39,32,40,83,39,+32,40,83,39,32,40,83,39,32,67,41,41,41,41,41,41,41,41,41,32,+40,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,+66,32,40,66,32,40,66,32,40,40,83,39,32,83,39,41,32,40,40,67,+32,40,95,50,48,50,32,95,56,57,50,41,41,32,40,95,56,57,55,32,+95,49,49,49,50,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,+40,67,39,32,66,41,32,40,40,66,32,40,67,39,32,66,41,41,32,40,+40,66,32,40,66,32,40,83,39,32,40,83,39,32,40,83,39,32,40,83,+39,32,66,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,+40,66,32,40,66,32,40,66,32,40,67,39,32,66,41,41,41,41,41,41,+41,32,40,40,40,67,39,32,66,41,32,40,66,39,32,40,66,39,32,40,+66,39,32,40,66,39,32,40,40,66,32,67,41,32,40,67,32,95,57,50,+56,41,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,67,39,32,+67,41,41,41,32,40,40,40,67,39,32,66,41,32,40,66,39,32,67,41,+41,32,40,67,32,95,52,54,50,41,41,41,41,41,41,41,41,32,40,40,+66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,+40,66,32,85,41,41,41,41,41,41,41,41,32,40,40,40,67,39,32,40,+83,39,32,40,83,39,32,40,83,39,32,40,83,39,32,40,83,39,32,40,+83,39,32,67,41,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,+66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,40,67,39,32,67,+39,41,32,40,40,66,32,83,39,41,32,40,40,66,32,83,39,41,32,83,+41,41,41,41,41,41,41,41,41,41,32,40,40,40,67,39,32,40,67,39,+32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,+32,40,67,39,32,40,67,39,32,40,67,39,32,40,83,39,32,40,67,39,+32,67,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,40,67,39,+32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,+32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,83,39,+32,40,67,39,32,67,41,41,41,41,41,41,41,41,41,41,41,41,32,40,+40,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,+32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,+32,40,83,39,32,40,67,39,32,67,41,41,41,41,41,41,41,41,41,41,+41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,+32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,+32,40,67,39,32,40,83,39,32,40,67,39,32,67,41,41,41,41,41,41,+41,41,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,+32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,+32,40,67,39,32,40,67,39,32,40,83,39,32,40,67,39,32,67,41,41,+41,41,41,41,41,41,41,41,41,41,32,40,40,40,67,39,32,40,67,39,+32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,+32,40,67,39,32,40,67,39,32,40,67,39,32,40,83,39,32,40,67,39,+32,67,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,40,67,39,+32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,+32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,83,39,+32,40,67,39,32,67,41,41,41,41,41,41,41,41,41,41,41,41,32,40,+40,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,+32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,+32,40,83,39,32,40,67,39,32,67,41,41,41,41,41,41,41,41,41,41,+41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,+32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,+32,40,67,39,32,40,83,39,32,40,67,39,32,67,41,41,41,41,41,41,+41,41,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,+32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,+32,40,67,39,32,40,67,39,32,40,83,39,32,40,67,39,32,67,41,41,+41,41,41,41,41,41,41,41,41,41,32,40,40,40,67,39,32,40,67,39,+32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,+32,40,67,39,32,40,67,39,32,40,67,39,32,40,83,39,32,40,67,39,+32,67,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,40,67,39,+32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,+32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,83,39,+32,40,67,39,32,67,41,41,41,41,41,41,41,41,41,41,41,41,32,40,+40,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,+32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,+32,40,83,39,32,40,67,39,32,67,41,41,41,41,41,41,41,41,41,41,+41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,+32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,+32,40,67,39,32,40,83,39,32,40,67,39,32,67,41,41,41,41,41,41,+41,41,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,+32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,+32,40,67,39,32,40,67,39,32,40,83,39,32,40,67,39,32,67,41,41,+41,41,41,41,41,41,41,41,41,41,32,40,40,40,67,39,32,40,67,39,+32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,+32,40,67,39,32,40,67,39,32,40,67,39,32,40,83,39,32,40,67,39,+32,67,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,40,67,39,+32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,+32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,83,39,+32,67,41,41,41,41,41,41,41,41,41,41,41,32,40,40,66,32,40,66,+32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,+66,32,40,66,32,40,66,32,40,67,32,67,39,41,41,41,41,41,41,41,+41,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,+40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,+40,67,39,32,40,67,39,32,66,41,41,41,41,41,41,41,41,41,41,32,+40,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,+66,32,40,66,32,40,66,32,40,66,32,67,41,41,41,41,41,41,41,41,+41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,+66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,67,32,67,39,41,+41,41,41,41,41,41,41,41,41,41,32,40,40,66,32,40,40,67,39,32,+40,83,39,32,40,83,39,32,40,83,39,32,40,83,39,32,40,67,39,32,+40,67,39,32,40,67,39,32,40,67,39,32,67,41,41,41,41,41,41,41,+41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,+66,32,40,40,67,39,32,66,41,32,40,66,39,32,40,40,66,32,67,41,+32,40,67,32,95,57,50,56,41,41,41,41,41,41,41,41,41,41,32,40,+40,66,32,40,66,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,+39,32,67,41,41,41,41,41,41,32,40,40,66,32,40,67,39,32,40,67,+39,32,40,67,39,32,40,67,39,32,67,41,41,41,41,41,32,40,40,66,+32,40,66,32,40,67,39,32,40,67,39,32,67,41,41,41,41,32,40,40,+66,32,40,67,39,32,40,67,39,32,67,41,41,41,32,40,66,32,67,41,+41,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,67,39,32,40,+67,39,32,67,41,41,41,41,32,40,40,66,32,40,67,39,32,40,67,39,+32,67,41,41,41,32,40,40,66,32,40,66,32,67,41,41,32,40,40,66,+32,67,41,32,40,85,32,40,75,32,40,75,32,75,41,41,41,41,41,41,+41,41,41,41,41,32,40,90,32,75,41,41,41,41,32,40,90,32,75,41,+41,41,32,40,90,32,75,41,41,41,32,75,41,41,32,40,90,32,75,41,+41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,75,+41,41,32,75,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,+41,41,32,40,90,32,75,41,41,41,32,40,90,32,40,90,32,75,41,41,+41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,75,+41,41,32,75,41,41,32,40,90,32,75,41,41,41,41,32,40,40,66,32,+40,66,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,67,+41,41,41,41,41,41,32,40,40,66,32,40,67,39,32,40,67,39,32,40,+67,39,32,40,67,39,32,67,41,41,41,41,41,32,40,40,66,32,40,66,+32,40,67,39,32,40,67,39,32,67,41,41,41,41,32,40,40,66,32,40,+67,39,32,40,67,39,32,67,41,41,41,32,40,66,32,67,41,41,41,41,+41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,67,39,32,40,67,+39,32,40,67,39,32,67,41,41,41,41,41,32,40,40,66,32,40,67,39,+32,40,67,39,32,40,67,39,32,67,41,41,41,41,32,40,40,66,32,40,+66,32,40,67,39,32,67,41,41,41,32,40,40,66,32,40,67,39,32,67,+41,41,32,40,85,32,40,75,32,40,75,32,65,41,41,41,41,41,41,41,+41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,66,+32,40,66,32,90,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,+66,32,40,66,32,40,66,32,40,40,67,39,32,40,67,39,32,40,95,51,+50,32,95,53,56,41,41,41,32,40,40,66,32,40,95,52,51,32,95,53,+56,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,40,95,51,+50,32,95,53,56,41,41,32,40,40,67,32,95,49,50,48,54,41,32,34,+100,105,99,116,34,41,41,41,32,40,40,66,32,40,66,32,40,95,51,52,+32,95,53,56,41,41,41,32,40,67,32,80,41,41,41,41,41,41,41,41,+41,41,32,40,40,40,67,39,32,40,67,39,32,66,41,41,32,40,40,66,+32,40,66,32,40,67,39,32,66,41,41,41,32,40,40,66,32,40,66,32,+40,66,32,83,41,41,41,32,40,40,40,67,39,32,67,39,41,32,67,39,+41,32,40,67,32,95,52,54,51,41,41,41,41,41,32,40,40,67,39,32,+40,67,39,32,95,52,54,50,41,41,32,40,40,40,67,39,32,66,41,32,+80,41,32,40,40,66,32,95,55,53,48,41,32,40,95,51,57,53,32,40,+40,95,50,54,51,32,95,55,52,51,41,32,95,53,54,53,41,41,41,41,+41,41,41,41,41,41,41,32,40,85,32,65,41,41,41,32,40,85,32,75,+41,41,41,41,32,95,49,49,51,49,41,41,32,40,95,56,48,53,32,95,+56,48,55,41,41,41,41,41,32,40,40,66,32,90,41,32,40,40,66,32,+40,66,32,40,66,32,40,40,83,39,32,66,41,32,40,66,39,32,66,41,+41,41,41,41,32,40,40,40,83,39,32,66,41,32,40,40,66,32,40,67,+39,32,40,67,39,32,40,83,39,32,40,83,39,32,40,83,39,32,66,41,+41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,+66,32,40,66,32,83,41,41,41,41,41,41,32,40,40,66,32,40,40,67,+39,32,66,41,32,40,66,39,32,40,66,39,32,40,66,39,32,40,40,66,+32,40,67,39,32,40,95,50,54,49,32,95,49,51,50,53,41,41,41,32,+40,40,40,67,39,32,66,41,32,95,49,51,50,52,41,32,40,40,67,32,+95,49,49,51,49,41,32,65,41,41,41,41,41,41,41,41,32,40,40,40,+67,39,32,66,41,32,40,67,39,32,66,41,41,32,95,52,54,50,41,41,+41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,+40,66,32,40,66,32,40,67,32,66,41,41,41,41,41,41,41,41,32,40,+40,40,67,39,32,40,83,39,32,40,67,39,32,40,67,39,32,40,67,39,+32,40,67,39,32,66,41,41,41,41,41,41,32,40,40,66,32,40,66,32,+40,66,32,40,66,32,40,66,32,40,66,32,67,41,41,41,41,41,41,32,+40,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,+40,67,39,32,67,39,41,32,67,39,41,41,41,41,41,41,41,32,40,40,+40,83,39,32,40,67,39,32,40,83,39,32,40,83,39,32,40,83,39,32,+40,83,39,32,40,83,39,32,67,41,41,41,41,41,41,41,32,40,40,66,+32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,+83,32,95,51,57,50,41,41,41,41,41,41,41,41,32,40,40,66,32,40,+40,67,39,32,66,41,32,40,66,39,32,40,66,39,32,40,66,39,32,40,+66,39,32,40,66,39,32,40,40,66,32,40,95,51,50,32,95,53,56,41,+41,32,40,40,67,32,95,49,50,48,54,41,32,34,100,105,99,116,34,41,+41,41,41,41,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,+67,39,32,66,41,41,41,32,40,40,66,32,40,66,32,66,39,41,41,32,+40,40,66,32,40,66,32,66,39,41,41,32,40,40,66,32,40,66,32,40,+66,32,40,67,39,32,83,41,41,41,41,32,40,40,40,67,39,32,66,41,+32,40,40,66,32,67,39,41,32,67,39,41,41,32,40,40,67,39,32,40,+67,39,32,95,52,54,50,41,41,32,40,40,66,32,40,67,32,80,41,41,+32,95,49,50,52,53,41,41,41,41,41,41,41,32,40,40,67,39,32,40,+67,39,32,40,67,39,32,95,52,54,50,41,41,41,32,40,40,40,67,39,+32,66,41,32,40,66,39,32,80,41,41,32,40,40,40,67,39,32,66,41,+32,95,55,52,52,41,32,95,55,52,51,41,41,41,41,41,41,41,32,40,+40,40,67,39,32,40,67,39,32,40,67,39,32,66,41,41,41,32,40,40,+66,32,40,66,32,66,39,41,41,32,40,66,32,66,39,41,41,41,32,40,+40,67,39,32,40,67,39,32,95,52,54,50,41,41,32,80,41,41,41,41,+41,41,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,40,+67,39,32,66,41,32,40,40,66,32,95,50,54,49,41,32,95,49,49,48,+48,41,41,32,40,40,66,32,40,95,52,54,51,32,34,77,117,108,116,105,+112,108,101,32,99,111,110,115,116,114,97,105,110,116,32,115,111,108,117,116,+105,111,110,115,32,102,111,114,58,32,34,41,41,32,95,56,52,50,41,41,+41,41,41,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,40,67,+39,32,66,41,32,40,66,39,32,66,41,41,41,41,32,40,40,66,32,40,+66,32,40,66,32,40,66,32,40,66,32,90,41,41,41,41,41,32,40,40,+40,67,39,32,66,41,32,40,40,66,32,40,67,39,32,40,67,39,32,66,+41,41,41,32,40,66,32,66,39,41,41,41,32,40,40,66,32,40,67,39,+32,95,52,54,50,41,41,32,40,67,32,80,41,41,41,41,41,41,41,32,+40,40,66,32,40,66,32,40,40,67,39,32,66,41,32,40,66,39,32,40,+66,39,32,40,66,39,32,40,85,32,95,49,51,48,50,41,41,41,41,41,+41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,+66,32,40,66,32,40,80,32,95,49,51,48,50,41,41,41,41,41,41,41,+41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,+40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,80,41,41,41,+41,41,41,41,41,32,40,40,66,32,40,66,32,40,40,83,39,32,66,41,+32,40,66,39,32,40,66,39,32,40,66,39,32,66,41,41,41,41,41,41,+32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,+40,66,32,40,66,32,90,41,41,41,41,41,41,41,41,32,40,40,66,32,+40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,+32,40,66,32,40,40,95,51,50,32,95,53,56,41,32,40,95,54,52,32,+95,49,49,53,49,41,41,41,41,41,41,41,41,41,41,41,32,40,40,40,+83,39,32,66,41,32,40,40,66,32,40,67,39,32,40,83,39,32,40,83,+39,32,40,83,39,32,40,67,39,32,40,67,39,32,66,41,41,41,41,41,+41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,+66,32,40,66,32,67,41,41,41,41,41,41,41,32,40,40,66,32,40,66,+32,40,66,32,40,66,32,40,66,32,40,40,67,39,32,40,67,39,32,67,+41,41,32,40,40,66,32,67,41,32,40,67,32,95,49,51,50,57,41,41,+41,41,41,41,41,41,32,40,40,40,67,39,32,66,41,32,40,67,39,32,+66,41,41,32,95,52,54,50,41,41,41,41,41,32,40,40,66,32,40,66,+32,40,66,32,40,66,32,40,66,32,40,66,32,85,41,41,41,41,41,41,+32,40,40,66,32,40,40,67,39,32,66,41,32,40,66,39,32,40,66,39,+32,40,66,39,32,40,66,39,32,40,40,66,32,40,67,39,32,40,95,51,+50,32,95,53,56,41,41,41,32,40,40,66,32,40,95,52,51,32,95,53,+56,41,41,32,40,40,66,32,85,41,32,40,40,40,83,39,32,66,41,32,+40,66,39,32,40,40,66,32,40,95,51,50,32,95,53,56,41,41,32,40,+40,67,32,95,49,50,48,54,41,32,34,100,105,99,116,34,41,41,41,41,+32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,95,51,52,32,95,+53,56,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,67,+32,80,41,41,41,41,32,95,49,51,50,56,41,41,41,41,41,41,41,41,+41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,66,+41,41,41,32,40,40,66,32,40,66,32,66,39,41,41,32,40,40,66,32,+40,66,32,66,39,41,41,32,40,40,66,32,40,66,32,40,66,32,67,41,+41,41,32,40,40,40,67,39,32,66,41,32,67,39,41,32,40,67,32,95,+52,54,51,41,41,41,41,41,41,32,40,40,67,39,32,40,67,39,32,95,+52,54,50,41,41,32,80,41,41,41,41,41,41,41,41,41,32,40,75,32,+40,75,32,95,49,51,48,50,41,41,41,41,41,41,41,32,40,85,32,40,+75,32,40,90,32,75,41,41,41,41,41,32,40,85,32,40,90,32,40,90,+32,75,41,41,41,41,41,32,40,90,32,40,90,32,75,41,41,41,41,41,+32,95,52,54,49,41,41,32,95,52,54,49,41,41,32,40,85,32,40,40,+40,67,39,32,66,41,32,40,40,66,32,40,95,51,51,32,95,53,56,41,+41,32,95,49,49,54,49,41,41,32,40,95,51,52,32,95,53,56,41,41,+41,41,41,41,41,41,32,40,40,95,51,52,32,95,53,56,41,32,95,52,+54,49,41,41,41,41,32,40,40,65,32,58,49,51,50,52,32,40,40,67,+39,32,95,51,57,52,41,32,40,40,66,32,85,41,32,40,40,66,32,40,+40,67,39,32,40,67,39,32,66,41,41,32,40,40,66,32,40,66,32,95,+51,57,52,41,41,32,40,40,66,32,40,66,32,40,80,32,75,41,41,41,+32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,79,41,41,41,32,+40,40,66,32,40,66,32,40,40,83,39,32,80,41,32,95,52,49,49,41,+41,41,32,40,40,40,67,39,32,66,41,32,40,66,39,32,80,41,41,32,+40,40,67,39,32,95,51,57,53,41,32,40,89,32,40,40,66,32,40,83,+32,83,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,+40,66,32,90,41,41,32,40,40,40,83,39,32,40,83,39,32,67,41,41,+32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,40,67,39,+32,40,83,39,32,83,41,41,32,40,40,40,67,39,32,40,67,39,32,67,+41,41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,40,+67,39,32,40,67,39,32,67,41,41,32,40,40,40,67,39,32,40,67,39,+32,67,41,41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,+40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,40,67,39,32,40,+67,39,32,67,41,41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,+32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,40,67,39,+32,40,67,39,32,67,41,41,32,40,40,40,67,39,32,40,67,39,32,67,+41,41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,40,+67,39,32,40,67,39,32,67,41,41,32,40,40,66,32,40,66,32,40,67,+32,40,40,83,32,73,41,32,75,41,41,41,41,32,40,40,40,83,39,32,+40,83,39,32,40,67,39,32,66,41,41,41,32,40,66,32,40,66,32,95,+55,52,52,41,41,41,32,73,41,41,41,32,40,75,32,40,75,32,95,49,+51,48,50,41,41,41,41,32,40,75,32,95,49,51,48,50,41,41,41,32,+40,75,32,40,75,32,95,49,51,48,50,41,41,41,41,32,40,75,32,40,+75,32,95,49,51,48,50,41,41,41,41,32,40,75,32,40,75,32,95,49,+51,48,50,41,41,41,41,32,40,75,32,95,49,51,48,50,41,41,41,32,+40,75,32,95,49,51,48,50,41,41,41,32,40,75,32,40,75,32,95,49,+51,48,50,41,41,41,41,32,40,75,32,40,75,32,95,49,51,48,50,41,+41,41,41,32,40,75,32,40,75,32,95,49,51,48,50,41,41,41,41,32,+40,75,32,40,75,32,40,75,32,95,49,51,48,50,41,41,41,41,41,32,+40,75,32,40,75,32,95,49,51,48,50,41,41,41,41,32,40,75,32,40,+75,32,95,49,51,48,50,41,41,41,41,32,40,40,66,32,40,40,67,39,+32,66,41,32,40,40,66,32,95,50,54,49,41,32,95,52,55,49,41,41,+41,32,40,67,32,40,95,52,51,54,32,95,50,56,49,41,41,41,41,41,+32,40,75,32,95,49,51,48,50,41,41,41,32,40,66,32,40,40,67,39,+32,66,41,32,95,55,54,48,41,41,41,41,41,41,41,41,41,41,41,32,+75,41,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,79,41,41,+32,40,67,32,40,40,89,32,40,40,40,67,39,32,40,83,39,32,67,41,+41,32,40,40,66,32,40,66,32,40,40,67,39,32,67,39,41,32,83,41,+41,41,32,40,40,66,32,40,66,32,40,40,67,39,32,40,67,39,32,66,+41,41,32,66,39,41,41,41,32,40,40,66,32,40,40,67,39,32,40,67,+39,32,66,41,41,32,40,40,66,32,40,66,32,40,67,39,32,66,41,41,+41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,89,32,40,+40,66,32,40,40,83,39,32,40,83,39,32,83,41,41,32,40,40,40,67,+39,32,40,67,39,32,40,67,39,32,83,41,41,41,32,40,40,40,67,39,+32,40,67,39,32,40,67,39,32,83,41,41,41,32,40,40,40,67,39,32,+40,67,39,32,40,67,39,32,83,41,41,41,32,40,40,40,67,39,32,40,+67,39,32,40,67,39,32,83,41,41,41,32,40,40,40,67,39,32,40,67,+39,32,40,67,39,32,83,41,41,41,32,40,40,40,67,39,32,40,67,39,+32,40,67,39,32,83,41,41,41,32,40,40,40,67,39,32,40,67,39,32,+40,67,39,32,83,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,+67,39,32,83,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,+39,32,83,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,+32,83,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,+83,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,83,+41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,83,41,+41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,+41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,+32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,32,+40,40,40,67,39,32,67,41,32,40,40,66,32,40,40,67,39,32,67,39,+41,32,83,39,41,41,32,40,40,40,67,39,32,40,67,39,32,40,83,39,+32,67,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,83,39,32,+67,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,83,39,32,67,+41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,83,39,32,67,41,+41,41,32,40,40,40,67,39,32,40,67,39,32,40,83,39,32,67,41,41,+41,32,40,40,40,67,39,32,40,67,39,32,40,83,39,32,67,41,41,41,+32,40,40,40,67,39,32,40,67,39,32,40,83,39,32,67,41,41,41,32,+40,40,40,67,39,32,40,67,39,32,40,83,39,32,67,41,41,41,32,40,+40,40,67,39,32,40,67,39,32,40,83,39,32,67,41,41,41,32,40,40,+40,67,39,32,40,67,39,32,40,83,39,32,67,41,41,41,32,40,40,40,+67,39,32,40,67,39,32,40,83,39,32,67,41,41,41,32,40,40,40,67,+39,32,40,67,39,32,40,83,39,32,67,41,41,41,32,40,40,40,67,39,+32,40,67,39,32,40,83,39,32,67,41,41,41,32,40,40,40,67,39,32,+40,67,39,32,40,83,39,32,67,41,41,41,32,40,40,40,67,39,32,40,+67,39,32,40,83,39,32,67,41,41,41,32,40,40,40,67,39,32,40,67,+39,32,40,83,39,32,67,41,41,41,32,40,40,40,67,39,32,67,41,32,+40,40,66,32,40,40,67,39,32,83,39,41,32,67,39,41,41,32,40,40,+66,32,40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,67,39,32,+67,41,32,40,95,50,48,50,32,95,56,57,50,41,41,41,41,32,95,52,+55,55,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,+41,32,75,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,+41,32,40,90,32,75,41,41,41,32,75,41,41,32,75,41,41,32,40,90,+32,75,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,+41,32,40,90,32,40,90,32,75,41,41,41,41,32,40,90,32,75,41,41,+41,32,40,90,32,75,41,41,41,32,75,41,41,32,75,41,41,32,40,90,+32,75,41,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,+41,41,32,75,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,+41,41,32,40,90,32,75,41,41,41,32,75,41,41,32,75,41,41,32,40,+90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,+41,41,32,40,90,32,40,90,32,75,41,41,41,41,32,40,90,32,75,41,+41,41,32,40,90,32,75,41,41,41,32,75,41,41,32,75,41,41,32,40,+90,32,75,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,+39,32,67,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,+32,67,41,41,41,32,40,40,40,67,39,32,40,83,39,32,40,67,39,32,+83,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,67,+41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,67,41,+41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,67,41,41,+41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,67,41,41,41,+32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,67,41,41,41,32,+40,40,40,67,39,32,40,67,39,32,40,67,39,32,67,41,41,41,32,40,+40,40,67,39,32,40,67,39,32,40,67,39,32,67,41,41,41,32,40,40,+40,67,39,32,40,67,39,32,40,67,39,32,67,41,41,41,32,40,40,40,+67,39,32,40,67,39,32,40,67,39,32,67,41,41,41,32,40,40,40,67,+39,32,40,67,39,32,40,67,39,32,67,41,41,41,32,40,40,40,67,39,+32,40,67,39,32,40,67,39,32,67,41,41,41,32,40,40,40,67,39,32,+40,67,39,32,40,67,39,32,67,41,41,41,32,40,40,40,67,39,32,40,+67,39,32,67,41,41,32,40,40,66,32,40,66,32,40,40,67,39,32,67,+39,41,32,40,85,32,40,75,32,95,52,55,54,41,41,41,41,41,32,40,+40,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,67,41,41,+41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,+32,67,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,+32,40,67,39,32,67,41,41,41,41,32,40,40,40,67,39,32,40,67,39,+32,40,67,39,32,40,67,39,32,67,41,41,41,41,32,40,40,40,67,39,+32,40,67,39,32,40,67,39,32,40,67,39,32,67,41,41,41,41,32,40,+40,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,67,41,41,+41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,+32,67,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,+32,40,67,39,32,67,41,41,41,41,32,40,40,40,67,39,32,40,67,39,+32,40,67,39,32,40,67,39,32,67,41,41,41,41,32,40,40,40,67,39,+32,40,67,39,32,40,67,39,32,40,67,39,32,67,41,41,41,41,32,40,+40,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,67,41,41,+41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,+32,67,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,+32,40,67,39,32,67,41,41,41,41,32,40,40,40,67,39,32,40,67,39,+32,40,67,39,32,40,67,39,32,67,41,41,41,41,32,40,40,40,67,39,+32,40,67,39,32,40,67,39,32,40,67,39,32,67,41,41,41,41,32,40,+40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,66,32,40,66,32,+40,40,67,39,32,67,39,41,32,40,40,66,32,67,39,41,32,40,85,32,+40,75,32,95,52,55,54,41,41,41,41,41,41,32,40,40,40,83,39,32,+40,67,39,32,40,67,39,32,66,41,41,41,32,40,40,66,32,40,66,32,+40,66,32,40,67,39,32,66,41,41,41,41,32,40,40,67,32,40,67,39,+32,40,67,39,32,67,41,41,41,32,95,52,55,54,41,41,41,32,40,40,+66,32,40,66,32,67,41,41,32,67,41,41,41,41,32,40,75,32,40,75,+32,95,52,55,54,41,41,41,41,32,40,75,32,95,52,55,54,41,41,41,+32,40,75,32,40,75,32,95,52,55,54,41,41,41,41,32,40,75,32,40,+75,32,95,52,55,54,41,41,41,41,32,40,75,32,40,75,32,95,52,55,+54,41,41,41,41,32,40,75,32,95,52,55,54,41,41,41,32,40,75,32,+95,52,55,54,41,41,41,32,40,75,32,40,75,32,95,52,55,54,41,41,+41,41,32,40,75,32,40,75,32,95,52,55,54,41,41,41,41,32,40,75,+32,40,75,32,95,52,55,54,41,41,41,41,32,40,75,32,40,75,32,40,+75,32,95,52,55,54,41,41,41,41,41,32,40,75,32,40,75,32,95,52,+55,54,41,41,41,41,32,40,75,32,40,75,32,95,52,55,54,41,41,41,+41,32,40,75,32,95,52,55,54,41,41,41,32,40,75,32,95,52,55,54,+41,41,41,32,40,75,32,40,75,32,95,52,55,54,41,41,41,41,41,32,+40,75,32,40,75,32,95,52,55,54,41,41,41,41,32,40,75,32,95,52,+55,54,41,41,41,32,40,75,32,40,75,32,95,52,55,54,41,41,41,41,+32,40,75,32,40,75,32,95,52,55,54,41,41,41,41,32,40,75,32,40,+75,32,95,52,55,54,41,41,41,41,32,40,75,32,95,52,55,54,41,41,+41,32,40,75,32,95,52,55,54,41,41,41,32,40,75,32,40,75,32,95,+52,55,54,41,41,41,41,32,40,75,32,40,75,32,95,52,55,54,41,41,+41,41,32,40,75,32,40,75,32,95,52,55,54,41,41,41,41,32,40,75,+32,40,75,32,40,75,32,95,52,55,54,41,41,41,41,41,32,40,75,32,+40,75,32,95,52,55,54,41,41,41,41,32,40,75,32,40,75,32,95,52,+55,54,41,41,41,41,32,40,40,40,83,39,32,40,83,39,32,67,41,41,+32,40,40,40,83,39,32,66,41,32,40,40,66,32,83,41,32,40,67,32,+40,95,52,51,54,32,95,50,56,49,41,41,41,41,32,40,40,66,32,40,+66,32,40,66,32,95,52,55,55,41,41,41,32,40,40,67,39,32,40,67,+39,32,95,52,54,50,41,41,32,40,67,32,80,41,41,41,41,41,32,40,+40,66,32,40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,+95,56,50,51,41,32,95,52,55,54,41,41,41,32,95,52,55,55,41,41,+41,41,32,40,75,32,95,52,55,54,41,41,41,32,40,75,32,40,75,32,+95,52,55,54,41,41,41,41,41,41,32,95,52,55,54,41,41,41,41,32,+40,40,66,32,40,66,32,67,41,41,32,67,41,41,41,41,41,32,95,52,+55,55,41,41,32,95,52,54,49,41,41,41,32,75,41,41,41,41,41,32,+40,40,65,32,58,49,51,50,53,32,40,40,83,32,40,85,32,95,52,54,+49,41,41,32,40,90,32,40,90,32,40,40,40,83,39,32,95,51,57,52,+41,32,40,40,66,32,85,41,32,40,40,40,67,39,32,40,67,39,32,66,+41,41,32,40,40,40,67,39,32,67,41,32,40,40,66,32,40,67,32,40,+95,50,48,50,32,95,50,56,49,41,41,41,32,40,40,66,32,40,95,52,+48,49,32,95,50,56,50,41,41,32,40,95,51,57,53,32,95,53,54,53,+41,41,41,41,32,75,41,41,32,40,40,67,32,79,41,32,75,41,41,41,+41,32,73,41,41,41,41,41,32,40,40,65,32,58,49,51,50,54,32,40,+40,40,95,51,50,32,95,53,56,41,32,40,95,54,52,32,95,49,49,53,+50,41,41,32,40,40,80,32,40,40,95,51,52,32,95,53,56,41,32,95,+49,51,52,49,41,41,32,40,90,32,40,85,32,40,40,66,32,40,40,67,+39,32,40,95,51,50,32,95,53,56,41,41,32,95,49,49,57,55,41,41,+32,40,40,40,67,39,32,66,41,32,40,40,66,32,95,50,54,49,41,32,+40,40,66,32,95,49,49,48,48,41,32,40,95,56,48,53,32,95,56,48,+55,41,41,41,41,32,40,40,66,32,40,95,52,54,51,32,34,67,97,110,+110,111,116,32,115,97,116,105,115,102,121,32,99,111,110,115,116,114,97,105,+110,116,58,32,34,41,41,32,95,56,51,56,41,41,41,41,41,41,41,41,+32,40,40,65,32,58,49,51,50,55,32,40,40,40,83,39,32,66,41,32,+40,66,39,32,40,40,66,32,40,95,51,50,32,95,53,56,41,41,32,40,+40,67,32,95,49,50,48,54,41,32,34,100,105,99,116,34,41,41,41,41,+32,40,40,66,32,40,66,32,40,66,32,40,67,32,95,49,49,54,56,41,+41,41,41,32,95,49,51,50,56,41,41,41,32,40,40,65,32,58,49,51,+50,56,32,40,40,66,32,40,66,32,95,55,52,52,41,41,32,40,40,66,+32,95,55,52,52,41,32,40,40,66,32,95,55,52,51,41,32,40,40,67,+32,95,56,57,56,41,32,95,49,49,49,50,41,41,41,41,41,32,40,40,+65,32,58,49,51,50,57,32,40,40,40,67,39,32,40,67,39,32,67,41,+41,32,40,40,66,32,40,40,83,39,32,83,41,32,95,56,50,51,41,41,+32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,40,67,39,+32,40,83,39,32,83,41,41,32,40,40,67,39,32,40,67,39,32,40,95,+52,51,52,32,95,49,51,51,49,41,41,41,32,80,41,41,32,40,40,40,+67,39,32,67,41,32,80,41,32,40,40,40,67,39,32,67,41,32,40,40,+40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,+39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,+67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,+32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,+40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,+67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,+32,67,41,32,40,40,67,32,40,40,40,67,39,32,67,39,41,32,40,85,+32,40,75,32,95,52,55,54,41,41,41,32,40,40,40,67,39,32,40,67,+39,32,67,41,41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,+40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,40,67,39,32,+40,67,39,32,67,41,41,32,40,40,40,67,39,32,40,67,39,32,67,41,+41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,40,67,+39,32,40,67,39,32,67,41,41,32,40,40,40,67,39,32,40,67,39,32,+67,41,41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,+40,67,39,32,40,67,39,32,67,41,41,32,40,40,40,67,39,32,40,67,+39,32,67,41,41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,+40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,40,67,39,32,+40,67,39,32,67,41,41,32,40,40,40,67,39,32,40,67,39,32,67,41,+41,32,40,40,67,32,40,40,40,67,39,32,67,39,41,32,40,40,66,32,+67,39,41,32,40,85,32,40,75,32,95,52,55,54,41,41,41,41,32,40,+40,66,32,40,66,32,40,66,32,40,66,32,95,52,55,55,41,41,41,41,+32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,80,32,40,95,55,+53,48,32,95,52,54,49,41,41,41,41,41,41,32,40,40,40,67,39,32,+66,41,32,40,40,66,32,40,67,39,32,66,41,41,32,40,40,66,32,40,+66,32,79,41,41,32,80,41,41,41,32,40,40,40,67,39,32,40,67,39,+32,79,41,41,32,80,41,32,75,41,41,41,41,41,41,32,40,75,32,40,+75,32,95,52,55,54,41,41,41,41,32,40,75,32,95,52,55,54,41,41,+41,32,40,75,32,40,75,32,95,52,55,54,41,41,41,41,32,40,75,32,+40,75,32,95,52,55,54,41,41,41,41,32,40,75,32,40,75,32,95,52,+55,54,41,41,41,41,32,40,75,32,95,52,55,54,41,41,41,32,40,75,+32,95,52,55,54,41,41,41,32,40,75,32,40,75,32,95,52,55,54,41,+41,41,41,32,40,75,32,40,75,32,95,52,55,54,41,41,41,41,32,40,+75,32,40,75,32,95,52,55,54,41,41,41,41,32,40,75,32,40,75,32,+40,75,32,95,52,55,54,41,41,41,41,41,32,40,75,32,40,75,32,95,+52,55,54,41,41,41,41,32,40,75,32,40,75,32,95,52,55,54,41,41,+41,41,32,40,75,32,95,52,55,54,41,41,41,32,40,75,32,95,52,55,+54,41,41,41,32,40,75,32,40,75,32,95,52,55,54,41,41,41,41,41,+32,40,75,32,40,75,32,95,52,55,54,41,41,41,41,32,40,75,32,95,+52,55,54,41,41,41,32,40,75,32,40,75,32,95,52,55,54,41,41,41,+41,32,40,75,32,40,75,32,95,52,55,54,41,41,41,41,32,40,75,32,+40,75,32,95,52,55,54,41,41,41,41,32,40,75,32,95,52,55,54,41,+41,41,32,40,75,32,95,52,55,54,41,41,41,32,40,75,32,40,75,32,+95,52,55,54,41,41,41,41,32,40,75,32,40,75,32,95,52,55,54,41,+41,41,41,32,40,75,32,40,75,32,95,52,55,54,41,41,41,41,32,40,+75,32,40,75,32,40,75,32,95,52,55,54,41,41,41,41,41,32,40,75,+32,40,75,32,95,52,55,54,41,41,41,41,32,40,75,32,40,75,32,95,+52,55,54,41,41,41,41,32,40,75,32,95,52,55,54,41,41,41,32,40,+75,32,95,52,55,54,41,41,41,32,40,75,32,40,75,32,95,52,55,54,+41,41,41,41,41,41,32,40,95,52,55,55,32,40,40,80,32,40,95,55,+53,48,32,95,52,54,49,41,41,32,95,52,54,49,41,41,41,41,41,32,+40,95,52,55,55,32,40,40,80,32,40,95,55,53,48,32,95,52,54,49,+41,41,32,95,52,54,49,41,41,41,41,32,40,40,65,32,58,49,51,51,+48,32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,40,67,+39,32,40,67,39,32,83,41,41,32,40,40,40,83,39,32,40,83,39,32,+40,83,39,32,67,39,41,41,41,32,40,40,40,83,39,32,40,83,39,32,+66,41,41,32,40,40,66,32,40,66,32,95,49,50,48,41,41,32,95,56,+50,51,41,41,32,40,40,40,83,39,32,40,83,39,32,40,83,39,32,95,+49,50,48,41,41,41,32,40,40,66,32,40,66,32,40,95,52,51,52,32,+95,49,51,51,49,41,41,41,32,80,41,41,32,40,40,66,32,40,66,32,+40,95,52,51,52,32,95,49,51,51,49,41,41,41,32,40,67,32,80,41,+41,41,41,41,32,40,40,40,83,39,32,40,83,39,32,66,41,41,32,40,+40,66,32,66,39,41,32,40,40,66,32,40,66,32,95,52,54,50,41,41,+32,80,41,41,41,32,40,40,40,83,39,32,40,83,39,32,66,41,41,32,+40,40,66,32,66,39,41,32,40,40,66,32,40,66,32,95,52,54,50,41,+41,32,40,67,32,80,41,41,41,41,32,40,40,40,83,39,32,40,83,39,+32,40,83,39,32,40,83,39,32,95,52,54,51,41,41,41,41,32,40,40,+66,32,40,66,32,67,41,41,32,80,41,41,32,40,40,40,67,39,32,40,+67,39,32,40,83,39,32,40,67,39,32,95,52,54,51,41,41,41,41,32,+40,40,66,32,40,66,32,67,41,41,32,40,67,32,80,41,41,41,32,73,+41,41,41,41,41,41,32,73,41,41,32,40,40,66,32,40,66,32,95,51,+57,52,41,41,32,40,40,66,32,40,66,32,85,41,41,32,40,40,66,32,+40,40,67,39,32,40,67,39,32,66,41,41,32,40,40,40,67,39,32,67,+41,32,95,56,50,51,41,32,75,41,41,41,32,40,40,40,67,39,32,40,+67,39,32,79,41,41,32,80,41,32,75,41,41,41,41,41,41,32,40,40,+65,32,58,49,51,51,49,32,40,40,67,32,66,41,32,40,40,40,67,39,+32,66,41,32,66,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,+40,67,39,32,66,41,41,32,40,40,66,32,40,66,32,95,49,50,49,41,+41,32,95,56,50,51,41,41,41,32,95,56,50,51,41,41,41,41,32,40,+40,65,32,58,49,51,51,50,32,80,41,32,40,40,65,32,58,49,51,51,+51,32,40,40,66,32,40,66,32,85,41,41,32,40,40,40,67,39,32,40,+67,39,32,40,67,39,32,67,41,41,41,32,40,40,66,32,40,40,83,39,+32,66,41,32,40,40,66,32,67,41,32,40,95,52,51,54,32,95,56,57,+50,41,41,41,41,32,40,40,40,83,39,32,40,83,39,32,67,41,41,32,+40,40,66,32,40,40,83,39,32,67,41,32,95,57,50,56,41,41,32,40,+40,66,32,40,66,32,40,95,50,54,49,32,95,49,55,52,41,41,41,32,+40,40,66,32,40,66,32,40,95,52,54,51,32,34,117,110,100,101,102,105,+110,101,100,32,34,41,41,41,32,40,40,40,67,39,32,66,41,32,95,52,+54,51,41,32,40,40,66,32,40,95,52,54,51,32,34,58,32,34,41,41,+32,95,57,48,50,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,+83,32,40,40,67,32,83,41,32,40,40,66,32,40,40,67,39,32,80,41,+32,95,49,55,53,41,41,32,40,90,32,75,41,41,41,41,41,41,32,40,+40,66,32,40,66,32,40,66,32,40,95,50,54,49,32,95,49,55,52,41,+41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,95,52,54,51,32,+34,97,109,98,105,103,117,111,117,115,32,34,41,41,41,41,32,40,40,40,+67,39,32,66,41,32,40,66,39,32,95,52,54,51,41,41,32,40,40,66,+32,40,66,32,40,95,52,54,51,32,34,58,32,34,41,41,41,32,40,40,+40,67,39,32,66,41,32,40,40,66,32,95,52,54,51,41,32,95,57,48,+50,41,41,32,40,40,66,32,40,95,52,54,51,32,40,40,79,32,35,51,+50,41,32,75,41,41,41,32,40,40,66,32,40,95,49,54,48,52,32,40,+40,95,50,54,51,32,95,57,48,50,41,32,95,49,49,51,48,41,41,41,+32,40,95,51,57,52,32,40,85,32,40,90,32,40,40,67,32,79,41,32,+75,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,32,95,49,55,+53,41,41,41,32,40,40,65,32,58,49,51,51,52,32,40,40,40,67,39,+32,40,67,39,32,95,49,51,51,50,41,41,32,95,57,50,53,41,32,95,+52,54,49,41,41,32,40,40,65,32,58,49,51,51,53,32,40,40,40,67,+39,32,95,49,51,51,50,41,32,95,57,50,52,41,32,95,52,54,49,41,+41,32,40,40,65,32,58,49,51,51,54,32,40,85,32,40,75,32,40,95,+51,57,53,32,95,53,54,54,41,41,41,41,32,40,40,65,32,58,49,51,+51,55,32,40,40,66,32,40,66,32,85,41,41,32,40,40,66,32,40,66,+32,40,40,67,39,32,66,41,32,95,49,51,51,50,41,41,41,32,40,40,+66,32,40,66,32,95,52,54,50,41,41,32,80,41,41,41,41,32,40,40,+65,32,58,49,51,51,56,32,40,40,66,32,40,66,32,85,41,41,32,40,+40,66,32,40,66,32,40,66,32,95,49,51,51,50,41,41,41,32,95,57,+50,57,41,41,41,32,40,40,65,32,58,49,51,51,57,32,95,49,50,53,+41,32,40,40,65,32,58,49,51,52,48,32,73,41,32,40,40,65,32,58,+49,51,52,49,32,73,41,32,40,40,65,32,58,49,51,52,50,32,43,41,+32,40,40,65,32,58,49,51,52,51,32,45,41,32,40,40,65,32,58,49,+51,52,52,32,42,41,32,40,40,65,32,58,49,51,52,53,32,113,117,111,+116,41,32,40,40,65,32,58,49,51,52,54,32,114,101,109,41,32,40,40,+65,32,58,49,51,52,55,32,115,117,98,116,114,97,99,116,41,32,40,40,+65,32,58,49,51,52,56,32,110,101,103,41,32,40,40,65,32,58,49,51,+52,57,32,102,97,100,100,41,32,40,40,65,32,58,49,51,53,48,32,102,+115,117,98,41,32,40,40,65,32,58,49,51,53,49,32,102,109,117,108,41,+32,40,40,65,32,58,49,51,53,50,32,102,100,105,118,41,32,40,40,65,+32,58,49,51,53,51,32,102,110,101,103,41,32,40,40,65,32,58,49,51,+53,52,32,102,101,113,41,32,40,40,65,32,58,49,51,53,53,32,102,110,+101,41,32,40,40,65,32,58,49,51,53,54,32,102,108,116,41,32,40,40,+65,32,58,49,51,53,55,32,102,108,101,41,32,40,40,65,32,58,49,51,+53,56,32,102,103,116,41,32,40,40,65,32,58,49,51,53,57,32,102,103,+101,41,32,40,40,65,32,58,49,51,54,48,32,102,115,104,111,119,41,32,+40,40,65,32,58,49,51,54,49,32,102,114,101,97,100,41,32,40,40,65,+32,58,49,51,54,50,32,105,116,111,102,41,32,40,40,65,32,58,49,51,+54,51,32,43,41,32,40,40,65,32,58,49,51,54,52,32,45,41,32,40,+40,65,32,58,49,51,54,53,32,42,41,32,40,40,65,32,58,49,51,54,+54,32,117,113,117,111,116,41,32,40,40,65,32,58,49,51,54,55,32,117,+114,101,109,41,32,40,40,65,32,58,49,51,54,56,32,97,110,100,41,32,+40,40,65,32,58,49,51,54,57,32,111,114,41,32,40,40,65,32,58,49,+51,55,48,32,120,111,114,41,32,40,40,65,32,58,49,51,55,49,32,115,+104,108,41,32,40,40,65,32,58,49,51,55,50,32,115,104,114,41,32,40,+40,65,32,58,49,51,55,51,32,97,115,104,114,41,32,40,40,65,32,58,+49,51,55,52,32,105,110,118,41,32,40,40,65,32,58,49,51,55,53,32,+116,111,68,98,108,41,32,40,40,65,32,58,49,51,55,54,32,116,111,73,+110,116,41,32,40,40,65,32,58,49,51,55,55,32,61,61,41,32,40,40,+65,32,58,49,51,55,56,32,47,61,41,32,40,40,65,32,58,49,51,55,+57,32,60,41,32,40,40,65,32,58,49,51,56,48,32,60,61,41,32,40,+40,65,32,58,49,51,56,49,32,62,41,32,40,40,65,32,58,49,51,56,+50,32,62,61,41,32,40,40,65,32,58,49,51,56,51,32,61,61,41,32,+40,40,65,32,58,49,51,56,52,32,47,61,41,32,40,40,65,32,58,49,+51,56,53,32,117,60,41,32,40,40,65,32,58,49,51,56,54,32,60,61,+41,32,40,40,65,32,58,49,51,56,55,32,62,41,32,40,40,65,32,58,+49,51,56,56,32,62,61,41,32,40,40,65,32,58,49,51,56,57,32,73,+41,32,40,40,65,32,58,49,51,57,48,32,73,41,32,40,40,65,32,58,+49,51,57,49,32,61,61,41,32,40,40,65,32,58,49,51,57,50,32,47,+61,41,32,40,40,65,32,58,49,51,57,51,32,60,41,32,40,40,65,32,+58,49,51,57,52,32,60,61,41,32,40,40,65,32,58,49,51,57,53,32,+62,41,32,40,40,65,32,58,49,51,57,54,32,62,61,41,32,40,40,65,+32,58,49,51,57,55,32,101,114,114,111,114,41,32,40,40,65,32,58,49,+51,57,56,32,89,41,32,40,40,65,32,58,49,51,57,57,32,115,101,113,+41,32,40,40,65,32,58,49,52,48,48,32,99,111,109,112,97,114,101,41,+32,40,40,65,32,58,49,52,48,49,32,101,113,117,97,108,41,32,40,40,+65,32,58,49,52,48,50,32,73,41,32,40,40,65,32,58,49,52,48,51,+32,73,41,32,40,40,65,32,58,49,52,48,52,32,73,41,32,40,40,65,+32,58,49,52,48,53,32,73,79,46,62,62,61,41,32,40,40,65,32,58,+49,52,48,54,32,73,79,46,62,62,41,32,40,40,65,32,58,49,52,48,+55,32,73,79,46,114,101,116,117,114,110,41,32,40,40,65,32,58,49,52,+48,56,32,73,79,46,103,101,116,65,114,103,115,41,32,40,40,65,32,58,+49,52,48,57,32,73,79,46,100,114,111,112,65,114,103,115,41,32,40,40,+65,32,58,49,52,49,48,32,73,79,46,112,101,114,102,111,114,109,73,79,+41,32,40,40,65,32,58,49,52,49,49,32,40,40,66,32,95,49,52,48,+54,41,32,95,49,52,48,57,41,41,32,40,40,65,32,58,49,52,49,50,+32,73,79,46,99,97,116,99,104,41,32,40,40,65,32,58,49,52,49,51,+32,40,114,110,102,32,35,48,41,41,32,40,40,65,32,58,49,52,49,52,+32,40,114,110,102,32,35,49,41,41,32,40,40,65,32,58,49,52,49,53,+32,110,101,119,67,65,83,116,114,105,110,103,41,32,40,40,65,32,58,49,+52,49,54,32,112,101,101,107,67,65,83,116,114,105,110,103,41,32,40,40,+65,32,58,49,52,49,55,32,116,111,80,116,114,41,32,40,40,65,32,58,+49,52,49,56,32,116,111,73,110,116,41,32,40,40,65,32,58,49,52,49,+57,32,94,103,101,116,82,97,119,41,32,40,40,65,32,58,49,52,50,48,+32,40,75,32,40,40,40,95,51,50,32,95,49,52,53,50,41,32,40,40,+40,95,49,52,50,51,32,40,40,80,32,95,52,54,49,41,32,95,52,54,+49,41,41,32,75,41,32,75,41,41,32,40,85,32,40,75,32,40,95,51,+52,32,95,49,52,53,50,41,41,41,41,41,41,32,40,40,65,32,58,49,+52,50,49,32,40,40,40,83,39,32,66,41,32,40,40,66,32,40,95,51,+50,32,95,49,52,53,50,41,41,32,40,40,67,32,95,49,52,54,51,41,+32,95,49,52,52,54,41,41,41,32,40,40,66,32,40,66,32,40,40,67,+39,32,40,95,51,50,32,95,49,52,53,50,41,41,32,40,40,80,32,40,+40,95,51,52,32,95,49,52,53,50,41,32,95,52,54,49,41,41,32,40,+40,40,67,39,32,40,95,51,50,32,95,49,52,53,50,41,41,32,95,49,+52,55,54,41,32,40,40,66,32,40,40,40,83,39,32,95,49,52,56,49,+41,32,95,52,49,49,41,32,40,95,51,52,32,95,49,52,53,50,41,41,+41,32,95,49,54,48,54,41,41,41,41,41,41,32,40,40,66,32,40,40,+67,39,32,66,41,32,40,40,66,32,40,95,51,51,32,95,49,52,53,50,+41,41,32,95,49,52,55,48,41,41,41,32,40,40,66,32,40,40,67,39,+32,40,95,51,50,32,95,49,52,53,50,41,41,32,40,40,67,32,40,40,+40,67,39,32,95,49,52,50,51,41,32,40,40,40,67,39,32,80,41,32,+95,52,50,51,41,32,95,52,54,49,41,41,32,75,41,41,32,75,41,41,+41,32,40,40,66,32,85,41,32,40,40,40,67,39,32,40,67,39,32,66,+41,41,32,40,40,66,32,40,66,32,40,95,51,51,32,95,49,52,53,50,+41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,95,50,54,+49,41,32,95,49,52,55,52,41,41,32,95,49,54,48,55,41,41,41,32,+40,95,51,52,32,95,49,52,53,50,41,41,41,41,41,41,41,41,32,40,+40,65,32,58,49,52,50,50,32,40,40,40,95,51,50,32,95,49,52,53,+50,41,32,95,49,52,49,57,41,32,40,40,40,83,39,32,40,95,51,51,+32,95,49,52,53,50,41,41,32,40,40,40,67,39,32,95,50,54,49,41,+32,40,40,66,32,40,95,52,53,32,95,49,52,53,50,41,41,32,40,40,+67,32,40,95,52,57,55,32,95,50,56,50,41,41,32,35,48,41,41,41,+32,40,95,50,52,32,34,103,101,116,82,97,119,32,102,97,105,108,101,100,+34,41,41,41,32,40,95,51,52,32,95,49,52,53,50,41,41,41,41,32,+40,40,65,32,58,49,52,50,51,32,40,40,66,32,89,41,32,40,40,66,+32,40,66,32,40,66,32,40,66,32,40,40,95,51,51,32,95,49,52,53,+50,41,32,40,95,49,52,54,48,32,95,49,52,53,55,41,41,41,41,41,+41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,40,95,51,50,+32,95,49,52,53,50,41,32,95,49,52,50,50,41,41,41,41,41,32,40,+40,40,83,39,32,40,67,39,32,40,67,39,32,40,67,39,32,67,41,41,+41,41,32,40,40,40,67,39,32,40,83,39,32,40,83,39,32,40,83,39,+32,40,67,39,32,67,41,41,41,41,41,32,40,40,40,67,39,32,40,83,+39,32,40,83,39,32,40,83,39,32,40,67,39,32,40,67,39,32,83,41,+41,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,83,39,32,+40,83,39,32,40,67,39,32,40,67,39,32,40,67,39,32,67,41,41,41,+41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,40,+67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,83,+41,41,41,41,41,41,41,41,32,40,40,40,83,39,32,40,67,39,32,40,+67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,83,39,32,40,+67,39,32,67,41,41,41,41,41,41,41,41,32,40,40,66,32,40,40,67,+39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,83,+39,32,40,67,39,32,40,67,39,32,83,39,41,41,41,41,41,41,41,41,+32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,+40,66,32,40,66,32,67,41,41,41,41,41,41,41,41,32,40,40,40,67,+39,32,40,83,39,32,40,83,39,32,40,67,39,32,40,83,39,32,40,67,+39,32,40,67,39,32,40,67,39,32,40,67,39,32,67,41,41,41,41,41,+41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,40,+67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,+67,39,32,40,67,39,32,67,41,41,41,41,41,41,41,41,41,41,32,40,+40,40,83,39,32,40,83,39,32,40,83,39,32,40,67,39,32,40,67,39,+32,40,83,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,+32,40,67,39,32,83,41,41,41,41,41,41,41,41,41,41,41,32,40,40,+40,83,39,32,40,83,39,32,40,83,39,32,40,67,39,32,40,67,39,32,+40,83,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,+40,67,39,32,40,83,39,32,67,41,41,41,41,41,41,41,41,41,41,41,+41,32,40,40,40,83,39,32,40,83,39,32,40,83,39,32,40,67,39,32,+66,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,40,83,39,+32,83,39,41,32,40,40,66,32,67,39,41,32,40,40,66,32,67,39,41,+32,40,40,66,32,67,39,41,32,40,40,66,32,67,39,41,32,40,40,66,+32,67,39,41,32,40,40,66,32,83,39,41,32,40,40,66,32,67,39,41,+32,40,40,66,32,67,39,41,32,40,40,67,32,61,61,41,32,35,52,41,+41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,40,67,39,32,40,+67,39,32,40,67,39,32,67,41,41,41,32,40,40,66,32,40,66,32,40,+66,32,40,40,83,39,32,67,39,41,32,40,40,66,32,67,39,41,32,40,+40,66,32,67,39,41,32,40,40,66,32,67,39,41,32,40,40,66,32,67,+39,41,32,40,40,66,32,67,39,41,32,40,40,66,32,67,39,41,32,40,+40,66,32,67,39,41,32,40,40,66,32,83,39,41,32,40,40,67,32,61,+61,41,32,35,50,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,+40,40,67,39,32,40,67,39,32,40,67,39,32,67,41,41,41,32,40,40,+66,32,40,66,32,40,66,32,40,40,83,39,32,67,39,41,32,40,40,66,+32,83,39,41,32,40,40,66,32,67,39,41,32,40,40,66,32,67,39,41,+32,40,40,66,32,67,39,41,32,40,40,66,32,67,39,41,32,40,40,66,+32,67,39,41,32,40,40,66,32,67,39,41,32,40,40,66,32,67,39,41,+32,40,40,67,32,61,61,41,32,35,54,41,41,41,41,41,41,41,41,41,+41,41,41,41,32,40,40,40,83,39,32,40,83,39,32,40,83,39,32,67,+41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,40,83,39,32,67,+39,41,32,40,40,66,32,67,39,41,32,40,40,66,32,67,39,41,32,40,+40,66,32,67,39,41,32,40,40,66,32,67,39,41,32,40,40,66,32,67,+39,41,32,40,40,66,32,83,39,41,32,40,40,66,32,67,39,41,32,40,+40,66,32,67,39,41,32,40,40,67,32,61,61,41,32,35,49,41,41,41,+41,41,41,41,41,41,41,41,41,41,32,40,40,40,83,39,32,40,83,39,+32,40,83,39,32,67,41,41,41,32,40,40,66,32,40,66,32,40,66,32,+40,40,83,39,32,67,39,41,32,40,40,66,32,67,39,41,32,40,40,66,+32,67,39,41,32,40,40,66,32,67,39,41,32,40,40,66,32,67,39,41,+32,40,40,66,32,67,39,41,32,40,40,66,32,67,39,41,32,40,40,66,+32,67,39,41,32,40,40,66,32,67,39,41,32,40,40,67,32,61,61,41,+32,35,53,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,40,+67,39,32,40,67,39,32,40,67,39,32,67,41,41,41,32,40,40,66,32,+40,66,32,40,66,32,40,40,83,39,32,67,39,41,32,40,40,66,32,67,+39,41,32,40,40,66,32,67,39,41,32,40,40,66,32,67,39,41,32,40,+40,66,32,67,39,41,32,40,40,66,32,67,39,41,32,40,40,66,32,67,+39,41,32,40,40,66,32,83,39,41,32,40,40,66,32,67,39,41,32,40,+40,67,32,61,61,41,32,35,56,41,41,41,41,41,41,41,41,41,41,41,+41,41,32,40,40,66,32,40,66,32,40,66,32,40,40,83,39,32,66,41,+32,40,66,39,32,40,66,39,32,40,66,39,32,40,66,39,32,40,66,39,+32,40,66,39,32,40,40,66,32,67,39,41,32,40,40,67,32,61,61,41,+32,35,49,50,55,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,+40,67,39,32,40,67,39,32,40,67,39,32,67,41,41,41,32,40,40,66,+32,40,66,32,40,66,32,40,40,83,39,32,67,39,41,32,40,40,66,32,+67,39,41,32,40,40,66,32,67,39,41,32,40,40,66,32,67,39,41,32,+40,40,66,32,67,39,41,32,40,40,66,32,83,39,41,32,40,40,66,32,+67,39,41,32,40,40,66,32,67,39,41,32,40,40,67,32,61,61,41,32,+35,49,51,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,66,32,+40,66,32,40,66,32,40,40,83,39,32,66,41,32,40,66,39,32,40,66,+39,32,40,66,39,32,40,66,39,32,40,40,66,32,67,39,41,32,40,40,+66,32,67,39,41,32,40,40,67,32,61,61,41,32,35,49,48,41,41,41,+41,41,41,41,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,+67,39,32,67,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,40,+83,39,32,67,39,41,32,40,40,66,32,67,39,41,32,40,40,66,32,67,+39,41,32,40,40,66,32,67,39,41,32,40,40,66,32,83,39,41,32,40,+40,66,32,67,39,41,32,40,40,66,32,67,39,41,32,40,40,67,32,61,+61,41,32,35,49,52,41,41,41,41,41,41,41,41,41,41,41,32,40,40,+40,67,39,32,40,67,39,32,40,67,39,32,67,41,41,41,32,40,40,66,+32,40,66,32,40,66,32,40,40,83,39,32,67,39,41,32,40,40,66,32,+67,39,41,32,40,40,66,32,67,39,41,32,40,40,66,32,83,39,41,32,+40,40,66,32,67,39,41,32,40,40,66,32,67,39,41,32,40,40,66,32,+67,39,41,32,40,40,67,32,61,61,41,32,35,49,53,41,41,41,41,41,+41,41,41,41,41,41,32,40,40,40,83,39,32,40,67,39,32,40,67,39,+32,40,67,39,32,40,67,39,32,40,67,39,32,66,41,41,41,41,41,41,+32,40,40,66,32,40,66,32,40,66,32,40,40,83,39,32,66,41,32,40,+66,39,32,40,40,66,32,67,39,41,32,40,40,66,32,67,39,41,32,40,+40,66,32,67,39,41,32,40,40,66,32,67,39,41,32,40,40,67,32,61,+61,41,32,35,50,49,41,41,41,41,41,41,41,41,41,41,32,40,40,40,+83,39,32,40,83,39,32,40,83,39,32,67,41,41,41,32,40,40,66,32,+40,66,32,40,66,32,40,40,83,39,32,67,39,41,32,40,40,66,32,67,+39,41,32,40,40,66,32,67,39,41,32,40,40,66,32,67,39,41,32,40,+40,66,32,67,39,41,32,40,40,66,32,67,39,41,32,40,40,67,32,61,+61,41,32,35,49,49,41,41,41,41,41,41,41,41,41,41,32,40,40,40,+67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,83,39,32,66,+41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,66,+39,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,66,+39,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,+66,32,40,67,39,32,66,41,41,41,41,41,41,32,40,40,66,32,40,66,+32,40,66,32,40,40,83,39,32,66,41,32,40,66,39,32,40,40,67,32,+61,61,41,32,35,50,55,41,41,41,41,41,41,32,40,40,66,32,40,66,+32,40,66,32,40,40,83,39,32,40,67,39,32,66,41,41,32,40,40,40,+83,39,32,95,49,50,49,41,32,40,40,67,32,40,95,53,48,48,32,95,+50,56,50,41,41,32,35,51,50,41,41,32,40,40,67,32,40,95,52,57,+55,32,95,50,56,50,41,41,32,35,49,50,55,41,41,41,41,41,41,32,+40,40,40,67,39,32,40,67,39,32,40,67,39,32,66,41,41,41,32,40,+40,66,32,40,66,32,40,66,32,40,67,39,32,40,40,83,39,32,40,95,+51,51,32,95,49,52,53,50,41,41,32,95,49,52,54,53,41,41,41,41,+41,32,40,40,66,32,40,66,32,40,40,83,39,32,66,41,32,40,66,39,+32,40,40,66,32,40,95,51,51,32,95,49,52,53,50,41,41,32,95,49,+52,55,48,41,41,41,41,41,32,40,40,66,32,40,66,32,40,40,83,39,+32,40,67,39,32,66,41,41,32,40,40,66,32,40,66,32,40,95,51,51,+32,95,49,52,53,50,41,41,41,32,40,40,66,32,85,41,32,95,52,49,+49,41,41,41,41,41,32,40,40,40,67,39,32,66,41,32,67,39,41,32,+40,67,32,95,52,54,50,41,41,41,41,41,41,32,95,49,51,54,41,41,+41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,+66,32,40,40,95,51,50,32,95,49,52,53,50,41,32,95,49,52,50,50,+41,41,41,41,41,41,32,40,40,40,83,39,32,40,67,39,32,40,67,39,+32,40,67,39,32,40,67,39,32,67,41,41,41,41,41,32,40,40,66,32,+40,66,32,40,66,32,40,66,32,40,66,32,40,67,32,40,40,67,32,40,+95,50,48,51,32,95,50,56,49,41,41,32,40,95,49,51,55,32,35,57,+49,41,41,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,+40,66,32,40,66,32,40,40,95,51,50,32,95,49,52,53,50,41,32,95,+49,52,50,50,41,41,41,41,41,41,32,40,40,40,67,39,32,40,67,39,+32,40,67,39,32,40,67,39,32,40,67,39,32,66,41,41,41,41,41,32,+40,40,66,32,40,66,32,40,67,39,32,40,67,39,32,67,41,41,41,41,+32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,83,32,40,40,67,+32,61,61,41,32,35,54,53,41,41,41,41,41,41,32,40,40,66,32,40,+66,32,40,67,39,32,67,41,41,41,32,40,40,66,32,40,66,32,40,66,+32,40,83,32,40,40,67,32,61,61,41,32,35,54,54,41,41,41,41,41,+32,40,40,66,32,40,67,39,32,67,41,41,32,40,40,66,32,40,66,32,+40,83,32,40,40,67,32,61,61,41,32,35,54,55,41,41,41,41,32,40,+40,66,32,67,41,32,40,67,32,40,40,67,32,61,61,41,32,35,54,56,+41,41,41,41,41,41,41,41,41,41,32,95,49,51,54,41,41,41,41,32,+73,41,41,41,41,41,32,40,40,66,32,40,66,32,40,40,83,39,32,40,+95,51,51,32,95,49,52,53,50,41,41,32,95,49,52,55,48,41,41,41,+32,40,40,66,32,40,66,32,40,40,67,39,32,40,95,51,51,32,95,49,+52,53,50,41,41,32,40,40,66,32,40,95,50,54,49,32,95,49,52,55,+48,41,41,32,40,40,66,32,40,95,50,54,49,32,95,51,57,51,41,41,+32,40,40,40,67,39,32,95,52,52,54,41,32,95,52,49,49,41,32,34,+92,56,38,32,92,56,38,34,41,41,41,41,41,41,32,40,82,32,75,41,+41,41,41,41,41,32,40,40,66,32,40,67,32,40,95,51,51,32,95,49,+52,53,50,41,41,41,32,40,40,80,32,75,41,32,75,41,41,41,41,41,+32,73,41,41,41,32,73,41,41,41,41,32,73,41,41,41,41,32,73,41,+41,41,32,40,40,66,32,40,66,32,40,40,83,39,32,40,95,51,51,32,+95,49,52,53,50,41,41,32,95,49,52,55,48,41,41,41,32,40,40,67,+32,40,40,40,67,39,32,67,39,41,32,67,39,41,32,40,40,67,39,32,+95,52,54,51,41,32,95,52,50,51,41,41,41,32,75,41,41,41,41,41,+32,40,40,66,32,40,40,83,39,32,66,41,32,40,40,66,32,40,67,39,+32,40,95,51,51,32,95,49,52,53,50,41,41,41,32,40,40,66,32,85,+41,32,95,52,49,49,41,41,41,41,32,40,40,40,67,39,32,66,41,32,+40,66,39,32,40,85,32,75,41,41,41,32,40,40,66,32,95,52,54,51,+41,32,95,52,50,51,41,41,41,41,41,41,32,73,41,41,41,32,73,41,+41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,66,41,41,+41,32,40,40,66,32,40,40,83,39,32,40,83,39,32,67,39,41,41,32,+40,40,66,32,40,66,32,67,39,41,41,32,40,40,40,67,39,32,66,41,+32,40,40,66,32,95,49,50,49,41,32,95,51,57,50,41,41,32,95,51,+57,50,41,41,41,41,32,40,40,66,32,40,66,32,40,67,32,40,67,39,+32,66,41,41,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,+66,32,40,66,32,40,66,32,40,40,83,39,32,40,95,51,51,32,95,49,+52,53,50,41,41,32,95,49,52,55,48,41,41,41,41,32,40,40,66,32,+40,66,32,40,66,32,40,66,32,40,40,95,51,51,32,95,49,52,53,50,+41,32,40,95,49,52,54,53,32,35,51,50,41,41,41,41,41,41,32,40,+66,32,40,40,67,39,32,40,83,39,32,40,95,51,51,32,95,49,52,53,+50,41,41,41,32,40,40,67,32,66,41,32,40,40,40,67,39,32,40,95,+52,55,57,32,95,50,55,55,41,41,32,95,52,49,49,41,32,35,49,41,+41,41,41,41,41,41,41,41,41,32,40,85,32,95,52,55,54,41,41,41,+41,32,40,40,66,32,40,40,67,39,32,66,41,32,40,67,39,32,66,41,+41,41,32,40,40,66,32,40,66,32,40,40,67,39,32,66,41,32,40,66,+39,32,40,40,66,32,40,95,51,51,32,95,49,52,53,50,41,41,32,40,+85,32,35,49,41,41,41,41,41,41,32,40,40,40,67,39,32,66,41,32,+40,66,39,32,67,41,41,32,40,67,32,95,52,54,50,41,41,41,41,41,+41,32,40,40,66,32,40,40,67,39,32,66,41,32,40,67,39,32,66,41,+41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,+32,40,40,83,39,32,66,41,32,40,40,66,32,40,95,51,51,32,95,49,+52,53,50,41,41,32,40,85,32,35,49,41,41,41,41,41,32,40,40,66,+32,40,40,83,39,32,66,41,32,40,66,39,32,40,40,66,32,40,95,51,+51,32,95,49,52,53,50,41,41,32,95,49,52,55,48,41,41,41,41,32,+40,40,66,32,40,66,32,40,66,32,40,66,32,40,40,95,51,51,32,95,+49,52,53,50,41,32,40,95,49,52,54,53,32,35,51,50,41,41,41,41,+41,41,32,40,40,66,32,40,40,83,39,32,40,67,39,32,66,41,41,32,+40,40,66,32,40,66,32,40,95,51,51,32,95,49,52,53,50,41,41,41,+32,40,40,66,32,85,41,32,40,40,40,67,39,32,40,95,52,55,57,32,+95,50,55,55,41,41,32,95,52,49,49,41,32,35,49,41,41,41,41,41,+32,67,41,41,41,41,41,41,41,41,32,40,40,66,32,95,49,52,55,48,+41,32,40,40,67,32,95,52,52,54,41,32,35,56,41,41,41,41,32,40,+40,66,32,40,66,32,85,41,41,32,40,40,66,32,40,66,32,95,52,55,+55,41,41,32,40,40,66,32,95,52,54,51,41,32,95,52,50,51,41,41,+41,41,41,41,41,32,40,40,40,67,39,32,66,41,32,66,41,32,40,40,+40,67,39,32,66,41,32,40,66,39,32,80,41,41,32,40,40,67,32,40,+40,40,67,39,32,67,39,41,32,40,40,66,32,83,39,41,32,67,39,41,+41,32,40,40,66,32,40,66,32,80,41,41,32,40,67,32,95,52,54,50,+41,41,41,41,32,73,41,41,41,41,41,32,40,40,40,67,39,32,66,41,+32,66,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,40,67,39,+32,66,41,41,32,85,41,41,32,40,40,67,32,40,40,40,67,39,32,67,+39,41,32,40,40,66,32,83,39,41,32,67,39,41,41,32,40,40,66,32,+40,66,32,40,67,32,80,41,41,41,32,40,67,32,95,52,54,50,41,41,+41,41,32,73,41,41,41,41,41,32,40,40,40,67,39,32,66,41,32,40,+66,39,32,40,95,51,51,32,95,49,52,53,50,41,41,41,32,40,40,66,+32,40,40,83,39,32,40,95,51,51,32,95,49,52,53,50,41,41,32,95,+49,52,55,48,41,41,32,40,40,67,32,40,40,40,67,39,32,67,39,41,+32,95,49,52,50,51,41,32,95,52,50,51,41,41,32,75,41,41,41,41,+41,32,40,40,66,32,40,40,83,39,32,40,95,51,51,32,95,49,52,53,+50,41,41,32,95,49,52,55,48,41,41,32,40,40,66,32,40,66,32,40,+95,50,54,49,32,95,49,52,55,48,41,41,41,32,40,40,66,32,40,66,+32,40,95,50,54,49,32,95,51,57,51,41,41,41,32,40,40,40,67,39,+32,40,67,39,32,95,52,52,54,41,41,32,40,40,40,67,39,32,66,41,+32,40,40,66,32,40,95,52,55,57,32,95,50,55,55,41,41,32,95,52,+49,49,41,41,32,95,52,49,49,41,41,32,34,92,56,38,32,92,56,38,+34,41,41,41,41,41,41,32,40,40,66,32,40,66,32,82,41,41,32,40,+40,66,32,40,66,32,40,40,83,39,32,66,41,32,40,40,66,32,40,95,+51,51,32,95,49,52,53,50,41,41,32,95,49,52,54,53,41,41,41,41,+32,40,40,40,67,39,32,66,41,32,66,41,32,40,67,32,95,52,54,50,+41,41,41,41,41,41,32,73,41,41,32,40,40,66,32,40,66,32,40,40,+95,51,51,32,95,49,52,53,50,41,32,40,95,49,52,54,53,32,35,49,+48,41,41,41,41,32,40,40,66,32,40,66,32,40,40,95,51,51,32,95,+49,52,53,50,41,32,40,95,49,52,54,48,32,95,49,52,53,55,41,41,+41,41,32,40,40,66,32,40,40,67,39,32,40,66,32,40,95,51,52,32,+95,49,52,53,50,41,41,41,32,40,40,40,83,39,32,40,67,39,32,80,+41,41,32,40,40,66,32,40,83,32,95,52,54,51,41,41,32,40,40,40,+67,39,32,66,41,32,40,85,32,95,52,54,49,41,41,32,40,40,66,32,+40,83,32,40,85,32,95,52,54,49,41,41,41,32,40,40,66,32,90,41,+32,40,40,66,32,90,41,32,40,40,40,67,39,32,67,41,32,40,40,67,+32,40,40,40,83,39,32,83,39,41,32,40,40,66,32,95,49,50,49,41,+32,40,40,66,32,95,49,50,50,41,32,95,51,57,50,41,41,41,32,40,+40,66,32,40,67,32,40,95,50,48,50,32,95,49,51,51,41,41,41,32,+95,52,53,53,41,41,41,32,40,40,67,32,79,41,32,75,41,41,41,32,+95,52,54,49,41,41,41,41,41,41,41,32,73,41,41,41,32,40,40,40,+83,39,32,95,52,54,51,41,32,40,40,66,32,95,52,50,51,41,32,95,+53,54,53,41,41,32,95,53,54,54,41,41,41,41,41,41,41,41,41,32,+40,40,65,32,58,49,52,50,52,32,94,117,110,108,105,110,107,41,32,40,+40,65,32,58,49,52,50,53,32,40,40,40,67,39,32,40,95,51,50,32,+95,49,52,53,50,41,41,32,40,40,67,32,95,53,57,49,41,32,95,49,+52,50,52,41,41,32,40,40,40,67,39,32,95,50,54,49,41,32,40,40,+66,32,40,95,52,53,32,95,49,52,53,50,41,41,32,40,40,67,32,40,+95,50,48,51,32,95,50,56,49,41,41,32,35,48,41,41,41,32,40,95,+50,52,32,34,114,101,109,111,118,101,70,105,108,101,32,102,97,105,108,101,+100,34,41,41,41,41,32,40,40,65,32,58,49,52,50,54,32,95,49,52,+48,56,41,32,40,40,65,32,58,49,52,50,55,32,95,49,52,49,49,41,+32,40,40,65,32,58,49,52,50,56,32,94,103,101,116,101,110,118,41,32,+40,40,65,32,58,49,52,50,57,32,40,40,40,67,39,32,40,95,51,50,+32,95,49,52,53,50,41,41,32,40,40,67,32,95,53,57,49,41,32,95,+49,52,50,56,41,41,32,40,40,67,32,40,40,83,32,40,40,67,32,40,+95,50,48,50,32,95,53,57,55,41,41,32,95,53,57,57,41,41,32,40,+40,66,32,40,40,95,50,55,54,32,95,49,52,53,48,41,32,95,52,55,+55,41,41,32,95,53,57,50,41,41,41,32,40,40,95,51,52,32,95,49,+52,53,50,41,32,95,52,55,54,41,41,41,41,32,40,40,65,32,58,49,+52,51,48,32,73,41,32,40,40,65,32,58,49,52,51,49,32,73,79,46,+115,101,114,105,97,108,105,122,101,41,32,40,40,65,32,58,49,52,51,50,+32,73,79,46,112,114,105,110,116,41,32,40,40,65,32,58,49,52,51,51,+32,73,79,46,100,101,115,101,114,105,97,108,105,122,101,41,32,40,40,65,+32,58,49,52,51,52,32,73,79,46,115,116,100,105,110,41,32,40,40,65,+32,58,49,52,51,53,32,73,79,46,115,116,100,111,117,116,41,32,40,40,+65,32,58,49,52,51,54,32,73,79,46,115,116,100,101,114,114,41,32,40,+40,65,32,58,49,52,51,55,32,94,102,111,112,101,110,41,32,40,40,65,+32,58,49,52,51,56,32,94,102,99,108,111,115,101,41,32,40,40,65,32,+58,49,52,51,57,32,94,102,102,108,117,115,104,41,32,40,40,65,32,58,+49,52,52,48,32,94,102,103,101,116,99,41,32,40,40,65,32,58,49,52,+52,49,32,94,102,112,117,116,99,41,32,40,40,65,32,58,49,52,52,50,+32,94,103,101,116,84,105,109,101,77,105,108,108,105,41,32,40,40,65,32,+58,49,52,52,51,32,40,40,95,50,48,49,32,40,95,50,48,50,32,95,+53,57,55,41,41,32,40,95,50,48,53,32,95,49,52,52,51,41,41,41,+32,40,40,65,32,58,49,52,52,52,32,40,40,40,95,49,53,56,56,32,+40,95,49,53,57,50,32,95,49,52,52,52,41,41,32,40,40,66,32,40,+95,52,54,51,32,34,72,97,110,100,108,101,45,34,41,41,32,40,95,49,+53,57,48,32,95,53,57,56,41,41,41,32,40,95,49,53,57,52,32,95,+49,52,52,52,41,41,41,32,40,40,65,32,58,49,52,52,53,32,40,95,+49,52,51,48,32,95,53,57,57,41,41,32,40,40,65,32,58,49,52,52,+54,32,40,90,32,40,90,32,75,41,41,41,32,40,40,65,32,58,49,52,+52,55,32,40,75,32,40,90,32,75,41,41,41,32,40,40,65,32,58,49,+52,52,56,32,40,75,32,40,75,32,75,41,41,41,32,40,40,65,32,58,+49,52,52,57,32,40,75,32,40,75,32,65,41,41,41,32,40,40,65,32,+58,49,52,53,48,32,40,40,95,50,55,49,32,40,40,66,32,40,67,32,+95,49,52,48,53,41,41,32,40,66,32,95,49,52,48,55,41,41,41,32,+40,95,50,55,53,32,95,49,52,53,48,41,41,41,32,40,40,65,32,58,+49,52,53,49,32,40,40,40,40,40,95,49,49,32,95,49,52,53,48,41,+32,95,49,52,48,55,41,32,40,95,51,56,32,95,49,52,53,50,41,41,+32,40,95,49,57,32,95,49,52,53,49,41,41,32,40,95,50,48,32,95,+49,52,53,49,41,41,41,32,40,40,65,32,58,49,52,53,50,32,40,40,+40,40,95,51,48,32,95,49,52,53,49,41,32,95,49,52,48,53,41,32,+95,49,52,48,54,41,32,95,49,52,48,55,41,41,32,40,40,65,32,58,+49,52,53,51,32,40,40,95,51,57,32,95,49,52,53,50,41,32,95,50,+52,41,41,32,40,40,65,32,58,49,52,53,52,32,95,49,52,51,49,41,+32,40,40,65,32,58,49,52,53,53,32,95,49,52,51,51,41,32,40,40,+65,32,58,49,52,53,54,32,95,49,52,51,52,41,32,40,40,65,32,58,+49,52,53,55,32,95,49,52,51,53,41,32,40,40,65,32,58,49,52,53,+56,32,95,49,52,51,54,41,32,40,40,65,32,58,49,52,53,57,32,40,+40,40,67,39,32,40,95,51,51,32,95,49,52,53,50,41,41,32,95,49,+52,51,56,41,32,40,40,95,51,52,32,95,49,52,53,50,41,32,95,49,+51,52,49,41,41,41,32,40,40,65,32,58,49,52,54,48,32,40,40,40,+67,39,32,40,95,51,51,32,95,49,52,53,50,41,41,32,95,49,52,51,+57,41,32,40,40,95,51,52,32,95,49,52,53,50,41,32,95,49,51,52,+49,41,41,41,32,40,40,65,32,58,49,52,54,49,32,40,40,40,67,39,+32,40,95,51,50,32,95,49,52,53,50,41,41,32,95,49,52,52,48,41,+32,40,40,67,32,40,40,83,32,40,40,67,32,40,95,50,48,50,32,95,+50,56,49,41,41,32,35,45,49,41,41,32,40,40,66,32,40,95,51,52,+32,95,49,52,53,50,41,41,32,95,49,51,54,41,41,41,32,40,95,50,+52,32,34,104,71,101,116,67,104,97,114,58,32,69,79,70,34,41,41,41,+41,32,40,40,65,32,58,49,52,54,50,32,40,40,40,67,39,32,40,67,+39,32,40,95,51,51,32,95,49,52,53,50,41,41,41,32,40,40,67,39,+32,95,49,52,52,49,41,32,95,49,51,55,41,41,32,40,40,95,51,52,+32,95,49,52,53,50,41,32,95,49,51,52,49,41,41,41,32,40,40,65,+32,58,49,52,54,51,32,40,40,40,67,39,32,40,67,39,32,40,95,51,+50,32,95,49,52,53,50,41,41,41,32,40,40,40,67,39,32,66,41,32,+40,40,66,32,95,50,54,49,41,32,95,53,57,49,41,41,32,40,40,40,+67,39,32,66,41,32,40,40,66,32,95,50,54,49,41,32,40,40,66,32,+95,53,57,49,41,32,40,40,67,32,40,40,67,32,40,40,80,32,40,40,+79,32,35,49,49,52,41,32,75,41,41,32,40,40,79,32,35,49,49,57,+41,32,75,41,41,41,32,40,40,79,32,35,57,55,41,32,75,41,41,41,+32,34,119,43,34,41,41,41,41,32,95,49,52,51,55,41,41,41,32,40,+40,67,32,40,40,83,32,40,40,67,32,40,95,50,48,50,32,95,49,52,+52,51,41,41,32,95,49,52,52,53,41,41,32,40,40,66,32,40,95,51,+52,32,95,49,52,53,50,41,41,32,95,52,55,55,41,41,41,32,40,40,+95,51,52,32,95,49,52,53,50,41,32,95,52,55,54,41,41,41,41,32,+40,40,65,32,58,49,52,54,52,32,40,40,40,83,39,32,40,67,39,32,+40,95,51,50,32,95,49,52,53,50,41,41,41,32,95,49,52,54,51,41,+32,40,40,40,67,39,32,80,41,32,40,40,66,32,95,50,52,41,32,40,+95,52,54,51,32,34,111,112,101,110,70,105,108,101,58,32,99,97,110,110,+111,116,32,111,112,101,110,32,34,41,41,41,32,40,95,51,52,32,95,49,+52,53,50,41,41,41,41,32,40,40,65,32,58,49,52,54,53,32,40,95,+49,52,54,50,32,95,49,52,53,55,41,41,32,40,40,65,32,58,49,52,+54,54,32,40,95,49,52,54,49,32,95,49,52,53,54,41,41,32,40,40,+65,32,58,49,52,54,55,32,40,40,40,83,39,32,95,49,52,56,49,41,+32,95,49,52,49,52,41,32,40,95,49,52,51,50,32,95,49,52,53,55,+41,41,41,32,40,40,65,32,58,49,52,54,56,32,40,95,49,52,51,50,+32,95,49,52,53,55,41,41,32,40,40,65,32,58,49,52,54,57,32,40,+40,66,32,40,66,32,95,49,52,55,50,41,41,32,95,49,53,57,48,41,+41,32,40,40,65,32,58,49,52,55,48,32,40,95,49,52,55,49,32,95,+49,52,53,55,41,41,32,40,40,65,32,58,49,52,55,49,32,40,40,66,+32,40,95,52,52,32,95,49,52,53,50,41,41,32,95,49,52,54,50,41,+41,32,40,40,65,32,58,49,52,55,50,32,40,95,49,52,55,51,32,95,+49,52,53,55,41,41,32,40,40,65,32,58,49,52,55,51,32,40,40,40,+83,39,32,40,67,39,32,40,95,51,51,32,95,49,52,53,50,41,41,41,+32,95,49,52,55,49,41,32,40,40,67,32,95,49,52,54,50,41,32,35,+49,48,41,41,41,32,40,40,65,32,58,49,52,55,52,32,40,40,40,67,+39,32,66,41,32,40,40,66,32,40,95,51,50,32,95,49,52,53,50,41,+41,32,40,40,67,32,95,49,52,54,52,41,32,95,49,52,52,55,41,41,+41,32,40,40,40,67,39,32,40,83,39,32,40,95,51,51,32,95,49,52,+53,50,41,41,41,32,40,67,32,95,49,52,55,49,41,41,32,95,49,52,+53,57,41,41,41,32,40,40,65,32,58,49,52,55,53,32,40,40,40,67,+39,32,40,95,51,50,32,95,49,52,53,50,41,41,32,40,40,67,32,95,+49,52,54,52,41,32,95,49,52,52,54,41,41,32,40,40,40,67,39,32,+40,95,51,50,32,95,49,52,53,50,41,41,32,95,49,52,55,54,41,32,+40,95,51,52,32,95,49,52,53,50,41,41,41,41,32,40,40,65,32,58,+49,52,55,54,32,40,40,40,83,39,32,40,95,51,50,32,95,49,52,53,+50,41,41,32,95,49,52,52,48,41,32,40,40,40,83,39,32,67,41,32,+40,40,66,32,40,83,32,40,40,67,32,40,95,50,48,50,32,95,50,56,+49,41,41,32,35,45,49,41,41,41,32,40,40,40,67,39,32,66,41,32,+40,40,66,32,40,95,51,50,32,95,49,52,53,50,41,41,32,40,40,66,+32,95,49,52,56,48,41,32,95,49,52,55,54,41,41,41,32,40,40,66,+32,40,66,32,40,95,51,52,32,95,49,52,53,50,41,41,41,32,40,40,+66,32,95,52,54,50,41,32,95,49,51,54,41,41,41,41,41,32,40,40,+40,67,39,32,40,95,51,51,32,95,49,52,53,50,41,41,32,95,49,52,+53,57,41,32,40,40,95,51,52,32,95,49,52,53,50,41,32,75,41,41,+41,41,41,32,40,40,65,32,58,49,52,55,55,32,40,40,40,67,39,32,+66,41,32,40,40,66,32,40,95,51,50,32,95,49,52,53,50,41,41,32,+40,40,67,32,95,49,52,54,52,41,32,95,49,52,52,55,41,41,41,32,+40,40,40,67,39,32,40,83,39,32,40,95,51,51,32,95,49,52,53,50,+41,41,41,32,40,67,32,95,49,52,53,52,41,41,32,95,49,52,53,57,+41,41,41,32,40,40,65,32,58,49,52,55,56,32,40,40,40,67,39,32,+40,95,51,50,32,95,49,52,53,50,41,41,32,40,40,67,32,95,49,52,+54,52,41,32,95,49,52,52,54,41,41,32,40,40,40,83,39,32,40,95,+51,50,32,95,49,52,53,50,41,41,32,95,49,52,53,53,41,32,40,40,+40,67,39,32,66,41,32,40,40,66,32,40,95,51,51,32,95,49,52,53,+50,41,41,32,95,49,52,53,57,41,41,32,40,95,51,52,32,95,49,52,+53,50,41,41,41,41,41,32,40,40,65,32,58,49,52,55,57,32,95,49,+52,52,50,41,32,40,40,65,32,58,49,52,56,48,32,40,40,66,32,40,+95,51,52,32,95,49,52,53,50,41,41,32,95,49,52,49,48,41,41,32,+40,40,65,32,58,49,52,56,49,32,95,49,51,57,57,41,32,40,40,65,+32,58,49,52,56,50,32,40,75,32,40,75,32,40,40,95,51,52,32,95,+49,52,53,50,41,32,95,49,51,52,49,41,41,41,41,32,40,40,65,32,+58,49,52,56,51,32,94,116,109,112,110,97,109,101,41,32,40,40,65,32,+58,49,52,56,52,32,40,40,66,32,40,40,40,67,39,32,40,95,51,50,+32,95,49,52,53,50,41,41,32,40,40,40,83,39,32,95,50,54,49,41,+32,40,40,66,32,95,53,57,49,41,32,40,85,32,75,41,41,41,32,40,+40,40,67,39,32,95,50,54,51,41,32,40,40,66,32,95,53,57,49,41,+32,40,85,32,65,41,41,41,32,95,49,52,56,51,41,41,41,32,40,40,+40,83,39,32,40,95,51,50,32,95,49,52,53,50,41,41,32,95,53,57,+50,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,40,95,51,51,+32,95,49,52,53,50,41,41,32,95,53,57,52,41,41,32,40,40,40,83,+39,32,40,95,51,50,32,95,49,52,53,50,41,41,32,40,40,67,32,95,+49,52,54,52,41,32,95,49,52,52,55,41,41,32,40,40,66,32,40,66,+32,40,95,51,52,32,95,49,52,53,50,41,41,41,32,80,41,41,41,41,+41,41,32,40,40,40,83,39,32,40,95,52,50,54,32,40,40,67,32,40,+95,50,48,51,32,95,49,51,49,41,41,32,35,52,54,41,41,41,32,95,+52,50,51,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,80,41,+32,40,40,67,32,80,41,32,75,41,41,41,32,40,90,32,40,40,66,32,+40,40,67,39,32,80,41,32,95,52,50,51,41,41,32,40,40,66,32,40,+95,52,54,50,32,35,52,54,41,41,32,95,52,50,51,41,41,41,41,41,+41,41,32,40,40,65,32,58,49,52,56,53,32,85,41,32,40,40,65,32,+58,49,52,56,54,32,40,85,32,73,41,41,32,40,40,65,32,58,49,52,+56,55,32,40,75,32,40,110,111,68,101,102,97,117,108,116,32,34,80,114,+105,110,116,79,114,82,117,110,46,112,114,105,110,116,79,114,82,117,110,34,+41,41,41,32,40,40,65,32,58,49,52,56,56,32,40,95,49,52,56,53,+32,73,41,41,32,40,40,65,32,58,49,52,56,57,32,40,40,66,32,95,+49,52,56,53,41,32,40,40,66,32,40,66,32,95,49,52,55,50,41,41,+32,95,49,53,57,48,41,41,41,32,40,40,65,32,58,49,52,57,48,32,+94,115,121,115,116,101,109,41,32,40,40,65,32,58,49,52,57,49,32,40,+40,40,67,39,32,40,95,51,50,32,95,49,52,53,50,41,41,32,40,40,+67,32,95,53,57,49,41,32,95,49,52,57,48,41,41,32,40,40,40,83,+39,32,95,50,54,49,41,32,40,40,66,32,40,95,52,53,32,95,49,52,+53,50,41,41,32,40,40,67,32,40,95,50,48,51,32,95,50,56,49,41,+41,32,35,48,41,41,41,32,40,40,66,32,40,95,50,54,49,32,95,50,+52,41,41,32,40,40,66,32,40,95,52,54,51,32,34,99,97,108,108,67,+111,109,109,97,110,100,58,32,102,97,105,108,101,100,32,34,41,41,32,40,+95,49,53,57,48,32,95,50,56,51,41,41,41,41,41,41,32,40,40,65,+32,58,49,52,57,50,32,40,40,66,32,40,66,32,67,41,41,32,80,41,+41,32,40,40,65,32,58,49,52,57,51,32,35,49,48,48,48,48,48,48,+48,48,48,41,32,40,40,65,32,58,49,52,57,52,32,40,40,40,95,49,+52,57,50,32,95,49,52,57,51,41,32,95,52,54,49,41,32,95,52,54,+49,41,41,32,40,40,65,32,58,49,52,57,53,32,40,40,83,32,66,41,+32,40,40,66,32,40,40,83,39,32,66,41,32,40,66,39,32,66,41,41,+41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,90,41,+41,41,41,41,32,40,40,67,39,32,40,67,39,32,40,67,39,32,40,67,+39,32,67,41,41,41,41,32,40,40,66,32,40,40,83,39,32,66,41,32,+40,66,39,32,40,40,66,32,40,83,39,32,67,39,41,41,32,40,95,52,+57,55,32,95,50,56,50,41,41,41,41,41,32,40,40,67,39,32,40,67,+39,32,40,67,39,32,67,41,41,41,32,40,40,40,83,39,32,66,41,32,+40,66,39,32,40,40,66,32,40,67,39,32,67,39,41,41,32,40,67,32,+40,95,52,57,55,32,95,50,56,50,41,41,41,41,41,32,40,40,40,67,+39,32,40,67,39,32,66,41,41,32,40,40,66,32,66,39,41,32,95,49,+52,57,50,41,41,32,95,52,54,51,41,41,41,41,41,41,41,41,41,32,+40,40,65,32,58,49,52,57,54,32,40,95,52,48,48,32,95,49,52,57,+53,41,41,32,40,40,65,32,58,49,52,57,55,32,80,41,32,40,40,65,+32,58,49,52,57,56,32,85,41,32,40,40,65,32,58,49,52,57,57,32,+40,85,32,73,41,41,32,40,40,65,32,58,49,53,48,48,32,40,40,95,+50,55,49,32,40,40,66,32,40,66,32,40,95,50,54,49,32,95,49,52,+57,56,41,41,41,32,40,40,66,32,40,40,67,39,32,67,41,32,95,49,+52,57,57,41,41,32,40,40,66,32,40,66,32,95,49,52,57,55,41,41,+32,40,40,66,32,95,51,57,52,41,32,40,40,66,32,85,41,32,40,40,+40,67,39,32,40,67,39,32,40,67,39,32,79,41,41,41,32,40,66,32,+80,41,41,32,75,41,41,41,41,41,41,41,32,40,95,50,55,53,32,95,+49,53,48,48,41,41,41,32,40,40,65,32,58,49,53,48,49,32,40,40,+40,40,40,95,49,49,32,95,49,53,48,48,41,32,40,40,66,32,40,95,+50,54,49,32,95,49,52,57,56,41,41,32,40,40,40,67,39,32,40,67,+39,32,95,49,52,57,55,41,41,32,40,40,40,67,39,32,40,67,39,32,+79,41,41,32,80,41,32,75,41,41,32,95,49,52,57,52,41,41,41,32,+40,95,51,56,32,95,49,53,48,50,41,41,32,40,40,40,67,39,32,66,+41,32,40,95,51,50,32,95,49,53,48,50,41,41,32,75,41,41,32,40,+95,50,48,32,95,49,53,48,49,41,41,41,32,40,40,65,32,58,49,53,+48,50,32,40,40,40,40,95,51,48,32,95,49,53,48,49,41,32,40,40,+66,32,40,66,32,40,95,50,54,49,32,95,49,52,57,56,41,41,41,32,+40,40,40,67,39,32,66,41,32,40,40,66,32,67,41,32,95,49,52,57,+57,41,41,32,40,40,40,67,39,32,40,67,39,32,66,41,41,32,40,40,+66,32,40,66,32,95,52,49,52,41,41,32,40,40,66,32,40,66,32,40,+95,51,57,52,32,40,40,40,67,39,32,79,41,32,40,40,40,83,39,32,+80,41,32,40,85,32,75,41,41,32,40,85,32,65,41,41,41,32,75,41,+41,41,41,32,40,40,66,32,95,51,57,52,41,32,40,40,40,67,39,32,+40,67,39,32,79,41,41,32,40,40,40,67,39,32,40,83,39,32,95,49,+52,57,57,41,41,32,40,40,67,32,66,41,32,40,85,32,75,41,41,41,+32,40,85,32,65,41,41,41,32,75,41,41,41,41,41,32,40,40,66,32,+40,40,67,39,32,66,41,32,40,40,66,32,95,49,52,57,55,41,32,95,+51,57,51,41,41,41,32,40,40,66,32,40,66,32,95,49,52,57,54,41,+41,32,95,52,54,50,41,41,41,41,41,41,32,40,95,51,54,32,95,49,+53,48,50,41,41,32,40,95,49,51,32,95,49,53,48,49,41,41,41,32,+40,40,65,32,58,49,53,48,51,32,40,40,95,51,57,32,95,49,53,48,+50,41,32,40,40,66,32,40,95,50,54,49,32,95,49,52,57,56,41,41,+32,40,40,66,32,85,41,32,40,40,66,32,90,41,32,40,40,66,32,40,+66,32,40,95,49,52,57,55,32,95,52,54,49,41,41,41,32,40,40,66,+32,40,67,32,40,40,40,83,39,32,95,49,52,57,50,41,32,95,52,49,+49,41,32,40,95,52,48,57,32,35,49,41,41,41,41,32,40,40,67,32,+79,41,32,75,41,41,41,41,41,41,41,41,32,40,40,65,32,58,49,53,+48,52,32,40,40,40,40,40,95,48,32,95,49,53,48,49,41,32,40,40,+95,50,54,49,32,95,49,52,57,56,41,32,40,85,32,40,90,32,40,40,+66,32,40,95,49,52,57,55,32,95,52,54,49,41,41,32,40,40,67,32,+40,40,40,83,39,32,95,49,52,57,50,41,32,95,52,49,49,41,32,40,+95,52,48,57,32,35,49,41,41,41,32,95,52,54,49,41,41,41,41,41,+41,32,40,40,66,32,40,66,32,40,95,50,54,49,32,95,49,52,57,56,+41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,83,41,32,+95,49,52,57,57,41,41,32,40,40,40,67,39,32,40,67,39,32,66,41,+41,32,40,40,66,32,66,39,41,32,95,49,52,57,57,41,41,32,40,40,+40,67,39,32,66,41,32,40,40,66,32,40,67,39,32,66,41,41,32,40,+40,66,32,40,66,32,95,49,52,57,55,41,41,32,95,52,54,51,41,41,+41,32,95,49,52,57,53,41,41,41,41,41,32,40,95,56,32,95,49,53,+48,52,41,41,32,40,95,57,32,95,49,53,48,52,41,41,41,32,40,40,+65,32,58,49,53,48,53,32,40,40,95,50,54,49,32,95,49,52,57,56,+41,32,40,40,83,32,73,41,32,40,90,32,40,40,40,67,39,32,40,67,+39,32,95,49,52,57,55,41,41,32,40,40,40,67,39,32,40,67,39,32,+79,41,41,32,40,67,32,80,41,41,32,75,41,41,32,95,49,52,57,52,+41,41,41,41,41,32,40,40,65,32,58,49,53,48,54,32,40,40,66,32,+40,95,50,54,49,32,95,49,52,57,56,41,41,32,40,40,66,32,85,41,+32,40,40,66,32,90,41,32,40,40,40,67,39,32,40,67,39,32,95,49,+52,57,55,41,41,32,40,40,40,67,39,32,40,67,39,32,79,41,41,32,+40,40,66,32,40,66,32,40,80,32,95,49,51,52,49,41,41,41,32,40,+67,32,80,41,41,41,32,75,41,41,32,95,49,52,57,52,41,41,41,41,+41,32,40,40,65,32,58,49,53,48,55,32,40,40,66,32,40,40,95,51,+50,32,95,49,53,48,50,41,32,95,49,53,48,53,41,41,32,40,66,32,+95,49,53,48,54,41,41,41,32,40,40,65,32,58,49,53,48,56,32,40,+40,66,32,40,66,32,40,95,50,54,49,32,95,49,52,57,56,41,41,41,+32,40,40,66,32,40,40,67,39,32,40,83,39,32,40,83,32,73,41,41,+41,32,40,40,40,67,39,32,40,67,39,32,66,41,41,32,40,40,66,32,+40,66,32,67,41,41,32,40,40,66,32,40,66,32,40,67,32,67,39,41,+41,41,32,40,40,40,67,39,32,40,67,39,32,66,41,41,32,95,49,52,+57,57,41,32,40,40,66,32,40,40,67,39,32,66,41,32,95,49,52,57,+55,41,41,32,95,49,52,57,53,41,41,41,41,41,32,40,90,32,75,41,+41,41,41,32,95,49,52,57,57,41,41,41,32,40,40,65,32,58,49,53,+48,57,32,40,40,40,67,39,32,40,95,51,32,95,49,53,48,52,41,41,+32,40,40,95,50,55,54,32,95,49,53,48,48,41,32,95,52,55,55,41,+41,32,40,40,95,49,51,32,95,49,53,48,49,41,32,95,52,55,54,41,+41,41,32,40,40,65,32,58,49,53,49,48,32,40,40,40,67,39,32,95,+49,53,48,56,41,32,95,49,53,49,49,41,32,40,40,95,49,51,32,95,+49,53,48,49,41,32,95,52,54,49,41,41,41,32,40,40,65,32,58,49,+53,49,49,32,40,40,40,83,39,32,40,95,49,52,32,95,49,53,48,49,+41,41,32,40,40,95,50,55,54,32,95,49,53,48,48,41,32,95,52,54,+50,41,41,32,95,49,53,49,48,41,41,32,40,40,65,32,58,49,53,49,+50,32,40,40,40,67,39,32,95,49,53,48,56,41,32,40,40,95,50,55,+54,32,95,49,53,48,48,41,32,95,52,55,55,41,41,32,40,40,95,49,+51,32,95,49,53,48,49,41,32,95,52,55,54,41,41,41,32,40,40,65,+32,58,49,53,49,51,32,40,40,66,32,40,67,32,66,41,41,32,40,40,+40,67,39,32,40,67,39,32,80,41,41,32,40,67,32,80,41,41,32,40,+40,83,32,40,40,67,32,67,39,41,32,95,49,55,52,41,41,32,40,90,+32,40,90,32,40,40,66,32,95,49,55,53,41,32,40,95,51,57,52,32,+40,85,32,40,40,40,67,39,32,40,67,39,32,79,41,41,32,40,40,40,+67,39,32,66,41,32,80,41,32,95,53,54,54,41,41,32,75,41,41,41,+41,41,41,41,41,41,41,32,40,40,65,32,58,49,53,49,52,32,40,40,+83,32,40,85,32,40,95,50,32,95,49,53,48,52,41,41,41,32,40,90,+32,40,90,32,40,95,51,57,56,32,40,95,51,32,95,49,53,48,52,41,+41,41,41,41,41,32,40,40,65,32,58,49,53,49,53,32,40,40,66,32,+40,66,32,40,95,50,54,49,32,95,49,52,57,56,41,41,41,32,40,40,+66,32,40,66,32,85,41,41,32,40,40,66,32,40,40,67,39,32,83,41,+32,40,40,66,32,40,40,67,39,32,67,39,41,32,83,41,41,32,40,40,+40,67,39,32,66,41,32,40,40,66,32,40,67,39,32,40,83,39,32,66,+41,41,41,32,67,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,+39,32,95,49,52,57,55,41,41,41,32,40,40,40,67,39,32,40,67,39,+32,40,67,39,32,79,41,41,41,32,40,40,66,32,40,40,67,39,32,66,+41,32,80,41,41,32,40,67,32,80,41,41,41,32,75,41,41,32,95,49,+52,57,52,41,41,41,41,41,32,40,40,66,32,40,66,32,40,95,49,52,+57,55,32,95,52,54,49,41,41,41,32,40,40,66,32,40,67,32,40,40,+40,83,39,32,95,49,52,57,50,41,32,95,52,49,49,41,32,40,95,52,+48,57,32,35,49,41,41,41,41,32,40,40,67,32,79,41,32,75,41,41,+41,41,41,41,41,32,40,40,65,32,58,49,53,49,54,32,40,40,66,32,+40,66,32,40,95,50,54,49,32,95,49,52,57,56,41,41,41,32,40,40,+66,32,40,66,32,85,41,41,32,40,40,66,32,40,40,67,39,32,83,41,+32,40,40,66,32,40,40,67,39,32,67,39,41,32,83,41,41,32,40,40,+40,67,39,32,66,41,32,40,40,66,32,40,67,39,32,40,67,39,32,66,+41,41,41,32,67,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,+39,32,95,49,52,57,55,41,41,41,32,40,40,40,67,39,32,40,67,39,+32,40,67,39,32,79,41,41,41,32,40,40,66,32,40,66,32,40,67,32,+80,41,41,41,32,40,67,32,80,41,41,41,32,75,41,41,32,95,49,52,+57,52,41,41,41,41,41,32,40,40,66,32,40,66,32,40,95,49,52,57,+55,32,95,52,54,49,41,41,41,32,40,40,66,32,40,67,32,40,40,40,+83,39,32,95,49,52,57,50,41,32,95,52,49,49,41,32,40,95,52,48,+57,32,35,49,41,41,41,41,32,40,40,67,32,79,41,32,75,41,41,41,+41,41,41,41,32,40,40,65,32,58,49,53,49,55,32,40,40,95,50,54,+49,32,95,49,52,57,56,41,32,40,40,83,32,73,41,32,40,40,66,32,+90,41,32,40,40,66,32,40,67,32,40,40,83,32,95,51,57,50,41,32,+40,40,66,32,40,95,49,52,57,55,32,95,52,54,49,41,41,32,40,40,+67,32,40,40,40,83,39,32,95,49,52,57,50,41,32,95,52,49,49,41,+32,40,95,52,48,57,32,35,49,41,41,41,32,40,40,79,32,34,101,111,+102,34,41,32,75,41,41,41,41,41,41,32,40,40,40,67,39,32,95,49,+52,57,55,41,32,40,40,40,67,39,32,79,41,32,40,80,32,95,49,51,+52,49,41,41,32,75,41,41,32,95,49,52,57,52,41,41,41,41,41,41,+32,40,40,65,32,58,49,53,49,56,32,40,40,66,32,40,66,32,40,95,+50,54,49,32,95,49,52,57,56,41,41,41,32,40,40,40,67,39,32,66,+41,32,40,40,66,32,67,41,32,95,49,52,57,57,41,41,32,40,40,66,+32,40,66,32,85,41,41,32,40,40,66,32,40,66,32,40,66,32,90,41,+41,41,32,40,40,66,32,40,40,67,39,32,66,41,32,40,66,39,32,95,+49,52,57,55,41,41,41,32,40,40,66,32,40,40,67,39,32,67,41,32,+95,49,52,57,50,41,41,32,40,40,67,32,79,41,32,75,41,41,41,41,+41,41,41,41,32,40,40,65,32,58,49,53,49,57,32,40,40,66,32,40,+95,50,54,49,32,95,49,52,57,56,41,41,32,40,40,40,67,39,32,83,+41,32,95,49,52,57,57,41,32,40,40,66,32,40,67,32,40,40,67,32,+67,39,41,32,40,85,32,40,40,66,32,40,66,32,40,66,32,40,95,49,+52,57,55,32,95,52,54,49,41,41,41,41,32,40,40,40,67,39,32,66,+41,32,95,49,52,57,50,41,32,40,95,52,48,57,32,35,49,41,41,41,+41,41,41,41,32,40,90,32,40,90,32,40,40,40,67,39,32,95,49,52,+57,55,41,32,40,40,40,67,39,32,79,41,32,40,80,32,95,49,51,52,+49,41,41,32,75,41,41,32,95,49,52,57,52,41,41,41,41,41,41,41,+32,40,40,65,32,58,49,53,50,48,32,40,40,95,50,54,49,32,95,49,+52,57,56,41,32,40,40,83,32,73,41,32,40,40,66,32,90,41,32,40,+40,66,32,40,67,32,40,40,83,32,73,41,32,40,40,66,32,40,95,49,+52,57,55,32,95,52,54,49,41,41,32,40,40,67,32,40,40,40,67,39,+32,95,49,52,57,50,41,32,95,52,49,49,41,32,95,52,54,49,41,41,+32,40,40,79,32,34,33,101,111,102,34,41,32,75,41,41,41,41,41,41,+32,40,40,66,32,90,41,32,40,40,40,67,39,32,40,67,39,32,95,49,+52,57,55,41,41,32,40,40,40,67,39,32,40,67,39,32,79,41,41,32,+40,67,32,80,41,41,32,75,41,41,32,95,49,52,57,52,41,41,41,41,+41,41,41,32,40,40,65,32,58,49,53,50,49,32,40,40,66,32,40,95,+50,54,49,32,95,49,52,57,56,41,41,32,40,40,66,32,85,41,32,40,+40,40,67,39,32,40,67,39,32,40,67,39,32,95,49,52,57,55,41,41,+41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,79,41,41,41,+32,40,40,66,32,40,66,32,40,66,32,40,80,32,95,49,51,52,49,41,+41,41,41,32,40,40,66,32,40,66,32,80,41,41,32,95,52,54,51,41,+41,41,32,75,41,41,32,95,49,52,57,52,41,41,41,41,32,40,40,65,+32,58,49,53,50,50,32,40,40,40,83,39,32,66,41,32,40,40,66,32,+40,95,49,52,32,95,49,53,48,49,41,41,32,40,40,95,50,55,54,32,+95,49,53,48,48,41,32,95,52,54,50,41,41,41,32,40,40,66,32,40,+66,32,40,95,53,32,95,49,53,48,52,41,41,41,32,40,67,32,40,95,+49,53,32,95,49,53,48,49,41,41,41,41,41,32,40,40,65,32,58,49,+53,50,51,32,40,40,40,83,39,32,66,41,32,40,40,66,32,40,95,49,+52,32,95,49,53,48,49,41,41,32,40,40,95,50,55,54,32,95,49,53,+48,48,41,32,95,52,54,50,41,41,41,32,40,40,66,32,40,66,32,95,+49,53,49,48,41,41,32,40,67,32,40,95,49,53,32,95,49,53,48,49,+41,41,41,41,41,32,40,40,65,32,58,49,53,50,52,32,40,40,40,67,+39,32,40,67,39,32,95,49,53,48,56,41,41,32,95,49,53,50,51,41,+32,40,40,95,49,51,32,95,49,53,48,49,41,32,95,52,54,49,41,41,+41,32,40,40,65,32,58,49,53,50,53,32,40,40,40,67,39,32,40,67,+39,32,95,49,53,48,56,41,41,32,95,49,53,50,54,41,32,40,40,95,+49,51,32,95,49,53,48,49,41,32,95,52,54,49,41,41,41,32,40,40,+65,32,58,49,53,50,54,32,40,40,40,83,39,32,66,41,32,40,40,66,+32,40,95,49,52,32,95,49,53,48,49,41,41,32,40,40,95,50,55,54,+32,95,49,53,48,48,41,32,95,52,54,50,41,41,41,32,40,40,40,67,+39,32,40,67,39,32,95,49,53,48,56,41,41,32,40,40,66,32,40,83,+32,40,95,49,53,32,95,49,53,48,49,41,41,41,32,95,49,53,50,53,+41,41,32,40,40,95,49,51,32,95,49,53,48,49,41,32,95,52,54,49,+41,41,41,41,32,40,40,65,32,58,49,53,50,55,32,40,90,32,40,90,+32,40,90,32,40,90,32,40,90,32,40,90,32,75,41,41,41,41,41,41,+41,32,40,40,65,32,58,49,53,50,56,32,40,90,32,40,40,66,32,90,+41,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,66,32,+90,41,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,85,41,41,+41,41,41,41,41,41,32,40,40,65,32,58,49,53,50,57,32,40,40,66,+32,90,41,32,40,40,66,32,90,41,32,40,40,66,32,40,66,32,90,41,+41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,+90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,+66,32,90,41,41,32,80,41,41,41,41,41,41,41,41,32,40,40,65,32,+58,49,53,51,48,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,+40,40,66,32,90,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,+66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,+40,40,66,32,40,66,32,90,41,41,32,80,41,41,41,41,41,41,41,41,+32,40,40,65,32,58,49,53,51,49,32,40,40,66,32,90,41,32,40,40,+66,32,90,41,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,+40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,+32,40,40,66,32,40,66,32,90,41,41,32,80,41,41,41,41,41,41,41,+41,32,40,40,65,32,58,49,53,51,50,32,40,75,32,40,75,32,40,75,+32,40,75,32,40,75,32,40,90,32,75,41,41,41,41,41,41,41,32,40,+40,65,32,58,49,53,51,51,32,40,40,66,32,40,66,32,90,41,41,32,+40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,+41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,+90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,+66,32,40,66,32,90,41,41,41,32,40,40,66,32,40,66,32,67,41,41,+32,80,41,41,41,41,41,41,41,41,41,32,40,40,65,32,58,49,53,51,+52,32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,+90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,+66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,+32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,+40,66,32,40,66,32,67,41,41,32,80,41,41,41,41,41,41,41,41,41,+32,40,40,65,32,58,49,53,51,53,32,40,40,67,32,95,49,53,50,57,+41,32,95,49,53,50,55,41,41,32,40,40,65,32,58,49,53,51,54,32,+95,49,53,50,55,41,32,40,40,65,32,58,49,53,51,55,32,40,40,67,+32,40,40,67,32,40,40,83,32,40,40,83,32,40,40,83,32,40,40,83,+32,40,40,83,32,40,40,83,32,73,41,32,73,41,41,32,75,41,41,32,+40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,+41,41,41,32,73,41,41,32,40,40,40,67,39,32,40,67,39,32,66,41,+41,32,95,49,53,54,56,41,32,95,49,53,51,55,41,41,41,32,40,40,+40,67,39,32,40,67,39,32,66,41,41,32,95,49,53,54,50,41,32,95,+49,53,51,55,41,41,41,32,40,40,65,32,58,49,53,51,56,32,40,40,+95,50,54,51,32,95,53,54,54,41,32,40,40,95,50,54,51,32,95,49,+53,53,50,41,32,40,40,95,51,57,55,32,40,40,67,32,95,49,53,51,+51,41,32,95,49,50,52,41,41,32,95,49,53,51,54,41,41,41,41,32,+40,40,65,32,58,49,53,51,57,32,40,40,95,50,54,51,32,95,53,54,+54,41,32,40,40,95,50,54,51,32,95,49,53,53,50,41,32,40,40,95,+51,57,55,32,40,40,67,32,95,49,53,51,51,41,32,95,49,50,53,41,+41,32,95,49,53,51,54,41,41,41,41,32,40,40,65,32,58,49,53,52,+48,32,40,40,95,50,54,51,32,95,53,54,54,41,32,40,40,95,50,54,+51,32,95,49,53,53,51,41,32,40,40,95,51,57,55,32,40,40,67,32,+95,49,53,51,52,41,32,95,49,50,52,41,41,32,95,49,53,51,54,41,+41,41,41,32,40,40,65,32,58,49,53,52,49,32,40,40,40,67,39,32,+66,41,32,95,49,53,52,56,41,32,95,49,53,51,55,41,41,32,40,40,+65,32,58,49,53,52,50,32,40,40,66,32,40,66,32,40,66,32,95,49,+53,55,48,41,41,41,32,40,40,40,67,39,32,66,41,32,40,66,39,32,+79,41,41,32,40,40,40,67,39,32,40,67,39,32,79,41,41,32,95,49,+53,52,49,41,32,75,41,41,41,41,32,40,40,65,32,58,49,53,52,51,+32,40,40,66,32,40,80,32,95,52,54,49,41,41,32,40,40,66,32,89,+41,32,40,40,66,32,40,66,32,40,40,83,39,32,80,41,32,40,40,67,+32,79,41,32,75,41,41,41,41,32,40,40,66,32,40,67,39,32,66,41,+41,32,40,40,66,32,66,39,41,32,40,40,66,32,40,66,32,95,52,54,+50,41,41,32,40,67,32,95,49,53,54,53,41,41,41,41,41,41,41,41,+32,40,40,65,32,58,49,53,52,52,32,40,40,80,32,95,50,54,52,41,+32,95,49,53,52,53,41,41,32,40,40,65,32,58,49,53,52,53,32,40,+40,40,67,39,32,95,49,53,54,53,41,32,40,95,49,53,54,53,32,40,+95,49,53,51,53,32,40,40,79,32,35,52,48,41,32,75,41,41,41,41,+32,40,95,49,53,51,53,32,40,40,79,32,35,52,49,41,32,75,41,41,+41,41,32,40,40,65,32,58,49,53,52,54,32,40,40,40,67,39,32,95,+49,53,54,53,41,32,40,95,49,53,54,53,32,40,95,49,53,51,53,32,+40,40,79,32,35,49,50,51,41,32,75,41,41,41,41,32,40,95,49,53,+51,53,32,40,40,79,32,35,49,50,53,41,32,75,41,41,41,41,32,40,+40,65,32,58,49,53,52,55,32,40,40,40,67,39,32,95,49,53,54,53,+41,32,40,95,49,53,54,53,32,40,95,49,53,51,53,32,40,40,79,32,+35,57,49,41,32,75,41,41,41,41,32,40,95,49,53,51,53,32,40,40,+79,32,35,57,51,41,32,75,41,41,41,41,32,40,40,65,32,58,49,53,+52,56,32,40,40,67,32,40,40,40,83,39,32,67,39,41,32,40,40,67,+32,95,49,52,56,49,41,32,95,49,50,52,41,41,32,40,40,40,83,39,+32,83,41,32,40,40,40,67,39,32,40,67,39,32,83,41,41,32,40,40,+40,67,39,32,40,67,39,32,83,41,41,32,40,40,40,67,39,32,40,67,+39,32,67,41,41,32,40,40,40,67,39,32,40,67,39,32,83,41,41,32,+40,40,66,32,40,40,67,39,32,67,41,32,40,40,67,32,40,40,40,67,+39,32,83,39,41,32,40,85,32,95,49,53,50,55,41,41,32,75,41,41,+32,40,90,32,75,41,41,41,41,32,40,40,66,32,40,66,32,95,49,53,+52,56,41,41,32,40,95,52,55,57,32,95,50,55,55,41,41,41,41,32,+40,90,32,75,41,41,41,32,95,49,53,51,50,41,41,32,40,90,32,40,+90,32,75,41,41,41,41,32,40,90,32,40,90,32,75,41,41,41,41,32,+40,40,67,32,40,40,40,83,39,32,83,39,41,32,40,40,67,32,61,61,+41,32,35,48,41,41,32,95,49,53,53,55,41,41,32,73,41,41,41,41,+32,95,50,53,41,41,32,40,40,65,32,58,49,53,52,57,32,40,40,40,+83,39,32,66,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,+32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,+41,32,40,40,40,67,39,32,83,41,32,40,40,67,32,40,40,40,67,39,+32,83,39,41,32,40,85,32,95,49,53,50,55,41,41,32,75,41,41,32,+40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,+41,41,41,32,73,41,41,32,40,90,32,40,90,32,75,41,41,41,41,32,+40,90,32,40,90,32,75,41,41,41,41,32,95,49,53,53,56,41,41,32,+40,40,65,32,58,49,53,53,48,32,75,41,32,40,40,65,32,58,49,53,+53,49,32,65,41,32,40,40,65,32,58,49,53,53,50,32,40,40,83,32,+40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,67,41,32,40,40,+40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,+39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,67,32,83,41,+32,75,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,+32,40,90,32,75,41,41,41,32,73,41,41,32,40,40,40,67,39,32,40,+67,39,32,66,41,41,32,40,40,66,32,40,95,49,53,53,52,32,95,49,+53,51,51,41,41,32,40,40,66,32,95,53,54,54,41,32,95,49,53,53,+50,41,41,41,32,95,49,53,53,50,41,41,41,32,40,90,32,40,90,32,+75,41,41,41,41,32,40,80,32,95,49,53,53,49,41,41,41,32,40,40,+65,32,58,49,53,53,51,32,40,40,83,32,40,40,40,67,39,32,67,41,+32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,+40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,+67,39,32,83,41,32,40,40,67,32,83,41,32,75,41,41,32,40,90,32,+75,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,+32,73,41,41,32,40,90,32,40,90,32,75,41,41,41,41,32,40,40,40,+67,39,32,40,67,39,32,66,41,41,32,40,40,66,32,40,95,49,53,53,+52,32,95,49,53,51,52,41,41,32,40,40,66,32,95,53,54,54,41,32,+95,49,53,53,51,41,41,41,32,95,49,53,53,51,41,41,41,32,40,80,+32,95,49,53,53,49,41,41,41,32,40,40,65,32,58,49,53,53,52,32,+40,40,66,32,40,40,83,39,32,66,41,32,40,40,66,32,83,41,32,40,+40,40,67,39,32,40,67,39,32,83,41,41,32,40,40,40,67,39,32,40,+67,39,32,83,41,41,32,40,40,40,67,39,32,40,67,39,32,83,41,41,+32,40,40,40,67,39,32,40,67,39,32,83,41,41,32,40,40,40,67,39,+32,40,67,39,32,83,41,41,32,40,40,40,67,39,32,67,41,32,40,40,+67,32,40,67,39,32,83,39,41,41,32,75,41,41,32,40,90,32,75,41,+41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,73,+41,41,32,40,90,32,40,90,32,75,41,41,41,41,32,40,90,32,40,90,+32,75,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,+66,32,40,80,32,95,49,53,53,49,41,41,41,41,41,32,40,40,66,32,+40,66,32,40,66,32,85,41,41,41,32,40,40,83,39,32,66,41,32,40,+40,66,32,40,67,39,32,66,41,41,32,85,41,41,41,41,41,41,32,40,+40,65,32,58,49,53,53,53,32,95,49,53,50,56,41,32,40,40,65,32,+58,49,53,53,54,32,95,49,53,50,57,41,32,40,40,65,32,58,49,53,+53,55,32,95,49,53,51,48,41,32,40,40,65,32,58,49,53,53,56,32,+95,49,53,51,49,41,32,40,40,65,32,58,49,53,53,57,32,40,40,67,+32,95,49,53,54,49,41,32,95,49,50,52,41,41,32,40,40,65,32,58,+49,53,54,48,32,40,40,67,32,95,49,53,54,49,41,32,95,49,50,53,+41,41,32,40,40,65,32,58,49,53,54,49,32,40,40,40,83,39,32,66,+41,32,40,40,66,32,83,41,32,40,40,40,67,39,32,40,67,39,32,83,+41,41,32,40,40,40,67,39,32,40,67,39,32,83,41,41,32,40,40,40,+67,39,32,40,67,39,32,83,41,41,32,40,40,40,67,39,32,40,67,39,+32,83,41,41,32,40,40,40,67,39,32,40,67,39,32,83,41,41,32,40,+40,40,67,39,32,67,41,32,40,40,40,67,39,32,40,67,39,32,83,39,+41,41,32,85,41,32,75,41,41,32,40,90,32,75,41,41,41,32,40,90,+32,75,41,41,41,32,40,90,32,75,41,41,41,32,73,41,41,32,40,90,+32,40,90,32,75,41,41,41,41,32,40,90,32,40,90,32,75,41,41,41,+41,41,32,40,40,40,83,39,32,66,41,32,40,40,66,32,83,41,32,40,+40,40,67,39,32,40,67,39,32,83,41,41,32,40,40,40,67,39,32,40,+67,39,32,83,41,41,32,40,40,40,67,39,32,40,67,39,32,83,41,41,+32,40,40,40,67,39,32,40,67,39,32,83,41,41,32,40,40,40,67,39,+32,40,67,39,32,83,41,41,32,40,40,40,67,39,32,67,41,32,40,40,+67,32,40,67,39,32,83,39,41,41,32,75,41,41,32,40,90,32,75,41,+41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,73,+41,41,32,40,90,32,40,90,32,75,41,41,41,41,32,40,90,32,40,90,+32,75,41,41,41,41,41,32,95,49,53,51,52,41,41,41,32,40,40,65,+32,58,49,53,54,50,32,40,40,40,83,39,32,40,83,39,32,83,41,41,+32,40,40,40,67,39,32,40,83,39,32,40,83,39,32,67,41,41,41,32,+40,40,40,83,39,32,66,41,32,40,66,39,32,40,40,66,32,67,41,32,+40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,+40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,67,32,+83,41,32,75,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,+41,41,32,40,90,32,75,41,41,41,32,73,41,41,41,41,32,40,40,66,+32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,+40,66,32,40,66,32,90,41,41,32,40,40,40,67,39,32,40,67,39,32,+66,41,41,32,40,40,40,67,39,32,67,41,32,40,40,66,32,95,49,53,+54,51,41,32,95,49,53,51,55,41,41,32,35,48,41,41,32,95,49,53,+51,55,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,40,67,39,+32,40,67,39,32,66,41,41,32,95,49,53,54,50,41,41,41,32,40,40,+66,32,67,41,32,40,67,32,95,49,53,54,50,41,41,41,41,41,32,40,+40,40,67,39,32,40,67,39,32,66,41,41,32,40,40,40,67,39,32,67,+41,32,95,49,53,54,51,41,32,35,48,41,41,32,95,49,53,51,55,41,+41,41,32,40,40,65,32,58,49,53,54,51,32,40,40,40,67,39,32,40,+67,39,32,67,41,41,32,40,40,66,32,40,66,32,40,40,83,39,32,67,+39,41,32,40,40,67,32,95,49,52,56,49,41,32,95,49,50,52,41,41,+41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,67,41,41,+41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,67,41,41,41,+32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,67,41,41,41,32,+40,40,40,67,39,32,40,83,39,32,40,83,39,32,83,41,41,41,32,40,+40,40,67,39,32,40,83,39,32,40,83,39,32,83,41,41,41,32,40,40,+40,67,39,32,40,83,39,32,40,83,39,32,83,41,41,41,32,40,40,40,+67,39,32,66,41,32,40,40,40,67,39,32,83,39,41,32,83,39,41,32,+95,49,53,52,56,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,+32,95,49,53,53,53,41,41,41,41,32,40,40,66,32,40,66,32,67,41,+41,32,40,40,66,32,67,41,32,40,67,32,95,49,53,54,51,41,41,41,+41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,40,67,39,+32,83,41,41,32,40,40,66,32,40,66,32,40,40,67,39,32,67,39,41,+32,40,66,39,32,95,49,53,50,57,41,41,41,41,32,40,40,40,83,39,+32,40,83,39,32,40,83,39,32,83,41,41,41,32,40,40,40,67,39,32,+40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,41,32,40,40,+40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,+41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,+83,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,+40,67,39,32,83,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,+40,67,39,32,40,67,39,32,83,41,41,41,41,32,40,40,40,67,39,32,+40,67,39,32,40,67,39,32,67,41,41,41,32,40,40,40,67,39,32,40,+67,39,32,40,67,39,32,40,67,39,32,83,39,41,41,41,41,32,40,40,+66,32,40,66,32,40,67,32,66,41,41,41,32,40,40,66,32,67,41,32,+95,49,53,54,52,41,41,41,32,75,41,41,32,40,90,32,75,41,41,41,+32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,73,41,41,+32,40,90,32,40,90,32,75,41,41,41,41,32,40,90,32,40,90,32,75,+41,41,41,41,32,40,40,66,32,40,67,39,32,67,41,41,32,40,67,32,+95,49,53,54,51,41,41,41,41,41,41,32,40,40,40,67,39,32,66,41,+32,40,95,52,56,48,32,95,50,55,55,41,41,32,95,52,49,49,41,41,+41,41,32,40,40,66,32,40,66,32,40,66,32,40,40,83,39,32,66,41,+32,95,49,53,53,55,41,41,41,41,32,40,40,66,32,40,66,32,40,67,+39,32,67,41,41,41,32,40,40,40,67,39,32,66,41,32,40,66,39,32,+40,40,66,32,67,41,32,40,67,32,95,49,53,54,51,41,41,41,41,32,+40,95,52,56,48,32,95,50,55,55,41,41,41,41,41,41,32,40,40,40,+83,39,32,40,83,39,32,40,83,39,32,40,67,39,32,66,41,41,41,41,+32,40,40,66,32,40,66,32,40,66,32,40,66,32,95,49,53,53,56,41,+41,41,41,32,40,40,66,32,40,66,32,67,41,41,32,40,40,66,32,67,+41,32,40,67,32,95,49,53,54,51,41,41,41,41,41,32,40,40,66,32,+40,66,32,67,41,41,32,40,40,66,32,67,41,32,40,67,32,95,49,53,+54,51,41,41,41,41,41,41,32,95,49,53,51,50,41,41,32,40,75,32,+40,75,32,40,75,32,40,95,50,52,32,34,97,98,111,118,101,78,101,115,+116,32,66,101,115,105,100,101,34,41,41,41,41,41,41,32,40,75,32,40,+75,32,40,75,32,40,95,50,52,32,34,97,98,111,118,101,78,101,115,116,+32,65,98,111,118,101,34,41,41,41,41,41,41,41,32,95,50,53,41,41,+32,40,40,65,32,58,49,53,54,52,32,40,40,66,32,89,41,32,40,40,+40,67,39,32,40,67,39,32,67,41,41,32,40,40,66,32,40,66,32,40,+40,83,39,32,67,39,41,32,40,40,67,32,95,49,52,56,49,41,32,95,+49,50,52,41,41,41,41,32,40,40,66,32,40,40,67,39,32,40,83,39,+32,83,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,83,+41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,83,41,+41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,+41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,+32,40,40,66,32,40,66,32,40,40,67,39,32,67,41,32,40,40,67,32,+40,40,40,67,39,32,83,39,41,32,40,85,32,95,49,53,50,55,41,41,+32,75,41,41,32,40,90,32,75,41,41,41,41,41,32,40,40,40,67,39,+32,66,41,32,66,41,32,40,95,52,55,57,32,95,50,55,55,41,41,41,+41,32,40,90,32,75,41,41,41,32,73,41,41,32,40,90,32,40,90,32,+75,41,41,41,41,32,40,90,32,40,90,32,75,41,41,41,41,41,32,40,+40,40,67,39,32,83,41,32,40,40,40,67,39,32,40,83,39,32,83,39,+41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,95,49,50,49,+41,32,95,49,50,50,41,41,32,40,40,67,32,40,95,52,57,57,32,95,+50,56,50,41,41,32,35,48,41,41,41,32,40,40,66,32,40,66,32,95,+49,53,53,53,41,41,32,95,49,53,52,56,41,41,41,32,40,40,66,32,+95,49,53,53,54,41,32,40,40,67,32,95,52,52,54,41,32,35,51,50,+41,41,41,41,41,41,32,95,50,53,41,41,41,32,40,40,65,32,58,49,+53,54,53,32,40,40,67,32,95,49,53,54,55,41,32,95,49,50,52,41,+41,32,40,40,65,32,58,49,53,54,54,32,40,40,67,32,95,49,53,54,+55,41,32,95,49,50,53,41,41,32,40,40,65,32,58,49,53,54,55,32,+40,40,40,83,39,32,66,41,32,40,40,66,32,83,41,32,40,40,40,67,+39,32,40,67,39,32,83,41,41,32,40,40,40,67,39,32,40,67,39,32,+83,41,41,32,40,40,40,67,39,32,40,67,39,32,83,41,41,32,40,40,+40,67,39,32,40,67,39,32,83,41,41,32,40,40,40,67,39,32,40,67,+39,32,83,41,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,+32,40,67,39,32,83,39,41,41,32,85,41,32,75,41,41,32,40,90,32,+75,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,+32,73,41,41,32,40,90,32,40,90,32,75,41,41,41,41,32,40,90,32,+40,90,32,75,41,41,41,41,41,32,40,40,40,83,39,32,66,41,32,40,+40,66,32,83,41,32,40,40,40,67,39,32,40,67,39,32,83,41,41,32,+40,40,40,67,39,32,40,67,39,32,83,41,41,32,40,40,40,67,39,32,+40,67,39,32,83,41,41,32,40,40,40,67,39,32,40,67,39,32,83,41,+41,32,40,40,40,67,39,32,40,67,39,32,83,41,41,32,40,40,40,67,+39,32,67,41,32,40,40,67,32,40,67,39,32,83,39,41,41,32,75,41,+41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,40,90,+32,75,41,41,41,32,73,41,41,32,40,90,32,40,90,32,75,41,41,41,+41,32,40,90,32,40,90,32,75,41,41,41,41,41,32,95,49,53,51,51,+41,41,41,32,40,40,65,32,58,49,53,54,56,32,40,40,40,83,39,32,+40,83,39,32,83,41,41,32,40,40,40,83,39,32,40,83,39,32,83,41,+41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,40,67,+39,32,40,83,39,32,83,41,41,32,40,40,40,67,39,32,40,83,39,32,+83,41,41,32,40,40,40,67,39,32,40,83,39,32,83,41,41,32,40,40,+40,67,39,32,66,41,32,83,41,32,40,40,66,32,40,66,32,40,66,32,+40,95,50,54,50,32,95,49,53,53,53,41,41,41,41,32,40,40,66,32,+67,41,32,40,67,32,95,49,53,54,56,41,41,41,41,41,32,40,40,66,+32,40,66,32,40,40,67,39,32,66,41,32,95,49,53,50,57,41,41,41,+32,40,40,40,83,39,32,40,83,39,32,83,41,41,32,40,40,40,67,39,+32,40,67,39,32,40,67,39,32,83,41,41,41,32,40,40,40,67,39,32,+40,67,39,32,40,67,39,32,83,41,41,41,32,40,40,40,67,39,32,40,+67,39,32,40,67,39,32,83,41,41,41,32,40,40,40,67,39,32,40,67,+39,32,40,67,39,32,83,41,41,41,32,40,40,40,67,39,32,40,67,39,+32,40,67,39,32,83,41,41,41,32,40,40,40,67,39,32,40,67,39,32,+67,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,83,39,+41,41,41,32,40,40,66,32,40,66,32,85,41,41,32,95,49,53,54,57,+41,41,32,75,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,+41,41,32,40,90,32,75,41,41,41,32,73,41,41,32,40,90,32,40,90,+32,75,41,41,41,41,32,40,90,32,40,90,32,75,41,41,41,41,32,40,+40,66,32,67,41,32,40,67,32,95,49,53,54,56,41,41,41,41,41,41,+32,40,40,66,32,40,66,32,40,40,67,39,32,66,41,32,40,40,66,32,+95,50,54,50,41,32,95,49,53,53,55,41,41,41,41,32,40,40,66,32,+67,41,32,40,67,32,95,49,53,54,56,41,41,41,41,41,32,40,40,40,+83,39,32,40,83,39,32,40,67,39,32,66,41,41,41,32,40,40,66,32,+40,66,32,40,66,32,95,49,53,53,56,41,41,41,32,40,40,66,32,67,+41,32,40,67,32,95,49,53,54,56,41,41,41,41,32,40,40,66,32,67,+41,32,40,67,32,95,49,53,54,56,41,41,41,41,41,32,95,49,53,51,+50,41,41,32,40,40,40,67,39,32,40,83,39,32,40,83,39,32,66,41,+41,41,32,40,40,66,32,40,66,32,40,66,32,40,83,39,32,66,41,41,+41,41,32,40,40,66,32,40,40,83,39,32,66,41,32,40,40,66,32,67,+41,32,40,67,32,40,95,50,48,50,32,95,49,49,55,41,41,41,41,41,+32,40,40,66,32,95,49,53,54,56,41,32,95,49,53,51,55,41,41,41,+41,32,40,40,66,32,40,66,32,40,40,67,39,32,40,67,39,32,66,41,+41,32,40,40,66,32,40,66,32,95,50,54,50,41,41,32,95,49,53,54,+56,41,41,41,41,32,40,40,66,32,67,41,32,40,67,32,95,49,53,54,+56,41,41,41,41,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,+40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,+32,40,40,66,32,95,49,53,54,56,41,32,95,49,53,51,55,41,41,41,+41,41,41,32,40,40,65,32,58,49,53,54,57,32,40,40,66,32,89,41,+32,40,40,66,32,40,40,67,39,32,83,41,32,40,40,40,67,39,32,40,+67,39,32,83,41,41,32,40,40,40,67,39,32,40,67,39,32,83,41,41,+32,40,40,40,67,39,32,40,67,39,32,83,41,41,32,40,40,40,67,39,+32,40,67,39,32,83,41,41,32,40,40,66,32,40,40,67,39,32,67,41,+32,40,40,67,32,40,40,40,67,39,32,83,39,41,32,40,85,32,95,49,+53,50,55,41,41,32,75,41,41,32,40,90,32,75,41,41,41,41,32,75,+41,41,32,40,90,32,75,41,41,41,32,73,41,41,32,40,90,32,40,90,+32,75,41,41,41,41,32,40,90,32,40,90,32,75,41,41,41,41,41,32,+40,40,67,32,83,41,32,40,95,49,53,53,54,32,40,40,79,32,35,51,+50,41,32,75,41,41,41,41,41,41,32,40,40,65,32,58,49,53,55,48,+32,40,95,49,53,55,50,32,95,49,50,53,41,41,32,40,40,65,32,58,+49,53,55,49,32,40,95,49,53,55,50,32,95,49,50,52,41,41,32,40,+40,65,32,58,49,53,55,50,32,40,40,66,32,40,80,32,95,49,53,51,+54,41,41,32,40,40,67,32,40,40,40,67,39,32,67,39,41,32,95,49,+53,55,51,41,32,95,49,53,51,55,41,41,32,35,48,41,41,41,32,40,+40,65,32,58,49,53,55,51,32,40,40,66,32,89,41,32,40,40,40,67,+39,32,40,67,39,32,40,67,39,32,67,41,41,41,32,40,40,66,32,40,+66,32,40,66,32,40,40,83,39,32,67,39,41,32,40,40,67,32,95,49,+52,56,49,41,32,95,49,50,52,41,41,41,41,41,32,40,40,40,67,39,+32,40,67,39,32,40,67,39,32,40,67,39,32,67,41,41,41,41,32,40,+40,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,67,41,41,+41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,+32,67,41,41,41,41,32,40,40,40,67,39,32,40,83,39,32,40,67,39,+32,40,83,39,32,83,41,41,41,41,32,40,40,40,67,39,32,66,41,32,+40,40,66,32,40,67,39,32,40,83,39,32,83,41,41,41,32,40,40,40,+83,39,32,40,67,39,32,40,83,39,32,83,41,41,41,32,40,40,40,67,+39,32,67,41,32,40,40,66,32,40,40,67,39,32,83,39,41,32,83,39,+41,41,32,40,40,66,32,40,40,67,39,32,66,41,32,95,49,53,52,56,+41,41,32,95,49,53,55,50,41,41,41,32,40,40,66,32,40,66,32,40,+66,32,95,49,53,53,53,41,41,41,32,40,40,40,67,39,32,66,41,32,+40,40,66,32,67,41,32,40,67,32,40,40,67,32,95,49,53,54,51,41,+32,95,49,50,52,41,41,41,41,32,40,40,66,32,95,49,53,51,55,41,+32,95,49,53,52,48,41,41,41,41,41,32,40,40,66,32,40,66,32,40,+66,32,40,40,83,39,32,66,41,32,95,49,53,53,54,41,41,41,41,32,+40,40,66,32,40,66,32,40,67,39,32,67,41,41,41,32,40,40,40,67,+39,32,66,41,32,40,66,39,32,40,40,66,32,67,41,32,95,49,53,55,+52,41,41,41,32,40,40,40,67,39,32,66,41,32,40,95,52,56,48,32,+95,50,55,55,41,41,32,95,52,49,49,41,41,41,41,41,41,41,32,40,+40,66,32,40,66,32,40,66,32,40,40,83,39,32,66,41,32,95,49,53,+53,55,41,41,41,41,32,40,40,66,32,40,66,32,40,67,39,32,67,41,+41,41,32,40,40,40,67,39,32,66,41,32,40,66,39,32,67,41,41,32,+40,95,52,56,48,32,95,50,55,55,41,41,41,41,41,41,32,40,40,40,+67,39,32,40,83,39,32,40,83,39,32,40,67,39,32,66,41,41,41,41,+32,40,40,66,32,40,66,32,40,66,32,40,66,32,95,49,53,53,56,41,+41,41,41,32,40,40,66,32,40,66,32,67,41,41,32,67,41,41,41,32,+40,40,40,67,39,32,66,41,32,40,40,66,32,67,41,32,40,67,32,40,+40,67,32,95,49,53,54,51,41,32,95,49,50,52,41,41,41,41,32,40,+40,66,32,95,49,53,51,55,41,32,95,49,53,52,48,41,41,41,41,41,+32,95,49,53,51,50,41,41,32,40,75,32,40,75,32,40,75,32,40,95,+50,52,32,34,115,101,112,49,32,66,101,115,105,100,101,34,41,41,41,41,+41,41,32,40,75,32,40,75,32,40,75,32,40,95,50,52,32,34,115,101,+112,49,32,65,98,111,118,101,34,41,41,41,41,41,41,41,32,95,50,53,+41,41,41,32,40,40,65,32,58,49,53,55,52,32,40,40,66,32,89,41,+32,40,40,40,83,39,32,40,67,39,32,40,83,39,32,40,83,39,32,83,+41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,40,+67,39,32,40,67,39,32,83,41,41,41,41,41,32,40,40,40,67,39,32,+40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,+41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,+32,40,67,39,32,83,41,41,41,41,41,32,40,40,40,67,39,32,40,67,+39,32,40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,41,41,+32,40,40,40,67,39,32,66,41,32,40,40,66,32,40,67,39,32,40,83,+39,32,40,83,39,32,67,41,41,41,41,32,40,40,40,67,39,32,40,67,+39,32,40,67,39,32,67,41,41,41,32,40,40,40,67,39,32,40,67,39,+32,40,67,39,32,40,67,39,32,83,39,41,41,41,41,32,40,40,66,32,+40,40,67,39,32,66,41,32,66,41,41,32,40,40,40,67,39,32,66,41,+32,40,40,66,32,40,83,39,32,95,49,53,52,57,41,41,32,40,40,66,+32,40,66,32,95,49,53,55,53,41,41,32,40,40,40,83,39,32,66,41,+32,95,49,53,54,57,41,32,40,40,66,32,40,66,32,95,49,53,51,55,+41,41,32,40,40,67,32,40,40,67,32,83,39,41,32,95,49,53,51,56,+41,41,32,95,49,53,51,57,41,41,41,41,41,41,32,40,40,40,67,39,+32,66,41,32,40,95,49,53,54,52,32,95,49,50,52,41,41,32,40,40,+66,32,95,49,53,51,55,41,32,95,49,53,52,48,41,41,41,41,41,32,+75,41,41,32,40,90,32,75,41,41,41,41,32,40,40,66,32,40,66,32,+90,41,41,32,40,40,66,32,40,66,32,67,41,41,32,67,41,41,41,41,+32,40,90,32,75,41,41,41,32,73,41,41,32,40,90,32,40,90,32,75,+41,41,41,41,32,40,90,32,40,90,32,75,41,41,41,41,32,95,49,53,+55,51,41,41,41,32,40,40,65,32,58,49,53,55,53,32,40,40,67,32,+40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,+40,40,80,32,95,49,53,50,55,41,32,40,75,32,95,49,53,51,50,41,+41,41,32,40,40,40,67,39,32,66,41,32,95,49,53,53,54,41,32,95,+49,53,55,53,41,41,41,32,40,40,40,67,39,32,66,41,32,95,49,53,+53,55,41,32,95,49,53,55,53,41,41,41,32,40,90,32,95,49,53,55,+53,41,41,41,32,95,49,53,51,50,41,41,32,40,75,32,40,75,32,40,+75,32,40,95,50,52,32,34,111,110,101,76,105,110,101,114,32,66,101,115,+105,100,101,34,41,41,41,41,41,41,32,40,75,32,40,75,32,40,75,32,+40,95,50,52,32,34,111,110,101,76,105,110,101,114,32,65,98,111,118,101,+34,41,41,41,41,41,41,32,40,40,65,32,58,49,53,55,54,32,80,41,+32,40,40,65,32,58,49,53,55,55,32,40,85,32,75,41,41,32,40,40,+65,32,58,49,53,55,56,32,40,85,32,65,41,41,32,40,40,65,32,58,+49,53,55,57,32,40,40,95,49,53,55,54,32,35,49,48,48,41,32,40,+40,80,32,40,40,95,52,56,53,32,95,50,55,55,41,32,40,95,51,53,+57,32,35,51,41,41,41,32,40,40,95,52,56,53,32,95,50,55,55,41,+32,40,95,51,53,57,32,35,50,41,41,41,41,41,32,40,40,65,32,58,+49,53,56,48,32,40,95,49,53,56,49,32,95,49,53,55,57,41,41,32,+40,40,65,32,58,49,53,56,49,32,40,40,67,32,40,40,40,83,39,32,+95,49,53,56,50,41,32,95,49,53,55,55,41,32,95,49,53,55,56,41,+41,32,75,41,41,32,40,40,65,32,58,49,53,56,50,32,40,40,66,32,+40,40,67,39,32,66,41,32,66,41,41,32,40,40,40,83,39,32,40,67,+39,32,40,67,39,32,66,41,41,41,32,40,40,66,32,40,66,32,66,39,+41,41,32,40,40,40,83,39,32,40,67,39,32,66,41,41,32,40,40,66,+32,40,66,32,83,41,41,32,40,40,66,32,67,41,32,95,49,53,56,51,+41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,67,41,32,+95,49,53,56,52,41,41,32,95,49,53,51,55,41,41,41,41,32,40,40,+66,32,40,67,39,32,40,95,51,54,54,32,95,50,55,56,41,41,41,32,+40,95,52,56,49,32,95,50,55,55,41,41,41,41,41,32,40,40,65,32,+58,49,53,56,51,32,40,75,32,40,75,32,40,40,67,32,40,40,40,67,+39,32,89,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,+40,83,39,32,67,41,41,32,40,40,40,83,39,32,40,67,39,32,40,83,+39,32,40,83,39,32,67,41,41,41,41,32,40,40,40,67,39,32,40,67,+39,32,40,67,39,32,66,41,41,41,32,40,40,66,32,40,66,32,40,66,+32,80,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,+40,67,39,32,67,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,+40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,41,41,32,40,+40,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,+32,83,41,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,+39,32,40,67,39,32,67,41,41,41,41,32,40,40,40,67,39,32,40,67,+39,32,40,67,39,32,40,67,39,32,40,67,39,32,83,39,41,41,41,41,+41,32,40,40,40,67,39,32,40,67,39,32,40,83,39,32,40,83,39,32,+67,41,41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,40,+67,39,32,40,83,39,32,67,41,41,41,32,40,40,40,67,39,32,66,41,+32,40,66,39,32,80,41,41,32,40,66,32,40,66,32,40,95,52,54,51,+32,40,40,79,32,35,49,48,41,32,75,41,41,41,41,41,41,41,32,40,+85,32,40,75,32,75,41,41,41,41,32,40,40,40,67,39,32,66,41,32,+66,41,32,40,95,52,55,57,32,95,50,55,55,41,41,41,41,32,40,90,+32,75,41,41,41,32,73,41,41,32,40,90,32,40,90,32,75,41,41,41,+41,32,40,90,32,40,90,32,75,41,41,41,41,32,40,95,50,52,32,34,+100,105,115,112,108,97,121,32,108,97,121,34,41,41,41,41,32,40,40,66,+32,40,40,83,39,32,66,41,32,40,66,39,32,40,40,66,32,95,52,54,+51,41,32,40,40,67,32,95,52,52,54,41,32,35,51,50,41,41,41,41,+41,32,40,40,66,32,40,66,32,40,40,83,39,32,66,41,32,95,52,54,+51,41,41,41,32,40,40,40,67,39,32,66,41,32,66,41,32,40,40,40,+67,39,32,66,41,32,40,95,52,55,57,32,95,50,55,55,41,41,32,95,+52,49,49,41,41,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,+40,67,39,32,40,67,39,32,67,41,41,41,41,32,40,40,40,67,39,32,+40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,+41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,+32,40,67,39,32,83,41,41,41,41,41,32,40,40,40,67,39,32,40,67,+39,32,40,67,39,32,40,67,39,32,67,41,41,41,41,32,40,40,40,67,+39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,83,39,+41,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,83,39,32,+40,83,39,32,67,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,+66,41,41,32,40,40,66,32,40,66,32,40,83,39,32,67,41,41,41,32,+40,40,40,67,39,32,66,41,32,40,66,39,32,80,41,41,32,40,66,32,+40,66,32,40,95,52,54,51,32,40,40,79,32,35,49,48,41,32,75,41,+41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,40,83,39,32,66,+41,32,95,52,54,51,41,41,41,32,40,40,40,67,39,32,66,41,32,66,+41,32,40,40,40,67,39,32,66,41,32,40,95,52,55,57,32,95,50,55,+55,41,41,32,95,52,49,49,41,41,41,41,41,32,90,41,41,32,40,90,+32,75,41,41,41,32,73,41,41,32,40,90,32,40,90,32,75,41,41,41,+41,32,40,90,32,40,90,32,75,41,41,41,41,32,40,95,50,52,32,34,+100,105,115,112,108,97,121,32,108,97,121,50,34,41,41,41,41,32,40,85,+32,40,75,32,65,41,41,41,41,32,40,85,32,40,90,32,75,41,41,41,+41,32,40,90,32,75,41,41,41,32,35,48,41,41,41,41,32,40,40,65,+32,58,49,53,56,52,32,40,67,32,40,40,40,67,39,32,89,41,32,40,+40,67,32,40,40,40,67,39,32,83,39,41,32,40,40,66,32,67,41,32,+40,40,40,83,39,32,40,83,39,32,40,83,39,32,80,41,41,41,32,40,+40,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,67,41,41,+41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,+32,67,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,+32,40,67,39,32,40,67,39,32,83,39,41,41,41,41,41,32,40,40,40,+67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,67,41,41,41,41,+32,40,40,66,32,40,40,83,39,32,40,67,39,32,40,83,39,32,67,41,+41,41,32,40,40,40,83,39,32,40,67,39,32,40,83,39,32,67,41,41,+41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,40,83,39,32,67,+41,41,32,40,40,66,32,40,66,32,40,80,32,95,49,53,50,55,41,41,+41,32,40,66,32,40,66,32,95,49,53,53,53,41,41,41,41,41,32,40,+40,66,32,40,66,32,40,40,83,39,32,66,41,32,95,49,53,53,54,41,+41,41,32,40,40,67,32,40,67,39,32,66,41,41,32,95,52,49,49,41,+41,41,41,32,40,40,66,32,40,66,32,40,40,83,39,32,66,41,32,95,+49,53,53,55,41,41,41,32,40,40,40,67,39,32,66,41,32,66,41,32,+40,95,52,56,48,32,95,50,55,55,41,41,41,41,41,41,32,40,40,40,+67,39,32,40,83,39,32,40,83,39,32,40,67,39,32,66,41,41,41,41,+32,40,40,66,32,40,83,39,32,66,41,41,32,40,67,32,95,49,53,56,+53,41,41,41,32,73,41,41,41,32,95,49,53,51,50,41,41,32,40,90,+32,40,90,32,75,41,41,41,41,32,40,90,32,40,90,32,75,41,41,41,+41,32,40,95,50,52,32,34,98,101,115,116,32,103,101,116,34,41,41,41,+32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,+67,39,32,67,41,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,+40,67,39,32,40,67,39,32,40,67,39,32,67,41,41,41,41,41,32,40,+40,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,+32,40,67,39,32,83,39,41,41,41,41,41,41,32,40,40,40,67,39,32,+40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,67,41,41,41,+41,41,32,40,40,66,32,40,40,67,39,32,40,83,39,32,40,83,39,32,+40,83,39,32,67,41,41,41,41,32,40,40,40,67,39,32,40,83,39,32,+40,83,39,32,40,83,39,32,67,41,41,41,41,32,40,40,40,67,39,32,+66,41,32,40,40,66,32,40,83,39,32,40,83,39,32,67,41,41,41,32,+40,40,66,32,40,66,32,40,66,32,40,80,32,95,49,53,50,55,41,41,+41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,95,49,53,53,+53,41,41,41,41,32,40,40,40,67,39,32,66,41,32,66,41,32,40,95,+52,56,48,32,95,50,55,55,41,41,41,41,41,41,32,40,40,66,32,40,+66,32,40,66,32,40,40,83,39,32,66,41,32,95,49,53,53,54,41,41,+41,41,32,40,40,40,67,39,32,40,67,39,32,66,41,41,32,66,39,41,+32,40,40,40,67,39,32,66,41,32,40,95,52,55,57,32,95,50,55,55,+41,41,32,95,52,49,49,41,41,41,41,41,32,40,66,32,90,41,41,41,+41,32,40,40,40,67,39,32,40,83,39,32,40,83,39,32,40,83,39,32,+40,67,39,32,66,41,41,41,41,41,32,40,40,66,32,40,83,39,32,40,+83,39,32,66,41,41,41,32,40,67,32,95,49,53,56,54,41,41,41,32,+73,41,41,41,32,95,49,53,51,50,41,41,32,40,90,32,40,90,32,75,+41,41,41,41,32,40,90,32,40,90,32,75,41,41,41,41,32,40,95,50,+52,32,34,98,101,115,116,32,103,101,116,49,34,41,41,41,41,41,32,40,+85,32,65,41,41,41,32,40,85,32,75,41,41,41,32,75,41,41,41,32,+40,40,65,32,58,49,53,56,53,32,40,40,40,67,39,32,67,41,32,95,+49,53,56,54,41,32,35,48,41,41,32,40,40,65,32,58,49,53,56,54,+32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,40,83,39,32,67,+41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,95,49,53,56,55,+41,41,41,32,40,40,66,32,40,66,32,40,95,52,56,48,32,95,50,55,+55,41,41,41,32,40,40,40,83,39,32,67,41,32,40,40,40,67,39,32,+83,41,32,40,95,52,57,55,32,95,50,56,50,41,41,32,73,41,41,32,+73,41,41,41,41,32,73,41,41,32,40,40,65,32,58,49,53,56,55,32,+40,40,67,32,40,40,40,83,39,32,67,39,41,32,40,40,67,32,40,95,+52,57,55,32,95,50,56,50,41,41,32,35,48,41,41,32,40,40,40,67,+39,32,67,41,32,40,40,40,67,39,32,40,67,39,32,83,41,41,32,40,+40,40,67,39,32,40,67,39,32,83,41,41,32,40,40,40,67,39,32,40,+67,39,32,67,41,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,+39,32,40,67,39,32,83,39,41,41,32,40,40,66,32,40,67,32,40,40,+80,32,95,49,50,53,41,32,40,75,32,95,49,50,53,41,41,41,41,32,+40,40,66,32,40,66,32,95,49,53,56,55,41,41,32,40,40,40,67,39,+32,66,41,32,40,95,52,56,48,32,95,50,55,55,41,41,32,95,52,49,+49,41,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,+41,32,95,49,50,52,41,41,32,40,90,32,40,90,32,75,41,41,41,41,+32,40,90,32,40,90,32,75,41,41,41,41,32,40,95,50,52,32,34,102,+105,116,115,34,41,41,41,41,32,95,49,50,52,41,41,32,40,40,65,32,+58,49,53,56,56,32,40,40,66,32,40,66,32,67,41,41,32,80,41,41,+32,40,40,65,32,58,49,53,56,57,32,40,85,32,40,90,32,75,41,41,+41,32,40,40,65,32,58,49,53,57,48,32,40,85,32,40,75,32,75,41,+41,41,32,40,40,65,32,58,49,53,57,49,32,40,85,32,40,75,32,65,+41,41,41,32,40,40,65,32,58,49,53,57,50,32,40,90,32,40,40,66,+32,40,66,32,95,52,54,51,41,41,32,95,49,53,57,48,41,41,41,32,+40,40,65,32,58,49,53,57,51,32,40,40,40,67,39,32,67,41,32,40,+40,67,32,95,49,53,56,57,41,32,35,48,41,41,32,75,41,41,32,40,+40,65,32,58,49,53,57,52,32,40,40,66,32,95,49,53,57,57,41,32,+95,49,53,57,53,41,41,32,40,40,65,32,58,49,53,57,53,32,40,40,+67,32,95,49,53,56,57,41,32,35,48,41,41,32,40,40,65,32,58,49,+53,57,54,32,95,52,54,50,41,32,40,40,65,32,58,49,53,57,55,32,+95,52,54,51,41,32,40,40,65,32,58,49,53,57,56,32,40,40,67,32,+83,41,32,40,40,66,32,40,66,32,40,95,52,54,50,32,35,52,48,41,+41,41,32,40,40,67,32,66,41,32,40,95,52,54,50,32,35,52,49,41,+41,41,41,41,32,40,40,65,32,58,49,53,57,57,32,40,40,66,32,40,+67,32,40,40,67,32,83,39,41,32,40,40,66,32,40,95,52,54,50,32,+35,57,49,41,41,32,40,95,52,54,50,32,35,57,51,41,41,41,41,41,+32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,95,52,54,50,32,+35,57,49,41,41,41,41,41,32,40,40,40,83,39,32,66,41,32,40,67,+39,32,66,41,41,32,40,40,66,32,40,66,32,89,41,41,32,40,40,66,+32,40,40,67,39,32,66,41,32,40,40,66,32,80,41,32,40,95,52,54,+50,32,35,57,51,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,+40,66,32,40,95,52,54,50,32,35,52,52,41,41,41,41,41,32,40,67,+39,32,66,41,41,41,41,41,41,41,41,32,40,40,65,32,58,49,54,48,+48,32,35,49,48,41,32,40,40,65,32,58,49,54,48,49,32,35,49,49,+41,32,40,40,65,32,58,49,54,48,50,32,40,40,67,32,40,40,83,32,+40,40,40,83,39,32,83,39,41,32,40,40,40,67,39,32,40,95,50,48,+50,32,95,49,51,49,41,41,32,95,52,50,56,41,32,35,52,53,41,41,+32,85,41,41,32,40,40,66,32,40,66,32,40,40,95,52,56,48,32,95,+50,55,55,41,32,35,48,41,41,41,32,40,40,66,32,85,41,32,95,52,+50,57,41,41,41,41,32,40,40,95,51,57,57,32,40,40,40,67,39,32,+40,67,39,32,40,95,52,56,48,32,95,50,55,55,41,41,41,32,40,40,+40,67,39,32,66,41,32,40,40,66,32,40,95,52,55,57,32,95,50,55,+55,41,41,32,40,40,67,32,40,95,52,56,49,32,95,50,55,55,41,41,+32,35,49,48,41,41,41,32,95,49,51,55,41,41,32,40,95,49,51,55,+32,35,52,56,41,41,41,32,35,48,41,41,41,32,40,40,65,32,58,49,+54,48,51,32,95,49,51,54,49,41,32,40,40,65,32,58,49,54,48,52,+32,40,40,40,67,39,32,67,41,32,40,40,66,32,95,49,53,57,57,41,+32,40,66,32,95,52,54,51,41,41,41,32,75,41,41,32,40,40,65,32,+58,49,54,48,53,32,40,40,66,32,40,66,32,85,41,41,32,40,40,66,+32,40,66,32,40,66,32,40,66,32,40,95,52,54,51,32,40,40,79,32,+35,52,48,41,32,75,41,41,41,41,41,41,32,40,40,40,67,39,32,66,+41,32,40,40,66,32,40,67,39,32,66,41,41,32,40,66,32,95,52,54,+51,41,41,41,32,40,40,66,32,40,66,32,40,95,52,54,51,32,40,40,+79,32,35,52,52,41,32,75,41,41,41,41,32,40,40,67,32,40,67,39,+32,95,52,54,51,41,41,32,40,40,79,32,35,52,49,41,32,75,41,41,+41,41,41,41,41,32,40,40,65,32,58,49,54,48,54,32,40,40,83,32,+40,85,32,95,52,54,49,41,41,32,40,90,32,40,90,32,40,40,67,32,+40,95,52,50,54,32,40,40,95,50,54,51,32,95,49,50,50,41,32,40,+40,67,32,40,95,50,48,50,32,95,49,51,49,41,41,32,35,49,48,41,+41,41,41,32,40,40,40,83,39,32,80,41,32,40,40,67,32,79,41,32,+75,41,41,32,40,90,32,40,40,40,67,39,32,66,41,32,95,52,54,50,+41,32,95,49,54,48,54,41,41,41,41,41,41,41,41,32,40,40,65,32,+58,49,54,48,55,32,40,95,51,57,52,32,40,40,67,32,95,52,54,51,+41,32,40,40,79,32,35,49,48,41,32,75,41,41,41,41,32,40,40,65,+32,58,49,54,48,56,32,40,40,66,32,40,40,83,32,40,85,32,95,52,+54,49,41,41,32,40,90,32,40,90,32,40,40,66,32,40,40,40,83,39,+32,95,52,54,50,41,32,40,85,32,75,41,41,32,40,40,66,32,95,49,+54,48,56,41,32,40,85,32,65,41,41,41,41,32,40,95,52,50,54,32,+40,40,95,50,54,51,32,95,49,50,50,41,32,95,49,52,53,41,41,41,+41,41,41,41,32,40,95,52,50,53,32,95,49,52,53,41,41,41,32,40,+40,65,32,58,49,54,48,57,32,40,95,52,51,49,32,40,40,79,32,35,+51,50,41,32,75,41,41,41,32,40,40,65,32,58,49,54,49,48,32,40,+40,40,67,39,32,40,83,39,32,95,52,54,51,41,41,32,40,40,40,67,+39,32,40,67,39,32,95,52,52,54,41,41,32,40,40,40,67,39,32,66,+41,32,40,95,52,56,48,32,95,50,55,55,41,41,32,95,52,49,49,41,+41,32,35,51,50,41,41,32,73,41,41,32,40,40,65,32,58,49,54,49,+49,32,40,40,80,32,95,49,51,52,49,41,32,40,40,40,67,39,32,66,+41,32,95,49,51,57,57,41,32,95,49,54,49,49,41,41,41,32,40,40,+65,32,58,49,54,49,50,32,40,40,83,32,40,85,32,40,40,40,110,111,+77,97,116,99,104,32,34,46,47,108,105,98,47,84,101,120,116,47,83,116,+114,105,110,103,46,104,115,34,41,32,35,54,54,41,32,35,49,41,41,41,+32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,40,67,39,+32,40,67,39,32,40,67,39,32,66,41,41,41,32,40,40,40,67,39,32,+40,67,39,32,40,67,39,32,66,41,41,41,32,40,40,40,67,39,32,40,+67,39,32,66,41,41,32,40,40,66,32,40,40,67,39,32,83,39,41,32,+40,40,67,32,40,95,50,48,50,32,95,49,51,49,41,41,32,35,52,53,+41,41,41,32,85,41,41,32,40,40,66,32,40,66,32,40,95,50,54,49,+32,40,95,52,56,50,32,40,95,53,49,57,32,95,51,48,57,41,41,41,+41,41,32,85,41,41,41,32,40,40,66,32,40,67,32,40,95,52,50,54,+32,95,49,52,49,41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,+66,32,67,41,32,40,40,40,83,39,32,83,41,32,40,40,66,32,40,40,+67,39,32,83,39,41,32,83,41,41,32,40,40,66,32,40,66,32,40,40,+67,39,32,40,67,39,32,66,41,41,32,40,67,32,40,40,67,32,61,61,+41,32,35,52,54,41,41,41,41,41,32,40,40,66,32,40,66,32,40,67,+32,40,95,52,50,54,32,95,49,52,49,41,41,41,41,32,40,40,40,67,+39,32,66,41,32,40,66,39,32,40,40,66,32,67,41,32,40,40,40,67,+39,32,67,41,32,40,40,66,32,40,40,67,39,32,83,39,41,32,83,41,+41,32,40,66,32,40,40,67,39,32,40,67,39,32,66,41,41,32,40,67,+32,40,40,40,67,39,32,40,95,50,48,50,32,95,49,51,49,41,41,32,+95,49,52,55,41,32,35,49,48,49,41,41,41,41,41,41,32,73,41,41,+41,41,32,40,40,40,67,39,32,66,41,32,40,95,52,55,57,32,40,95,+53,49,57,32,95,51,48,57,41,41,41,32,40,40,40,83,39,32,40,95,+52,56,49,32,40,95,53,49,57,32,95,51,48,57,41,41,41,32,40,40,+66,32,40,95,53,51,50,32,95,51,49,48,41,41,32,95,51,52,53,41,+41,32,40,40,66,32,40,40,95,50,54,48,32,40,40,67,32,40,40,80,+32,40,95,53,50,48,32,40,40,80,32,95,51,48,57,41,32,95,51,48,+54,41,41,41,32,95,50,55,56,41,41,32,95,50,56,50,41,41,32,40,+40,95,52,56,53,32,40,95,53,49,57,32,95,51,48,57,41,41,32,40,+95,51,53,57,32,35,49,48,41,41,41,41,32,40,40,66,32,40,95,50,+54,49,32,40,95,52,56,50,32,95,50,55,55,41,41,41,32,95,52,49,+49,41,41,41,41,41,41,41,41,41,32,40,40,40,67,39,32,67,41,32,+40,40,66,32,40,40,67,39,32,83,39,41,32,83,41,41,32,40,66,32,+40,40,67,39,32,40,67,39,32,66,41,41,32,40,67,32,40,40,40,67,+39,32,40,95,50,48,50,32,95,49,51,49,41,41,32,95,49,52,55,41,+32,35,49,48,49,41,41,41,41,41,41,32,73,41,41,41,41,32,40,40,+66,32,40,95,53,51,50,32,95,51,49,48,41,41,32,95,51,52,53,41,+41,41,41,41,32,40,40,40,83,39,32,40,83,39,32,83,41,41,32,40,+40,66,32,40,66,32,40,67,32,83,41,41,41,32,40,40,66,32,40,66,+32,40,40,67,39,32,40,67,39,32,66,41,41,32,40,67,32,40,40,67,+32,61,61,41,32,35,52,51,41,41,41,41,41,32,40,40,67,39,32,66,+41,32,40,95,52,56,49,32,40,95,53,49,57,32,95,51,48,57,41,41,+41,41,41,41,32,40,40,40,83,39,32,40,83,39,32,83,41,41,32,40,+40,66,32,40,66,32,40,67,32,83,41,41,41,32,40,40,66,32,40,66,+32,40,40,67,39,32,40,67,39,32,66,41,41,32,40,67,32,40,40,67,+32,61,61,41,32,35,52,53,41,41,41,41,41,32,40,40,67,39,32,66,+41,32,40,95,50,53,52,32,40,95,53,50,48,32,40,40,80,32,95,51,+48,57,41,32,95,51,48,54,41,41,41,41,41,41,41,32,40,40,67,39,+32,66,41,32,40,95,52,56,49,32,40,95,53,49,57,32,95,51,48,57,+41,41,41,41,41,41,41,32,40,40,66,32,40,40,95,51,56,52,32,40,+40,67,32,40,40,80,32,40,95,53,49,57,32,95,51,48,57,41,41,32,+95,51,48,57,41,41,32,95,51,48,54,41,41,32,40,40,95,52,56,53,+32,40,95,53,49,57,32,95,51,48,57,41,41,32,40,95,51,53,57,32,+35,49,48,41,41,41,41,32,95,51,52,53,41,41,41,41,32,40,40,65,+32,58,49,54,49,51,32,95,49,52,48,52,41,32,95,57,56,57,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,+};+unsigned char *combexpr = data;+int combexprlen = 281032;
+ ghc/Compat.hs view
@@ -0,0 +1,153 @@+-- Copyright 2023 Lennart Augustsson+-- See LICENSE file for full license.+-- Functions for GHC that are defined in the UHS libs.+module Compat(module Compat) where+--import Control.Exception+import Data.Char+import Data.Maybe+import Data.Time+import Data.Time.Clock.POSIX+--import qualified Control.Monad as M+import Control.Exception+import Data.List+import System.Environment+import System.IO++------- Int --------++_integerToInt :: Integer -> Int+_integerToInt = fromInteger++_integerToDouble :: Integer -> Double+_integerToDouble = fromIntegral++-- Same as in Data.Integer+_integerToIntList :: Integer -> [Int]+_integerToIntList i | i < 0 = -1 : to (-i)+ | otherwise = to i+ where to 0 = []+ to n = fromInteger r : to q where (q, r) = quotRem n 2147483648++------- List --------++elemBy :: (a -> a -> Bool) -> a -> [a] -> Bool+elemBy eq a = any (eq a)++-- A simple "quicksort" for now.+sortLE :: forall a . (a -> a -> Bool) -> [a] -> [a]+sortLE _ [] = []+sortLE le (x:xs) = sortLE le lt ++ (x : sortLE le ge)+ where (ge, lt) = partition (le x) xs++showListS :: (a -> String) -> [a] -> String+showListS sa arg =+ let+ showRest as =+ case as of+ [] -> "]"+ x : xs -> "," ++ sa x ++ showRest xs+ in+ case arg of+ [] -> "[]"+ a : as -> "[" ++ sa a ++ showRest as++anySame :: (Eq a) => [a] -> Bool+anySame = anySameBy (==)++anySameBy :: (a -> a -> Bool) -> [a] -> Bool+anySameBy _ [] = False+anySameBy eq (x:xs) = elemBy eq x xs || anySameBy eq xs++deleteAllBy :: forall a . (a -> a -> Bool) -> a -> [a] -> [a]+deleteAllBy _ _ [] = []+deleteAllBy eq x (y:ys) = if eq x y then deleteAllBy eq x ys else y : deleteAllBy eq x ys++deleteAllsBy :: forall a . (a -> a -> Bool) -> [a] -> [a] -> [a]+deleteAllsBy eq = foldl (flip (deleteAllBy eq))++padLeft :: Int -> String -> String+padLeft n s = replicate (n - length s) ' ' ++ s++------- Exception --------++newtype Exn = Exn String+ deriving (Show)+instance Exception Exn++------- IO --------++openFileM :: FilePath -> IOMode -> IO (Maybe Handle)+openFileM path m = do+ r <- (try $ openFile path m) :: IO (Either IOError Handle)+ case r of+ Left _ -> return Nothing+ Right h -> return (Just h)++getTimeMilli :: IO Int+getTimeMilli = floor . (1000 *) . nominalDiffTimeToSeconds . utcTimeToPOSIXSeconds <$> getCurrentTime++-- A hack until we have a real withArgs+withDropArgs :: Int -> IO a -> IO a+withDropArgs i ioa = do+ as <- getArgs+ withArgs (drop i as) ioa++------- Read --------++readInteger :: String -> Integer+readInteger = read++-- Convert string in scientific notation to a rational number.+readRational :: String -> Rational+readRational "" = undefined+readRational acs@(sgn:as) | sgn == '-' = negate $ rat1 as+ | otherwise = rat1 acs+ where+ rat1 s1 =+ case span isDigit s1 of+ (ds1, cr1) | ('.':r1) <- cr1 -> rat2 f1 r1+ | (c:r1) <- cr1, toLower c == 'e' -> rat3 f1 r1+ | otherwise -> f1+ where f1 = toRational (readInteger ds1)++ rat2 f1 s2 =+ case span isDigit s2 of+ (ds2, cr2) | (c:r2) <- cr2, toLower c == 'e' -> rat3 f2 r2+ | otherwise -> f2+ where f2 = f1 + toRational (readInteger ds2) * 10 ^^ (negate $ length ds2)++ rat3 f2 ('+':s) = f2 * expo s+ rat3 f2 ('-':s) = f2 / expo s+ rat3 f2 s = f2 * expo s++ expo s = 10 ^ readInteger s++partitionM :: Monad m => (a -> m Bool) -> [a] -> m ([a], [a])+partitionM _ [] = return ([], [])+partitionM p (x:xs) = do+ b <- p x+ (ts,fs) <- partitionM p xs+ return $ if b then (x:ts, fs) else (ts, x:fs)++substString :: forall a . Eq a => [a] -> [a] -> [a] -> [a]+substString _ _ [] = []+substString from to xs@(c:cs) | Just rs <- stripPrefix from xs = to ++ substString from to rs+ | otherwise = c : substString from to cs++openTmpFile :: String -> IO (String, Handle)+openTmpFile tmplt = do+ mtmp <- lookupEnv "TMPDIR"+ let tmp = fromMaybe "/tmp" mtmp+ res <- try $ openTempFile tmp tmplt+ case res of+ Right x -> return x+ Left (_::SomeException) -> openTempFile "" tmplt++hSerialize :: Handle -> a -> IO ()+hSerialize _ _ = error "ghc: hSerialize"++hDeserialize :: Handle -> IO a+hDeserialize _ = error "ghc: hDeserialize"++usingMhs :: Bool+usingMhs = False
+ ghc/Control/Alternative.hs view
@@ -0,0 +1,6 @@+module Control.Alternative(+ Alternative(..),+ guard,+ ) where+import Control.Applicative+import Control.Monad
+ ghc/Data/Double.hs view
@@ -0,0 +1,1 @@+module Data.Double(Double) where
+ ghc/PrimTable.hs view
@@ -0,0 +1,91 @@+module PrimTable(module PrimTable) where+import Data.Char+import Data.Maybe+import System.IO+import Unsafe.Coerce+import GHC.Types(Any)++primitive :: String -> Any+primitive s = fromMaybe (error $ "primitive: " ++ s) $ lookup s primOps++newtype DIO a = DIO { unDIO :: IO a }++primOps :: [(String, Any)]+primOps =+ [ comb "S" (\ f g x -> f x (g x))+ , comb "S'" (\ k f g x -> k f x (g x))+ , comb "K" (\ x _y -> x)+ , comb "A" (\ _x y -> y)+ , comb "T" (\ x y -> y x)+ , comb "I" (\ x -> x)+ , comb "Y" (\ f -> let r = f r in r)+ , comb "B" (\ f g x -> f (g x))+ , comb "B'" (\ k f g x -> k f (g x))+ , comb "BK" (\ f g _x -> f g)+ , comb "C" (\ f g x -> f x g)+ , comb "C'" (\ k f g x -> k f x g)+ , comb "P" (\ x y f -> f x y)+ , comb "O" (\ x y _g f -> f x y)++ , arith "+" (+)+ , arith "-" (-)+ , arith "*" (*)+ , arith "quot" quot+ , arith "rem" rem+ , arith "subtract" subtract+ , farith "fadd" (+)+ , farith "fsub" (-)+ , farith "fmul" (*)+ , cmp "feq" (==)+ , cmp "fne" (/=)+ , cmp "flt" (<)+ , cmp "fle" (<=)+ , cmp "fgt" (>)+ , cmp "fge" (>=)+ , comb "fshow" (show :: Double -> String)+ , cmp "==" (==)+ , cmp "/=" (/=)+ , cmp "<" (<)+ , cmp "<=" (<=)+ , cmp ">" (>)+ , cmp ">=" (>=)+ , cmp "error" err+ , comb "ord" ord+ , comb "chr" chr+ , comb "IO.>>=" iobind+ , comb "IO.>>" iothen+ , comb "IO.return" ioret+-- , comb "IO.getChar" getc+ , comb "IO.putChar" putc+ , comb "IO.stdin" stdin+ , comb "IO.stdout" stdout+ , comb "IO.stderr" stderr+ ]+ where+ comb n f = (n, unsafeCoerce f)+ arith :: String -> (Int -> Int -> Int) -> (String, Any)+ arith = comb+ farith :: String -> (Double -> Double -> Double) -> (String, Any)+ farith = comb+ cmp :: String -> (Int -> Int -> Bool) -> (String, Any)+ cmp n f = comb n (\ x y -> if f x y then cTrue else cFalse)+ cTrue _x y = y+ cFalse x _y = x+ iobind :: DIO a -> (a -> DIO b) -> DIO b+ iobind a k = DIO (unDIO a >>= \ x -> unDIO (k x))+ iothen :: DIO a -> DIO b -> DIO b+ iothen a b = DIO (unDIO a >> unDIO b)+ ioret :: a -> DIO a+ ioret a = DIO (return a)+-- getc h = undefined -- fromEnum <$> hGetChar h -- XXX+ putc :: Handle -> Int -> DIO ()+ putc h c = DIO $ do+-- let h = unsafeCoerce hh :: Handle+-- c = unsafeCoerce cc :: Int+-- print (h, c)+ hPutChar h (toEnum c)+-- open = undefined+-- close = undefined+-- isnull = undefined++ err _ = error "ERROR"
+ ghc/System/Console/SimpleReadline.hs view
@@ -0,0 +1,10 @@+module System.Console.SimpleReadline(+ getInputLine,+ getInputLineHist+ ) where++getInputLine :: String -> IO (Maybe String)+getInputLine _ = error "No getInputLine for ghc"++getInputLineHist :: FilePath -> String -> IO (Maybe String)+getInputLineHist _ _ = error "No getInputLineHist for ghc"
+ lib/Control/Alternative.hs view
@@ -0,0 +1,21 @@+module Control.Alternative(module Control.Alternative) where+import Primitives+import Control.Applicative+import Data.Bool_Type+import Data.Functor+import Data.List++infixl 3 <|>++class Applicative f => Alternative (f :: Type -> Type) where+ empty :: forall a . f a+ (<|>) :: forall a . f a -> f a -> f a++ some :: forall a . f a -> f [a]+ some a = (:) <$> a <*> many a++ many :: forall a . f a -> f [a]+ many a = some a <|> pure []++guard :: forall (f :: Type -> Type) a . Alternative f => Bool -> f ()+guard b = if b then pure () else empty
+ lib/Control/Applicative.hs view
@@ -0,0 +1,16 @@+module Control.Applicative(module Control.Applicative) where+import Primitives -- for fixity+import Data.Functor+import Data.Function++infixl 4 <*>+infixl 4 *>+infixl 4 <*++class Functor f => Applicative (f :: Type -> Type) where+ pure :: forall a . a -> f a+ (<*>) :: forall a b . f (a -> b) -> f a -> f b+ (*>) :: forall a b . f a -> f b -> f b+ (<*) :: forall a b . f a -> f b -> f a+ a1 *> a2 = (id <$ a1) <*> a2+ a1 <* a2 = (const <$> a1) <*> a2
+ lib/Control/DeepSeq.hs view
@@ -0,0 +1,12 @@+module Control.DeepSeq(module Control.DeepSeq) where+import Primitives+import Prelude++rnf :: forall a . a -> ()+rnf = primRnfErr++deepseq :: forall a b . a -> b -> b+deepseq a b = rnf a `seq` b++force :: forall a . a -> a+force x = rnf x `seq` x
+ lib/Control/Error.hs view
@@ -0,0 +1,11 @@+-- Copyright 2023 Lennart Augustsson+-- See LICENSE file for full license.+module Control.Error(module Control.Error) where+import Primitives+import Data.Char_Type++error :: forall a . String -> a+error = primError++undefined :: forall a . a+undefined = error "undefined"
+ lib/Control/Exception.hs view
@@ -0,0 +1,20 @@+module Control.Exception(+ catch, try,+ throwIO,+ Exn(..)+ ) where+import Primitives+import Prelude++newtype Exn = Exn String++catch :: forall a . IO a -> (Exn -> IO a) -> IO a+catch ioa hdl = primCatch ioa (hdl . Exn)++try :: forall a . IO a -> IO (Either Exn a)+try ioa = catch (fmap Right ioa) (return . Left)++throwIO :: forall a . Exn -> IO a+throwIO (Exn s) =+ let e = error s+ in seq e (return e)
+ lib/Control/Monad.hs view
@@ -0,0 +1,114 @@+module Control.Monad(module Control.Monad) where+import Primitives -- for fixity+import Control.Applicative+import Control.Error+import Data.Bool+import Data.Char_Type+import Data.Function+import Data.Functor+import Data.List_Type+--import Data.Maybe++infixl 1 >>+infixl 1 >>=++class (Applicative m) => Monad (m :: Type -> Type) where+ (>>=) :: forall a b . m a -> (a -> m b) -> m b+ (>>) :: forall a b . m a -> m b -> m b+ ma >> mb = ma >>= \ _ -> mb++ -- Maybe remove this+ return :: forall a . a -> m a+ return = pure++ap :: forall (m :: Type -> Type) a b . Monad m => m (a -> b) -> m a -> m b+ap f a = do+ f' <- f+ a' <- a+ return (f' a')++class Monad m => MonadFail (m :: Type -> Type) where+ fail :: forall a . String -> m a+ fail = error++mapM :: forall (m :: Type -> Type) a b . Monad m => (a -> m b) -> [a] -> m [b]+mapM f =+ let+ rec arg =+ case arg of+ [] -> return []+ a : as -> do+ b <- f a+ bs <- rec as+ return (b : bs)+ in rec++mapM_ :: forall (m :: Type -> Type) a b . Monad m => (a -> m b) -> [a] -> m ()+mapM_ f =+ let+ rec arg =+ case arg of+ [] -> return ()+ a : as -> do+ _ <- f a+ rec as+ in rec++when :: forall (m :: Type -> Type) . Monad m => Bool -> m () -> m ()+when False _ = return ()+when True ma = ma++sequence :: forall (m :: Type -> Type) a . Monad m => [m a] -> m [a]+sequence = mapM id++(=<<) :: forall (m :: Type -> Type) a b . Monad m => (a -> m b) -> m a -> m b+(=<<) = flip (>>=)++infixr 1 <=<+(<=<) :: forall (m :: Type -> Type) a b c . Monad m => (b -> m c) -> (a -> m b) -> (a -> m c)+f <=< g = \ a -> do+ b <- g a+ f b++infixr 1 >=>+(>=>) :: forall (m :: Type -> Type) a b c . Monad m => (a -> m b) -> (b -> m c) -> (a -> m c)+(>=>) = flip (<=<)++filterM :: forall (m :: Type -> Type) a . Monad m => (a -> m Bool) -> [a] -> m [a]+filterM _ [] = return []+filterM p (x:xs) = do+ b <- p x+ ts <- filterM p xs+ return $ if b then x : ts else ts++partitionM :: forall (m :: Type -> Type) a . Monad m => (a -> m Bool) -> [a] -> m ([a], [a])+partitionM _ [] = return ([], [])+partitionM p (x:xs) = do+ b <- p x+ (ts,fs) <- partitionM p xs+ return $ if b then (x:ts, fs) else (ts, x:fs)++instance forall a . Functor ((->) a) where+ fmap = (.)++instance forall a . Applicative ((->) a) where+ pure = const+ f <*> g = \ a -> f a (g a)++instance forall a . Monad ((->) a) where+ x >>= y = \ z -> y (x z) z++{-+-- Same for Maybe+instance Functor Maybe where+ fmap _ Nothing = Nothing+ fmap f (Just a) = Just (f a)++instance Applicative Maybe where+ pure a = Just a+ (<*>) = ap++instance Monad Maybe where+ Nothing >>= _ = Nothing+ Just a >>= f = f a+-}
+ lib/Control/Monad/State/Strict.hs view
@@ -0,0 +1,110 @@+{-# LANGUAGE QualifiedDo #-}+module Control.Monad.State.Strict(+ module Control.Monad.State.Strict,+ module Control.Monad,+ ) where+import Prelude+import Control.Monad++data State s a = S (s -> (a, s))++instance forall s . Functor (State s) where+ fmap f sa = S $ \ s ->+ case runState sa s of+ (a, ss) -> (f a, ss)++instance forall s . Applicative (State s) where+ pure a = S $ \ s -> (a, s)+ (<*>) = ap+ (*>) m k = S $ \ s ->+ case runState m s of+ (_, ss) -> runState k ss++instance forall s . Monad (State s) where+ (>>=) m k = S $ \ s ->+ case runState m s of+ (a, ss) -> runState (k a) ss+ (>>) = (*>)+ return = pure++runState :: forall s a . State s a -> (s -> (a,s))+runState (S x) = x++evalState :: forall s a . State s a -> (s -> a)+evalState sa = fst . runState sa++{-+(>>=) :: forall s a b . State s a -> (a -> State s b) -> State s b+(>>=) m k = S $ \ s ->+ case runState m s of+ (a, ss) -> runState (k a) ss++(>>) :: forall s a b . State s a -> State s b -> State s b+(>>) m k = S $ \ s ->+ case runState m s of+ (_, ss) -> runState k ss++return :: forall s a . a -> State s a+return a = S $ \ s -> (a, s)++fmap :: forall s a b . (a -> b) -> State s a -> State s b+fmap f sa = S $ \ s ->+ case runState sa s of+ (a, ss) -> (f a, ss)++(<$>) :: forall s a b . (a -> b) -> State s a -> State s b+(<$>) = Control.Monad.State.Strict.fmap++(<*>) :: forall s a b . State s (a -> b) -> State s a -> State s b+(<*>) sf sa = Control.Monad.State.Strict.do+ f <- sf+ a <- sa+ Control.Monad.State.Strict.return (f a)+-}++modify :: forall s . (s -> s) -> State s ()+modify f = S $ \ s -> ((), f s)++put :: forall s . s -> State s ()+put s = S $ \ _ -> ((), s)++get :: forall s . State s s+get = S $ \ s -> (s, s)++gets :: forall s a . (s -> a) -> State s a+gets f = S $ \ s -> (f s, s)++{-+mapM :: forall s a b . (a -> State s b) -> [a] -> State s [b]+mapM f =+ let+ rec arg =+ case arg of+ [] -> Control.Monad.State.Strict.return []+ a : as -> Control.Monad.State.Strict.do+ b <- f a+ bs <- rec as+ Control.Monad.State.Strict.return (b : bs)+ in rec++mapM_ :: forall s a b . (a -> State s b) -> [a] -> State s ()+mapM_ f =+ let+ rec arg =+ case arg of+ [] -> Control.Monad.State.Strict.return ()+ a : as -> Control.Monad.State.Strict.do+ f a+ rec as+ in rec++fail :: forall s a . String -> State s a+fail = error++when :: forall s . Bool -> State s () -> State s ()+when True s = s+when False _ = Control.Monad.State.Strict.return ()++sequence :: forall s a . [State s a] -> State s [a]+sequence = Control.Monad.State.Strict.mapM id+-}
+ lib/Data/Bits.hs view
@@ -0,0 +1,93 @@+module Data.Bits(module Data.Bits) where+import Primitives+import Control.Error+import Data.Bool+import Data.Eq+import Data.Int()+import Data.Maybe+import Data.Ord+import Data.Num++infixl 8 `shift`, `rotate`, `shiftL`, `shiftR`, `rotateL`, `rotateR`+infixl 7 .&.+infixl 6 `xor`+infixl 5 .|.++class Eq a => Bits a where+ (.&.) :: a -> a -> a+ (.|.) :: a -> a -> a+ xor :: a -> a -> a+ complement :: a -> a+ shift :: a -> Int -> a+ rotate :: a -> Int -> a+ zeroBits :: a+ bit :: Int -> a+ setBit :: a -> Int -> a+ clearBit :: a -> Int -> a+ complementBit :: a -> Int -> a+ testBit :: a -> Int -> Bool+ shiftL :: a -> Int -> a+ unsafeShiftL :: a -> Int -> a+ shiftR :: a -> Int -> a+ unsafeShiftR :: a -> Int -> a+ rotateL :: a -> Int -> a+ rotateR :: a -> Int -> a+ popCount :: a -> Int+ bitSizeMaybe :: a -> Maybe Int+ bitSize :: a -> Int++ x `shift` i | i<0 = x `shiftR` (negate i)+ | i>0 = x `shiftL` i+ | otherwise = x+++ x `rotate` i | i<0 = x `rotateR` (negate i)+ | i>0 = x `rotateL` i+ | otherwise = x++ {-+ x `rotate` i | i<0 && isSigned x && x<0+ = let left = i+bitSize x in+ ((x `shift` i) .&. complement ((-1) `shift` left))+ .|. (x `shift` left)+ | i<0 = (x `shift` i) .|. (x `shift` (i+bitSize x))+ | i==0 = x+ | i>0 = (x `shift` i) .|. (x `shift` (i-bitSize x))+ -}++ zeroBits = clearBit (bit 0) 0+ bitSize b = fromMaybe (error "bitSize is undefined") (bitSizeMaybe b)+ x `setBit` i = x .|. bit i+ x `clearBit` i = x .&. complement (bit i)+ x `complementBit` i = x `xor` bit i++ x `shiftL` i = x `shift` i+ x `unsafeShiftL` i = x `shiftL` i+ x `shiftR` i = x `shift` (negate i)+ x `unsafeShiftR` i = x `shiftR` i++ x `rotateL` i = x `rotate` i++ x `rotateR` i = x `rotate` (negate i)+++class Bits b => FiniteBits b where+ finiteBitSize :: b -> Int+ countLeadingZeros :: b -> Int+ countTrailingZeros :: b -> Int++ countLeadingZeros x = (w - 1) - go (w - 1)+ where+ go i | i < 0 = i -- no bit set+ | testBit x i = i+ | otherwise = go (i - 1)++ w = finiteBitSize x++ countTrailingZeros x = go 0+ where+ go i | i >= w = i+ | testBit x i = i+ | otherwise = go (i + 1)++ w = finiteBitSize x
+ lib/Data/Bool.hs view
@@ -0,0 +1,40 @@+-- Copyright 2023 Lennart Augustsson+-- See LICENSE file for full license.+module Data.Bool(+ module Data.Bool,+ module Data.Bool_Type+ ) where+import Primitives+import Data.Bool_Type+import Data.Bounded+import Data.Eq+import Text.Show++instance Eq Bool where+ False == x = not x+ True == x = x++instance Show Bool where+ showsPrec _ False = showString "False"+ showsPrec _ True = showString "True"++instance Bounded Bool where+ minBound = False+ maxBound = True++infixr 2 ||+(||) :: Bool -> Bool -> Bool+(||) False y = y+(||) True _ = True++infixr 3 &&+(&&) :: Bool -> Bool -> Bool+(&&) False _ = False+(&&) True y = y++not :: Bool -> Bool+not False = True+not True = False++otherwise :: Bool+otherwise = True
+ lib/Data/Bool_Type.hs view
@@ -0,0 +1,4 @@+-- Copyright 2023 Lennart Augustsson+-- See LICENSE file for full license.+module Data.Bool_Type(module Data.Bool_Type) where+data Bool = False | True
+ lib/Data/Bounded.hs view
@@ -0,0 +1,6 @@+module Data.Bounded(module Data.Bounded) where+import Primitives++class Bounded a where+ minBound :: a+ maxBound :: a
+ lib/Data/Char.hs view
@@ -0,0 +1,107 @@+-- Copyright 2023 Lennart Augustsson+-- See LICENSE file for full license.+module Data.Char(+ module Data.Char,+ module Data.Char_Type -- exports Char and String+ ) where+import Primitives+import Control.Error+import Data.Bool+import Data.Bounded+import Data.Char_Type+import Data.Eq+import Data.Function+import Data.Int+import Data.List_Type+import Data.Num+import Data.Ord+import Text.Show++instance Eq Char where+ (==) = primCharEQ+ (/=) = primCharNE++instance Ord Char where+ compare = primCompare+ (<) = primCharLT+ (<=) = primCharLE+ (>) = primCharGT+ (>=) = primCharGE++instance Eq String where+ (==) = primStringEQ++instance Ord String where+ compare = primCompare+ x < y = primCompare x y == LT+ x <= y = primCompare x y /= GT+ x > y = primCompare x y == GT+ x >= y = primCompare x y /= LT++-- ASCII only for now+instance Bounded Char where+ minBound = chr 0+ maxBound = chr 127++chr :: Int -> Char+chr = primChr++ord :: Char -> Int+ord = primOrd++isLower :: Char -> Bool+isLower c = (primCharLE 'a' c) && (primCharLE c 'z')++isUpper :: Char -> Bool+isUpper c = (primCharLE 'A' c) && (primCharLE c 'Z')++isAlpha :: Char -> Bool+isAlpha c = isLower c || isUpper c++isDigit :: Char -> Bool+isDigit c = (primCharLE '0' c) && (primCharLE c '9')++isHexDigit :: Char -> Bool+isHexDigit c = isDigit c || (primCharLE 'a' c && primCharLE c 'f') || (primCharLE 'F' c && primCharLE c 'F') ++isAlphaNum :: Char -> Bool+isAlphaNum c = isAlpha c || isDigit c++isPrint :: Char -> Bool+isPrint c = primCharLE ' ' c && primCharLE c '~'++isSpace :: Char -> Bool+isSpace c = c == ' ' || c == '\t' || c == '\n'++digitToInt :: Char -> Int+digitToInt c | (primCharLE '0' c) && (primCharLE c '9') = ord c - ord '0'+ | (primCharLE 'a' c) && (primCharLE c 'f') = ord c - (ord 'a' - 10)+ | (primCharLE 'A' c) && (primCharLE c 'F') = ord c - (ord 'A' - 10)+ | otherwise = error "digitToInt"++toLower :: Char -> Char+toLower c | primCharLE 'A' c && primCharLE c 'Z' = chr (ord c - ord 'A' + ord 'a')+ | True = c++toUpper :: Char -> Char+toUpper c | primCharLE 'a' c && primCharLE c 'a' = chr (ord c - ord 'a' + ord 'A')+ | True = c++instance Show Char where+ showsPrec _ '\'' = showString "'\\''"+ showsPrec _ c = showChar '\'' . showString (encodeChar c) . showChar '\''+ showList s = showChar '"' . f s+ where f [] = showChar '"'+ f (c:cs) =+ if c == '"' then showString "\\\"" . f cs+ else showString (encodeChar c) . f cs++-- XXX should not export this+encodeChar :: Char -> String+encodeChar c =+ let+ spec = [('\n', "\\n"), ('\r', "\\r"), ('\t', "\\t"), ('\b', "\\b"),+ ('\\', "\\\\")]+ look [] = if isPrint c then [c] else "'\\" ++ show (ord c) ++ "'"+ look ((d,s):xs) = if d == c then s else look xs+ in look spec
+ lib/Data/Char_Type.hs view
@@ -0,0 +1,5 @@+module Data.Char_Type(Char, String) where+import Primitives+import Data.List_Type++type String = [Char]
+ lib/Data/Complex.hs view
@@ -0,0 +1,137 @@+module Data.Complex(module Data.Complex) where+import Prelude++infix 6 :+++data Complex a = !a :+ !a++instance forall a . Eq a => Eq (Complex a) where+ (:+) x y == (:+) x' y' = x == x' && y == y' -- parser bug++instance forall a . Show a => Show (Complex a) where+ show (x :+ y) = show x ++ " :+ " ++ show y++realPart :: forall a . Complex a -> a+realPart (x :+ _) = x++imagPart :: forall a . Complex a -> a+imagPart (_ :+ y) = y++conjugate :: forall a . Num a => Complex a -> Complex a+conjugate (x:+y) = x :+ (negate y)++mkPolar :: forall a . Floating a => a -> a -> Complex a+mkPolar r theta = r * cos theta :+ r * sin theta++cis :: forall a . Floating a => a -> Complex a+cis theta = cos theta :+ sin theta++polar :: forall a . (RealFloat a) => Complex a -> (a,a)+polar z = (magnitude z, phase z)++magnitude :: forall a . (RealFloat a) => Complex a -> a+magnitude (x:+y) = sqrt (x*x + y*y)+{-+ scaleFloat k+ (sqrt (sqr (scaleFloat mk x) + sqr (scaleFloat mk y)))+ where k = max (exponent x) (exponent y)+ mk = negate k+ sqr z = z * z+-}++phase :: forall a . (RealFloat a) => Complex a -> a+-- XXX phase (0 :+ 0) = 0+phase (x:+y) | x==0 && y==0 = 0+ | otherwise = atan2 y x+++instance forall a . (RealFloat a) => Num (Complex a) where+ (x:+y) + (x':+y') = (x+x') :+ (y+y')+ (x:+y) - (x':+y') = (x-x') :+ (y-y')+ (x:+y) * (x':+y') = (x*x'-y*y') :+ (x*y'+y*x')+ negate (x:+y) = negate x :+ negate y+ abs z = magnitude z :+ 0+-- signum (0:+0) = 0+ signum z@(x:+y) | x==0 && y==0 = 0+ | otherwise = x/r :+ y/r where r = magnitude z+ fromInteger n = fromInteger n :+ 0++instance forall a . (RealFloat a) => Fractional (Complex a) where+ (x:+y) / (x':+y') = (x*x''+y*y'') / d :+ (y*x''-x*y'') / d+ where x'' = scaleFloat k x'+ y'' = scaleFloat k y'+ k = negate $ max (exponent x') (exponent y')+ d = x'*x'' + y'*y''++ fromRational a = fromRational a :+ 0++instance forall a . (RealFloat a) => Floating (Complex a) where+ pi = pi :+ 0+ exp (x:+y) = expx * cos y :+ expx * sin y+ where expx = exp x+ log z = log (magnitude z) :+ phase z+{-+ x ** y = case (x,y) of+ {- XXX+ (_ , (0:+0)) -> 1 :+ 0+ ((0:+0), (exp_re:+_)) -> case compare exp_re 0 of+ GT -> 0 :+ 0+ LT -> inf :+ 0+ EQ -> nan :+ nan+-}+ ((re:+im), (exp_re:+_))+ | (isInfinite re || isInfinite im) -> case compare exp_re 0 of+ GT -> inf :+ 0+ LT -> 0 :+ 0+ EQ -> nan :+ nan+ | otherwise -> exp (log x * y)+ where+ inf = 1/0+ nan = 0/0+-}+ sqrt z@(x:+y) | x==0 && y==0 = 0+ | otherwise = u :+ (if y < 0 then negate v else v)+ where (u,v) = if x < 0 then (v',u') else (u',v')+ v' = abs y / (u'*2)+ u' = sqrt ((magnitude z + abs x) / 2)++ sin (x:+y) = sin x * cosh y :+ cos x * sinh y+ cos (x:+y) = cos x * cosh y :+ (negate (sin x) * sinh y)+ tan (x:+y) = (sinx*coshy:+cosx*sinhy)/(cosx*coshy:+(negate sinx*sinhy))+ where sinx = sin x+ cosx = cos x+ sinhy = sinh y+ coshy = cosh y++ sinh (x:+y) = cos y * sinh x :+ sin y * cosh x+ cosh (x:+y) = cos y * cosh x :+ sin y * sinh x+ tanh (x:+y) = (cosy*sinhx:+siny*coshx)/(cosy*coshx:+siny*sinhx)+ where siny = sin y+ cosy = cos y+ sinhx = sinh x+ coshx = cosh x++ asin z@(x:+y) = y':+(negate x')+ where (x':+y') = log (((negate y):+x) + sqrt (1 - z*z))+ acos z = y'':+(negate x'')+ where (x'':+y'') = log (z + ((negate y'):+x'))+ (x':+y') = sqrt (1 - z*z)+ atan z@(x:+y) = y':+(negate x')+ where (x':+y') = log (((1 - y):+x) / sqrt (1+z*z))++ asinh z = log (z + sqrt (1+z*z))++ acosh z = log (z + (sqrt $ z+1) * (sqrt $ z - 1))+ atanh z = 0.5 * log ((1.0+z) / (1.0-z))++ log1p x@(a :+ b)+ | abs a < 0.5 && abs b < 0.5+ , u <- 2*a + a*a + b*b = log1p (u/(1 + sqrt(u+1))) :+ atan2 (1 + a) b+ | otherwise = log (1 + x)++ expm1 x@(a :+ b)+ | a*a + b*b < 1+ , u <- expm1 a+ , v <- sin (b/2)+ , w <- -2*v*v = (u*w + u + w) :+ (u+1)*sin b+ | otherwise = exp x - 1
+ lib/Data/Double.hs view
@@ -0,0 +1,144 @@+-- Copyright 2023 Lennart Augustsson+-- See LICENSE file for full license.+module Data.Double(Double) where+import Primitives+import Control.Error+import Data.Bits+import Data.Bool+import Data.Eq+import Data.Floating+import Data.Fractional+import Data.Function+import Data.Integer+import Data.Ord+import Data.Ratio+import Data.Real+import Data.RealFloat+import Data.Num+import Data.Word+import Text.Show++instance Num Double where+ (+) = primDoubleAdd+ (-) = primDoubleSub+ (*) = primDoubleMul+ negate = primDoubleNeg+ abs x = if x < 0.0 then negate x else x+ signum x =+ case compare x 0.0 of+ LT -> -1.0+ EQ -> 0.0+ GT -> 1.0+ fromInteger = _integerToDouble++instance Fractional Double where+ (/) = primDoubleDiv+ -- This version of fromRational can go horribly wrong+ -- if the integers are bigger than can be represented in a Double.+ -- It'll do for now.+ fromRational x = fromInteger (numerator x) `primDoubleDiv` fromInteger (denominator x)++instance Eq Double where+ (==) = primDoubleEQ+ (/=) = primDoubleNE++instance Ord Double where+ (<) = primDoubleLT+ (<=) = primDoubleLE+ (>) = primDoubleGT+ (>=) = primDoubleGE+ +-- For now, cheat and call C+instance Show Double where+ show = primDoubleShow++instance Real Double where+ toRational x =+ let (m, e) = decodeDouble x+ in toRational m * 2^^e++instance Floating Double where+ pi = 3.141592653589793+ log x = primPerformIO (clog x)+ exp x = primPerformIO (cexp x)+ sqrt x = primPerformIO (csqrt x)+ sin x = primPerformIO (csin x)+ cos x = primPerformIO (ccos x)+ tan x = primPerformIO (ctan x)+ asin x = primPerformIO (casin x)+ acos x = primPerformIO (cacos x)+ atan x = primPerformIO (catan x)++foreign import ccall "log" clog :: Double -> IO Double+foreign import ccall "exp" cexp :: Double -> IO Double+foreign import ccall "sqrt" csqrt :: Double -> IO Double+foreign import ccall "sin" csin :: Double -> IO Double+foreign import ccall "cos" ccos :: Double -> IO Double+foreign import ccall "tan" ctan :: Double -> IO Double+foreign import ccall "asin" casin :: Double -> IO Double+foreign import ccall "acos" cacos :: Double -> IO Double+foreign import ccall "atan" catan :: Double -> IO Double++-- Assumes 64 bit floats+instance RealFloat Double where+ floatRadix _ = 2+ floatDigits _ = 53+ floatRange _ = (-1021,1024)+ decodeFloat = decodeDouble+ encodeFloat = encodeDouble+ isNaN = isNaNDouble+ isInfinite = isInfDouble+ isDenormalized = isDenDouble+ isNegativeZero = isNegZeroDouble+ isIEEE _ = True++decodeDouble :: Double -> (Integer, Int)+decodeDouble x =+ let xw = primWordFromDoubleRaw x+ sign = xw .&. 0x8000000000000000+ expn = (xw .&. 0x7fffffffffffffff) `shiftR` 52+ mant = xw .&. 0x000fffffffffffff+ neg = if sign /= 0 then negate else id+ in if expn == 0 then+ -- subnormal or 0+ (neg (_wordToInteger mant), 0)+ else if expn == 0x7ff then+ -- infinity or NaN+ (0, 0)+ else+ -- ordinary number, add hidden bit+ -- mant is offset-1023, and assumes scaled mantissa (thus -52)+ (neg (_wordToInteger (mant .|. 0x0010000000000000)),+ primWordToInt expn - 1023 - 52)++isNaNDouble :: Double -> Bool+isNaNDouble x =+ let xw = primWordFromDoubleRaw x+ expn = (xw .&. 0x7fffffffffffffff) `shiftR` 52+ mant = xw .&. 0x000fffffffffffff+ in expn == 0x7ff && mant /= 0++isInfDouble :: Double -> Bool+isInfDouble x =+ let xw = primWordFromDoubleRaw x+ expn = (xw .&. 0x7fffffffffffffff) `shiftR` 52+ mant = xw .&. 0x000fffffffffffff+ in expn == 0x7ff && mant == 0++isDenDouble :: Double -> Bool+isDenDouble x =+ let xw = primWordFromDoubleRaw x+ expn = (xw .&. 0x7fffffffffffffff) `shiftR` 52+ mant = xw .&. 0x000fffffffffffff+ in expn == 0 && mant /= 0++isNegZeroDouble :: Double -> Bool+isNegZeroDouble x =+ let xw = primWordFromDoubleRaw x+ sign = xw .&. 0x8000000000000000+ rest = xw .&. 0x7fffffffffffffff+ in sign /= 0 && rest == 0++-- Simple (and sometimes wrong) encoder+encodeDouble :: Integer -> Int -> Double+encodeDouble mant expn = fromInteger mant * 2^^expn
+ lib/Data/Either.hs view
@@ -0,0 +1,25 @@+-- Copyright 2023 Lennart Augustsson+-- See LICENSE file for full license.+module Data.Either(module Data.Either) where+import Primitives+import Data.Bool+import Data.Eq+import Data.Function+import Data.Int+import Data.Ord+import Text.Show++data Either a b = Left a | Right b++instance forall a b . (Eq a, Eq b) => Eq (Either a b) where+ Left a == Left a' = a == a'+ Right b == Right b' = b == b'+ _ == _ = False++either :: forall a b r . (a -> r) -> (b -> r) -> Either a b -> r+either f _ (Left a) = f a+either _ f (Right b) = f b++instance forall a b . (Show a, Show b) => Show (Either a b) where+ showsPrec p (Left a) = showParen (p>=appPrec1) (showString "Left " . showsPrec appPrec1 a)+ showsPrec p (Right b) = showParen (p>=appPrec1) (showString "Right " . showsPrec appPrec1 b)
+ lib/Data/Enum.hs view
@@ -0,0 +1,70 @@+module Data.Enum(module Data.Enum) where+import Primitives+import Control.Error+import Data.Bool+import Data.Char_Type+import Data.Bounded+import Data.Function+import Data.Int+import Data.List+import Data.Num+import Data.Ord++class Enum a where+ succ :: a -> a+ pred :: a -> a+ toEnum :: Int -> a+ fromEnum :: a -> Int++ enumFrom :: a -> [a]+ enumFromThen :: a -> a -> [a]+ enumFromTo :: a -> a -> [a]+ enumFromThenTo :: a -> a -> a -> [a]++ succ = toEnum . (+ 1) . fromEnum+ pred = toEnum . (subtract 1) . fromEnum+ enumFrom x = map toEnum [fromEnum x ..]+ enumFromThen x y = map toEnum [fromEnum x, fromEnum y ..]+ enumFromTo x y = map toEnum [fromEnum x .. fromEnum y]+ enumFromThenTo x1 x2 y = map toEnum [fromEnum x1, fromEnum x2 .. fromEnum y]++boundedEnumFrom :: forall a . (Enum a, Bounded a) => a -> [a]+boundedEnumFrom n = map toEnum [fromEnum n .. fromEnum (maxBound `asTypeOf` n)]++boundedEnumFromThen :: forall a . (Enum a, Bounded a) => a -> a -> [a]+boundedEnumFromThen n1 n2+ | i_n2 >= i_n1 = map toEnum [i_n1, i_n2 .. fromEnum (maxBound `asTypeOf` n1)]+ | otherwise = map toEnum [i_n1, i_n2 .. fromEnum (minBound `asTypeOf` n1)]+ where+ i_n1 = fromEnum n1+ i_n2 = fromEnum n2++-- This instance is difficult to put in Data.Int,+-- so it gets to live here.+instance Enum Int where+ succ x = x + 1+ pred x = x - 1+ toEnum x = x+ fromEnum x = x+ enumFrom n = n : enumFrom (n+1)+ enumFromThen n m = from n+ where d = m - n+ from i = i : from (i+d)+ enumFromTo l h = takeWhile (<= h) (enumFrom l)+ enumFromThenTo l m h =+ if m > l then+ takeWhile (<= h) (enumFromThen l m)+ else+ takeWhile (>= h) (enumFromThen l m)++-- Likewise for Bool+instance Enum Bool where+ fromEnum False = 0+ fromEnum True = 1+ toEnum 0 = False+ toEnum 1 = True+ toEnum _ = error "Enum.Bool.toEnum: bad arg"++instance Enum Char where+ fromEnum = primOrd+ toEnum = primChr
+ lib/Data/Eq.hs view
@@ -0,0 +1,13 @@+module Data.Eq(+ module Data.Eq+ ) where+import Primitives+import Data.Bool_Type++infix 4 ==,/=++class Eq a where+ (==) :: a -> a -> Bool+ (/=) :: a -> a -> Bool+ x /= y = if x == y then False else True+
+ lib/Data/Floating.hs view
@@ -0,0 +1,45 @@+module Data.Floating(module Data.Floating) where+import Primitives+import Data.Fractional+import Data.Num++infixr 8 **++class (Fractional a) => Floating a where+ pi :: a+ exp :: a -> a+ log :: a -> a+ sqrt :: a -> a+ (**) :: a -> a -> a+ logBase :: a -> a -> a+ sin :: a -> a+ cos :: a -> a+ tan :: a -> a+ asin :: a -> a+ acos :: a -> a+ atan :: a -> a+ sinh :: a -> a+ cosh :: a -> a+ tanh :: a -> a+ asinh :: a -> a+ acosh :: a -> a+ atanh :: a -> a+ log1p :: a -> a+ expm1 :: a -> a+ log1pexp :: a -> a+ log1mexp :: a -> a++ x ** y = exp (log x * y)+ logBase x y = log y / log x+ sqrt x = x ** (1/2)+ tan x = sin x / cos x+ sinh x = (exp x - exp (negate x)) / 2+ cosh x = (exp x + exp (negate x)) / 2+ tanh x = sinh x / cosh x+ asinh x = log (x + sqrt (x*x + 1))+ acosh x = log (x + sqrt (x*x - 1))+ atanh x = log ((x + 1) / (x - 1)) / 2+ log1p x = log (1 + x)+ expm1 x = exp x - 1+ log1pexp x = log1p (exp x)+ log1mexp x = log1p (negate (exp x))
+ lib/Data/Fractional.hs view
@@ -0,0 +1,19 @@+-- Copyright 2023 Lennart Augustsson+-- See LICENSE file for full license.+module Data.Fractional(module Data.Fractional) where+import Primitives+import Data.Integral+import Data.Num+import Data.Ord+import Data.Ratio_Type++class Num a => Fractional a where+ (/) :: a -> a -> a+ recip :: a -> a+ fromRational :: Rational -> a++ recip x = 1 / x++infixr 8 ^^+(^^) :: forall a b . (Fractional a, Integral b, Ord b) => a -> b -> a+x ^^ n = if n >= 0 then x^n else recip (x^(negate n))
+ lib/Data/Function.hs view
@@ -0,0 +1,39 @@+-- Copyright 2023 Lennart Augustsson+-- See LICENSE file for full license.+module Data.Function(module Data.Function) where+import Primitives+--import Data.Tuple++infixr 0 $+($) :: forall a b . (a -> b) -> a -> b+($) f x = f x++infixr 0 $!+($!) :: forall a b . (a -> b) -> a -> b+($!) f x = x `primSeq` f x++infixr 9 .+(.) :: forall a b c . (b -> c) -> (a -> b) -> (a -> c)+(.) f g x = f (g x)++id :: forall a . a -> a+id x = x++const :: forall a b . a -> b -> a+const x _ = x++flip :: forall a b c . (b -> a -> c) -> a -> b -> c+flip f a b = f b a++fix :: forall a . (a -> a) -> a+fix = primFix++uncurry :: forall a b c . (a -> b -> c) -> (a, b) -> c+uncurry f (a, b) = f a b -- XXX not lazy++infixl 0 `on`+on :: forall a b c . (a -> a -> b) -> (c -> a) -> (c -> c -> b)+on op sel x y = op (sel x) (sel y)++asTypeOf :: forall a . a -> a -> a+asTypeOf = const
+ lib/Data/Functor.hs view
@@ -0,0 +1,15 @@+module Data.Functor(module Data.Functor) where+import Primitives -- for fixity+import Data.Function++class Functor (f :: Type -> Type) where+ fmap :: forall a b . (a -> b) -> f a -> f b+ (<$) :: forall a b . a -> f b -> f a+ (<$) = fmap . const++infixl 4 <$>+(<$>) :: forall (f :: Type -> Type) a b . Functor f => (a -> b) -> f a -> f b+(<$>) = fmap++--void :: forall f a . Functor f => f a -> f ()+--void = fmap (const ())
+ lib/Data/Identity.hs view
@@ -0,0 +1,24 @@+module Data.Identity(Data.Identity) where+import Primitives+import Control.Applicative+import Control.Monad+import Data.Function+import Data.Functor+import Data.Int+import Data.Ord+import Text.Show++newtype Identity a = Identity a++instance Functor Identity where+ fmap f (Identity a) = Identity (f a)++instance Applicative Identity where+ pure a = Identity a+ Identity f <*> Identity a = Identity (f a)++instance Monad Identity where+ Identity a >>= f = f a++instance forall a . (Show a) => Show (Identity a) where+ showsPrec p (Identity a) = showParen (p >= 11) (showString "Identity " . showsPrec 11 a)
+ lib/Data/Int.hs view
@@ -0,0 +1,78 @@+-- Copyright 2023 Lennart Augustsson+-- See LICENSE file for full license.+module Data.Int(module Data.Int, Int) where+import Primitives+import Data.Bool_Type+import Data.Bounded+import Data.Char_Type+import Data.Eq+import Data.Integer_Type+import Data.Integral+import Data.List_Type+import Data.Num+import Data.Ord+import Data.Ratio_Type+import Data.Real+import Text.Show++instance Num Int where+ (+) = primIntAdd+ (-) = primIntSub+ (*) = primIntMul+ negate x = primIntNeg x+ abs x = if x < 0 then negate x else x+ signum x =+ case compare x 0 of+ LT -> -1+ EQ -> 0+ GT -> 1+ fromInteger = _integerToInt++instance Integral Int where+ quot = primIntQuot+ rem = primIntRem+ toInteger = _intToInteger++instance Bounded Int where+ minBound = primWordToInt ((-1::Word) `primWordQuot` 2) + 1+ maxBound = primWordToInt ((-1::Word) `primWordQuot` 2)++instance Real Int where+ toRational i = _integerToRational (_intToInteger i)++--------------------------------++instance Eq Int where+ (==) = primIntEQ+ (/=) = primIntNE++instance Ord Int where+ compare = primCompare+ (<) = primIntLT+ (<=) = primIntLE+ (>) = primIntGT+ (>=) = primIntGE++--------------------------------++instance Show Int where+ show = showInt_++-- XXX these should not be exported+showInt_ :: Int -> String+showInt_ n =+ if n < 0 then+ '-' : _showUnsignedNegInt n+ else+ _showUnsignedNegInt (negate n)++-- Some trickery to show minBound correctly.+-- To print the number n, pass -n.+_showUnsignedNegInt :: Int -> String+_showUnsignedNegInt n =+ let+ c = primChr (primOrd '0' - rem n 10)+ in if n > -10 then+ [c]+ else+ _showUnsignedNegInt (quot n 10) ++ [c]
+ lib/Data/IntMap.hs view
@@ -0,0 +1,96 @@+-- Copyright 2023 Lennart Augustsson+-- See LICENSE file for full license.+module Data.IntMap(+ IntMap,+ empty, lookup, insert, fromList, toList, insertWith, (!), keys+ ) where+import Prelude hiding(lookup)++data IntMap a+ = Empty+ | Leaf Int a+ | Node (IntMap a) (IntMap a) (IntMap a) (IntMap a)+ --Xderiving (Show)++-- This works for y>0+divModX :: Int -> Int -> (Int, Int)+divModX x y =+ let+ q = quot x y+ r = rem x y+ in+ if x >= 0 || r == 0 then+ (q, r)+ else+ (q - 1, r + y)++empty :: forall a . IntMap a+empty = Empty++lookup :: forall a . Int -> IntMap a -> Maybe a+lookup k am =+ case am of+ Empty -> Nothing+ Leaf i a -> if k == i then Just a else Nothing+ Node m0 m1 m2 m3 ->+ let+ (d, m) = divModX k 4+ in if m == 0 then lookup d m0+ else if m == 1 then lookup d m1+ else if m == 2 then lookup d m2+ else lookup d m3++insert :: forall a . Int -> a -> IntMap a -> IntMap a+insert = insertWith const++fromList :: forall a . [(Int, a)] -> IntMap a+fromList = foldr (uncurry insert) empty++-- XXX There must be a better way+toList :: forall a . IntMap a -> [(Int, a)]+toList am =+ let+ f o (k, a) = (k*4 + o, a)+ in+ case am of+ Empty -> []+ Leaf l a -> [(l, a)]+ Node m0 m1 m2 m3 ->+ map (f 0) (toList m0) `merge`+ map (f 1) (toList m1) `merge`+ map (f 2) (toList m2) `merge`+ map (f 3) (toList m3)++merge :: forall a . [(Int, a)] -> [(Int, a)] -> [(Int, a)]+merge [] ys = ys+merge xs [] = xs+merge xxs@(xa@(x,_):xs) yys@(yb@(y,b):ys) = if x < y then xa : merge xs yys else yb : merge xxs ys++keys :: forall a . IntMap a -> [Int]+keys = map fst . toList++(!) :: forall a . IntMap a -> Int -> a+(!) m k =+ case lookup k m of+ Just i -> i+ Nothing -> error "Data.IntMap.!"++insertWith :: forall a . (a -> a -> a) -> Int -> a -> IntMap a -> IntMap a+insertWith comb ak a =+ let+ ins k am =+ case am of+ Empty -> Leaf k a+ Leaf i b ->+ if k == i then+ Leaf k (comb a b)+ else+ ins k $ insert i b $ Node Empty Empty Empty Empty+ Node m0 m1 m2 m3 ->+ let+ (d, m) = divModX k 4+ in if m == 0 then Node (ins d m0) m1 m2 m3+ else if m == 1 then Node m0 (ins d m1) m2 m3+ else if m == 2 then Node m0 m1 (ins d m2) m3+ else Node m0 m1 m2 (ins d m3)+ in ins ak
+ lib/Data/IntSet.hs view
@@ -0,0 +1,29 @@+-- Copyright 2023 Lennart Augustsson+-- See LICENSE file for full license.+module Data.IntSet(+ IntSet,+ empty, member, insert, fromList, toList+ ) where+import Prelude+import qualified Data.IntMap as M++newtype IntSet = I (M.IntMap ())++empty :: IntSet+empty = I M.empty++member :: Int -> IntSet -> Bool+member k (I m) =+ case M.lookup k m of+ Nothing -> False+ Just _ -> True++insert :: Int -> IntSet -> IntSet+insert k (I m) = I (M.insert k () m)++fromList :: [Int] -> IntSet+fromList is = I (M.fromList (zip is (repeat ())))++toList :: IntSet -> [Int]+toList (I m) = map fst (M.toList m)+
+ lib/Data/Integer.hs view
@@ -0,0 +1,488 @@+-- Copyright 2023 Lennart Augustsson+-- See LICENSE file for full license.+module Data.Integer(+ Integer,+ readInteger,+ _intToInteger,+ _integerToInt,+ _wordToInteger,+ _integerToWord,+ _integerToDouble,+ _integerToRational,+ _integerToIntList,+ _intListToInteger,+ ) where+import Primitives+import Control.Error+import Data.Bool+import Data.Char+import Data.Enum+import Data.Eq+import Data.Function+import Data.Int+import Data.Integer_Type+import Data.Integral+import Data.List+import Data.Num+import Data.Ord+import Data.Ratio_Type+import Data.Real+import Text.Show++--+-- The Integer is stored in sign-magniture format with digits in base maxD (2^31)+-- It has the following invariants:+-- * each digit is >= 0 and < maxD+-- * least signification digits first, most significant last+-- * no trailing 0s in the digits+-- * 0 is positive+{- These definitions are in Integer_Type+data Integer = I Sign [Digit]+ --deriving Show++type Digit = Int++maxD :: Digit+maxD = 2147483648 -- 2^31, this is used so multiplication of two digit doesn't overflow a 64 bit Int++data Sign = Plus | Minus+ --deriving Show+-}++instance Eq Integer where+ (==) = eqI+ (/=) = neI++instance Ord Integer where+ (<) = ltI+ (<=) = leI+ (>) = gtI+ (>=) = geI++instance Show Integer where+ show i = showInteger i++instance Num Integer where+ (+) = addI+ (-) = subI+ (*) = mulI+ negate = negateI+ abs = absI+ signum x =+ case compare x zeroI of+ LT -> negOneI+ EQ -> zeroI+ GT -> oneI+ fromInteger x = x++instance Integral Integer where+ quotRem = quotRemI+ toInteger x = x++instance Real Integer where+ toRational i = _integerToRational i++instance Enum Integer where+ succ x = x + 1+ pred x = x - 1+ toEnum x = _intToInteger x+ fromEnum x = _integerToInt x+ enumFrom n = n : enumFrom (n+1)+ enumFromThen n m = from n+ where d = m - n+ from i = i : from (i+d)+ enumFromTo l h = takeWhile (<= h) (enumFrom l)+ enumFromThenTo l m h =+ if m > l then+ takeWhile (<= h) (enumFromThen l m)+ else+ takeWhile (>= h) (enumFromThen l m)++------------------------------------------------++isZero :: Integer -> Bool+isZero (I _ ds) = null ds++instance Eq Sign where+ (==) Plus Plus = True+ (==) Minus Minus = True+ (==) _ _ = False++-- Trim off 0s and make an Integer+sI :: Sign -> [Digit] -> Integer+sI s ds =+ case trim0 ds of+ [] -> I Plus []+ ds' -> I s ds'++zeroD :: Digit+zeroD = 0++addI :: Integer -> Integer -> Integer+addI (I Plus xs) (I Plus ys) = I Plus (add xs ys)+addI (I Plus xs) (I Minus ys) | ltW xs ys = sI Minus (sub ys xs)+ | True = sI Plus (sub xs ys)+addI (I Minus xs) (I Plus ys) | ltW ys xs = sI Minus (sub xs ys)+ | True = sI Plus (sub ys xs)+addI (I Minus xs) (I Minus ys) = I Minus (add xs ys)++negateI :: Integer -> Integer+negateI i@(I _ []) = i+negateI (I Plus x) = I Minus x+negateI (I Minus x) = I Plus x++absI :: Integer -> Integer+absI (I _ x) = I Plus x++subI :: Integer -> Integer -> Integer+subI x y = addI x (negateI y)++add :: [Digit] -> [Digit] -> [Digit]+add = add' zeroD++add' :: Digit -> [Digit] -> [Digit] -> [Digit]+add' ci (x : xs) (y : ys) = s : add' co xs ys where (co, s) = addD ci x y+add' ci (x : xs) [] = s : add' co xs [] where (co, s) = addD ci x zeroD+add' ci [] (y : ys) = s : add' co [] ys where (co, s) = addD ci zeroD y+add' ci [] [] = if ci == zeroD then [] else [ci]++-- Add 3 digits with carry+addD :: Digit -> Digit -> Digit -> (Digit, Digit)+addD x y z = (quot s maxD, rem s maxD) where s = x + y + z++-- Invariant: xs >= ys, so result is always >= 0+sub :: [Digit] -> [Digit] -> [Digit]+sub xs ys = sub' zeroD xs ys++sub' :: Digit -> [Digit] -> [Digit] -> [Digit]+sub' bi (x : xs) (y : ys) = d : sub' bo xs ys where (bo, d) = subW bi x y+sub' bi (x : xs) [] = d : sub' bo xs [] where (bo, d) = subW bi x zeroD+sub' 0 [] [] = []+sub' _ [] _ = undefined++-- Subtract with borrow+subW :: Digit -> Digit -> Digit -> (Digit, Digit)+subW b x y =+ let d = x - y + b+ in if d < 0 then+ (quot d maxD - 1, rem d maxD + maxD)+ else+ (quot d maxD, rem d maxD)++-- Remove trailing 0s+trim0 :: [Digit] -> [Digit]+trim0 = reverse . dropWhile (== (0::Int)) . reverse++-- Is axs < ays?+ltW :: [Digit] -> [Digit] -> Bool+ltW axs ays = lxs < lys || lxs == lys && cmp (reverse axs) (reverse ays)+ where+ lxs = length axs+ lys = length ays+ cmp (x:xs) (y:ys) = x < y || x == y && cmp xs ys+ cmp [] [] = False+ cmp _ _ = error "ltW.cmp"+ +mulI :: Integer -> Integer -> Integer+mulI (I _ []) _ = I Plus [] -- 0 * x = 0+mulI _ (I _ []) = I Plus [] -- x * 0 = 0+mulI (I sx [x]) (I sy ys) = I (mulSign sx sy) (mulD zeroD ys x)+mulI (I sx xs) (I sy [y]) = I (mulSign sx sy) (mulD zeroD xs y)+mulI (I sx xs) (I sy ys) = I (mulSign sx sy) (mulM xs ys)++mulSign :: Sign -> Sign -> Sign+mulSign s t = if s == t then Plus else Minus++-- Multiply with a single digit, and add carry.+mulD :: Digit -> [Digit] -> Digit -> [Digit]+mulD ci [] _ = if ci == 0 then [] else [ci]+mulD ci (x:xs) y = r : mulD q xs y+ where+ xy = x * y + ci+ q = quot xy maxD+ r = rem xy maxD++mulM :: [Digit] -> [Digit] -> [Digit]+mulM xs ys =+ let rs = map (mulD zeroD xs) ys+ ss = zipWith (++) (map (`replicate` (0::Int)) [0::Int ..]) rs+ in foldl1 add ss++-- Signs:+-- + + -> (+,+)+-- + - -> (-,+)+-- - + -> (-,-)+-- - - -> (+,-)+quotRemI :: Integer -> Integer -> (Integer, Integer)+quotRemI _ (I _ []) = error "Integer: division by 0" -- n / 0+quotRemI (I _ []) _ = (I Plus [], I Plus []) -- 0 / n+quotRemI (I sx xs) (I sy ys) | all (== (0::Int)) ys' =+ -- All but the MSD are 0. Scale numerator accordingly and divide.+ -- Then add back (the ++) the remainder we scaled off.+ case quotRemD xs' y of+ (q, r) -> qrRes sx sy (q, rs ++ r)+ where ys' = init ys+ y = last ys+ n = length ys'+ (rs, xs') = splitAt n xs -- xs' is the scaled number+quotRemI (I sx xs) (I sy ys) = qrRes sx sy (quotRemB xs ys)++qrRes :: Sign -> Sign -> ([Digit], [Digit]) -> (Integer, Integer)+qrRes sx sy (ds, rs) = (sI (mulSign sx sy) ds, sI sx rs)++quotI :: Integer -> Integer -> Integer+quotI x y =+ case quotRemI x y of+ (q, _) -> q++-- Divide by a single digit.+-- Does not return normalized numbers.+quotRemD :: [Digit] -> Digit -> ([Digit], [Digit])+quotRemD axs y = qr zeroD (reverse axs) []+ where+ qr ci [] res = (res, [ci])+ qr ci (x:xs) res = qr r xs (q:res)+ where+ cx = ci * maxD + x+ q = quot cx y+ r = rem cx y++-- Simple iterative long division.+quotRemB :: [Digit] -> [Digit] -> ([Digit], [Digit])+quotRemB xs ys =+ let n = I Plus xs+ d = I Plus ys+ a = I Plus $ replicate (length ys - (1::Int)) (0::Int) ++ [last ys] -- only MSD of ys+ aq = quotI n a+ ar = addI d oneI+ loop q r =+ if absI r `geI` d then+ let r' = n `subI` (q `mulI` d)+ qn = q `addI` (r' `quotI` a)+ q' = (q `addI` qn) `quotI` twoI+ in loop q' r'+ else+ q+ q' = loop aq ar+ r = n `subI` (q' `mulI` d)+ in if r `ltI` zeroI then+ (digits (q' `subI` oneI), digits (r `addI` d))+ else+ (digits q', digits r)++digits :: Integer -> [Digit]+digits (I _ ds) = ds++zeroI :: Integer+zeroI = I Plus []++oneI :: Integer+oneI = I Plus [1]++twoI :: Integer+twoI = I Plus [2]++tenI :: Integer+tenI = I Plus [10]++negOneI :: Integer+negOneI = I Minus [1]++--------------++showInteger :: Integer -> String+showInteger (I _ []) = "0"+showInteger (I Minus xs) = '-' : showInteger' xs+showInteger (I Plus xs) = showInteger' xs++showInteger' :: [Digit] -> String+showInteger' [] = ""+showInteger' xs = showInteger' (trim0 xs') ++ [chr (ord '0' + d)]+ where+ (xs', [d]) = quotRemD xs 10++readInteger :: String -> Integer+readInteger ('-':ds) = negate (readUnsignedInteger ds)+readInteger ds = readUnsignedInteger ds++readUnsignedInteger :: String -> Integer+readUnsignedInteger = foldl (\ r c -> r * tenI + _intToInteger (ord c - ord '0')) zeroI++eqI :: Integer -> Integer -> Bool+eqI (I sx xs) (I sy ys) = sx == sy && xs == ys++neI :: Integer -> Integer -> Bool+neI x y = not (eqI x y)++ltI :: Integer -> Integer -> Bool+ltI (I Plus xs) (I Plus ys) = ltW xs ys+ltI (I Minus _) (I Plus _) = True+ltI (I Plus _) (I Minus _) = False+ltI (I Minus xs) (I Minus ys) = ltW ys xs++leI :: Integer -> Integer -> Bool+leI x y = not (ltI y x)++gtI :: Integer -> Integer -> Bool+gtI x y = ltI y x++geI :: Integer -> Integer -> Bool+geI x y = not (ltI x y)++-- These two functions return an (opaque) representation of an+-- Integer as [Int].+-- This is used by the compiler to generate Integer literals.+-- First _integerToIntList is used in the compiler to get a list of+-- Int, and the generated code will have a call to _intListToInteger.+_integerToIntList :: Integer -> [Int]+_integerToIntList (I Plus ds) = ds+_integerToIntList (I Minus ds) = (-1::Int) : ds++_intListToInteger :: [Int] -> Integer+_intListToInteger (-1 : ds) = I Minus ds+_intListToInteger ds = I Plus ds++---------------------------------+{-+pIntegerToInteger :: P.Integer -> Integer+pIntegerToInteger i | i >= 0 = I Plus (f i)+ | otherwise = I Minus (f (negate i))+ where+ f 0 = []+ f x = fromInteger (rem x (toInteger maxD)) : f (quot x (toInteger maxD))++integerToPInteger :: Integer -> P.Integer+integerToPInteger (I s xs) =+ let r = foldr (\ d r -> r * toInteger maxD + toInteger d) 0 xs+ in case s of+ Plus -> r+ Minus -> negate r++instance Num Integer where+ (+) = addI+ (-) = subI+ (*) = mulI+ abs x = if x < 0 then -x else x+ signum x = if x > 0 then 1 else if x < 0 then -1 else 0+ fromInteger = pIntegerToInteger++instance Enum Integer where+ fromEnum = fromEnum . integerToPInteger+ toEnum = _intToInteger++instance Real Integer where+ toRational = toRational . toInteger++instance Integral Integer where+ quotRem = quotRemI+ toInteger = integerToPInteger++--instance Show Integer where+-- show = showInteger++instance Eq Integer where+ (==) = eqI++instance Ord Integer where+ x < y = x `ltI` y+ x <= y = x == y || x `ltI` y+ x > y = y `ltI` x+ x >= y = x == y || y `ltI` x++instance Arbitrary Integer where+ arbitrary = do+ ndig <- frequency+ [(5, pure 0)+ ,(25, pure 1)+ ,(20, pure 2)+ ,(10, pure 3)+ ,(10, pure 4)+ ,(2, pure 5)+ ,(2, pure 6)+ ]+ digits <- vectorOf ndig (chooseInt (0, maxD - 1))+ sign <- elements [Plus, Minus]+ pure $ if null digits then I Plus [] else I sign digits++{-+newtype SmallInteger = SmallInteger Integer+ deriving Show++instance Arbitrary SmallInteger where+ arbitrary = do+ ndig <- frequency+ [(25, pure 1)+ ,(20, pure 2)+ ,(10, pure 3)+ ,(10, pure 4)+ ]+ digit <- chooseInt (1, maxD - 1)+ sign <- elements [Plus, Minus]+ pure $ SmallInteger $ I sign (replicate (ndig - 1) 0 ++ [digit])+-}+{-+sanity :: HasCallStack => Integer -> Integer+sanity (I Minus []) = undefined+sanity (I _ ds) | any (< 0) ds = undefined+sanity (I _ ds) | length ds > 1 && last ds == 0 = undefined+sanity i = i+-}++prop_roundtrip1 :: Integer -> Bool+prop_roundtrip1 i = fromInteger (toInteger i) == i++prop_negate :: Integer -> Bool+prop_negate i = toInteger (negate i) == negate (toInteger i)++prop_abs :: Integer -> Bool+prop_abs i = toInteger (abs i) == abs (toInteger i)++prop_add :: Integer -> Integer -> Bool+prop_add x y = toInteger (addI x y) == toInteger x + toInteger y++prop_sub :: Integer -> Integer -> Bool+prop_sub x y = toInteger (subI x y) == toInteger x - toInteger y++prop_mul :: Integer -> Integer -> Bool+prop_mul x y = toInteger (mulI x y) == toInteger x * toInteger y++prop_div :: Integer -> NonZero Integer -> Bool+prop_div x (NonZero y) =+ to (quotRemI x y) == toInteger x `quotRem` toInteger y+ where to (a, b) = (toInteger a, toInteger b)+ +prop_muldiv :: Integer -> NonZero Integer -> Bool+prop_muldiv x (NonZero y) =+ let (q, r) = quotRemI x y+ in q*y + r == x++prop_eq :: Integer -> Integer -> Bool+prop_eq x y = (eqI x y) == (toInteger x == toInteger y)++prop_ne :: Integer -> Integer -> Bool+prop_ne x y = (neI x y) == (toInteger x /= toInteger y)++prop_lt :: Integer -> Integer -> Bool+prop_lt x y = (ltI x y) == (toInteger x < toInteger y)++prop_gt :: Integer -> Integer -> Bool+prop_gt x y = (gtI x y) == (toInteger x > toInteger y)++prop_le :: Integer -> Integer -> Bool+prop_le x y = (leI x y) == (toInteger x <= toInteger y)++prop_ge :: Integer -> Integer -> Bool+prop_ge x y = (geI x y) == (toInteger x >= toInteger y)++prop_show :: Integer -> Bool+prop_show x = showInteger x == show (toInteger x)++checkAll :: IO ()+checkAll = do+ let qc p = quickCheck (withMaxSuccess 100000 p)+ mapM_ qc [prop_roundtrip1, prop_negate, prop_abs, prop_show]+ mapM_ qc [prop_add, prop_sub, prop_mul,+ prop_eq, prop_ne, prop_lt, prop_gt, prop_le, prop_ge]+ mapM_ qc [prop_div, prop_muldiv]+ +-}
+ lib/Data/Integer_Type.hs view
@@ -0,0 +1,58 @@+-- Copyright 2023 Lennart Augustsson+-- See LICENSE file for full license.+module Data.Integer_Type(module Data.Integer_Type) where+import Primitives+import Data.Bool_Type+import Data.List_Type++data Integer = I Sign [Digit]++data Sign = Plus | Minus++type Digit = Int++maxD :: Digit+maxD = 2147483648 -- 2^31, this is used so multiplication of two digit doesn't overflow a 64 bit Int++_intToInteger :: Int -> Integer+_intToInteger i | i `primIntGE` 0 = I Plus (f i)+ | i `primIntEQ` ni = I Minus [0::Int,0::Int,2::Int] -- we are at minBound::Int.+ | True = I Minus (f ni)+ where+ ni = (0::Int) `primIntSub` i+ f :: Int -> [Int]+ f 0 = []+ f x = primIntRem x maxD : f (primIntQuot x maxD)++_integerToInt :: Integer -> Int+_integerToInt (I sign ds) = s `primIntMul` i+ where+ i =+ case ds of+ [] -> 0::Int+ [d1] -> d1+ [d1,d2] -> d1 `primIntAdd` (maxD `primIntMul` d2)+ d1:d2:d3:_ -> d1 `primIntAdd` (maxD `primIntMul` (d2 `primIntAdd` (maxD `primIntMul` d3)))+ s =+ case sign of+ Plus -> 1::Int+ Minus -> 0 `primIntSub` 1++_wordToInteger :: Word -> Integer+_wordToInteger i = I Plus (f i)+ where+ f :: Word -> [Int]+ f x = if x `primWordEQ` (0::Word) then [] else primWordToInt (primWordRem x (primIntToWord maxD)) : f (primWordQuot x (primIntToWord maxD))++_integerToWord :: Integer -> Word+_integerToWord x = primIntToWord (_integerToInt x)++_integerToDouble :: Integer -> Double+_integerToDouble (I sign ds) = s `primDoubleMul` loop ds+ where+ loop [] = 0.0::Double+ loop (i : is) = primDoubleFromInt i `primDoubleAdd` (primDoubleFromInt maxD `primDoubleMul` loop is)+ s =+ case sign of+ Plus -> 1.0::Double+ Minus -> 0.0 `primDoubleSub` 1.0
+ lib/Data/Integral.hs view
@@ -0,0 +1,58 @@+-- Copyright 2023 Lennart Augustsson+-- See LICENSE file for full license.+module Data.Integral(module Data.Integral) where+import Primitives+import Control.Error+import Data.Bool+import Data.Eq+import Data.Integer_Type+import Data.Num+import Data.Ord++infixl 7 `quot`,`rem`++class {-(Real a, Enum a) => -} (Eq a, Num a) => Integral a where+ quot :: a -> a -> a+ rem :: a -> a -> a+ div :: a -> a -> a+ mod :: a -> a -> a+ quotRem :: a -> a -> (a, a)+ divMod :: a -> a -> (a, a)+ toInteger :: a -> Integer++ n `quot` d = q where (q,r) = quotRem n d+ n `rem` d = r where (q,r) = quotRem n d+ n `div` d = q where (q,r) = divMod n d+ n `mod` d = r where (q,r) = divMod n d+ divMod n d = if signum r == negate (signum d) then (q - 1, r + d) else qr+ where qr@(q,r) = quotRem n d+ quotRem n d = (quot n d, rem n d)++gcd :: forall a . (Integral a) => a -> a -> a+gcd x y = gcd' (abs x) (abs y)+ where gcd' a b = if b == 0 then a else gcd' b (a `rem` b)++lcm :: forall a . (Integral a) => a -> a -> a+lcm x y =+ if x == 0 || y == 0 then+ 0+ else+ abs ((x `quot` (gcd x y)) * y)++even :: forall a . (Integral a) => a -> Bool+even n = n `rem` 2 == 0++odd :: forall a . (Integral a) => a -> Bool+odd n = not (even n)++infixr 8 ^+(^) :: forall a b . (Num a, Integral b, Ord b) => a -> b -> a+x0 ^ y0 | y0 < 0 = error "Data.Integral.^: negative exponent"+ | otherwise = pow x0 y0+ -- This does not do the minimal number of multiplications, but it's simple.+ where pow x y | y == 0 = 1+ | even y = pow (x * x) (y `quot` 2)+ | otherwise = x * pow (x * x) (y `quot` 2)++fromIntegral :: forall a b . (Integral a, Num b) => a -> b+fromIntegral x = fromInteger (toInteger x)
+ lib/Data/List.hs view
@@ -0,0 +1,363 @@+-- Copyright 2023 Lennart Augustsson+-- See LICENSE file for full license.+module Data.List(+ module Data.List,+ module Data.List_Type+ ) where+import Primitives+import Control.Applicative+import Control.Error+import Control.Monad+import Data.Bool+import Data.Eq+import Data.Function+import Data.Functor+import Data.Int+import Data.List_Type+import Data.Num+import Data.Ord+import Data.Maybe_Type+import Data.Tuple+import Text.Show++instance {-# OVERLAPPABLE #-} forall a . Eq a => Eq [a] where+ [] == [] = True+ (x:xs) == (y:ys) = x == y && xs == ys+ _ == _ = False++instance Functor [] where+ fmap = map++instance Applicative [] where+ pure a = [a]+ (<*>) = ap++instance Monad [] where+ (>>=) = flip concatMap++instance MonadFail [] where+ fail _ = []++instance forall a . Show a => Show [a] where+ showsPrec _ = showList++null :: forall a . [a] -> Bool+null [] = True+null _ = False++concat :: forall a . [[a]] -> [a]+concat = foldr (++) []++concatMap :: forall a b . (a -> [b]) -> [a] -> [b]+concatMap f = concat . map f++map :: forall a b . (a -> b) -> [a] -> [b]+map f =+ let+ rec [] = []+ rec (a : as) = f a : rec as+ in rec++filter :: forall a . (a -> Bool) -> [a] -> [a]+filter p =+ let+ rec [] = []+ rec (x : xs) = if p x then x : rec xs else rec xs+ in rec++foldr :: forall a b . (a -> b -> b) -> b -> [a] -> b+foldr f z =+ let+ rec [] = z+ rec (x : xs) = f x (rec xs)+ in rec++foldr1 :: forall a . (a -> a -> a) -> [a] -> a+foldr1 _ [] = error "foldr1"+foldr1 f (x : xs) = foldr f x xs++foldl :: forall a b . (b -> a -> b) -> b -> [a] -> b+foldl _ z [] = z+foldl f z (x : xs) = foldl f (f z x) xs++foldl1 :: forall a . (a -> a -> a) -> [a] -> a+foldl1 _ [] = error "foldl1"+foldl1 f (x : xs) = foldl f x xs++minimum :: forall a . Ord a => [a] -> a+minimum [] = error "minimum"+minimum (x:ys) = foldr (\ y m -> if y < m then y else m) x ys++maximum :: forall a . Ord a => [a] -> a+maximum [] = error "maximum"+maximum (x:ys) = foldr (\ y m -> if y > m then y else m) x ys++sum :: forall a . Num a => [a] -> a+sum = foldr (+) 0++product :: forall a . Num a => [a] -> a+product = foldr (*) 1++and :: [Bool] -> Bool+and = foldr (&&) True++or :: [Bool] -> Bool+or = foldr (||) False++any :: forall a . (a -> Bool) -> [a] -> Bool+any p = or . map p++all :: forall a . (a -> Bool) -> [a] -> Bool+all p = and . map p++take :: forall a . Int -> [a] -> [a]+take n arg =+ if n <= (0::Int) then+ []+ else+ case arg of+ [] -> []+ x : xs -> x : take (n - (1::Int)) xs++drop :: forall a . Int -> [a] -> [a]+drop n arg =+ if n <= (0::Int) then+ arg+ else+ case arg of+ [] -> []+ _ : xs -> drop (n - (1::Int)) xs++length :: forall a . [a] -> Int+length =+ -- Make it tail recursive and strict+ let+ rec r [] = r+ rec r (_:xs) =+ let r' = r + (1::Int)+ in r' `primSeq` rec r' xs+ in rec (0::Int)++zip :: forall a b . [a] -> [b] -> [(a, b)]+zip = zipWith (\ x y -> (x, y))++zipWith :: forall a b c . (a -> b -> c) -> [a] -> [b] -> [c]+zipWith f (x:xs) (y:ys) = f x y : zipWith f xs ys+zipWith _ _ _ = []++-- XXX not as lazy as it could be+unzip :: forall a b . [(a, b)] -> ([a], [b])+unzip axys =+ case axys of+ [] -> ([], [])+ (x,y) : xys ->+ case unzip xys of+ (xs, ys) -> (x:xs, y:ys)++-- XXX not as lazy as it could be+unzip3 :: forall a b c . [(a, b, c)] -> ([a], [b], [c])+unzip3 axyzs =+ case axyzs of+ [] -> ([], [], [])+ (x, y, z) : xyzs ->+ case unzip3 xyzs of+ (xs, ys, zs) -> (x:xs, y:ys, z:zs)++stripPrefix :: forall a . Eq a => [a] -> [a] -> Maybe [a]+stripPrefix = stripPrefixBy (==)++stripPrefixBy :: forall a . (a -> a -> Bool) -> [a] -> [a] -> Maybe [a]+stripPrefixBy eq [] s = Just s+stripPrefixBy eq (c:cs) [] = Nothing+stripPrefixBy eq (c:cs) (d:ds) | eq c d = stripPrefixBy eq cs ds+ | otherwise = Nothing++isPrefixOf :: forall a . Eq a => [a] -> [a] -> Bool+isPrefixOf = isPrefixOfBy (==)++isPrefixOfBy :: forall a . (a -> a -> Bool) -> [a] -> [a] -> Bool+isPrefixOfBy eq (c:cs) (d:ds) = eq c d && isPrefixOfBy eq cs ds+isPrefixOfBy _ [] _ = True+isPrefixOfBy _ _ _ = False++isSuffixOf :: forall a . Eq a => [a] -> [a] -> Bool+isSuffixOf = isSuffixOfBy (==)++isSuffixOfBy :: forall a . (a -> a -> Bool) -> [a] -> [a] -> Bool+isSuffixOfBy eq n h = isPrefixOfBy eq (reverse n) (reverse h)++splitAt :: forall a . Int -> [a] -> ([a], [a])+splitAt n xs = (take n xs, drop n xs)++reverse :: forall a . [a] -> [a]+reverse =+ let+ rev r [] = r+ rev r (x:xs) = rev (x:r) xs+ in rev []++takeWhile :: forall a . (a -> Bool) -> [a] -> [a]+takeWhile _ [] = []+takeWhile p (x:xs) =+ if p x then+ x : takeWhile p xs+ else+ []++dropWhile :: forall a . (a -> Bool) -> [a] -> [a]+dropWhile _ [] = []+dropWhile p (x:xs) =+ if p x then+ dropWhile p xs+ else+ x : xs++span :: forall a . (a -> Bool) -> [a] -> ([a], [a])+span p =+ let+ rec r [] = (reverse r, [])+ rec r (x:xs) = if p x then rec (x:r) xs else (reverse r, x:xs)+ in rec []++spanUntil :: forall a . (a -> Bool) -> [a] -> ([a], [a])+spanUntil p =+ let+ rec r [] = (reverse r, [])+ rec r (x:xs) = if p x then rec (x:r) xs else (reverse (x:r), xs)+ in rec []++head :: forall a . [a] -> a+head [] = error "head"+head (x:_) = x++tail :: forall a . [a] -> [a]+tail [] = error "tail"+tail (_:ys) = ys++intersperse :: forall a . a -> [a] -> [a]+intersperse _ [] = []+intersperse sep (a:as) = a : prepend as+ where+ prepend [] = []+ prepend (x:xs) = sep : x : prepend xs++intercalate :: forall a . [a] -> [[a]] -> [a]+intercalate xs xss = concat (intersperse xs xss)++elem :: forall a . (Eq a) => a -> [a] -> Bool+elem = elemBy (==)++notElem :: forall a . (Eq a) => a -> [a] -> Bool+notElem a as = not (elem a as)++elemBy :: forall a . (a -> a -> Bool) -> a -> [a] -> Bool+elemBy eq a = any (eq a)++find :: forall a . (a -> Bool) -> [a] -> Maybe a+find p [] = Nothing+find p (x:xs) = if p x then Just x else find p xs++lookup :: forall a b . Eq a => a -> [(a, b)] -> Maybe b+lookup = lookupBy (==)++lookupBy :: forall a b . (a -> a -> Bool) -> a -> [(a, b)] -> Maybe b+lookupBy eq x xys =+ case find (eq x . fst) xys of+ Nothing -> Nothing+ Just (_, b) -> Just b++union :: forall a . Eq a => [a] -> [a] -> [a]+union = unionBy (==)++unionBy :: forall a . (a -> a -> Bool) -> [a] -> [a] -> [a]+unionBy eq xs ys = xs ++ foldl (flip (deleteBy eq)) (nubBy eq ys) xs++intersect :: forall a . Eq a => [a] -> [a] -> [a]+intersect = intersectBy (==)++intersectBy :: forall a . (a -> a -> Bool) -> [a] -> [a] -> [a]+intersectBy eq xs ys = filter (\ x -> not (elemBy eq x ys)) xs++deleteBy :: forall a . (a -> a -> Bool) -> a -> [a] -> [a]+deleteBy _ _ [] = []+deleteBy eq x (y:ys) = if eq x y then ys else y : deleteBy eq x ys++deleteAllBy :: forall a . (a -> a -> Bool) -> a -> [a] -> [a]+deleteAllBy _ _ [] = []+deleteAllBy eq x (y:ys) = if eq x y then deleteAllBy eq x ys else y : deleteAllBy eq x ys++nub :: forall a . Eq a => [a] -> [a]+nub = nubBy (==)++nubBy :: forall a . (a -> a -> Bool) -> [a] -> [a]+nubBy _ [] = []+nubBy eq (x:xs) = x : nubBy eq (filter (\ y -> not (eq x y)) xs)++replicate :: forall a . Int -> a -> [a]+replicate n x = take n (repeat x)++repeat :: forall a . a -> [a]+repeat x =+ let+ xs = x:xs+ in xs++infix 5 \\+(\\) :: forall a . Eq a => [a] -> [a] -> [a]+(\\) = deleteFirstsBy (==)++deleteFirstsBy :: forall a . (a -> a -> Bool) -> [a] -> [a] -> [a]+deleteFirstsBy eq = foldl (flip (deleteBy eq))++-- Delete all from the second argument from the first argument+deleteAllsBy :: forall a . (a -> a -> Bool) -> [a] -> [a] -> [a]+deleteAllsBy eq = foldl (flip (deleteAllBy eq))++infixl 9 !!+(!!) :: forall a . [a] -> Int -> a+(!!) axs i =+ if i < (0::Int) then+ error "!!: <0"+ else+ let+ nth _ [] = error "!!: empty"+ nth n (x:xs) = if n == (0::Int) then x else nth (n - (1::Int)) xs+ in nth i axs++partition :: forall a . (a -> Bool) -> [a] -> ([a], [a])+partition p xs = (filter p xs, filter (not . p) xs)++sort :: forall a . Ord a => [a] -> [a]+sort = sortLE (<=)++-- A simple "quicksort" for now.+sortLE :: forall a . (a -> a -> Bool) -> [a] -> [a]+sortLE _ [] = []+sortLE le (x:xs) =+ case partition (le x) xs of+ (ge, lt) -> sortLE le lt ++ (x : sortLE le ge)++last :: forall a . [a] -> a+last [] = error "last: []"+last [x] = x+last (_:xs) = last xs++init :: forall a . [a] -> [a]+init [] = error "init: []"+init [_] = []+init (x:xs) = x : init xs++anySame :: forall a . Eq a => [a] -> Bool+anySame = anySameBy (==)++anySameBy :: forall a . (a -> a -> Bool) -> [a] -> Bool+anySameBy _ [] = False+anySameBy eq (x:xs) = elemBy eq x xs || anySameBy eq xs++iterate :: forall a . (a -> a) -> a -> [a]+iterate f x = x : iterate f (f x)++substString :: forall a . Eq a => [a] -> [a] -> [a] -> [a]+substString _ _ [] = []+substString from to xs@(c:cs) | Just rs <- stripPrefix from xs = to ++ substString from to rs+ | otherwise = c : substString from to cs
+ lib/Data/List_Type.hs view
@@ -0,0 +1,12 @@+module Data.List_Type(module Data.List_Type) where+import Primitives++infixr 5 :+data [] a = [] | (:) a [a] -- Parser hacks makes this acceptable++-- This does not really belong here, but it makes the module structure+-- much simpler.+infixr 5 +++(++) :: forall a . [a] -> [a] -> [a]+(++) [] ys = ys+(++) (x : xs) ys = x : xs ++ ys
+ lib/Data/Map.hs view
@@ -0,0 +1,155 @@+--+-- Balanced binary trees+-- Similar to Data.Map+-- Based on https://ufal.mff.cuni.cz/~straka/papers/2011-bbtree.pdf+--+module Data.Map(+ Map,+ insertBy, insertByWith, fromListByWith, fromListBy, lookupBy, empty, elems, size, toList, deleteBy,+ ) where+import Prelude hiding (lookupBy, deleteBy)++data Map k a+ = Nil -- empty tree+ | One k a -- singleton+ | Node -- tree node+ (Map k a) -- left subtree+ Int -- size of this tree+ k -- key stored in the node+ a -- element stored in the node+ (Map k a) -- right subtree+ --Xderiving(Show)++empty :: forall k a . Map k a+empty = Nil++elems :: forall k v . Map k v -> [v]+elems = map snd . toList++toList :: forall k v . Map k v -> [(k, v)]+toList t = to t []+ where+ to Nil q = q+ to (One k v) q = (k, v):q+ to (Node l _ k v r) q = to l ((k, v) : to r q)++fromListBy :: forall k v . (k -> k -> Ordering) -> [(k, v)] -> Map k v+fromListBy cmp = fromListByWith cmp const++fromListByWith :: forall k v . (k -> k -> Ordering) -> (v -> v -> v) -> [(k, v)] -> Map k v+fromListByWith cmp comb = foldr (uncurry (insertByWith cmp comb)) empty++size :: forall k a . Map k a -> Int+size Nil = 0+size (One _ _) = 1+size (Node _ s _ _ _) = s++node :: forall k a . Map k a -> k -> a -> Map k a -> Map k a+node Nil key val Nil = One key val+node left key val right = Node left (size left + 1 + size right) key val right++lookupBy :: forall k a . (k -> k -> Ordering) -> k -> Map k a -> Maybe a+lookupBy cmp k = look+ where+ look Nil = Nothing+ look (One key val) | isEQ (cmp k key) = Just val+ | otherwise = Nothing+ look (Node left _ key val right) =+ case k `cmp` key of+ LT -> look left+ EQ -> Just val+ GT -> look right++insertBy :: forall k a . (k -> k -> Ordering) -> k -> a -> Map k a -> Map k a+insertBy cmp = insertByWith cmp const++insertByWith :: forall k a . (k -> k -> Ordering) -> (a -> a -> a) -> k -> a -> Map k a -> Map k a+insertByWith cmp comb k v = ins+ where+ ins Nil = One k v+ ins (One a v) = ins (Node Nil 1 a v Nil)+ ins (Node left _ key val right) =+ case k `cmp` key of+ LT -> balance (ins left) key val right+ EQ -> node left k (comb v val) right+ GT -> balance left key val (ins right)++deleteBy :: forall k a . (k -> k -> Ordering) -> k -> Map k a -> Map k a+deleteBy cmp k = del+ where+ del Nil = Nil+ del t@(One a _) | isEQ (k `cmp` a) = Nil+ | otherwise = t+ del (Node left _ key val right) =+ case k `cmp` key of+ LT -> balance (del left) key val right+ EQ -> glue left right+ GT -> balance left key val (del right)+ where+ glue Nil right = right+ glue left Nil = left+ glue left right+ | size left > size right =+ let (key', val', left') = extractMax left+ in node left' key' val' right+ | otherwise =+ let (key', val', right') = extractMin right+ in node left key' val' right'+extractMin :: forall k a . Map k a -> (k, a, Map k a)+extractMin Nil = undefined+extractMin (One key val) = (key, val, Nil)+extractMin (Node Nil _ key val right) = (key, val, right)+extractMin (Node left _ key val right) =+ case extractMin left of+ (min, vmin, left') -> (min, vmin, balance left' key val right)++extractMax :: forall k a . Map k a -> (k, a, Map k a)+extractMax Nil = undefined+extractMax (One key val) = (key, val, Nil)+extractMax (Node left _ key val Nil) = (key, val, left)+extractMax (Node left _ key val right) =+ case extractMax right of+ (max, vmax, right') -> (max, vmax, balance left key val right')++omega :: Int+omega = 3+alpha :: Int+alpha = 2+delta :: Int+delta = 0++balance :: forall k a . Map k a -> k -> a -> Map k a -> Map k a+balance left key val right+ | size left + size right <= 1 = node left key val right+balance (One k v) key val right = balance (Node Nil 1 k v Nil) key val right+balance left key val (One k v) = balance left key val (Node Nil 1 k v Nil)+balance left key val right+ | size right > omega * size left + delta =+ case right of+ (Node rl _ _ _ rr) | size rl < alpha*size rr -> singleL left key val right+ | otherwise -> doubleL left key val right+ _ -> undefined+ | size left > omega * size right + delta =+ case left of+ (Node ll _ _ _ lr) | size lr < alpha*size ll -> singleR left key val right+ | otherwise -> doubleR left key val right+ _ -> undefined+ | otherwise = node left key val right++singleL :: forall k a . Map k a -> k -> a -> Map k a -> Map k a+singleL l k v (Node rl _ rk rv rr) = node (node l k v rl) rk rv rr+singleL _ _ _ _ = undefined++singleR :: forall k a . Map k a -> k -> a -> Map k a -> Map k a+singleR (Node ll _ lk lv lr) k v r = node ll lk lv (node lr k v r)+singleR _ _ _ _ = undefined++doubleL :: forall k a . Map k a -> k -> a -> Map k a -> Map k a+doubleL l k v (Node (Node rll _ rlk rlv rlr) _ rk rv rr) = node (node l k v rll) rlk rlv (node rlr rk rv rr)+doubleL l k v (Node (One rlk rlv ) _ rk rv rr) = node (node l k v Nil) rlk rlv (node Nil rk rv rr)+doubleL _ _ _ _ = undefined++doubleR :: forall k a . Map k a -> k -> a -> Map k a -> Map k a+doubleR (Node ll _ lk lv (Node lrl _ lrk lrv lrr)) k v r = node (node ll lk lv lrl) lrk lrv (node lrr k v r)+doubleR (Node ll _ lk lv (One lrk lrv )) k v r = node (node ll lk lv Nil) lrk lrv (node Nil k v r)+doubleR _ _ _ _ = undefined
+ lib/Data/Maybe.hs view
@@ -0,0 +1,69 @@+-- Copyright 2023 Lennart Augustsson+-- See LICENSE file for full license.+module Data.Maybe(module Data.Maybe, module Data.Maybe_Type) where+import Primitives+import Control.Applicative+import Control.Monad+import Data.Bool+import Data.Char+import Data.Eq+import Data.Function+import Data.Functor+import Data.Int+import Data.List+import Data.Maybe_Type+import Data.Ord+import Text.Show++instance forall a . Eq a => Eq (Maybe a) where+ Nothing == Nothing = True+ Just x == Just x' = x == x'+ _ == _ = False++instance forall a . (Show a) => Show (Maybe a) where+ showsPrec _ Nothing = showString "Nothing"+ showsPrec p (Just a) = showParen (p >= 11) (showString "Just " . showsPrec 11 a)++instance Functor Maybe where+ fmap _ Nothing = Nothing+ fmap f (Just a) = Just (f a)++instance Applicative Maybe where+ pure = Just+ Just f <*> Just a = Just (f a)+ _ <*> _ = Nothing++instance Monad Maybe where+ return = pure+ Nothing >>= _ = Nothing+ Just a >>= f = f a++instance MonadFail Maybe where+ fail _ = Nothing++maybe :: forall a r . r -> (a -> r) -> Maybe a -> r+maybe r _ Nothing = r+maybe _ f (Just a) = f a++fromMaybe :: forall a . a -> Maybe a -> a+fromMaybe a Nothing = a+fromMaybe _ (Just a) = a++catMaybes :: forall a . [Maybe a] -> [a]+catMaybes mxs = [ x | Just x <- mxs ]++isJust :: forall a . Maybe a -> Bool+isJust Nothing = False+isJust (Just _) = True++mapMaybe :: forall a b . (a -> Maybe b) -> [a] -> [b]+mapMaybe _ [] = []+mapMaybe f (a:as) =+ case f a of+ Nothing -> mapMaybe f as+ Just b -> b : mapMaybe f as++maybeToList :: forall a . Maybe a -> [a]+maybeToList Nothing = []+maybeToList (Just a) = [a]+
+ lib/Data/Maybe_Type.hs view
@@ -0,0 +1,5 @@+-- Copyright 2023 Lennart Augustsson+-- See LICENSE file for full license.+module Data.Maybe_Type(module Data.Maybe_Type) where++data Maybe a = Nothing | Just a
+ lib/Data/Monoid.hs view
@@ -0,0 +1,8 @@+module Data.Monoid(module Data.Monoid) where+import Primitives+import Data.Semigroup++class Semigroup a => Monoid a where+ mempty :: a+ mappend :: a -> a -> a+ mappend = (<>)
+ lib/Data/Num.hs view
@@ -0,0 +1,21 @@+-- Copyright 2023 Lennart Augustsson+-- See LICENSE file for full license.+module Data.Num(module Data.Num) where+import Primitives+import Data.Integer_Type++infixl 6 +,-+infixl 7 *++class Num a where+ (+) :: a -> a -> a+ (-) :: a -> a -> a+ (*) :: a -> a -> a+ negate :: a -> a+ abs :: a -> a+ signum :: a -> a+ fromInteger :: Integer -> a+ negate x = 0 - x++subtract :: forall a . Num a => a -> a -> a+subtract x y = y - x
+ lib/Data/Ord.hs view
@@ -0,0 +1,48 @@+module Data.Ord(+ module Data.Ord,+ module Data.Ordering_Type,+ ) where+import Primitives+import Data.Bool_Type+import Data.Bounded+import Data.Ordering_Type+import Data.Eq+import Text.Show++infix 4 <,<=,>,>=++class Eq a => Ord a where+ compare :: a -> a -> Ordering+ (<) :: a -> a -> Bool+ (<=) :: a -> a -> Bool+ (>) :: a -> a -> Bool+ (>=) :: a -> a -> Bool+ max :: a -> a -> a+ min :: a -> a -> a+ -- XXX Check with the Haskell report+ compare x y = if x <= y then (if y <= x then EQ else LT) else GT+ x < y = if y <= x then False else True+ x > y = if x <= y then False else True+ x >= y = x <= y+ min x y = if x <= y then x else y+ max x y = if x <= y then y else x++instance Eq Ordering where+ LT == LT = True+ EQ == EQ = True+ GT == GT = True+ _ == _ = False++isEQ :: Ordering -> Bool+isEQ EQ = True+isEQ _ = False++instance Show Ordering where+ showsPrec _ LT = showString "LT"+ showsPrec _ EQ = showString "EQ"+ showsPrec _ GT = showString "GT"++instance Bounded Ordering where+ minBound = LT+ maxBound = GT+
+ lib/Data/Ordering_Type.hs view
@@ -0,0 +1,2 @@+module Data.Ordering_Type(Ordering(..)) where+data Ordering = LT | EQ | GT
+ lib/Data/Ratio.hs view
@@ -0,0 +1,83 @@+module Data.Ratio(+ Ratio, Rational,+ (%),+ numerator, denominator,+ rationalInfinity,+ rationalNaN,+ Rational,+ ) where+import Primitives+import Control.Error+import Data.Bool+import Data.Eq+import Data.Fractional+import Data.Function+--import Data.Int+import Data.Integer+import Data.Integral+import Data.Num+import Data.Ord+import Data.Ratio_Type+import Text.Show++{- in Data.Ratio_Type+data Ratio a = (:%) a a -- XXX should be strict++type Rational = Ratio Integer+-}++instance forall a . Eq a => Eq (Ratio a) where+ (x :% y) == (x' :% y') = x == x' && y == y'++instance forall a . (Integral a, Ord a) => Ord (Ratio a) where+ (x :% y) <= (x' :% y') = x * y' <= x' * y+ (x :% y) < (x' :% y') = x * y' < x' * y+ (x :% y) >= (x' :% y') = x * y' >= x' * y+ (x :% y) > (x' :% y') = x * y' > x' * y++instance forall a . (Integral a) => Num (Ratio a) where+ (x:%y) + (x':%y') = reduce (x*y' + x'*y) (y*y')+ (x:%y) - (x':%y') = reduce (x*y' - x'*y) (y*y')+ (x:%y) * (x':%y') = reduce (x * x') (y * y')+ negate (x:%y) = (negate x) :% y+ abs (x:%y) = abs x :% y+ signum (x:%_) = signum x :% 1+ fromInteger x = fromInteger x :% 1++instance forall a . (Integral a, Ord a) => Fractional (Ratio a) where+ (x:%y) / (x':%y') = (x*y') % (y*x')+ recip (x:%y)+ | y == 0 = error "Data.Ratio.recip: division by 0"+ | x < 0 = negate y :% negate x+ | otherwise = y :% x+ fromRational (x:%y) = fromInteger x % fromInteger y++instance forall a . (Show a) => Show (Ratio a) where+ showsPrec p (x:%y) = showParen (p > 7) $+ showsPrec 8 x .+ showString " % " .+ showsPrec 8 y++rationalInfinity :: Rational+rationalInfinity = 1 :% 0++rationalNaN :: Rational+rationalNaN = 0 :% 0++infixl 7 %+(%) :: forall a . (Integral a) => a -> a -> Ratio a+x % y = reduce (x * signum y) (abs y)++reduce :: forall a . (Integral a) => a -> a -> Ratio a+reduce x y =+ if y == 0 then+ error "Data.Ratio.%: 0 denominator"+ else+ let d = gcd x y+ in (x `quot` d) :% (y `quot` d)++numerator :: forall a . Ratio a -> a+numerator (x :% _) = x++denominator :: forall a . Ratio a -> a+denominator (_ :% y) = y
+ lib/Data/Ratio_Type.hs view
@@ -0,0 +1,13 @@+module Data.Ratio_Type(module Data.Ratio_Type) where+import Primitives+import Data.Integer_Type++data Ratio a = !a :% !a++type Rational = Ratio Integer++_integerToRational :: Integer -> Rational+_integerToRational x = x :% (1::Integer)++_mkRational :: Integer -> Integer -> Rational+_mkRational = (:%)
+ lib/Data/Real.hs view
@@ -0,0 +1,6 @@+module Data.Real(module Data.Real) where+import Primitives+import Data.Ratio_Type++class Real a where+ toRational :: a -> Rational
+ lib/Data/RealFloat.hs view
@@ -0,0 +1,68 @@+module Data.RealFloat(+ RealFloat(..),+ ) where+import Primitives+import Data.Bool+import Data.Eq+import Data.Floating+import Data.Fractional+import Data.Int+import Data.Integer+import Data.Num+import Data.Ord++class (Fractional a, Ord a, Floating a) => RealFloat a where+ floatRadix :: a -> Integer+ floatDigits :: a -> Int+ floatRange :: a -> (Int,Int)+ decodeFloat :: a -> (Integer,Int)+ encodeFloat :: Integer -> Int -> a+ exponent :: a -> Int+ significand :: a -> a+ scaleFloat :: Int -> a -> a+ isNaN :: a -> Bool+ isInfinite :: a -> Bool+ isDenormalized :: a -> Bool+ isNegativeZero :: a -> Bool+ isIEEE :: a -> Bool+ atan2 :: a -> a -> a++ exponent x = if m == 0 then 0 else n + floatDigits x+ where (m,n) = decodeFloat x++ significand x = encodeFloat m (negate (floatDigits x))+ where (m,_) = decodeFloat x++ scaleFloat 0 x = x+ scaleFloat k x+ | isFix = x+ | otherwise = encodeFloat m (n + clamp b k)+ where (m,n) = decodeFloat x+ (l,h) = floatRange x+ d = floatDigits x+ b = h - l + 4*d+ -- n+k may overflow, which would lead+ -- to wrong results, hence we clamp the+ -- scaling parameter.+ -- If n + k would be larger than h,+ -- n + clamp b k must be too, similar+ -- for smaller than l - d.+ -- Add a little extra to keep clear+ -- from the boundary cases.+ isFix = x == 0 || isNaN x || isInfinite x++ atan2 y x+ | x > 0 = atan (y/x)+ | x == 0 && y > 0 = pi/2+ | x < 0 && y > 0 = pi + atan (y/x)+ |(x <= 0 && y < 0) ||+ (x < 0 && isNegativeZero y) ||+ (isNegativeZero x && isNegativeZero y)+ = negate (atan2 (negate y) x)+ | y == 0 && (x < 0 || isNegativeZero x)+ = pi -- must be after the previous test on zero y+ | x==0 && y==0 = y -- must be after the other double zero tests+ | otherwise = x + y -- x or y is a NaN, return a NaN (via +)++clamp :: Int -> Int -> Int+clamp bd k = max (negate bd) (min bd k)
+ lib/Data/Semigroup.hs view
@@ -0,0 +1,6 @@+module Data.Semigroup(Data.Semigroup) where+import Primitive++infixr 6 <>+class Semigroup a where+ (<>) :: a -> a -> a
+ lib/Data/Tuple.hs view
@@ -0,0 +1,60 @@+-- Copyright 2023 Lennart Augustsson+-- See LICENSE file for full license.+module Data.Tuple(+ module Data.Tuple,+ ()(..)+ ) where+import Primitives -- for ()+import Data.Bool+import Data.Bounded+import Data.Eq+import Data.Function+import Text.Show++--data (a,b) = (a,b) -- all tuples are built in+--data (a,b,c) = (a,b,c)+-- etc++fst :: forall a b . (a, b) -> a+fst (a, _) = a++snd :: forall a b . (a, b) -> b+snd (_, b) = b++instance forall a b . (Eq a, Eq b) => Eq (a, b) where+ (a1, b1) == (a2, b2) = a1 == a2 && b1 == b2++instance forall a b c . (Eq a, Eq b, Eq c) => Eq (a, b, c) where+ (a1, b1, c1) == (a2, b2, c2) = a1 == a2 && b1 == b2 && c1 == c2++instance forall a b c d . (Eq a, Eq b, Eq c, Eq d) => Eq (a, b, c, d) where+ (a1, b1, c1, d1) == (a2, b2, c2, d2) = a1 == a2 && b1 == b2 && c1 == c2 && d1 == d2++instance Show () where+ showsPrec _ () = showString "()"++instance forall a b . (Show a, Show b) => Show (a, b) where+ showsPrec _ (a, b) = showParen True (showsPrec 0 a . showString "," . showsPrec 0 b)++instance forall a b c . (Show a, Show b, Show c) => Show (a, b, c) where+ showsPrec _ (a, b, c) = showParen True (showsPrec 0 a . showString "," . showsPrec 0 b . showString "," . showsPrec 0 c)++instance forall a b c d . (Show a, Show b, Show c, Show d) => Show (a, b, c, d) where+ showsPrec _ (a, b, c, d) = showParen True (showsPrec 0 a . showString "," . showsPrec 0 b . showString "," . showsPrec 0 c .+ showString "," . showsPrec 0 d)++instance Bounded () where+ minBound = ()+ maxBound = ()++instance forall a b . (Bounded a, Bounded b) => Bounded (a, b) where+ minBound = (minBound, minBound)+ maxBound = (maxBound, maxBound)++instance forall a b c . (Bounded a, Bounded b, Bounded c) => Bounded (a, b, c) where+ minBound = (minBound, minBound, minBound)+ maxBound = (maxBound, maxBound, maxBound)++instance forall a b c d . (Bounded a, Bounded b, Bounded c, Bounded d) => Bounded (a, b, c, d) where+ minBound = (minBound, minBound, minBound, minBound)+ maxBound = (maxBound, maxBound, maxBound, maxBound)
+ lib/Data/Word.hs view
@@ -0,0 +1,99 @@+-- Copyright 2023 Lennart Augustsson+-- See LICENSE file for full license.+module Data.Word(module Data.Word, Word) where+import Primitives+import Data.Bits+import Data.Bool_Type+import Data.Bounded+import Data.Char+import Data.Enum+import Data.Eq+import Data.Int() -- instances only+import Data.Integer+import Data.Integral+import Data.List+import Data.Num+import Data.Ord+import Data.Real+import Text.Show++instance Num Word where+ (+) = primWordAdd+ (-) = primWordSub+ (*) = primWordMul+ abs x = x+ signum x = if x == 0 then 0 else 1+ fromInteger x = primIntToWord (_integerToInt x)++instance Integral Word where+ quot = primWordQuot+ rem = primWordRem+ toInteger = _wordToInteger++instance Bounded Word where+ minBound = 0::Word+ maxBound = (-1::Word)++instance Real Word where+ toRational i = _integerToRational (_wordToInteger i)++--------------------------------++instance Enum Word where+ succ x = x + 1+ pred x = x - 1+ toEnum = primIntToWord+ fromEnum = primWordToInt+ enumFrom n = n : enumFrom (n+1)+ enumFromThen n m = from n+ where d = m - n+ from i = i : from (i+d)+ enumFromTo l h = takeWhile (<= h) (enumFrom l)+ enumFromThenTo l m h =+ if m > l then+ takeWhile (<= h) (enumFromThen l m)+ else+ takeWhile (>= h) (enumFromThen l m)++--------------------------------++instance Eq Word where+ (==) = primWordEQ+ (/=) = primWordNE++instance Ord Word where+ (<) = primWordLT+ (<=) = primWordLE+ (>) = primWordGT+ (>=) = primWordGE++instance Enum Word where+ toEnum = primIntToWord+ fromEnum = primWordToInt++--------------------------------++instance Bits Word where+ (.&.) = primWordAnd+ (.|.) = primWordOr+ xor = primWordXor+ complement = primWordInv+ shiftL = primWordShl+ shiftR = primWordShr+-- bitSizeMaybe _ = Just 64 -- XXX+ bitSize _ = 64+ bit n = primWordShl 1 n+ zeroBits = 0++--------------------------------++instance Show Word where+ show = showWord+ where+ showWord :: Word -> String+ showWord n =+ let+ c = chr (ord '0' + primWordToInt (rem n (10::Word)))+ in case n < (10::Word) of+ False -> showWord (quot n (10::Word)) ++ [c]+ True -> [c]
+ lib/Debug/Trace.hs view
@@ -0,0 +1,13 @@+module Debug.Trace(module Debug.Trace) where+import Prelude+import Primitives++trace :: forall a . String -> a -> a+trace msg a = primitive "IO.performIO" (+ do+ putStrLn msg+ return a+ )++traceM :: forall (m :: Type -> Type) a . Monad m => String -> m ()+traceM s = trace s (return ())
+ lib/Foreign/C/String.hs view
@@ -0,0 +1,24 @@+module Foreign.C.String(+ CChar, CString,+ newCAString, withCAString,+ peekCAString,+ ) where+import Primitives+import Data.Char_Type+import Foreign.Marshal.Alloc++type CChar = Char+type CString = Ptr CChar++newCAString :: String -> IO CString+newCAString = primNewCAString++withCAString :: forall a . String -> (CString -> IO a) -> IO a+withCAString s io =+ newCAString s `primBind` \ cs ->+ io cs `primBind` \ a ->+ free cs `primThen`+ primReturn a++peekCAString :: CString -> IO String+peekCAString = primPeekCAString
+ lib/Foreign/Marshal/Alloc.hs view
@@ -0,0 +1,15 @@+module Foreign.Marshal.Alloc(+ free,+ mallocBytes,+ ) where+import Primitives++foreign import ccall "free" c_free :: forall a . Ptr a -> IO ()++free :: forall a . Ptr a -> IO ()+free = c_free++foreign import ccall "malloc" c_malloc :: forall a . Int -> IO (Ptr a)++mallocBytes :: forall a . Int -> IO (Ptr a)+mallocBytes = c_malloc
+ lib/Foreign/Ptr.hs view
@@ -0,0 +1,15 @@+module Foreign.Ptr(Ptr, nullPtr) where+import Primitives+import Data.Word+import Data.Eq+import Data.Function+import Text.Show++instance forall a . Eq (Ptr a) where+ p == q = primPtrToWord p == primPtrToWord q++instance forall a . Show (Ptr a) where+ showsPrec _ p = showString "PTR#" . showsPrec 0 (primPtrToWord p)++nullPtr :: forall a . Ptr a+nullPtr = primWordToPtr 0
+ lib/Prelude.hs view
@@ -0,0 +1,65 @@+-- Copyright 2023 Lennart Augustsson+-- See LICENSE file for full license.+module Prelude(+ module Control.Applicative,+ module Control.Error,+ module Control.Monad,+ module Data.Bool,+ module Data.Bounded,+ module Data.Char,+ module Data.Double,+ module Data.Either,+ module Data.Enum,+ module Data.Eq,+ module Data.Floating,+ module Data.Fractional,+ module Data.Function,+ module Data.Functor,+ module Data.Int,+ module Data.Integer,+ module Data.Integral,+ module Data.List,+ module Data.Maybe,+ module Data.Num,+ module Data.Ord,+ module Data.Ratio,+ module Data.Real,+ module Data.RealFloat,+ module Data.Tuple,+ module System.IO,+ module Text.Show,+ module Text.String,+ usingMhs,+ ) where+import Control.Applicative+import Control.Error+import Control.Monad+import Data.Bool+import Data.Bounded+import Data.Char+import Data.Double+import Data.Either+import Data.Enum+import Data.Eq+import Data.Floating+import Data.Fractional+import Data.Function+import Data.Functor+import Data.Int+import Data.Integer+import Data.Integral+import Data.List+import Data.Maybe+import Data.Num+import Data.Ord+import Data.Ratio(Rational)+import Data.Real+import Data.RealFloat+import Data.Tuple+import System.IO+import Text.Show+import Text.String++-- So we can detect mhs vs ghc+usingMhs :: Bool+usingMhs = True
+ lib/Primitives.hs view
@@ -0,0 +1,206 @@+-- Copyright 2023 Lennart Augustsson+-- See LICENSE file for full license.+module Primitives(module Primitives) where+import Data.Bool_Type+--import Data.List_Type+import Data.Ordering_Type++infixr -1 ->+infixr -2 =>+infix 4 ~++data Any+data Char+data Handle+data Int+data Double+data IO a+data Word+data Ptr a++-- Type equality as a constraint.+class a ~ b {-x | a -> b, b -> a-}++data () = () -- Parser hacks allows () to be used++primIntAdd :: Int -> Int -> Int+primIntAdd = primitive "+"+primIntSub :: Int -> Int -> Int+primIntSub = primitive "-"+primIntMul :: Int -> Int -> Int+primIntMul = primitive "*"+primIntQuot :: Int -> Int -> Int+primIntQuot = primitive "quot"+primIntRem :: Int -> Int -> Int+primIntRem = primitive "rem"+primIntSubR :: Int -> Int -> Int+primIntSubR = primitive "subtract"+primIntNeg :: Int -> Int+primIntNeg = primitive "neg"++primDoubleAdd :: Double -> Double -> Double+primDoubleAdd = primitive "fadd"+primDoubleSub :: Double -> Double -> Double+primDoubleSub = primitive "fsub"+primDoubleMul :: Double -> Double -> Double+primDoubleMul = primitive "fmul"+primDoubleDiv :: Double -> Double -> Double+primDoubleDiv = primitive "fdiv"+primDoubleNeg :: Double -> Double+primDoubleNeg = primitive "fneg"+primDoubleEQ :: Double -> Double -> Bool+primDoubleEQ = primitive "feq"+primDoubleNE :: Double -> Double -> Bool+primDoubleNE = primitive "fne"+primDoubleLT :: Double -> Double -> Bool+primDoubleLT = primitive "flt"+primDoubleLE :: Double -> Double -> Bool+primDoubleLE = primitive "fle"+primDoubleGT :: Double -> Double -> Bool+primDoubleGT = primitive "fgt"+primDoubleGE :: Double -> Double -> Bool+primDoubleGE = primitive "fge"+primDoubleShow :: Double -> [Char]+primDoubleShow = primitive "fshow"+primDoubleRead :: [Char] -> Double+primDoubleRead = primitive "fread"+primDoubleFromInt :: Int -> Double+primDoubleFromInt = primitive "itof"++primWordAdd :: Word -> Word -> Word+primWordAdd = primitive "+"+primWordSub :: Word -> Word -> Word+primWordSub = primitive "-"+primWordMul :: Word -> Word -> Word+primWordMul = primitive "*"+primWordQuot :: Word -> Word -> Word+primWordQuot = primitive "uquot"+primWordRem :: Word -> Word -> Word+primWordRem = primitive "urem"+primWordAnd :: Word -> Word -> Word+primWordAnd = primitive "and"+primWordOr :: Word -> Word -> Word+primWordOr = primitive "or"+primWordXor :: Word -> Word -> Word+primWordXor = primitive "xor"+primWordShl :: Word -> Int -> Word+primWordShl = primitive "shl"+primWordShr :: Word -> Int -> Word+primWordShr = primitive "shr"+primWordAshr :: Word -> Int -> Word+primWordAshr = primitive "ashr"+primWordInv :: Word -> Word+primWordInv = primitive "inv"+primWordToDoubleRaw :: Word -> Double+primWordToDoubleRaw = primitive "toDbl"+primWordFromDoubleRaw :: Double -> Word+primWordFromDoubleRaw = primitive "toInt"++primIntEQ :: Int -> Int -> Bool+primIntEQ = primitive "=="+primIntNE :: Int -> Int -> Bool+primIntNE = primitive "/="+primIntLT :: Int -> Int -> Bool+primIntLT = primitive "<"+primIntLE :: Int -> Int -> Bool+primIntLE = primitive "<="+primIntGT :: Int -> Int -> Bool+primIntGT = primitive ">"+primIntGE :: Int -> Int -> Bool+primIntGE = primitive ">="++primWordEQ :: Word -> Word -> Bool+primWordEQ = primitive "=="+primWordNE :: Word -> Word -> Bool+primWordNE = primitive "/="+primWordLT :: Word -> Word -> Bool+primWordLT = primitive "u<"+primWordLE :: Word -> Word -> Bool+primWordLE = primitive "<="+primWordGT :: Word -> Word -> Bool+primWordGT = primitive ">"+primWordGE :: Word -> Word -> Bool+primWordGE = primitive ">="++primWordToInt :: Word -> Int+primWordToInt = primitive "I"+primIntToWord :: Int -> Word+primIntToWord = primitive "I"++primCharEQ :: Char -> Char -> Bool+primCharEQ = primitive "=="+primCharNE :: Char -> Char -> Bool+primCharNE = primitive "/="+primCharLT :: Char -> Char -> Bool+primCharLT = primitive "<"+primCharLE :: Char -> Char -> Bool+primCharLE = primitive "<="+primCharGT :: Char -> Char -> Bool+primCharGT = primitive ">"+primCharGE :: Char -> Char -> Bool+primCharGE = primitive ">="++primError :: forall a . [Char] -> a+primError = primitive "error"++primFix :: forall a . (a -> a) -> a+primFix = primitive "Y"++primSeq :: forall a b . a -> b -> b+primSeq = primitive "seq"++--primEqual :: forall a . a -> a -> Bool+--primEqual = primitive "equal"++-- Works for Int, Char, String+primCompare :: forall a . a -> a -> Ordering+primCompare = primitive "compare"++primStringEQ :: [Char] -> [Char] -> Bool+primStringEQ = primitive "equal"++primChr :: Int -> Char+primChr = primitive "I"+primOrd :: Char -> Int+primOrd = primitive "I"++primUnsafeCoerce :: forall a b . a -> b+primUnsafeCoerce = primitive "I"++primBind :: forall a b . IO a -> (a -> IO b) -> IO b+primBind = primitive "IO.>>="+primThen :: forall a b . IO a -> IO b -> IO b+primThen = primitive "IO.>>"+primReturn :: forall a . a -> IO a+primReturn = primitive "IO.return"+primGetArgs :: IO [[Char]]+primGetArgs = primitive "IO.getArgs"+primDropArgs :: Int -> IO ()+primDropArgs = primitive "IO.dropArgs"+primPerformIO :: forall a . IO a -> a+primPerformIO = primitive "IO.performIO"++primWithDropArgs :: forall a . Int -> IO a -> IO a+primWithDropArgs i ioa = primThen (primDropArgs i) ioa++-- Use string for the exception until we can do better.+primCatch :: forall a . IO a -> ([Char] -> IO a) -> IO a+primCatch = primitive "IO.catch"++primRnfErr :: forall a . a -> ()+primRnfErr = primitive "rnf" (0::Int)++primRnfNoErr :: forall a . a -> ()+primRnfNoErr = primitive "rnf" (1::Int)++primNewCAString :: [Char] -> IO (Ptr Char)+primNewCAString = primitive "newCAString"++primPeekCAString :: Ptr Char -> IO [Char]+primPeekCAString = primitive "peekCAString"++primWordToPtr :: forall a . Word -> Ptr a+primWordToPtr = primitive "toPtr"++primPtrToWord :: forall a . Ptr a -> Word+primPtrToWord = primitive "toInt"
+ lib/System/Console/SimpleReadline.hs view
@@ -0,0 +1,174 @@+-- Copyright 2023 Lennart Augustsson+-- See LICENSE file for full license.+--+-- Simple readline with line editing and history.+-- Only assumes the terminal is capable of (sane) backspace.+module System.Console.SimpleReadline(+ getInputLine,+ getInputLineHist+ ) where+import Prelude+import Control.Monad+import Data.Char+import System.IO+--Ximport Compat++foreign import ccall "getRaw" c_getRaw :: IO Int+++-- Get an input line with editing.+-- Return Nothing if the input is ^D, otherwise the typed string.+getInputLine :: String -> IO (Maybe String)+getInputLine prompt = do+ (_, r) <- loop ([],[]) "" ""+ return r+++-- Get an input line with editing.+-- Return Nothing if the input is ^D, otherwise the typed string.+-- The FilePath gives the name of a file that stores the history.+getInputLineHist :: FilePath -> String -> IO (Maybe String)+getInputLineHist hfn prompt = do+ mhdl <- openFileM hfn ReadMode+ hist <-+ case mhdl of+ Nothing -> return []+ Just hdl -> do+ file <- hGetContents hdl+ let h = lines file+ seq (length h) (return h) -- force file to be read+ putStr prompt+ (hist', r) <- loop (reverse hist, []) "" ""+-- putStrLn $ "done: " ++ hfn ++ "\n" ++ unlines hist'+ writeFile hfn $ unlines hist'+ return r -- XXX no type error++getRaw :: IO Int+getRaw = do+ i <- c_getRaw+ when (i < 0) $+ error "getRaw failed"+ return i++type Hist = ([String], [String])++loop :: Hist -> String -> String -> IO ([String], Maybe String)+loop hist before after = do+ hFlush stdout+ i <- getRaw+ let+ cur = reverse before ++ after+ back n = putStr (replicate n '\b')++ add c = do+ putChar c+ putStr after+ back (length after)+ loop hist (c:before) after+ backward =+ case before of+ [] -> noop+ c:cs -> do+ back 1+ loop hist cs (c:after)+ forward =+ case after of+ [] -> noop+ c:cs -> do+ putChar c+ loop hist (c:before) cs+ bol = do+ back (length before)+ loop hist "" (reverse before ++ after)+ eol = do+ putStr after+ loop hist (reverse after ++ before) ""+ bs = do+ case before of+ [] -> noop+ _:cs -> do+ back 1+ putStr after+ putChar ' '+ back (length after + 1)+ loop hist cs after+ del = do+ case after of+ [] -> noop+ _:cs -> do+ putStr cs+ putChar ' '+ back (length cs + 1)+ loop hist before cs+ send =+ ret (Just cur)+ ret ms = do+ putChar '\n'+ hFlush stdout+ let+ o = reverse (fst hist) ++ snd hist+ l =+ case ms of+ Nothing -> []+ Just "" -> []+ Just s | not (null o) && s == last o -> []+ | otherwise -> [s]+ h = o ++ l+ return (h, ms)+ erase = do+ eraseLine+ loop hist "" ""+ noop = loop hist before after+ kill = do+ putStr after+ putStr $ concat $ replicate (length after) "\b \b"+ loop hist before ""++ next =+ case hist of+ (_, []) -> noop+ (p, l:n) -> setLine (l:p, n) l+ previous =+ case hist of+ ([], _) -> noop+ (l:p, n) -> setLine (p, l:n) l+ setLine h s = do+ eraseLine+ putStr s+ loop h (reverse s) ""++ eraseLine = do+ putStr after+ putStr $ concat $ replicate (length before + length after) "\b \b"++ case i of+ 4 -> -- CTL-D, EOF+ if null before && null after then+ ret Nothing+ else+ del+ 2 -> backward -- CTL-B, backwards+ 6 -> forward -- CTL-F, forwards+ 1 -> bol -- CTL-A, beginning of line+ 5 -> eol -- CTL-E, end of line+ 8 -> bs -- BS, backspace+ 127 -> bs -- DEL, backspace+ 13 -> send -- CR, return+ 10 -> send -- LF, return+ 14 -> next -- CTL-N, next line+ 15 -> previous -- CTL-P, previous line+ 21 -> erase -- CTL-U, erase line+ 11 -> kill -- CTL-K, kill to eol+ 27 -> do -- ESC+ b <- getRaw+ if b /= ord '[' then+ noop+ else do+ c <- getRaw+ case chr c of+ 'A' -> previous+ 'B' -> next+ 'C' -> forward+ 'D' -> backward+ _ -> noop+ _ -> if i >= 32 && i < 127 then add (chr i) else noop
+ lib/System/Directory.hs view
@@ -0,0 +1,12 @@+module System.Directory(removeFile) where+import Prelude+import Foreign.C.String+import Foreign.Ptr++foreign import ccall "unlink" c_unlink :: CString -> IO Int++removeFile :: FilePath -> IO ()+removeFile fn = do+ r <- withCAString fn c_unlink+ when (r /= 0) $+ error "removeFile failed"
+ lib/System/Environment.hs view
@@ -0,0 +1,23 @@+-- Copyright 2023 Lennart Augustsson+-- See LICENSE file for full license.+module System.Environment(module System.Environment) where+import Prelude+import Primitives+import Foreign.C.String+import Foreign.Ptr++getArgs :: IO [String]+getArgs = primGetArgs++withDropArgs :: forall a . Int -> IO a -> IO a+withDropArgs = primWithDropArgs++foreign import ccall "getenv" c_getenv :: CString -> IO CString++lookupEnv :: String -> IO (Maybe String)+lookupEnv var = do+ cptr <- withCAString var c_getenv+ if cptr == nullPtr then+ return Nothing+ else+ Just <$> peekCAString cptr
+ lib/System/IO.hs view
@@ -0,0 +1,236 @@+-- Copyright 2023 Lennart Augustsson+-- See LICENSE file for full license.+module System.IO(+ module System.IO, Handle, IO,+ module Data.Functor,+ module Control.Applicative,+ module Control.Monad,+ ) where+import Primitives+import Control.Applicative+import Control.Error+import Control.Monad+import Data.Bool+import Data.Char+import Data.Eq+import Data.Function+import Data.Functor+import Data.Int+import Data.List+import Data.Maybe+import Data.Num+import Data.Tuple+import Text.Show+import Foreign.C.String+import Foreign.Marshal.Alloc+import Foreign.Ptr++data FILE+newtype Handle = Handle (Ptr FILE)++primHSerialize :: forall a . Handle -> a -> IO ()+primHSerialize = primitive "IO.serialize"+primHPrint :: forall a . Handle -> a -> IO ()+primHPrint = primitive "IO.print"+primHDeserialize :: forall a . Handle -> IO a+primHDeserialize = primitive "IO.deserialize"+primStdin :: Handle+primStdin = primitive "IO.stdin"+primStdout :: Handle+primStdout = primitive "IO.stdout"+primStderr :: Handle+primStderr = primitive "IO.stderr"++foreign import ccall "fopen" c_fopen :: CString -> CString -> IO Handle+foreign import ccall "fclose" c_fclose :: Handle -> IO Int+foreign import ccall "fflush" c_fflush :: Handle -> IO Int+foreign import ccall "fgetc" c_fgetc :: Handle -> IO Int+foreign import ccall "fputc" c_fputc :: Int -> Handle -> IO Int+foreign import ccall "getTimeMilli" c_getTimeMilli :: IO Int++----------------------------------------------------------++instance Eq Handle where+ Handle p == Handle q = p == q++instance Show Handle where+ show (Handle p) = "Handle-" ++ show p++nullHandle :: Handle+nullHandle = Handle nullPtr++type FilePath = String++data IOMode = ReadMode | WriteMode | AppendMode | ReadWriteMode++instance Functor IO where+ fmap f ioa = ioa `primBind` \ a -> primReturn (f a)+instance Applicative IO where+ pure = primReturn+ (<*>) = ap+instance Monad IO where+ (>>=) = primBind+ (>>) = primThen+ return = primReturn+instance MonadFail IO where+ fail = error++hSerialize :: forall a . Handle -> a -> IO ()+hSerialize = primHSerialize++hDeserialize :: forall a . Handle -> IO a+hDeserialize = primHDeserialize++stdin :: Handle+stdin = primStdin+stdout :: Handle+stdout = primStdout+stderr :: Handle+stderr = primStderr++hClose :: Handle -> IO ()+hClose h = do { c_fclose h; return () } -- ignore error code++hFlush :: Handle -> IO ()+hFlush h = do { c_fflush h; return () } -- ignore error code++hGetChar :: Handle -> IO Char+hGetChar h = do+ c <- c_fgetc h+ if c == (-1::Int) then+ error "hGetChar: EOF"+ else+ return (chr c)++hPutChar :: Handle -> Char -> IO ()+hPutChar h c = do { c_fputc (ord c) h; return () } -- ignore error code++openFileM :: FilePath -> IOMode -> IO (Maybe Handle)+openFileM p m = do+ let+ ms = case m of+ ReadMode -> "r"+ WriteMode -> "w"+ AppendMode -> "a"+ ReadWriteMode -> "w+"+ h <- withCAString p $ \cp -> withCAString ms $ \ cm -> c_fopen cp cm+ if h == nullHandle then+ return Nothing+ else+ return (Just h)++openFile :: String -> IOMode -> IO Handle+openFile p m = do+ mh <- openFileM p m+ case mh of+ Nothing -> error ("openFile: cannot open " ++ p)+ Just h -> return h++putChar :: Char -> IO ()+putChar = hPutChar stdout++getChar :: IO Char+getChar = hGetChar stdin++cprint :: forall a . a -> IO ()+cprint a = primRnfNoErr a `seq` primHPrint stdout a++cuprint :: forall a . a -> IO ()+cuprint = primHPrint stdout++print :: forall a . (Show a) => a -> IO ()+print a = putStrLn (show a)++putStr :: String -> IO ()+putStr = hPutStr stdout++hPutStr :: Handle -> String -> IO ()+hPutStr h = mapM_ (hPutChar h)++putStrLn :: String -> IO ()+putStrLn = hPutStrLn stdout++hPutStrLn :: Handle -> String -> IO ()+hPutStrLn h s = hPutStr h s >> hPutChar h '\n'++writeFile :: FilePath -> String -> IO ()+writeFile p s = do+ h <- openFile p WriteMode+ hPutStr h s+ hClose h++-- Lazy readFile+readFile :: FilePath -> IO String+readFile p = do+ h <- openFile p ReadMode+ cs <- hGetContents h+ --hClose h can't close with lazy hGetContents+ return cs++-- Lazy hGetContents+hGetContents :: Handle -> IO String+hGetContents h = do+ c <- c_fgetc h+ if c == (-1::Int) then do+ hClose h -- EOF, so close the handle+ return ""+ else do+ cs <- unsafeInterleaveIO (hGetContents h)+ return (chr c : cs)+ +writeSerialized :: forall a . FilePath -> a -> IO ()+writeSerialized p s = do+ h <- openFile p WriteMode+ hSerialize h s+ hClose h++readSerialized :: forall a . FilePath -> IO a+readSerialized p = do+ h <- openFile p ReadMode+ a <- hDeserialize h+ hClose h+ return a++getTimeMilli :: IO Int+getTimeMilli = c_getTimeMilli++unsafeInterleaveIO :: forall a . IO a -> IO a+unsafeInterleaveIO ioa = return (primPerformIO ioa)++seq :: forall a b . a -> b -> b+seq = primSeq++-- MicroHs is always in binary mode+hSetBinaryMode :: Handle -> Bool -> IO ()+hSetBinaryMode _ _ = return ()++--------++-- Create a temporary file, take a prefix and a suffix+-- and returns a malloc()ed string.+foreign import ccall "tmpname" c_tmpname :: CString -> CString -> IO CString++-- Create and open a temporary file.+openTmpFile :: String -> IO (String, Handle)+openTmpFile tmpl = do+ let (pre, suf) =+ case span (/= '.') (reverse tmpl) of+ (rsuf, "") -> (tmpl, "")+ (rsuf, _:rpre) -> (reverse rpre, '.':reverse rsuf)+ ctmp <- withCAString pre $ withCAString suf . c_tmpname+ tmp <- peekCAString ctmp+ free ctmp+ h <- openFile tmp WriteMode+ return (tmp, h)++--------++-- Helper for interactive system+class PrintOrRun a where+ printOrRun :: a -> IO ()++instance PrintOrRun (IO ()) where+ printOrRun a = a++instance forall a . Show a => PrintOrRun a where+ printOrRun a = putStrLn (show a)
+ lib/System/Process.hs view
@@ -0,0 +1,11 @@+module System.Process(callCommand) where+import Prelude+import Foreign.C.String++foreign import ccall "system" systemc :: CString -> IO Int++callCommand :: String -> IO ()+callCommand cmd = do+ r <- withCAString cmd systemc+ when (r /= 0) $+ error $ "callCommand: failed " ++ show r
+ lib/Text/PrettyPrint/HughesPJ.hs view
@@ -0,0 +1,368 @@+-- Based on the pretty-printer outlined in the paper+-- 'The Design of a Pretty-printing Library' by+-- John Hughes in Advanced Functional Programming, 1995.+-- With inspiration and code from the from the Hackage package pretty.+module Text.PrettyPrint.HughesPJ(+ Doc,+ text, empty,+ (<>), (<+>), ($$), ($+$),+ hcat, hsep,+ vcat,+ sep, cat,+ nest, hang,+ punctuate,+ parens, brackets, braces,+ maybeParens,+ Style,+ render, renderStyle,+ ) where+import Prelude++infixl 6 <>, <+>+infixl 5 $$, $+$++data Doc+ = Empty -- ^ An empty span, see 'empty'.+ | NilAbove Doc -- ^ @text "" $$ x@.+ | TextBeside String Doc -- ^ @text s <> x@.+ | Nest Int Doc -- ^ @nest k x@.+ | Union Doc Doc -- ^ @ul `union` ur@.+ | NoDoc -- ^ The empty set of documents.+ | Beside Doc Bool Doc -- ^ True <=> space between.+ | Above Doc Bool Doc -- ^ True <=> never overlap.++type RDoc = Doc++text :: String -> Doc+text s = TextBeside s Empty++empty :: Doc+empty = Empty++reduceDoc :: Doc -> RDoc+reduceDoc (Beside p g q) = beside p g (reduceDoc q)+reduceDoc (Above p g q) = above p g (reduceDoc q)+reduceDoc p = p++hcat :: [Doc] -> Doc+hcat = snd . reduceHoriz . foldr (\p q -> Beside p False q) empty++hsep :: [Doc] -> Doc+hsep = snd . reduceHoriz . foldr (\p q -> Beside p True q) empty++vcat :: [Doc] -> Doc+vcat = snd . reduceVert . foldr (\p q -> Above p False q) empty++nest :: Int -> Doc -> Doc+nest k p = mkNest k (reduceDoc p)++-- | @hang d1 n d2 = sep [d1, nest n d2]@+hang :: Doc -> Int -> Doc -> Doc+hang d1 n d2 = sep [d1, nest n d2]++punctuate :: Doc -> [Doc] -> [Doc]+punctuate _ [] = []+punctuate p (x:xs) = go x xs+ where go y [] = [y]+ go y (z:zs) = (y <> p) : go z zs++maybeParens :: Bool -> Doc -> Doc+maybeParens False = id+maybeParens True = parens++parens :: Doc -> Doc+parens p = text "(" <> p <> text ")"+braces :: Doc -> Doc+braces p = text "{" <> p <> text "}"+brackets :: Doc -> Doc+brackets p = text "[" <> p <> text "]"++-- mkNest checks for Nest's invariant that it doesn't have an Empty inside it+mkNest :: Int -> Doc -> Doc+mkNest k _ | k `seq` False = undefined+mkNest k (Nest k1 p) = mkNest (k + k1) p+mkNest _ NoDoc = NoDoc+mkNest _ Empty = Empty+mkNest 0 p = p+mkNest k p = nest_ k p++-- mkUnion checks for an empty document+mkUnion :: Doc -> Doc -> Doc+mkUnion Empty _ = Empty+mkUnion p q = p `union_` q++data IsEmpty = IsEmpty | NotEmpty++reduceHoriz :: Doc -> (IsEmpty, Doc)+reduceHoriz (Beside p g q) = eliminateEmpty Beside (snd (reduceHoriz p)) g (reduceHoriz q)+reduceHoriz doc = (NotEmpty, doc)++reduceVert :: Doc -> (IsEmpty, Doc)+reduceVert (Above p g q) = eliminateEmpty Above (snd (reduceVert p)) g (reduceVert q)+reduceVert doc = (NotEmpty, doc)++eliminateEmpty ::+ (Doc -> Bool -> Doc -> Doc) ->+ Doc -> Bool -> (IsEmpty, Doc) -> (IsEmpty, Doc)+eliminateEmpty _ Empty _ q = q+eliminateEmpty cons p g q =+ (NotEmpty,+ case q of+ (NotEmpty, q') -> cons p g q'+ (IsEmpty, _) -> p+ )++nilAbove_ :: RDoc -> RDoc+nilAbove_ = NilAbove++-- | Arg of a TextBeside is always an RDoc.+textBeside_ :: String -> RDoc -> RDoc+textBeside_ = TextBeside++nest_ :: Int -> RDoc -> RDoc+nest_ = Nest++union_ :: RDoc -> RDoc -> RDoc+union_ = Union++($$) :: Doc -> Doc -> Doc+p $$ q = above_ p False q++-- | Above, with no overlapping.+-- '$+$' is associative, with identity 'empty'.+($+$) :: Doc -> Doc -> Doc+p $+$ q = above_ p True q++above_ :: Doc -> Bool -> Doc -> Doc+above_ p _ Empty = p+above_ Empty _ q = q+above_ p g q = Above p g q++above :: Doc -> Bool -> RDoc -> RDoc+above (Above p g1 q1) g2 q2 = above p g1 (above q1 g2 q2)+above p@(Beside _ _ _) g q = aboveNest (reduceDoc p) g 0 (reduceDoc q)+above p g q = aboveNest p g 0 (reduceDoc q)++-- Specfication: aboveNest p g k q = p $g$ (nest k q)+aboveNest :: RDoc -> Bool -> Int -> RDoc -> RDoc+aboveNest _ _ k _ | k `seq` False = undefined+aboveNest NoDoc _ _ _ = NoDoc+aboveNest (p1 `Union` p2) g k q = aboveNest p1 g k q `union_`+ aboveNest p2 g k q++aboveNest Empty _ k q = mkNest k q+aboveNest (Nest k1 p) g k q = nest_ k1 (aboveNest p g (k - k1) q)+ -- p can't be Empty, so no need for mkNest++aboveNest (NilAbove p) g k q = nilAbove_ (aboveNest p g k q)+aboveNest (TextBeside s p) g k q = TextBeside s rest+ where+ k1 = k - length s+ rest = case p of+ Empty -> nilAboveNest g k1 q+ _ -> aboveNest p g k1 q++aboveNest (Above _ _ _) _ _ _ = error "aboveNest Above"+aboveNest (Beside _ _ _) _ _ _ = error "aboveNest Beside"++-- Specification: text s <> nilaboveNest g k q+-- = text s <> (text "" $g$ nest k q)+nilAboveNest :: Bool -> Int -> RDoc -> RDoc+nilAboveNest _ k _ | k `seq` False = undefined+nilAboveNest _ _ Empty = Empty+ -- Here's why the "text s <>" is in the spec!+nilAboveNest g k (Nest k1 q) = nilAboveNest g (k + k1) q+nilAboveNest g k q | not g && k > 0 -- No newline if no overlap+ = textBeside_ (replicate k ' ') q+ | otherwise -- Put them really above+ = nilAbove_ (mkNest k q)++(<>) :: Doc -> Doc -> Doc+p <> q = beside_ p False q++-- | Beside, separated by space, unless one of the arguments is 'empty'.+-- '<+>' is associative, with identity 'empty'.+(<+>) :: Doc -> Doc -> Doc+p <+> q = beside_ p True q++beside_ :: Doc -> Bool -> Doc -> Doc+beside_ p _ Empty = p+beside_ Empty _ q = q+beside_ p g q = Beside p g q++-- Specification: beside g p q = p <g> q+beside :: Doc -> Bool -> RDoc -> RDoc+beside NoDoc _ _ = NoDoc+beside (p1 `Union` p2) g q = beside p1 g q `union_` beside p2 g q+beside Empty _ q = q+beside (Nest k p) g q = nest_ k $! beside p g q+beside p@(Beside p1 g1 q1) g2 q2+ | g1 == g2 = beside p1 g1 $! beside q1 g2 q2+ | otherwise = beside (reduceDoc p) g2 q2+beside p@(Above _ _ _) g q = let { d = reduceDoc p } in beside d g q+beside (NilAbove p) g q = nilAbove_ $! beside p g q+beside (TextBeside t p) g q = TextBeside t rest+ where+ rest = case p of+ Empty -> nilBeside g q+ _ -> beside p g q++-- Specification: text "" <> nilBeside g p+-- = text "" <g> p+nilBeside :: Bool -> RDoc -> RDoc+nilBeside _ Empty = Empty -- Hence the text "" in the spec+nilBeside g (Nest _ p) = nilBeside g p+nilBeside g p | g = textBeside_ " " p+ | otherwise = p++sep :: [Doc] -> Doc+sep = sepX True -- Separate with spaces++-- | Either 'hcat' or 'vcat'.+cat :: [Doc] -> Doc+cat = sepX False -- Don't++sepX :: Bool -> [Doc] -> Doc+sepX _ [] = empty+sepX x (p:ps) = sep1 x (reduceDoc p) 0 ps+++-- Specification: sep1 g k ys = sep (x : map (nest k) ys)+-- = oneLiner (x <g> nest k (hsep ys))+-- `union` x $$ nest k (vcat ys)+sep1 :: Bool -> RDoc -> Int -> [Doc] -> RDoc+sep1 _ _ k _ | k `seq` False = undefined+sep1 _ NoDoc _ _ = NoDoc+sep1 g (p `Union` q) k ys = sep1 g p k ys `union_`+ aboveNest q False k (reduceDoc (vcat ys))++sep1 g Empty k ys = mkNest k (sepX g ys)+sep1 g (Nest n p) k ys = nest_ n (sep1 g p (k - n) ys)++sep1 _ (NilAbove p) k ys = nilAbove_+ (aboveNest p False k (reduceDoc (vcat ys)))+sep1 g (TextBeside s p) k ys = textBeside_ s (sepNB g p (k - length s) ys)+sep1 _ (Above _ _ _) _ _ = error "sep1 Above"+sep1 _ (Beside _ _ _) _ _ = error "sep1 Beside"++sepNB :: Bool -> Doc -> Int -> [Doc] -> Doc+sepNB g (Nest _ p) k ys+ = sepNB g p k ys+sepNB g Empty k ys+ = oneLiner (nilBeside g (reduceDoc rest)) `mkUnion`+ nilAboveNest False k (reduceDoc (vcat ys))+ where+ rest | g = hsep ys+ | otherwise = hcat ys+sepNB g p k ys+ = sep1 g p k ys++oneLiner :: Doc -> Doc+oneLiner NoDoc = NoDoc+oneLiner Empty = Empty+oneLiner (NilAbove _) = NoDoc+oneLiner (TextBeside s p) = textBeside_ s (oneLiner p)+oneLiner (Nest k p) = nest_ k (oneLiner p)+oneLiner (p `Union` _) = oneLiner p+oneLiner (Above _ _ _) = error "oneLiner Above"+oneLiner (Beside _ _ _) = error "oneLiner Beside"++-- ---------------------------------------------------------------------------+-- Rendering++-- | A rendering style. Allows us to specify constraints to choose among the+-- many different rendering options.+data Style = Style Int Rat+lineLength :: Style -> Int+lineLength (Style l _) = l+ribbonsPerLine :: Style -> Rat+ribbonsPerLine (Style _ r) = r++type Rat = (Int, Int)++style :: Style+style = Style 100 (3, 2)++-- | Render the @Doc@ to a String using the default @Style@ (see 'style').+render :: Doc -> String+render = renderStyle style++-- | Render the @Doc@ to a String using the given @Style@.+renderStyle :: Style -> Doc -> String+renderStyle s = fullRender (lineLength s) (ribbonsPerLine s) ""++-- | The general rendering interface. Please refer to the @Style@ and @Mode@+-- types for a description of rendering mode, line length and ribbons.+fullRender :: Int -- ^ Line length.+ -> Rat -- ^ Ribbons per line.+ -> String -- ^ What to do at the end.+ -> Doc -- ^ The document.+ -> String -- ^ Result.+fullRender lineLen (num, den) rest doc+ = display lineLen ribbonLen rest doc'+ where+ doc' = best bestLineLen ribbonLen (reduceDoc doc)++ ribbonLen = (lineLen * den) `quot` num+ bestLineLen = lineLen+ +display :: Int -> Int -> String -> Doc -> String+display _page_width _ribbon_width end doc+ = let lay :: Int -> Doc -> String+ lay k (Nest k1 p) = lay (k + k1) p+ lay _ Empty = end+ lay k (NilAbove p) = "\n" ++ lay k p+ lay k (TextBeside s p) = lay1 k s p+ lay _ _ = error "display lay"++ lay1 k s p = let r = k + length s+ in replicate k ' ' ++ (s ++ lay2 r p)++ lay2 :: Int -> Doc -> String+ lay2 k (NilAbove p) = "\n" ++ lay k p+ lay2 k (TextBeside s p) = s ++ lay2 (k + length s) p+ lay2 k (Nest _ p) = lay2 k p+ lay2 _ Empty = end+ lay2 _ _ = error "display lay2"+ in lay 0 doc++best :: Int -- Line length.+ -> Int -- Ribbon length.+ -> RDoc+ -> RDoc -- No unions in here!.+best w0 r = get w0+ where+ get _ Empty = Empty+ get _ NoDoc = NoDoc+ get w (NilAbove p) = nilAbove_ (get w p)+ get w (TextBeside s p) = textBeside_ s (get1 w (length s) p)+ get w (Nest k p) = nest_ k (get (w - k) p)+ get w (p `Union` q) = nicest w r (get w p) (get w q)+ get _ _ = error "best get"++ get1 _ _ Empty = Empty+ get1 _ _ NoDoc = NoDoc+ get1 w sl (NilAbove p) = nilAbove_ (get (w - sl) p)+ get1 w sl (TextBeside s p) = textBeside_ s (get1 w (sl + length s) p)+ get1 w sl (Nest _ p) = get1 w sl p+ get1 w sl (p `Union` q) = nicest1 w r sl (get1 w sl p)+ (get1 w sl q)+ get1 _ _ _ = error "best get1"++nicest :: Int -> Int -> Doc -> Doc -> Doc+nicest w r = nicest1 w r 0++nicest1 :: Int -> Int -> Int -> Doc -> Doc -> Doc+nicest1 w r sl p q | fits (minWR - sl) p = p+ | otherwise = q+ where minWR = if w < r then w else r++fits :: Int -- Space available+ -> Doc+ -> Bool -- True if *first line* of Doc fits in space available+fits n _ | n < 0 = False+fits _ NoDoc = False+fits _ Empty = True+fits _ (NilAbove _) = True+fits n (TextBeside s p) = fits (n - length s) p+fits _ _ = error "fits"
+ lib/Text/Show.hs view
@@ -0,0 +1,41 @@+module Text.Show(module Text.Show) where+import Primitives+import Data.Bool_Type+import Data.Char_Type+import Data.List_Type++type ShowS = String -> String++class Show a where+ showsPrec :: Int -> a -> ShowS+ show :: a -> String+ showList :: [a] -> ShowS++ showsPrec _ x s = show x ++ s+ show x = showsPrec 0 x ""+ showList = showListWith shows++shows :: forall a . Show a => a -> ShowS+shows = showsPrec 0++showChar :: Char -> ShowS+showChar = (:)++showString :: String -> ShowS+showString = (++)++showParen :: Bool -> ShowS -> ShowS+showParen False sh = sh+showParen True sh = \ x -> '(' : sh (')' : x)++showListWith :: forall a . (a -> ShowS) -> [a] -> ShowS+showListWith _ [] s = '[' : ']' : s+showListWith sh (x:xs) s = '[' : sh x (shl xs)+ where+ shl [] = ']' : s+ shl (y:ys) = ',' : sh y (shl ys)++appPrec :: Int+appPrec = 10+appPrec1 :: Int+appPrec1 = 11
+ lib/Text/String.hs view
@@ -0,0 +1,86 @@+-- Copyright 2023 Lennart Augustsson+-- See LICENSE file for full license.+module Text.String(module Text.String) where+import Primitives+import Data.Bool+import Data.Char+import Data.Either+import Data.Eq+import Data.Fractional+import Data.Function+import Data.Int+import Data.Integer+import Data.Integral+import Data.List+import Data.Maybe+import Data.Num+import Data.Ord+import Data.Ratio+import Data.Real+import Data.Tuple+import Text.Show++readInt :: String -> Int+readInt cs =+ let+ rd = foldl (\ a c -> a * (10::Int) + ord c - ord '0') (0::Int)+ in if head cs == '-' then (0::Int) - rd (tail cs) else rd cs++readDouble :: String -> Double+readDouble = primDoubleRead++showListS :: forall a . (a -> String) -> [a] -> String+showListS sa as = showListWith (\ a s -> sa a ++ s) as ""++showPairS :: forall a b . (a -> String) -> (b -> String) -> (a, b) -> String+showPairS sa sb (a, b) = "(" ++ sa a ++ "," ++ sb b ++ ")"++lines :: String -> [String]+lines "" = []+lines s =+ case span (not . (== '\n')) s of+ (l, s') -> case s' of { [] -> [l]; _:s'' -> l : lines s'' }++unlines :: [String] -> String+unlines = concatMap (++ "\n")++words :: String -> [String]+words s =+ case dropWhile isSpace s of+ "" -> []+ s' -> w : words s''+ where (w, s'') = span (not . isSpace) s'++unwords :: [String] -> String+unwords ss = intercalate " " ss++padLeft :: Int -> String -> String+padLeft n s = replicate (n - length s) ' ' ++ s++forceString :: String -> ()+forceString [] = ()+forceString (c:cs) = c `primSeq` forceString cs++-- Convert string in scientific notation to a rational number.+readRational :: String -> Rational+readRational acs@(sgn:as) | sgn == '-' = negate $ rat1 as+ | otherwise = rat1 acs+ where+ rat1 s1 =+ case span isDigit s1 of+ (ds1, cr1) | ('.':r1) <- cr1 -> rat2 f1 r1+ | (c:r1) <- cr1, toLower c == 'e' -> rat3 f1 r1+ | otherwise -> f1+ where f1 = toRational (readInteger ds1)++ rat2 f1 s2 =+ case span isDigit s2 of+ (ds2, cr2) | (c:r2) <- cr2, toLower c == 'e' -> rat3 f2 r2+ | otherwise -> f2+ where f2 = f1 + toRational (readInteger ds2) * 10 ^^ (negate $ length ds2)++ rat3 f2 ('+':s) = f2 * expo s+ rat3 f2 ('-':s) = f2 / expo s+ rat3 f2 s = f2 * expo s++ expo s = 10 ^ readInteger s
+ lib/Unsafe/Coerce.hs view
@@ -0,0 +1,5 @@+module Unsafe.Coerce(module Unsafe.Coerce, Any) where+import Primitives++unsafeCoerce :: forall a b . a -> b+unsafeCoerce = primUnsafeCoerce
+ src/MicroHs/Compile.hs view
@@ -0,0 +1,197 @@+-- Copyright 2023 Lennart Augustsson+-- See LICENSE file for full license.+module MicroHs.Compile(+ compileTop,+ Flags(..), verbose, runIt, output, compileOnly,+ compileCacheTop, getCachedPrelude,+ Cache, emptyCache, deleteFromCache,+ ) where+import Prelude+import System.IO+import Control.DeepSeq+import qualified MicroHs.IdentMap as M+import MicroHs.StateIO+import MicroHs.Desugar+import MicroHs.Exp+import MicroHs.Expr+import MicroHs.Ident+import MicroHs.Parse+import MicroHs.TypeCheck+--Ximport Compat++data Flags = Flags+ Int -- verbosity level+ Bool -- run instead of compile+ [String] -- module search path+ String -- output file+ Bool -- show loading message+ Bool -- separate compilation+ --Xderiving (Show)++type Time = Int++verbose :: Flags -> Int+verbose (Flags x _ _ _ _ _) = x++runIt :: Flags -> Bool+runIt (Flags _ x _ _ _ _) = x++paths :: Flags -> [String]+paths (Flags _ _ x _ _ _) = x++output :: Flags -> String+output (Flags _ _ _ x _ _) = x++loading :: Flags -> Bool+loading (Flags _ _ _ _ x _) = x++compileOnly :: Flags -> Bool+compileOnly (Flags _ _ _ _ _ x) = x++-----------------++type CModule = TModule [LDef]+data Cache = Cache [IdentModule] (M.Map CModule)+ --Xderiving (Show)++--Xinstance NFData Cache where rnf _ = () -- dummy instance++working :: Cache -> [IdentModule]+working (Cache x _) = x++updWorking :: [IdentModule] -> Cache -> Cache+updWorking w (Cache _ m) = Cache w m++cache :: Cache -> M.Map CModule+cache (Cache _ x) = x++emptyCache :: Cache+emptyCache = Cache [] M.empty++deleteFromCache :: Ident -> Cache -> Cache+deleteFromCache mn (Cache is m) = Cache is (M.delete mn m)++-----------------++-- Compile the module with the given name, starting with the given cache.+-- Return the "compiled module" and the resulting cache.+compileCacheTop :: Flags -> IdentModule -> Cache -> IO ([(Ident, Exp)], Cache)+compileCacheTop flags mn ch = do+ (ds, ch') <- compile flags mn ch+ t1 <- getTimeMilli+ let+ dsn = [ (n, compileOpt e) | (n, e) <- ds ]+ () <- return (rnf dsn)+ t2 <- getTimeMilli+ when (verbose flags > 0) $+ putStrLn $ "combinator conversion " ++ padLeft 6 (show (t2-t1)) ++ "ms"+ when (verbose flags > 3) $+ putStrLn $ "combinators:\n" ++ showLDefs dsn+ return (dsn, ch')++getCachedPrelude :: Flags -> IO Cache+getCachedPrelude _ | not usingMhs = return emptyCache+getCachedPrelude flags = do+ mhin <- openFileM "cache/Prelude.comb" ReadMode+ case mhin of+ Nothing -> return emptyCache+ Just hin -> do+-- putStrLn "deserialize cache"+ cach <- hDeserialize hin+ hClose hin+ when (loading flags) $+ putStrLn "loaded cached Prelude"+ return cach++--compileTop :: Flags -> IdentModule -> IO [LDef]+compileTop :: Flags -> Ident -> IO [(Ident, Exp)]+compileTop flags mn = do+ cach <- getCachedPrelude flags+ fst <$> compileCacheTop flags mn cach++compile :: Flags -> IdentModule -> Cache -> IO ([LDef], Cache)+compile flags nm ach = do+ ((_, t), ch) <- runStateIO (compileModuleCached flags nm) ach+ when (verbose flags > 0) $+ putStrLn $ "total import time " ++ padLeft 6 (show t) ++ "ms"+ return (concatMap bindingsOf $ M.elems $ cache ch, ch)++-- Compile a module with the given name.+-- If the module has already been compiled, return the cached result.+compileModuleCached :: Flags -> IdentModule -> StateIO Cache (CModule, Time)+compileModuleCached flags mn = do+ ch <- gets cache+ case M.lookup mn ch of+ Nothing -> do+ ws <- gets working+ when (elem mn ws) $+ error $ "recursive module: " ++ showIdent mn ++ ", import chain: " ++ unwords (map showIdent ws)+ modify $ \ c -> updWorking (mn : working c) c+ when (verbose flags > 0) $+ liftIO $ putStrLn $ "importing " ++ showIdent mn+ (cm, tp, tt, ts) <- compileModule flags mn+ when (verbose flags > 0) $+ liftIO $ putStrLn $ "importing done " ++ showIdent mn ++ ", " ++ show (tp + tt) +++ "ms (" ++ show tp ++ " + " ++ show tt ++ ")"+ when (loading flags && mn /= mkIdent "Interactive") $+ liftIO $ putStrLn $ "loaded " ++ showIdent mn+ c <- get+ put $ Cache (tail (working c)) (M.insert mn cm (cache c))+ return (cm, tp + tt + ts)+ Just cm -> do+ when (verbose flags > 0) $+ liftIO $ putStrLn $ "importing cached " ++ showIdent mn+ return (cm, 0)++-- Find and compile a module with the given name.+-- The times are (parsing, typecheck+desugar, imported modules)+compileModule :: Flags -> IdentModule -> StateIO Cache (CModule, Time, Time, Time)+compileModule flags nm = do+ t1 <- liftIO getTimeMilli+ let+ fn = map (\ c -> if c == '.' then '/' else c) (unIdent nm) ++ ".hs"+ (pathfn, file) <- liftIO (readFilePath (getSLoc nm) (paths flags) fn)+ let mdl@(EModule nmn _ defs) = parseDie pTop pathfn file+ -- liftIO $ putStrLn $ showEModule mdl+ -- liftIO $ putStrLn $ showEDefs defs+ when (nm /= nmn) $+ error $ "module name does not agree with file name: " ++ showIdent nm ++ " " ++ showIdent nmn+ let+ specs = [ s | Import s <- defs ]+ t2 <- liftIO getTimeMilli+ (impMdls, ts) <- fmap unzip $ mapM (compileModuleCached flags) [ m | ImportSpec _ m _ _ <- specs ]+ t3 <- liftIO getTimeMilli+ let+ tmdl = typeCheck (zip specs impMdls) mdl+ when (verbose flags > 2) $+ liftIO $ putStrLn $ "type checked:\n" ++ showTModule showEDefs tmdl ++ "-----\n"+ let+ dmdl = desugar tmdl+ () <- return $ rnf $ bindingsOf dmdl+ t4 <- liftIO getTimeMilli+ when (verbose flags > 3) $+ (liftIO $ putStrLn $ "desugared:\n" ++ showTModule showLDefs dmdl)+ return (dmdl, t2-t1, t4-t3, sum ts)++------------------++readFilePath :: SLoc -> [FilePath] -> FilePath -> IO (FilePath, String)+readFilePath loc path name = do+ mh <- openFilePath path name+ case mh of+ Nothing -> errorMessage loc $ "File not found: " ++ show name ++ "\npath=" ++ show path+ Just (fn, h) -> do+ file <- hGetContents h+ return (fn, file)++openFilePath :: [FilePath] -> FilePath -> IO (Maybe (FilePath, Handle))+openFilePath adirs fileName =+ case adirs of+ [] -> return Nothing+ dir:dirs -> do+ let+ path = dir ++ "/" ++ fileName+ mh <- openFileM path ReadMode+ case mh of+ Nothing -> openFilePath dirs fileName -- If opening failed, try the next directory+ Just hdl -> return (Just (path, hdl))
+ src/MicroHs/Desugar.hs view
@@ -0,0 +1,556 @@+-- Copyright 2023 Lennart Augustsson+-- See LICENSE file for full license.+{-# OPTIONS_GHC -Wno-incomplete-uni-patterns -Wno-unused-imports -Wno-dodgy-imports #-}+module MicroHs.Desugar(+ desugar,+ LDef, showLDefs,+ encodeInteger,+ ) where+import Prelude+import Data.Char+import Data.Function+import Data.List+import Data.Maybe+import Data.Ratio+import Control.Monad.State.Strict as S --Xhiding(ap)+--Ximport Control.Monad as S hiding(ap)+--Ximport Compat+--Ximport GHC.Stack+import Debug.Trace++import MicroHs.Expr+import MicroHs.Exp+import MicroHs.Graph+import MicroHs.Ident+import MicroHs.TypeCheck++type LDef = (Ident, Exp)++desugar :: TModule [EDef] -> TModule [LDef]+desugar atm =+ case atm of+ TModule mn fxs tys syns clss insts vals ds ->+ TModule mn fxs tys syns clss insts vals $ map lazier $ checkDup $ concatMap (dsDef mn) ds++dsDef :: IdentModule -> EDef -> [LDef]+dsDef mn adef =+ case adef of+ Data _ cs ->+ let+ f i = mkIdent ("$f" ++ show i)+ fs = [f i | (i, _) <- zip [0::Int ..] cs]+ dsConstr i (Constr _ ctx c ets) =+ let+ ss = (if null ctx then [] else [False]) +++ map fst (either id (map snd) ets) -- strict flags+ xs = [mkIdent ("$x" ++ show j) | (j, _) <- zip [0::Int ..] ss]+ strict (False:ys) (_:is) e = strict ys is e+ strict (True:ys) (x:is) e = App (App (Lit (LPrim "seq")) (Var x)) (strict ys is e)+ strict _ _ e = e+ in (qualIdent mn c, lams xs $ strict ss xs $ lams fs $ apps (Var (f i)) (map Var xs))+ in zipWith dsConstr [0::Int ..] cs+ Newtype _ (Constr _ _ c _) -> [ (qualIdent mn c, Lit (LPrim "I")) ]+ Type _ _ -> []+ Fcn f eqns -> [(f, dsEqns (getSLoc f) eqns)]+ Sign _ _ -> []+ Import _ -> []+ ForImp ie i _ -> [(i, Lit $ LForImp ie)]+ Infix _ _ -> []+ Class ctx (c, _) _ bs ->+ let f = mkIdent "$f"+ meths :: [Ident]+ meths = [ qualIdent mn i | (BSign i _) <- bs ]+ supers :: [Ident]+ supers = [ qualIdent mn $ mkSuperSel c i | i <- [1 .. length ctx] ]+ xs = [ mkIdent ("$x" ++ show j) | j <- [ 1 .. length ctx + length meths ] ]+ in (qualIdent mn $ mkClassConstructor c, lams xs $ Lam f $ apps (Var f) (map Var xs)) :+ zipWith (\ i x -> (expectQualified i, Lam f $ App (Var f) (lams xs $ Var x))) (supers ++ meths) xs+ Instance _ _ _ _ -> []+ Default _ -> []++oneAlt :: Expr -> EAlts+oneAlt e = EAlts [([], e)] []++dsBind :: Ident -> EBind -> [LDef]+dsBind v abind =+ case abind of+ BFcn f eqns -> [(f, dsEqns (getSLoc f) eqns)]+ BPat p e ->+ let+ de = (v, dsExpr e)+ ds = [ (i, dsExpr (ECase (EVar v) [(p, oneAlt $ EVar i)])) | i <- patVars p ]+ in de : ds+ BSign _ _ -> []++dsEqns :: SLoc -> [Eqn] -> Exp+dsEqns loc eqns =+ case eqns of+ Eqn aps _ : _ ->+ let+ vs = allVarsBind $ BFcn (mkIdent "") eqns+ xs = take (length aps) $ newVars "$q" vs+ mkArm (Eqn ps alts) =+ let ps' = map dsPat ps+ in (ps', dsAlts alts, hasGuards alts || any hasLit ps')+ ex = runS loc (vs ++ xs) (map Var xs) (map mkArm eqns)+ in foldr Lam ex xs+ _ -> impossible++hasGuards :: EAlts -> Bool+hasGuards (EAlts [([], _)] _) = False+hasGuards _ = True++hasLit :: EPat -> Bool+hasLit (ELit _ _) = True+hasLit (EVar _) = False+hasLit (ECon _) = False+hasLit (EApp f a) = hasLit f || hasLit a+hasLit (EAt _ p) = hasLit p+hasLit _ = impossible++dsAlts :: EAlts -> (Exp -> Exp)+dsAlts (EAlts alts bs) = dsBinds bs . dsAltsL alts++dsAltsL :: [EAlt] -> (Exp -> Exp)+dsAltsL [] dflt = dflt+dsAltsL [([], e)] _ = dsExpr e -- fast special case+dsAltsL ((ss, rhs) : alts) dflt =+ let+ erest = dsAltsL alts dflt+ x = newVar (allVarsExp erest)+ in eLet x erest (dsExpr $ dsAlt (EVar x) ss rhs)++dsAlt :: Expr -> [EStmt] -> Expr -> Expr+dsAlt _ [] rhs = rhs+dsAlt dflt (SBind p e : ss) rhs = ECase e [(p, EAlts [(ss, rhs)] []), (EVar dummyIdent, oneAlt dflt)]+dsAlt dflt (SThen (EVar i) : ss) rhs | isIdent "Data.Bool.otherwise" i = dsAlt dflt ss rhs+dsAlt dflt (SThen e : ss) rhs = EIf e (dsAlt dflt ss rhs) dflt+dsAlt dflt (SLet bs : ss) rhs = ELet bs (dsAlt dflt ss rhs)++dsBinds :: [EBind] -> Exp -> Exp+dsBinds [] ret = ret+dsBinds ads ret =+ let+ avs = concatMap allVarsBind ads+ pvs = newVars "$p" avs+ mvs = newVars "$m" avs+ ds = concat $ zipWith dsBind pvs ads+ node ie@(i, e) = (ie, i, freeVars e)+ gr = map node $ checkDup ds+ asccs = stronglyConnComp (<=) gr+ loop _ [] = ret+ loop vs (AcyclicSCC (i, e) : sccs) =+ letE i e $ loop vs sccs+ loop vs (CyclicSCC [(i, e)] : sccs) =+ letRecE i e $ loop vs sccs+ loop vvs (CyclicSCC ies : sccs) =+ let (v:vs) = vvs+ in mutualRec v ies (loop vs sccs)+ in loop mvs asccs++letE :: Ident -> Exp -> Exp -> Exp+letE i e b = eLet i e b -- do some minor optimizations+ --App (Lam i b) e++letRecE :: Ident -> Exp -> Exp -> Exp+letRecE i e b = letE i (App (Lit (LPrim "Y")) (Lam i e)) b++-- Do mutual recursion by tupling up all the definitions.+-- let f = ... g ...+-- g = ... f ...+-- in body+-- turns into+-- letrec v =+-- let f = sel_0_2 v+-- g = sel_1_2 v+-- in (... g ..., ... f ...)+-- in+-- let f = sel_0_2 v+-- g = sel_1_2 v+-- in body+mutualRec :: Ident -> [LDef] -> Exp -> Exp+mutualRec v ies body =+ let (is, es) = unzip ies+ n = length is+ ev = Var v+ one m i = letE i (mkTupleSelE m n ev)+ bnds = foldr (.) id $ zipWith one [0..] is+ in letRecE v (bnds $ mkTupleE es) $+ bnds body++encodeInteger :: Integer -> Exp+encodeInteger i | toInteger (minBound::Int) <= i && i < toInteger (maxBound::Int) =+-- trace ("*** small integer " ++ show i) $+ App (Var (mkIdent "Data.Integer_Type._intToInteger")) (Lit (LInt (_integerToInt i)))+ | otherwise =+-- trace ("*** large integer " ++ show i) $+ App (Var (mkIdent "Data.Integer._intListToInteger")) (encodeList (map (Lit . LInt) (_integerToIntList i)))++encodeRational :: Rational -> Exp+encodeRational r =+ App (App (Var (mkIdent "Data.Ratio_Type._mkRational")) (encodeInteger (numerator r))) (encodeInteger (denominator r))++dsExpr :: Expr -> Exp+dsExpr aexpr =+ case aexpr of+ EVar i -> Var i+ EApp f a -> App (dsExpr f) (dsExpr a)+ ELam qs -> dsEqns (getSLoc aexpr) qs+ ELit _ (LChar c) -> Lit (LInt (ord c))+ ELit _ (LInteger i) -> encodeInteger i+ ELit _ (LRat i) -> encodeRational i+ ELit _ l -> Lit l+ ECase e as -> dsCase (getSLoc aexpr) e as+ ELet ads e -> dsBinds ads (dsExpr e)+ ETuple es -> Lam (mkIdent "$f") $ foldl App (Var $ mkIdent "$f") $ map dsExpr es+ EIf e1 e2 e3 ->+ app2 (dsExpr e1) (dsExpr e3) (dsExpr e2)+ EListish (LList es) -> encodeList $ map dsExpr es+ EListish (LCompr e astmts) ->+ case astmts of+ [] -> dsExpr (EListish (LList [e]))+ stmt : stmts ->+ case stmt of+ SBind p b ->+ let+ nv = newVar (allVarsExpr aexpr)+ body = ECase (EVar nv) [(p, oneAlt $ EListish (LCompr e stmts)), (EVar dummyIdent, oneAlt $ EListish (LList []))]+ in app2 (Var (mkIdent "Data.List.concatMap")) (dsExpr (eLam [EVar nv] body)) (dsExpr b)+ SThen c ->+ dsExpr (EIf c (EListish (LCompr e stmts)) (EListish (LList [])))+ SLet ds ->+ dsExpr (ELet ds (EListish (LCompr e stmts)))+ ECon c ->+ let+ ci = conIdent c+ in+ case getTupleConstr ci of+ Just n ->+ let+ xs = [mkIdent ("x" ++ show i) | i <- [1 .. n] ]+ body = mkTupleE $ map Var xs+ in foldr Lam body xs+ Nothing -> Var (conIdent c)+ _ -> impossible++-- Use tuple encoding to make a tuple+mkTupleE :: [Exp] -> Exp+mkTupleE = Lam (mkIdent "$f") . foldl App (Var (mkIdent "$f"))++-- Select component m from an n-tuple+mkTupleSelE :: Int -> Int -> Exp -> Exp+mkTupleSelE m n tup =+ let+ xs = [mkIdent ("x" ++ show i) | i <- [1 .. n] ]+ in App tup (foldr Lam (Var (xs !! m)) xs)++-- Handle special syntax for lists and tuples+dsPat :: --XHasCallStack =>+ EPat -> EPat+dsPat ap =+ case ap of+ EVar _ -> ap+ ECon _ -> ap+ EApp f a -> EApp (dsPat f) (dsPat a)+ EListish (LList ps) -> dsPat $ foldr (\ x xs -> EApp (EApp consCon x) xs) nilCon ps+ ETuple ps -> dsPat $ foldl EApp (tupleCon (getSLoc ap) (length ps)) ps+ EAt i p -> EAt i (dsPat p)+ ELit loc (LStr cs) | length cs < 2 -> dsPat (EListish (LList (map (ELit loc . LChar) cs)))+ ELit _ _ -> ap+ _ -> impossible++iNil :: Ident+iNil = mkIdent $ listPrefix ++ "[]"++iCons :: Ident+iCons = mkIdent $ listPrefix ++ ":"++consCon :: EPat+consCon = ECon $ ConData [(iNil, 0), (iCons, 2)] iCons++nilCon :: EPat+nilCon = ECon $ ConData [(iNil, 0), (iCons, 2)] iNil++tupleCon :: SLoc -> Int -> EPat+tupleCon loc n =+ let+ c = tupleConstr loc n+ in ECon $ ConData [(c, n)] c++lams :: [Ident] -> Exp -> Exp+lams xs e = foldr Lam e xs++apps :: Exp -> [Exp] -> Exp+apps f = foldl App f++newVars :: String -> [Ident] -> [Ident]+newVars s is = deleteAllsBy (==) [ mkIdent (s ++ show i) | i <- [1::Int ..] ] is++newVar :: [Ident] -> Ident+newVar = head . newVars "$q"++showLDefs :: [LDef] -> String+showLDefs = unlines . map showLDef++showLDef :: LDef -> String+showLDef a =+ case a of+ (i, e) -> showIdent i ++ " = " ++ show e++----------------++dsCase :: SLoc -> Expr -> [ECaseArm] -> Exp+dsCase loc ae as =+ runS loc (allVarsExpr (ECase ae as)) [dsExpr ae] (map mkArm as)+ where+ mkArm (p, alts) =+ let p' = dsPat p+ in ([p'], dsAlts alts, hasGuards alts || hasLit p')++type MState = [Ident] -- supply of unused variables.++type M a = State MState a+type Arm = ([EPat], Exp -> Exp, Bool) -- boolean indicates that the arm has guards+type Matrix = [Arm]++--showArm :: Arm -> String+--showArm (ps, _, b) = showListS showExpr ps ++ "," ++ show b++newIdents :: Int -> M [Ident]+newIdents n = do+ is <- get+ put (drop n is)+ return (take n is)++newIdent :: M Ident+newIdent = do+ is <- get+ put (tail is)+ return (head is)++runS :: SLoc -> [Ident] -> [Exp] -> Matrix -> Exp+runS loc used ss mtrx =+ let+ supply = newVars "$x" used+ ds xs aes =+ case aes of+ [] -> dsMatrix (eMatchErr loc) (reverse xs) mtrx+ e:es -> letBind (return e) $ \ x -> ds (x:xs) es+ in evalState (ds [] ss) supply++data SPat = SPat Con [Ident] -- simple pattern+ --Xderiving(Show, Eq)++-- Desugar a pattern matrix.+-- The input is a (usually identifier) vector e1, ..., en+-- and patterns matrix p11, ..., p1n -> e1+-- p21, ..., p2n+-- pm1, ..., pmn -> em+-- Note that the RHSs are of type Exp.+dsMatrix :: --XHasCallStack =>+ Exp -> [Exp] -> Matrix -> M Exp+dsMatrix dflt iis aarms =+ if null aarms then+ return dflt+ else+ case iis of+ [] -> let { (_, f, _) : _ = aarms } in return $ f dflt+ i:is -> do+ let+ (arms, darms, rarms) = splitArms aarms+ ndarms = map (\ (EVar x : ps, ed, g) -> (ps, substAlpha x i . ed, g) ) darms+-- traceM ("split " ++ show (arms, darms, rarms))+ letBind (dsMatrix dflt iis rarms) $ \ drest ->+ letBind (dsMatrix drest is ndarms) $ \ ndflt ->+ if null arms then+ return ndflt+ else do+ let+ idOf (p:_, _, _) = pConOf p+ idOf _ = impossible+ grps = groupEq (on (==) idOf) arms+ oneGroup grp = do+ let+ (pat:_, _, _) : _ = grp+ con = pConOf pat+ xs <- newIdents (conArity con)+ let+ one arg =+ case arg of+ (p : ps, e, g) ->+ case p of+ EAt a pp -> one (pp:ps, substAlpha a i . e, g)+ _ -> (pArgs p ++ ps, e, g)+ _ -> impossible+ cexp <- dsMatrix ndflt (map Var xs ++ is) (map one grp)+ return (SPat con xs, cexp)+-- traceM $ "grps " ++ show grps+ narms <- mapM oneGroup grps+ return $ mkCase i narms ndflt++eMatchErr :: SLoc -> Exp+eMatchErr (SLoc fn l c) =+ App (App (App (Lit (LPrim "noMatch")) (Lit (LStr fn))) (Lit (LInt l))) (Lit (LInt c))++-- If the first expression isn't a variable/literal, then use+-- a let binding and pass variable to f.+letBind :: M Exp -> (Exp -> M Exp) -> M Exp+letBind me f = do+ e <- me+ if cheap e then+ f e+ else do+ x <- newIdent+ r <- f (Var x)+ return $ eLet x e r++cheap :: Exp -> Bool+cheap ae =+ case ae of+ Var _ -> True+ Lit _ -> True+ _ -> False++eEqInt :: Exp+eEqInt = Lit (LPrim "==")++eEqChar :: Exp+eEqChar = Lit (LPrim "==")++eEqStr :: Exp+eEqStr = Lit (LPrim "equal")++mkCase :: Exp -> [(SPat, Exp)] -> Exp -> Exp+mkCase var pes dflt =+ --trace ("mkCase " ++ show pes) $+ case pes of+ [] -> dflt+ [(SPat (ConNew _) [x], arhs)] -> eLet x var arhs+ (SPat (ConLit _ l) _, arhs) : rpes -> + let+ cond =+ case l of+ LInt _ -> app2 eEqInt var (Lit l)+ LChar c -> app2 eEqChar var (Lit (LInt (ord c)))+ LStr _ -> app2 eEqStr var (Lit l)+ _ -> impossible+ in app2 cond (mkCase var rpes dflt) arhs+ (SPat (ConData cs _) _, _) : _ ->+ let+ arm ck =+ let+ (c, k) = ck+ (vs, rhs) = head $ [ (xs, e) | (SPat (ConData _ i) xs, e) <- pes, c == i ] +++ [ (replicate k dummyIdent, dflt) ]+ in (SPat (ConData cs c) vs, rhs)+ in eCase var (map arm cs)+ _ -> impossible++eCase :: Exp -> [(SPat, Exp)] -> Exp+eCase e as =+-- trace ("eCase " ++ show e ++ "\n" +++-- unlines [ unwords (map showIdent (conIdent c : xs)) ++ " -> " ++ show r | (SPat c xs, r) <- as ]) $+ apps e [lams xs r | (SPat _ xs, r) <- as ]++-- Split the matrix into segments so each first column has initially patterns -- followed by variables, followed by the rest.+splitArms :: Matrix -> (Matrix, Matrix, Matrix)+splitArms am =+ let+ isConPat (p:_, _, _) = not (isPVar p)+ isConPat _ = impossible+ (ps, nps) = span isConPat am+ loop xs [] = (reverse xs, [])+ loop xs pps@(pg@(p:_, _, g) : rps) | not (isPVar p) = (reverse xs, pps)+ | otherwise = if g then (reverse (pg:xs), rps)+ else loop (pg:xs) rps+ loop _ _ = impossible+ (ds, rs) = loop [] nps+ in (ps, ds, rs)++-- Change from x to y inside e.+substAlpha :: Ident -> Exp -> Exp -> Exp+substAlpha x y e =+ if x == dummyIdent then+ e+ else+ substExp x y e++eLet :: Ident -> Exp -> Exp -> Exp+eLet i e b =+ if i == dummyIdent then+ b+ else+ case b of+ Var j | i == j -> e+ _ ->+ case filter (== i) (freeVars b) of+ [] -> b -- no occurences, no need to bind+ [_] -> substExp i e b -- single occurrence, substitute XXX could be worse if under lambda+ _ -> App (Lam i b) e -- just use a beta redex++pConOf :: --XHasCallStack =>+ EPat -> Con+pConOf ap =+ case ap of+ ECon c -> c+ EAt _ p -> pConOf p+ EApp p _ -> pConOf p+ ELit loc l -> ConLit loc l+ EVar _ -> undefined+ _ -> impossibleShow ap++pArgs :: EPat -> [EPat]+pArgs ap =+ case ap of+ ECon _ -> []+ EApp f a -> pArgs f ++ [a]+ ELit _ _ -> []+ _ -> impossible++-- XXX quadratic+groupEq :: forall a . (a -> a -> Bool) -> [a] -> [[a]]+groupEq eq axs =+ case axs of+ [] -> []+ x:xs ->+ case partition (eq x) xs of+ (es, ns) -> (x:es) : groupEq eq ns++getDups :: forall a . (a -> a -> Bool) -> [a] -> [[a]]+getDups eq = filter ((> 1) . length) . groupEq eq++checkDup :: [LDef] -> [LDef]+checkDup ds =+ case getDups (==) (filter (/= dummyIdent) $ map fst ds) of+ [] -> ds+ (i1:_i2:_) : _ ->+ errorMessage (getSLoc i1) $ "duplicate definition " ++ showIdent i1+ -- XXX mysteriously the location for i2 is the same as i1+ -- ++ ", also at " ++ showSLoc (getSLoc i2)+ _ -> error "checkDup"++-- Make recursive definitions lazier.+-- The idea is that we have+-- f x y = ... (f x) ...+-- we turn this into+-- f x = letrec f' y = ... f' ... in f'+-- thus avoiding the extra argument passing.+-- XXX should generalize for an arbitrary length prefix of variables.+-- This gives a small speedup with overloading.+lazier :: LDef -> LDef+lazier def@(fcn, Lam x (Lam y body)) =+ let fcn' = addIdentSuffix fcn "@"+ vfcn' = Var fcn'+ repl :: Exp -> State Bool Exp+ repl (Lam i e) = Lam i <$> repl e+ repl (App (Var af) (Var ax)) | af == fcn && ax == x = do+ put True+ return vfcn'+ repl (App f a) = App <$> repl f <*> repl a+ repl e@(Var _) = return e+ repl e@(Lit _) = return e+ in case runState (repl body) False of+ (_, False) -> def+ (e', True) -> (fcn, Lam x $ letRecE fcn' (Lam y e') vfcn')++lazier def = def
+ src/MicroHs/Exp.hs view
@@ -0,0 +1,543 @@+{-# OPTIONS_GHC -Wno-unused-imports #-}+{-# LANGUAGE PatternSynonyms #-}+-- Copyright 2023 Lennart Augustsson+-- See LICENSE file for full license.+module MicroHs.Exp(+ compileOpt,+-- compileOptX,+ substExp,+ Exp(..), toStringP,+ PrimOp,+ encodeString,+ app2, cCons, cNil, cFlip,+ allVarsExp, freeVars,+ encodeList,+ ) where+import Prelude --Xhiding((<>))+import Data.Char+import Data.List+import MicroHs.Ident+import MicroHs.Expr(Lit(..), showLit)+import Text.PrettyPrint.HughesPJ+--Ximport Control.DeepSeq+--Ximport Compat+import Debug.Trace++type PrimOp = String++--+-- Used combinators+-- * indicates that the implementation uses an indirection+-- A indicates allocation in the implementation+-- S x y z = x z (y z) A+-- K x y = x *+-- I x = x *+-- B x y z = x (y z) A+-- C x y z = x z y A+-- S' x y z w = x (y w) (z w) A+-- B' x y z w = x y (z w) A+-- C' x y z w = x (y w) z A+-- A x y = y *+-- T x y = y x+-- n@(Y x) = x n+-- Z x y z = x y+-- P x y z = z x y A+-- R x y z = y z x A+-- O x y z w = w x y A+--++data Exp+ = Var Ident+ | App Exp Exp+ | Lam Ident Exp+ | Lit Lit++--Xinstance NFData Exp where rnf (Var i) = rnf i; rnf (App f a) = rnf f `seq` rnf a; rnf (Lam i e) = rnf i `seq` rnf e; rnf (Lit l) = rnf l++instance Eq Exp where+ (==) (Var i1) (Var i2) = i1 == i2+ (==) (App f1 a1) (App f2 a2) = f1 == f2 && a1 == a2+ (==) (Lam i1 e1) (Lam i2 e2) = i1 == i2 && e1 == e2+ (==) (Lit l1) (Lit l2) = l1 == l2+ (==) _ _ = False++data MaybeApp = NotApp | IsApp Exp Exp++getApp :: Exp -> MaybeApp+getApp ae =+ case ae of+ App f a -> IsApp f a+ _ -> NotApp++isPrim :: String -> Exp -> Bool+isPrim s ae =+ case ae of+ Lit (LPrim ss) -> s == ss+ _ -> False++isK :: Exp -> Bool+isK = isPrim "K"++isI :: Exp -> Bool+isI = isPrim "I"++isB :: Exp -> Bool+isB = isPrim "B"++isC :: Exp -> Bool+isC = isPrim "C"++isY :: Exp -> Bool+isY = isPrim "Y"++isP :: Exp -> Bool+isP = isPrim "P"++app2 :: Exp -> Exp -> Exp -> Exp+app2 f a1 a2 = App (App f a1) a2++app3 :: Exp -> Exp -> Exp -> Exp -> Exp+app3 f a1 a2 a3 = App (app2 f a1 a2) a3++cCons :: Exp+cCons = Lit (LPrim "O")++cNil :: Exp+cNil = Lit (LPrim "K")++cFlip :: Exp+cFlip = Lit (LPrim "C")++cId :: Exp+cId = Lit (LPrim "I")++cConst :: Exp+cConst = Lit (LPrim "K")++cSpread :: Exp+cSpread = Lit (LPrim "S")++cP :: Exp+cP = Lit (LPrim "P")++--cR :: Exp+--cR = Lit (LPrim "R")++-- Avoid quadratic concatenation by using difference lists,+-- turning concatenation into function composition.+toStringP :: Exp -> (String -> String)+toStringP ae =+ case ae of+ Var x -> (showIdent x ++)+ Lit (LStr s) ->+ -- Encode very short string directly as combinators.+ if length s > 1 then+ (quoteString s ++)+ else+ toStringP (encodeString s)+ Lit (LInteger _) -> undefined+ Lit (LRat _) -> undefined+ Lit l -> (showLit l ++)+ Lam x e -> (("(\\" ++ showIdent x ++ " ") ++) . toStringP e . (")" ++)+ App f a -> ("(" ++) . toStringP f . (" " ++) . toStringP a . (")" ++)++quoteString :: String -> String+quoteString s =+ let+ achar c =+ if c == '"' || c == '\\' || c < ' ' || c > '~' then+ '\\' : show (ord c) ++ ['&']+ else+ [c]+ in '"' : concatMap achar s ++ ['"']++encodeString :: String -> Exp+encodeString = encodeList . map (Lit . LInt . ord)++encodeList :: [Exp] -> Exp+encodeList = foldr (app2 cCons) cNil++compileOpt :: Exp -> Exp+compileOpt = improveT . compileExp++compileExp :: Exp -> Exp+compileExp ae =+ case ae of+ App f a -> App (compileExp f) (compileExp a)+ Lam x a -> abstract x a+ _ -> ae++abstract :: Ident -> Exp -> Exp+abstract x ae =+ case ae of+ Var y -> if x == y then cId else cK (Var y)+ App f a -> cS (abstract x f) (abstract x a)+ Lam y e -> abstract x $ abstract y e+ Lit _ -> cK ae++cK :: Exp -> Exp+cK e = App cConst e++cS :: Exp -> Exp -> Exp+cS a1 a2 =+ if isK a1 then cId else+ let+ r = cS2 a1 a2+ in+ case getApp a1 of+ NotApp -> r+ IsApp k1 e1 ->+ if isK k1 then+ case getApp a2 of+ IsApp k2 e2 ->+ if isK k2 then+ cK (App e1 e2)+ else+ cB e1 a2+ NotApp ->+ if isI a2 then+ e1+ else+ cB e1 a2+ else+ r+cS2 :: Exp -> Exp -> Exp+cS2 a1 a2 =+ case getApp a2 of+ NotApp -> cS3 a1 a2+ IsApp k2 e2 ->+ if isK k2 then+ cC a1 e2+ else+ cS3 a1 a2++cS3 :: Exp -> Exp -> Exp+cS3 a1 a2 =+ let+ r = app2 cSpread a1 a2+ in+ case getApp a1 of+ NotApp -> r+ IsApp be1 e2 ->+ case getApp be1 of+ NotApp -> r+ IsApp b1 e1 ->+ if isB b1 then+ cSS e1 e2 a2+ else+ r++{-+--cS e1 e2 | trace ("S (" ++ toString e1 ++ ") (" ++ toString e2 ++ ")") False = undefined+cS CK _ = CI -- S K e = I+cS (App CK e1) (App CK e2) = cK (App e1 e2) -- S (K e1) (K e2) = K (e1 e2)+cS (App CK e1) CI = e1 -- S (K e1) I = e1+cS (App CK e1) e2 = cB e1 e2 -- S (K e1) e2 = B e1 e2+cS e1 (App CK e2) = cC e1 e2 -- S e1 (K e2) = C e1 e2+cS (App (App CB e1) e2) e3 = cSS e1 e2 e3 -- S (B e1 e2) e3 = S' e1 e2 e3+cS e1 e2 = App2 CS e1 e2+-}++cC :: Exp -> Exp -> Exp+cC a1 e3 =+ let+ r = cC2 a1 e3+ in+ case getApp a1 of+ NotApp -> r+ IsApp x1 e2 ->+ case getApp x1 of+ NotApp -> r+ IsApp bc e1 ->+ if isB bc then+ cCC e1 e2 e3+ else if isC bc && isI e1 then+ app2 cP e2 e3+-- else if isC bc && isC e1 then+-- app2 cR e2 e3+ else+ r++cC2 :: Exp -> Exp -> Exp+cC2 a1 a2 = app2 cFlip a1 a2++{-+cC (App (App CB e1) e2) e3 = cCC e1 e2 e3 -- C (B e1 e2) e3 = C' e1 e2 e3+cC (Var op) e2 | Just op' <- lookup op flipOps = App (Var op') e2 -- C op e = flip-op e+cC (App (App CC CI) e2) e3 = app2 CP e2 e3+cC (App (App CC CC) e2) e3 = app2 CR e2 e3+cC e1 e2 = app2 CC e1 e2+-}++cB :: Exp -> Exp -> Exp+cB a1 a2 =+ let+ r = cB2 a1 a2+ in+ case getApp a1 of+ NotApp -> r+ IsApp cb ck ->+ if isB cb && isK ck && isP a2 then+ Lit (LPrim "O")+ else+ r++cB2 :: Exp -> Exp -> Exp+cB2 a1 a2 =+ let+ r = cB3 a1 a2+ in+ case getApp a2 of+ IsApp x1 x2 ->+ case getApp x1 of+ IsApp cb ck ->+ if isY a1 && isB cb && isK ck then+ x2+ else+ r+ NotApp ->+ if isC a1 && isC x1 && isI x2 then+ cP+ else+ r+ NotApp -> r++cB3 :: Exp -> Exp -> Exp+cB3 a1 a2 =+ if isI a1 then+ a2+ else+ app2 (Lit (LPrim "B")) a1 a2++{-+cB (App CB CK) CP = CO -- Cons+cB CY (App (App CB CK) e) = e -- B Y (B K e) = e+cB CC (App CC CI) = CP -- Pair+cB CI e = e -- B I e = e+cB e1 e2 = app2 CB e1 e2+-}++cSS :: Exp -> Exp -> Exp -> Exp+cSS e1 e2 e3 = app3 (Lit (LPrim "S'")) e1 e2 e3++cCC :: Exp -> Exp -> Exp -> Exp+cCC e1 e2 e3 = app3 (Lit (LPrim "C'")) e1 e2 e3++improveT :: Exp -> Exp+improveT ae =+ case getApp ae of+ NotApp -> ae+ IsApp f a ->+ let+ ff = improveT f+ aa = improveT a+ in+ if isK ff && isI aa then+ Lit (LPrim "A")+{- Using I x --> x does not improve things.+ else if isI ff then+ aa+-}+ else if isB ff && isK aa then+ Lit (LPrim "Z")+ else if isC ff && isI aa then+ Lit (LPrim "U")+ else if isB ff && isB aa then+ Lit (LPrim "B'")+ else if isC ff && isC aa then+ Lit (LPrim "R")+ else+ let+ def =+ case getApp aa of+ IsApp ck e ->+ if isY ff && isK ck then+ e+ else+ App ff aa+ NotApp -> App ff aa+ in+ def+{-+ case getApp ff of+ IsApp xf xa ->+ if isK xf then+ xa+ else+ def+ NotApp -> def+-}+ +{-+-- K I --> A+-- C I --> T+-- B B --> B'+-- Y (K e) --> e+-- K x y --> x+improveT (App f a) =+ case (improveT f, improveT a) of+ (CK, CI) -> CA+-- (CI, e) -> e+ (CY, App CK e) -> e+-- (App CK e1, e2) -> e1+ (e1, e2) -> App e1 e2+improveT e = e+-}++instance Show Exp where+ show = render . ppExp++ppExp :: Exp -> Doc+ppExp ae =+ case ae of+-- Let i e b -> sep [ text "let" <+> ppIdent i <+> text "=" <+> ppExp e, text "in" <+> ppExp b ]+ Var i -> ppIdent i+ App f a -> parens $ ppExp f <+> ppExp a+ Lam i e -> parens $ text "\\" <> ppIdent i <> text "." <+> ppExp e+ Lit l -> text (showLit l)++substExp :: Ident -> Exp -> Exp -> Exp+substExp si se ae =+ case ae of+ Var i -> if i == si then se else ae+ App f a -> App (substExp si se f) (substExp si se a)+ Lam i e -> if si == i then+ ae+ else if elem i (freeVars se) then+ let+ fe = allVarsExp e+ ase = allVarsExp se+ j = head [ v | n <- enumFrom (0::Int), let { v = mkIdent ("a" ++ show n) }, not (elem v ase), not (elem v fe) ]+ in+ --trace ("substExp " ++ unwords [si, i, j]) $+ Lam j (substExp si se (substExp i (Var j) e))+ else+ Lam i (substExp si se e)+ Lit _ -> ae++freeVars :: Exp -> [Ident]+freeVars ae =+ case ae of+ Var i -> [i]+ App f a -> freeVars f ++ freeVars a+ Lam i e -> deleteAllBy (==) i (freeVars e)+ Lit _ -> []++allVarsExp :: Exp -> [Ident]+allVarsExp ae =+ case ae of+ Var i -> [i]+ App f a -> allVarsExp f ++ allVarsExp a+ Lam i e -> i : allVarsExp e+ Lit _ -> []++--------+-- Possible additions+--+-- Added:+-- R = C C+-- R x y z = (C C x y) z = C y x z = y z x+--+-- Q = C I+-- Q x y z = (C I x y) z = I y x z = y x z+--+-- Added:+-- Z = B K+-- Z x y z = B K x y z = K (x y) z = x y+--+-- ZK = Z K+-- ZK x y z = Z K x y z = (K x) z = x+--+-- C'B = C' B+-- C'B x y z w = C' B x y z w = B (x z) y w = x z (y w)++-- B (B e) x y z = B e (x y) z = e (x y z)+--+-- B' :: (a -> b -> c) -> a -> (d -> b) -> d -> c+-- B' k f g x = k f (g x)+--+-- Common:+-- 817: C' B+-- 616: B Z+-- 531: C' C+-- 352: Z K+-- 305: C' S+--+-- BZ = B Z+-- BZ x y z w = B Z x y z w = Z (x y) z w = x y z+--+-- C'C = C' C+-- C'C x y z w = C' C x y z w = C (x z) y w = x z w y+++---------------------------------------------------------------++{-+-- Oleg's abstraction algorithm++data Peano = S Peano | Z+ --Xderiving (Show)+data DB = N Peano | L DB | A DB DB | Free Ident | K Lit+ --Xderiving (Show)++index :: Ident -> [Ident] -> Maybe Peano+index x xs = lookupBy eqIdent x $ zip xs $ iterate S Z++deBruijn :: Exp -> DB+deBruijn = go [] where+ go binds e =+ case e of+ Var x -> maybe (Free x) N $ index x binds+ App t u -> A (go binds t) (go binds u)+ Lam x t -> L $ go (x:binds) t+ Lit l -> K l++type CL = Exp+type BCL = ([Bool], CL)++com :: String -> Exp+com s = Lit (LPrim s)+(@@) :: Exp -> Exp -> Exp+(@@) f a = App f a++convertBool :: (BCL -> BCL -> CL) -> DB -> BCL+convertBool (#) ee =+ case ee of+ N Z -> (True:[], com "I")+ N (S e) -> (False:g, d) where (g, d) = rec $ N e+ L e -> case rec e of+ ([], d) -> ([], com "K" @@ d)+ (False:g, d) -> (g, ([], com "K") # (g, d))+ (True:g, d) -> (g, d)+ A e1 e2 -> (zipWithDefault False (||) g1 g2, t1 # t2) where+ t1@(g1, _) = rec e1+ t2@(g2, _) = rec e2+ Free s -> ([], Var s)+ K l -> ([], Lit l)+ where rec = convertBool (#)++optEta :: DB -> BCL+optEta = convertBool (#) where+ (#) ([], d1) {- # -} ([], d2) = d1 @@ d2+ (#) ([], d1) {- # -} (True:[], Lit (LPrim "I")) = d1+ (#) ([], d1) {- # -} (True:g2, d2) = ([], com "B" @@ d1) # (g2, d2)+ (#) ([], d1) {- # -} (False:g2, d2) = ([], d1) # (g2, d2)+ (#) (True:[], Lit (LPrim "I")) {- # -} ([], d2) = com "U" @@ d2+ (#) (True:[], Lit (LPrim "I")) {- # -} (False:g2, d2) = ([], com "U") # (g2, d2)+ (#) (True:g1, d1) {- # -} ([], d2) = ([], com "R" @@ d2) # (g1, d1)+ (#) (True:g1, d1) {- # -} (True:g2, d2) = (g1, ([], com "S") # (g1, d1)) # (g2, d2)+ (#) (True:g1, d1) {- # -} (False:g2, d2) = (g1, ([], com "C") # (g1, d1)) # (g2, d2)+ (#) (False:g1, d1) {- # -} ([], d2) = (g1, d1) # ([], d2)+ (#) (False:_g1, d1) {- # -} (True:[], Lit (LPrim "I")) = d1+ (#) (False:g1, d1) {- # -} (True:g2, d2) = (g1, ([], com "B") # (g1, d1)) # (g2, d2)+ (#) (False:g1, d1) {- # -} (False:g2, d2) = (g1, d1) # (g2, d2)++zipWithDefault :: forall a b . a -> (a -> a -> b) -> [a] -> [a] -> [b]+zipWithDefault d f [] ys = map (f d) ys+zipWithDefault d f xs [] = map (flip f d) xs+zipWithDefault d f (x:xt) (y:yt) = f x y : zipWithDefault d f xt yt++compileOptX :: Exp -> Exp+compileOptX = snd . optEta . deBruijn+-}+
+ src/MicroHs/Expr.hs view
@@ -0,0 +1,653 @@+module MicroHs.Expr(+ IdentModule,+ EModule(..),+ ExportItem(..),+ ImportSpec(..),+ ImportItem(..),+ EDef(..), showEDefs,+ Expr(..), eLam, eEqns, showExpr, eqExpr,+ Listish(..),+ Lit(..), showLit,+ EBind(..), showEBind, showEBinds,+ Eqn(..),+ EStmt(..),+ EAlts(..),+ EAlt,+ ECaseArm,+ FunDep,+ EType, showEType, eqEType,+ EConstraint,+ EPat, patVars, isPVar, isPConApp,+ EKind, kType, kConstraint,+ IdKind(..), idKindIdent,+ LHS,+ Constr(..), ConstrField, SType,+ ConTyInfo,+ Con(..), conIdent, conArity,+ tupleConstr, getTupleConstr,+ mkTupleSel,+ subst,+ allVarsExpr, allVarsBind, allVarsEqn,+ setSLocExpr,+ errorMessage,+ Assoc(..), Fixity,+ getBindsVars,+ HasLoc(..),+ ) where+import Prelude --Xhiding (Monad(..), Applicative(..), MonadFail(..), Functor(..), (<$>), (<>))+import Data.Maybe+import MicroHs.Ident+import Text.PrettyPrint.HughesPJ+--Ximport GHC.Stack+--Ximport Control.DeepSeq++type IdentModule = Ident++----------------------++data EModule = EModule IdentModule [ExportItem] [EDef]+ --Xderiving (Show)++data ExportItem+ = ExpModule IdentModule+ | ExpTypeCon Ident+ | ExpType Ident+ | ExpValue Ident+ --Xderiving (Show)++data EDef+ = Data LHS [Constr]+ | Newtype LHS Constr+ | Type LHS EType+ | Fcn Ident [Eqn]+ | Sign Ident EType+ | Import ImportSpec+ | ForImp String Ident EType+ | Infix Fixity [Ident]+ | Class [EConstraint] LHS [FunDep] [EBind] -- XXX will probable need initial forall with FD+ | Instance [IdKind] [EConstraint] EConstraint [EBind] -- no deriving yet+ | Default [EType]+ --Xderiving (Show)++data ImportSpec = ImportSpec Bool Ident (Maybe Ident) (Maybe (Bool, [ImportItem])) -- first Bool indicates 'qualified', second 'hiding'+ --Xderiving (Show)++data ImportItem+ = ImpTypeCon Ident+ | ImpType Ident+ | ImpValue Ident+ --Xderiving (Show)++data Expr+ = EVar Ident+ | EApp Expr Expr+ | EOper Expr [(Ident, Expr)]+ | ELam [Eqn]+ | ELit SLoc Lit+ | ECase Expr [ECaseArm]+ | ELet [EBind] Expr+ | ETuple [Expr]+ | EListish Listish+ | EDo (Maybe Ident) [EStmt]+ | ESectL Expr Ident+ | ESectR Ident Expr+ | EIf Expr Expr Expr+ | ESign Expr EType+ | EAt Ident Expr -- only in patterns+ -- Only while type checking+ | EUVar Int+ -- Constructors after type checking+ | ECon Con+ | EForall [IdKind] Expr -- only in types+ --deriving (Show, Eq)++type FunDep = ([Ident], [Ident])++eLam :: [EPat] -> Expr -> Expr+eLam ps e = ELam $ eEqns ps e++eEqns :: [EPat] -> Expr -> [Eqn]+eEqns ps e = [Eqn ps (EAlts [([], e)] [])]++data Con+ = ConData ConTyInfo Ident+ | ConNew Ident+ | ConLit SLoc Lit+ --Xderiving(Show)++data Listish+ = LList [Expr]+ | LCompr Expr [EStmt]+ | LFrom Expr+ | LFromTo Expr Expr+ | LFromThen Expr Expr+ | LFromThenTo Expr Expr Expr+ --deriving(Show, Eq)++conIdent :: --XHasCallStack =>+ Con -> Ident+conIdent (ConData _ i) = i+conIdent (ConNew i) = i+conIdent _ = error "conIdent"++conArity :: Con -> Int+conArity (ConData cs i) = fromMaybe (error "conArity") $ lookup i cs+conArity (ConNew _) = 1+conArity (ConLit _ _) = 0++instance Eq Con where+ (==) (ConData _ i) (ConData _ j) = i == j+ (==) (ConNew i) (ConNew j) = i == j+ (==) (ConLit _ l) (ConLit _ k) = l == k+ (==) _ _ = False++data Lit+ = LInt Int+ | LInteger Integer+ | LDouble Double+ | LRat Rational+ | LChar Char+ | LStr String+ | LPrim String+ | LForImp String+ --Xderiving (Show)+--Xinstance NFData Lit where rnf (LInt i) = rnf i; rnf (LInteger i) = rnf i; rnf (LDouble d) = rnf d; rnf (LRat r) = rnf r; rnf (LChar c) = rnf c; rnf (LStr s) = rnf s; rnf (LPrim s) = rnf s; rnf (LForImp s) = rnf s++instance Eq Lit where+ (==) (LInt x) (LInt y) = x == y+ (==) (LInteger x) (LInteger y) = x == y+ (==) (LDouble x) (LDouble y) = x == y+ (==) (LRat x) (LRat y) = x == y+ (==) (LChar x) (LChar y) = x == y+ (==) (LStr x) (LStr y) = x == y+ (==) (LPrim x) (LPrim y) = x == y+ (==) (LForImp x) (LForImp y) = x == y+ (==) _ _ = False++type ECaseArm = (EPat, EAlts)++data EStmt = SBind EPat Expr | SThen Expr | SLet [EBind]+ --Xderiving (Show)++data EBind = BFcn Ident [Eqn] | BPat EPat Expr | BSign Ident EType+ --Xderiving (Show)++-- A single equation for a function+data Eqn = Eqn [EPat] EAlts+ --Xderiving (Show)++data EAlts = EAlts [EAlt] [EBind]+ --Xderiving (Show)++type EAlt = ([EStmt], Expr)++type ConTyInfo = [(Ident, Int)] -- All constructors with their arities++type EPat = Expr++isPVar :: EPat -> Bool+isPVar (EVar i) = not (isConIdent i)+isPVar _ = False ++isPConApp :: EPat -> Bool+isPConApp (EVar i) = isConIdent i+isPConApp (EApp f _) = isPConApp f+isPConApp _ = True++patVars :: EPat -> [Ident]+patVars = filter isVar . allVarsExpr+ where isVar v = not (isConIdent v) && not (isDummyIdent v)++type LHS = (Ident, [IdKind])++data Constr = Constr+ [IdKind] [EConstraint] -- existentials: forall vs . ctx =>+ Ident -- constructor name+ (Either [SType] [ConstrField]) -- types or named fields+ --Xderiving(Show)++type ConstrField = (Ident, SType) -- record label and type+type SType = (Bool, EType) -- the Bool indicates strict++-- Expr restricted to+-- * after desugaring: EApp and EVar+-- * before desugaring: EApp, EVar, ETuple, EList+type EType = Expr++type EConstraint = EType++data IdKind = IdKind Ident EKind+ --deriving (Show, Eq)++instance Show IdKind where+ show (IdKind i k) = "(" ++ show i ++ "::" ++ show k ++ ")"++idKindIdent :: IdKind -> Ident+idKindIdent (IdKind i _) = i++type EKind = EType++kType :: EKind+kType = EVar (Ident noSLoc "Primitives.Type")++kConstraint :: EKind+kConstraint = EVar (Ident noSLoc "Primitives.Constraint")++tupleConstr :: SLoc -> Int -> Ident+tupleConstr loc n = mkIdentSLoc loc (replicate (n - 1) ',')++-- Check if it is a suple constructor+getTupleConstr :: Ident -> Maybe Int+getTupleConstr i =+ case unIdent i of+ ',':xs -> Just (length xs + 2) -- "," is 2-tuple+ _ -> Nothing++-- Create a tuple selector, component i (0 based) of n+mkTupleSel :: Int -> Int -> Expr+mkTupleSel i n = eLam [ETuple [ EVar $ if k == i then x else dummyIdent | k <- [0 .. n - 1] ]] (EVar x)+ where x = mkIdent "$x"++---------------------------------++-- Get the location of a syntactic element+class HasLoc a where+ getSLoc :: a -> SLoc++instance HasLoc Ident where+ getSLoc (Ident l _) = l++-- Approximate location; only identifiers and literals carry a location+instance HasLoc Expr where+ getSLoc (EVar i) = getSLoc i+ getSLoc (EApp e _) = getSLoc e+ getSLoc (EOper e _) = getSLoc e+ getSLoc (ELam qs) = getSLoc qs+ getSLoc (ELit l _) = l+ getSLoc (ECase e _) = getSLoc e+ getSLoc (ELet bs _) = getSLoc bs+ getSLoc (ETuple es) = getSLoc es+ getSLoc (EListish l) = getSLoc l+ getSLoc (EDo (Just i) _) = getSLoc i+ getSLoc (EDo _ ss) = getSLoc ss+ getSLoc (ESectL e _) = getSLoc e+ getSLoc (ESectR i _) = getSLoc i+ getSLoc (EIf e _ _) = getSLoc e+ getSLoc (ESign e _) = getSLoc e+ getSLoc (EAt i _) = getSLoc i+ getSLoc (EUVar _) = error "getSLoc EUVar"+ getSLoc (ECon c) = getSLoc c+ getSLoc (EForall [] e) = getSLoc e+ getSLoc (EForall iks _) = getSLoc iks++instance forall a . HasLoc a => HasLoc [a] where+ getSLoc [] = error "getSLoc []"+ getSLoc (a:_) = getSLoc a++instance HasLoc IdKind where+ getSLoc (IdKind i _) = getSLoc i++instance HasLoc Con where+ getSLoc (ConData _ i) = getSLoc i+ getSLoc (ConNew i) = getSLoc i+ getSLoc (ConLit l _) = l++instance HasLoc Listish where+ getSLoc (LList es) = getSLoc es+ getSLoc (LCompr e _) = getSLoc e+ getSLoc (LFrom e) = getSLoc e+ getSLoc (LFromTo e _) = getSLoc e+ getSLoc (LFromThen e _) = getSLoc e+ getSLoc (LFromThenTo e _ _) = getSLoc e++instance HasLoc EStmt where+ getSLoc (SBind p _) = getSLoc p+ getSLoc (SThen e) = getSLoc e+ getSLoc (SLet bs) = getSLoc bs++instance HasLoc EBind where+ getSLoc (BFcn i _) = getSLoc i+ getSLoc (BPat p _) = getSLoc p+ getSLoc (BSign i _) = getSLoc i++instance HasLoc Eqn where+ getSLoc (Eqn [] a) = getSLoc a+ getSLoc (Eqn (p:_) _) = getSLoc p++instance HasLoc EAlts where+ getSLoc (EAlts as _) = getSLoc as++instance HasLoc EAlt where+ getSLoc ([], e) = getSLoc e+ getSLoc (ss, _) = getSLoc ss++---------------------------------++data Assoc = AssocLeft | AssocRight | AssocNone+ --Xderiving (Show)++instance Eq Assoc where+ AssocLeft == AssocLeft = True+ AssocRight == AssocRight = True+ AssocNone == AssocNone = True+ _ == _ = False++type Fixity = (Assoc, Int)++---------------------------------++-- Enough to handle subsitution in types+subst :: [(Ident, Expr)] -> Expr -> Expr+subst [] = id+subst s =+ let+ sub ae =+ case ae of+ EVar i -> fromMaybe ae $ lookup i s+ EApp f a -> EApp (sub f) (sub a)+ ESign e t -> ESign (sub e) t+ EUVar _ -> ae+ EForall iks t -> EForall iks $ subst [ x | x@(i, _) <- s, not (elem i is) ] t+ where is = map idKindIdent iks+ _ -> error "subst unimplemented"+ in sub++---------------------------------++-- XXX needs more?+eqEType :: EType -> EType -> Bool+eqEType = eqExpr++-- Very partial implementation of Expr equality.+-- It is only used to compare instances, so this suffices.+eqExpr :: --XHasCallStack =>+ Expr -> Expr -> Bool+eqExpr (EVar i) (EVar i') = i == i'+eqExpr (EVar _) (EApp _ _) = False+eqExpr (EApp f a) (EApp f' a') = eqExpr f f' && eqExpr a a'+eqExpr (EApp _ _) (EVar _) = False+eqExpr _ _ = False -- XXX good enough for instances+--eqExpr e1 e2 = error $ "eqExpr: unimplemented " ++ showExpr e1 ++ " == " ++ showExpr e2++---------------------------------++allVarsBind :: EBind -> [Ident]+allVarsBind abind =+ case abind of+ BFcn i eqns -> i : concatMap allVarsEqn eqns+ BPat p e -> allVarsPat p ++ allVarsExpr e+ BSign i _ -> [i]++allVarsEqn :: Eqn -> [Ident]+allVarsEqn eqn =+ case eqn of+ Eqn ps alts -> concatMap allVarsPat ps ++ allVarsAlts alts++allVarsAlts :: EAlts -> [Ident]+allVarsAlts (EAlts alts bs) = concatMap allVarsAlt alts ++ concatMap allVarsBind bs++allVarsAlt :: EAlt -> [Ident]+allVarsAlt (ss, e) = concatMap allVarsStmt ss ++ allVarsExpr e++allVarsPat :: EPat -> [Ident]+allVarsPat = allVarsExpr++allVarsExpr :: Expr -> [Ident]+allVarsExpr aexpr =+ case aexpr of+ EVar i -> [i]+ EApp e1 e2 -> allVarsExpr e1 ++ allVarsExpr e2+ EOper e1 ies -> allVarsExpr e1 ++ concatMap (\ (i,e2) -> i : allVarsExpr e2) ies+ ELam qs -> concatMap allVarsEqn qs+ ELit _ _ -> []+ ECase e as -> allVarsExpr e ++ concatMap allVarsCaseArm as+ ELet bs e -> concatMap allVarsBind bs ++ allVarsExpr e+ ETuple es -> concatMap allVarsExpr es+ EListish (LList es) -> concatMap allVarsExpr es+ EDo mi ss -> maybe [] (:[]) mi ++ concatMap allVarsStmt ss+ ESectL e i -> i : allVarsExpr e+ ESectR i e -> i : allVarsExpr e+ EIf e1 e2 e3 -> allVarsExpr e1 ++ allVarsExpr e2 ++ allVarsExpr e3+ EListish l -> allVarsListish l+ ESign e _ -> allVarsExpr e+ EAt i e -> i : allVarsExpr e+ EUVar _ -> []+ ECon c -> [conIdent c]+ EForall iks e -> map (\ (IdKind i _) -> i) iks ++ allVarsExpr e++allVarsListish :: Listish -> [Ident]+allVarsListish (LList es) = concatMap allVarsExpr es+allVarsListish (LCompr e ss) = allVarsExpr e ++ concatMap allVarsStmt ss+allVarsListish (LFrom e) = allVarsExpr e+allVarsListish (LFromTo e1 e2) = allVarsExpr e1 ++ allVarsExpr e2+allVarsListish (LFromThen e1 e2) = allVarsExpr e1 ++ allVarsExpr e2+allVarsListish (LFromThenTo e1 e2 e3) = allVarsExpr e1 ++ allVarsExpr e2 ++ allVarsExpr e3++allVarsCaseArm :: ECaseArm -> [Ident]+allVarsCaseArm (p, alts) = allVarsPat p ++ allVarsAlts alts++allVarsStmt :: EStmt -> [Ident]+allVarsStmt astmt =+ case astmt of+ SBind p e -> allVarsPat p ++ allVarsExpr e+ SThen e -> allVarsExpr e+ SLet bs -> concatMap allVarsBind bs++-----------------------------++setSLocExpr :: SLoc -> Expr -> Expr+setSLocExpr l (EVar i) = EVar (setSLocIdent l i)+setSLocExpr l (ECon c) = ECon (setSLocCon l c)+setSLocExpr l (ELit _ k) = ELit l k+setSLocExpr _ _ = error "setSLocExpr" -- what other cases do we need?++setSLocCon :: SLoc -> Con -> Con+setSLocCon l (ConData ti i) = ConData ti (setSLocIdent l i)+setSLocCon l (ConNew i) = ConNew (setSLocIdent l i)+setSLocCon _ c = c++errorMessage :: --XHasCallStack =>+ forall a . SLoc -> String -> a+errorMessage loc msg = error $ showSLoc loc ++ ": " ++ msg++----------------++instance Show Expr where+ show = showExpr++showExpr :: Expr -> String+showExpr = render . ppExpr++showEDefs :: [EDef] -> String+showEDefs = render . ppEDefs++showEBind :: EBind -> String+showEBind = render . ppEBind++showEBinds :: [EBind] -> String+showEBinds = render . vcat . map ppEBind++showEType :: EType -> String+showEType = render . ppEType++ppImportItem :: ImportItem -> Doc+ppImportItem ae =+ case ae of+ ImpTypeCon i -> ppIdent i <> text "(..)"+ ImpType i -> ppIdent i+ ImpValue i -> ppIdent i++ppEDef :: EDef -> Doc+ppEDef def =+ case def of+ Data lhs [] -> text "data" <+> ppLHS lhs+ Data lhs cs -> text "data" <+> ppLHS lhs <+> text "=" <+> hsep (punctuate (text " |") (map ppConstr cs))+ Newtype lhs c -> text "newtype" <+> ppLHS lhs <+> text "=" <+> ppConstr c+ Type lhs t -> text "type" <+> ppLHS lhs <+> text "=" <+> ppEType t+ Fcn i eqns -> ppEqns (ppIdent i) (text "=") eqns+ Sign i t -> ppIdent i <+> text "::" <+> ppEType t+ Import (ImportSpec q m mm mis) -> text "import" <+> (if q then text "qualified" else empty) <+> ppIdent m <> text (maybe "" ((" as " ++) . unIdent) mm) <>+ case mis of+ Nothing -> empty+ Just (h, is) -> text (if h then " hiding" else "") <> parens (hsep $ punctuate (text ", ") (map ppImportItem is))+ ForImp ie i t -> text ("foreign import ccall " ++ show ie) <+> ppIdent i <+> text "::" <+> ppEType t+ Infix (a, p) is -> text ("infix" ++ f a) <+> text (show p) <+> hsep (punctuate (text ", ") (map ppIdent is))+ where f AssocLeft = "l"; f AssocRight = "r"; f AssocNone = ""+ Class sup lhs fds bs -> ppWhere (text "class" <+> ppCtx sup <+> ppLHS lhs <+> ppFunDeps fds) bs+ Instance vs ct ty bs -> ppWhere (text "instance" <+> ppForall vs <+> ppCtx ct <+> ppEType ty) bs+ Default ts -> text "default" <+> parens (hsep (punctuate (text ", ") (map ppEType ts)))++ppCtx :: [EConstraint] -> Doc+ppCtx [] = empty+ppCtx ts = ppEType (ETuple ts) <+> text "=>"++ppFunDeps :: [FunDep] -> Doc+ppFunDeps [] = empty+ppFunDeps fds =+ text "|" <+> hsep (punctuate (text ",") (map (\ (is, os) -> hsep (map ppIdent is) <+> text "-" <+> hsep (map ppIdent os)) fds))++ppEqns :: Doc -> Doc -> [Eqn] -> Doc+ppEqns name sepr = vcat . map (\ (Eqn ps alts) -> sep [name <+> hsep (map ppEPat ps), ppAlts sepr alts])++ppConstr :: Constr -> Doc+ppConstr (Constr iks ct c cs) = ppForall iks <+> ppCtx ct <+> ppIdent c <+> ppCs cs+ where ppCs (Left ts) = hsep (map ppSType ts)+ ppCs (Right fs) = braces (hsep $ map f fs)+ where f (i, t) = ppIdent i <+> text "::" <+> ppSType t <> text ","++ppSType :: SType -> Doc+ppSType (False, t) = ppEType t+ppSType (True, t) = text "!" <> ppEType t++ppLHS :: LHS -> Doc+ppLHS (f, vs) = hsep (ppIdent f : map ppIdKind vs)++ppIdKind :: IdKind -> Doc+ppIdKind (IdKind i k) = parens $ ppIdent i <> text "::" <> ppEKind k++ppEDefs :: [EDef] -> Doc+ppEDefs ds = vcat (map pp ds)+ where pp d@(Sign _ _) = ppEDef d+ pp d@(Import _) = ppEDef d+ pp d = ppEDef d $+$ text ""++ppAlts :: Doc -> EAlts -> Doc+ppAlts asep (EAlts alts bs) = ppWhere (ppAltsL asep alts) bs++ppWhere :: Doc -> [EBind] -> Doc+ppWhere d [] = d+ppWhere d bs = (d <+> text "where") $+$ nest 2 (vcat (map ppEBind bs))++ppAltsL :: Doc -> [EAlt] -> Doc+ppAltsL asep [([], e)] = text "" <+> asep <+> ppExpr e+ppAltsL asep alts = vcat (map (ppAlt asep) alts)++ppAlt :: Doc -> EAlt -> Doc+ppAlt asep (ss, e) = text " |" <+> hsep (punctuate (text ",") (map ppEStmt ss)) <+> asep <+> ppExpr e++ppExpr :: Expr -> Doc+ppExpr ae =+ case ae of+ EVar i | isOperChar cop -> parens (text op)+ | otherwise -> text op+ where op = unIdent (unQualIdent i)+ cop = head op+ EApp _ _ -> ppApp [] ae+ EOper e ies -> ppExpr (foldl (\ e1 (i, e2) -> EApp (EApp (EVar i) e1) e2) e ies)+ ELam qs -> parens $ text "\\" <> ppEqns empty (text "->") qs+ ELit _ i -> text (showLit i)+ ECase e as -> text "case" <+> ppExpr e <+> text "of" $$ nest 2 (vcat (map ppCaseArm as))+ ELet bs e -> text "let" $$ nest 2 (vcat (map ppEBind bs)) $$ text "in" <+> ppExpr e+ ETuple es -> parens $ hsep $ punctuate (text ",") (map ppExpr es)+ EListish (LList es) -> ppList ppExpr es+ EDo mn ss -> maybe (text "do") (\ n -> ppIdent n <> text ".do") mn $$ nest 2 (vcat (map ppEStmt ss))+ ESectL e i -> parens $ ppExpr e <+> ppIdent i+ ESectR i e -> parens $ ppIdent i <+> ppExpr e+ EIf e1 e2 e3 -> parens $ sep [text "if" <+> ppExpr e1, text "then" <+> ppExpr e2, text "else" <+> ppExpr e3]+ EListish l -> ppListish l+ ESign e t -> ppExpr e <+> text "::" <+> ppEType t+ EAt i e -> ppIdent i <> text "@" <> ppExpr e+ EUVar i -> text ("a" ++ show i)+ ECon c -> ppCon c+ EForall iks e -> ppForall iks <+> ppEType e+-- where+ppApp :: [Expr] -> Expr -> Doc+ppApp as (EApp f a) = ppApp (a:as) f+ppApp as (EVar i) | isOperChar cop, [a, b] <- as = parens $ ppExpr a <+> text op <+> ppExpr b+ | isOperChar cop, [a] <- as = parens $ ppExpr a <+> text op+ | cop == ',' = ppExpr (ETuple as)+ | op == "[]", length as == 1 = ppExpr (EListish (LList as))+ where op = unIdent (unQualIdent i)+ cop = head op+ppApp as f = parens $ hsep (map ppExpr (f:as))++ppForall :: [IdKind] -> Doc+--ppForall [] = empty+ppForall iks = text "forall" <+> hsep (map ppIdKind iks) <+> text "."++ppListish :: Listish -> Doc+ppListish _ = text "<<Listish>>"++ppCon :: Con -> Doc+ppCon (ConData _ s) = ppIdent s+ppCon (ConNew s) = ppIdent s+ppCon (ConLit _ l) = text (showLit l)++-- Literals are tagged the way they appear in the combinator file:+-- # Int+-- % Double+-- ' Char (not in file)+-- " String+-- ^ FFI function+-- primitive+showLit :: Lit -> String+showLit l =+ case l of+ LInt i -> '#' : show i+ LInteger i -> '#' : '#' : show i+ LDouble d -> '&' : show d+ LRat r -> '%' : show r+ LChar c -> show c+ LStr s -> show s+ LPrim s -> s+ LForImp s -> '^' : s++ppEStmt :: EStmt -> Doc+ppEStmt as =+ case as of+ SBind p e -> ppEPat p <+> text "<-" <+> ppExpr e+ SThen e -> ppExpr e+ SLet bs -> text "let" $$ nest 2 (vcat (map ppEBind bs))++ppEBind :: EBind -> Doc+ppEBind ab =+ case ab of+ BFcn i eqns -> ppEDef (Fcn i eqns)+ BPat p e -> ppEPat p <+> text "=" <+> ppExpr e+ BSign i t -> ppIdent i <+> text "::" <+> ppEType t++ppCaseArm :: ECaseArm -> Doc+ppCaseArm arm =+ case arm of+ (p, alts) -> ppEPat p <> ppAlts (text "->") alts++ppEPat :: EPat -> Doc+ppEPat = ppExpr++ppEType :: EType -> Doc+ppEType = ppExpr++ppEKind :: EKind -> Doc+ppEKind = ppEType++ppList :: forall a . (a -> Doc) -> [a] -> Doc+ppList pp xs = brackets $ hsep $ punctuate (text ",") (map pp xs)+getBindVars :: EBind -> [Ident]+getBindVars abind =+ case abind of+ BFcn i _ -> [i]+ BPat p _ -> patVars p+ BSign _ _ -> []++getBindsVars :: [EBind] -> [Ident]+getBindsVars = concatMap getBindVars
+ src/MicroHs/Graph.hs view
@@ -0,0 +1,158 @@+{-# OPTIONS_GHC -Wno-unused-imports #-}+-----------------------------------------------------------------------------+-- Loosely based on:+--+-- Module : Data.Graph+-- Copyright : (c) The University of Glasgow 2002+-- License : BSD-style (see the file libraries/base/LICENSE)+--+-----------------------------------------------------------------------------++module MicroHs.Graph (+ stronglyConnComp,+ SCC(..)+ ) where+import Prelude+--Ximport Compat++import qualified Data.IntSet as IS+import qualified Data.IntMap as IM++import Data.List+import Data.Maybe++data Tree a = Node a [Tree a]+ --deriving (Eq, Ord, Show)++type Forest a = [Tree a]++-- | Strongly connected component.+data SCC vertex = AcyclicSCC vertex -- ^ A single vertex that is not+ -- in any cycle.+ | CyclicSCC [vertex] -- ^ A maximal set of mutually+ -- reachable vertices.+ --Xderiving (Show)++stronglyConnComp+ :: forall key node .+ (key -> key -> Bool)+ -> [(node, key, [key])]+ -- ^ The graph: a list of nodes uniquely identified by keys,+ -- with a list of keys of nodes this node has edges to.+ -- The out-list may contain keys that don't correspond to+ -- nodes of the graph; such edges are ignored.+ -> [SCC node]+stronglyConnComp le edges0+ = map get_node (stronglyConnCompR le edges0)+ where+ get_node (AcyclicSCC (n, _, _)) = AcyclicSCC n+ get_node (CyclicSCC triples) = CyclicSCC [n | (n,_,_) <- triples]++stronglyConnCompR+ :: forall key node .+ (key -> key -> Bool)+ -> [(node, key, [key])]+ -- ^ The graph: a list of nodes uniquely identified by keys,+ -- with a list of keys of nodes this node has edges to.+ -- The out-list may contain keys that don't correspond to+ -- nodes of the graph; such edges are ignored.+ -> [SCC (node, key, [key])] -- ^ Reverse topologically sorted+stronglyConnCompR _ [] = []+stronglyConnCompR le edges0+ = map decode forest+ where+ (graph, vertex_fn) = graphFromEdges le edges0+ forest = scc graph+ mentions_itself v = elemBy (==) v (graph IM.! v)+ decode (Node v []) | mentions_itself v = CyclicSCC [vertex_fn v]+ | otherwise = AcyclicSCC (vertex_fn v)+ decode other = CyclicSCC (dec other [])+ where+ dec (Node v ts) vs = vertex_fn v : foldr dec vs ts++type Vertex = Int+type Graph = IM.IntMap [Vertex]+type Edge = (Vertex, Vertex)++vertices :: Graph -> [Vertex]+vertices = IM.keys++edges :: Graph -> [Edge]+edges g = [ (v, w) | v <- vertices g, w <- g IM.! v ]++buildG :: [Vertex] -> [Edge] -> Graph+buildG vs es =+ let mt = IM.fromList (zip vs (repeat []))+ in foldr (\ (v, w) -> IM.insertWith (++) v [w]) mt es++transposeG :: Graph -> Graph+transposeG g = buildG (vertices g) (reverseE g)++reverseE :: Graph -> [Edge]+reverseE g = [ (w, v) | (v, w) <- edges g ]++graphFromEdges+ :: forall key node .+ (key -> key -> Bool)+ -> [(node, key, [key])]+ -> (Graph, Vertex -> (node, key, [key]))+graphFromEdges le edges0+ = (graph, \v -> vertex_map IM.! v)+ where+ lek (_,k1,_) (_,k2,_) = le k1 k2++ max_v = length edges0 - 1+ sorted_edges = sortLE lek edges0+ edges1 = zip [0..] sorted_edges++ key_map = IM.fromList [(v, k) | (v, (_, k, _ )) <- edges1]++ -- key_vertex :: key -> Maybe Vertex+ -- returns Nothing for non-interesting vertices+ key_vertex k = findVertex 0 max_v+ where+ findVertex a b | a > b+ = Nothing+ findVertex a b =+ if k `le` m then+ if m `le` k then+ Just mid+ else+ findVertex a (mid - 1)+ else+ findVertex (mid + 1) b+ where+ mid = a + (b - a) `quot` 2+ m = key_map IM.! mid++ graph = IM.fromList [(v, mapMaybe key_vertex ks) | (v, (_, _, ks)) <- edges1]+ vertex_map = IM.fromList edges1++dff :: Graph -> [Tree Vertex]+dff g = dfs g (vertices g)++dfs :: Graph -> [Vertex] -> Forest Vertex+dfs g vs0 = snd $ go IS.empty vs0+ where+ go :: IS.IntSet -> [Vertex] -> (IS.IntSet, Forest Vertex)+ go done [] = (done, [])+ go done (v:vs) =+ if IS.member v done+ then go done vs+ else+ let (done', as) = go (IS.insert v done) (g IM.! v)+ (done'', bs) = go done' vs+ in (done'', Node v as : bs)+++postorder :: forall a . Tree a -> [a] -> [a]+postorder (Node a ts) = postorderF ts . (a :)++postorderF :: forall a . [Tree a] -> [a] -> [a]+postorderF ts = foldr (.) id $ map postorder ts++postOrd :: Graph -> [Vertex]+postOrd g = postorderF (dff g) []++scc :: Graph -> [Tree Vertex]+scc g = dfs g (reverse (postOrd (transposeG g)))
+ src/MicroHs/Ident.hs view
@@ -0,0 +1,144 @@+-- Copyright 2023 Lennart Augustsson+-- See LICENSE file for full license.+module MicroHs.Ident(+ Line, Col, Loc,+ Ident(..),+ mkIdent, mkIdentLoc, unIdent, isIdent,+ qualIdent, showIdent, setSLocIdent,+ ppIdent,+ mkIdentSLoc,+ isLower_, isIdentChar, isOperChar, isConIdent,+ dummyIdent, isDummyIdent,+ unQualIdent,+ unQualString,+ addIdentSuffix,+ SLoc(..), noSLoc, isNoSLoc,+ showSLoc,+ expectQualified,+ ) where+import Data.Eq+import Prelude+import Data.Char+import Text.PrettyPrint.HughesPJ+--Ximport Control.DeepSeq+--Ximport GHC.Stack++type Line = Int+type Col = Int+type Loc = (Line, Col)++data SLoc = SLoc !FilePath !Line !Col+ --Xderiving (Eq)++instance Show SLoc where+ show (SLoc f l c) = show f ++ "," ++ show l ++ ":" ++ show c++data Ident = Ident !SLoc String+ --deriving (Show)+--Xinstance NFData Ident where rnf (Ident _ s) = rnf s++instance Eq Ident where+ Ident _ i == Ident _ j = i == j++instance Ord Ident where+ compare (Ident _ i) (Ident _ j) = compare i j+ Ident _ i < Ident _ j = i < j+ Ident _ i <= Ident _ j = i <= j+ Ident _ i > Ident _ j = i > j+ Ident _ i >= Ident _ j = i >= j++instance Show Ident where+ show = showIdent++noSLoc :: SLoc+noSLoc = SLoc "" 0 0++isNoSLoc :: SLoc -> Bool+isNoSLoc (SLoc _ 0 0) = True+isNoSLoc _ = False++mkIdent :: String -> Ident+mkIdent = Ident noSLoc++mkIdentSLoc :: SLoc -> String -> Ident+mkIdentSLoc = Ident++mkIdentLoc :: FilePath -> Loc -> String -> Ident+mkIdentLoc fn (l, c) s = Ident (SLoc fn l c) s++unIdent :: Ident -> String+unIdent (Ident _ s) = s++setSLocIdent :: SLoc -> Ident -> Ident+setSLocIdent l (Ident _ s) = Ident l s++showIdent :: Ident -> String+showIdent (Ident _ i) = i++ppIdent :: Ident -> Doc+ppIdent (Ident _ i) = text i++isIdent :: String -> Ident -> Bool+isIdent s (Ident _ i) = s == i++qualIdent :: --XHasCallStack =>+ Ident -> Ident -> Ident+--XqualIdent _ (Ident _ i) | isQual i = error $ "already qualified " ++ i+qualIdent (Ident _ qi) (Ident loc i) = Ident loc (qi ++ "." ++ i)++expectQualified :: --XHasCallStack =>+ Ident -> Ident+--XexpectQualified (Ident _ s) | not (isQual s) = error $ "not qualified " ++ s+expectQualified i = i++--XisQual :: String -> Bool+--XisQual (c:'.':_:_) | isAlphaNum c = True+--XisQual (_:cs) = isQual cs+--XisQual "" = False++addIdentSuffix :: Ident -> String -> Ident+addIdentSuffix (Ident loc i) s = Ident loc (i ++ s)++unQualString :: --XHasCallStack =>+ String -> String+unQualString [] = ""+unQualString s@(c:_) =+ if isIdentChar c then+ case dropWhile (/= '.') s of+ "" -> s+ '.':r -> unQualString r+ _ -> undefined -- This cannot happen, but GHC doesn't know that+ else+ s++unQualIdent :: Ident -> Ident+unQualIdent (Ident l s) = Ident l (unQualString s)++isConIdent :: Ident -> Bool+isConIdent (Ident _ i) =+ let+ c = head i+ in isUpper c || c == ':' || c == ',' || i == "[]" || i == "()"++isOperChar :: Char -> Bool+isOperChar c = elem c "@\\=+-:<>.!#$%^&*/|~?"++isIdentChar :: Char -> Bool+isIdentChar c = isLower_ c || isUpper c || isDigit c || c == '\''++isLower_ :: Char -> Bool+isLower_ c = isLower c || c == '_'++dummyIdent :: Ident+dummyIdent = mkIdent "_"++isDummyIdent :: Ident -> Bool+isDummyIdent (Ident _ "_") = True+isDummyIdent _ = False++showSLoc :: SLoc -> String+showSLoc (SLoc fn l c) =+ if null fn then "no location" else+ show fn ++ + if l == 0 && c == 0 then ""+ else ": line " ++ show l ++ ", col " ++ show c
+ src/MicroHs/IdentMap.hs view
@@ -0,0 +1,169 @@+{-# OPTIONS_GHC -Wno-name-shadowing #-}+--+-- Balanced binary trees+-- Similar to Data.Map+-- Based on https://ufal.mff.cuni.cz/~straka/papers/2011-bbtree.pdf+--+module MicroHs.IdentMap(+ Map,+ empty, singleton,+ insertWith, insert,+ fromListWith, fromList,+ delete,+ lookup,+ size,+ toList, elems,+ ) where+import Prelude hiding(lookup)+import MicroHs.Ident++data Map a+ = Nil -- empty tree+ | One Ident a -- singleton+ | Node -- tree node+ (Map a) -- left subtree+ Int -- size of this tree+ Ident -- key stored in the node+ a -- element stored in the node+ (Map a) -- right subtree+ --Xderiving(Show)++empty :: forall a . Map a+empty = Nil++singleton :: forall a . Ident -> a -> Map a+singleton i a = One i a++elems :: forall v . Map v -> [v]+elems = map snd . toList++toList :: forall v . Map v -> [(Ident, v)]+toList t = to t []+ where+ to Nil q = q+ to (One k v) q = (k, v):q+ to (Node l _ k v r) q = to l ((k, v) : to r q)++fromList :: forall v . [(Ident, v)] -> Map v+fromList = fromListWith const++fromListWith :: forall v . (v -> v -> v) -> [(Ident, v)] -> Map v+fromListWith comb = foldr (uncurry (insertWith comb)) empty++size :: forall a . Map a -> Int+size Nil = 0+size (One _ _) = 1+size (Node _ s _ _ _) = s++node :: forall a . Map a -> Ident -> a -> Map a -> Map a+node Nil key val Nil = One key val+node left key val right = Node left (size left + 1 + size right) key val right++lookup :: forall a . Ident -> Map a -> Maybe a+lookup k = look+ where+ look Nil = Nothing+ look (One key val) =+ case compare k key of+ EQ -> Just val+ _ -> Nothing+ look (Node left _ key val right) =+ case k `compare` key of+ LT -> look left+ EQ -> Just val+ GT -> look right++insert :: forall a . Ident -> a -> Map a -> Map a+insert = insertWith const++insertWith :: forall a . (a -> a -> a) -> Ident -> a -> Map a -> Map a+insertWith comb k v = ins+ where+ ins Nil = One k v+ ins (One a v) = ins (Node Nil 1 a v Nil)+ ins (Node left _ key val right) =+ case k `compare` key of+ LT -> balance (ins left) key val right+ EQ -> node left k (comb v val) right+ GT -> balance left key val (ins right)++delete :: forall a . Ident -> Map a -> Map a+delete k = del+ where+ del Nil = Nil+ del t@(One a _) | (k `compare` a) == EQ = Nil+ | otherwise = t+ del (Node left _ key val right) =+ case k `compare` key of+ LT -> balance (del left) key val right+ EQ -> glue left right+ GT -> balance left key val (del right)+ where+ glue Nil right = right+ glue left Nil = left+ glue left right+ | size left > size right =+ let (key', val', left') = extractMax left+ in node left' key' val' right+ | otherwise =+ let (key', val', right') = extractMin right+ in node left key' val' right'++extractMin :: forall a . Map a -> (Ident, a, Map a)+extractMin Nil = undefined+extractMin (One key val) = (key, val, Nil)+extractMin (Node Nil _ key val right) = (key, val, right)+extractMin (Node left _ key val right) =+ case extractMin left of+ (min, vmin, left') -> (min, vmin, balance left' key val right)++extractMax :: forall a . Map a -> (Ident, a, Map a)+extractMax Nil = undefined+extractMax (One key val) = (key, val, Nil)+extractMax (Node left _ key val Nil) = (key, val, left)+extractMax (Node left _ key val right) =+ case extractMax right of+ (max, vmax, right') -> (max, vmax, balance left key val right')++omega :: Int+omega = 3+alpha :: Int+alpha = 2+delta :: Int+delta = 0++balance :: forall a . Map a -> Ident -> a -> Map a -> Map a+balance left key val right+ | size left + size right <= 1 = node left key val right+balance (One k v) key val right = balance (Node Nil 1 k v Nil) key val right+balance left key val (One k v) = balance left key val (Node Nil 1 k v Nil)+balance left key val right+ | size right > omega * size left + delta =+ case right of+ (Node rl _ _ _ rr) | size rl < alpha*size rr -> singleL left key val right+ | otherwise -> doubleL left key val right+ _ -> undefined+ | size left > omega * size right + delta =+ case left of+ (Node ll _ _ _ lr) | size lr < alpha*size ll -> singleR left key val right+ | otherwise -> doubleR left key val right+ _ -> undefined+ | otherwise = node left key val right++singleL :: forall a . Map a -> Ident -> a -> Map a -> Map a+singleL l k v (Node rl _ rk rv rr) = node (node l k v rl) rk rv rr+singleL _ _ _ _ = undefined++singleR :: forall a . Map a -> Ident -> a -> Map a -> Map a+singleR (Node ll _ lk lv lr) k v r = node ll lk lv (node lr k v r)+singleR _ _ _ _ = undefined++doubleL :: forall a . Map a -> Ident -> a -> Map a -> Map a+doubleL l k v (Node (Node rll _ rlk rlv rlr) _ rk rv rr) = node (node l k v rll) rlk rlv (node rlr rk rv rr)+doubleL l k v (Node (One rlk rlv ) _ rk rv rr) = node (node l k v Nil) rlk rlv (node Nil rk rv rr)+doubleL _ _ _ _ = undefined++doubleR :: forall a . Map a -> Ident -> a -> Map a -> Map a+doubleR (Node ll _ lk lv (Node lrl _ lrk lrv lrr)) k v r = node (node ll lk lv lrl) lrk lrv (node lrr k v r)+doubleR (Node ll _ lk lv (One lrk lrv )) k v r = node (node ll lk lv Nil) lrk lrv (node Nil k v r)+doubleR _ _ _ _ = undefined
+ src/MicroHs/Interactive.hs view
@@ -0,0 +1,170 @@+module MicroHs.Interactive(module MicroHs.Interactive) where+import Prelude+--Ximport Data.List+--import Control.DeepSeq+import Control.Exception+import MicroHs.StateIO+import MicroHs.Compile+import MicroHs.Desugar(LDef)+import MicroHs.Ident(mkIdent)+import MicroHs.Parse+import MicroHs.Translate+import Unsafe.Coerce+import System.Console.SimpleReadline+--Ximport Compat++type IState = (String, Flags, Cache)++type I a = StateIO IState a++mainInteractive :: Flags -> IO ()+mainInteractive (Flags a b c d _ f) = do+ when (not usingMhs) $+ error "Interactive mhs not available when compiled with ghc"+ putStrLn "Welcome to interactive MicroHs!"+ let flags' = Flags a b c d True f+ cach <- getCachedPrelude flags'+ _ <- runStateIO start (preamble, flags', cach)+ return ()++preamble :: String+preamble = "module " ++ interactiveName ++ "(module " ++ interactiveName +++ ") where\nimport Prelude\ndefault (Integer, Double)\n"++start :: I ()+start = do+ reload+ liftIO $ putStrLn "Type ':quit' to quit, ':help' for help"+ repl++repl :: I ()+repl = do+ ms <- liftIO $ getInputLineHist ".mhsi" "> "+ case ms of+ Nothing -> repl+ Just s ->+ case s of+ [] -> repl+ ':':r -> do+ c <- command r+ if c then repl else liftIO $ putStrLn "Bye"+ _ -> do+ oneline s+ repl++command :: String -> I Bool+command s =+ case words s of+ [] -> return True+ c : ws ->+ case filter (isPrefixOf c . fst) commands of+ [] -> do+ liftIO $ putStrLn "Unrecognized command"+ return True+ [(_, cmd)] ->+ cmd (unwords ws)+ xs -> do+ liftIO $ putStrLn $ "Ambiguous command: " ++ unwords (map fst xs)+ return True++commands :: [(String, String -> I Bool)]+commands =+ [ ("quit", const $ return False)+ , ("clear", const $ do+ updateLines (const preamble)+ modify $ \ (ls, flgs, _) -> (ls, flgs, emptyCache)+ return True+ )+ , ("reload", const $ do+ modify $ \ (ls, flgs, _) -> (ls, flgs, emptyCache)+ reload+ return True+ )+ , ("delete", \ del -> do+ updateLines (unlines . filter (not . isPrefixOf del) . lines)+ return True+ )+ , ("help", \ _ -> do+ liftIO $ putStrLn helpText+ return True+ )+ ]++reload :: I ()+reload = do+ (ls, _, _) <- get+ rld <- tryCompile ls -- reload modules right away+ case rld of+ Left msg -> liftIO $ err msg+ Right _ -> return ()++helpText :: String+helpText = "Commands:\n :quit quit MicroHs\n :reload reload modules\n :clear clear all definitions\n :delete d delete definition(s) d\n :help this text\n expr evaluate expression\n defn add top level definition\n"++updateLines :: (String -> String) -> I ()+updateLines f = modify $ \ (ls, flgs, cache) -> (f ls, flgs, cache)++interactiveName :: String+interactiveName = "Interactive"++itName :: String+itName = "_it"++mkIt :: String -> String+mkIt l = itName ++ " :: IO ()\n" ++ itName ++ " = printOrRun (" ++ l ++ ")\n"++err :: Exn -> IO ()+err (Exn s) = putStrLn $ "Error: " ++ s++oneline :: String -> I ()+oneline line = do+ (ls, _, _) <- get+ -- Try adding the line as a definition+ let lls = ls ++ line ++ "\n"+ case parse pTop "" lls of+ Right _ -> do+-- liftIO $ putStrLn "pTop succeeded"+ -- Can parse as a definition, so compile it and report any errors.+ defTest <- tryCompile lls+ case defTest of+ Right _ -> updateLines (const lls)+ Left e -> liftIO $ err e+ Left _ -> do+-- liftIO $ putStrLn "pTop failed"+ -- Cannot parse as a definition.+ -- Try parsing it as an expression, and make it a definition+ case parse pExprTop "" line of+ Right _ -> do+-- liftIO $ putStrLn "pExprTop succeeded"+ exprTest <- tryCompile (ls ++ "\n" ++ mkIt line)+ case exprTest of+ Right m -> evalExpr m+ Left e -> liftIO $ err e+ Left e -> liftIO $ err (Exn e)++tryCompile :: String -> I (Either Exn [LDef])+tryCompile file = do+ (ls, flgs, cache) <- get+ let+ iid = mkIdent interactiveName+ liftIO $ writeFile (interactiveName ++ ".hs") file+ res <- liftIO $ try $ compileCacheTop flgs iid cache+ case res of+ Left e -> return (Left e)+ Right (m, cache') -> do+ put (ls, flgs, deleteFromCache iid cache')+ return (Right m)++evalExpr :: [LDef] -> I ()+evalExpr cmdl = do+ let ares = translate (mkIdent (interactiveName ++ "." ++ itName), cmdl)+ res = unsafeCoerce ares :: IO ()+ mval <- liftIO $ try (seq res (return res))+ liftIO $+ case mval of+ Left e -> err e+ Right val -> do+ mio <- try val+ case mio of+ Left e -> err e+ Right _ -> return ()
+ src/MicroHs/Lex.hs view
@@ -0,0 +1,232 @@+module MicroHs.Lex(+ lexTop,+ Token(..), showToken,+ tokensLoc) where+import Prelude --Xhiding(lex)+import Data.Char+import Data.List+--Ximport Compat+import MicroHs.Ident++data Token+ = TIdent Loc [String] String+ | TString Loc String+ | TChar Loc Char+ | TInt Loc Integer+ | TRat Loc Rational+ | TSpec Loc Char+ | TError Loc String+ | TBrace Loc+ | TIndent Loc+ --Xderiving (Show)++showToken :: Token -> String+showToken (TIdent _ ss s) = intercalate "." (ss ++ [s])+showToken (TString _ s) = show s+showToken (TChar _ c) = show c+showToken (TInt _ i) = show i+showToken (TRat _ d) = show d+showToken (TSpec _ c) = [c]+showToken (TError _ s) = "ERROR " ++ s+showToken (TBrace _) = "TBrace"+showToken (TIndent _) = "TIndent"++incrLine :: Loc -> Loc+incrLine (l, _) = (l+1, 1)++addCol :: Loc -> Int -> Loc+addCol (l, c) i = (l, c + i)++mkLoc :: Line -> Col -> Loc+mkLoc l c = (l, c)++getCol :: Loc -> Col+getCol (_, c) = c++--getLin :: Loc -> Col+--getLin (l, _) = l++{- This is slower and allocates more.+ It needs some strictness, probably+type Loc = Int++incrLine :: Loc -> Loc+incrLine l = (quot l 1000000 + 1) * 1000000 + 1++addCol :: Loc -> Int -> Loc+addCol loc i = loc + i++mkLoc :: Line -> Col -> Loc+mkLoc l c = l * 1000000 + c++getCol :: Loc -> Col+getCol loc = rem loc 1000000++getLin :: Loc -> Line+getLin loc = quot loc 1000000+-}++---------++lexTop :: String -> [Token]+lexTop = layout [] .+ lex (mkLoc 1 1)++-- | Take a location and string and produce a list of tokens+lex :: Loc -> String -> [Token]+lex loc (' ':cs) = lex (addCol loc 1) cs+lex loc ('\n':cs) = tIndent (lex (incrLine loc) cs)+lex loc ('\r':cs) = lex loc cs+lex loc ('{':'-':cs) = skipNest (addCol loc 2) 1 cs+lex loc ('-':'-':cs) | isComm rs = skipLine (addCol loc $ 2+length ds) cs+ where+ (ds, rs) = span (== '-') cs+ isComm [] = True+ isComm (d:_) = not (isOperChar d)+lex loc (d:cs) | isLower_ d =+ case span isIdentChar cs of+ (ds, rs) -> tIdent loc [] (d:ds) (lex (addCol loc $ 1 + length ds) rs)+lex loc cs@(d:_) | isUpper d = upperIdent loc loc [] cs+lex loc ('0':x:cs) | toLower x == 'x' = hexNumber loc cs+lex loc ('-':cs@(d:_)) | isDigit d = number loc "-" cs+lex loc cs@(d:_) | isDigit d = number loc "" cs+lex loc (d:cs) | isOperChar d =+ case span isOperChar cs of+ (ds, rs) -> TIdent loc [] (d:ds) : lex (addCol loc $ 1 + length ds) rs+lex loc (d:cs) | isSpec d = TSpec loc d : lex (addCol loc 1) cs+lex loc ('"':cs) =+ case takeChars loc (TString loc) '"' 0 [] cs of+ (t, n, rs) -> t : lex (addCol loc $ 2 + n) rs+lex loc ('\'':cs) =+ let tchar [c] = TChar loc c+ tchar _ = TError loc "Illegal Char literal"+ in case takeChars loc tchar '\'' 0 [] cs of -- XXX head of+ (t, n, rs) -> t : lex (addCol loc $ 2 + n) rs+lex loc (d:_) = [TError loc $ "Unrecognized input: " ++ show d]+lex _ [] = []++hexNumber :: Loc -> String -> [Token]+hexNumber loc cs =+ case span isHexDigit cs of+ (ds, rs) -> TInt loc (readHex ds) : lex (addCol loc $ length ds + 2) rs++number :: Loc -> String -> String -> [Token] -- neg="-" means negative, neg=0 means positive+number loc sign cs =+ case span isDigit cs of+ (ds, rs) | null rs || not (head rs == '.') || (take 2 rs) == ".." ->+ let s = sign ++ ds+ i = readInteger s+ in TInt loc i : lex (addCol loc $ length s) rs+ | otherwise ->+ case span isDigit (tail rs) of+ (ns, rs') ->+ let s = sign ++ ds ++ '.':ns+ mkD x r = TRat loc (readRational x) : lex (addCol loc $ length x) r+ in case expo rs' of+ Nothing -> mkD s rs'+ Just (es, rs'') -> mkD (s ++ es) rs''+ where+ expo (e:'-':xs@(d:_)) | toLower e == 'e' && isDigit d = Just ('e':'-':as, bs) where (as, bs) = span isDigit xs+ expo (e:'+':xs@(d:_)) | toLower e == 'e' && isDigit d = Just ('e':'+':as, bs) where (as, bs) = span isDigit xs+ expo (e: xs@(d:_)) | toLower e == 'e' && isDigit d = Just ('e': as, bs) where (as, bs) = span isDigit xs+ expo _ = Nothing++-- Skip a {- -} style comment+skipNest :: Loc -> Int -> String -> [Token]+skipNest loc 0 cs = lex loc cs+skipNest loc n ('{':'-':cs) = skipNest (addCol loc 2) (n + 1) cs+skipNest loc n ('-':'}':cs) = skipNest (addCol loc 2) (n - 1) cs+skipNest loc n ('\n':cs) = skipNest (incrLine loc) n cs+skipNest loc n ('\r':cs) = skipNest loc n cs+skipNest loc n (_:cs) = skipNest (addCol loc 1) n cs+skipNest loc _ [] = [TError loc "Unclosed {- comment"]++-- Skip a -- style comment+skipLine :: Loc -> String -> [Token]+skipLine loc cs@('\n':_) = lex loc cs+skipLine loc (_:cs) = skipLine loc cs+skipLine _ [] = []++-- | Takes a list of tokens and produces a list of tokens. If the first token in+-- the input list is a TIndent, the input is returned unaltered. Otherwise, a+-- TIndent is prepended to the input list +tIndent :: [Token] -> [Token]+tIndent ts@(TIndent _ : _) = ts+tIndent ts = TIndent (tokensLoc ts) : ts++takeChars :: Loc -> (String -> Token) -> Char -> Int -> String -> String -> (Token, Int, String)+takeChars loc _ c n _ [] = (TError loc ("Unmatched " ++ [c]), n, [])+takeChars loc fn c n str ('\\':cs) =+ case decodeChar (n+1) cs of+ (d, m, rs) -> takeChars loc fn c m (d:str) rs+takeChars _ fn c n str (d:cs) | c == d = (fn (reverse str), n, cs)+takeChars loc fn c n str (d:cs) = takeChars loc fn c (n+1) (d:str) cs++decodeChar :: Int -> String -> (Char, Int, String)+decodeChar n ('n':cs) = ('\n', n+1, cs)+decodeChar n ('r':cs) = ('\r', n+1, cs)+decodeChar n ('t':cs) = ('\t', n+1, cs)+decodeChar n ('b':cs) = ('\b', n+1, cs)+decodeChar n (c :cs) = (c, n+1, cs)+decodeChar n [] = ('X', n, [])++isSpec :: Char -> Bool+isSpec c = elem c "()[],{}`;"++upperIdent :: Loc -> Loc -> [String] -> String -> [Token]+--upperIdent l c qs acs | trace (show (l, c, qs, acs)) False = undefined+upperIdent loc sloc qs acs =+ case span isIdentChar acs of+ (ds, rs) ->+ case rs of+ '.':cs@(d:_) | isUpper d -> upperIdent (addCol loc $ 1 + length ds) sloc (ds:qs) cs+ | isLower d -> ident isIdentChar+ | isOperChar d -> ident isOperChar+ where {+ ident p =+ case span p cs of+ (xs, ys) -> tIdent sloc (reverse (ds:qs)) xs (lex (addCol loc $ 1 + length ds + length xs) ys)+ }+ _ -> TIdent sloc (reverse qs) ds : lex (addCol loc $ length ds) rs++tIdent :: Loc -> [String] -> String -> [Token] -> [Token]+tIdent loc qs kw ats | elem kw ["let", "where", "do", "of"]+ = ti : tBrace ats+ | otherwise = ti : ats+ where {+ ti = TIdent loc qs kw;++ tBrace ts@(TSpec _ '{' : _) = ts;+ tBrace ts@(TIndent _ : TSpec _ '{' : _) = ts;+ tBrace (TIndent _ : ts) = TBrace (tokensLoc ts) : ts;+ tBrace ts = TBrace (tokensLoc ts) : ts+ }++tokensLoc :: [Token] -> Loc+tokensLoc (TIdent loc _ _:_) = loc+tokensLoc (TString loc _ :_) = loc+tokensLoc (TChar loc _ :_) = loc+tokensLoc (TInt loc _ :_) = loc+tokensLoc (TRat loc _ : _) = loc+tokensLoc (TSpec loc _ :_) = loc+tokensLoc (TError loc _ :_) = loc+tokensLoc (TBrace loc :_) = loc+tokensLoc (TIndent loc :_) = loc+tokensLoc [] = mkLoc 0 1++-- | This is the magical layout resolver, straight from the Haskell report.+layout :: [Int] -> [Token] -> [Token]+layout mms@(m : ms) tts@(TIndent x : ts) | n == m = TSpec (tokensLoc ts) ';' : layout mms ts+ | n < m = TSpec (tokensLoc ts) '}' : layout ms tts where {n = getCol x}+layout ms (TIndent _ : ts) = layout ms ts+layout mms@(m : _) (TBrace x : ts) | n > m = TSpec (tokensLoc ts) '{' : layout (n:mms) ts where {n = getCol x}+layout [] (TBrace x : ts) | n > 0 = TSpec (tokensLoc ts) '{' : layout [n] ts where {n = getCol x}+layout (0 : ms) (t@(TSpec _ '}') : ts) = t : layout ms ts +layout _ ( (TSpec l '}') : _) = TError l "layout error }": []+layout ms (t@(TSpec _ '{') : ts) = t : layout (0:ms) ts+layout ms (t : ts) = t : layout ms ts+layout (_ : ms) [] = TSpec (mkLoc 0 0) '}' : layout ms []+layout [] [] = []++readHex :: String -> Integer+readHex = foldl (\ r c -> r * 16 + toInteger (digitToInt c)) 0
+ src/MicroHs/Main.hs view
@@ -0,0 +1,129 @@+-- Copyright 2023 Lennart Augustsson+-- See LICENSE file for full license.+{-# OPTIONS_GHC -Wno-unused-do-bind #-}+module MicroHs.Main(main) where+import Prelude+--Ximport Data.List+import Control.DeepSeq+import Control.Monad+import Data.Maybe+import System.Environment+import MicroHs.Compile+import MicroHs.Exp+import MicroHs.Ident+import qualified MicroHs.IdentMap as M+import MicroHs.Translate+import MicroHs.Interactive+import MicroHs.MakeCArray+import System.Directory+import System.IO+import System.Process+--Ximport Compat++-- Version number of combinator file.+-- Must match version in eval.c.+combVersion :: String+combVersion = "v5.1\n"++mhsVersion :: String+mhsVersion = "0.8"++main :: IO ()+main = do+ aargs <- getArgs+ mdir <- lookupEnv "MHSDIR"+ let dir = fromMaybe "." mdir+ let+ args = takeWhile (/= "--") aargs+ ss = filter ((/= "-") . take 1) args+ flags = Flags (length (filter (== "-v") args))+ (elem "-r" args)+ ("." : (dir ++ "/lib") : catMaybes (map (stripPrefix "-i") args))+ (head $ catMaybes (map (stripPrefix "-o") args) ++ ["out.comb"])+ (elem "-l" args)+ (elem "-c" args)+ if "--version" `elem` args then+ putStrLn $ "MicroHs, version " ++ mhsVersion ++ ", combinator file version " ++ combVersion+ else+ case ss of+ [] -> mainInteractive flags+ [s] -> mainCompile dir flags (mkIdentSLoc (SLoc "command-line" 0 0) s)+ _ -> error "Usage: mhs [-v] [-l] [-r] [-c] [-iPATH] [-oFILE] [ModuleName]"++mainCompile :: FilePath -> Flags -> Ident -> IO ()+mainCompile mhsdir flags mn | compileOnly flags = compileAndSave flags mn+ | otherwise = do+ ds <- compileTop flags mn+ t1 <- getTimeMilli+ let+ mainName = qualIdent mn (mkIdent "main")+ cmdl = (mainName, ds)+ ref i = Var $ mkIdent $ "_" ++ show i+ defs = M.fromList [ (n, ref i) | ((n, _), i) <- zip ds (enumFrom (0::Int)) ]+ findIdent n = fromMaybe (error $ "main: findIdent: " ++ showIdent n) $+ M.lookup n defs+ emain = findIdent mainName+ substv aexp =+ case aexp of+ Var n -> findIdent n+ App f a -> App (substv f) (substv a)+ e -> e+ def :: ((Ident, Exp), Int) -> (String -> String) -> (String -> String)+ def ((_, e), i) r =+ (("((A :" ++ show i ++ " ") ++) . toStringP (substv e) . (") " ++) . r . (")" ++)+ res = foldr def (toStringP emain) (zip ds (enumFrom 0)) ""+ numDefs = M.size defs+ when (verbose flags > 0) $+ putStrLn $ "top level defns: " ++ show numDefs+ when (verbose flags > 1) $+ mapM_ (\ (i, e) -> putStrLn $ showIdent i ++ " = " ++ toStringP e "") ds+ if runIt flags then do+ let+ prg = translateAndRun cmdl+-- putStrLn "Run:"+-- writeSerialized "ser.comb" prg+ prg+-- putStrLn "done"+ else do+ let outData = combVersion ++ show numDefs ++ "\n" ++ res+ seq (length outData) (return ())+ t2 <- getTimeMilli+ when (verbose flags > 0) $+ putStrLn $ "final pass " ++ padLeft 6 (show (t2-t1)) ++ "ms"+ + -- Decode what to do:+ -- * file ends in .comb: write combinator file+ -- * file ends in .c: write C version of combinator+ -- * otherwise, write C file and compile to a binary with cc+ let outFile = output flags+ if ".comb" `isSuffixOf` outFile then+ writeFile outFile outData+ else if ".c" `isSuffixOf` outFile then+ writeFile outFile $ makeCArray outData+ else do+ (fn, h) <- openTmpFile "mhsc.c"+ hPutStr h $ makeCArray outData+ hClose h+ ct1 <- getTimeMilli+ mcc <- lookupEnv "MHSCC"+ let cc = fromMaybe ("cc -w -Wall -O3 " ++ mhsdir ++ "/src/runtime/eval.c $IN -lm -o $OUT") mcc+ cmd = substString "$IN" fn $ substString "$OUT" outFile cc+ when (verbose flags > 0) $+ putStrLn $ "Execute: " ++ show cmd+ callCommand cmd+ removeFile fn+ ct2 <- getTimeMilli+ when (verbose flags > 0) $+ putStrLn $ "C compilation " ++ padLeft 6 (show (ct2-ct1)) ++ "ms"++compileAndSave :: Flags -> Ident -> IO ()+compileAndSave flags mn = do+-- putStrLn "Start"+ (_, cache) <- compileCacheTop flags mn emptyCache+-- putStrLn "compile done"+ () <- seq (rnf cache) (return ())+-- putStrLn "rnf done"+ hout <- openFile (output flags) WriteMode+ hSerialize hout cache+-- putStrLn "write done"+ hClose hout
+ src/MicroHs/MakeCArray.hs view
@@ -0,0 +1,24 @@+-- Copyright 2023 Lennart Augustsson+-- See LICENSE file for full license.+module MicroHs.MakeCArray(makeCArray) where+import Prelude+import Data.Char++chunkify :: Int -> String -> [String]+chunkify _ [] = []+chunkify n xs =+ let (as, bs) = splitAt n xs+ in as : chunkify n bs++showChunk :: [Char] -> String+showChunk = concatMap (\ c -> show (ord c) ++ ",")++makeCArray :: String -> String+makeCArray file =+ let chunks = chunkify 20 file+ in unlines $ ["static unsigned char data[] = {"] +++ map showChunk chunks +++ ["};",+ "unsigned char *combexpr = data;",+ "int combexprlen = " ++ show (length file) ++ ";"+ ]
+ src/MicroHs/Parse.hs view
@@ -0,0 +1,590 @@+-- Copyright 2023 Lennart Augustsson+-- See LICENSE file for full license.+{-# OPTIONS_GHC -Wno-incomplete-uni-patterns -Wno-unused-do-bind #-}+module MicroHs.Parse(pTop, parseDie, parse, pExprTop) where+import Prelude --Xhiding (Monad(..), Applicative(..), MonadFail(..), Functor(..), (<$>))+import Data.Char+import Data.List+import Text.ParserComb as P+import MicroHs.Lex+import MicroHs.Expr+import MicroHs.Ident+--Ximport Compat++type P a = Prsr FilePath Token a++getFileName :: P FilePath+getFileName = get++parseDie :: forall a . --X (Show a) =>+ P a -> FilePath -> String -> a+parseDie p fn file =+ case parse p fn file of+ Left msg -> error msg+ Right a -> a++parse :: forall a . --X (Show a) =>+ P a -> FilePath -> String -> Either String a+parse p fn file =+ let { ts = lexTop file } in+ case runPrsr fn p ts of+ Left lf -> Left $ formatFailed fn ts lf+ Right [(a, _)] -> Right a+ Right as -> Left $ "Ambiguous:"+--X ++ unlines (map (show . fst) as)++getLoc :: P Loc+getLoc = do+ t <- nextToken+ pure (tokensLoc [t])++pTop :: P EModule+pTop = pModule <* eof++pExprTop :: P Expr+pExprTop = pExpr <* eof++pModule :: P EModule+pModule = EModule <$> (pKeyword "module" *> pUQIdentA) <*>+ (pSpec '(' *> esepEndBy pExportItem (pSpec ',') <* pSpec ')') <*>+ (pKeyword "where" *> pBlock pDef)++pQIdent :: P Ident+pQIdent = do+ fn <- getFileName+ let+ is (TIdent loc qs s) | isAlpha_ (head s) = Just (qualName fn loc qs s)+ is _ = Nothing+ satisfyM "QIdent" is++pUIdentA :: P Ident+pUIdentA = do+ fn <- getFileName+ let+ is (TIdent loc [] s) | isUpper (head s) = Just (mkIdentLoc fn loc s)+ is _ = Nothing+ satisfyM "UIdent" is++pUIdent :: P Ident+pUIdent =+ pUIdentA+ <|< pUIdentSpecial++pUIdentSym :: P Ident+pUIdentSym = pUIdent <|< pParens pUSymOper++pUIdentSpecial :: P Ident+pUIdentSpecial = do+ fn <- getFileName+ loc <- getLoc+ let+ mk = mkIdentLoc fn loc+ + (mk . map (const ',') <$> (pSpec '(' *> esome (pSpec ',') <* pSpec ')'))+ <|< (mk "()" <$ (pSpec '(' *> pSpec ')')) -- Allow () as a constructor name+ <|< (mk "[]" <$ (pSpec '[' *> pSpec ']')) -- Allow [] as a constructor name++pUQIdentA :: P Ident+pUQIdentA = do+ fn <- getFileName+ let+ is (TIdent loc qs s) | isUpper (head s) = Just (qualName fn loc qs s)+ is _ = Nothing+ satisfyM "UQIdent" is++pUQIdent :: P Ident+pUQIdent =+ pUQIdentA+ <|< pUIdentSpecial++pLIdent :: P Ident+pLIdent = do+ fn <- getFileName+ let+ is (TIdent loc [] s) | isLower_ (head s) && not (elem s keywords) = Just (mkIdentLoc fn loc s)+ is _ = Nothing+ satisfyM "LIdent" is++pLQIdent :: P Ident+pLQIdent = do+ fn <- getFileName+ let+ is (TIdent loc qs s) | isLower_ (head s) && not (elem s keywords) = Just (qualName fn loc qs s)+ is _ = Nothing+ satisfyM "LQIdent" is++-- Type names can be any operator+pTypeIdentSym :: P Ident+pTypeIdentSym = pUIdent <|< pParens pSymOper++keywords :: [String]+keywords =+ ["case", "class", "data", "default", "do", "else", "forall", "foreign", "if",+ "import", "in", "infix", "infixl", "infixr", "instance",+ "let", "module", "newtype", "of", "primitive", "then", "type", "where"]++pSpec :: Char -> P ()+pSpec c = () <$ satisfy [c] is+ where+ is (TSpec _ d) = c == d+ is _ = False++pSymbol :: String -> P ()+pSymbol sym = () <$ satisfy sym is+ where+ is (TIdent _ [] s) = s == sym+ is _ = False++pOper :: P Ident+pOper = pQSymOper <|< (pSpec '`' *> pQIdent <* pSpec '`')++pQSymOper :: P Ident+pQSymOper = do+ fn <- getFileName+ let+ is (TIdent loc qs s) | not (isAlpha_ (head s)) && not (elem s reservedOps) = Just (qualName fn loc qs s)+ is _ = Nothing+ satisfyM "QSymOper" is++pSymOper :: P Ident+pSymOper = do+ fn <- getFileName+ let+ is (TIdent loc [] s) | not (isAlpha_ (head s)) && not (elem s reservedOps) = Just (mkIdentLoc fn loc s)+ is _ = Nothing+ satisfyM "SymOper" is++pUQSymOper :: P Ident+pUQSymOper = do+ s <- pQSymOper+ guard (isUOper s)+ pure s++isUOper :: Ident -> Bool+isUOper = (== ':') . head . unIdent++pUSymOper :: P Ident+pUSymOper = do+ s <- pSymOper+ guard (isUOper s)+ pure s++pLQSymOper :: P Ident+pLQSymOper = do+ s <- pQSymOper+ guard (not (isUOper s))+ pure s++-- Allow -> as well+pLQSymOperArr :: P Ident+pLQSymOperArr = pLQSymOper <|< pQArrow++-- Parse ->, possibly qualified+pQArrow :: P Ident+pQArrow = do+ fn <- getFileName+ let+ is (TIdent loc qs s@"->") = Just (qualName fn loc qs s)+ is _ = Nothing+ satisfyM "->" is++pLSymOper :: P Ident+pLSymOper = do+ s <- pSymOper+ guard (not (isUOper s))+ pure s++reservedOps :: [String]+reservedOps = ["=", "|", "::", "<-", "@", "..", "->"]++pUQIdentSym :: P Ident+pUQIdentSym = pUQIdent <|< pParens pUQSymOper++pLQIdentSym :: P Ident+pLQIdentSym = pLQIdent <|< pParens pLQSymOperArr++pLIdentSym :: P Ident+pLIdentSym = pLIdent <|< pParens pLSymOper++pParens :: forall a . P a -> P a+pParens p = pSpec '(' *> p <* pSpec ')'++pLit :: P Expr+pLit = do+ fn <- getFileName+ let+ is (TString (l, c) s) = Just (ELit (SLoc fn l c) (LStr s))+ is (TChar (l, c) a) = Just (ELit (SLoc fn l c) (LChar a))+ is (TInt (l, c) i) = Just (ELit (SLoc fn l c) (LInteger i))+ is (TRat (l, c) d) = Just (ELit (SLoc fn l c) (LRat d))+ is _ = Nothing+ satisfyM "literal" is++pString :: P String+pString = satisfyM "string" is+ where+ is (TString _ s) = Just s+ is _ = Nothing++---------------++pExportItem :: P ExportItem+pExportItem =+ ExpModule <$> (pKeyword "module" *> pUQIdent)+ <|< ExpTypeCon <$> (pUQIdentSym <* pSpec '(' <* pSymbol ".." <* pSpec ')')+ <|< ExpType <$> pUQIdentSym+ <|< ExpValue <$> pLQIdentSym++pKeyword :: String -> P ()+pKeyword kw = () <$ satisfy kw is+ where+ is (TIdent _ [] s) = kw == s+ is _ = False++pBlock :: forall a . P a -> P [a]+pBlock p = do+ pSpec '{'+ as <- esepBy p (pSpec ';')+ eoptional (pSpec ';')+ pSpec '}'+ pure as++pDef :: P EDef+pDef =+ Data <$> (pKeyword "data" *> pLHS) <*> ((pSymbol "=" *> esepBy1 pConstr (pSymbol "|"))+ <|< pure [])+ <|< Newtype <$> (pKeyword "newtype" *> pLHS) <*> (pSymbol "=" *> (Constr [] [] <$> pUIdentSym <*> pField))+ <|< Type <$> (pKeyword "type" *> pLHS) <*> (pSymbol "=" *> pType)+ <|< uncurry Fcn <$> pEqns+ <|< Sign <$> (pLIdentSym <* pSymbol "::") <*> pType+ <|< Import <$> (pKeyword "import" *> pImportSpec)+ <|< ForImp <$> (pKeyword "foreign" *> pKeyword "import" *> pKeyword "ccall" *> pString) <*> pLIdent <*> (pSymbol "::" *> pType)+ <|< Infix <$> ((,) <$> pAssoc <*> pPrec) <*> esepBy1 pTypeOper (pSpec ',')+ <|< Class <$> (pKeyword "class" *> pContext) <*> pLHS <*> pFunDeps <*> pWhere pClsBind+ <|< Instance <$> (pKeyword "instance" *> pForall) <*> pContext <*> pTypeApp <*> pWhere pClsBind+ <|< Default <$> (pKeyword "default" *> pParens (esepBy pType (pSpec ',')))+ where+ pAssoc = (AssocLeft <$ pKeyword "infixl") <|< (AssocRight <$ pKeyword "infixr") <|< (AssocNone <$ pKeyword "infix")+ dig (TInt _ ii) | -2 <= i && i <= 9 = Just i where i = _integerToInt ii+ dig _ = Nothing+ pPrec = satisfyM "digit" dig++ pFunDeps = (pSymbol "|" *> esepBy1 pFunDep (pSpec ',')) <|< pure []+ pFunDep = (,) <$> esome pLIdent <*> (pSymbol "->" *> esome pLIdent)+ pField = do+ fs <- pFields+ guard $ either length length fs == 1+ pure fs++pContext :: P [EConstraint]+pContext = (pCtx <* pSymbol "=>") <|< pure []+ where+ pCtx = pParens (emany pType) <|< ((:[]) <$> pTypeApp)++pConstr :: P Constr+pConstr = (Constr <$> pForall <*> pContext <*> pUIdentSym <*> pFields)+ <|< ((\ vs ct t1 c t2 -> Constr vs ct c (Left [t1, t2])) <$>+ pForall <*> pContext <*> pSAType <*> pUSymOper <*> pSAType)++pFields :: P (Either [SType] [(Ident, SType)])+pFields = Left <$> emany pSAType <|<+ Right <$> (pSpec '{' *> esepBy ((,) <$> (pLIdentSym <* pSymbol "::") <*> pSType) (pSpec ',') <* pSpec '}')++pSAType :: P (Bool, EType)+pSAType = (,) <$> pStrict <*> pAType+pSType :: P (Bool, EType)+pSType = (,) <$> pStrict <*> pType+pStrict :: P Bool+pStrict = (True <$ pSymbol "!") <|< pure False++pLHS :: P LHS+pLHS = (,) <$> pTypeIdentSym <*> emany pIdKind+ <|< (\ a c b -> (c, [a,b])) <$> pIdKind <*> pSymOper <*> pIdKind++pImportSpec :: P ImportSpec+pImportSpec =+ let+ pQua = (True <$ pKeyword "qualified") <|< pure False+ in ImportSpec <$> pQua <*> pUQIdentA <*> eoptional (pKeyword "as" *> pUQIdent) <*>+ eoptional ((,) <$> ((True <$ pKeyword "hiding") <|> pure False) <*> pParens (esepEndBy pImportItem (pSpec ',')))++pImportItem :: P ImportItem+pImportItem =+ ImpTypeCon <$> (pUQIdentSym <* pSpec '(' <* pSymbol ".." <* pSpec ')')+ <|< ImpType <$> pUQIdentSym+ <|< ImpValue <$> pLQIdentSym++--------+-- Types++pIdKind :: P IdKind+pIdKind =+ ((\ i -> IdKind i kType) <$> pLIdentSym)+ <|< pParens (IdKind <$> pLIdentSym <*> (pSymbol "::" *> pKind))++pKind :: P EKind+pKind = pType++--+-- Partial copy of pExpr, but that includes '->'.+-- Including '->' in pExprOp interacts poorly with '->'+-- in lambda and 'case'.+pType :: P EType+pType = do+ vs <- pForall+ t <- pTypeOp+ pure $ if null vs then t else EForall vs t++pForall :: P [IdKind]+pForall = (pKeyword "forall" *> esome pIdKind <* pSymbol ".") <|< pure []++pTypeOp :: P EType+pTypeOp = pOperators pTypeOper pTypeArg++pTypeOper :: P Ident+pTypeOper = pOper <|< (mkIdent "->" <$ pSymbol "->") <|< (mkIdent "=>" <$ pSymbol "=>")++pTypeArg :: P EType+pTypeArg = pTypeApp++pTypeApp :: P EType+pTypeApp = do+ f <- pAType+ as <- emany pAType+ mt <- eoptional (pSymbol "::" *> pType)+ let+ r = foldl EApp f as+ pure $ maybe r (ESign r) mt++pAType :: P Expr+pAType =+ (EVar <$> pLQIdentSym)+ <|< (EVar <$> pUQIdentSym)+ <|< pLit+ <|< (eTuple <$> (pSpec '(' *> esepBy1 pType (pSpec ',') <* pSpec ')'))+ <|< (EListish . LList . (:[]) <$> (pSpec '[' *> pType <* pSpec ']')) -- Unlike expressions, only allow a single element.++-------------+-- Patterns++-- Sadly pattern and expression parsing cannot be joined because the+-- use of '->' in 'case' and lambda makes it weird.+-- Instead this is just a copy of some of the expression rules.+-- XXX This can probably be joined with pExpr again now that pType+-- is separate.+pAPat :: P EPat+pAPat =+ (do+ i <- pLIdentSym+ (EAt i <$> (pSymbol "@" *> pAPat)) <|< pure (EVar i)+ )+ <|< (EVar <$> pUQIdentSym)+ <|< pLit+ <|< (eTuple <$> (pSpec '(' *> esepBy1 pPat (pSpec ',') <* pSpec ')'))+ <|< (EListish . LList <$> (pSpec '[' *> esepBy1 pPat (pSpec ',') <* pSpec ']'))++pPat :: P EPat+pPat = pPatOp++pPatOp :: P EPat+pPatOp = pOperators pOper pPatArg++pPatArg :: P EPat+pPatArg = pPatApp++pPatApp :: P EPat+pPatApp = do+ f <- pAPat+ as <- emany pAPat+ guard (null as || isPConApp f)+ pure $ foldl EApp f as++pPatNotVar :: P EPat+pPatNotVar = do+ p <- pPat+ guard (not (isPVar p))+ pure p++-------------++pEqns :: P (Ident, [Eqn])+pEqns = do+ (name, eqn@(Eqn ps alts)) <- pEqn (\ _ _ -> True)+ case (ps, alts) of+ ([], EAlts [_] []) ->+ -- don't collect equations when of the form 'i = e'+ pure (name, [eqn])+ _ -> do+ neqns <- emany (pSpec ';' *> pEqn (\ n l -> n == name && l == length ps))+ pure (name, eqn : map snd neqns)++pEqn :: (Ident -> Int -> Bool) -> P (Ident, Eqn)+pEqn test = do+ (name, pats) <- pEqnLHS+ alts <- pAlts (pSymbol "=")+ guard (test name (length pats))+ pure (name, Eqn pats alts)++pEqnLHS :: P (Ident, [EPat])+pEqnLHS =+ ((,) <$> pLIdentSym <*> emany pAPat)+ <|> -- XXX this <|> causes a slowdown, but is necessary+ pOpLHS+ <|<+ ((\ (i, ps1) ps2 -> (i, ps1 ++ ps2)) <$> pParens pOpLHS <*> emany pAPat)+ where+ pOpLHS = (\ p1 i p2 -> (i, [p1,p2])) <$> pPatApp <*> pLOper <*> pPatApp+ pLOper = do+ i <- pOper+ guard (not (isConIdent i))+ pure i++pAlts :: P () -> P EAlts+pAlts sep = do+ alts <- pAltsL sep+ bs <- pWhere pBind+ pure (EAlts alts bs)+ +pAltsL :: P () -> P [EAlt]+pAltsL sep =+ esome ((,) <$> (pSymbol "|" *> esepBy1 pStmt (pSpec ',')) <*> (sep *> pExpr))+ <|< ((\ e -> [([], e)]) <$> (sep *> pExpr))++pWhere :: P EBind -> P [EBind]+pWhere pb =+ (pKeyword "where" *> pBlock pb)+ <|< pure []++-------------+-- Statements++pStmt :: P EStmt+pStmt =+ (SBind <$> (pPat <* pSymbol "<-") <*> pExpr)+ <|< (SLet <$> (pKeyword "let" *> pBlock pBind))+ <|< (SThen <$> pExpr)++-------------+-- Expressions++pExpr :: P Expr+pExpr = pExprOp++pExprArg :: P Expr+pExprArg = pExprApp <|< pLam <|< pCase <|< pLet <|< pIf <|< pDo++pExprApp :: P Expr+pExprApp = do+ f <- pAExpr+ as <- emany pAExpr+ mt <- eoptional (pSymbol "::" *> pType)+ let+ r = foldl EApp f as+ pure $ maybe r (ESign r) mt++pLam :: P Expr+pLam = eLam <$> (pSymbol "\\" *> esome pAPat) <*> (pSymbol "->" *> pExpr)++pCase :: P Expr+pCase = ECase <$> (pKeyword "case" *> pExpr) <*> (pKeyword "of" *> pBlock pCaseArm)++pCaseArm :: P ECaseArm+pCaseArm = (,) <$> pPat <*> pAlts (pSymbol "->")++pLet :: P Expr+pLet = ELet <$> (pKeyword "let" *> pBlock pBind) <*> (pKeyword "in" *> pExpr)++pDo :: P Expr+pDo = EDo <$> ((Just <$> pQualDo) <|< (Nothing <$ pKeyword "do")) <*> pBlock pStmt++pIf :: P Expr+pIf = EIf <$> (pKeyword "if" *> pExpr) <*> (pKeyword "then" *> pExpr) <*> (pKeyword "else" *> pExpr)++pQualDo :: P Ident+pQualDo = do+ fn <- getFileName+ let+ is (TIdent loc qs@(_:_) "do") = Just (mkIdentLoc fn loc (intercalate "." qs))+ is _ = Nothing+ satisfyM "QualDo" is++pOperComma :: P Ident+pOperComma = pOper <|< pComma+ where+ pComma = mkIdentLoc <$> getFileName <*> getLoc <*> ("," <$ pSpec ',')++pAExpr :: P Expr+pAExpr = (+ (EVar <$> pLQIdentSym)+ <|< (EVar <$> pUQIdentSym)+ <|< pLit+ <|< (eTuple <$> (pSpec '(' *> esepBy1 pExpr (pSpec ',') <* pSpec ')'))+ <|< EListish <$> (pSpec '[' *> pListish <* pSpec ']')+ <|< (ESectL <$> (pSpec '(' *> pExprArg) <*> (pOperComma <* pSpec ')'))+ <|< (ESectR <$> (pSpec '(' *> pOperComma) <*> (pExprArg <* pSpec ')'))+ <|< (ELit noSLoc . LPrim <$> (pKeyword "primitive" *> pString))+ )+ -- This weirdly slows down parsing+ -- <?> "aexpr"++pListish :: P Listish+pListish = do+ e1 <- pExpr+ let+ pMore = do+ e2 <- pExpr+ ((\ es -> LList (e1:e2:es)) <$> esome (pSpec ',' *> pExpr))+ <|< (LFromThenTo e1 e2 <$> (pSymbol ".." *> pExpr))+ <|< (LFromThen e1 e2 <$ pSymbol "..")+ <|< pure (LList [e1,e2])+ (pSpec ',' *> pMore)+ <|< (LCompr e1 <$> (pSymbol "|" *> esepBy1 pStmt (pSpec ',')))+ <|< (LFromTo e1 <$> (pSymbol ".." *> pExpr))+ <|< (LFrom e1 <$ pSymbol "..")+ <|< pure (LList [e1])++pExprOp :: P Expr+pExprOp = pOperators pOper pExprArg++pOperators :: P Ident -> P Expr -> P Expr+pOperators oper one = eOper <$> one <*> emany ((,) <$> oper <*> one)+ where eOper e [] = e+ eOper e ies = EOper e ies++-------------+-- Bindings++pBind :: P EBind+pBind = + BPat <$> (pPatNotVar <* pSymbol "=") <*> pExpr+ <|< pClsBind++pClsBind :: P EBind+pClsBind = + uncurry BFcn <$> pEqns+ <|< BSign <$> (pLIdentSym <* pSymbol "::") <*> pType++-------------++eTuple :: [Expr] -> Expr+eTuple [] = error "eTuple"+eTuple [e] = e+eTuple es = ETuple es++isAlpha_ :: Char -> Bool+isAlpha_ c = isLower_ c || isUpper c++qualName :: FilePath -> Loc -> [String] -> String -> Ident+qualName fn loc qs s = mkIdentLoc fn loc (intercalate "." (qs ++ [s]))++-------------++formatFailed :: String -> [Token] -> LastFail Token -> String+formatFailed fn _fs (LastFail _ ts msgs) =+ let+ (line, col) = tokensLoc ts+ sloc = SLoc fn line col+ in+ showSLoc sloc ++ ":\n"+ ++ " found: " ++ head (map showToken ts ++ ["EOF"]) ++ "\n"+ ++ " expected: " ++ unwords (nub msgs)
+ src/MicroHs/StateIO.hs view
@@ -0,0 +1,67 @@+-- Copyright 2023 Lennart Augustsson+-- See LICENSE file for full license.+{-# OPTIONS_GHC -Wno-unused-imports -Wno-dodgy-imports #-}+-- State monad over IO+module MicroHs.StateIO(+ module MicroHs.StateIO,+ module Control.Applicative,+ module Control.Monad,+ module Data.Functor,+ ) where+import Prelude+import Control.Applicative+import Control.Monad+import Data.Functor --Xhiding(unzip)++data StateIO s a = S (s -> IO (a,s))++runStateIO :: forall s a . StateIO s a -> (s -> IO (a,s))+runStateIO sa =+ case sa of+ S x -> x++{-+execStateIO :: forall s a . StateIO s a -> s -> IO s+execStateIO sa s = do+ as <- runStateIO sa s+ case as of+ (_, ss) -> return ss+-}++instance forall s . Functor (StateIO s) where+ fmap f sa = S $ \ s -> do+ (a, ss) <- runStateIO sa s+ return (f a, ss)++instance forall s . Applicative (StateIO s) where+ pure a = S $ \ s -> return (a, s)+ (<*>) = ap+ (*>) m k = S $ \ s -> do+ (_, ss) <- runStateIO m s+ runStateIO k ss++instance forall s . Monad (StateIO s) where+ (>>=) m k = S $ \ s -> do+ (a, ss) <- runStateIO m s+ runStateIO (k a) ss+ (>>) = (*>)++instance forall s . MonadFail (StateIO s) where+ fail = error++gets :: forall s a . (s -> a) -> StateIO s a+gets f = S $ \ s -> return (f s, s)++modify :: forall s . (s -> s) -> StateIO s ()+modify f = S $ \ s -> return ((), f s)++put :: forall s . s -> StateIO s ()+put s = S $ \ _ -> return ((), s)++get :: forall s . StateIO s s+get = S $ \ s -> return (s, s)++liftIO :: forall s a . IO a -> StateIO s a+liftIO io = S $ \ s -> do+ a <- io+ return (a, s)
+ src/MicroHs/TCMonad.hs view
@@ -0,0 +1,31 @@+{-# OPTIONS_GHC -Wno-orphans -Wno-dodgy-imports -Wno-unused-imports #-}+module MicroHs.TCMonad(+ TC, tcRun,+ fmap, (<$>), (<*>),+ (>>=), (>>), return, fail,+ get, put, gets,+ mapM, mapM_,+ sequence,+ when,+ tcError+ ) where+--Ximport Control.Monad hiding(ap)+--Ximport Data.Functor.Identity+--Ximport GHC.Stack+import Data.Char -- for String+import Control.Applicative+import Control.Monad.State.Strict --Xhiding(ap)+import Data.Functor+import MicroHs.Ident+import MicroHs.Expr++type TC s a = State s a++tcRun :: forall s a . TC s a -> s -> (a, s)+tcRun = runState++tcError :: --XHasCallStack =>+ forall s a . SLoc -> String -> TC s a+tcError = errorMessage++--Xinstance MonadFail Identity where fail = error
+ src/MicroHs/Translate.hs view
@@ -0,0 +1,135 @@+-- Copyright 2023 Lennart Augustsson+-- See LICENSE file for full license.+module MicroHs.Translate(+ translate, translateAndRun+ ) where+import Prelude+import Data.Maybe+import qualified MicroHs.IdentMap as M+import System.Environment+import Unsafe.Coerce+--Ximport GHC.Types+--Ximport Compat+--Ximport PrimTable++import MicroHs.Desugar(LDef, encodeInteger)+import MicroHs.Expr+import MicroHs.Exp+import MicroHs.Ident++translateAndRun :: (Ident, [LDef]) -> IO ()+--translateAndRun :: (Ident, [(Ident, Exp)]) -> IO ()+translateAndRun defs = do+ -- Drop all argument up to '--'+ args <- getArgs+ let prog = unsafeCoerce $ translate defs+ withDropArgs (length (takeWhile (/= "--") args) + 1)+ prog++translate :: (Ident, [LDef]) -> Any+--translate :: (Ident, [(Ident, Exp)]) -> Any+translate (mainName, ds) =+ let+ look m n = fromMaybe (error $ "translate: not found " ++ showIdent n) $ M.lookup n m+ mp = M.fromList [(n, trans (look mp) d) | (n, d) <- ds ]+ in look mp mainName++trans :: (Ident -> Any) -> Exp -> Any+trans r ae =+ case ae of+ Var n -> r n+ App f a -> unsafeCoerce (trans r f) (trans r a)+ Lit (LInt i) -> unsafeCoerce i+ Lit (LDouble i) -> unsafeCoerce i+ Lit (LStr s) -> trans r (encodeString s)+ Lit (LPrim p) -> fromMaybe (error $ "trans: no primop " ++ p) $ lookup p primTable+ Lit (LInteger i) -> trans r (encodeInteger i)+ Lit (LForImp s) -> trans r (App (Lit (LPrim "dynsym")) (Lit (LStr s)))+ _ -> error $ "trans: impossible: " ++ show ae++-- Use linear search in this table.+-- 99% of the hits are among the combinators.+primTable :: [(String, Any)]+primTable = [+ ("B", primitive "B"),+ ("O", primitive "O"),+ ("K", primitive "K"),+ ("C'", primitive "C'"),+ ("C", primitive "C"),+ ("A", primitive "A"),+ ("S'", primitive "S'"),+ ("P", primitive "P"),+ ("I", primitive "I"),+ ("S", primitive "S"),+ ("U", primitive "U"),+ ("Y", primitive "Y"),+ ("B'", primitive "B'"),+ ("Z", primitive "Z"),+ ("R", primitive "R"),+ ("+", primitive "+"),+ ("-", primitive "-"),+ ("*", primitive "*"),+ ("quot", primitive "quot"),+ ("rem", primitive "rem"),+ ("uquot", primitive "uquot"),+ ("urem", primitive "urem"),+ ("neg", primitive "neg"),+ ("and", primitive "and"),+ ("or", primitive "or"),+ ("xor", primitive "xor"),+ ("inv", primitive "inv"),+ ("shl", primitive "shl"),+ ("shr", primitive "shr"),+ ("ashr", primitive "ashr"),+ ("subtract", primitive "subtract"),+ ("==", primitive "=="),+ ("/=", primitive "/="),+ ("<", primitive "<"),+ ("<=", primitive "<="),+ (">", primitive ">"),+ (">=", primitive ">="),+ ("u<", primitive "u<"),+ ("u<=", primitive "u<="),+ ("u>", primitive "u>"),+ ("u>=", primitive "u>="),+ ("fadd", primitive "fadd"),+ ("fsub", primitive "fsub"),+ ("fmul", primitive "fmul"),+ ("fdiv", primitive "fdiv"),+ ("feq", primitive "feq"),+ ("fne", primitive "fne"),+ ("flt", primitive "flt"),+ ("fle", primitive "fle"),+ ("fgt", primitive "fgt"),+ ("fge", primitive "fge"),+ ("fneg", primitive "fneg"),+ ("fshow", primitive "fshow"),+ ("fread", primitive "fread"),+ ("itof", primitive "itof"),+ ("seq", primitive "seq"),+ ("error", primitive "error"),+ ("equal", primitive "equal"),+ ("compare", primitive "compare"),+ ("rnf", primitive "rnf"),+ ("noMatch", primitive "noMatch"),+ ("noDefault", primitive "noDefault"),+ ("IO.>>=", primitive "IO.>>="),+ ("IO.>>", primitive "IO.>>"),+ ("IO.return", primitive "IO.return"),+ ("IO.print", primitive "IO.print"),+ ("IO.serialize", primitive "IO.serialize"),+ ("IO.deserialize", primitive "IO.deserialize"),+ ("IO.stdin", primitive "IO.stdin"),+ ("IO.stdout", primitive "IO.stdout"),+ ("IO.stderr", primitive "IO.stderr"),+ ("IO.getArgs", primitive "IO.getArgs"),+ ("IO.dropArgs", primitive "IO.dropArgs"),+ ("IO.performIO", primitive "IO.performIO"),+ ("IO.catch", primitive "IO.catch"),+ ("dynsym", primitive "dynsym"),+ ("newCAString", primitive "newCAString"),+ ("peekCAString", primitive "peekCAString"),+ ("toInt", primitive "toInt"),+ ("toPtr", primitive "toPtr"),+ ("toDbl", primitive "toDbl")+ ]
+ src/MicroHs/TypeCheck.hs view
@@ -0,0 +1,2498 @@+-- Copyright 2023 Lennart Augustsson+-- See LICENSE file for full license.+{-# OPTIONS_GHC -Wno-incomplete-uni-patterns -Wno-unused-imports #-}+{-# LANGUAGE FlexibleContexts #-}+module MicroHs.TypeCheck(+ typeCheck,+ TModule(..), showTModule,+ impossible, impossibleShow,+ mkClassConstructor,+ mkSuperSel,+ bindingsOf,+ boolPrefix,+ listPrefix,+ ) where+import Data.Eq -- XXX why needed?+import Prelude+import Data.Char+import Data.Function+import Data.List+import Data.Maybe+import qualified Data.IntMap as IM+import MicroHs.TCMonad as T+import qualified MicroHs.IdentMap as M+import MicroHs.Ident+import MicroHs.Expr+--Ximport Compat+--Ximport GHC.Stack+--Ximport Debug.Trace++boolPrefix :: String+boolPrefix = "Data.Bool_Type."++listPrefix :: String+listPrefix = "Data.List_Type."++nameInt :: String+nameInt = "Primitives.Int"++nameWord :: String+nameWord = "Primitives.Word"++nameDouble :: String+nameDouble = "Primitives.Double"++nameChar :: String+nameChar = "Primitives.Char"++nameInteger :: String+nameInteger = "Data.Integer_Type.Integer"++nameTypeEq :: String+nameTypeEq = "Primitives.~"++nameImplies :: String+nameImplies = "Primitives.=>"++nameArrow :: String+nameArrow = "Primitives.->"++----------------------++data TModule a = TModule+ IdentModule -- module names+ [FixDef] -- all fixities, exported or not+ [TypeExport] -- exported types+ [SynDef] -- all type synonyms, exported or not+ [ClsDef] -- all classes+ [InstDef] -- all instances+ [ValueExport] -- exported values (including from T(..))+ a -- bindings+ --Xderiving (Show)++bindingsOf :: forall a . TModule a -> a+bindingsOf (TModule _ _ _ _ _ _ _ a) = a++data TypeExport = TypeExport+ Ident -- unqualified name+ Entry -- symbol table entry+ [ValueExport] -- associated values, i.e., constructors, selectors, methods+ --Xderiving (Show)++data ValueExport = ValueExport+ Ident -- unqualified name+ Entry -- symbol table entry+ --Xderiving (Show)++type FixDef = (Ident, Fixity)+type SynDef = (Ident, EType)+type ClsDef = (Ident, ClassInfo)+type InstDef= (Ident, InstInfo)++type ClassInfo = ([IdKind], [EConstraint], EType, [Ident], [IFunDep]) -- class tyvars, superclasses, class kind, methods, fundeps+type IFunDep = ([Bool], [Bool]) -- the length of the lists is the number of type variables++-- Symbol table entry for symbol i.+data Entry = Entry+ Expr -- convert (EVar i) to this expression; sometimes just (EVar i)+ EType -- type/kind of identifier+ --Xderiving(Show)++instance Eq Entry where+ Entry x _ == Entry y _ = getIdent x == getIdent y+++entryType :: Entry -> EType+entryType (Entry _ t) = t++type ValueTable = SymTab Entry -- type of value identifiers, used during type checking values+type TypeTable = SymTab Entry -- kind of type identifiers, used during kind checking types+type KindTable = SymTab Entry -- sort of kind identifiers, used during sort checking kinds+type SynTable = M.Map EType -- body of type synonyms+type FixTable = M.Map Fixity -- precedence and associativity of operators+type AssocTable = M.Map [Ident] -- maps a type identifier to its associated construcors/selectors/methods+type ClassTable = M.Map ClassInfo -- maps a class identifier to its associated information+type InstTable = M.Map InstInfo -- indexed by class name+type Constraints= [(Ident, EConstraint)]+type Defaults = [EType] -- Current defaults++-- To make type checking fast it is essential to solve constraints fast.+-- The naive implementation of InstInfo would be [InstDict], but+-- that is slow.+-- Instead, the data structure is specialized+-- * For single parameter type classes for atomic types, e.g., Eq Int+-- we use the type name (i.e., Int) to index into a map that gives+-- the dictionary directly. This map is also used for dictionary arguments+-- of type, e.g., Eq a.+-- * NOT IMPLEMENTED: look up by type name of the left-most type+-- * As a last resort, just look through dictionaries.+data InstInfo = InstInfo+ (M.Map Expr) -- map for direct lookup of atomic types+ [InstDict] -- slow path+ [IFunDep]+ --Xderiving (Show)++-- This is the dictionary expression, instance variables, instance context,+-- and instance.+type InstDictC = (Expr, [IdKind], [EConstraint], EConstraint, [IFunDep])+-- This is the dictionary expression, instance context, and types.+-- An instance (C T1 ... Tn) has the type list [T1,...,Tn]+-- The types and constraint have their type variables normalized to EUVar (-1), EUVar (-2), etc+type InstDict = (Expr, [EConstraint], [EType])++-- All known type equalities, contains the transitive&commutative closure.+type TypeEqTable = [(EType, EType)]++type Sigma = EType+--type Tau = EType+type Rho = EType+type TyVar = Ident++typeCheck :: forall a . [(ImportSpec, TModule a)] -> EModule -> TModule [EDef]+typeCheck aimps (EModule mn exps defs) =+-- trace (unlines $ map (showTModuleExps . snd) aimps) $+ let+ imps = map filterImports aimps+ (fs, ts, ss, cs, is, vs, as) = mkTables imps+ in case tcRun (tcDefs defs) (initTC mn fs ts ss cs is vs as) of+ (tds, tcs) ->+ let+ thisMdl = (mn, mkTModule tds tcs)+ impMdls = [(fromMaybe m mm, tm) | (ImportSpec _ m mm _, tm) <- imps]+ impMap = M.fromList [(i, m) | (i, m) <- thisMdl : impMdls]+ (texps, cexps, vexps) =+ unzip3 $ map (getTVExps impMap (typeTable tcs) (valueTable tcs) (assocTable tcs) (classTable tcs)) exps+ fexps = [ fe | TModule _ fe _ _ _ _ _ _ <- M.elems impMap ]+ sexps = M.toList (synTable tcs)+ iexps = M.toList (instTable tcs)+ in tModule mn (nubBy ((==) `on` fst) (concat fexps)) (concat texps) sexps (concat cexps) iexps (concat vexps) tds++-- A hack to force evaluation of errors.+-- This should be redone to all happen in the T monad.+tModule :: IdentModule -> [FixDef] -> [TypeExport] -> [SynDef] -> [ClsDef] -> [InstDef] -> [ValueExport] -> [EDef] ->+ TModule [EDef]+tModule mn fs ts ss cs is vs ds =+-- trace ("tmodule " ++ showIdent mn ++ ":\n" ++ show vs) $+ tseq ts `seq` vseq vs `seq` TModule mn fs ts ss cs is vs ds+ where+ tseq [] = ()+ tseq (TypeExport _ e _:xs) = e `seq` tseq xs+ vseq [] = ()+ vseq (ValueExport _ e:xs) = e `seq` vseq xs++filterImports :: forall a . (ImportSpec, TModule a) -> (ImportSpec, TModule a)+filterImports it@(ImportSpec _ _ _ Nothing, _) = it+filterImports (imp@(ImportSpec _ _ _ (Just (hide, is))), TModule mn fx ts ss cs ins vs a) =+ let+ keep x xs = elem x xs /= hide+ ivs = [ i | ImpValue i <- is ]+ vs' = filter (\ (ValueExport i _) -> keep i ivs) vs+ cts = [ i | ImpTypeCon i <- is ]+ its = [ i | ImpType i <- is ] ++ cts+ ts' = map (\ te@(TypeExport i e _) -> if keep i cts then te else TypeExport i e []) $+ filter (\ (TypeExport i _ _) -> keep i its) ts+ in+ --trace (show (ts, vs)) $+ (imp, TModule mn fx ts' ss cs ins vs' a)++-- Type and value exports+getTVExps :: forall a . M.Map (TModule a) -> TypeTable -> ValueTable -> AssocTable -> ClassTable -> ExportItem ->+ ([TypeExport], [ClsDef], [ValueExport])+getTVExps impMap _ _ _ _ (ExpModule m) =+ case M.lookup m impMap of+ Just (TModule _ _ te _ ce _ ve _) -> (te, ce, ve)+ _ -> errorMessage (getSLoc m) $ "undefined module: " ++ showIdent m+getTVExps _ tys vals ast cls (ExpTypeCon i) =+ let+ e = expLookup i tys+ qi = tyQIdent e+ ves = getAssocs vals ast qi+ cl = case M.lookup qi cls of+ Just ci -> [(qi, ci)]+ Nothing -> []+ in ([TypeExport i e ves], cl, [])+getTVExps _ tys _ _ cls (ExpType i) =+ let+ e = expLookup i tys+ qi = tyQIdent e+ cl = case M.lookup qi cls of+ Just ci -> [(qi, ci)]+ Nothing -> []+ in ([TypeExport i e []], cl, [])+getTVExps _ _ vals _ _ (ExpValue i) =+ ([], [], [ValueExport i (expLookup i vals)])++-- Export all fixities and synonyms.+-- The synonyms might be needed, and the fixities are harmless+--getFSExps :: forall a . M.Map (TModule a) -> [([FixDef], [SynDef])]+--getFSExps impMap = [ (fe, se) | TModule _ fe _ se _ _ <- M.elems impMap ]++expLookup :: Ident -> SymTab Entry -> Entry+expLookup i m = either (errorMessage (getSLoc i)) id $ stLookup "export" i m++tyQIdent :: Entry -> Ident+tyQIdent (Entry (EVar qi) _) = qi+tyQIdent _ = error "tyQIdent"++eVarI :: SLoc -> String -> Expr+eVarI loc = EVar . mkIdentSLoc loc++getAppCon :: EType -> Ident+getAppCon (EVar i) = i+getAppCon (EApp f _) = getAppCon f+getAppCon _ = error "getAppCon"++getApp :: EType -> (Ident, [EType])+getApp = loop []+ where loop as (EVar i) = (i, as)+ loop as (EApp f a) = loop (a:as) f+ loop _ _ = error "getApp"++-- Construct a dummy TModule for the currently compiled module.+-- It has all the relevant export tables.+-- The value&type export tables will later be filtered through the export list.+mkTModule :: forall a . [EDef] -> TCState -> TModule a+mkTModule tds tcs =+ let+ mn = moduleName tcs+ tt = typeTable tcs+ at = assocTable tcs+ vt = valueTable tcs+ ct = classTable tcs+ it = instTable tcs++ -- Find the Entry for a type.+ tentry i =+ case stLookup "" (qualIdent mn i) tt of+ Right e -> e+ _ -> impossible+ -- Find all value Entry for names associated with a type.+ assoc i = getAssocs vt at (qualIdent mn i)++ -- All top level values possible to export.+ ves = [ ValueExport i (Entry (EVar (qualIdent mn i)) ts) | Sign i ts <- tds ]++ -- All top level types possible to export.+ tes =+ [ TypeExport i (tentry i) (assoc i) | Data (i, _) _ <- tds ] +++ [ TypeExport i (tentry i) (assoc i) | Newtype (i, _) _ <- tds ] +++ [ TypeExport i (tentry i) (assoc i) | Class _ (i, _) _ _ <- tds ] +++ [ TypeExport i (tentry i) [] | Type (i, _) _ <- tds ]++ -- All type synonym definitions.+ ses = [ (qualIdent mn i, EForall vs t) | Type (i, vs) t <- tds ]++ -- All fixity declaration.+ fes = [ (qualIdent mn i, fx) | Infix fx is <- tds, i <- is ]++ -- All classes+ -- XXX only export the locally defined classes+ ces = M.toList ct++ -- All instances+ ies = M.toList it+ in TModule mn fes tes ses ces ies ves impossible++-- Find all value Entry for names associated with a type.+getAssocs :: ValueTable -> AssocTable -> Ident -> [ValueExport]+getAssocs vt at ai =+ let qis = fromMaybe [] $ M.lookup ai at+ val qi = case stLookup "" qi vt of+ Right e -> e+ _ -> impossible+ in map (\ qi -> ValueExport (unQualIdent qi) (val qi)) qis++mkTables :: forall a . [(ImportSpec, TModule a)] ->+ (FixTable, TypeTable, SynTable, ClassTable, InstTable, ValueTable, AssocTable)+mkTables mdls =+ let+ qns (ImportSpec q _ mas _) mn i =+ let+ m = fromMaybe mn mas+ in if q then [qualIdent m i] else [i, qualIdent m i]+ allValues :: ValueTable+ allValues =+ let+ syms (is, TModule mn _ tes _ cls _ ves _) =+ [ (v, [e]) | ValueExport i e <- ves, v <- qns is mn i ] +++ [ (v, [e]) | TypeExport _ _ cs <- tes, ValueExport i e <- cs, v <- qns is mn i ] +++ [ (v, [Entry (EVar v) t]) | (i, (_, _, t, _, _)) <- cls, let { v = mkClassConstructor i } ]+ in stFromListWith union $ concatMap syms mdls+ allSyns =+ let+ syns (_, TModule _ _ _ ses _ _ _ _) = ses+ in M.fromList (concatMap syns mdls)+ allTypes :: TypeTable+ allTypes =+ let+ types (is, TModule mn _ tes _ _ _ _ _) = [ (v, [e]) | TypeExport i e _ <- tes, v <- qns is mn i ]+ in stFromListWith union $ concatMap types mdls+ allFixes =+ let+ fixes (_, TModule _ fes _ _ _ _ _ _) = fes+ in M.fromList (concatMap fixes mdls)+ allAssocs :: AssocTable+ allAssocs =+ let+ assocs (ImportSpec _ _ mas _, TModule mn _ tes _ _ _ _ _) =+ let+ m = fromMaybe mn mas+ in [ (qualIdent m i, [qualIdent m a | ValueExport a _ <- cs]) | TypeExport i _ cs <- tes ]+ in M.fromList $ concatMap assocs mdls+ allClasses :: ClassTable+ allClasses =+ let+ clss (_, TModule _ _ _ _ ces _ _ _) = ces+ in --(\ m -> trace ("allClasses: " ++ showListS showIdentClassInfo (M.toList m)) m) $+ M.fromList $ concatMap clss mdls+ allInsts :: InstTable+ allInsts =+ let+ insts (_, TModule _ _ _ _ _ ies _ _) = ies+ in M.fromListWith mergeInstInfo $ concatMap insts mdls+ in (allFixes, allTypes, allSyns, allClasses, allInsts, allValues, allAssocs)++mergeInstInfo :: InstInfo -> InstInfo -> InstInfo+mergeInstInfo (InstInfo m1 l1 fds) (InstInfo m2 l2 _) =+ let+ m = foldr (uncurry $ M.insertWith mrg) m2 (M.toList m1)+ mrg e1 _e2 = e1 -- XXX improve this if eqExpr e1 e2 then e1 else errorMessage (getSLoc e1) $ "Multiple instances: " ++ showSLoc (getSLoc e2)+ l = unionBy eqInstDict l1 l2+ in InstInfo m l fds++getIdent :: Expr -> Ident+getIdent ae =+ case ae of+ EVar i -> i+ ECon c -> conIdent c+ _ -> impossible++-- Approximate equality for dictionaries.+-- The important thing is to avoid exact duplicates in the instance table.+eqInstDict :: InstDict -> InstDict -> Bool+eqInstDict (e, _, _) (e', _, _) = eqExpr e e'++--------------------------++type Typed a = (a, EType)++data TCState = TC+ IdentModule -- current module name+ Int -- unique number+ FixTable -- fixities, indexed by QIdent+ TypeTable -- type symbol table+ SynTable -- synonyms, indexed by QIdent+ ValueTable -- value symbol table+ AssocTable -- values associated with a type, indexed by QIdent+ (IM.IntMap EType) -- mapping from unique id to type+ TCMode -- pattern, value, or type+ ClassTable -- class info, indexed by QIdent+ (InstTable, -- instances+ TypeEqTable) -- type equalities+ Constraints -- constraints that have to be solved+ Defaults -- current defaults+ --Xderiving (Show)++data TCMode = TCExpr | TCType+ --Xderiving (Show)++typeTable :: TCState -> TypeTable+typeTable (TC _ _ _ tt _ _ _ _ _ _ _ _ _) = tt++valueTable :: TCState -> ValueTable+valueTable (TC _ _ _ _ _ vt _ _ _ _ _ _ _) = vt++synTable :: TCState -> SynTable+synTable (TC _ _ _ _ st _ _ _ _ _ _ _ _) = st++fixTable :: TCState -> FixTable+fixTable (TC _ _ ft _ _ _ _ _ _ _ _ _ _) = ft++assocTable :: TCState -> AssocTable+assocTable (TC _ _ _ _ _ _ ast _ _ _ _ _ _) = ast++uvarSubst :: TCState -> IM.IntMap EType+uvarSubst (TC _ _ _ _ _ _ _ sub _ _ _ _ _) = sub++moduleName :: TCState -> IdentModule+moduleName (TC mn _ _ _ _ _ _ _ _ _ _ _ _) = mn++classTable :: TCState -> ClassTable+classTable (TC _ _ _ _ _ _ _ _ _ ct _ _ _) = ct++tcMode :: TCState -> TCMode+tcMode (TC _ _ _ _ _ _ _ _ m _ _ _ _) = m++instTable :: TCState -> InstTable+instTable (TC _ _ _ _ _ _ _ _ _ _ (is, _) _ _) = is++typeEqTable :: TCState -> TypeEqTable+typeEqTable (TC _ _ _ _ _ _ _ _ _ _ (_, es) _ _) = es++constraints :: TCState -> Constraints+constraints (TC _ _ _ _ _ _ _ _ _ _ _ e _) = e++defaults :: TCState -> Defaults+defaults (TC _ _ _ _ _ _ _ _ _ _ _ _ ds) = ds++putValueTable :: ValueTable -> T ()+putValueTable venv = do+ TC mn n fx tenv senv _ ast sub m cs is es ds <- get+ put (TC mn n fx tenv senv venv ast sub m cs is es ds)++putTypeTable :: TypeTable -> T ()+putTypeTable tenv = do+ TC mn n fx _ senv venv ast sub m cs is es ds <- get+ put (TC mn n fx tenv senv venv ast sub m cs is es ds)++putSynTable :: SynTable -> T ()+putSynTable senv = do+ TC mn n fx tenv _ venv ast sub m cs is es ds <- get+ put (TC mn n fx tenv senv venv ast sub m cs is es ds)++putUvarSubst :: IM.IntMap EType -> T ()+putUvarSubst sub = do+ TC mn n fx tenv senv venv ast _ m cs is es ds <- get+ put (TC mn n fx tenv senv venv ast sub m cs is es ds)++putTCMode :: TCMode -> T ()+putTCMode m = do+ TC mn n fx tenv senv venv ast sub _ cs is es ds <- get+ put (TC mn n fx tenv senv venv ast sub m cs is es ds)++putInstTable :: InstTable -> T ()+putInstTable is = do+ TC mn n fx tenv senv venv ast sub m cs (_,eqs) es ds <- get+ put (TC mn n fx tenv senv venv ast sub m cs (is,eqs) es ds)++putTypeEqTable :: TypeEqTable -> T ()+putTypeEqTable eqs = do+ TC mn n fx tenv senv venv ast sub m cs (is,_) es ds <- get+ put (TC mn n fx tenv senv venv ast sub m cs (is,eqs) es ds)++putConstraints :: Constraints -> T ()+putConstraints es = do+ TC mn n fx tenv senv venv ast sub m cs is _ ds <- get+ put (TC mn n fx tenv senv venv ast sub m cs is es ds)++putDefaults :: Defaults -> T ()+putDefaults ds = do+ TC mn n fx tenv senv venv ast sub m cs is es _ <- get+ put (TC mn n fx tenv senv venv ast sub m cs is es ds)++withTCMode :: forall a . TCMode -> T a -> T a+withTCMode m ta = do+ om <- gets tcMode+ putTCMode m+ a <- ta+ putTCMode om+ return a++-- Use the type table as the value table, and the primKind table as the type table.+withTypeTable :: forall a . T a -> T a+withTypeTable ta = do+ TC mn n fx tt st vt ast sub m cs is es ds <- get+ put (TC mn n fx primKindTable st tt ast sub m cs is es ds)+ a <- ta+ -- Discard kind table, it will not have changed+ TC mnr nr fxr _kr str ttr astr subr mr csr isr esr dsr <- get+ -- Keep everyting, except that the returned value table+ -- becomes the type tables, and the old type table is restored.+ put (TC mnr nr fxr ttr str vt astr subr mr csr isr esr dsr)+ return a++addAssocTable :: Ident -> [Ident] -> T ()+addAssocTable i ids = do+ TC mn n fx tt st vt ast sub m cs is es ds <- get+ put $ TC mn n fx tt st vt (M.insert i ids ast) sub m cs is es ds++addClassTable :: Ident -> ClassInfo -> T ()+addClassTable i x = do+ TC mn n fx tt st vt ast sub m cs is es ds <- get+ put $ TC mn n fx tt st vt ast sub m (M.insert i x cs) is es ds++addInstTable :: [InstDictC] -> T ()+addInstTable ics = do+ let+ -- Change type variable to unique unification variables.+ -- These unification variables will never leak, but as an extra caution+ -- we use negative numbers..+ freshSubst iks =+ zipWith (\ ik j -> (idKindIdent ik, EUVar j)) iks [-1, -2 ..]++ mkInstInfo :: InstDictC -> T (Ident, InstInfo)+ mkInstInfo (e, iks, ctx, ct, fds) = do+ ct' <- expandSyn ct+ case (iks, ctx, getApp ct') of+ ([], [], (c, [EVar i])) -> return $ (c, InstInfo (M.singleton i e) [] fds)+ (_, _, (c, ts )) -> return $ (c, InstInfo M.empty [(e, ctx', ts')] fds)+ where ctx' = map (subst s) ctx+ ts' = map (subst s) ts+ s = freshSubst iks+ iis <- mapM mkInstInfo ics+ it <- gets instTable+ putInstTable $ foldr (uncurry $ M.insertWith mergeInstInfo) it iis++addConstraint :: Ident -> EConstraint -> T ()+addConstraint d ctx = do+-- traceM $ "addConstraint: " ++ msg ++ " " ++ showIdent d ++ " :: " ++ showEType ctx+ ctx' <- expandSyn ctx+ TC mn n fx tt st vt ast sub m cs is es ds <- get+ put $ TC mn n fx tt st vt ast sub m cs is ((d, ctx') : es) ds++withDicts :: forall a . [(Ident, EConstraint)] -> T a -> T a+withDicts [] ta = ta+withDicts ((i, c):ds) ta = withDict i c $ withDicts ds ta++withDict :: forall a . Ident -> EConstraint -> T a -> T a+withDict i c ta = do+ c' <- expandSyn c >>= derefUVar+ when (not (null (metaTvs [c']))) $ impossible+ case c' of+ (EApp (EApp (EVar eq) t1) t2) | eq == mkIdent nameTypeEq -> withEqDict i t1 t2 ta+ _ -> withInstDict i c' ta++withInstDict :: forall a . Ident -> EConstraint -> T a -> T a+withInstDict i c ta = do+ is <- gets instTable+ ics <- expandDict (EVar i) c+ addInstTable ics+ a <- ta+ putInstTable is+ return a++withEqDict :: forall a . Ident -> EType -> EType -> T a -> T a+withEqDict _i t1 t2 ta = do+ is <- gets typeEqTable+ putTypeEqTable (addTypeEq t1 t2 is)+ a <- ta+ putTypeEqTable is+ return a++initTC :: IdentModule -> FixTable -> TypeTable -> SynTable -> ClassTable -> InstTable -> ValueTable -> AssocTable -> TCState+initTC mn fs ts ss cs is vs as =+-- trace ("**** initTC " ++ showIdent mn ++ ": " ++ showListS (showPairS showIdent showEType) (M.toList ss)) $+ let+ xts = foldr (uncurry stInsertGlb) ts primTypes+ xvs = foldr (uncurry stInsertGlb) vs primValues+ in TC mn 1 fs xts ss xvs as IM.empty TCExpr cs (is,[]) [] []++kTypeS :: EType+kTypeS = kType++kTypeTypeS :: EType+kTypeTypeS = kArrow kType kType++kTypeTypeTypeS :: EType+kTypeTypeTypeS = kArrow kType $ kArrow kType kType++-- (=>) :: Constraint -> Type -> Type+kConstraintTypeTypeS :: EType+kConstraintTypeTypeS = kArrow kConstraint $ kArrow kType kType++-- (~) :: Type -> Type -> Constraint+kTypeTypeConstraintS :: EType+kTypeTypeConstraintS = kArrow kType (kArrow kType kConstraint)++builtinLoc :: SLoc+builtinLoc = SLoc "builtin" 0 0++mkIdentB :: String -> Ident+mkIdentB = mkIdentSLoc builtinLoc++primKindTable :: KindTable+primKindTable =+ let+ entry i = Entry (EVar (mkIdentB i))+ in stFromList [+ -- The kinds are wired in (for now)+ (mkIdentB "Primitives.Type", [entry "Primitives.Type" kTypeS]),+ (mkIdentB "Type", [entry "Primitives.Type" kTypeS]),+ (mkIdentB "Constraint", [entry "Primitives.Constraint" kTypeS]),+ (mkIdentB "Primitives.Constraint", [entry "Primitives.Constraint" kTypeS]),+ (mkIdentB nameArrow, [entry nameArrow kTypeTypeTypeS]),+ (mkIdentB "->", [entry nameArrow kTypeTypeTypeS])+ ]++primTypes :: [(Ident, [Entry])]+primTypes =+ let+ entry i = Entry (EVar (mkIdentB i))+ k = mkIdent "k"+ kv = EVar k+ kk = IdKind k kTypeS+ tuple n =+ let+ i = tupleConstr builtinLoc n+ in (i, [entry (unIdent i) $ EForall [kk] $ foldr kArrow kv (replicate n kv)])+ in+ [+ -- The function arrow et al are bothersome to define in Primitives, so keep them here.+ -- But the fixity is defined in Primitives.+ (mkIdentB "->", [entry nameArrow kTypeTypeTypeS]),+ (mkIdentB "=>", [entry nameImplies kConstraintTypeTypeS]),+ (mkIdentB "~", [entry nameTypeEq kTypeTypeConstraintS]),+ -- Primitives.hs uses the type [], and it's annoying to fix that.+ -- XXX should not be needed+ (mkIdentB (listPrefix ++ "[]"), [entry (listPrefix ++ "[]") kTypeTypeS])+ ] +++ map tuple (enumFromTo 2 10)++primValues :: [(Ident, [Entry])]+primValues =+ let+ tuple n =+ let+ c = tupleConstr builtinLoc n+ vks = [IdKind (mkIdent ("a" ++ show i)) kType | i <- enumFromTo 1 n]+ ts = map tVarK vks+ r = tApps c ts+ in (c, [Entry (ECon $ ConData [(c, n)] c) $ EForall vks $ foldr tArrow r ts ])+ in map tuple (enumFromTo 2 10)++type T a = TC TCState a++tCon :: Ident -> EType+tCon = EVar++tVarK :: IdKind -> EType+tVarK (IdKind i _) = EVar i++tApp :: EType -> EType -> EType+tApp = EApp++tApps :: Ident -> [EType] -> EType+tApps i ts = foldl tApp (tCon i) ts++tArrow :: EType -> EType -> EType+tArrow a r = tApp (tApp (tConI builtinLoc "Primitives.->") a) r++tImplies :: EType -> EType -> EType+tImplies a r = tApp (tApp (tConI builtinLoc "Primitives.=>") a) r++kArrow :: EKind -> EKind -> EKind+kArrow = tArrow++{-+isArrow :: EType -> Bool+isArrow = isJust . getArrow+-}++getArrow :: EType -> Maybe (EType, EType)+getArrow (EApp (EApp (EVar n) a) b) =+ if isIdent "->" n || isIdent "Primitives.->" n then Just (a, b) else Nothing+getArrow _ = Nothing++getImplies :: EType -> Maybe (EType, EType)+getImplies (EApp (EApp (EVar n) a) b) =+ if isIdent "=>" n || isIdent "Primitives.=>" n then Just (a, b) else Nothing+getImplies _ = Nothing++{-+getTuple :: Int -> EType -> Maybe [EType]+getTuple n t = loop t []+ where loop (EVar i) r | isTupleConstr n i && length r == n = Just (reverse r)+ loop (EApp f a) r = loop f (a:r)+ loop _ _ = Nothing+-}++setUVar :: TRef -> EType -> T ()+setUVar i t = do+ TC mn n fx tenv senv venv ast sub m cs is es ds <- get+ put (TC mn n fx tenv senv venv ast (IM.insert i t sub) m cs is es ds)++getUVar :: Int -> T (Maybe EType)+getUVar i = gets (IM.lookup i . uvarSubst)++munify :: --XHasCallStack =>+ SLoc -> Expected -> EType -> T ()+munify loc (Infer r) b = tSetRefType loc r b+munify loc (Check a) b = unify loc a b++expandSyn :: --XHasCallStack =>+ EType -> T EType+expandSyn at =+ let+ syn ts t =+ case t of+ EApp f a -> do+ aa <- expandSyn a+ syn (aa:ts) f+ EVar i -> do+ syns <- gets synTable+ case M.lookup i syns of+ Nothing -> return $ foldl tApp t ts+ Just (EForall vks tt) ->+ if length vks /= length ts then tcError (getSLoc i) $ "bad synonym use"+ --X ++ "\nXX " ++ show (i, vks, ts)+ else expandSyn $ subst (zip (map idKindIdent vks) ts) tt+ Just _ -> impossible+ EUVar _ -> return $ foldl tApp t ts+ ESign a _ -> expandSyn a -- Throw away signatures, they don't affect unification+ EForall iks tt | null ts -> EForall iks <$> expandSyn tt+ _ -> impossible+ in syn [] at++derefUVar :: EType -> T EType+derefUVar at =+ case at of+ EApp f a -> do+ fx <- derefUVar f+ ax <- derefUVar a+ return $ EApp fx ax+ EUVar i -> do+ mt <- getUVar i+ case mt of+ Nothing -> return at+ Just t -> do+ t' <- derefUVar t+ setUVar i t'+ return t'+ EVar _ -> return at+ ESign t k -> flip ESign k <$> derefUVar t+ EForall iks t -> EForall iks <$> derefUVar t+ _ -> impossible++tcErrorTK :: --XHasCallStack =>+ SLoc -> String -> T ()+tcErrorTK loc msg = do+ tcm <- gets tcMode+ let s = case tcm of+ TCType -> "kind"+ _ -> "type"+ tcError loc $ s ++ " error: " ++ msg++unify :: --XHasCallStack =>+ SLoc -> EType -> EType -> T ()+unify loc a b = do+ aa <- expandSyn a+ bb <- expandSyn b+ unifyR loc aa bb++-- XXX should do occur check+unifyR :: --XHasCallStack =>+ SLoc -> EType -> EType -> T ()+unifyR _ (EVar x1) (EVar x2) | x1 == x2 = return ()+unifyR loc (EApp f1 a1) (EApp f2 a2) = do { unifyR loc f1 f2; unifyR loc a1 a2 }+unifyR _ (EUVar r1) (EUVar r2) | r1 == r2 = return ()+unifyR loc (EUVar r1) t2 = unifyVar loc r1 t2+unifyR loc t1 (EUVar r2) = unifyVar loc r2 t1+unifyR loc t1 t2 = do+ tcm <- gets tcMode+ case tcm of+ TCType -> tcErrorTK loc $ "cannot unify " ++ showExpr t1 ++ " and " ++ showExpr t2+ -- Defer to constraint solver.+ -- XXX needs changing if we have kind equalities.+ _ -> addEqConstraint loc t1 t2++unifyVar :: --XHasCallStack =>+ SLoc -> TRef -> EType -> T ()+unifyVar loc r t = do+ mt <- getUVar r+ case mt of+ Nothing -> unifyUnboundVar loc r t+ Just t' -> unify loc t' t++unifyUnboundVar :: --XHasCallStack =>+ SLoc -> TRef -> EType -> T ()+unifyUnboundVar loc r1 at2@(EUVar r2) = do+ -- We know r1 /= r2+ mt2 <- getUVar r2+ case mt2 of+ Nothing -> setUVar r1 at2+ Just t2 -> unify loc (EUVar r1) t2+unifyUnboundVar loc r1 t2 = do+ vs <- getMetaTyVars [t2]+ if elemBy (==) r1 vs then+ tcErrorTK loc $ "cyclic " ++ showExpr (EUVar r1) ++ " = " ++ showExpr t2+ else+ setUVar r1 t2++-- Reset unification map+tcReset :: T ()+tcReset = do+ TC mn u fx tenv senv venv ast _ m cs is es ds <- get+ put (TC mn u fx tenv senv venv ast IM.empty m cs is es ds)++newUVar :: T EType+newUVar = EUVar <$> newUniq++type TRef = Int++newUniq :: T TRef+newUniq = do+ TC mn n fx tenv senv venv ast sub m cs is es ds <- get+ let n' = n+1+ put (seq n' $ TC mn n' fx tenv senv venv ast sub m cs is es ds)+ return n++newIdent :: SLoc -> String -> T Ident+newIdent loc s = do+ u <- newUniq+ return $ mkIdentSLoc loc $ s ++ "$" ++ show u++tLookup :: --XHasCallStack =>+ String -> Ident -> T (Expr, EType)+tLookup msg i = do+ env <- gets valueTable+ case stLookup msg i env of+ Right (Entry e s) -> return (setSLocExpr (getSLoc i) e, s)+ Left e -> do+-- let SymTab m _ = env+-- traceM (showListS showIdent (map fst (M.toList m)))+ tcError (getSLoc i) e++tLookupV :: --XHasCallStack =>+ Ident -> T (Expr, EType)+tLookupV i = do+ tcm <- gets tcMode+ let s = case tcm of+ TCType -> "type"+ _ -> "value"+ tLookup s i++tInst :: (Expr, EType) -> T (Expr, EType)+tInst (ae, EForall vks t) = tInstForall ae vks t >>= tInst+tInst (ae, at) | Just (ctx, t) <- getImplies at = do+ d <- newIdent (getSLoc ae) "dict"+ --traceM $ "tInst: addConstraint: " ++ showIdent d ++ " :: " ++ showEType ctx ++ " " ++ showSLoc loc+ addConstraint d ctx+ tInst (EApp ae (EVar d), t)+tInst at = return at++tInstForall :: Expr -> [IdKind] -> EType -> T (Expr, EType)+tInstForall ae vks t =+ if null vks then+ return (ae, t)+ else do+ let vs = map idKindIdent vks+ us <- mapM (const newUVar) vks+ return (ae, subst (zip vs us) t)++tInst' :: (Expr, EType) -> T (Expr, EType)+tInst' (ae, EForall vks t) = tInstForall ae vks t+tInst' et = return et++extValE :: --XHasCallStack =>+ Ident -> EType -> Expr -> T ()+extValE i t e = do+ venv <- gets valueTable+ putValueTable (stInsertLcl i (Entry e t) venv)++-- Extend the global symbol table with i = e :: t+-- Add both qualified and unqualified versions of i.+extValETop :: --XHasCallStack =>+ Ident -> EType -> Expr -> T ()+extValETop i t e = do+ mn <- gets moduleName+ venv <- gets valueTable+ let qi = qualIdent mn i+ venv' = stInsertGlb qi [Entry e t] venv+ venv'' = stInsertGlb i [Entry e t] venv'+ putValueTable venv''++-- Extend symbol table with i::t.+-- The translation for i will be the qualified name.+-- Add both qualified and unqualified versions of i.+extValQTop :: --XHasCallStack =>+ Ident -> EType -> T ()+extValQTop i t = do+ mn <- gets moduleName+ extValETop i t (EVar (qualIdent mn i))++extVal :: --XHasCallStack =>+ Ident -> EType -> T ()+extVal i t = extValE i t $ EVar i++extVals :: --XHasCallStack =>+ [(Ident, EType)] -> T ()+extVals = mapM_ (uncurry extVal)++extTyp :: Ident -> EType -> T ()+extTyp i t = do+ tenv <- gets typeTable+ putTypeTable (stInsertLcl i (Entry (EVar i) t) tenv)++extTyps :: [(Ident, EType)] -> T ()+extTyps = mapM_ (uncurry extTyp)++extSyn :: Ident -> EType -> T ()+extSyn i t = do+ senv <- gets synTable+ putSynTable (M.insert i t senv)++extFix :: Ident -> Fixity -> T ()+extFix i fx = do+ TC mn n fenv tenv senv venv ast sub m cs is es ds <- get+ put $ TC mn n (M.insert i fx fenv) tenv senv venv ast sub m cs is es ds+ return ()++withExtVal :: forall a . --XHasCallStack =>+ Ident -> EType -> T a -> T a+withExtVal i t ta = do+ venv <- gets valueTable+ extVal i t+ a <- ta+ putValueTable venv+ return a++withExtVals :: forall a . --XHasCallStack =>+ [(Ident, EType)] -> T a -> T a+withExtVals env ta = do+ venv <- gets valueTable+ extVals env+ a <- ta+ putValueTable venv+ return a++withExtTyps :: forall a . [IdKind] -> T a -> T a+withExtTyps iks ta = do+ let env = map (\ (IdKind v k) -> (v, k)) iks+ venv <- gets typeTable+ extTyps env+ a <- ta+ putTypeTable venv+ return a++tcDefs :: [EDef] -> T [EDef]+tcDefs ds = do+ mapM_ tcAddInfix ds+ dst <- tcDefsType ds+ mapM_ addTypeSyn dst+ dst' <- tcExpand dst+-- traceM (showEDefs dst')+ setDefault dst'+ tcDefsValue dst'++setDefault :: [EDef] -> T ()+setDefault defs =+ putDefaults $ last $ [] : [ ts | Default ts <- defs ]++tcAddInfix :: EDef -> T ()+tcAddInfix (Infix fx is) = do+ mn <- gets moduleName+ mapM_ (\ i -> extFix (qualIdent mn i) fx) is+tcAddInfix _ = return ()++-- Check type definitions+tcDefsType :: [EDef] -> T [EDef]+tcDefsType ds = withTypeTable $ do+ dsk <- mapM tcDefKind ds -- Check&rename kinds in all type definitions+ mapM_ addTypeKind dsk -- Add the kind of each type to the environment+ mapM tcDefType dsk -- Kind check all type expressions (except local signatures)++-- Expand class and instance definitions (must be done after type synonym processing)+tcExpand :: [EDef] -> T [EDef]+tcExpand dst = withTypeTable $ do+ dsc <- mapM expandClass dst -- Expand all class definitions+ dsi <- mapM expandInst (concat dsc) -- Expand all instance definitions+ return (concat dsi)++-- Make sure that the kind expressions are well formed.+tcDefKind :: EDef -> T EDef+tcDefKind adef = do+ tcReset+ case adef of+ Data (i, vks) cs -> withVks vks kType $ \ vvks _ -> return $ Data (i, vvks) cs+ Newtype (i, vks) c -> withVks vks kType $ \ vvks _ -> return $ Newtype (i, vvks) c+ Type (i, vks) at ->+ case at of+ ESign t k -> withVks vks k $ \ vvks kr -> return $ Type (i, vvks) (ESign t kr)+ _ -> withVks vks kType $ \ vvks _ -> return $ Type (i, vvks) at+ Class ctx (i, vks) fds ms-> withVks vks kConstraint $ \ vvks _ -> return $ Class ctx (i, vvks) fds ms+ Instance vks ctx t d -> withVks vks kConstraint $ \ vvks _ -> return $ Instance vvks ctx t d+ _ -> return adef++-- Check&rename the given kinds, apply reconstruction at the end+withVks :: forall a . [IdKind] -> EKind -> ([IdKind] -> EKind -> T a) -> T a+withVks vks kr fun = do+ (nvks, nkr) <-+ withTypeTable $ do+ let+ loop r [] = do+ kkr <- tInferTypeT kr+ return (reverse r, kkr)+ loop r (IdKind i k : iks) = do+ kk <- tInferTypeT k+ withExtVal i kk $ loop (IdKind i kk : r) iks+ loop [] vks+ fun nvks nkr++-- Add symbol table entries (with kind) for all top level typeish definitions+addTypeKind :: EDef -> T ()+addTypeKind adef = do+ let+ addAssoc i is = do+ mn <- gets moduleName+ addAssocTable (qualIdent mn i) (map (qualIdent mn) is)+ assocData (Constr _ _ c (Left _)) = [c]+ assocData (Constr _ _ c (Right its)) = c : map fst its+ case adef of+ Data lhs@(i, _) cs -> do+ addLHSKind lhs kType+ addAssoc i (nub $ concatMap assocData cs)+ Newtype lhs@(i, _) c -> do+ addLHSKind lhs kType+ addAssoc i (assocData c)+ Type lhs t -> addLHSKind lhs (getTypeKind t)+ Class _ lhs@(i, _) _ ms -> do+ addLHSKind lhs kConstraint+ addAssoc i [ x | BSign m _ <- ms, x <- [m, mkDefaultMethodId m] ]+ _ -> return ()++getTypeKind :: EType -> EKind+getTypeKind (ESign _ k) = k+getTypeKind _ = kType++addLHSKind :: LHS -> EKind -> T ()+addLHSKind (i, vks) kret =+-- trace ("addLHSKind " ++ showIdent i ++ " :: " ++ showExpr (lhsKind vks kret)) $+ extValQTop i (lhsKind vks kret)++lhsKind :: [IdKind] -> EKind -> EKind+lhsKind vks kret = foldr (\ (IdKind _ k) -> kArrow k) kret vks++-- Add type synonyms to the synonym table+addTypeSyn :: EDef -> T ()+addTypeSyn adef =+ case adef of+ Type (i, vs) t -> do+ let t' = EForall vs t+ extSyn i t'+ mn <- gets moduleName+ extSyn (qualIdent mn i) t'+ _ -> return ()++-- Do kind checking of all typeish definitions.+tcDefType :: EDef -> T EDef+tcDefType d = do+ tcReset+ case d of+ Data lhs@(_, iks) cs -> withVars iks $ Data lhs <$> mapM tcConstr cs+ Newtype lhs@(_, iks) c -> withVars iks $ Newtype lhs <$> tcConstr c+ Type lhs@(_, iks) t -> withVars iks $ Type lhs <$> tInferTypeT t+ Sign i t -> Sign i <$> tCheckTypeT kType t+ ForImp ie i t -> ForImp ie i <$> tCheckTypeT kType t+ Class ctx lhs@(_, iks) fds ms -> withVars iks $ Class <$> tcCtx ctx <*> return lhs <*> mapM tcFD fds <*> mapM tcMethod ms+ Instance iks ctx c m -> withVars iks $ Instance iks <$> tcCtx ctx <*> tCheckTypeT kConstraint c <*> return m+ Default ts -> Default <$> mapM (tCheckTypeT kType) ts+ _ -> return d+ where+ tcMethod (BSign i t) = BSign i <$> tcTypeT (Check kType) t+ tcMethod m = return m+ tcFD (is, os) = (,) <$> mapM tcV is <*> mapM tcV os+ where tcV i = do { _ <- tLookup "fundep" i; return i }++tcCtx :: [EConstraint] -> T [EConstraint]+tcCtx = mapM (tCheckTypeT kConstraint)++withVars :: forall a . [IdKind] -> T a -> T a+withVars aiks ta =+ case aiks of+ [] -> ta+ IdKind i k : iks -> do+ withExtVal i k $ withVars iks ta++tcConstr :: Constr -> T Constr+tcConstr (Constr iks ct c ets) =+ withVars iks $+ Constr iks <$> tcCtx ct <*> pure c <*>+ either (\ x -> Left <$> mapM (\ (s,t) -> (s,) <$> tcTypeT (Check kType) t) x)+ (\ x -> Right <$> mapM (\ (i,(s,t)) -> ((i,) . (s,)) <$> tcTypeT (Check kType) t) x) ets++-- Expand a class defintion to+-- * a "data" type for the dictionary, with kind Constraint+-- * superclass selectors+-- * method selectors+-- * default methods+-- E.g.+-- class Eq a where+-- (==) :: a -> a -> Bool+-- (/=) :: a -> a -> a+-- x /= y = not (x == y)+-- expands to+-- data Eq a = Eq$ (a -> a -> Bool) (a -> a -> Bool)+-- :: Constraint+-- == :: forall a . Eq a -> (a -> a -> Bool)+-- == (Eq x _) = x+-- /= :: forall a . Eq a -> (a -> a -> Bool)+-- /= (Eq _ x) = x+-- ==$dflt :: forall a . (Eq a) => (a -> a -> Bool)+-- ==$dflt = _noDefault "Eq.=="+-- /=$dflt :: forall a . (Eq a) => (a -> a -> Bool)+-- /=$dflt x y = not (x == y)+--+-- class (Eq a) => Ord a where+-- (<=) :: a -> a -> Bool+-- expands to+-- data Ord a = Ord$ (Eq a) (a -> a -> Bool)+-- Ord$super1 :: forall a . Ord a -> Eq a+-- <= :: forall a . Ord a -> (a -> a -> Bool)+-- <=$dflt = _noDefault "Ord.<="+--+-- instance Eq Int where (==) = primEqInt+-- expands to+-- inst$999 = Eq$ meth$1 meth$2+-- where meth$1 = primEqInt+-- meth$2 = /=$dflt dict$999+--+-- instance Ord Int where (<=) = primLEInt+-- expands to+-- inst$888 = Ord$ dict$ meth$1+-- where meth$1 = primLEInt+-- where dict$ is a special magic identifier that the type checker expands+-- to whatever dictionary is forced by the type.+-- In this case (dict$ :: Eq Int), so it with be inst$999+--+-- The actual definitions for the constructor and methods are added+-- in the desugaring pass.+-- Default methods are added as actual definitions.+-- The constructor and methods are added to the symbol table in addValueType.+-- XXX FunDep+expandClass :: EDef -> T [EDef]+expandClass dcls@(Class ctx (iCls, vks) fds ms) = do+ mn <- gets moduleName+ let+ meths = [ b | b@(BSign _ _) <- ms ]+ methIds = map (\ (BSign i _) -> i) meths+ mdflts = [ (i, eqns) | BFcn i eqns <- ms ]+ tCtx = tApps (qualIdent mn iCls) (map (EVar . idKindIdent) vks)+ mkDflt (BSign methId t) = [ Sign iDflt $ EForall vks $ tCtx `tImplies` t, def $ lookup methId mdflts ]+ where def Nothing = Fcn iDflt [Eqn [] $ EAlts [([], noDflt)] []]+ def (Just eqns) = Fcn iDflt eqns+ iDflt = mkDefaultMethodId methId+ -- XXX This isn't right, "Prelude._nodefault" might not be in scope+ noDflt = EApp noDefaultE (ELit noSLoc (LStr (unIdent iCls ++ "." ++ unIdent methId)))+ mkDflt _ = impossible+ dDflts = concatMap mkDflt meths+ addClassTable (qualIdent mn iCls) (vks, ctx, EUVar 0, methIds, mkIFunDeps (map idKindIdent vks) fds) -- Initial entry, no type needed.+ return $ dcls : dDflts+expandClass d = return [d]++mkIFunDeps :: [Ident] -> [FunDep] -> [IFunDep]+mkIFunDeps vs [] = [(map (const True) vs, map (const False) vs)]+mkIFunDeps vs fds = map (\ (is, os) -> (map (`elem` is) vs, map (`elem` os) vs)) fds++noDefaultE :: Expr+noDefaultE = ELit noSLoc $ LPrim "noDefault"++-- Turn (unqualified) class and method names into a default method name+mkDefaultMethodId :: Ident -> Ident+mkDefaultMethodId meth = addIdentSuffix meth "$dflt"++{-+clsToDict :: EType -> T EType+clsToDict = do+ -- XXX for now, only allow contexts of the form (C t1 ... tn)+ let usup as (EVar c) | isConIdent c = return (tApps c as)+ usup as (EApp f a) = usup (a:as) f+ usup _ t = tcError (getSLoc t) ("bad context " ++ showEType t)+ usup []+-}++addConstraints :: [EConstraint] -> EType -> EType+addConstraints [] t = t+addConstraints cs t = tupleConstraints cs `tImplies` t++tupleConstraints :: [EConstraint] -> EConstraint+tupleConstraints [] = error "tupleConstraints"+tupleConstraints [c] = c+tupleConstraints cs = tApps (tupleConstr noSLoc (length cs)) cs++expandInst :: EDef -> T [EDef]+expandInst dinst@(Instance vks ctx cc bs) = do+ let loc = getSLoc cc+ qiCls = getAppCon cc+ iInst <- newIdent loc "inst"+ let sign = Sign iInst (eForall vks $ addConstraints ctx cc)+-- (e, _) <- tLookupV iCls+ ct <- gets classTable+-- let qiCls = getAppCon e+ (_, supers, _, mis, fds) <-+ case M.lookup qiCls ct of+ Nothing -> tcError loc $ "not a class " ++ showIdent qiCls+ Just x -> return x+ -- XXX this ignores type signatures and other bindings+ -- XXX should tack on signatures with ESign+ let ies = [(i, ELam qs) | BFcn i qs <- bs]+ meth i = fromMaybe (EVar $ setSLocIdent loc $ mkDefaultMethodId i) $ lookup i ies+ meths = map meth mis+ sups = map (const (EVar $ mkIdentSLoc loc "dict$")) supers+ args = sups ++ meths+ let bind = Fcn iInst $ eEqns [] $ foldl EApp (EVar $ mkClassConstructor qiCls) args+ mn <- gets moduleName+ addInstTable [(EVar $ qualIdent mn iInst, vks, ctx, cc, fds)]+ return [dinst, sign, bind]+expandInst d = return [d]++eForall :: [IdKind] -> EType -> EType+eForall [] t = t+eForall vs t = EForall vs t++---------------------++tcDefsValue :: [EDef] -> T [EDef]+tcDefsValue ds = do+ mapM_ addValueType ds+ mapM (\ d -> do { tcReset; tcDefValue d}) ds++addValueType :: EDef -> T ()+addValueType adef = do+ mn <- gets moduleName+ case adef of+ Sign i t -> extValQTop i t+ Data (i, vks) cs -> do+ let+ cti = [ (qualIdent mn c, either length length ets + if null ctx then 0 else 1) | Constr _ ctx c ets <- cs ]+ tret = foldl tApp (tCon (qualIdent mn i)) (map tVarK vks)+ addCon (Constr evks ectx c ets) = do+ let ts = either id (map snd) ets+ cty = EForall vks $ EForall evks $ addConstraints ectx $ foldr (tArrow . snd) tret ts+ extValETop c cty (ECon $ ConData cti (qualIdent mn c))+ mapM_ addCon cs+ Newtype (i, vks) (Constr _ _ c fs) -> do+ let+ t = snd $ head $ either id (map snd) fs+ tret = foldl tApp (tCon (qualIdent mn i)) (map tVarK vks)+ extValETop c (EForall vks $ EForall [] $ tArrow t tret) (ECon $ ConNew (qualIdent mn c))+ ForImp _ i t -> extValQTop i t+ Class ctx (i, vks) fds ms -> addValueClass ctx i vks fds ms+ _ -> return ()++-- XXX FunDep+addValueClass :: [EConstraint] -> Ident -> [IdKind] -> [FunDep] -> [EBind] -> T ()+addValueClass ctx iCls vks fds ms = do+ mn <- gets moduleName+ let+ meths = [ b | b@(BSign _ _) <- ms ]+ methTys = map (\ (BSign _ t) -> t) meths+ methIds = map (\ (BSign i _) -> i) meths+ supTys = ctx -- XXX should do some checking+ targs = supTys ++ methTys+ qiCls = qualIdent mn iCls+ tret = tApps qiCls (map tVarK vks)+ cti = [ (qualIdent mn iCon, length targs) ]+ iCon = mkClassConstructor iCls+ iConTy = EForall vks $ foldr tArrow tret targs+ extValETop iCon iConTy (ECon $ ConData cti (qualIdent mn iCon))+ let addMethod (BSign i t) = extValETop i (EForall vks $ tApps qiCls (map (EVar . idKindIdent) vks) `tImplies` t) (EVar $ qualIdent mn i)+ addMethod _ = impossible+-- traceM ("addValueClass " ++ showEType (ETuple ctx))+ mapM_ addMethod meths+ -- Update class table, now with actual constructor type.+ addClassTable qiCls (vks, ctx, iConTy, methIds, mkIFunDeps (map idKindIdent vks) fds)++{-+bundleConstraints :: [EConstraint] -> EType -> EType+bundleConstraints [] t = t+bundleConstraints [c] t = tImplies c t+bundleConstraints cs t = tImplies (ETuple cs) t+-}++mkClassConstructor :: Ident -> Ident+mkClassConstructor i = addIdentSuffix i "$C"++{-+unForall :: EType -> ([IdKind], EType)+unForall (EForall iks t) = (iks, t)+unForall t = ([], t)+-}++tcDefValue :: --XHasCallStack =>+ EDef -> T EDef+tcDefValue adef =+ case adef of+ Fcn i eqns -> do+ (_, tt) <- tLookup "type signature" i+-- traceM $ "tcDefValue: " ++ showIdent i ++ " :: " ++ showExpr tt+-- traceM $ "tcDefValue: def=" ++ showEDefs [adef]+ mn <- gets moduleName+ teqns <- tcEqns True tt eqns+-- traceM ("tcDefValue: after " ++ showEDefs [adef, Fcn i teqns])+ checkConstraints+ return $ Fcn (qualIdent mn i) teqns+ ForImp ie i t -> do+ mn <- gets moduleName+ return (ForImp ie (qualIdent mn i) t)+ _ -> return adef++tCheckTypeT :: EType -> EType -> T EType+tCheckTypeT = tCheck tcTypeT++tInferTypeT :: EType -> T EType+tInferTypeT t = fst <$> tInfer tcTypeT t++-- Kind check a type while already in type checking mode+tcTypeT :: --XHasCallStack =>+ Expected -> EType -> T EType+tcTypeT mk t = withTCMode TCType (tcExpr mk (dsType t))++-- Kind check a type while in value checking mode+tcType :: --XHasCallStack =>+ Expected -> EType -> T EType+tcType mk = withTypeTable . tcTypeT mk++{-+-- Sort check a kind while already in type cheking mode+tcKind :: --XHasCallStack =>+ EKind -> T EKind+tcKind e = fst <$> withTypeTable (tcType (Just kType) e)+-}++-- When inferring the type, the resulting type will+-- be assigned to the TRef (using tSetRefType),+-- and can then be read of (using tGetRefType).+-- When checking, the expected type is simple given.+data Expected = Infer TRef | Check EType+ --Xderiving(Show)++tInfer :: forall a b . --XHasCallStack =>+ (Expected -> a -> T b) -> a -> T (Typed b)+tInfer tc a = do+ ref <- newUniq+ a' <- tc (Infer ref) a+ t <- tGetRefType ref+ return (a', t)++tCheck :: forall a b . (Expected -> a -> T b) -> EType -> a -> T b+tCheck tc t = tc (Check t)++tInferExpr :: --XHasCallStack =>+ Expr -> T (Typed Expr)+tInferExpr = tInfer tcExpr++tCheckExpr :: --XHasCallStack =>+ EType -> Expr -> T Expr+tCheckExpr t _e | Just (_ctx, _t') <- getImplies t = do+ undefined+{-+ _ <- undefined -- XXX+ u <- newUniq+ let d = mkIdentSLoc (getSLoc e) ("adict$" ++ show u)+ e' <- withDict d ctx $ tCheckExpr t' e+ return $ eLam [EVar d] e'+-}+tCheckExpr t e = tCheck tcExpr t e++tGetRefType :: --XHasCallStack =>+ TRef -> T EType+tGetRefType ref = do+ m <- gets uvarSubst+ case IM.lookup ref m of+ Nothing -> return (EUVar ref) -- error "tGetRefType"+ Just t -> return t++-- Set the type for an Infer+tSetRefType :: --XHasCallStack =>+ SLoc -> TRef -> EType -> T ()+tSetRefType loc ref t = do+ m <- gets uvarSubst+ case IM.lookup ref m of+ Nothing -> putUvarSubst (IM.insert ref t m)+ Just tt -> unify loc tt t++-- Get the type of an already set Expected+tGetExpType :: Expected -> T EType+tGetExpType (Check t) = return t+tGetExpType (Infer r) = tGetRefType r++{-+-- Get the type of a possibly unset Expected+tGetExpTypeSet :: SLoc -> Expected -> T EType+tGetExpTypeSet _ (Check t) = return t+tGetExpTypeSet loc (Infer r) = tGetRefType r {-do+ t <- newUVar+ tSetRefType loc r t+ return t-}+-}++tcExpr :: --XHasCallStack =>+ Expected -> Expr -> T Expr+tcExpr mt ae = do+-- traceM ("tcExpr enter: " ++ showExpr ae)+ r <- tcExprR mt ae+-- traceM ("tcExpr exit: " ++ showExpr r)+ return r+tcExprR :: --XHasCallStack =>+ Expected -> Expr -> T Expr+tcExprR mt ae =+ let { loc = getSLoc ae } in+-- trace ("tcExprR " ++ show ae) $+ case ae of+ EVar i | isIdent "dict$" i -> do+ -- Magic variable that just becomes the dictionary+ d <- newIdent (getSLoc i) "dict$"+ case mt of+ Infer _ -> impossible+ Check t -> addConstraint d t+ return (EVar d)++ | isDummyIdent i -> impossibleShow ae+ | otherwise -> do+ -- Type checking an expression (or type)+ (e, t) <- tLookupV i+ -- Variables bound in patterns start out with an (EUVar ref) type,+ -- which can be instantiated to a polytype.+ -- Dereference such a ref.+ t' <-+ case t of+ EUVar r -> fmap (fromMaybe t) (getUVar r)+ _ -> return t+-- traceM ("EVar " ++ showIdent i ++ " :: " ++ showExpr t ++ " = " ++ showExpr t')+ instSigma loc e t' mt++ EApp f a -> do+ (f', ft) <- tInferExpr f+-- traceM $ "EApp f=" ++ showExpr f ++ "; e'=" ++ showExpr f' ++ " :: " ++ showEType ft+ (at, rt) <- unArrow loc ft+-- traceM ("tcExpr EApp: " ++ showExpr f ++ " :: " ++ showEType ft)+ a' <- checkSigma a at+ instSigma loc (EApp f' a') rt mt++ EOper e ies -> do e' <- tcOper e ies; tcExpr mt e'+ ELam qs -> tcExprLam mt qs+ ELit loc' l -> do+ let getExpected (Infer _) = pure Nothing+ getExpected (Check t) = do+ t' <- derefUVar t >>= expandSyn+ case t' of+ EVar v -> pure (Just v)+ _ -> pure Nothing+ case l of+ LInteger i -> do+ mex <- getExpected mt+ case mex of+ -- Convert to Int in the compiler, that way (99::Int) will never involve fromInteger+ -- (which is not always in scope).+ Just v | v == mkIdent nameInt -> tcLit mt loc' (LInt (_integerToInt i))+ | v == mkIdent nameWord -> tcLit' mt loc' (LInt (_integerToInt i)) (tConI loc' nameWord)+ | v == mkIdent nameDouble -> tcLit mt loc' (LDouble (_integerToDouble i))+ | v == mkIdent nameInteger -> tcLit mt loc' l+ _ -> do+ (f, ft) <- tInferExpr (EVar (mkIdentSLoc loc' "fromInteger")) -- XXX should have this qualified somehow+ (_at, rt) <- unArrow loc ft+ -- We don't need to check that _at is Integer, it's part of the fromInteger type.+ instSigma loc (EApp f ae) rt mt+ LRat r -> do+ mex <- getExpected mt+ case mex of+ Just v | v == mkIdent nameDouble -> tcLit mt loc' (LDouble (fromRational r))+ _ -> do+ (f, ft) <- tInferExpr (EVar (mkIdentSLoc loc' "fromRational")) -- XXX should have this qualified somehow+ (_at, rt) <- unArrow loc ft+ -- We don't need to check that _at is Rational, it's part of the fromRational type.+ instSigma loc (EApp f ae) rt mt+ -- Not LInteger, LRat+ _ -> tcLit mt loc' l+ ECase a arms -> do+ (ea, ta) <- tInferExpr a+ tt <- tGetExpType mt+ earms <- mapM (tcArm tt ta) arms+ return (ECase ea earms)+ ELet bs a -> tcBinds bs $ \ ebs -> do { ea <- tcExpr mt a; return (ELet ebs ea) }+ ETuple es -> do+ let+ n = length es+ (ees, tes) <- fmap unzip (mapM tInferExpr es)+ let+ ttup = tApps (tupleConstr loc n) tes+ munify loc mt ttup+ return (ETuple ees)+ EDo mmn ass -> do+ case ass of+ [] -> impossible+ [as] ->+ case as of+ SThen a -> tcExpr mt a+ _ -> tcError loc $ "bad final do statement"+ as : ss -> do+ case as of+ SBind p a -> do+ let+ sbind = maybe (mkIdentSLoc loc ">>=") (\ mn -> qualIdent mn (mkIdentSLoc loc ">>=")) mmn+ tcExpr mt (EApp (EApp (EVar sbind) a)+ (eLam [eVarI loc "$x"] (ECase (eVarI loc "$x") [(p, EAlts [([], EDo mmn ss)] [])])))+ SThen a -> do+ let+ sthen = maybe (mkIdentSLoc loc ">>") (\ mn -> qualIdent mn (mkIdentSLoc loc ">>") ) mmn+ tcExpr mt (EApp (EApp (EVar sthen) a) (EDo mmn ss))+ + SLet bs ->+ tcExpr mt (ELet bs (EDo mmn ss))++ ESectL e i -> tcExpr mt (EApp (EVar i) e)+ ESectR i e -> do+ let x = eVarI loc "$x"+ tcExpr mt (eLam [x] (EApp (EApp (EVar i) x) e))+ EIf e1 e2 e3 -> do+ e1' <- tCheckExpr (tBool (getSLoc e1)) e1+ case mt of+ Check t -> do+ e2' <- checkSigma e2 t+ e3' <- checkSigma e3 t+ return (EIf e1' e2' e3')+ Infer ref -> do+ (e2', t2) <- tInferExpr e2+ (e3', t3) <- tInferExpr e3+ e2'' <- subsCheck loc e2' t2 t3+ e3'' <- subsCheck loc e3' t3 t2+ tSetRefType loc ref t2+ return (EIf e1' e2'' e3'')++ EListish (LList es) -> do+ te <- newUVar+ munify loc mt (tApp (tList loc) te)+ es' <- mapM (tCheckExpr te) es+ return (EListish (LList es'))+ EListish (LCompr eret ass) -> do+ let+ doStmts :: [EStmt] -> [EStmt] -> T ([EStmt], Typed Expr)+ doStmts rss xs =+ case xs of+ [] -> do+ r <- tInferExpr eret+ return (reverse rss, r)+ as : ss ->+ case as of+ SBind p a -> do+ v <- newUVar+ ea <- tCheckExprAndSolve (tApp (tList loc) v) a+ tCheckPatC v p $ \ ep -> doStmts (SBind ep ea : rss) ss+ SThen a -> do+ ea <- tCheckExprAndSolve (tBool (getSLoc a)) a+ doStmts (SThen ea : rss) ss+ SLet bs ->+ tcBinds bs $ \ ebs ->+ doStmts (SLet ebs : rss) ss+ (rss, (ea, ta)) <- doStmts [] ass+ let+ tr = tApp (tList loc) ta+ munify loc mt tr+ return (EListish (LCompr ea rss))+ EListish (LFrom e) -> tcExpr mt (enum loc "From" [e])+ EListish (LFromTo e1 e2) -> tcExpr mt (enum loc "FromTo" [e1, e2])+ EListish (LFromThen e1 e2) -> tcExpr mt (enum loc "FromThen" [e1,e2])+ EListish (LFromThenTo e1 e2 e3) -> tcExpr mt (enum loc "FromThenTo" [e1,e2,e3])+ ESign e t -> do+ t' <- tcType (Check kType) t+ e' <- instSigma loc e t' mt+ checkSigma e' t'+ EForall vks t ->+ withVks vks kType $ \ vvks _ -> do+ tt <- withVars vvks (tcExpr mt t)+ return (EForall vvks tt)+ _ -> error $ "tcExpr: " ++ show (getSLoc ae) ++ " " ++ show ae+ -- impossible++enum :: SLoc -> String -> [Expr] -> Expr+enum loc f = foldl EApp (EVar (mkIdentSLoc loc ("enum" ++ f)))++tcLit :: Expected -> SLoc -> Lit -> T Expr+tcLit mt loc l@(LPrim _) = newUVar >>= tcLit' mt loc l+tcLit mt loc l = do+ let t =+ case l of+ LInt _ -> tConI loc nameInt+ LInteger _ -> tConI loc nameInteger+ LDouble _ -> tConI loc nameDouble+ LChar _ -> tConI loc nameChar+ LStr _ -> tApp (tList loc) (tConI loc nameChar)+ _ -> impossible+ tcLit' mt loc l t++tcLit' :: Expected -> SLoc -> Lit -> EType -> T Expr+tcLit' mt loc l t = instSigma loc (ELit loc l) t mt++-- tcOper is in T because it has to look up identifiers, and get the fixity table.+-- But there is no type checking happening here.+tcOper :: --XHasCallStack =>+ Expr -> [(Ident, Expr)] -> T Expr+tcOper ae aies = do+ let+ doOp (e1:e2:es) o os ies =+ let e = EApp (EApp o e2) e1+ in calc (e:es) os ies+ doOp _ _ _ _ = impossible++ calc :: [Expr] -> [(Expr, Fixity)] -> [((Expr, Fixity), Expr)] -> Expr+ calc [et] [] [] = et+ calc es ((o, _):os) [] = doOp es o os []+ calc es oos@((oy, (ay, py)):os) iies@((oo@(ox, (ax, px)), e) : ies) =+-- traceM (show ((unIdent (getIdent (fst o)), ay, py), (unIdent i, ax, px)))+ if px == py && (ax /= ay || ax == AssocNone) then+ errorMessage (getSLoc ox) "ambiguous operator expression"+ else if px < py || ax == AssocLeft && px == py then+ doOp es oy os iies+ else+ calc (e:es) (oo : oos) ies+ calc es [] ((o, e) : ies) =+ calc (e:es) [o] ies+ calc _ _ _ = impossible++ opfix :: FixTable -> (Ident, Expr) -> T ((Expr, Fixity), Expr)+ opfix fixs (i, e) = do+ (ei, _) <- tLookupV i+ let fx = getFixity fixs (getIdent ei)+ return ((EVar i, fx), e)++ fixs <- gets fixTable+-- traceM $ unlines $ map show [(unIdent i, fx) | (i, fx) <- M.toList fixs]+ ites <- mapM (opfix fixs) aies+ return $ calc [ae] [] ites++unArrow :: --XHasCallStack =>+ SLoc -> EType -> T (EType, EType)+unArrow loc t = do+ case getArrow t of+ Just ar -> return ar+ Nothing -> do+ a <- newUVar+ r <- newUVar+ unify loc t (tArrow a r)+ return (a, r)++getFixity :: FixTable -> Ident -> Fixity+getFixity fixs i = fromMaybe (AssocLeft, 9) $ M.lookup i fixs++newDictIdent :: SLoc -> T Ident+newDictIdent loc = newIdent loc "adict"++tcExprLam :: Expected -> [Eqn] -> T Expr+tcExprLam mt qs = do+ t <- tGetExpType mt+ ELam <$> tcEqns False t qs++tcEqns :: Bool -> EType -> [Eqn] -> T [Eqn]+--tcEqns t eqns | trace ("tcEqns: " ++ showEBind (BFcn dummyIdent eqns) ++ " :: " ++ showEType t) False = undefined+tcEqns top (EForall iks t) eqns = withExtTyps iks $ tcEqns top t eqns+tcEqns top t eqns | Just (ctx, t') <- getImplies t = do+ let loc = getSLoc eqns+ d <- newDictIdent loc+ f <- newIdent loc "fcnD"+ withDict d ctx $ do+ eqns' <- tcEqns top t' eqns+ let eqn =+ case eqns' of+ [Eqn [] alts] -> Eqn [EVar d] alts+ _ -> Eqn [EVar d] $ EAlts [([], EVar f)] [BFcn f eqns']+ return [eqn]+tcEqns top t eqns = do+ let loc = getSLoc eqns+ f <- newIdent loc "fcnS"+ (eqns', ds) <- solveAndDefault top $ mapM (tcEqn t) eqns+ case ds of+ [] -> return eqns'+ _ -> do+ let+ bs = eBinds ds+ eqn = Eqn [] $ EAlts [([], EVar f)] (bs ++ [BFcn f eqns'])+ return [eqn]++tcEqn :: EType -> Eqn -> T Eqn+--tcEqn t _eqn | trace ("tcEqn: " ++ showEType t) False = undefined+tcEqn t eqn =+ case eqn of+ Eqn ps alts -> tcPats t ps $ \ t' ps' -> do+ alts' <- tcAlts t' alts+ return (Eqn ps' alts')++-- Only used above+tcPats :: EType -> [EPat] -> (EType -> [EPat] -> T Eqn) -> T Eqn+tcPats t [] ta = ta t []+tcPats t (p:ps) ta = do+ (tp, tr) <- unArrow (getSLoc p) t+ -- tCheckPatC dicts used in tcAlt solve+ tCheckPatC tp p $ \ p' -> tcPats tr ps $ \ t' ps' -> ta t' (p' : ps')++tcAlts :: EType -> EAlts -> T EAlts+tcAlts t (EAlts alts bs) =+-- trace ("tcAlts: bs in " ++ showEBinds bs) $+ tcBinds bs $ \ bs' -> do+-- traceM ("tcAlts: bs out " ++ showEBinds bbs)+ alts' <- mapM (tcAlt t) alts+ return (EAlts alts' bs')++tcAlt :: EType -> EAlt -> T EAlt+--tcAlt t (_, rhs) | trace ("tcAlt: " ++ showExpr rhs ++ " :: " ++ showEType t) False = undefined+tcAlt t (ss, rhs) = tcGuards ss $ \ ss' -> do+ rhs' <- tCheckExprAndSolve t rhs+ return (ss', rhs')++tcGuards :: [EStmt] -> ([EStmt] -> T EAlt) -> T EAlt+tcGuards [] ta = ta []+tcGuards (s:ss) ta = tcGuard s $ \ rs -> tcGuards ss $ \ rss -> ta (rs:rss)++tcGuard :: EStmt -> (EStmt -> T EAlt) -> T EAlt+tcGuard (SBind p e) ta = do+ (e', tt) <- tInferExpr e+ -- tCheckPatC dicts used in solving in tcAlt+ tCheckPatC tt p $ \ p' -> ta (SBind p' e')+tcGuard (SThen e) ta = do+ e' <- tCheckExprAndSolve (tBool (getSLoc e)) e+ ta (SThen e')+-- XXX do we have solves+tcGuard (SLet bs) ta = tcBinds bs $ \ bs' -> ta (SLet bs')++tcArm :: EType -> EType -> ECaseArm -> T ECaseArm+tcArm t tpat arm =+ case arm of+ -- The dicts introduced by tCheckPatC are+ -- used in the tCheckExprAndSolve in tcAlt.+ (p, alts) -> tCheckPatC tpat p $ \ pp -> do+ alts' <- tcAlts t alts+ return (pp, alts')++tCheckExprAndSolve :: EType -> Expr -> T Expr+tCheckExprAndSolve t e = do+ (e', bs) <- solveLocalConstraints $ tCheckExpr t e+ if null bs then+ return e'+ else+ return $ ELet (eBinds bs) e'++eBinds :: [(Ident, Expr)] -> [EBind]+eBinds ds = [BFcn i [Eqn [] (EAlts [([], e)] [])] | (i, e) <- ds]++instPatSigma :: --XHasCallStack =>+ SLoc -> Sigma -> Expected -> T ()+instPatSigma loc pt (Infer r) = tSetRefType loc r pt+instPatSigma loc pt (Check t) = do { _ <- subsCheck loc undefined t pt; return () } -- XXX really?++subsCheck :: --XHasCallStack =>+ SLoc -> Expr -> Sigma -> Sigma -> T Expr+-- (subsCheck args off exp) checks that+-- 'off' is at least as polymorphic as 'args -> exp'+subsCheck loc exp1 sigma1 sigma2 = do -- Rule DEEP-SKOL+ (skol_tvs, rho2) <- skolemise sigma2+ exp1' <- subsCheckRho loc exp1 sigma1 rho2+ esc_tvs <- getFreeTyVars [sigma1,sigma2]+ let bad_tvs = filter (\ i -> elem i esc_tvs) skol_tvs+ when (not (null bad_tvs)) $+ tcErrorTK loc "Subsumption check failed"+ return exp1'++tCheckPatC :: forall a . EType -> EPat -> (EPat -> T a) -> T a+tCheckPatC t p@(EVar v) ta | not (isConIdent v) = do -- simple special case+ withExtVals [(v, t)] $ ta p+tCheckPatC t ap ta = do+-- traceM $ "tCheckPat: " ++ show ap+ let vs = patVars ap+ multCheck vs+ env <- mapM (\ v -> (v,) <$> newUVar) vs+ withExtVals env $ do+ (_sks, ds, pp) <- tCheckPat t ap+ () <- checkArity 0 pp+-- traceM ("tCheckPatC " ++ show ds)+ -- XXX must check for leaking skolems+ withDicts ds $+ ta pp++type EPatRet = ([TyVar], [(Ident, EConstraint)], EPat) -- skolems, dictionaries, pattern++tCheckPat :: EType -> EPat -> T EPatRet+tCheckPat = tCheck tcPat+tInferPat :: EPat -> T (Typed EPatRet)+tInferPat = tInfer tcPat++-- XXX Has some duplication with tcExpr+tcPat :: Expected -> EPat -> T EPatRet+tcPat mt ae =+ let { loc = getSLoc ae } in+ case ae of+ EVar i | isDummyIdent i -> do+ -- _ can be anything, so just ignore it+ _ <- tGetExpType mt+ return ([], [], ae)++ | isConIdent i -> do+ ipt <- tLookupV i+-- traceM (show ipt)+ case ipt of+ -- Sanity check+ (_, EForall _ (EForall _ _)) -> return ()+ _ -> undefined+ (ap, EForall avs apt) <- tInst' ipt+ (sks, spt) <- shallowSkolemise avs apt+ (d, p, pt) <-+ case getImplies spt of+ Nothing -> return ([], ap, apt)+ Just (ctx, pt') -> do+ di <- newDictIdent loc+ return ([(di, ctx)], EApp ap (EVar di), pt')+ + -- We will only have an expected type for a non-nullary constructor+ pp <- case mt of+ Check ext -> subsCheck loc p ext pt+ Infer r -> do { tSetRefType loc r pt; return p }+ return (sks, d, pp)++ | otherwise -> do+ -- All pattern variables are in the environment as+ -- type references. Assign the reference the given type.+ ext <- tGetExpType mt+ (p, t) <- tLookupV i+ case t of+ EUVar r -> tSetRefType loc r ext+ _ -> impossible+ return ([], [], p)++ EOper e ies -> do e' <- tcOper e ies; tcPat mt e'++ EApp f a -> do+ ((skf, df, f'), ft) <- tInferPat f+-- traceM $ "tcPat: EApp f=" ++ showExpr f ++ "; e'=" ++ showExpr f' ++ " :: " ++ showEType ft+ (at, rt) <- unArrow loc ft+-- traceM ("tcPat EApp: " ++ showExpr f ++ " :: " ++ showEType ft)+ (ska, da, a') <- tCheckPat at a+ instPatSigma loc rt mt+ return (skf ++ ska, df ++ da, EApp f' a')+ + ETuple es -> do+ let+ n = length es+ (xs, tes) <- fmap unzip (mapM tInferPat es)+ let+ (sks, ds, ees) = unzip3 xs+ ttup = tApps (tupleConstr loc n) tes+ munify loc mt ttup+ return (concat sks, concat ds, ETuple ees)++ EListish (LList es) -> do+ te <- newUVar+ munify loc mt (tApp (tList loc) te)+ xs <- mapM (tCheckPat te) es+ let (sks, ds, es') = unzip3 xs+ return (concat sks, concat ds, EListish (LList es'))++ ELit loc' l -> do+ -- XXX wrong+ ee <- case l of+ LInteger i -> tcLit mt loc' (LInt (_integerToInt i))+ _ -> tcLit mt loc' l+ return ([], [], ee)++ ESign e t -> do+ t' <- tcType (Check kType) t+ instPatSigma loc t' mt+ tCheckPat t' e++ EAt i e -> do+ (_, ti) <- tLookupV i+ (sk, d, e') <- tcPat mt e+ tt <- tGetExpType mt+ case ti of+ EUVar r -> tSetRefType loc r tt+ _ -> impossible+ return (sk, d, EAt i e')++ _ -> error $ "tcPat: " ++ show (getSLoc ae) ++ " " ++ show ae+ --impossible++multCheck :: [Ident] -> T ()+multCheck vs =+ when (anySame vs) $ do+ let v = head vs+ tcError (getSLoc v) $ "Multiply defined: " ++ showIdent v++checkArity :: Int -> EPat -> T ()+checkArity n (EApp f a) = do+ checkArity (n+1) f+ checkArity 0 a+checkArity n (ECon c) =+ let a = conArity c+ in if n < a then+ tcError (getSLoc c) "too few arguments"+ else if n > a then+ tcError (getSLoc c) "too many arguments"+ else+ return ()+checkArity n (EAt _ p) = checkArity n p+checkArity n (ESign p _) = checkArity n p+checkArity n p =+ case p of+ ETuple _ -> check0+ EListish (LList _) -> check0+ EVar _ -> check0+ ELit _ _ -> check0+ _ ->+ --Xerror (show p)+ impossible+ where+ check0 = if n /= 0 then tcError (getSLoc p) "Bad pattern" else return ()++tcBinds :: forall a . [EBind] -> ([EBind] -> T a) -> T a+tcBinds xbs ta = do+ let+ tmap = M.fromList [ (i, t) | BSign i t <- xbs ]+ xs = getBindsVars xbs+ multCheck xs+ xts <- mapM (tcBindVarT tmap) xs+ withExtVals xts $ do+ nbs <- mapM tcBind xbs+ ta nbs++tcBindVarT :: M.Map EType -> Ident -> T (Ident, EType)+tcBindVarT tmap x = do+ case M.lookup x tmap of+ Nothing -> do+ t <- newUVar+ return (x, t)+ Just t -> do+ tt <- withTypeTable $ tcTypeT (Check kType) t+ return (x, tt)++tcBind :: EBind -> T EBind+tcBind abind =+ case abind of+ BFcn i eqns -> do+ (_, tt) <- tLookupV i+ teqns <- tcEqns False tt eqns+ return $ BFcn i teqns+ BPat p a -> do+ ((sk, ds, ep), tp) <- tInferPat p -- pattern variables already bound+ -- This is just to complicated.+ when (not (null sk) || not (null ds)) $+ tcError (getSLoc p) "existentials not allowed in pattern binding"+ ea <- tCheckExprAndSolve tp a+ return $ BPat ep ea+ BSign _ _ -> return abind++-- Desugar [T] and (T,T,...)+dsType :: EType -> EType+dsType at =+ case at of+ EVar _ -> at+ EApp f a -> EApp (dsType f) (dsType a)+ EOper t ies -> EOper (dsType t) [(i, dsType e) | (i, e) <- ies]+ EListish (LList [t]) -> tApp (tList (getSLoc at)) (dsType t)+ ETuple ts -> tApps (tupleConstr (getSLoc at) (length ts)) (map dsType ts)+ ESign t k -> ESign (dsType t) k+ EForall iks t -> EForall iks (dsType t)+ _ -> impossible++tConI :: SLoc -> String -> EType+tConI loc = tCon . mkIdentSLoc loc++tListI :: SLoc -> Ident+tListI loc = mkIdentSLoc loc $ listPrefix ++ "[]"++tList :: SLoc -> EType+tList = tCon . tListI++tBool :: SLoc -> EType+tBool loc = tConI loc $ boolPrefix ++ "Bool"++impossible :: --XHasCallStack =>+ forall a . a+impossible = error "impossible"++impossibleShow :: --XHasCallStack =>+ forall a b . (Show a, HasLoc a) => a -> b+impossibleShow a = error $ "impossible: " ++ show (getSLoc a) ++ " " ++ show a++showTModule :: forall a . (a -> String) -> TModule a -> String+showTModule sh amdl =+ case amdl of+ TModule mn _ _ _ _ _ _ a -> "Tmodule " ++ showIdent mn ++ "\n" ++ sh a ++ "\n"++{-+showValueTable :: ValueTable -> String+showValueTable vt =+ unlines $ take 5 [showIdent i ++ " : " ++ showExpr t | (i, [Entry _ t]) <- M.toList vt]+-}++-----------------------------------------------------++getFreeTyVars :: [EType] -> T [TyVar]+getFreeTyVars tys = do+ tys' <- mapM derefUVar tys+ return (freeTyVars tys')++getMetaTyVars :: [EType] -> T [TRef]+getMetaTyVars tys = do+ tys' <- mapM derefUVar tys+ return (metaTvs tys')++getEnvTypes :: T [EType]+getEnvTypes = gets (map entryType . stElemsLcl . valueTable)++{-+quantify :: [MetaTv] -> Rho -> T Sigma+-- Quantify over the specified type variables (all flexible)+quantify tvs ty = do+ mapM_ bind (tvs `zip` new_bndrs) -- 'bind' is just a cunning way+ ty' <- zonkType ty -- of doing the substitution+ return (EForall new_bndrs_kind ty')+ where+ used_bndrs = tyVarBndrs ty -- Avoid quantified type variables in use+ new_bndrs = allBinders \\ used_bndrs+ bind (tv, name) = writeTcRef tv (EVar name)+ new_bndrs_kind = map (\ i -> IdKind i undefined) new_bndrs++allBinders :: [Ident] -- a,b,..z, a1, b1,... z1, a2, b2,...+allBinders = [ mkIdent [chr x] | x <- [ord 'a' .. ord 'z'] ] +++ [ mkIdent (chr x : show i) | i <- [1 ..], x <- [ord 'a' .. ord 'z']]+-}++-- Skolemize the given variables+shallowSkolemise :: [IdKind] -> EType -> T ([TyVar], EType)+shallowSkolemise tvs ty = do+ sks <- mapM (newSkolemTyVar . idKindIdent) tvs+ return (sks, subst (zip (map idKindIdent tvs) (map EVar sks)) ty)++skolemise :: --XHasCallStack =>+ Sigma -> T ([TyVar], Rho)+-- Performs deep skolemisation, returning the+-- skolem constants and the skolemised type.+skolemise (EForall tvs ty) = do -- Rule PRPOLY+ (sks1, ty') <- shallowSkolemise tvs ty+ (sks2, ty'') <- skolemise ty'+ return (sks1 ++ sks2, ty'')+skolemise t@(EApp _ _) | Just (arg_ty, res_ty) <- getArrow t = do+ (sks, res_ty') <- skolemise res_ty+ return (sks, arg_ty `tArrow` res_ty')+skolemise (EApp f a) = do+ (sks1, f') <- skolemise f+ (sks2, a') <- skolemise a+ return (sks1 ++ sks2, EApp f' a')+skolemise ty =+ return ([], ty)++-- Skolem tyvars are just identifiers that start with a uniq+newSkolemTyVar :: Ident -> T Ident+newSkolemTyVar tv = do+ uniq <- newUniq+ return (mkIdentSLoc (getSLoc tv) (unIdent tv ++ "#" ++ show uniq))++freeTyVars :: [EType] -> [TyVar]+-- Get the free TyVars from a type; no duplicates in result+freeTyVars = foldr (go []) []+ where+ go :: [TyVar] -- Ignore occurrences of bound type variables+ -> EType -- Type to look at+ -> [TyVar] -- Accumulates result+ -> [TyVar]+ go bound (EVar tv) acc+ | elem tv bound = acc+ | elem tv acc = acc+ | isConIdent tv = acc+ | otherwise = tv : acc+ go bound (EForall tvs ty) acc = go (map idKindIdent tvs ++ bound) ty acc+ go bound (EApp fun arg) acc = go bound fun (go bound arg acc)+ go _bound (EUVar _) acc = acc+ go _ _ _ = undefined++metaTvs :: [EType] -> [TRef]+-- Get the MetaTvs from a type; no duplicates in result+metaTvs tys = foldr go [] tys+ where+ go (EUVar tv) acc+ | elem tv acc = acc+ | otherwise = tv : acc+ go (EVar _) acc = acc+ go (EForall _ ty) acc = go ty acc+ go (EApp fun arg) acc = go fun (go arg acc)+ go _ _ = undefined++{-+tyVarBndrs :: Rho -> [TyVar]+-- Get all the binders used in ForAlls in the type, so that+-- when quantifying an outer for-all we can avoid these inner ones+tyVarBndrs ty = nub (bndrs ty)+ where+ bndrs (EForall tvs body) = map idKindIdent tvs ++ bndrs body+ bndrs (EApp arg res) = bndrs arg ++ bndrs res+ bndrs (EVar _) = []+ bndrs _ = undefined++inferSigma :: Expr -> T (Expr, Sigma)+inferSigma e = do+ (e', exp_ty) <- inferRho e+ env_tys <- getEnvTypes+ env_tvs <- getMetaTyVars env_tys+ res_tvs <- getMetaTyVars [exp_ty]+ let forall_tvs = res_tvs \\ env_tvs+ (e',) <$> quantify forall_tvs exp_ty+-}++checkSigma :: --XHasCallStack =>+ Expr -> Sigma -> T Expr+checkSigma expr sigma = do+ (skol_tvs, rho) <- skolemise sigma+ expr' <- tCheckExpr rho expr+ if null skol_tvs then+ -- Fast special case+ return expr'+ else do+ env_tys <- getEnvTypes+ esc_tvs <- getFreeTyVars (sigma : env_tys)+ let bad_tvs = filter (\ i -> elem i esc_tvs) skol_tvs+ when (not (null bad_tvs)) $+ tcErrorTK (getSLoc expr) $ "not polymorphic enough: " ++ unwords (map showIdent bad_tvs)+ return expr'++subsCheckRho :: --XHasCallStack =>+ SLoc -> Expr -> Sigma -> Rho -> T Expr+--subsCheckRho _ e1 t1 t2 | trace ("subsCheckRho: " ++ {-showExpr e1 ++ " :: " ++ -} showEType t1 ++ " = " ++ showEType t2) False = undefined+subsCheckRho loc exp1 sigma1@(EForall _ _) rho2 = do -- Rule SPEC+ (exp1', rho1) <- tInst (exp1, sigma1)+ subsCheckRho loc exp1' rho1 rho2+subsCheckRho loc exp1 rho1 rho2 | Just (a2, r2) <- getArrow rho2 = do -- Rule FUN+ (a1, r1) <- unArrow loc rho1+ subsCheckFun loc exp1 a1 r1 a2 r2+subsCheckRho loc exp1 rho1 rho2 | Just (a1, r1) <- getArrow rho1 = do -- Rule FUN+ (a2,r2) <- unArrow loc rho2+ subsCheckFun loc exp1 a1 r1 a2 r2+subsCheckRho loc exp1 tau1 tau2 = do -- Rule MONO+ unify loc tau1 tau2 -- Revert to ordinary unification+ return exp1++subsCheckFun :: --XHasCallStack =>+ SLoc -> Expr -> Sigma -> Rho -> Sigma -> Rho -> T Expr+subsCheckFun loc e1 a1 r1 a2 r2 = do+ _ <- subsCheck loc undefined a2 a1 -- XXX+ subsCheckRho loc e1 r1 r2++instSigma :: --XHasCallStack =>+ SLoc -> Expr -> Sigma -> Expected -> T Expr+instSigma loc e1 t1 (Check t2) = do+-- traceM ("instSigma: Check " ++ showEType t1 ++ " = " ++ showEType t2)+ subsCheckRho loc e1 t1 t2+instSigma loc e1 t1 (Infer r) = do+ (e1', t1') <- tInst (e1, t1)+-- traceM ("instSigma: Infer " ++ showEType t1 ++ " ==> " ++ showEType t1')+ tSetRefType loc r t1'+ return e1'++-----++-- Given a dictionary of a (constraint type), split it up+-- * name components of a tupled constraint+-- * name superclasses of a constraint+expandDict :: Expr -> EConstraint -> T [InstDictC]+expandDict edict acn = do+ cn <- expandSyn acn+ let+ (iCls, args) = getApp cn+ case getTupleConstr iCls of+ Just _ -> concat <$> mapM (\ (i, a) -> expandDict (mkTupleSel i (length args) `EApp` edict) a) (zip [0..] args)+ Nothing -> do+ ct <- gets classTable+ let (iks, sups, _, _, fds) = fromMaybe impossible $ M.lookup iCls ct+ vs = map idKindIdent iks+ sub = zip vs args+ sups' = map (subst sub) sups+-- mn <- gets moduleName+ insts <- concat <$> mapM (\ (i, sup) -> expandDict (EVar (expectQualified $ mkSuperSel iCls i) `EApp` edict) sup) (zip [1 ..] sups')+ return $ (edict, [], [], cn, fds) : insts++mkSuperSel :: --XHasCallStack =>+ Ident -> Int -> Ident+mkSuperSel c i = addIdentSuffix c ("$super" ++ show i)++---------------------------------++type Solved = (Ident, Expr)++-- Solve constraints generated locally in 'ta'.+-- Keep any unsolved ones for later.+solveLocalConstraints :: forall a . T a -> T (a, [Solved])+solveLocalConstraints ta = do+ cs <- gets constraints -- old constraints+ putConstraints [] -- start empty+ a <- ta -- compute, generating constraints+ ds <- solveConstraints -- solve those+ un <- gets constraints -- get remaining unsolved+ putConstraints (un ++ cs) -- put back unsolved and old constraints+ return (a, ds)++solveAndDefault :: forall a . Bool -> T a -> T (a, [Solved])+solveAndDefault False ta = solveLocalConstraints ta+solveAndDefault True ta = do+ a <- ta+ ds <- solveConstraints+ cs <- gets constraints+ vs <- getMetaTyVars (map snd cs) -- These are the type variables that need defaulting+-- traceM $ "solveAndDefault" ++ show vs+ -- XXX may have to iterate this with fundeps+ ds' <- concat <$> mapM defaultOneTyVar vs+ return (a, ds ++ ds')++constraintHasTyVar :: TRef -> (Ident, EConstraint) -> T Bool+constraintHasTyVar tv (_, t) = elem tv <$> getMetaTyVars [t]++defaultOneTyVar :: TRef -> T [Solved]+defaultOneTyVar tv = do+ old <- get -- get entire old state+ -- split constraints into those with the current tyvar and those without+ (ourcs, othercs) <- partitionM (constraintHasTyVar tv) (constraints old)+ let tryDefaults [] = return []+ tryDefaults (ty:tys) = do+ setUVar tv ty+ putConstraints ourcs+ ds <- solveConstraints+ rcs <- gets constraints+ if null rcs then do+ -- Success, the type variable is gone+ putConstraints othercs -- put back the other constraints+ return ds+ else do+ -- Not solved, try with the nest type+ put old -- restore solver state+ tryDefaults tys -- and try with next type+ tryDefaults (defaults old)++{-+showInstInfo :: InstInfo -> String+showInstInfo (InstInfo m ds fds) = "InstInfo " ++ show (M.toList m) ++ " " ++ showListS showInstDict ds ++ show fds++showInstDict :: InstDict -> String+showInstDict (e, ctx, ts) = showExpr e ++ " :: " ++ show (addConstraints ctx (tApps (mkIdent "CCC") ts))++showInstDef :: InstDef -> String+showInstDef (cls, InstInfo m ds) = "instDef " ++ show cls ++ ": "+ ++ show (M.toList m) ++ ", " ++ showListS showInstDict ds++showConstraint :: (Ident, EConstraint) -> String+showConstraint (i, t) = show i ++ " :: " ++ show t++showMatch :: (Expr, [EConstraint]) -> String+showMatch (e, ts) = show e ++ " " ++ show ts+-}++-- Solve as many constraints as possible.+-- Return bindings for the dictionary witnesses.+-- Unimplemented:+-- instances with a context+solveConstraints :: T [(Ident, Expr)]+solveConstraints = do+ cs <- gets constraints+ if null cs then+ return []+ else do+-- traceM "------------------------------------------\nsolveConstraints"+ cs' <- mapM (\ (i,t) -> do { t' <- derefUVar t; return (i,t') }) cs+-- traceM ("constraints:\n" ++ unlines (map showConstraint cs'))+ it <- gets instTable+-- traceM ("instances:\n" ++ unlines (map showInstDef (M.toList it)))+ let solve :: [(Ident, EType)] -> [(Ident, EType)] -> [(Ident, Expr)] -> T ([(Ident, EType)], [(Ident, Expr)])+ solve [] uns sol = return (uns, sol)+ solve (cns@(di, ct) : cnss) uns sol = do+-- traceM ("trying " ++ showEType ct)+ let loc = getSLoc di+ (iCls, cts) = getApp ct+ case getTupleConstr iCls of+ Just _ -> do+ goals <- mapM (\ c -> do { d <- newIdent loc "dict"; return (d, c) }) cts+-- traceM ("split tuple " ++ showListS showConstraint goals)+ solve (goals ++ cnss) uns ((di, ETuple (map (EVar . fst) goals)) : sol)+ Nothing | iCls == mkIdent nameTypeEq -> solveTypeEq loc cts cns cnss uns sol+ | otherwise ->+ case M.lookup iCls it of+ Nothing -> do+-- traceM ("class missing " ++ showIdent iCls)+ solve cnss (cns : uns) sol -- no instances, so no chance+ Just (InstInfo atomMap insts fds) ->+ case cts of+ [EVar i] -> do+-- traceM ("solveSimple " ++ showIdent i ++ " -> " ++ showMaybe showExpr (M.lookup i atomMap))+ case M.lookup i atomMap of+ Just e -> solveSimple e cns cnss uns sol+ -- Not found, but there might be a generic instance+ Nothing -> solveGen loc fds insts cns cnss uns sol+ _ -> solveGen loc fds insts cns cnss uns sol++ -- An instance of the form (C T)+ solveSimple e (di, _) cnss uns sol = solve cnss uns ((di, e) : sol) -- e is the dictionary expression++ -- XXX pass ts instead of cns+ solveGen loc _fds insts cns@(di, ct) cnss uns sol = do+-- traceM ("solveGen " ++ showEType ct)+ let (_, ts) = getApp ct+ matches = getBestMatches $ findMatches insts ts+-- traceM ("matches " ++ showListS showMatch matches)+ case matches of+ [] -> solve cnss (cns : uns) sol+ [(de, ctx)] ->+ if null ctx then+ solve cnss uns ((di, de) : sol)+ else do+ d <- newIdent loc "dict"+-- traceM ("constraint " ++ showIdent di ++ " :: " ++ showEType ct ++ "\n" +++-- " turns into " ++ showIdent d ++ " :: " ++ showEType (tupleConstraints ctx) ++ ", " +++-- showIdent di ++ " = " ++ showExpr (EApp de (EVar d)))+ solve ((d, tupleConstraints ctx) : cnss) uns ((di, EApp de (EVar d)) : sol)+ _ -> tcError loc $ "Multiple constraint solutions for: " ++ showEType ct++ solveTypeEq loc [t1, t2] cns@(di,_) cnss uns sol = do+ eqs <- gets typeEqTable+ case solveEq eqs t1 t2 of+ Nothing -> solve cnss (cns : uns) sol+ Just (de, tts) -> do+ let mkEq (u1, u2) = do+ i <- newIdent loc "dict"+ return (i, mkEqType loc u1 u2)+ ncs <- mapM mkEq tts+ solve (ncs ++ cnss) uns ((di, de) : sol)+ solveTypeEq _ _ _ _ _ _ = impossible++ (unsolved, solved) <- solve cs' [] []+ putConstraints unsolved+-- traceM ("solved:\n" ++ unlines [ showIdent i ++ " = " ++ showExpr e | (i, e) <- solved ])+-- traceM ("unsolved:\n" ++ unlines [ showIdent i ++ " :: " ++ showEType t | (i, t) <- unsolved ])+ return solved++type TySubst = [(TRef, EType)]++-- Given some instances and a constraint, find the matching instances.+-- For each matching instance return: (subst-size, (dict-expression, new-constraints))+-- The subst-size is the size of the substitution that made the input instance match.+-- It is a measure of how exact the match is.+findMatches :: [InstDict] -> [EType] -> [(Int, (Expr, [EConstraint]))]+findMatches ds its =+ let rrr =+ [ (length s, (de, map (substEUVar s) ctx))+ | (de, ctx, ts) <- ds, Just s <- [matchTypes [] ts its] ]+ in --trace ("findMatches: " ++ showListS showInstDict ds ++ "; " ++ showListS showEType its ++ "; " ++ show rrr)+ rrr+ where++ -- Length of lists match, because of kind correctness+ matchTypes :: TySubst -> [EType] -> [EType] -> Maybe TySubst+ matchTypes r (t:ts) (t':ts') =+ case matchType r t t' of+ Nothing -> Nothing+ Just r' -> matchTypes r' ts ts'+ matchTypes r _ _ = Just r++ -- Match two types, instantiate variables in the first type.+ matchType r (EVar i) (EVar i') | i == i' = Just r+ matchType r (EApp f a) (EApp f' a') = -- XXX should use Maybe monad+ case matchType r f f' of+ Nothing -> Nothing+ Just r' -> matchType r' a a'+ matchType r (EUVar i) t =+ -- For a variable, check that any previous match is the same.+ case lookup i r of+ Just t' -> if eqEType t t' then Just r else Nothing+ Nothing -> Just ((i, t) : r)+ matchType _ _ _ = Nothing++ -- Do substitution for EUVar.+ -- XXX similar to derefUVar+ substEUVar [] t = t+ substEUVar _ t@(EVar _) = t+ substEUVar s (EApp f a) = EApp (substEUVar s f) (substEUVar s a)+ substEUVar s t@(EUVar i) = fromMaybe t $ lookup i s+ substEUVar s (EForall iks t) = EForall iks (substEUVar s t)+ substEUVar _ _ = impossible+++-- Get the best matches. These are the matches with the smallest substitution.+getBestMatches :: [(Int, (Expr, [EConstraint]))] -> [(Expr, [EConstraint])]+getBestMatches [] = []+getBestMatches ms =+ let b = minimum (map fst ms) -- minimum substitution size+ in [ ec | (s, ec) <- ms, s == b ] -- pick out the smallest++-- Check that there are no unsolved constraints.+checkConstraints :: T ()+checkConstraints = do+ cs <- gets constraints+ case cs of+ [] -> return ()+ (i, t) : _ -> do+ t' <- derefUVar t+ --is <- gets instTable+ --traceM $ "Cannot satisfy constraint: " ++ unlines (map (\ (i, ii) -> showIdent i ++ ":\n" ++ showInstInfo ii) (M.toList is))+ tcError (getSLoc i) $ "Cannot satisfy constraint: " ++ showExpr t'++-- Add a type equality constraint.+addEqConstraint :: SLoc -> EType -> EType -> T ()+addEqConstraint loc t1 t2 = do+ d <- newIdent loc "dict"+ addConstraint d (mkEqType loc t1 t2)++mkEqType :: SLoc -> EType -> EType -> EConstraint+mkEqType loc t1 t2 = EApp (EApp (EVar (mkIdentSLoc loc nameTypeEq)) t1) t2++-- A quick hack for testing+solveEq :: TypeEqTable -> EType -> EType -> Maybe (Expr, [(EType, EType)])+--solveEq eqs t1 t2 | trace ("solveEq: " ++ show (t1,t2) ++ show eqs) False = undefined+solveEq eqs t1 t2 | t1 `eqEType` t2 = Just (ETuple [], [])+ | elemBy eqTyTy (t1, t2) eqs = Just (ETuple [], [])+ | otherwise =+ case (t1, t2) of+ (EApp f1 a1, EApp f2 a2) -> Just (ETuple [], [(f1, f2), (a1, a2)])+ _ -> Nothing++-- Add the equality t1~t2.+-- The type table is always the symmetric&transitive closure of all equalities.+-- This isn't very efficient, but it's simple.+addTypeEq :: EType -> EType -> TypeEqTable -> TypeEqTable+addTypeEq t1 t2 aeqs | t1 `eqEType` t2 || elemBy eqTyTy (t1, t2) aeqs || elemBy eqTyTy (t2, t1) aeqs = aeqs+ | otherwise = (t1, t2) : (t2, t1) : -- symmetry+ trans t1 t2 aeqs ++ trans t2 t1 aeqs ++ -- transitivity+ aeqs+ where trans a1 a2 eqs = [ (a1, b2) | (b1, b2) <- eqs, eqEType a2 b1 ]++eqTyTy :: (EType, EType) -> (EType, EType) -> Bool+eqTyTy (t1, t2) (u1, u2) = eqEType t1 u1 && eqEType t2 u2++---------------------++data SymTab a = SymTab (M.Map [a]) [(Ident, a)]+ --Xderiving(Show)+ +stLookup :: --forall a . --XShow a =>+ String -> Ident -> SymTab Entry -> Either String Entry+stLookup msg i (SymTab genv lenv) =+ case lookup i lenv of+ Just e -> Right e+ Nothing ->+ case M.lookup i genv of+ Just [e] -> Right e+ Just es -> Left $ "ambiguous " ++ msg ++ ": " ++ showIdent i ++ " " ++ showListS (showIdent . getAppCon) [ e | Entry e _ <- es ]+ Nothing -> Left $ "undefined " ++ msg ++ ": " ++ showIdent i+ -- ++ "\n" ++ show lenv ++ "\n" ++ show genv++stFromListWith :: forall a . ([a] -> [a] -> [a]) -> [(Ident, [a])] -> SymTab a+stFromListWith comb ias = SymTab (M.fromListWith comb ias) []++stFromList :: forall a . [(Ident, [a])] -> SymTab a+stFromList ias = SymTab (M.fromList ias) []++stElemsLcl :: forall a . SymTab a -> [a]+stElemsLcl (SymTab _genv lenv) = map snd lenv++stInsertLcl :: forall a . Ident -> a -> SymTab a -> SymTab a+stInsertLcl i a (SymTab genv lenv) = SymTab genv ((i,a) : lenv)++-- XXX Use insertWith to follow Haskell semantics.+stInsertGlb :: forall a . Ident -> [a] -> SymTab a -> SymTab a+stInsertGlb i as (SymTab genv lenv) = SymTab (M.insert i as genv) lenv++-----------------------------+{-+showSymTab :: SymTab Entry -> String+showSymTab (SymTab im ies) = showListS showIdent (map fst (M.toList im) ++ map fst ies)++showTModuleExps :: TModule a -> String+showTModuleExps (TModule mn _fxs tys _syns _clss _insts vals _defs) =+ showIdent mn ++ ":\n" +++ unlines (map ((" " ++) . showValueExport) vals) +++ unlines (map ((" " ++) . showTypeExport) tys)++showValueExport :: ValueExport -> String+showValueExport (ValueExport i (Entry qi t)) =+ showIdent i ++ " = " ++ showExpr qi ++ " :: " ++ showEType t++showTypeExport :: TypeExport -> String+showTypeExport (TypeExport i (Entry qi t) vs) =+ showIdent i ++ " = " ++ showExpr qi ++ " :: " ++ showEType t ++ " assoc=" ++ showListS showValueExport vs++showIdentClassInfo :: (Ident, ClassInfo) -> String+showIdentClassInfo (i, (_vks, _ctx, cc, ms)) =+ showIdent i ++ " :: " ++ showEType cc +++ " has " ++ showListS showIdent ms+-}
+ src/Text/ParserComb.hs view
@@ -0,0 +1,261 @@+-- Copyright 2023 Lennart Augustsson+-- See LICENSE file for full license.+{-# OPTIONS_GHC -Wno-type-defaults #-}+module Text.ParserComb(+ (>>=), (>>), pure,+ (<*), (*>), (<*>), (<$), (<$>),+ (<|>),+ fail, guard,+ get, put, modify,+ Prsr, runPrsr,+ satisfy, satisfyM, eof,+ choice,+ many, emany, optional, eoptional,+ some, esome,+ esepBy, sepBy1, esepBy1,+ esepEndBy, esepEndBy1,+ (<?>), (<|<),+ --notFollowedBy,+ lookAhead,+ inject, nextToken,+ LastFail(..),+ ) where+--Ximport Prelude()+import Prelude+import Control.Alternative+import Control.Monad --Xhiding(guard)++data LastFail t+ = LastFail Int [t] [String]+ --Xderiving (Show)++maxInt :: Int+maxInt = 1000000000++noFail :: forall t . LastFail t+noFail = LastFail maxInt [] []++longest :: forall t . LastFail t -> LastFail t -> LastFail t+longest lf1@(LastFail l1 t1 x1) lf2@(LastFail l2 _ x2) =+ if l1 < l2 then+ lf1+ else if l2 < l1 then+ lf2+ else+ LastFail l1 t1 (x1 ++ x2)++longests :: forall t . [LastFail t] -> LastFail t+longests xs = foldl1 longest xs++data Res s t a = Many [(a, ([t], s))] (LastFail t)+ --deriving (Show)++-- | +data Prsr s t a = P (([t], s) -> Res s t a)+--instance Show (Prsr s t a) where show _ = "<<Prsr>>"++runP :: forall s t a . Prsr s t a -> (([t], s) -> Res s t a)+runP (P p) = p++instance forall s t . Functor (Prsr s t) where+ fmap f p = P $ \ t ->+ case runP p t of+ Many aus lf -> Many [ (f a, u) | (a, u) <- aus ] lf++instance forall s t . Applicative (Prsr s t) where+ pure a = P $ \ t -> Many [(a, t)] noFail+ (<*>) = ap+ (*>) p k = p >>= \ _ -> k++instance forall s t . Monad (Prsr s t) where+ (>>=) p k = P $ \ t ->+ case runP p t of+ Many aus plf ->+ let { xss = [ runP (k a) u | au <- aus, let { (a, u) = au } ] }+ in case unzip [ (rs, lf) | xs <- xss, let { Many rs lf = xs } ] of+ (rss, lfs) -> Many (concat rss) (longests (plf : lfs))+ return = pure++instance forall s t . MonadFail (Prsr s t) where+ fail m = P $ \ (ts, _) -> Many [] (LastFail (length ts) (take 1 ts) [m])++instance forall s t . Alternative (Prsr s t) where+ empty = P $ \ (ts, _) -> Many [] (LastFail (length ts) (take 1 ts) [])++ (<|>) p q = P $ \ t ->+ case runP p t of+ Many a lfa ->+ case runP q t of+ Many b lfb -> Many (a ++ b) (longest lfa lfb)++{-+pure :: forall s t a . a -> Prsr s t a+pure a = P $ \ t -> Many [(a, t)] noFail++infixl 1 >>=+(>>=) :: forall s t a b . Prsr s t a -> (a -> Prsr s t b) -> Prsr s t b+(>>=) p k = P $ \ t ->+ case runP p t of+ Many aus plf ->+ let { xss = [ runP (k a) u | au <- aus, let { (a, u) = au } ] }+ in case unzip [ (rs, lf) | xs <- xss, let { Many rs lf = xs } ] of+ (rss, lfs) -> Many (concat rss) (longests (plf : lfs))++infixl 1 >>+(>>) :: forall s t a b . Prsr s t a -> Prsr s t b -> Prsr s t b+(>>) p k = p >>= \ _ -> k++infixl 4 <*>+(<*>) :: forall s t a b . Prsr s t (a -> b) -> Prsr s t a -> Prsr s t b+(<*>) m1 m2 = m1 >>= \ x1 -> m2 >>= \ x2 -> pure (x1 x2)++infixl 4 <*+(<*) :: forall s t a b . Prsr s t a -> Prsr s t b -> Prsr s t a+(<*) m1 m2 = m1 >>= \ x1 -> m2 >> pure x1++infixl 4 *>+(*>) :: forall s t a b . Prsr s t a -> Prsr s t b -> Prsr s t b+(*>) m1 m2 = m1 >> m2 >>= \ x2 -> pure x2++infixl 4 <$>+(<$>) :: forall s t a b . (a -> b) -> Prsr s t a -> Prsr s t b+(<$>) f p = P $ \ t ->+ case runP p t of+ Many aus lf -> Many [ (f a, u) | (a, u) <- aus ] lf++infixl 4 <$+(<$) :: forall s t a b . a -> Prsr s t b -> Prsr s t a+(<$) a p = p >> pure a++guard :: forall s t . Bool -> Prsr s t ()+guard b = if b then pure () else empty++empty :: forall s t a . Prsr s t a+empty = P $ \ (ts, _) -> Many [] (LastFail (length ts) (take 1 ts) [])++infixl 3 <|>+(<|>) :: forall s t a . Prsr s t a -> Prsr s t a -> Prsr s t a+(<|>) p q = P $ \ t ->+ case runP p t of+ Many a lfa ->+ case runP q t of+ Many b lfb -> Many (a ++ b) (longest lfa lfb)++fail :: forall s t a . String -> Prsr s t a+fail m = P $ \ (ts, _) -> Many [] (LastFail (length ts) (take 1 ts) [m])+-}++get :: forall s t . Prsr s t s+get = P $ \ t@(_, s) -> Many [(s, t)] noFail++put :: forall s t . s -> Prsr s t ()+put s = P $ \ (ts, _) -> Many [((), (ts, s))] noFail++modify :: forall s t . (s -> s) -> Prsr s t ()+modify f = get >>= \ s -> put (f s)++-- Left biased choice+infixl 3 <|<+(<|<) :: forall s t a . Prsr s t a -> Prsr s t a -> Prsr s t a+(<|<) p q = P $ \ t ->+ case runP p t of+ Many [] lfa ->+ case runP q t of+ Many b lfb -> Many b (longest lfa lfb)+ r -> r++{-+many :: forall s t a . Prsr s t a -> Prsr s t [a]+many p = some p <|> pure []++some :: forall s t a . Prsr s t a -> Prsr s t [a]+some p = (:) <$> p <*> many p+-}++optional :: forall s t a . Prsr s t a -> Prsr s t (Maybe a)+optional p = (Just <$> p) <|> pure Nothing++emany :: forall s t a . Prsr s t a -> Prsr s t [a]+emany p = esome p <|< pure []++esome :: forall s t a . Prsr s t a -> Prsr s t [a]+esome p = (:) <$> p <*> emany p++eoptional :: forall s t a . Prsr s t a -> Prsr s t (Maybe a)+eoptional p = (Just <$> p) <|< pure Nothing++runPrsr :: forall s t a . --X(Show a, Show s) =>+ s -> Prsr s t a -> [t] -> Either (LastFail t) [(a, s)]+runPrsr s (P p) f =+ case p (f, s) of+ Many [] lf -> Left lf+ Many xs _ -> Right [(a, snd x) | (a, x) <- xs ]++choice :: forall s t a . [Prsr s t a] -> Prsr s t a+choice [] = empty+choice ps = foldr1 (<|>) ps++satisfy :: forall s t . String -> (t -> Bool) -> Prsr s t t+satisfy msg f = P $ \ (acs, s) ->+ case acs of+ c:cs | f c -> Many [(c, (cs, s))] noFail+ _ -> Many [] (LastFail (length acs) (take 1 acs) [msg])++satisfyM :: forall s t a . String -> (t -> Maybe a) -> Prsr s t a+satisfyM msg f = P $ \ (acs, s) ->+ case acs of+ c:cs | Just a <- f c -> Many [(a, (cs, s))] noFail+ _ -> Many [] (LastFail (length acs) (take 1 acs) [msg])++eof :: forall s t . Prsr s t ()+eof = P $ \ t@(cs, _) ->+ if null cs then+ Many [((), t)] noFail+ else+ Many [] (LastFail (length cs) (take 1 cs) ["eof"])++infixl 9 <?>+(<?>) :: forall s t a . Prsr s t a -> String -> Prsr s t a+(<?>) p e = P $ \ t ->+-- trace ("<?> " ++ show e) $+ case runP p t of+ Many rs (LastFail l ts _) ->+ Many rs (LastFail l ts [e])++{-+notFollowedBy :: forall s t a . Prsr s t a -> Prsr s t ()+notFollowedBy p = P $ \ t@(ts,_) ->+ case runP p t of+ Many [] _ -> Many [((), t)] noFail+ _ -> Many [] (LastFail (length ts) (take 1 ts) ["!"])+-}++lookAhead :: forall s t a . Prsr s t a -> Prsr s t ()+lookAhead p = P $ \ t ->+ case runP p t of+ Many [] (LastFail l ts xs) -> Many [] (LastFail l (take 1 ts) xs)+ _ -> Many [((), t)] noFail++nextToken :: forall s t . Prsr s t t+nextToken = P $ \ t@(cs, _) ->+ case cs of+ [] -> Many [] (LastFail (length cs) [] ["!eof"])+ c:_ -> Many [(c, t)] noFail++inject :: forall s t . [t] -> Prsr s t ()+inject s = P $ \ (cs, st) -> Many [((), (s ++ cs, st))] noFail++sepBy1 :: forall s t a sep . Prsr s t a -> Prsr s t sep -> Prsr s t [a]+sepBy1 p sep = (:) <$> p <*> many (sep *> p)++esepBy1 :: forall s t a sep . Prsr s t a -> Prsr s t sep -> Prsr s t [a]+esepBy1 p sep = (:) <$> p <*> emany (sep *> p)++esepBy :: forall s t a sep . Prsr s t a -> Prsr s t sep -> Prsr s t [a]+esepBy p sep = esepBy1 p sep <|< pure []++esepEndBy :: forall s t a sep . Prsr s t a -> Prsr s t sep -> Prsr s t [a]+esepEndBy p sep = esepEndBy1 p sep <|< pure []++esepEndBy1 :: forall s t a sep . Prsr s t a -> Prsr s t sep -> Prsr s t [a]+esepEndBy1 p sep = (:) <$> p <*> ((sep *> esepEndBy p sep) <|< pure [])
+ src/runtime/config-micro-64.h view
@@ -0,0 +1,68 @@+/*+ * Various platform specific configuration.+ */++/*+ * Include stdio functions.+ * Without this none of the file I/O in System.IO is available.+ */+#define WANT_STDIO 0++/*+ * Include ops for floating point arithmetic.+ * Without this +,-,* etc will not be available for the Double type.+ */+#define WANT_FLOAT 0++/*+ * Include <math.h>+ * Without this, exp,sin, etc are not available.+ */+#define WANT_MATH 0++/*+ * Number of bits in a word. Only 32 and 64 are supported.+ */+#define WORD_SIZE 64++/*+ * Find First Set+ * This macro must be defined.+ * It return the number of the least significant bit that is set.+ * Numberings starts from 1. If no bit is set, it should return 0.+ */+#define FFS ffsl++/*+ * This is the character used for comma-separation in printf.+ * Defaults to "'".+ */+/* #define PCOMMA "'" */+++/*+ * Get a raw input character.+ * If undefined, the default always returns -1+ */+/* #define GETRAW */+++/*+ * Get time since some epoch in milliseconds.+ */+/* #define GETTIMEMILLI */+++/*+ * The ERR macro should report an error and exit.+ * If not defined, a generic one will be used.+ */+/* #define ERR(s) */+/* #define ERR1(s,a) */++#define GCRED 0 /* do some reductions during GC */+#define FASTTAGS 1 /* compute tag by pointer subtraction */+#define INTTABLE 1 /* use fixed table of small INT nodes */+#define SANITY 0 /* do some sanity checks */+#define STACKOVL 0 /* check for stack overflow */+
+ src/runtime/config-mingw-64.h view
@@ -0,0 +1,53 @@+/*+ * Various platform specific configuration.+ */++/*+ * Include stdio functions.+ * Without this none of the file I/O in System.IO is available.+ */+#define WANT_STDIO 1++/*+ * Include ops for floating point arithmetic.+ * Without this +,-,* etc will not be available for the Double type.+ */+#define WANT_FLOAT 1++/*+ * Include <math.h>+ * Without this, exp,sin, etc are not available.+ */+#define WANT_MATH 1++/*+ * Number of bits in a word. Only 32 and 64 are supported.+ */+#define WORD_SIZE 64++/*+ * Find First Set+ * This macro must be defined.+ * It return the number of the least significant bit that is set.+ * Numberings starts from 1. If no bit is set, it should return 0.+ */+#define FFS __builtin_ffsll++/*+ * This is the character used for comma-separation in printf.+ * Defaults to "'".+ */+/* #define PCOMMA "'" */++/*+ * The ERR macro should report an error and exit.+ * If not defined, a generic one will be used.+ */+/* #define ERR(s,a) */+/* #define ERR1(s,a) */++#define GCRED 1 /* do some reductions during GC */+#define FASTTAGS 1 /* compute tag by pointer subtraction */+#define INTTABLE 1 /* use fixed table of small INT nodes */+#define SANITY 1 /* do some sanity checks */+#define STACKOVL 1 /* check for stack overflow */
+ src/runtime/config-unix-64.h view
@@ -0,0 +1,140 @@+/*+ * Various platform specific configuration.+ */++/*+ * Include stdio functions.+ * Without this none of the file I/O in System.IO is available.+ */+#define WANT_STDIO 1++/*+ * Include ops for floating point arithmetic.+ * Without this +,-,* etc will not be available for the Double type.+ */+#define WANT_FLOAT 1++/*+ * Include <math.h>+ * Without this, exp,sin, etc are not available.+ */+#define WANT_MATH 1++/*+ * Number of bits in a word. Only 32 and 64 are supported.+ */+#define WORD_SIZE 64++/*+ * Find First Set+ * This macro must be defined.+ * It return the number of the least significant bit that is set.+ * Numberings starts from 1. If no bit is set, it should return 0.+ */+#define FFS ffsl++/*+ * This is the character used for comma-separation in printf.+ * Defaults to "'".+ */+/* #define PCOMMA "'" */+++#include <termios.h>+#include <sys/types.h>+#include <unistd.h>+#include <string.h>+#include <stdlib.h>+#include <fcntl.h>++/*+ * Set the terminal in raw mode and read a single character.+ * Return this character, or -1 on any kind of failure.+ */+static int+getraw(void)+{+ struct termios old, new;+ char c;+ int r;+ + if (tcgetattr(0, &old))+ return -1;+ cfmakeraw(&new);+ if (tcsetattr(0, TCSANOW, &new))+ return -1;+ r = read(0, &c, 1);+ (void)tcsetattr(0, TCSANOW, &old);+ if (r == 1)+ return c;+ else+ return -1;+}+/*+ * Get a raw input character.+ * If undefined, the default always returns -1+ */+#define GETRAW getraw++/*+ * Get time since some epoch in milliseconds.+ */+#include <sys/time.h>+uint64_t+gettimemilli(void)+{+ struct timeval tv;+ (void)gettimeofday(&tv, NULL);+ return tv.tv_sec * 1000 + tv.tv_usec / 1000;+}+#define GETTIMEMILLI gettimemilli++/*+ * Create a unique file name.+ * This is a very dodgy implementation.+ * XXX This functions drags in a lot of functionality.+ */+char*+tmpname(const char* pre, const char* suf)+{+ int pid = (int)getpid();+ char *tmp = getenv("TMPDIR");+ if (!tmp)+ tmp = "/tmp";+ char *s = malloc(strlen(tmp) + 1 + strlen(pre) + 5 + strlen(suf) + 1);+ /* This might loop forever. See if I care. :) */+ for(;;) {+ strcpy(s, tmp);+ strcat(s, "/");+ strcat(s, pre);+ /* Insert 8 digits of the PID */+ char *p = s + strlen(s) + 10;+ *p-- = 0;+ for(int i = 0; i < 10; i++) {+ *p-- = pid % 10 + '0';+ pid /= 10;+ }+ strcat(s, suf);+ /* The file name is ready, do a quick if check that we can create it */+ int fd = open(s, O_CREAT | O_EXCL, 0600);+ if (fd >= 0) {+ close(fd); /* Close it again */+ return s;+ }+ pid++; /* try with a different pid */+ }+}+#define TMPNAME tmpname++/*+ * The ERR macro should report an error and exit.+ * If not defined, a generic one will be used.+ */+/* #define ERR(s) */+/* #define ERR1(s,a) */++#define GCRED 1 /* do some reductions during GC */+#define FASTTAGS 1 /* compute tag by pointer subtraction */+#define INTTABLE 1 /* use fixed table of small INT nodes */+#define SANITY 1 /* do some sanity checks */+#define STACKOVL 1 /* check for stack overflow */
+ src/runtime/config-windows-64.h view
@@ -0,0 +1,101 @@+/*+ * Various platform specific configuration.+ */++/*+ * Include stdio functions.+ * Without this none of the file I/O in System.IO is available.+ */+#define WANT_STDIO 1++/*+ * Include ops for floating point arithmetic.+ * Without this +,-,* etc will not be available for the Double type.+ */+#define WANT_FLOAT 1++/*+ * Include <math.h>+ * Without this, exp,sin, etc are not available.+ */+#define WANT_MATH 1++/*+ * Number of bits in a word. Only 32 and 64 are supported.+ */+#define WORD_SIZE 64++/*+ * Find First Set+ * This macro must be defined.+ * It return the number of the least significant bit that is set.+ * Numberings starts from 1. If no bit is set, it should return 0.+ */+#include <intrin.h>+//#pragma warning(disable : 4996)+#pragma intrinsic(_BitScanForward64)+static inline int+FFS(int64_t arg)+{+ unsigned long r;+ if (_BitScanForward64(&r, arg))+ return (int)(r+1);+ else+ return 0;+}++/*+ * This is the character used for comma-separation in printf.+ * Defaults to "'".+ * Windows does not support this.+ */+#define PCOMMA ""++/*+ * Get a raw input character.+ * If undefined, the default always returns -1+ */+/* #define GETRAW getraw */++/*+ * Get time since some epoch in milliseconds.+ * If undefined, return 0.+ */+#define GETTIMEMILLI gettimemilli+#define WIN32_LEAN_AND_MEAN+#include <Windows.h>++uint64_t+gettimemilli(void)+{+ static const uint64_t EPOCH = ((uint64_t) 116444736000000000ULL);++ SYSTEMTIME system_time;+ FILETIME file_time;+ uint64_t time, msec;++ GetSystemTime( &system_time );+ SystemTimeToFileTime( &system_time, &file_time );+ time = ((uint64_t)file_time.dwLowDateTime ) ;+ time += ((uint64_t)file_time.dwHighDateTime) << 32;++ msec = (time - EPOCH) / 10000L;+ //msec = time + system_time.wMilliseconds;+ return msec;+}++/* Make this empty */+#define NORETURN++/*+ * The ERR macro should report an error and exit.+ * If not defined, a generic one will be used.+ */+/* #define ERR(s) */+/* #define ERR1(s,a) */++#define GCRED 1 /* do some reductions during GC */+#define FASTTAGS 1 /* compute tag by pointer subtraction */+#define INTTABLE 1 /* use fixed table of small INT nodes */+#define SANITY 1 /* do some sanity checks */+#define STACKOVL 1 /* check for stack overflow */
+ src/runtime/eval.c view
@@ -0,0 +1,2388 @@+/* Copyright 2023 Lennart Augustsson+ * See LICENSE file for full license.+ */+#include <inttypes.h>++#include "config-unix-64.h"+//#include "config-micro-64.h"++#if WANT_STDIO+#include <stdio.h>+#include <locale.h>+#endif /* WANT_STDIO */+#include <stdlib.h>+#include <string.h>+#include <ctype.h>+#include <setjmp.h>+#if WANT_MATH+#include <math.h>+#endif /* WANT_MATH */++#define VERSION "v5.1\n"++typedef intptr_t value_t; /* Make value the same size as pointers, since they are in a union */+#define PRIvalue PRIdPTR+typedef uintptr_t uvalue_t; /* Make unsigned value the same size as pointers, since they are in a union */+#define PRIuvalue PRIuPTR+typedef uintptr_t heapoffs_t; /* Heap offsets */+#define PRIheap PRIuPTR+typedef uintptr_t tag_t; /* Room for tag, low order bit indicates AP/not-AP */+typedef intptr_t stackptr_t; /* Index into stack */+/* These types can be changed for 32 bit platforms. */+typedef uint64_t counter_t; /* Statistics counter, can be smaller since overflow doesn't matter */+#define PRIcounter PRIu64+typedef uint64_t bits_t; /* One word of bits */++/* We cast all FFI functions to this type. It's reasonably portable */+typedef void (*funptr_t)(void);++#if !defined(PCOMMA)+#define PCOMMA "'"+#endif /* !defined(PCOMMA) */++#if !defined(GETRAW)+int GETRAW(void) { return -1; }+#endif /* !defined(getraw) */++#if !defined(GETTIMEMILLI)+uint64_t GETTIMEMILLI(void) { return 0; }+#endif /* !define(GETTIMEMILLI) */++#if !defined(TMPNAME)+char* TMPNAME(const char* pre, const char* post) {+ char *s = malloc(strlen(pre) + 3 + strlen(post) + 1);+ strcpy(s, pre);+ strcat(s, "TMP");+ strcat(s, post);+ return s;+}+#endif++#if !defined(INLINE)+#define INLINE inline+#endif /* !define(INLINE) */++#if !defined(NORETURN)+#define NORETURN __attribute__ ((noreturn))+#endif /* !defined(NORETURN) */++/***************************************/++/* Keep permanent nodes for LOW_INT <= i < HIGH_INT */+#define LOW_INT (-10)+#define HIGH_INT 256++#define HEAP_CELLS 50000000+#define STACK_SIZE 100000++#if !defined(ERR)+#if WANT_STDIO+#define ERR(s) do { fprintf(stderr,"ERR: "s"\n"); exit(1); } while(0)+#define ERR1(s,a) do { fprintf(stderr,"ERR: "s"\n",a); exit(1); } while(0)+#else /* WANT_STDIO */+#define ERR(s) exit(1)+#define ERR1(s,a) exit(1)+#endif /* WANT_STDIO */+#endif /* !define(ERR) */++enum node_tag { T_FREE, T_IND, T_AP, T_INT, T_DBL, T_PTR, T_BADDYN, T_S, T_K, T_I, T_B, T_C,+ T_A, T_Y, T_SS, T_BB, T_CC, T_P, T_R, T_O, T_U, T_Z,+ T_ADD, T_SUB, T_MUL, T_QUOT, T_REM, T_SUBR, T_UQUOT, T_UREM, T_NEG,+ T_AND, T_OR, T_XOR, T_INV, T_SHL, T_SHR, T_ASHR,+ T_EQ, T_NE, T_LT, T_LE, T_GT, T_GE, T_ULT, T_ULE, T_UGT, T_UGE,+ T_TOPTR, T_TOINT, T_TODBL,+#if WANT_FLOAT+ T_FADD, T_FSUB, T_FMUL, T_FDIV, T_FNEG, T_ITOF,+ T_FEQ, T_FNE, T_FLT, T_FLE, T_FGT, T_FGE, T_FSHOW, T_FREAD,+#endif+ T_ERROR, T_NODEFAULT, T_NOMATCH, T_SEQ, T_EQUAL, T_COMPARE, T_RNF,+ T_IO_BIND, T_IO_THEN, T_IO_RETURN,+ T_IO_SERIALIZE, T_IO_DESERIALIZE,+ T_IO_STDIN, T_IO_STDOUT, T_IO_STDERR, T_IO_GETARGS, T_IO_DROPARGS,+ T_IO_PERFORMIO, T_IO_GETTIMEMILLI, T_IO_PRINT, T_IO_CATCH,+ T_IO_CCALL, T_DYNSYM,+ T_NEWCASTRING, T_PEEKCASTRING,+ T_STR,+ T_LAST_TAG,+};+const char* tag_names[] = {+ "FREE", "IND", "AP", "INT", "DBL", "PTR", "BADDYN", "S", "K", "I", "B", "C",+ "A", "Y", "SS", "BB", "CC", "P", "R", "O", "U", "Z",+ "ADD", "SUB", "MUL", "QUOT", "REM", "SUBR", "UQUOT", "UREM", "NEG",+ "AND", "OR", "XOR", "INV", "SHL", "SHR", "ASHR",+ "EQ", "NE", "LT", "LE", "GT", "GE", "ULT", "ULE", "UGT", "UGE",+ "TOPTR", "TOINT", "TODBL",+#if WANT_FLOAT+ "FADD", "FSUB", "FMUL", "FDIV", "FNEG", "ITOF",+ "FEQ", "FNE", "FLT", "FLE", "FGT", "FGE", "FSHOW", "FREAD",+#endif+ "ERROR", "NODEFAULT", "NOMATCH", "SEQ", "EQUAL", "COMPARE", "RNF",+ "IO_BIND", "IO_THEN", "IO_RETURN",+ "IO_SERIALIZE", "IO_DESERIALIZE",+ "IO_STDIN", "IO_STDOUT", "IO_STDERR", "IO_GETARGS", "IO_DROPARGS",+ "IO_PERFORMIO", "IO_GETTIMEMILLI", "IO_PRINT", "IO_CATCH",+ "IO_CCALL", "DYNSYM",+ "NEWCASTRING", "PEEKCASTRING",+ "STR",+ "LAST_TAG",+};++typedef struct node {+ union {+ struct node *uufun;+ tag_t uutag; /* LSB=1 indicates that this is a tag, LSB=0 that this is a T_AP node */+ } ufun;+ union {+ struct node *uuarg;+ value_t uuvalue;+ double uudoublevalue;+ const char *uustring;+ void *uuptr;+ } uarg;+} node;+typedef struct node* NODEPTR;+#define NIL 0+#define HEAPREF(i) &cells[(i)]+#define GETTAG(p) ((p)->ufun.uutag & 1 ? (int)((p)->ufun.uutag >> 1) : T_AP)+#define SETTAG(p,t) do { if (t != T_AP) (p)->ufun.uutag = ((t) << 1) + 1; } while(0)+#define GETVALUE(p) (p)->uarg.uuvalue+#define GETDBLVALUE(p) (p)->uarg.uudoublevalue+#define SETVALUE(p,v) (p)->uarg.uuvalue = v+#define SETDBLVALUE(p,v) (p)->uarg.uudoublevalue = v+#define FUN(p) (p)->ufun.uufun+#define ARG(p) (p)->uarg.uuarg+#define STR(p) (p)->uarg.uustring+#define PTR(p) (p)->uarg.uuptr+#define INDIR(p) ARG(p)+#define NODE_SIZE sizeof(node)+#define ALLOC_HEAP(n) do { cells = malloc(n * sizeof(node)); memset(cells, 0x55, n * sizeof(node)); } while(0)+#define LABEL(n) ((heapoffs_t)((n) - cells))+node *cells; /* All cells */++counter_t num_reductions = 0;+counter_t num_alloc;+counter_t num_gc = 0;+uint64_t gc_mark_time = 0;+uint64_t run_time = 0;++NODEPTR *stack;+stackptr_t stack_ptr = -1;+#if STACKOVL+#define PUSH(x) do { if (stack_ptr >= stack_size-1) ERR("stack overflow"); stack[++stack_ptr] = (x); } while(0)+#else /* SANITY */+#define PUSH(x) do { stack[++stack_ptr] = (x); } while(0)+#endif /* SANITY */+#define TOP(n) stack[stack_ptr - (n)]+#define POP(n) stack_ptr -= (n)+#define GCCHECK(n) gc_check((n))++heapoffs_t heap_size = HEAP_CELLS; /* number of heap cells */+heapoffs_t heap_start; /* first location in heap that needs GC */+stackptr_t stack_size = STACK_SIZE;++counter_t num_marked;+counter_t max_num_marked = 0;+counter_t num_free;++#define BITS_PER_WORD (sizeof(bits_t) * 8)+bits_t *free_map; /* 1 bit per node, 0=free, 1=used */+heapoffs_t free_map_nwords;+heapoffs_t next_scan_index;++NORETURN+void+memerr(void)+{+ ERR("Out of memory");+ exit(1);+}++/***************** BFILE *******************/++/* BFILE will have different implementations, they all have these methods */+typedef struct BFILE {+ int (*getb)(struct BFILE*);+ void (*ungetb)(int c, struct BFILE*);+ void (*closeb)(struct BFILE*);+} BFILE;++/*** BFILE from static buffer ***/+struct BFILE_buffer {+ BFILE mets;+ size_t b_size;+ size_t b_pos;+ uint8_t *b_buffer;+};++int+getb_buf(BFILE *bp)+{+ struct BFILE_buffer *p = (struct BFILE_buffer *)bp;+ if (p->b_pos >= p->b_size)+ return -1;+ return p->b_buffer[p->b_pos++];+}++void+ungetb_buf(int c, BFILE *bp)+{+ struct BFILE_buffer *p = (struct BFILE_buffer *)bp;+ if (p->b_pos == 0)+ ERR("ungetb");+ p->b_buffer[--p->b_pos] = (uint8_t)c;+}++void+closeb_buf(BFILE *bp)+{+ (void)bp; /* shut up warning */+}++#if WANT_STDIO+/*** BFILE via FILE ***/+struct BFILE_file {+ BFILE mets;+ FILE *file;+};++int+getb_file(BFILE *bp)+{+ struct BFILE_file *p = (struct BFILE_file *)bp;+ return fgetc(p->file);+}++void+ungetb_file(int c, BFILE *bp)+{+ struct BFILE_file *p = (struct BFILE_file *)bp;+ ungetc(c, p->file);+}++void+closeb_file(BFILE *bp)+{+ struct BFILE_file *p = (struct BFILE_file *)bp;+ free(p);+}++BFILE *+openb_FILE(FILE *f)+{+ struct BFILE_file *p = malloc(sizeof (struct BFILE_file));+ if (!p)+ memerr();+ p->mets.getb = getb_file;+ p->mets.ungetb = ungetb_file;+ p->mets.closeb = closeb_file;+ p->file = f;+ return (BFILE*)p;+}+#endif++/*** BFILE via simple LZW decompression ***/++#define DICTSIZE 4096+#define ASCIISIZE 96 /* ' ' - '~', '\n' */++struct BFILE_lzw {+ BFILE mets;+ BFILE *bfile; /* underlying BFILE */+ int unget; /* storage for a single ungetb */+ char *table[DICTSIZE]; /* dictionary */+ int table_size; /* next dictionary slot */+ char *ptr; /* pointer into output string */+ int old; /* previous code word */+ int ch; /* previous first character */+ char buf[DICTSIZE+1]; /* buffer holding output string */+ int rdstate; /* state of 3 bytes to 2 codewords transducer */+ int rdres; /* saved transducer bits */+};++/* Get a code word. It's 12 bits, so 2 codewords are spread over 3 bytes.+ * XXX This has 4096 hardcoded.+*/+int+getcode_lzw(struct BFILE_lzw *p)+{+ int r;++ if (p->rdstate == 0) {+ r = p->bfile->getb(p->bfile);+ if (r < 0)+ return -1;+ r |= p->bfile->getb(p->bfile) << 8;+ p->rdres = r >> 12; /* save 4 bits */+ p->rdstate = 1;+ return r & 0xfff;+ } else {+ r = p->rdres;+ r |= p->bfile->getb(p->bfile) << 4;+ p->rdstate = 0;+ return r;+ }+}++char *+str_lzw(const char *s, int c)+{+ int l = strlen(s);+ char *p = malloc(l + 1 + 1);+ if (!p)+ memerr();+ strcpy(p, s);+ p[l] = c;+ p[l+1] = '\0';+ return p;+}++int+getb_lzw(BFILE *bp)+{+ struct BFILE_lzw *p = (struct BFILE_lzw*)bp;+ char *s;+ int c, n;++ /* Do we have an ungetb character? */+ if (p->unget) {+ c = p->unget;+ p->unget = 0;+ return c;+ }+ /* Are we in the middle of emitting a string? */+ if (p->ptr) {+ c = *p->ptr++;+ if (c) {+ //printf("c='%c'\n", c);+ return c;+ }+ p->ptr = 0;+ }+ n = getcode_lzw(p);+ if (n < 0)+ return -1;+ if (n >= DICTSIZE)+ ERR("getcode_lzw 1");+ s = p->table[n];+ if (!s) {+ char *os = p->table[p->old];+ strcpy(p->buf, os);+ int l = strlen(os);+ p->buf[l++] = p->ch;+ p->buf[l] = '\0';+ } else {+ strcpy(p->buf, s);+ }+ p->ptr = p->buf;+ p->ch = p->buf[0];+ if (p->table_size < DICTSIZE) {+ p->table[p->table_size++] = str_lzw(p->table[p->old], p->ch);+ }+ p->old = n;+ return *p->ptr++;+}++void+ungetb_lzw(int c, BFILE *bp)+{+ struct BFILE_lzw *p = (struct BFILE_lzw*)bp;+ if (p->unget)+ ERR("ungetb_lzw");+ p->unget = c;+}++void+closeb_lzw(BFILE *bp)+{+ struct BFILE_lzw *p = (struct BFILE_lzw*)bp;++ for (int i = 0; i < DICTSIZE; i++) {+ if (p->table[i])+ free(p->table[i]);+ }+ p->bfile->closeb(p->bfile);+ free(p);+}++BFILE *+add_lzw_decompressor(BFILE *file)+{+ struct BFILE_lzw *p = calloc(1, sizeof(struct BFILE_lzw));+ int i;+ + if (!p)+ memerr();+ p->mets.getb = getb_lzw;+ p->mets.ungetb = ungetb_lzw;+ p->mets.closeb = closeb_lzw;+ p->bfile = file;++ /* initialize dictionary with printable ASCII */+ for(i = 0; i < ASCIISIZE-1; i++) {+ p->table[i] = str_lzw("", i + ' ');+ }+ p->table[i++] = str_lzw("", '\n');+ p->table_size = i;++ /* set up decompressore state */+ p->old = getcode_lzw(p);+ strcpy(p->buf, p->table[p->old]);+ p->ch = p->buf[0];+ p->ptr = p->buf;+ + return (BFILE *)p;+}++/*****************************************************************************/++struct handler {+ jmp_buf hdl_buf; /* env storage */+ struct handler *hdl_old; /* old handler */+ stackptr_t hdl_stack; /* old stack pointer */+ NODEPTR hdl_exn; /* used temporarily to pass the exception value */+} *cur_handler = 0;++/* Set FREE bit to 0 */+static INLINE void mark_used(NODEPTR n)+{+ heapoffs_t i = LABEL(n);+ if (i < heap_start)+ return;+#if SANITY+ if (i >= free_map_nwords * BITS_PER_WORD) ERR("mark_used");+#endif+ free_map[i / BITS_PER_WORD] &= ~(1ULL << (i % BITS_PER_WORD));+}++/* Test if FREE bit is 0 */+static INLINE int is_marked_used(NODEPTR n)+{+ heapoffs_t i = LABEL(n);+ if (i < heap_start)+ return 1;+#if SANITY+ if (i >= free_map_nwords * BITS_PER_WORD) ERR("is_marked_used");;+#endif+ return (free_map[i / BITS_PER_WORD] & (1ULL << (i % BITS_PER_WORD))) == 0;+}++static INLINE void mark_all_free(void)+{+ memset(free_map, ~0, free_map_nwords * sizeof(bits_t));+ next_scan_index = heap_start;+}++int glob_argc;+char **glob_argv;++int verbose = 0;++static INLINE NODEPTR+alloc_node(enum node_tag t)+{+#if SANITY+ if (num_free <= 0)+ ERR("alloc_node");+#endif++ heapoffs_t i = next_scan_index / BITS_PER_WORD;+ int k; /* will contain bit pos + 1 */+ for(;;) {+ heapoffs_t word = free_map[i];+ k = FFS(word);+ if (k)+ break;+ i++;+#if SANITY+ if (i >= free_map_nwords)+ ERR("alloc_node free_map");+#endif+ }+ heapoffs_t pos = i * BITS_PER_WORD + k - 1; /* first free node */+ NODEPTR n = HEAPREF(pos);+ mark_used(n);+ next_scan_index = pos;++ SETTAG(n, t);+ num_alloc++;+ num_free--;+ return n;+}++static INLINE NODEPTR+new_ap(NODEPTR f, NODEPTR a)+{+ NODEPTR n = alloc_node(T_AP);+ FUN(n) = f;+ ARG(n) = a;+ return n;+}++/* Needed during reduction */+NODEPTR intTable[HIGH_INT - LOW_INT];+NODEPTR combFalse, combTrue, combUnit, combCons;+NODEPTR combCC, combZ, combIOBIND;+NODEPTR combLT, combEQ, combGT;++/* One node of each kind for primitives, these are never GCd. */+/* We use linear search in this, because almost all lookups+ * are among the combinators.+ */+struct {+ char *name;+ enum node_tag tag;+ NODEPTR node;+} primops[] = {+ /* combinators */+ /* sorted by frequency in a typical program */+ { "B", T_B },+ { "O", T_O },+ { "K", T_K },+ { "C'", T_CC },+ { "C", T_C },+ { "A", T_A },+ { "S'", T_SS },+ { "P", T_P },+ { "R", T_R },+ { "I", T_I },+ { "S", T_S },+ { "U", T_U },+ { "Y", T_Y },+ { "B'", T_BB },+ { "Z", T_Z },+ /* primops */+ { "+", T_ADD },+ { "-", T_SUB },+ { "*", T_MUL },+ { "quot", T_QUOT },+ { "rem", T_REM },+ { "uquot", T_UQUOT },+ { "urem", T_UREM },+ { "subtract", T_SUBR },+ { "neg", T_NEG },+ { "and", T_AND },+ { "or", T_OR },+ { "xor", T_XOR },+ { "inv", T_INV },+ { "shl", T_SHL },+ { "shr", T_SHR },+ { "ashr", T_ASHR },+#if WANT_FLOAT+ { "fadd" , T_FADD},+ { "fsub" , T_FSUB},+ { "fmul" , T_FMUL},+ { "fdiv", T_FDIV},+ { "fneg", T_FNEG},+ { "itof", T_ITOF},+ { "feq", T_FEQ},+ { "fne", T_FNE},+ { "flt", T_FLT},+ { "fle", T_FLE},+ { "fgt", T_FGT},+ { "fge", T_FGE},+ { "fshow", T_FSHOW},+ { "fread", T_FREAD},+#endif /* WANT_FLOAT */+ { "==", T_EQ },+ { "/=", T_NE },+ { "<", T_LT },+ { "u<", T_ULT },+ { "u<=", T_ULE },+ { "u>", T_UGT },+ { "u>=", T_UGE },+ { "<=", T_LE },+ { ">", T_GT },+ { ">=", T_GE },+ { "seq", T_SEQ },+ { "error", T_ERROR },+ { "noDefault", T_NODEFAULT },+ { "noMatch", T_NOMATCH },+ { "equal", T_EQUAL },+ { "compare", T_COMPARE },+ { "rnf", T_RNF },+ /* IO primops */+ { "IO.>>=", T_IO_BIND },+ { "IO.>>", T_IO_THEN },+ { "IO.return", T_IO_RETURN },+ { "IO.serialize", T_IO_SERIALIZE },+ { "IO.print", T_IO_PRINT },+ { "IO.deserialize", T_IO_DESERIALIZE },+ { "IO.stdin", T_IO_STDIN },+ { "IO.stdout", T_IO_STDOUT },+ { "IO.stderr", T_IO_STDERR },+ { "IO.getArgs", T_IO_GETARGS },+ { "IO.dropArgs", T_IO_DROPARGS },+ { "IO.getTimeMilli", T_IO_GETTIMEMILLI },+ { "IO.performIO", T_IO_PERFORMIO },+ { "IO.catch", T_IO_CATCH },+ { "dynsym", T_DYNSYM },+ { "newCAString", T_NEWCASTRING },+ { "peekCAString", T_PEEKCASTRING },+ { "toPtr", T_TOPTR },+ { "toInt", T_TOINT },+ { "toDbl", T_TODBL },+};++void+init_nodes(void)+{+ ALLOC_HEAP(heap_size);+ free_map_nwords = (heap_size + BITS_PER_WORD - 1) / BITS_PER_WORD; /* bytes needed for free map */+ free_map = malloc(free_map_nwords * sizeof(bits_t));+ if (!free_map)+ memerr();++ /* Set up permanent nodes */+ heap_start = 0;+#if !FASTTAGS+ for (int j = 0; j < sizeof primops / sizeof primops[0];j++) {+ NODEPTR n = HEAPREF(heap_start++);+ primops[j].node = n;+ //MARK(n) = MARKED;+ SETTAG(n, primops[j].tag);+ switch (primops[j].tag) {+ case T_K: combFalse = n; break;+ case T_A: combTrue = n; break;+ case T_I: combUnit = n; break;+ case T_O: combCons = n; break;+ case T_CC: combCC = n; break;+ case T_Z: combZ = n; break;+ case T_IO_BIND: combIOBIND = n; break;+#if WANT_STDIO+ case T_IO_STDIN: SETTAG(n, T_PTR); PTR(n) = stdin; break;+ case T_IO_STDOUT: SETTAG(n, T_PTR); PTR(n) = stdout; break;+ case T_IO_STDERR: SETTAG(n, T_PTR); PTR(n) = stderr; break;+#endif /* WANT_STDIO */+ default:+ break;+ }+ }+#else+ for(enum node_tag t = T_FREE; t < T_LAST_TAG; t++) {+ NODEPTR n = HEAPREF(heap_start++);+ SETTAG(n, t);+ switch (t) {+ case T_K: combFalse = n; break;+ case T_A: combTrue = n; break;+ case T_I: combUnit = n; break;+ case T_O: combCons = n; break;+ case T_CC: combCC = n; break;+ case T_Z: combZ = n; break;+ case T_IO_BIND: combIOBIND = n; break;+#if WANT_STDIO+ case T_IO_STDIN: SETTAG(n, T_PTR); PTR(n) = stdin; break;+ case T_IO_STDOUT: SETTAG(n, T_PTR); PTR(n) = stdout; break;+ case T_IO_STDERR: SETTAG(n, T_PTR); PTR(n) = stderr; break;+#endif+ default:+ break;+ }+ for (int j = 0; j < sizeof primops / sizeof primops[0];j++) {+ if (primops[j].tag == t) {+ primops[j].node = n;+ }+ }+ }+#endif++ /* The representation of the constructors of+ * data Ordering = LT | EQ | GT+ * do not have single constructors.+ * But we can make compound one, since they are irreducible.+ */+#define NEWAP(c, f, a) do { NODEPTR n = HEAPREF(heap_start++); SETTAG(n, T_AP); FUN(n) = (f); ARG(n) = (a); (c) = n;} while(0)+ NEWAP(combLT, combZ, combFalse); /* Z B */+ NEWAP(combEQ, combFalse, combFalse); /* K K */+ NEWAP(combGT, combFalse, combTrue); /* K A */+#undef NEWAP++#if INTTABLE+ /* Allocate permanent Int nodes */+ for (int i = LOW_INT; i < HIGH_INT; i++) {+ NODEPTR n = HEAPREF(heap_start++);+ intTable[i - LOW_INT] = n;+ SETTAG(n, T_INT);+ SETVALUE(n, i);+ }+#endif++ /* Round up heap_start to the next bitword boundary to avoid the permanent nodes. */+ heap_start = (heap_start + BITS_PER_WORD - 1) / BITS_PER_WORD * BITS_PER_WORD;++ mark_all_free();++ num_free = heap_size - heap_start;+}++#if GCRED+int red_a, red_k, red_i, red_int;+#endif++//counter_t mark_depth;++/* Mark all used nodes reachable from *np */+void+mark(NODEPTR *np)+{+ NODEPTR n;+#if GCRED+ value_t i;+#endif++ // mark_depth++;+ // if (mark_depth % 10000 == 0)+ // printf("mark depth %"PRIcounter"\n", mark_depth);+ top:+ n = *np;+ if (GETTAG(n) == T_IND) {+#if SANITY+ int loop = 0;+ /* Skip indirections, and redirect start pointer */+ while (GETTAG(n) == T_IND) {+ // printf("*"); fflush(stdout);+ n = INDIR(n);+ if (loop++ > 10000000) {+ //printf("%p %p %p\n", n, INDIR(n), INDIR(INDIR(n)));+ ERR("IND loop");+ }+ }+ // if (loop)+ // printf("\n");+#else /* SANITY */+ while (GETTAG(n) == T_IND) {+ n = INDIR(n);+ }+#endif /* SANITY */+ *np = n;+ }+ if (is_marked_used(n)) {+ // mark_depth--;+ return;+ }+ num_marked++;+ mark_used(n);+#if GCRED+ /* This is really only fruitful just after parsing. It can be removed. */+ if (GETTAG(n) == T_AP && GETTAG(FUN(n)) == T_AP && GETTAG(FUN(FUN(n))) == T_A) {+ /* Do the A x y --> y reduction */+ NODEPTR y = ARG(n);+ SETTAG(n, T_IND);+ INDIR(n) = y;+ red_a++;+ goto top;+ }+#if 0+ /* This never seems to happen */+ if (GETTAG(n) == T_AP && GETTAG(FUN(n)) == T_AP && GETTAG(FUN(FUN(n))) == T_K) {+ /* Do the K x y --> x reduction */+ NODEPTR x = ARG(FUN(n));+ SETTAG(n, T_IND);+ INDIR(n) = x;+ red_k++;+ goto top;+ }+#endif+ if (GETTAG(n) == T_AP && GETTAG(FUN(n)) == T_I) {+ /* Do the I x --> x reduction */+ NODEPTR x = ARG(n);+ SETTAG(n, T_IND);+ INDIR(n) = x;+ red_i++;+ goto top;+ }+#if INTTABLE+ if (GETTAG(n) == T_INT && LOW_INT <= (i = GETVALUE(n)) && i < HIGH_INT) {+ SETTAG(n, T_IND);+ INDIR(n) = intTable[i - LOW_INT];+ red_int++;+ goto top;+ }+#endif /* INTTABLE */+#endif /* GCRED */+ if (GETTAG(n) == T_AP) {+#if 1+ mark(&FUN(n));+ //mark(&ARG(n));+ np = &ARG(n);+ goto top; /* Avoid tail recursion */+#else+ mark(&ARG(n));+ np = &FUN(n);+ goto top; /* Avoid tail recursion */+#endif+ }+}++/* Perform a garbage collection:+ - First mark from all roots; roots are on the stack.+*/+void+gc(void)+{+ num_gc++;+ num_marked = 0;+#if WANT_STDIO+ if (verbose > 1)+ fprintf(stderr, "gc mark\n");+#endif+ gc_mark_time -= GETTIMEMILLI();+ mark_all_free();+ // mark_depth = 0;+ for (stackptr_t i = 0; i <= stack_ptr; i++)+ mark(&stack[i]);+ gc_mark_time += GETTIMEMILLI();++ if (num_marked > max_num_marked)+ max_num_marked = num_marked;+ num_free = heap_size - heap_start - num_marked;+ if (num_free < heap_size / 50)+ ERR("heap exhausted");+#if WANT_STDIO+ if (verbose > 1)+ fprintf(stderr, "gc done, %"PRIcounter" free\n", num_free);+#endif /* !WANT_STDIO */+}++/* Check that there are k nodes available, if not then GC. */+static INLINE void+gc_check(size_t k)+{+ if (k < num_free)+ return;+#if WANT_STDIO+ if (verbose > 1)+ fprintf(stderr, "gc_check: %d\n", (int)k);+#endif+ gc();+}++/*+ * Table of FFI callable functions.+ * (For a more flexible solution use dlopen()/dlsym()/dlclose())+ * The table contains the information needed to do the actual call.+ * V void+ * I value_t+ * i int+ * D double+ * P void*+ * The types are+ * V void name(void)+ * i int name(void)+ * I value_t name(voi)+ * IV void name(value_t)+ * II value_t name(value_t)+ * IIV void name(value_t, value_t)+ * III value_t name(value_t, value_t)+ * DD double name(double)+ * Pi int name(void*)+ * PI value_t name(void*)+ * PP void* name(void*)+ * iPi int name(int, void*)+ * PPI value_t name(void*, void*)+ * PPP void* name(void*, void*)+ * more can easily be added.+ */+struct {+ const char *ffi_name;+ const funptr_t ffi_fun;+ enum { FFI_V, FFI_I, FFI_IV, FFI_II, FFI_IIV, FFI_III, FFI_DD, FFI_PI,+ FFI_i, FFI_Pi, FFI_iPi,+ FFI_PPI, FFI_PP, FFI_PPP, FFI_IPI, FFI_PV, FFI_IP+ } ffi_how;+} ffi_table[] = {+ { "llabs", (funptr_t)llabs, FFI_II },+#if WANT_MATH+ { "log", (funptr_t)log, FFI_DD },+ { "exp", (funptr_t)exp, FFI_DD },+ { "sqrt", (funptr_t)sqrt, FFI_DD },+ { "sin", (funptr_t)sin, FFI_DD },+ { "cos", (funptr_t)cos, FFI_DD },+ { "tan", (funptr_t)tan, FFI_DD },+ { "asin", (funptr_t)asin, FFI_DD },+ { "acos", (funptr_t)acos, FFI_DD },+ { "atan", (funptr_t)atan, FFI_DD },+#endif /* WANT_MATH */+ { "getenv", (funptr_t)getenv, FFI_PP },++ { "getRaw", (funptr_t)GETRAW, FFI_i },+#if WANT_STDIO+ { "fgetc", (funptr_t)fgetc, FFI_Pi },+ { "fputc", (funptr_t)fputc, FFI_iPi },+ // { "cprint", (funptr_t)cprint, FFI_PAV },+ // { "serialize",(funptr_t)serialize, FFI_PAV },+ // { "deserialize",(funptr_t)deserialize, FFI_PA },+ { "fclose", (funptr_t)fclose, FFI_Pi },+ { "fflush", (funptr_t)fflush, FFI_Pi },+ { "fopen", (funptr_t)fopen, FFI_PPP },+ { "tmpname", (funptr_t)TMPNAME, FFI_PPP },+ { "unlink", (funptr_t)unlink, FFI_Pi },+ { "system", (funptr_t)system, FFI_Pi },+#endif /* WANT_STDIO */+ // { "getArgs", (funptr_t)getArgs, FFI_A },+ { "getTimeMilli",(funptr_t)GETTIMEMILLI, FFI_I },+ { "free", (funptr_t)free, FFI_PV },+ { "malloc", (funptr_t)malloc, FFI_IP }, /* The I is really a size_t */+};++/* Look up an FFI function by name */+value_t+lookupFFIname(const char *name)+{+ for(int i = 0; i < sizeof(ffi_table) / sizeof(ffi_table[0]); i++)+ if (strcmp(ffi_table[i].ffi_name, name) == 0)+ return (value_t)i;+ return -1;+}++NODEPTR+ffiNode(const char *buf)+{+ NODEPTR r;+ value_t i = lookupFFIname(buf);+ if (i < 0) {+ /* lookup failed, generate a node that will dynamically generate an error */+ r = alloc_node(T_BADDYN);+ char *fun = malloc(strlen(buf) + 1);+ strcpy(fun, buf);+ STR(r) = fun;+ } else {+ r = alloc_node(T_IO_CCALL);+ SETVALUE(r, i);+ }+ return r;+}++/* If the next input character is c, then consume it, else leave it alone. */+int+gobble(BFILE *f, int c)+{+ int d = f->getb(f);+ if (c == d) {+ return 1;+ } else {+ f->ungetb(d, f);+ return 0;+ }+}++/* Get a non-terminating character. ' ' and ')' terminate a token. */+int+getNT(BFILE *f)+{+ int c;+ + c = f->getb(f);+ if (c == ' ' || c == ')') {+ f->ungetb(c, f);+ return 0;+ } else {+ return c;+ }+}++value_t+parse_int(BFILE *f)+{+ value_t i = 0;+ value_t neg = 1;+ int c = f->getb(f);+ if (c == '-') {+ neg = -1;+ c = f->getb(f);+ }+ for(;;) {+ i = i * 10 + c - '0';+ c = f->getb(f);+ if (c < '0' || c > '9') {+ f->ungetb(c, f);+ break;+ }+ }+ return neg * i;+}++double+parse_double(BFILE *f)+{+ // apparently longest float, when rendered, takes up 24 characters. We add one more for a potential+ // minus sign, and another one for the final null terminator.+ // https://stackoverflow.com/questions/1701055/what-is-the-maximum-length-in-chars-needed-to-represent-any-double-value+ char buf[26];+ for(int j = 0; (buf[j] = getNT(f)); j++)+ ;++ return strtod(buf, NULL);;+}++NODEPTR+mkStrNode(const char *str)+{+ NODEPTR n = alloc_node(T_STR);+ STR(n) = str;+ return n;+}++NODEPTR mkInt(value_t i);+NODEPTR mkDbl(double d);+NODEPTR mkPtr(void* p);++/* Table of labelled nodes for sharing during parsing. */+struct shared_entry {+ heapoffs_t label;+ NODEPTR node; /* NIL indicates unused */+} *shared_table;+heapoffs_t shared_table_size;++/* Look for the label in the table.+ * If it's found, return the node.+ * If not found, return the first empty entry.+*/+NODEPTR *+find_label(heapoffs_t label)+{+ int hash = (int)(label % shared_table_size);+ for(int i = hash; ; i++) {+ if (shared_table[i].node == NIL) {+ /* The slot is empty, so claim and return it */+ shared_table[i].label = label;+ return &shared_table[i].node;+ } else if (shared_table[i].label == label) {+ /* Found the label, so return it. */+ return &shared_table[i].node;+ }+ /* Not empty and not found, try next. */+ }+}++NODEPTR+parse(BFILE *f)+{+ NODEPTR r;+ NODEPTR *nodep;+ heapoffs_t l;+ value_t i;+ double d;+ int c;+ char buf[80]; /* store names of primitives. */++ c = f->getb(f);+ if (c < 0) ERR("parse EOF");+ switch (c) {+ case '(' :+ /* application: (f a) */+ r = alloc_node(T_AP);+ FUN(r) = parse(f);+ if (!gobble(f, ' ')) ERR("parse ' '");+ ARG(r) = parse(f);+ if (!gobble(f, ')')) ERR("parse ')'");+ return r;+ case '&':+ d = parse_double(f);+ r = mkDbl(d);+ return r;+ case '#':+ i = parse_int(f);+ r = mkInt(i);+ return r;+#if 0+ case '-':+ c = f->getb(f);+ neg = -1;+ if ('0' <= c && c <= '9') {+ goto number;+ } else {+ ERR("got -");+ }+ case '0':case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8':case '9':+ /* integer [0-9]+*/+ neg = 1;+ number:+ f->ungetb(c, f);+ i = neg * parse_int(f);+ r = mkInt(i);+ return r;+#endif+ case '_' :+ /* Reference to a shared value: _label */+ l = parse_int(f); /* The label */+ nodep = find_label(l);+ if (*nodep == NIL) {+ /* Not yet defined, so make it an indirection */+ *nodep = alloc_node(T_IND);+ INDIR(*nodep) = NIL;+ }+ return *nodep;+ case ':' :+ /* Define a shared expression: :label e */+ l = parse_int(f); /* The label */+ if (!gobble(f, ' ')) ERR("parse ' '");+ nodep = find_label(l);+ if (*nodep == NIL) {+ /* not referenced yet, so create a node */+ *nodep = alloc_node(T_IND);+ INDIR(*nodep) = NIL;+ } else {+ /* Sanity check */+ if (INDIR(*nodep) != NIL) ERR("shared != NIL");+ }+ r = parse(f);+ INDIR(*nodep) = r;+ return r;+ case '"' :+ /* Everything up to the next " is a string.+ * Special characters are encoded as \NNN&,+ * where NNN is the decimal value of the character */+ /* XXX assume there are no NULs in the string, and all fit in a char */+ /* XXX allocation is a hack */+ {+ char *buffer = malloc(10000);+ char *p = buffer;+ for(;;) {+ c = f->getb(f);+ if (c == '"')+ break;+ if (c == '\\') {+ *p++ = (char)parse_int(f);+ if (!gobble(f, '&'))+ ERR("parse string");+ } else {+ *p++ = c;+ }+ }+ *p++ = 0;+ r = mkStrNode(realloc(buffer, p - buffer));+ return r;+ }+ case '^':+ /* An FFI name */+ for (int j = 0; (buf[j] = getNT(f)); j++)+ ;+ r = ffiNode(buf);+ return r;+ default:+ buf[0] = c;+ /* A primitive, keep getting char's until end */+ for (int j = 1; (buf[j] = getNT(f)); j++)+ ;+ /* Look up the primop and use the preallocated node. */+ for (int j = 0; j < sizeof primops / sizeof primops[0]; j++) {+ if (strcmp(primops[j].name, buf) == 0) {+ return primops[j].node;+ }+ }+ ERR1("no primop %s", buf);+ }+}++void+checkversion(BFILE *f)+{+ char *p = VERSION;+ int c;++ while ((c = *p++)) {+ if (c != f->getb(f))+ ERR("version mismatch");+ }+ gobble(f, '\r'); /* allow extra CR */+}++/* Parse a file */+NODEPTR+parse_top(BFILE *f)+{+ checkversion(f);+ heapoffs_t numLabels = parse_int(f);+ if (!gobble(f, '\n'))+ ERR("size parse");+ gobble(f, '\r'); /* allow extra CR */+ shared_table_size = 3 * numLabels; /* sparsely populated hashtable */+ shared_table = malloc(shared_table_size * sizeof(struct shared_entry));+ if (!shared_table)+ memerr();+ for(heapoffs_t i = 0; i < shared_table_size; i++)+ shared_table[i].node = NIL;+ NODEPTR n = parse(f);+ free(shared_table);+ return n;+}++#if WANT_STDIO+NODEPTR+parse_FILE(FILE *f)+{+ BFILE *p = openb_FILE(f);+ /* And parse it */+ NODEPTR n = parse_top(p);+ p->closeb(p);+ return n;+}++NODEPTR+parse_file(const char *fn, size_t *psize)+{+ FILE *f = fopen(fn, "r");+ if (!f)+ ERR1("file not found %s", fn);++ /* And parse it */+ NODEPTR n = parse_FILE(f);+ *psize = ftell(f);+ return n;+}+#endif /* WANT_STDIO */++counter_t num_shared;++/* Two bits per node: marked, shared+ * 0, 0 -- not visited+ * 1, 0 -- visited once+ * 1, 1 -- visited more than once+ * 0, 1 -- printed+ */+bits_t *marked_bits;+bits_t *shared_bits;+static INLINE void set_bit(bits_t *bits, NODEPTR n)+{+ heapoffs_t i = LABEL(n);+ bits[i / BITS_PER_WORD] |= (1ULL << (i % BITS_PER_WORD));+}+#if WANT_STDIO+static INLINE void clear_bit(bits_t *bits, NODEPTR n)+{+ heapoffs_t i = LABEL(n);+ bits[i / BITS_PER_WORD] &= ~(1ULL << (i % BITS_PER_WORD));+}+#endif+static INLINE int test_bit(bits_t *bits, NODEPTR n)+{+ heapoffs_t i = LABEL(n);+ return (bits[i / BITS_PER_WORD] & (1ULL << (i % BITS_PER_WORD))) != 0;+}++#if WANT_STDIO+void printrec(FILE *f, NODEPTR n);++/* Mark all reachable nodes, when a marked node is reached, mark it as shared. */+void+find_sharing(NODEPTR n)+{+ top:+ while (GETTAG(n) == T_IND)+ n = INDIR(n);+ //printf("find_sharing %p %llu ", n, LABEL(n));+ if (GETTAG(n) == T_AP) {+ if (test_bit(shared_bits, n)) {+ /* Alread marked as shared */+ //printf("shared\n");+ ;+ } else if (test_bit(marked_bits, n)) {+ /* Already marked, so now mark as shared */+ //printf("marked\n");+ set_bit(shared_bits, n);+ num_shared++;+ } else {+ /* Mark as visited, and recurse */+ //printf("unmarked\n");+ set_bit(marked_bits, n);+ find_sharing(FUN(n));+ n = ARG(n);+ goto top;+ }+ } else {+ /* Not an application, so do nothing */+ //printf("not T_AP\n");+ ;+ }+}++/* Recursively print an expression.+ This assumes that the shared nodes has been marked as such.+*/+void+printrec(FILE *f, NODEPTR n)+{+ if (test_bit(shared_bits, n)) {+ /* The node is shared */+ if (test_bit(marked_bits, n)) {+ /* Not yet printed, so emit a label */+ fprintf(f, ":%"PRIheap" ", LABEL(n));+ clear_bit(marked_bits, n); /* mark as printed */+ } else {+ /* This node has already been printed, so just use a reference. */+ fprintf(f, "_%"PRIheap, LABEL(n));+ return;+ }+ }++ switch (GETTAG(n)) {+ case T_IND: /*putc('*', f);*/ printrec(f, INDIR(n)); break;+ case T_AP:+ fputc('(', f);+ printrec(f, FUN(n));+ fputc(' ', f);+ printrec(f, ARG(n));+ fputc(')', f);+ break;+ case T_INT: fprintf(f, "#%"PRIvalue, GETVALUE(n)); break;+ case T_DBL: fprintf(f, "&%.16g", GETDBLVALUE(n)); break;+ case T_PTR:+ if (PTR(n) == stdin)+ fprintf(f, "IO.stdin");+ else if (PTR(n) == stdout)+ fprintf(f, "IO.stdout");+ else if (PTR(n) == stderr)+ fprintf(f, "IO.stderr");+ else+ ERR("Cannot serialize pointers");+ break;+ case T_STR:+ {+ const char *p = STR(n);+ int c;+ fputc('"', f);+ while ((c = *p++)) {+ if (c == '"' || c == '\\' || c < ' ' || c > '~') {+ fprintf(f, "\\%d&", c);+ } else {+ fputc(c, f);+ }+ }+ fputc('"', f);+ break;+ }+ case T_BADDYN: fprintf(f, "^%s", STR(n)); break;+ case T_S: fprintf(f, "S"); break;+ case T_K: fprintf(f, "K"); break;+ case T_I: fprintf(f, "I"); break;+ case T_C: fprintf(f, "C"); break;+ case T_B: fprintf(f, "B"); break;+ case T_A: fprintf(f, "A"); break;+ case T_U: fprintf(f, "U"); break;+ case T_Y: fprintf(f, "Y"); break;+ case T_P: fprintf(f, "P"); break;+ case T_R: fprintf(f, "R"); break;+ case T_O: fprintf(f, "O"); break;+ case T_SS: fprintf(f, "S'"); break;+ case T_BB: fprintf(f, "B'"); break;+ case T_Z: fprintf(f, "Z"); break;+ case T_CC: fprintf(f, "C'"); break;+ case T_ADD: fprintf(f, "+"); break;+ case T_SUB: fprintf(f, "-"); break;+ case T_MUL: fprintf(f, "*"); break;+ case T_QUOT: fprintf(f, "quot"); break;+ case T_REM: fprintf(f, "rem"); break;+ case T_UQUOT: fprintf(f, "uquot"); break;+ case T_UREM: fprintf(f, "urem"); break;+ case T_SUBR: fprintf(f, "subtract"); break;+ case T_NEG: fprintf(f, "neg"); break;+ case T_AND: fprintf(f, "and"); break;+ case T_OR: fprintf(f, "or"); break;+ case T_XOR: fprintf(f, "xor"); break;+ case T_INV: fprintf(f, "inv"); break;+ case T_SHL: fprintf(f, "shl"); break;+ case T_SHR: fprintf(f, "shr"); break;+ case T_ASHR: fprintf(f, "ashr"); break;+#if WANT_FLOAT+ case T_FADD: fprintf(f, "fadd"); break;+ case T_FSUB: fprintf(f, "fsub"); break;+ case T_FMUL: fprintf(f, "fmul"); break;+ case T_FDIV: fprintf(f, "fdiv"); break;+ case T_FNEG: fprintf(f, "fneg"); break;+ case T_ITOF: fprintf(f, "itof"); break;+ case T_FEQ: fprintf(f, "feq"); break;+ case T_FNE: fprintf(f, "fne"); break;+ case T_FLT: fprintf(f, "flt"); break;+ case T_FLE: fprintf(f, "fle"); break;+ case T_FGT: fprintf(f, "fgt"); break;+ case T_FGE: fprintf(f, "fge"); break;+ case T_FSHOW: fprintf(f, "fshow"); break;+ case T_FREAD: fprintf(f, "fread"); break;+#endif+ case T_EQ: fprintf(f, "=="); break;+ case T_NE: fprintf(f, "/="); break;+ case T_LT: fprintf(f, "<"); break;+ case T_LE: fprintf(f, "<="); break;+ case T_GT: fprintf(f, ">"); break;+ case T_GE: fprintf(f, ">="); break;+ case T_ULT: fprintf(f, "u<"); break;+ case T_ULE: fprintf(f, "u<="); break;+ case T_UGT: fprintf(f, "u>"); break;+ case T_UGE: fprintf(f, "u>="); break;+ case T_ERROR: fprintf(f, "error"); break;+ case T_NODEFAULT: fprintf(f, "noDefault"); break;+ case T_NOMATCH: fprintf(f, "noMatch"); break;+ case T_EQUAL: fprintf(f, "equal"); break;+ case T_COMPARE: fprintf(f, "compare"); break;+ case T_RNF: fprintf(f, "rnf"); break;+ case T_SEQ: fprintf(f, "seq"); break;+ case T_IO_BIND: fprintf(f, "IO.>>="); break;+ case T_IO_THEN: fprintf(f, "IO.>>"); break;+ case T_IO_RETURN: fprintf(f, "IO.return"); break;+ case T_IO_SERIALIZE: fprintf(f, "IO.serialize"); break;+ case T_IO_PRINT: fprintf(f, "IO.print"); break;+ case T_IO_DESERIALIZE: fprintf(f, "IO.deserialize"); break;+ case T_IO_GETARGS: fprintf(f, "IO.getArgs"); break;+ case T_IO_DROPARGS: fprintf(f, "IO.dropArgs"); break;+ case T_IO_GETTIMEMILLI: fprintf(f, "IO.getTimeMilli"); break;+ case T_IO_PERFORMIO: fprintf(f, "IO.performIO"); break;+ case T_IO_CCALL: fprintf(f, "^%s", ffi_table[GETVALUE(n)].ffi_name); break;+ case T_IO_CATCH: fprintf(f, "IO.catch"); break;+ case T_DYNSYM: fprintf(f, "dynsym"); break;+ case T_NEWCASTRING: fprintf(f, "newCAString"); break;+ case T_PEEKCASTRING: fprintf(f, "peekCAString"); break;+ case T_TOINT: fprintf(f, "toInt"); break;+ case T_TOPTR: fprintf(f, "toPtr"); break;+ case T_TODBL: fprintf(f, "toDbl"); break;+ default: ERR("print tag");+ }+}++/* Serialize a graph to file. */+void+print(FILE *f, NODEPTR n, int header)+{+ num_shared = 0;+ marked_bits = calloc(free_map_nwords, sizeof(bits_t));+ if (!marked_bits)+ memerr();+ shared_bits = calloc(free_map_nwords, sizeof(bits_t));+ if (!shared_bits)+ memerr();+ find_sharing(n);+ if (header)+ fprintf(f, "%s%"PRIcounter"\n", VERSION, num_shared);+ printrec(f, n);+ free(marked_bits);+ free(shared_bits);+}++/* Show a graph. */+void+pp(FILE *f, NODEPTR n)+{+ print(f, n, 0);+ fprintf(f, "\n");+}+#endif /* WANT_STDIO */++NODEPTR+mkInt(value_t i)+{+#if INTTABLE+ if (LOW_INT <= i && i < HIGH_INT) {+ return intTable[i - LOW_INT];+ }+#endif++ NODEPTR n;+ n = alloc_node(T_INT);+ SETVALUE(n, i);+ return n;+}++NODEPTR+mkDbl(double d)+{+ NODEPTR n;+ n = alloc_node(T_DBL);+ SETDBLVALUE(n, d);+ return n;+}++NODEPTR+mkPtr(void* p)+{+ NODEPTR n;+ n = alloc_node(T_PTR);+ PTR(n) = p;+ return n;+}++static INLINE NODEPTR+mkNil(void)+{+ return combFalse;+}++static INLINE NODEPTR+mkCons(NODEPTR x, NODEPTR xs)+{+ return new_ap(new_ap(combCons, x), xs);+}++size_t+strNodes(size_t len)+{+ /* Each character will need a CHAR node and a CONS node, a CONS uses 2 T_AP nodes */+ len *= (1 + 2);+ /* And each string will need a NIL */+ len += 1;+ return len;+}++/* Turn a C string into a combinator string */+NODEPTR+mkString(const char *str, size_t len)+{+ NODEPTR n, nc;++ n = mkNil();+ for(size_t i = len; i > 0; i--) {+ nc = mkInt(str[i-1]);+ n = mkCons(nc, n);+ }+ return n;+}++NODEPTR+mkStringC(const char *str)+{+ return mkString(str, strlen(str));+}++void eval(NODEPTR n);++/* Evaluate and skip indirections. */+static INLINE NODEPTR+evali(NODEPTR n)+{+ /* Need to push and pop in case GC happens */+ PUSH(n);+ eval(n);+ n = TOP(0);+ POP(1);+ while (GETTAG(n) == T_IND)+ n = INDIR(n);+ return n;+}++/* Follow indirections */+static INLINE NODEPTR+indir(NODEPTR n)+{+ while (GETTAG(n) == T_IND)+ n = INDIR(n);+ return n;+}++/* Evaluate to an INT */+static INLINE value_t+evalint(NODEPTR n)+{+ n = evali(n);+#if SANITY+ if (GETTAG(n) != T_INT) {+ ERR1("evalint, bad tag %d", GETTAG(n));+ }+#endif+ return GETVALUE(n);+}++/* Evaluate to a Double */+static INLINE double+evaldbl(NODEPTR n)+{+ n = evali(n);+#if SANITY+ if (GETTAG(n) != T_DBL) {+ ERR1("evaldbl, bad tag %d", GETTAG(n));+ }+#endif+ return GETDBLVALUE(n);+}++/* Evaluate to a T_PTR */+void *+evalptr(NODEPTR n)+{+ n = evali(n);+#if SANITY+ if (GETTAG(n) != T_PTR) {+ ERR1("evalptr, bad tag %d", GETTAG(n));+ }+#endif+ return PTR(n);+}++/* Evaluate a string, returns a newly allocated buffer. */+/* XXX this is cheating, should use continuations */+char *+evalstring(NODEPTR n)+{+ size_t sz = 10000;+ char *p, *name = malloc(sz);+ value_t c;+ NODEPTR x;++ if (!name)+ memerr();+ for (p = name;;) {+ if (p >= name + sz)+ ERR("evalstring too long");+ n = evali(n);+ if (GETTAG(n) == T_K) /* Nil */+ break;+ else if (GETTAG(n) == T_AP && GETTAG(x = indir(FUN(n))) == T_AP && GETTAG(indir(FUN(x))) == T_O) { /* Cons */+ c = evalint(ARG(x));+ if (c < 0 || c > 127)+ ERR("invalid char"); /* Only allow ASCII */+ *p++ = (char)c;+ n = ARG(n);+ } else {+ ERR("evalstring not Nil/Cons");+ }+ }+ *p = 0;+ return name;+}++/* Compares anything, but really only works well on strings.+ * if p < q return -1+ * if p > q return 1+ * if p == q return 0+ */+int+compare(NODEPTR p, NODEPTR q)+{+ int r;+ value_t x, y;+ void *f, *g;+ + top:+ PUSH(q); /* save for GC */+ p = evali(p);+ q = evali(TOP(0));+ POP(1);+ enum node_tag ptag = GETTAG(p);+ enum node_tag qtag = GETTAG(q);+ if (ptag != qtag) {+ /* Hack to make Nil < Cons */+ if (ptag == T_K && qtag == T_AP)+ return -1;+ if (ptag == T_AP && qtag == T_K)+ return 1;+ return ptag < qtag ? -1 : 1;+ }+ switch (ptag) {+ case T_AP:+ PUSH(ARG(p));+ PUSH(ARG(q));+ r = compare(FUN(p), FUN(q));+ if (r != 0) {+ POP(2);+ return r;+ }+ q = TOP(0);+ p = TOP(1);+ POP(2);+ goto top;+ case T_INT:+ case T_IO_CCALL:+ x = GETVALUE(p);+ y = GETVALUE(q);+ return x < y ? -1 : x > y ? 1 : 0;+ case T_PTR:+ f = PTR(p);+ g = PTR(q);+ return f < g ? -1 : f > g ? 1 : 0;+ default:+ return 0;+ }+}++bits_t *rnf_bits;++void+rnf_rec(NODEPTR n)+{+ top:+ if (test_bit(rnf_bits, n))+ return;+ set_bit(rnf_bits, n);+ n = evali(n);+ if (GETTAG(n) == T_AP) {+ PUSH(ARG(n)); /* protect from GC */+ rnf_rec(FUN(n));+ n = TOP(0);+ POP(1);+ goto top;+ }+}++/* This is a yucky hack */+int doing_rnf = 0;++void+rnf(value_t noerr, NODEPTR n)+{+ /* Mark visited nodes to avoid getting stuck in loops. */+ rnf_bits = calloc(free_map_nwords, sizeof(bits_t));+ if (!rnf_bits)+ memerr();+ if (doing_rnf)+ ERR("recursive rnf()");+ doing_rnf = (int)noerr;+ rnf_rec(n);+ doing_rnf = 0;+ free(rnf_bits);+}++NODEPTR execio(NODEPTR n);++/* Evaluate a node, returns when the node is in WHNF. */+void+eval(NODEPTR n)+{+ stackptr_t stk = stack_ptr;+ NODEPTR x, y, z, w;+ value_t xi, yi, r;+#if WANT_FLOAT+ double xd, yd, rd;+#endif /* WANT_FLOAT */+ char *msg;+ heapoffs_t l;++/* Reset stack pointer and return. */+#define RET do { stack_ptr = stk; return; } while(0)+/* Check that there are at least n arguments, return if not. */+#define CHECK(n) do { if (stack_ptr - stk < (n)) RET; } while(0)++#define SETIND(n, x) do { SETTAG((n), T_IND); INDIR((n)) = (x); } while(0)+#define GOIND(x) do { SETIND(n, (x)); goto ind; } while(0)+#define GOAP(f,a) do { FUN((n)) = (f); ARG((n)) = (a); goto ap; } while(0)+/* CHKARGN checks that there are at least N arguments.+ * It also+ * - sets n to the "top" node+ * - set x, y, ... to the arguments+ * - pops N stack elements+ * NOTE: No GC is allowed after these, since the stack has been popped.+ */+#define CHKARG0 do { } while(0)+#define CHKARG1 do { CHECK(1); POP(1); n = TOP(-1); x = ARG(n); } while(0)+#define CHKARG2 do { CHECK(2); POP(2); n = TOP(-1); y = ARG(n); x = ARG(TOP(-2)); } while(0)+#define CHKARG3 do { CHECK(3); POP(3); n = TOP(-1); z = ARG(n); y = ARG(TOP(-2)); x = ARG(TOP(-3)); } while(0)+#define CHKARG4 do { CHECK(4); POP(4); n = TOP(-1); w = ARG(n); z = ARG(TOP(-2)); y = ARG(TOP(-3)); x = ARG(TOP(-4)); } while(0)++/* Alloc a possible GC action, e, between setting x and popping */+#define CHKARGEV1(e) do { CHECK(1); x = ARG(TOP(0)); e; POP(1); n = TOP(-1); } while(0)++#define SETINT(n,r) do { SETTAG((n), T_INT); SETVALUE((n), (r)); } while(0)+#define SETDBL(n,d) do { SETTAG((n), T_DBL); SETDBLVALUE((n), (d)); } while(0)+#define OPINT1(e) do { CHECK(1); xi = evalint(ARG(TOP(0))); e; POP(1); n = TOP(-1); } while(0);+#define OPINT2(e) do { CHECK(2); xi = evalint(ARG(TOP(0))); yi = evalint(ARG(TOP(1))); e; POP(2); n = TOP(-1); } while(0);+#define OPDBL1(e) do { CHECK(1); xd = evaldbl(ARG(TOP(0))); e; POP(1); n = TOP(-1); } while(0);+#define OPDBL2(e) do { CHECK(2); xd = evaldbl(ARG(TOP(0))); yd = evaldbl(ARG(TOP(1))); e; POP(2); n = TOP(-1); } while(0);+#define ARITHUN(op) do { OPINT1(r = op xi); SETINT(n, r); RET; } while(0)+#define ARITHBIN(op) do { OPINT2(r = xi op yi); SETINT(n, r); RET; } while(0)+#define ARITHBINU(op) do { OPINT2(r = (value_t)((uvalue_t)xi op (uvalue_t)yi)); SETINT(n, r); RET; } while(0)+#define FARITHUN(op) do { OPDBL1(rd = op xd); SETDBL(n, rd); RET; } while(0)+#define FARITHBIN(op) do { OPDBL2(rd = xd op yd); SETDBL(n, rd); RET; } while(0)+#define CMP(op) do { OPINT2(r = xi op yi); GOIND(r ? combTrue : combFalse); } while(0)+#define CMPF(op) do { OPDBL2(r = xd op yd); GOIND(r ? combTrue : combFalse); } while(0)+#define CMPU(op) do { OPINT2(r = (uvalue_t)xi op (uvalue_t)yi); GOIND(r ? combTrue : combFalse); } while(0)++ for(;;) {+ num_reductions++;+#if FASTTAGS+ l = LABEL(n);+ enum node_tag tag = l < T_IO_BIND ? l : GETTAG(n);+#else /* FASTTAGS */+ enum node_tag tag = GETTAG(n);+#endif /* FASTTAGS */+ switch (tag) {+ ind:+ num_reductions++;+ case T_IND: n = INDIR(n); break;++ ap:+ num_reductions++;+ case T_AP: PUSH(n); n = FUN(n); break;++ case T_STR: GCCHECK(strNodes(strlen(STR(n)))); GOIND(mkStringC(STR(n)));+ case T_INT: RET;+ case T_DBL: RET;+ case T_PTR: RET;+ case T_BADDYN: ERR1("FFI unknown %s", STR(n));++ case T_S: GCCHECK(2); CHKARG3; GOAP(new_ap(x, z), new_ap(y, z)); /* S x y z = x z (y z) */+ case T_SS: GCCHECK(3); CHKARG4; GOAP(new_ap(x, new_ap(y, w)), new_ap(z, w)); /* S' x y z w = x (y w) (z w) */+ case T_K: CHKARG2; GOIND(x); /* K x y = *x */+ case T_A: CHKARG2; GOIND(y); /* A x y = *y */+ case T_U: CHKARG2; GOAP(y, x); /* U x y = y x */+ case T_I: CHKARG1; GOIND(x); /* I x = *x */+ case T_Y: CHKARG1; GOAP(x, n); /* n@(Y x) = x n */+ case T_B: GCCHECK(1); CHKARG3; GOAP(x, new_ap(y, z)); /* B x y z = x (y z) */+ case T_BB: GCCHECK(2); CHKARG4; GOAP(new_ap(x, y), new_ap(z, w)); /* B' x y z w = x y (z w) */+ case T_Z: CHKARG3; GOAP(x, y); /* Z x y z = x y */+ case T_C: GCCHECK(1); CHKARG3; GOAP(new_ap(x, z), y); /* C x y z = x z y */+ case T_CC: GCCHECK(2); CHKARG4; GOAP(new_ap(x, new_ap(y, w)), z); /* C' x y z w = x (y w) z */+ case T_P: GCCHECK(1); CHKARG3; GOAP(new_ap(z, x), y); /* P x y z = z x y */+ case T_R: GCCHECK(1); CHKARG3; GOAP(new_ap(y, z), x); /* R x y z = y z x */+ case T_O: GCCHECK(1); CHKARG4; GOAP(new_ap(w, x), y); /* O x y z w = w x y */++ case T_ADD: ARITHBIN(+);+ case T_SUB: ARITHBIN(-);+ case T_MUL: ARITHBIN(*);+ case T_QUOT: ARITHBIN(/);+ case T_REM: ARITHBIN(%);+ case T_SUBR: OPINT2(r = yi - xi); SETINT(n, r); RET;+ case T_UQUOT: ARITHBINU(/);+ case T_UREM: ARITHBINU(%);+ case T_NEG: ARITHUN(-);+ case T_AND: ARITHBIN(&);+ case T_OR: ARITHBIN(|);+ case T_XOR: ARITHBIN(^);+ case T_INV: ARITHUN(~);+ case T_SHL: ARITHBIN(<<);+ case T_SHR: ARITHBINU(>>);+ case T_ASHR: ARITHBIN(>>);++#if WANT_FLOAT+ case T_FADD: FARITHBIN(+);+ case T_FSUB: FARITHBIN(-);+ case T_FMUL: FARITHBIN(*);+ case T_FDIV: FARITHBIN(/);+ case T_FNEG: FARITHUN(-);+ case T_ITOF: OPINT1(rd = (double)xi); SETDBL(n, rd); RET;+ case T_FEQ: CMPF(==);+ case T_FNE: CMPF(!=);+ case T_FLT: CMPF(<);+ case T_FLE: CMPF(<=);+ case T_FGT: CMPF(>);+ case T_FGE: CMPF(>=);+ case T_FREAD:+ CHECK(1);+ msg = evalstring(ARG(TOP(0)));+ xd = strtod(msg, NULL);+ free(msg);++ POP(1);+ n = TOP(-1);+ + GOIND(mkDbl(xd));++ case T_FSHOW:+ // check that the double exists+ CHECK(1);+ // evaluate it+ xd = evaldbl(ARG(TOP(0)));+ // turn it into a string+ char str[30];+ /* Using 16 decimals will lose some precision.+ * 17 would keep the precision, but it frequently looks very ugly.+ */+ (void)snprintf(str, 25, "%.16g", xd);+ if (!strchr(str, '.') && !strchr(str, 'e') && !strchr(str, 'E')) {+ /* There is no decimal point and no exponent, so add a decimal point */+ strcat(str, ".0");+ }++ // turn it into a mhs string+ GCCHECK(strNodes(strlen(str)));+ NODEPTR s = mkStringC(str);++ // remove the double from the stack+ POP(1);+ n = TOP(-1);+ // update n to be s+ GOIND(s);+#endif /* WANT_FLOAT */++ /* Retag a word sized value, keeping the value bits */+#define CONV(t) do { CHECK(1); x = evali(ARG(TOP(0))); GCCHECK(1); y = alloc_node(t); SETVALUE(y, GETVALUE(x)); POP(1); n = TOP(-1); GOIND(y); } while(0)+ case T_TODBL: CONV(T_DBL);+ case T_TOINT: CONV(T_INT);+ case T_TOPTR: CONV(T_PTR);+#undef CONV++ case T_EQ: CMP(==);+ case T_NE: CMP(!=);+ case T_LT: CMP(<);+ case T_LE: CMP(<=);+ case T_GT: CMP(>);+ case T_GE: CMP(>=);+ case T_ULT: CMPU(<);+ case T_ULE: CMPU(<=);+ case T_UGT: CMPU(>);+ case T_UGE: CMPU(>=);++ case T_NOMATCH:+ if (doing_rnf) RET;+ {+ CHECK(3);+ msg = evalstring(ARG(TOP(0)));+ xi = evalint(ARG(TOP(1)));+ yi = evalint(ARG(TOP(2)));+ int sz = strlen(msg) + 100;+ char *res = malloc(sz);+#if WANT_STDIO+ snprintf(res, sz, "no match at %s, line %"PRIvalue", col %"PRIvalue, msg, xi, yi);+#else /* WANT_STDIO */+ strcpy(res, "no match");+#endif /* WANT_STDIO */+ POP(2);+ GCCHECK(strNodes(strlen(res)));+ ARG(TOP(0)) = mkStringC(res);+ free(res);+ free(msg);+ goto err; /* XXX not right message if the error is caught */+ }+ case T_NODEFAULT:+ if (doing_rnf) RET;+ {+ CHECK(1);+ msg = evalstring(ARG(TOP(0)));+ int sz = strlen(msg) + 100;+ char *res = malloc(sz);++#if WANT_STDIO+ snprintf(res, sz, "no default for %s", msg);+#else /* WANT_STDIO */+ strcpy(res, "no default");+#endif /* WANT_STDIO */+ GCCHECK(strNodes(strlen(res)));+ ARG(TOP(0)) = mkStringC(res);+ free(res);+ free(msg);+ goto err; /* XXX not right message if the error is caught */+ }+ case T_ERROR:+ if (doing_rnf) RET;+ err:+ if (cur_handler) {+ /* Pass the string to the handler */+ CHKARG1;+ cur_handler->hdl_exn = x;+ longjmp(cur_handler->hdl_buf, 1);+ } else {+ /* No handler, so just die. */+ CHKARGEV1(msg = evalstring(x));+#if WANT_STDIO+ fprintf(stderr, "mhs: %s\n", msg);+ exit(1);+#else /* WANT_STDIO */+ ERR1("error: %s", msg);+#endif /* WANT_STDIO */+ }+ case T_SEQ: CHECK(2); eval(ARG(TOP(0))); POP(2); n = TOP(-1); y = ARG(n); GOIND(y); /* seq x y = eval(x); y */++ case T_EQUAL:+ CHECK(2); r = compare(ARG(TOP(0)), ARG(TOP(1))); POP(2); n = TOP(-1); GOIND(r==0 ? combTrue : combFalse);+ case T_COMPARE:+ CHECK(2); r = compare(ARG(TOP(0)), ARG(TOP(1))); POP(2); n = TOP(-1); GOIND(r < 0 ? combLT : r > 0 ? combGT : combEQ);++ case T_RNF:+ if (doing_rnf) RET;+ CHECK(2);+ xi = evalint(ARG(TOP(0)));+ rnf(xi, ARG(TOP(1))); POP(2); n = TOP(-1); GOIND(combUnit);++ case T_IO_PERFORMIO:+ if (doing_rnf) RET;+ CHKARGEV1(x = execio(x)); GOIND(x);++ case T_IO_BIND:+ case T_IO_THEN:+ case T_IO_RETURN:+ case T_IO_SERIALIZE:+ case T_IO_PRINT:+ case T_IO_DESERIALIZE:+ case T_IO_GETARGS:+ case T_IO_DROPARGS:+ case T_IO_GETTIMEMILLI:+ case T_IO_CCALL:+ case T_IO_CATCH:+ case T_NEWCASTRING:+ case T_PEEKCASTRING:+ RET;++ case T_DYNSYM:+ /* A dynamic FFI lookup */+ CHECK(1);+ msg = evalstring(ARG(TOP(0)));+ GCCHECK(1);+ x = ffiNode(msg);+ free(msg);+ POP(1);+ n = TOP(-1);+ GOIND(x);++#if 0+ case T_ISINT:+ CHECK(1);+ x = evali(ARG(TOP(0)));+ n = TOP(0);+ POP(1);+ GOIND(GETTAG(x) == T_INT ? combTrue : combFalse);++ case T_ISIO:+ CHECK(1);+ x = evali(ARG(TOP(0)));+ n = TOP(0);+ POP(1);+ l = GETTAG(x);+ GOIND(T_IO_BIND <= l && l <= T_IO_FLUSH ? combTrue : combFalse);+#endif+ default:+ ERR1("eval tag %d", GETTAG(n));+ }+ }+}++/* This is the interpreter for the IO monad operations. */+/* It takes a monadic expression and returns the unwrapped expression (unevaluated). */+NODEPTR+execio(NODEPTR n)+{+ stackptr_t stk = stack_ptr;+ NODEPTR f, x;+ int c;+ char *name;+#if WANT_STDIO+ void *ptr;+ int hdr;+#endif /* WANT_STDIO */++/* IO operations need all arguments, anything else should not happen. */+#define CHECKIO(n) do { if (stack_ptr - stk != (n+1)) {ERR("CHECKIO");}; } while(0)+#define RETIO(p) do { stack_ptr = stk; return (p); } while(0)+#define GCCHECKSAVE(p, n) do { PUSH(p); GCCHECK(n); (p) = TOP(0); POP(1); } while(0)++ top:+ n = evali(n);+ PUSH(n);+ for(;;) {+ num_reductions++;+ switch (GETTAG(n)) {+ case T_IND:+ n = INDIR(n);+ TOP(0) = n;+ break;+ case T_AP:+ n = FUN(n);+ PUSH(n);+ break;+ case T_IO_BIND:+ CHECKIO(2);+ {+ /* Use associativity to avoid deep execio recursion. */+ /* (m >>= g) >>= h === m >>= (\ x -> g x >>= h) */+ /* BIND ((BIND m) g) h === BIND m (\ x -> BIND (g x) h) == (BIND m) (((C' BIND) g) h)*/+ NODEPTR bm;+ NODEPTR bmg = evali(ARG(TOP(1)));+ GCCHECKSAVE(bmg, 4);+ if (GETTAG(bmg) == T_AP && GETTAG(bm = indir(FUN(bmg))) == T_AP && GETTAG(indir(FUN(bm))) == T_IO_BIND) {+ NODEPTR g = ARG(bmg);+ NODEPTR h = ARG(TOP(2));+ n = new_ap(bm, new_ap(new_ap(new_ap(combCC, combIOBIND), g), h));+ POP(3);+ goto top;+ }+ }++ x = execio(ARG(TOP(1))); /* first argument, unwrapped */++ /* Do a GC check, make sure we keep the x live */+ GCCHECKSAVE(x, 1);++ f = ARG(TOP(2)); /* second argument, the continuation */+ n = new_ap(f, x);+ POP(3);+ goto top;+ case T_IO_THEN:+ CHECKIO(2);+ (void)execio(ARG(TOP(1))); /* first argument, unwrapped, ignored */+ n = ARG(TOP(2)); /* second argument, the continuation */+ POP(3);+ goto top;+ case T_IO_RETURN:+ CHECKIO(1);+ n = ARG(TOP(1));+ RETIO(n);+#if WANT_STDIO+ case T_IO_PRINT:+ hdr = 0;+ goto ser;+ case T_IO_SERIALIZE:+ hdr = 1;+ ser:+ CHECKIO(2);+ ptr = evalptr(ARG(TOP(1)));+ x = evali(ARG(TOP(2)));+ //x = ARG(TOP(1));+ print(ptr, x, hdr);+ fprintf(ptr, "\n");+ RETIO(combUnit);+ case T_IO_DESERIALIZE:+ CHECKIO(1);+ ptr = evalptr(ARG(TOP(1)));+ gc(); /* parser runs without GC */+ n = parse_FILE(ptr);+ RETIO(n);+#endif+ case T_IO_GETARGS:+ CHECKIO(0);+ {+ /* compute total number of characters */+ size_t size = 0;+ for(int i = 0; i < glob_argc; i++) {+ size += strNodes(strlen(glob_argv[i]));+ }+ /* The returned list will need a CONS for each string, and a NIL */+ size += glob_argc * 2 + 1;+ GCCHECK(size);+ /*+ printf("total size %d:", size);+ for(int i = 0; i < glob_argc; i++)+ printf(" %s", glob_argv[i]);+ printf("\n");+ */+ n = mkNil();+ for(int i = glob_argc-1; i >= 0; i--) {+ n = mkCons(mkString(glob_argv[i], strlen(glob_argv[i])), n);+ }+ }+ RETIO(n);+ case T_IO_DROPARGS:+ CHECKIO(1);+ c = (int)evalint(ARG(TOP(1)));+ if (c > glob_argc)+ c = glob_argc;+ glob_argc -= c;+ glob_argv += c;+ RETIO(combUnit);+ case T_IO_CCALL:+ {+ int a = (int)GETVALUE(n);+ funptr_t f = ffi_table[a].ffi_fun;+ value_t ri, xi, yi;+ double rd, xd;+ void *xp, *yp, *rp;+#define INTARG(n) evalint(ARG(TOP(n)))+#define PTRARG(n) evalptr(ARG(TOP(n)))+#define DBLARG(n) evaldbl(ARG(TOP(n)))+#define FFIV(n) CHECKIO(n)+#define FFI(n) CHECKIO(n); GCCHECK(1)+ /* This isn't great, but this is MicroHs, so it's good enough. */+ switch (ffi_table[a].ffi_how) {+ case FFI_V: FFIV(0); (* f)(); RETIO(combUnit);+ case FFI_I: FFI (0); ri = (*(value_t (*)(void ))f)(); n = mkInt(ri); RETIO(n);+ case FFI_i: FFI (0); ri = (*(int (*)(void ))f)(); n = mkInt(ri); RETIO(n);+ case FFI_IV: FFIV(1); xi = INTARG(1); (*(void (*)(value_t ))f)(xi); RETIO(combUnit);+ case FFI_II: FFI (1); xi = INTARG(1); ri = (*(value_t (*)(value_t ))f)(xi); n = mkInt(ri); RETIO(n);+ case FFI_IIV: FFIV(2); xi = INTARG(1); yi = INTARG(2); (*(void (*)(value_t, value_t))f)(xi,yi); RETIO(combUnit);+ case FFI_III: FFI (2); xi = INTARG(1); yi = INTARG(2); ri = (*(value_t (*)(value_t, value_t))f)(xi,yi); n = mkInt(ri); RETIO(n);+ case FFI_DD: FFI (1); xd = DBLARG(1); rd = (*(double (*)(double ))f)(xd); n = mkDbl(rd); RETIO(n);+ case FFI_PI: FFI (1); xp = PTRARG(1); ri = (*(value_t (*)(void* ))f)(xp); n = mkInt(ri); RETIO(n);+ case FFI_Pi: FFI (1); xp = PTRARG(1); ri = (*(int (*)(void* ))f)(xp); n = mkInt(ri); RETIO(n);+ case FFI_IP: FFI (1); xi = INTARG(1); rp = (*(void* (*)(value_t ))f)(xi); n = mkPtr(rp); RETIO(n);+ case FFI_PP: FFI (1); xp = PTRARG(1); rp = (*(void* (*)(void* ))f)(xp); n = mkPtr(rp); RETIO(n);+ case FFI_PV: FFI (1); xp = PTRARG(1); (*(void (*)(void* ))f)(xp); RETIO(combUnit);+ case FFI_PPI: FFI (2); xp = PTRARG(1);yp = PTRARG(2); ri = (*(value_t (*)(void*, void* ))f)(xp,yp); n = mkInt(ri); RETIO(n);+ case FFI_PPP: FFI (2); xp = PTRARG(1);yp = PTRARG(2); rp = (*(void* (*)(void*, void* ))f)(xp,yp); n = mkPtr(rp); RETIO(n);+ case FFI_IPI: FFI (2); xi = INTARG(1);yp = PTRARG(2); ri = (*(value_t (*)(value_t, void* ))f)(xi,yp); n = mkInt(ri); RETIO(n);+ case FFI_iPi: FFI (2); xi = INTARG(1);yp = PTRARG(2); ri = (*(int (*)(int, void* ))f)(xi,yp); n = mkInt(ri); RETIO(n);+ default: ERR("T_IO_CCALL");+ }+ }++ case T_IO_CATCH:+ {+ struct handler *h = malloc(sizeof *h);+ if (!h)+ memerr();+ CHECKIO(2);+ h->hdl_old = cur_handler;+ h->hdl_stack = stack_ptr;+ cur_handler = h;+ if (setjmp(h->hdl_buf)) {+ /* An exception occurred: */+ stack_ptr = h->hdl_stack;+ x = h->hdl_exn; /* exception value */+ GCCHECKSAVE(x, 1);+ f = ARG(TOP(2)); /* second argument, handler */+ n = new_ap(f, x);+ cur_handler = h->hdl_old;+ free(h);+ POP(3);+ goto top;+ } else {+ /* Normal execution: */+ n = execio(ARG(TOP(1))); /* execute first argument */+ cur_handler = h->hdl_old; /* restore old handler */+ free(h);+ RETIO(n); /* return result */+ }+ }++ case T_NEWCASTRING:+ CHECKIO(1);+ name = evalstring(ARG(TOP(1)));+ GCCHECK(1);+ n = alloc_node(T_PTR);+ PTR(n) = name;+ RETIO(n);++ case T_PEEKCASTRING:+ CHECKIO(1);+ name = evalptr(ARG(TOP(1)));+ GCCHECK(strNodes(strlen(name)));+ RETIO(mkStringC(name));++ default:+ ERR1("execio tag %d", GETTAG(n));+ }+ }+}++heapoffs_t+memsize(const char *p)+{+ heapoffs_t n = atoi(p);+ while (isdigit(*p))+ p++;+ switch (*p) {+ case 'k': case 'K': n *= 1000; break;+ case 'm': case 'M': n *= 1000000; break;+ case 'g': case 'G': n *= 1000000000; break;+ default: break;+ }+ return n;+}++extern uint8_t *combexpr;+extern int combexprlen;++int+main(int argc, char **argv)+{+ char *inname = 0;+ char **av;+ NODEPTR prog;+ int inrts;+#if WANT_STDIO+ char *outname = 0;+ size_t file_size;+#endif+ +#if 0+ /* MINGW doesn't do buffering right */+ setvbuf(stdout, NULL, _IOLBF, BUFSIZ);+ setvbuf(stderr, NULL, _IONBF, BUFSIZ);+#endif++ argc--, argv++;+ glob_argv = argv;+ for (av = argv, inrts = 0; argc--; argv++) {+ char *p = *argv;+ if (inrts) {+ if (strcmp(p, "-RTS") == 0) {+ inrts = 0;+ } else {+ if (strcmp(p, "-v") == 0)+ verbose++;+ else if (strncmp(p, "-H", 2) == 0)+ heap_size = memsize(&p[2]);+ else if (strncmp(p, "-K", 2) == 0)+ stack_size = memsize(&p[2]);+ else if (strncmp(p, "-r", 2) == 0)+ inname = &p[2];+#if WANT_STDIO+ else if (strncmp(p, "-o", 2) == 0)+ outname = &p[2];+#endif /* WANT_STDIO */+ else+ ERR("Usage: eval [+RTS [-v] [-Hheap-size] [-Kstack-size] [-rFILE] [-oFILE] -RTS] arg ...");+ }+ } else {+ if (strcmp(p, "+RTS") == 0) {+ inrts = 1;+ } else {+ *av++ = p;+ }+ }+ }+ glob_argc = av - glob_argv;++ if (inname == 0)+ inname = "out.comb";++ init_nodes();+ stack = malloc(sizeof(NODEPTR) * stack_size);+ if (!stack)+ memerr();++ if (combexpr) {+ int c;+ struct BFILE_buffer ibf = { { getb_buf, ungetb_buf, closeb_buf }, combexprlen, 0, combexpr };+ BFILE *bf = (BFILE*)&ibf;+ c = bf->getb(bf);+ /* Compressed combinators start with a 'Z', otherwise 'v' (for version) */+ if (c == 'Z') {+ /* add compressor transducer */+ bf = add_lzw_decompressor(bf);+ } else {+ /* put it back, we need it */+ bf->ungetb(c, bf);+ }+ prog = parse_top(bf);+ bf->closeb(bf);+ } else {+#if WANT_STDIO+ prog = parse_file(inname, &file_size);+#else+ ERR("no stdio");+#endif+ }++ PUSH(prog); gc(); prog = TOP(0); POP(1);+#if WANT_STDIO+ heapoffs_t start_size = num_marked;+ if (outname) {+ /* Save GCed file (smaller), and exit. */+ FILE *out = fopen(outname, "w");+ if (!out)+ ERR1("cannot open output file %s", outname);+ print(out, prog, 1);+ fclose(out);+ exit(0);+ }+ if (verbose > 2) {+ //pp(stdout, prog);+ print(stdout, prog, 1);+ }+#endif+ run_time -= GETTIMEMILLI();+ NODEPTR res = execio(prog);+ res = evali(res);+ run_time += GETTIMEMILLI();+#if WANT_STDIO+ if (0) {+ FILE *out = fopen("prog.comb", "w");+ print(out, prog, 1);+ fclose(out);+ }+ if (verbose) {+ if (verbose > 1) {+ printf("\nmain returns ");+ pp(stdout, res);+ printf("node size=%"PRIheap", heap size bytes=%"PRIheap"\n", (heapoffs_t)NODE_SIZE, heap_size * NODE_SIZE);+ }+ setlocale(LC_NUMERIC, ""); /* Make %' work on platforms that support it */+ printf("%"PCOMMA"15"PRIheap" combinator file size\n", (heapoffs_t)file_size);+ printf("%"PCOMMA"15"PRIheap" cells at start\n", start_size);+ printf("%"PCOMMA"15"PRIheap" cells heap size (%"PCOMMA""PRIheap" bytes)\n", heap_size, heap_size * NODE_SIZE);+ printf("%"PCOMMA"15"PRIcounter" cells allocated (%"PCOMMA".1f Mbyte/s)\n", num_alloc, num_alloc * NODE_SIZE / ((double)run_time / 1000) / 1000000);+ printf("%"PCOMMA"15"PRIcounter" GCs\n", num_gc);+ printf("%"PCOMMA"15"PRIcounter" max cells used\n", max_num_marked);+ printf("%"PCOMMA"15"PRIcounter" reductions (%"PCOMMA".1f Mred/s)\n", num_reductions, num_reductions / ((double)run_time / 1000) / 1000000);+ printf("%15.2fs total expired time\n", (double)run_time / 1000);+ printf("%15.2fs total gc time\n", (double)gc_mark_time / 1000);+#if GCRED && 0+ printf(" GC reductions A=%d, K=%d, I=%d, int=%d\n", red_a, red_k, red_i, red_int);+#endif+ }+#endif /* WANT_STDIO */+ exit(0);+}
+ tests/Arith.hs view
@@ -0,0 +1,8 @@+module Arith(module Arith) where+import Prelude++main :: IO ()+main = do+ putStrLn $ show [ op x y | x <- [0 - 5,0 - 2,0 - 1,0,1,2,5]::[Int], y <- [0 - 5,0 - 2,0 - 1,0,1,2,5::Int], op <- [(+),( - ),(*)] ]+ putStrLn $ show [ op x y | x <- [0 - 5,0 - 2,0 - 1,0,1,2,5]::[Int], y <- [0 - 5,0 - 2,0 - 1,1,2,5::Int], op <- [quot, rem] ]+ putStrLn $ show [ op x y | x <- [0 - 5,0 - 2,0 - 1,0,1,2,5]::[Int], y <- [0 - 5,0 - 2,0 - 1,0,1,2,5::Int], op <- [(==),(/=),(<),(<=),(>),(>=)] ]
+ tests/Arith.ref view
@@ -0,0 +1,3 @@+[-10,0,25,-7,-3,10,-6,-4,5,-5,-5,0,-4,-6,-5,-3,-7,-10,0,-10,-25,-7,3,10,-4,0,4,-3,-1,2,-2,-2,0,-1,-3,-2,0,-4,-4,3,-7,-10,-6,4,5,-3,1,2,-2,0,1,-1,-1,0,0,-2,-1,1,-3,-2,4,-6,-5,-5,5,0,-2,2,0,-1,1,0,0,0,0,1,-1,0,2,-2,0,5,-5,0,-4,6,-5,-1,3,-2,0,2,-1,1,1,0,2,0,1,3,-1,2,6,-4,5,-3,7,-10,0,4,-4,1,3,-2,2,2,0,3,1,2,4,0,4,7,-3,10,0,10,-25,3,7,-10,4,6,-5,5,5,0,6,4,5,7,3,10,10,0,25]+[1,0,2,-1,5,0,-5,0,-2,-1,-1,0,0,-2,1,0,2,0,-2,0,-1,0,0,-2,0,-1,0,-1,1,0,-1,0,0,-1,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,-1,0,1,0,0,1,0,1,0,2,-1,0,-2,0,2,0,1,0,0,2,-1,0,-2,1,-5,0,5,0,2,1,1,0]+[True,False,False,True,False,True,False,True,True,True,False,False,False,True,True,True,False,False,False,True,True,True,False,False,False,True,True,True,False,False,False,True,True,True,False,False,False,True,True,True,False,False,False,True,False,False,True,True,True,False,False,True,False,True,False,True,True,True,False,False,False,True,True,True,False,False,False,True,True,True,False,False,False,True,True,True,False,False,False,True,True,True,False,False,False,True,False,False,True,True,False,True,False,False,True,True,True,False,False,True,False,True,False,True,True,True,False,False,False,True,True,True,False,False,False,True,True,True,False,False,False,True,True,True,False,False,False,True,False,False,True,True,False,True,False,False,True,True,False,True,False,False,True,True,True,False,False,True,False,True,False,True,True,True,False,False,False,True,True,True,False,False,False,True,True,True,False,False,False,True,False,False,True,True,False,True,False,False,True,True,False,True,False,False,True,True,False,True,False,False,True,True,True,False,False,True,False,True,False,True,True,True,False,False,False,True,True,True,False,False,False,True,False,False,True,True,False,True,False,False,True,True,False,True,False,False,True,True,False,True,False,False,True,True,False,True,False,False,True,True,True,False,False,True,False,True,False,True,True,True,False,False,False,True,False,False,True,True,False,True,False,False,True,True,False,True,False,False,True,True,False,True,False,False,True,True,False,True,False,False,True,True,False,True,False,False,True,True,True,False,False,True,False,True]
+ tests/Case.hs view
@@ -0,0 +1,70 @@+module Case(module Case) where+import Prelude++main :: IO ()+main = do+ putStrLn $ show $ f1 False+ putStrLn $ show $ f2 False+ putStrLn $ show $ f2 True+-- putStrLn $ showInt $ f3 False+ putStrLn $ show $ map f4 [R,G,B]+ putStrLn $ show $ f5 [(3::Int,4::Int)]+ --putStrLn $ showInt $ f6 [(3,4)]+ putStrLn $ show $ [ i | Just i <- [Just (1::Int), Nothing, Just 2] ]+ (x,y) <- return (2::Int,3::Int)+ putStrLn $ show $ x + y++f1 :: Bool -> Bool+f1 b =+ case b of+ c -> c++f2 :: Bool -> Int+f2 b =+ case b of+ True -> 1+ _ -> 0++f3 :: Bool -> Int+f3 b =+ case b of+ True -> 1++data RGB = R | G | B++instance Show RGB where+ show = showRGB++showRGB :: RGB -> String+showRGB c =+ case c of+ R -> "R"+ G -> "G"+ B -> "B"++nextRGB :: RGB -> RGB+nextRGB c =+ case c of+ R -> G+ G -> B+ B -> R++f4 :: RGB -> RGB+f4 c =+ case nextRGB c of+ R -> R+ k -> nextRGB k++f5 :: [(Int, Int)] -> Int+f5 arg =+ case arg of+ [] -> 0+ (x,y) : _ -> x+y++{-+f6 :: [(Int, Int)] -> Int+f6 arg =+ case arg of+ [] -> 0+ (x,y) : ((u,v) : _) -> x+y+-}
+ tests/Case.ref view
@@ -0,0 +1,7 @@+False+0+1+[B,R,R]+7+[1,2]+5
+ tests/Catch.hs view
@@ -0,0 +1,22 @@+module Catch(main) where+import Prelude+import Control.Exception++f :: [Int] -> Int+f (_:_) = 99++class C a where+ m :: a -> Int++instance C ()++main :: IO ()+main = do+ x <- catch (return ("o" ++ "k")) (\ _ -> return "what?")+ putStrLn $ show x+ y <- catch (do { error "bang!"; return "yyy" }) (\ (Exn s) -> return s)+ putStrLn $ show y+ z <- catch (do { print (f []); return "zzz" }) (\ (Exn s) -> return s)+ putStrLn $ show z+ w <- catch (do { print (m ()); return "www" }) (\ (Exn s) -> return s)+ putStrLn $ show w
+ tests/Catch.ref view
@@ -0,0 +1,4 @@+"ok"+"bang!"+"no match at ./Catch.hs, line 6, col 1"+"no default for C.m"
+ tests/Class.hs view
@@ -0,0 +1,45 @@+module Class(main) where+import Primitives+import Prelude++class Eqq a where+ (===) :: a -> a -> Bool+ (/==) :: a -> a -> Bool+ x /== y = not (x === y)++instance Eqq Int where+ (===) = primIntEQ++instance Eqq Char where+ (===) = primCharEQ++instance forall a . Eqq a => Eqq [a] where+ [] === [] = True+ (x:xs) === (y:ys) = x === y && xs === ys+ _ === _ = False++class (Eqq a) => Ordd a where+ (<==) :: a -> a -> Bool++instance Ordd Int where+ (<==) = (<=)++instance forall a b . (Eqq a, Eqq b) => Eqq (a, b) where+ (a, b) === (a', b') = a === a' && b === b'++f :: forall a . Eqq a => a -> Bool+f x = x === x++g :: forall a . Ordd a => a -> Bool+g x = x /== x++h :: forall a b . (Eqq a, Eqq b) => a -> b -> Bool+h a b = a === a && b === b++main :: IO ()+main = do+ putStrLn $ show $ f (5::Int)+ putStrLn $ show $ g (5::Int)+ putStrLn $ show $ h (5::Int) 'a'+ putStrLn $ show $ f [88::Int]+ putStrLn $ show $ f (1::Int, 'a')
+ tests/Class.ref view
@@ -0,0 +1,5 @@+True+False+True+True+True
+ tests/Default.hs view
@@ -0,0 +1,9 @@+module Default(main) where+import Prelude+default (Int, Double)++main :: IO ()+main = do+ print 1+ print 1.2+ print [] -- defaults to Int, a little weird
+ tests/Default.ref view
@@ -0,0 +1,3 @@+1+1.2+[]
+ tests/Enum.hs view
@@ -0,0 +1,12 @@+module Enum(main) where+import Prelude++main :: IO ()+main = do+ putStrLn $ show [1::Int .. 5]+ putStrLn $ show [1::Int .. 1]+ putStrLn $ show [1::Int .. 0]+ putStrLn $ show [1,3::Int .. 10]+ putStrLn $ show [1::Int, -1 .. -5]+ putStrLn $ show $ take 5 [1::Int ..]+ putStrLn $ show $ take 5 [1,3::Int ..]
+ tests/Enum.ref view
@@ -0,0 +1,7 @@+[1,2,3,4,5]+[1]+[]+[1,3,5,7,9]+[1,-1,-3,-5]+[1,2,3,4,5]+[1,3,5,7,9]
+ tests/Eq.hs view
@@ -0,0 +1,20 @@+module Eq(main) where+import Prelude+import Data.Double()++main :: IO ()+main = do+ putStrLn $ show [1==(1::Int), 'a'=='a', 1.1==(1.1::Double),+ True==True, False==False,+ (Nothing::Maybe Int)==Nothing, Just (1::Int) == Just 1,+ [1,2,3] == [1,2,3::Int],+ (1,2) == (1::Int,2::Int),+ (Left 1 :: Either Int Char) == Left 1, (Right 'a' :: Either Int Char) == Right 'a'+ ]+ putStrLn $ show [1==(2::Int), 'a'=='b', 1.1==(1.2::Double),+ True==False, False==True,+ Nothing==Just (1::Int), Just (1::Int) == Nothing,+ [1,2,3] == [1,2,4::Int],+ (1,2) == (1::Int,4::Int),+ Left (1::Int) == Right 'a', Right 'a' == Left (1::Int)+ ]
+ tests/Eq.ref view
@@ -0,0 +1,2 @@+[True,True,True,True,True,True,True,True,True,True,True]+[False,False,False,False,False,False,False,False,False,False,False]
+ tests/Exists.hs view
@@ -0,0 +1,42 @@+module Exists(main) where+import Prelude++data E = forall a . Show a => C a++es :: [E]+es = [C True, C 'a', wrap (C (1::Int))]++instance Show E where+ show (C a) = show a++wrap :: E -> E+wrap (C a) = C [a]++eio :: IO E+eio = return (C True)++someE :: E+someE = C (Just 'a')++foo :: E -> String+foo x | C a <- x = show a++bar :: E -> String+bar x =+ case x of+ C a -> show a++data T a = Show a => T a++sh :: forall a . T a -> String+sh (T a) = show a++main :: IO ()+main = do+ print es+ C x <- eio+ print x+ putStrLn (foo someE)+ putStrLn (bar someE)+ putStrLn (sh (T True))+ putStrLn (sh (T 'x'))
+ tests/Exists.ref view
@@ -0,0 +1,6 @@+[True,'a',[1]]+True+Just 'a'+Just 'a'+True+'x'
+ tests/ExistsBug.hs view
@@ -0,0 +1,18 @@+module Exists(main) where+import Prelude++data E = forall a . Show a => C a++es :: [E]+es = [C True, C 'a']++instance Show E where+ show (C a) = show a++xx :: Int+xx =+ let f (C a) = a+ in length $ map f [C 'a', C True]++main :: IO ()+main = print es
+ tests/FArith.hs view
@@ -0,0 +1,24 @@+module FArith(module FArith) where++import Prelude+import Text.String++list1 :: [Double]+list1 = [-100.343241, -53.3248973, 0.0, 1.0, 1.23453523, 3243534.34534, 999.999]++list2 :: [Double]+list2 = [-100.343241, -53.3248973, 0.0, 1.0, 1.23453523, 3243534.34534, 999.999, 1.2e33]++divide :: Double -> Double -> Double+divide x y = if y == 0.0 then 0.0 else x / y++main :: IO ()+main = do+ putStrLn $ show [ op x y | x <- list1, y <- list2, op <- [(+), (-), (*), divide] ]+ putStrLn $ show [ op x y | x <- list1, y <- list2, op <- [(==), (/=), (<), (<=), (>), (>=)] ]+ putStrLn $ show [ x / y | x <- [2.234983, 1.232, 23.0::Double], y <- [1.0, 5.0, 10.0, 100.0]]+ putStrLn $ show [ x / y | x <- [-2.234983, -1.232, -23.0::Double], y <- [1.0, -5.0, 10.0, -100.0]]+ let str = readDouble "1.576"+ putStrLn $ show str+ putStrLn $ show $ 1.0 + readDouble "2.5"+ putStrLn $ show $ map readDouble ["1.5e42", "1.2e-90"]
+ tests/FArith.ref view
@@ -0,0 +1,7 @@+[-200.686482,0.0,10068.76601438408,1.0,-153.6681383,-47.0183437,5350.79302107415,1.881733413108702,-100.343241,-100.343241,-0.0,0.0,-99.34324100000001,-101.343241,-100.343241,-100.343241,-99.10870577,-101.57777623,-123.8772661068804,-81.28017618419848,3243434.002099,-3243634.688581,-325466748.5062289,-3.093638923360364e-05,899.655759,-1100.342241,-100343.140656759,-0.1003433413433413,1.2e+33,-1.2e+33,-1.204118892e+35,-8.36193675e-32,-153.6681383,47.0183437,5350.79302107415,0.53142490484237,-106.6497946,0.0,2843.544672055548,1.0,-53.3248973,-53.3248973,-0.0,0.0,-52.3248973,-54.3248973,-53.3248973,-53.3248973,-52.09036207,-54.55943253,-65.83146435298188,-43.19430989425875,3243481.0204427,-3243587.6702373,-172961135.8542782,-1.644036770463433e-05,946.6741027,-1053.3238973,-53324.8439751027,-0.05332495062495063,1.2e+33,-1.2e+33,-6.398987676000001e+34,-4.443741441666667e-32,-100.343241,100.343241,-0.0,-0.0,-53.3248973,53.3248973,-0.0,-0.0,0.0,0.0,0.0,0.0,1.0,-1.0,0.0,0.0,1.23453523,-1.23453523,0.0,0.0,3243534.34534,-3243534.34534,0.0,0.0,999.999,-999.999,0.0,0.0,1.2e+33,-1.2e+33,0.0,0.0,-99.34324100000001,101.343241,-100.343241,-0.009965793311380085,-52.3248973,54.3248973,-53.3248973,-0.01875296626215912,1.0,1.0,0.0,0.0,2.0,0.0,1.0,1.0,2.23453523,-0.2345352300000001,1.23453523,0.8100214361642801,3243535.34534,-3243533.34534,3243534.34534,3.083056609024981e-07,1000.999,-998.999,999.999,0.001000001000001,1.2e+33,-1.2e+33,1.2e+33,8.333333333333333e-34,-99.10870577,101.57777623,-123.8772661068804,-0.01230312293779708,-52.09036207,54.55943253,-65.83146435298188,-0.02315119751763685,1.23453523,1.23453523,0.0,0.0,2.23453523,0.2345352300000001,1.23453523,1.23453523,2.46907046,0.0,1.524077234111153,1.0,3243535.57987523,-3243533.11080477,4004257.419037217,3.806141999925675e-07,1001.23353523,-998.76446477,1234.53399546477,0.001234536464536465,1.2e+33,-1.2e+33,1.481442276e+33,1.028779358333333e-33,3243434.002099,3243634.688581,-325466748.5062289,-32324.39288402096,3243481.0204427,3243587.6702373,-172961135.8542782,-60825.89014831539,3243534.34534,3243534.34534,0.0,0.0,3243535.34534,3243533.34534,3243534.34534,3243534.34534,3243535.57987523,3243533.11080477,4004257.419037217,2627332.348660475,6487068.69068,0.0,10520515049400.18,1.0,3244534.34434,3242534.34634,3243531101.805655,3243.537588877589,1.2e+33,-1.2e+33,3.892241214408e+39,2.702945287783333e-27,899.655759,1100.342241,-100343.140656759,-9.965783345586773,946.6741027,1053.3238973,-53324.8439751027,-18.75294750919286,999.999,999.999,0.0,0.0,1000.999,998.999,999.999,999.999,1001.23353523,998.76446477,1234.53399546477,810.020626142844,3244534.34434,-3242534.34634,3243531101.805655,0.0003083053525968371,1999.998,0.0,999998.000001,1.0,1.2e+33,-1.2e+33,1.1999988e+36,8.333325e-31]+[True,False,False,True,False,True,False,True,True,True,False,False,False,True,True,True,False,False,False,True,True,True,False,False,False,True,True,True,False,False,False,True,True,True,False,False,False,True,True,True,False,False,False,True,True,True,False,False,False,True,False,False,True,True,True,False,False,True,False,True,False,True,True,True,False,False,False,True,True,True,False,False,False,True,True,True,False,False,False,True,True,True,False,False,False,True,True,True,False,False,False,True,True,True,False,False,False,True,False,False,True,True,False,True,False,False,True,True,True,False,False,True,False,True,False,True,True,True,False,False,False,True,True,True,False,False,False,True,True,True,False,False,False,True,True,True,False,False,False,True,True,True,False,False,False,True,False,False,True,True,False,True,False,False,True,True,False,True,False,False,True,True,True,False,False,True,False,True,False,True,True,True,False,False,False,True,True,True,False,False,False,True,True,True,False,False,False,True,True,True,False,False,False,True,False,False,True,True,False,True,False,False,True,True,False,True,False,False,True,True,False,True,False,False,True,True,True,False,False,True,False,True,False,True,True,True,False,False,False,True,True,True,False,False,False,True,True,True,False,False,False,True,False,False,True,True,False,True,False,False,True,True,False,True,False,False,True,True,False,True,False,False,True,True,False,True,False,False,True,True,True,False,False,True,False,True,False,True,False,False,True,True,False,True,True,True,False,False,False,True,False,False,True,True,False,True,False,False,True,True,False,True,False,False,True,True,False,True,False,False,True,True,False,True,False,False,True,True,False,True,True,True,False,False,True,False,False,True,False,True,False,True,True,True,False,False]+[2.234983,0.4469966,0.2234983,0.02234983,1.232,0.2464,0.1232,0.01232,23.0,4.6,2.3,0.23]+[-2.234983,0.4469966,-0.2234983,0.02234983,-1.232,0.2464,-0.1232,0.01232,-23.0,4.6,-2.3,0.23]+1.576+3.5+[1.5e+42,1.2e-90]
+ tests/Fac.hs view
@@ -0,0 +1,23 @@+-- Simple test+module Fac(module Fac) where+import Prelude++fac :: Int -> Int -- ignored+fac n =+ case n == 0 of+ False -> n * fac (n - 1)+ True -> 1++nfib :: Int -> Int -- ignored+nfib n =+ case n < 2 of+ False -> nfib (n - 1) + nfib (n - 2) + 1+ True -> 1++res :: (Int, Int)+res = (fac 10, nfib 30)++main :: IO ()+main = do+ print $ fac 6+ print $ fst res + snd res
+ tests/Fac.ref view
@@ -0,0 +1,2 @@+720+6321337
+ tests/Floating.hs view
@@ -0,0 +1,8 @@+module Floating(main) where+import Prelude++main :: IO ()+main = do+ print $ log (1000::Double)+ print $ cos (pi::Double)+ print $ sqrt (4::Double)
+ tests/Floating.ref view
@@ -0,0 +1,3 @@+6.907755278982137+-1.0+2.0
+ tests/Foreign.hs view
@@ -0,0 +1,11 @@+module Foreign(main) where+import Prelude++foreign import ccall "llabs" abs :: Int -> IO Int++main :: IO ()+main = do+ x1 <- abs (3 - 8)+ putStrLn $ show x1+ x2 <- abs (10 - 8)+ putStrLn $ show x2
+ tests/Foreign.ref view
@@ -0,0 +1,2 @@+5+2
+ tests/FunDep.hs view
@@ -0,0 +1,11 @@+module FunDep(main) where++class C a b | a -> b where+ f :: a -> b++--instance C Char Int where+-- f = chr++class Plus a b c | a b -> c, b c -> a, c a -> b where+ plus :: a -> b -> c+
+ tests/Guard.hs view
@@ -0,0 +1,15 @@+module Guard(main) where+import Prelude++f :: [Int] -> Int+f [x] | x < 0 = 0 - x+ | x < 10 = x+1+ | otherwise = 99+f [x,y] = x+y+f xs | l < 4 = 0+ | otherwise = l+ where { l = length xs }++main :: IO ()+main = do+ putStrLn $ show [f [0 - 7], f [5], f [20], f [2,3], f [1,2,3], f[1,2,3,4]]
+ tests/Guard.ref view
@@ -0,0 +1,1 @@+[7,6,99,5,0,4]
+ tests/Hello.hs view
@@ -0,0 +1,5 @@+module Hello(main) where+import Prelude++main :: IO ()+main = putStrLn "hello, world\n"
+ tests/Hello.ref view
@@ -0,0 +1,2 @@+hello, world+
+ tests/IOTest.hs view
@@ -0,0 +1,48 @@+module IOTest(module IOTest) where+import Prelude+import System.IO as IO+import System.Environment+import Debug.Trace++f :: Int -> Int+f x = x*2+1++foo :: IO ()+foo = do+ putStrLn "foo 1"+ putStrLn "foo 2"++main :: IO ()+main = do+ tstart <- getTimeMilli+ putChar 'a'+ putChar 'b'+ c <- getChar+ putStrLn [c,c,c]+ let { p = putStrLn "hello" }+ p+ p+ p+ cprint ((+) :: Int->Int->Int)+ hout <- openFile "test.tmp" WriteMode+ hPutChar hout 'a'+ hPutChar hout 'z'+ hClose hout+ hin <- openFile "test.tmp" ReadMode+ c1 <- hGetChar hin+ c2 <- hGetChar hin+ putStrLn $ show (c1, c2)+ writeFile "test2.tmp" "more\n"+ s <- readFile "test2.tmp"+ putStrLn (show s)+ writeSerialized "f.tmp" f+ g <- readSerialized "f.tmp"+ putStrLn $ show $ (g (5::Int) :: Int)+ foo+ putStrLn $ show $ trace "tracing" (5::Int)+ as <- getArgs+ putStrLn $ show as+ putStrLn $ show $ seq ((1::Int) + (2::Int)) (5::Int)+ putStrLn $ show $ seq ((1::Int) + trace "seq" (2::Int)) (5::Int)+ tend <- getTimeMilli+ putStrLn $ show (tend - tstart) ++ "ms execution time"
+ tests/IOTest.ref view
@@ -0,0 +1,17 @@+abqqq+hello+hello+hello+++('a','z')+"more\n"+11+foo 1+foo 2+tracing+5+["a","bb","ccc"]+5+seq+5+1ms execution time
+ tests/Infix.hs view
@@ -0,0 +1,19 @@+module Infix(main) where+import Prelude++infix 1 ===+infixl 2 ++++infixr 3 &&&++(===) :: Int -> Int -> Bool+x === y = x == y+1++(+++) :: Int -> Int -> Int+a +++ b = a + b + 1++(&&&) :: Int -> Int -> Int+a &&& b = a * (b + 1)++main :: IO ()+main = do+ putStrLn $ show $ 2 +++ 3 &&& 4 === 17
+ tests/Infix.ref view
@@ -0,0 +1,1 @@+True
+ tests/Kind.hs view
@@ -0,0 +1,6 @@+module Kind(main) where++data TypeRep k (a::k) = T++class C k (a :: k) where+ typeRep :: TypeRep k a
+ tests/ListTest.hs view
@@ -0,0 +1,9 @@+module ListTest(module ListTest) where+import Prelude++main :: IO ()+main = do+ putStrLn $ show $ sum [1,2,3::Int]+ putStrLn $ show $ product [1,2,3,4::Int]+ putStrLn $ show $ and [True]+ putStrLn $ show $ and [True, False]
+ tests/ListTest.ref view
@@ -0,0 +1,4 @@+6+24+True+False
+ tests/LitMatch.hs view
@@ -0,0 +1,31 @@+module LitMatch(main) where+import Prelude++f :: Int -> Int+f 0 = 10+f 1 = 20+f n = 0++g :: Int -> Int -> Int+g 1 0 = 10+g 2 0 = 20+g 2 1 = 21+g 1 1 = 11+g _ _ = 99++h :: Char -> Int+h 'a' = 1+h 'b' = 2+h _ = 3++s :: String -> Int+s "apa" = 1+s "foo" = 2+s _ = 3++main :: IO ()+main = do+ putStrLn $ show [f 0, f 1, f 10]+ putStrLn $ show [g 1 0, g 1 1, g 2 0, g 2 1, g 2 2]+ putStrLn $ show [h 'a', h 'b', h 'c']+ putStrLn $ show [s "aaa", s "apa", s "foo"]
+ tests/LitMatch.ref view
@@ -0,0 +1,4 @@+[10,20,0]+[10,11,20,21,99]+[1,2,3]+[3,1,2]
+ tests/LocalPoly.hs view
@@ -0,0 +1,12 @@+module LocalPoly(main) where+import Prelude++main :: IO ()+main = do+ putStrLn $ show $ f 1 "a"++f :: forall b . Int -> b -> ((Int, b), (b, b))+f x b = (i x, i b)+ where+ i :: forall a . a -> (a, b)+ i a = (a, b)
+ tests/LocalPoly.ref view
@@ -0,0 +1,1 @@+((1,"a"),("a","a"))
+ tests/Makefile view
@@ -0,0 +1,45 @@+MHS=../bin/gmhs -i../lib+EVAL=../bin/mhseval+.PHONY: test time clean errtest alltest++alltest: test errtest++test:+ $(MHS) Hello && $(EVAL) > Hello.out && diff Hello.ref Hello.out+ $(MHS) IOTest && (echo q | $(EVAL) a bb ccc | sed 's/^.ms/1ms/' > IOTest.out) && diff IOTest.ref IOTest.out+ $(MHS) StringTest && $(EVAL) > StringTest.out && diff StringTest.ref StringTest.out+ $(MHS) ListTest && $(EVAL) > ListTest.out && diff ListTest.ref ListTest.out+ $(MHS) Fac && $(EVAL) > Fac.out && diff Fac.ref Fac.out+ $(MHS) Misc && $(EVAL) > Misc.out && diff Misc.ref Misc.out+ $(MHS) Case && $(EVAL) > Case.out && diff Case.ref Case.out+ $(MHS) Arith && $(EVAL) > Arith.out && diff Arith.ref Arith.out+ $(MHS) Guard && $(EVAL) > Guard.out && diff Guard.ref Guard.out+ $(MHS) Newtype && $(EVAL) > Newtype.out && diff Newtype.ref Newtype.out+ $(MHS) LitMatch && $(EVAL) > LitMatch.out && diff LitMatch.ref LitMatch.out+ $(MHS) Word && $(EVAL) > Word.out && diff Word.ref Word.out+ $(MHS) Enum && $(EVAL) > Enum.out && diff Enum.ref Enum.out+ $(MHS) Foreign && $(EVAL) > Foreign.out && diff Foreign.ref Foreign.out+ $(MHS) MutRec && $(EVAL) > MutRec.out && diff MutRec.ref MutRec.out+ $(MHS) LocalPoly && $(EVAL) > LocalPoly.out && diff LocalPoly.ref LocalPoly.out+ $(MHS) Rank2 && $(EVAL) > Rank2.out && diff Rank2.ref Rank2.out+ $(MHS) Catch && $(EVAL) > Catch.out && diff Catch.ref Catch.out+ $(MHS) FArith && $(EVAL) > FArith.out && diff FArith.ref FArith.out+ $(MHS) Infix && $(EVAL) > Infix.out && diff Infix.ref Infix.out+ $(MHS) Class && $(EVAL) > Class.out && diff Class.ref Class.out+ $(MHS) Eq && $(EVAL) > Eq.out && diff Eq.ref Eq.out+ $(MHS) Floating && $(EVAL) > Floating.out && diff Floating.ref Floating.out+ $(MHS) Default && $(EVAL) > Default.out && diff Default.ref Default.out+ $(MHS) Multi && $(EVAL) > Multi.out && diff Multi.ref Multi.out+ $(MHS) Exists && $(EVAL) > Exists.out && diff Exists.ref Exists.out+ $(MHS) TypeEq && $(EVAL) > TypeEq.out && diff TypeEq.ref TypeEq.out+ $(MHS) Sieve && $(EVAL) > Sieve.out && diff Sieve.ref Sieve.out++errtest:+ sh errtester.sh < errmsg.test++time:+ @echo Expect about 10s runtime+ $(MHS) Nfib && time -p $(EVAL)++clean:+ rm -f *.out *.tmp
+ tests/Misc.hs view
@@ -0,0 +1,11 @@+module Misc(module Misc) where+import Prelude++first :: forall a b . (a, b) -> a+first ab =+ let { (a, b) = ab }+ in a++main :: IO ()+main = do+ print $ first (10::Int,20::Int)
+ tests/Misc.ref view
@@ -0,0 +1,1 @@+10
+ tests/Multi.hs view
@@ -0,0 +1,20 @@+module Multi(main) where+import Prelude++class C a b where+ conv :: a -> b++instance C Int Bool where+ conv x = x /= 0++instance C Int Char where+ conv = chr++instance C Char Int where+ conv = ord++main :: IO ()+main = do+ print (conv (100::Int) :: Bool)+ print (conv (100::Int) :: Char)+ print (conv 'a' :: Int)
+ tests/Multi.ref view
@@ -0,0 +1,3 @@+True+'d'+97
+ tests/MutRec.hs view
@@ -0,0 +1,8 @@+module MutRec(main) where+import Prelude++main :: IO ()+main = do+ let even i = if i == 0 then True else odd (i - 1)+ odd i = if i == 0 then False else even (i - 1)+ putStrLn $ show $ map even [1::Int .. 5] ++ map odd [1 .. 5]
+ tests/MutRec.ref view
@@ -0,0 +1,1 @@+[False,True,False,True,False,True,False,True,False,True]
+ tests/Newtype.hs view
@@ -0,0 +1,19 @@+module Newtype(main) where+import Prelude++newtype N = N Int+newtype M a = M a++f :: N -> Int+f (N x) = x++g :: M (Int, Int) -> M Int+g (M (x, y)) = M x++showM :: forall a . (a -> String) -> M a -> String+showM sh (M x) = "(M " ++ sh x ++ ")"++main :: IO ()+main = do+ putStrLn $ show [f (N 1), f (N 2)]+ putStrLn $ showM show (g (M (3,4)))
+ tests/Newtype.ref view
@@ -0,0 +1,2 @@+[1,2]+(M 3)
+ tests/Nfib.hs view
@@ -0,0 +1,17 @@+module Nfib(main) where+import Prelude++nfib :: Int -> Int+nfib n =+ case n < 2 of+ False -> nfib (n - 1) + nfib (n - 2) + 1+ True -> 1++main :: IO ()+main = print (nfib 44)++-- Typical nfib/s is 10M+-- mhs+-- 126491971 / 15.68 = 8.07M+-- ghc+-- 126491971 / 0.236 = 535M
+ tests/Rank2.hs view
@@ -0,0 +1,20 @@+module Rank2(main) where+import Prelude++f :: (forall a . a -> a) -> (Int, Bool)+f i = (i (1::Int), i True)++g :: (forall a . a -> Int -> a) -> (Int, Bool)+g c = (c (1::Int) (1::Int), c True (1::Int))++data Id = Id (forall a . a -> a)++iD :: Id+iD = Id (\ x -> x)++main :: IO ()+main = do+ putStrLn $ show $ f id+ putStrLn $ show $ g const+ case iD of+ Id i -> putStrLn $ show (i (1::Int), i True)
+ tests/Rank2.ref view
@@ -0,0 +1,3 @@+(1,True)+(1,True)+(1,True)
+ tests/Readline.hs view
@@ -0,0 +1,16 @@+module Readline(main) where+import Prelude+import System.Console.SimpleReadline++main :: IO ()+main = do+ putStrLn "Type 'quit' to quit."+ loop++loop :: IO ()+loop = do+ s <- getInputLineHist "hist.txt" "% "+ case s of+ Just "quit" -> putStrLn "Bye"+ _ -> do putStrLn $ showMaybe showString s; loop+
+ tests/Sieve.hs view
@@ -0,0 +1,17 @@+module Sieve(main) where+import Prelude++primes :: [Integer]+primes =+ sieve (from 2)+ where+ from n = n : from (n + 1)+ sieve (p : x) = p : sieve (filter x)+ where+ filter (n : x) =+ if n `rem` p == 0 then filter x+ else n : filter x++main :: IO ()+main =+ print $ take 100 primes
+ tests/Sieve.ref view
@@ -0,0 +1,1 @@+[2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,193,197,199,211,223,227,229,233,239,241,251,257,263,269,271,277,281,283,293,307,311,313,317,331,337,347,349,353,359,367,373,379,383,389,397,401,409,419,421,431,433,439,443,449,457,461,463,467,479,487,491,499,503,509,521,523,541]
+ tests/StringTest.hs view
@@ -0,0 +1,22 @@+module StringTest(module StringTest) where+import Prelude++main :: IO ()+main = do+ putStrLn $ if (==) "abc" "abc" then "yes" else "no"+ putStrLn $ if (==) "abc" "adc" then "yes" else "no"+ putStrLn $ show (1234::Int)+ putStrLn $ show (0::Int)+ putStrLn $ show (negate (567::Int))+ putStrLn $ show 'x'+ putStrLn $ show '\n'+ putStrLn $ show False+-- putStrLn $ showUnit ()+ putStrLn $ show [1,20,3::Int]+ putStrLn $ show [1::Int]+ putStrLn $ show ([] :: [Int])+ putStrLn $ show (123::Int, 'a')+ putStrLn $ show (Nothing :: Maybe Int)+ putStrLn $ show (Just 890 :: Maybe Int)+ putStrLn $ show (Left 678 :: Either Int Bool)+ putStrLn $ show (Right True :: Either Int Bool)
+ tests/StringTest.ref view
@@ -0,0 +1,16 @@+yes+no+1234+0+-567+'x'+'\n'+False+[1,20,3]+[1]+[]+(123,'a')+Nothing+Just 890+Left 678+Right True
+ tests/TypeEq.hs view
@@ -0,0 +1,25 @@+module TypeEq(main) where+import Prelude++foo :: forall a . (a ~ Bool) => a -> a+foo = not++data Exp a+ = (a ~ Int) => Int Int+ | (a ~ Int) => Add (Exp Int) (Exp Int)+ | (a ~ Bool) => Equ (Exp Int) (Exp Int)+ | Iff (Exp Bool) (Exp a) (Exp a)++eval :: forall a . Exp a -> a+eval (Int i) = i+eval (Add e1 e2) = eval e1 + eval e2+eval (Equ e1 e2) = eval e1 == eval e2+eval (Iff c e1 e2) = if eval c then eval e1 else eval e2++e1 :: Exp Int+e1 = Iff (Add (Int 1) (Int 2) `Equ` Int 3) (Int 1) (Int 999)++main :: IO ()+main = do+ print (foo True)+ print (eval e1)
+ tests/TypeEq.ref view
@@ -0,0 +1,2 @@+False+1
+ tests/Word.hs view
@@ -0,0 +1,13 @@+module Word(main) where+import Prelude+import Data.Word++main :: IO ()+main = do+ putStrLn $ show (4294967295::Int)+ putStrLn $ show (1000::Word)+ putStrLn $ show twoTo32M1+ putStrLn $ show $ (*) twoTo32M1 twoTo32M1++twoTo32M1 :: Word+twoTo32M1 = 4294967295::Word
+ tests/Word.ref view
@@ -0,0 +1,4 @@+4294967295+1000+4294967295+18446744065119617025