packages feed

cryptol 2.4.0 → 2.5.0

raw patch · 75 files changed

+12642/−7981 lines, 75 filesdep +mtldep +timedep −aesondep −aeson-prettydep −optparse-applicativedep ~basedep ~base-compatdep ~containersnew-uploaderPVP ok

version bump matches the API change (PVP)

Dependencies added: mtl, time

Dependencies removed: aeson, aeson-pretty, optparse-applicative, unix, unordered-containers, zeromq4-haskell

Dependency ranges changed: base, base-compat, containers, directory, monad-control, sbv, simple-smt, text, transformers

API changes (from Hackage documentation)

- Cryptol.Eval: WithBase :: PPOpts -> a -> WithBase a
- Cryptol.Eval: data EvalEnv
- Cryptol.Eval: data WithBase a
- Cryptol.Eval: instance GHC.Base.Applicative Cryptol.Eval.ZList
- Cryptol.Eval: instance GHC.Base.Functor Cryptol.Eval.ZList
- Cryptol.Eval: instance GHC.Base.Monoid Cryptol.Eval.ListEnv
- Cryptol.Eval.Env: data EvalEnv
- Cryptol.Eval.Env: instance Control.DeepSeq.NFData Cryptol.Eval.Env.EvalEnv
- Cryptol.Eval.Env: instance Cryptol.Utils.PP.PP (Cryptol.Eval.Value.WithBase Cryptol.Eval.Env.EvalEnv)
- Cryptol.Eval.Env: instance GHC.Base.Monoid Cryptol.Eval.Env.EvalEnv
- Cryptol.Eval.Env: instance GHC.Generics.Generic Cryptol.Eval.Env.EvalEnv
- Cryptol.Eval.Env: type ReadEnv = EvalEnv
- Cryptol.Eval.Error: DivideByZero :: EvalError
- Cryptol.Eval.Error: InvalidIndex :: Integer -> EvalError
- Cryptol.Eval.Error: TypeCannotBeDemoted :: Type -> EvalError
- Cryptol.Eval.Error: UserError :: String -> EvalError
- Cryptol.Eval.Error: WordTooWide :: Integer -> EvalError
- Cryptol.Eval.Error: cryUserError :: String -> a
- Cryptol.Eval.Error: data EvalError
- Cryptol.Eval.Error: divideByZero :: a
- Cryptol.Eval.Error: evalPanic :: String -> [String] -> a
- Cryptol.Eval.Error: instance Cryptol.Utils.PP.PP Cryptol.Eval.Error.EvalError
- Cryptol.Eval.Error: instance GHC.Exception.Exception Cryptol.Eval.Error.EvalError
- Cryptol.Eval.Error: instance GHC.Show.Show Cryptol.Eval.Error.EvalError
- Cryptol.Eval.Error: invalidIndex :: Integer -> a
- Cryptol.Eval.Error: typeCannotBeDemoted :: Type -> a
- Cryptol.Eval.Error: wordTooWide :: Integer -> a
- Cryptol.Eval.Value: TVBit :: TValue
- Cryptol.Eval.Value: TVFun :: TValue -> TValue -> TValue
- Cryptol.Eval.Value: TVRec :: [(Ident, TValue)] -> TValue
- Cryptol.Eval.Value: TVSeq :: Integer -> TValue -> TValue
- Cryptol.Eval.Value: TVStream :: TValue -> TValue
- Cryptol.Eval.Value: TVTuple :: [TValue] -> TValue
- Cryptol.Eval.Value: WithBase :: PPOpts -> a -> WithBase a
- Cryptol.Eval.Value: data TValue
- Cryptol.Eval.Value: data WithBase a
- Cryptol.Eval.Value: finNat' :: Nat' -> Integer
- Cryptol.Eval.Value: instance (Control.DeepSeq.NFData b, Control.DeepSeq.NFData w) => Control.DeepSeq.NFData (Cryptol.Eval.Value.GenValue b w)
- Cryptol.Eval.Value: instance Control.DeepSeq.NFData Cryptol.Eval.Value.TValue
- Cryptol.Eval.Value: instance Cryptol.Utils.PP.PP (Cryptol.Eval.Value.WithBase Cryptol.Eval.Value.Value)
- Cryptol.Eval.Value: instance GHC.Base.Functor Cryptol.Eval.Value.WithBase
- Cryptol.Eval.Value: instance GHC.Generics.Generic Cryptol.Eval.Value.TValue
- Cryptol.Eval.Value: instance GHC.Show.Show Cryptol.Eval.Value.TValue
- Cryptol.Eval.Value: isTBit :: TValue -> Bool
- Cryptol.Eval.Value: isTFun :: TValue -> Maybe (TValue, TValue)
- Cryptol.Eval.Value: isTRec :: TValue -> Maybe [(Ident, TValue)]
- Cryptol.Eval.Value: isTSeq :: TValue -> Maybe (Nat', TValue)
- Cryptol.Eval.Value: isTTuple :: TValue -> Maybe (Int, [TValue])
- Cryptol.Eval.Value: tValTy :: TValue -> Type
- Cryptol.Eval.Value: toPackedSeq :: Nat' -> TValue -> [Value] -> Value
- Cryptol.Eval.Value: tvSeq :: Nat' -> TValue -> TValue
- Cryptol.Parser.Lexer: instance GHC.Base.Functor Cryptol.Parser.Lexer.AlexLastAcc
- Cryptol.Prims.Eval: divWrap :: Integral a => a -> a -> a
- Cryptol.Prims.Eval: evalPrim :: Decl -> Value
- Cryptol.Prims.Eval: finChunksOf :: Integer -> Integer -> [a] -> [[a]]
- Cryptol.Prims.Eval: indexBackRange :: Maybe Integer -> [Value] -> [Integer] -> [Value]
- Cryptol.Prims.Eval: indexFrontRange :: Maybe Integer -> [Value] -> [Integer] -> [Value]
- Cryptol.Prims.Eval: infChunksOf :: Integer -> [a] -> [[a]]
- Cryptol.Prims.Eval: modWrap :: Integral a => a -> a -> a
- Cryptol.Prims.Eval: type GenBinary b w = TValue -> GenValue b w -> GenValue b w -> GenValue b w
- Cryptol.Prims.Eval: type GenUnary b w = TValue -> GenValue b w -> GenValue b w
- Cryptol.Symbolic: Env :: Map Name Value -> Map TVar (Either Nat' TValue) -> Env
- Cryptol.Symbolic: [envTypes] :: Env -> Map TVar (Either Nat' TValue)
- Cryptol.Symbolic: [envVars] :: Env -> Map Name Value
- Cryptol.Symbolic: bindType :: TVar -> (Either Nat' TValue) -> Env -> Env
- Cryptol.Symbolic: bindVar :: (Name, Value) -> Env -> Env
- Cryptol.Symbolic: branchEnvs :: Env -> [Match] -> [Env]
- Cryptol.Symbolic: copyBySchema :: Env -> Schema -> Value -> Value
- Cryptol.Symbolic: copyByType :: Env -> TValue -> Value -> Value
- Cryptol.Symbolic: data Env
- Cryptol.Symbolic: evalComp :: Env -> TValue -> Expr -> [[Match]] -> Value
- Cryptol.Symbolic: evalDecl :: Env -> Decl -> (Name, Value)
- Cryptol.Symbolic: evalDeclGroup :: Env -> DeclGroup -> Env
- Cryptol.Symbolic: evalDecls :: Env -> [DeclGroup] -> Env
- Cryptol.Symbolic: evalExpr :: Env -> Expr -> Value
- Cryptol.Symbolic: evalMatch :: Env -> Match -> [Env]
- Cryptol.Symbolic: evalNumType :: Env -> Type -> Nat'
- Cryptol.Symbolic: evalSel :: Selector -> Value -> Value
- Cryptol.Symbolic: evalValType :: Env -> Type -> TValue
- Cryptol.Symbolic: instance GHC.Base.Monoid Cryptol.Symbolic.Env
- Cryptol.Symbolic: lookupType :: TVar -> Env -> Maybe (Either Nat' TValue)
- Cryptol.Symbolic: lookupVar :: Name -> Env -> Maybe Value
- Cryptol.Symbolic.Prims: arithBinary :: (SWord -> SWord -> SWord) -> Binary
- Cryptol.Symbolic.Prims: arithUnary :: (SWord -> SWord) -> Unary
- Cryptol.Symbolic.Prims: atV :: Bool -> Value -> [Value] -> Value -> Value
- Cryptol.Symbolic.Prims: atV_list :: Bool -> Bool -> Value -> [Value] -> Value -> Value
- Cryptol.Symbolic.Prims: catV :: Value -> Value -> Value
- Cryptol.Symbolic.Prims: dropV :: Integer -> Value -> Value
- Cryptol.Symbolic.Prims: ecDemoteV :: Value
- Cryptol.Symbolic.Prims: ecSplitV :: Value
- Cryptol.Symbolic.Prims: errorV :: String -> TValue -> Value
- Cryptol.Symbolic.Prims: evalPrim :: Decl -> Value
- Cryptol.Symbolic.Prims: finChunksOf :: Integer -> Integer -> [a] -> [[a]]
- Cryptol.Symbolic.Prims: fromThenToV :: Value
- Cryptol.Symbolic.Prims: fromThenV :: Value
- Cryptol.Symbolic.Prims: fromToV :: Value
- Cryptol.Symbolic.Prims: idx :: [SBool] -> Int -> SBool
- Cryptol.Symbolic.Prims: infChunksOf :: Integer -> [a] -> [[a]]
- Cryptol.Symbolic.Prims: iteAtV :: Value -> [Value] -> Value -> Value
- Cryptol.Symbolic.Prims: joinV :: Nat' -> Nat' -> TValue -> Value -> Value
- Cryptol.Symbolic.Prims: logicBinary :: (SBool -> SBool -> SBool) -> (SWord -> SWord -> SWord) -> Binary
- Cryptol.Symbolic.Prims: logicUnary :: (SBool -> SBool) -> (SWord -> SWord) -> Unary
- Cryptol.Symbolic.Prims: mapV :: Bool -> (Value -> Value) -> Value -> Value
- Cryptol.Symbolic.Prims: nthV :: Value -> Value -> Integer -> Value
- Cryptol.Symbolic.Prims: replicateV :: Integer -> TValue -> Value -> Value
- Cryptol.Symbolic.Prims: takeV :: Integer -> Value -> Value
- Cryptol.Symbolic.Prims: type Binary = TValue -> Value -> Value -> Value
- Cryptol.Symbolic.Prims: type Unary = TValue -> Value -> Value
- Cryptol.Symbolic.Prims: zeroV :: TValue -> Value
- Cryptol.Symbolic.Value: TVBit :: TValue
- Cryptol.Symbolic.Value: TVFun :: TValue -> TValue -> TValue
- Cryptol.Symbolic.Value: TVRec :: [(Ident, TValue)] -> TValue
- Cryptol.Symbolic.Value: TVSeq :: Integer -> TValue -> TValue
- Cryptol.Symbolic.Value: TVStream :: TValue -> TValue
- Cryptol.Symbolic.Value: TVTuple :: [TValue] -> TValue
- Cryptol.Symbolic.Value: finNat' :: Nat' -> Integer
- Cryptol.Symbolic.Value: fromVNumPoly :: GenValue b w -> (Nat' -> GenValue b w)
- Cryptol.Symbolic.Value: iteValue :: SBool -> Value -> Value -> Value
- Cryptol.Symbolic.Value: nlam :: (Nat' -> GenValue b w) -> GenValue b w
- Cryptol.Transform.MonoValues: instance Cryptol.TypeCheck.TypeMap.TrieMap Cryptol.Transform.MonoValues.RewMap' (Cryptol.ModuleSystem.Name.Name, [Cryptol.TypeCheck.AST.Type], GHC.Types.Int)
- Cryptol.TypeCheck: UnsolvedGoal :: Bool -> Goal -> Error
- Cryptol.TypeCheck.AST: (.*.) :: Type -> Type -> Type
- Cryptol.TypeCheck.AST: (.+.) :: Type -> Type -> Type
- Cryptol.TypeCheck.AST: (.-.) :: Type -> Type -> Type
- Cryptol.TypeCheck.AST: (.^.) :: Type -> Type -> Type
- Cryptol.TypeCheck.AST: (:->) :: Kind -> Kind -> Kind
- Cryptol.TypeCheck.AST: (=#=) :: Type -> Type -> Prop
- Cryptol.TypeCheck.AST: (=/=) :: Type -> Type -> Prop
- Cryptol.TypeCheck.AST: (>==) :: Type -> Type -> Prop
- Cryptol.TypeCheck.AST: ECast :: Expr -> Type -> Expr
- Cryptol.TypeCheck.AST: Forall :: [TParam] -> [Prop] -> Type -> Schema
- Cryptol.TypeCheck.AST: KNum :: Kind
- Cryptol.TypeCheck.AST: KProp :: Kind
- Cryptol.TypeCheck.AST: KType :: Kind
- Cryptol.TypeCheck.AST: Newtype :: Name -> [TParam] -> [Prop] -> [(Ident, Type)] -> Newtype
- Cryptol.TypeCheck.AST: PArith :: PC
- Cryptol.TypeCheck.AST: PC :: PC -> TCon
- Cryptol.TypeCheck.AST: PCmp :: PC
- Cryptol.TypeCheck.AST: PEqual :: PC
- Cryptol.TypeCheck.AST: PFin :: PC
- Cryptol.TypeCheck.AST: PGeq :: PC
- Cryptol.TypeCheck.AST: PHas :: Selector -> PC
- Cryptol.TypeCheck.AST: PNeq :: PC
- Cryptol.TypeCheck.AST: TC :: TC -> TCon
- Cryptol.TypeCheck.AST: TCBit :: TC
- Cryptol.TypeCheck.AST: TCFun :: TC
- Cryptol.TypeCheck.AST: TCInf :: TC
- Cryptol.TypeCheck.AST: TCNewtype :: UserTC -> TC
- Cryptol.TypeCheck.AST: TCNum :: Integer -> TC
- Cryptol.TypeCheck.AST: TCSeq :: TC
- Cryptol.TypeCheck.AST: TCTuple :: Int -> TC
- Cryptol.TypeCheck.AST: TCon :: TCon -> [Type] -> Type
- Cryptol.TypeCheck.AST: TF :: TFun -> TCon
- Cryptol.TypeCheck.AST: TParam :: !Int -> Kind -> Maybe Name -> TParam
- Cryptol.TypeCheck.AST: TRec :: [(Ident, Type)] -> Type
- Cryptol.TypeCheck.AST: TUser :: Name -> [Type] -> Type -> Type
- Cryptol.TypeCheck.AST: TVBound :: !Int -> Kind -> TVar
- Cryptol.TypeCheck.AST: TVFree :: !Int -> Kind -> (Set TVar) -> Doc -> TVar
- Cryptol.TypeCheck.AST: TVar :: TVar -> Type
- Cryptol.TypeCheck.AST: TySyn :: Name -> [TParam] -> [Prop] -> Type -> TySyn
- Cryptol.TypeCheck.AST: UserTC :: Name -> Kind -> UserTC
- Cryptol.TypeCheck.AST: [ntConstraints] :: Newtype -> [Prop]
- Cryptol.TypeCheck.AST: [ntFields] :: Newtype -> [(Ident, Type)]
- Cryptol.TypeCheck.AST: [ntName] :: Newtype -> Name
- Cryptol.TypeCheck.AST: [ntParams] :: Newtype -> [TParam]
- Cryptol.TypeCheck.AST: [sProps] :: Schema -> [Prop]
- Cryptol.TypeCheck.AST: [sType] :: Schema -> Type
- Cryptol.TypeCheck.AST: [sVars] :: Schema -> [TParam]
- Cryptol.TypeCheck.AST: [tpKind] :: TParam -> Kind
- Cryptol.TypeCheck.AST: [tpName] :: TParam -> Maybe Name
- Cryptol.TypeCheck.AST: [tpUnique] :: TParam -> !Int
- Cryptol.TypeCheck.AST: [tsConstraints] :: TySyn -> [Prop]
- Cryptol.TypeCheck.AST: [tsDef] :: TySyn -> Type
- Cryptol.TypeCheck.AST: [tsName] :: TySyn -> Name
- Cryptol.TypeCheck.AST: [tsParams] :: TySyn -> [TParam]
- Cryptol.TypeCheck.AST: addTNames :: [TParam] -> NameMap -> NameMap
- Cryptol.TypeCheck.AST: class HasKind t
- Cryptol.TypeCheck.AST: data Kind
- Cryptol.TypeCheck.AST: data Newtype
- Cryptol.TypeCheck.AST: data PC
- Cryptol.TypeCheck.AST: data Schema
- Cryptol.TypeCheck.AST: data TC
- Cryptol.TypeCheck.AST: data TCon
- Cryptol.TypeCheck.AST: data TParam
- Cryptol.TypeCheck.AST: data TVar
- Cryptol.TypeCheck.AST: data TySyn
- Cryptol.TypeCheck.AST: data Type
- Cryptol.TypeCheck.AST: data UserTC
- Cryptol.TypeCheck.AST: infix 4 >==
- Cryptol.TypeCheck.AST: infixl 6 .+.
- Cryptol.TypeCheck.AST: infixl 7 .*.
- Cryptol.TypeCheck.AST: infixr 5 `tFun`
- Cryptol.TypeCheck.AST: instance Control.DeepSeq.NFData Cryptol.TypeCheck.AST.Kind
- Cryptol.TypeCheck.AST: instance Control.DeepSeq.NFData Cryptol.TypeCheck.AST.Newtype
- Cryptol.TypeCheck.AST: instance Control.DeepSeq.NFData Cryptol.TypeCheck.AST.PC
- Cryptol.TypeCheck.AST: instance Control.DeepSeq.NFData Cryptol.TypeCheck.AST.Schema
- Cryptol.TypeCheck.AST: instance Control.DeepSeq.NFData Cryptol.TypeCheck.AST.TC
- Cryptol.TypeCheck.AST: instance Control.DeepSeq.NFData Cryptol.TypeCheck.AST.TCon
- Cryptol.TypeCheck.AST: instance Control.DeepSeq.NFData Cryptol.TypeCheck.AST.TParam
- Cryptol.TypeCheck.AST: instance Control.DeepSeq.NFData Cryptol.TypeCheck.AST.TVar
- Cryptol.TypeCheck.AST: instance Control.DeepSeq.NFData Cryptol.TypeCheck.AST.TySyn
- Cryptol.TypeCheck.AST: instance Control.DeepSeq.NFData Cryptol.TypeCheck.AST.Type
- Cryptol.TypeCheck.AST: instance Control.DeepSeq.NFData Cryptol.TypeCheck.AST.UserTC
- Cryptol.TypeCheck.AST: instance Cryptol.TypeCheck.AST.HasKind Cryptol.Prims.Syntax.TFun
- Cryptol.TypeCheck.AST: instance Cryptol.TypeCheck.AST.HasKind Cryptol.TypeCheck.AST.Newtype
- Cryptol.TypeCheck.AST: instance Cryptol.TypeCheck.AST.HasKind Cryptol.TypeCheck.AST.PC
- Cryptol.TypeCheck.AST: instance Cryptol.TypeCheck.AST.HasKind Cryptol.TypeCheck.AST.TC
- Cryptol.TypeCheck.AST: instance Cryptol.TypeCheck.AST.HasKind Cryptol.TypeCheck.AST.TCon
- Cryptol.TypeCheck.AST: instance Cryptol.TypeCheck.AST.HasKind Cryptol.TypeCheck.AST.TParam
- Cryptol.TypeCheck.AST: instance Cryptol.TypeCheck.AST.HasKind Cryptol.TypeCheck.AST.TVar
- Cryptol.TypeCheck.AST: instance Cryptol.TypeCheck.AST.HasKind Cryptol.TypeCheck.AST.TySyn
- Cryptol.TypeCheck.AST: instance Cryptol.TypeCheck.AST.HasKind Cryptol.TypeCheck.AST.Type
- Cryptol.TypeCheck.AST: instance Cryptol.TypeCheck.AST.HasKind Cryptol.TypeCheck.AST.UserTC
- Cryptol.TypeCheck.AST: instance Cryptol.Utils.PP.PP (Cryptol.TypeCheck.PP.WithNames Cryptol.TypeCheck.AST.Schema)
- Cryptol.TypeCheck.AST: instance Cryptol.Utils.PP.PP (Cryptol.TypeCheck.PP.WithNames Cryptol.TypeCheck.AST.TParam)
- Cryptol.TypeCheck.AST: instance Cryptol.Utils.PP.PP (Cryptol.TypeCheck.PP.WithNames Cryptol.TypeCheck.AST.TVar)
- Cryptol.TypeCheck.AST: instance Cryptol.Utils.PP.PP (Cryptol.TypeCheck.PP.WithNames Cryptol.TypeCheck.AST.TySyn)
- Cryptol.TypeCheck.AST: instance Cryptol.Utils.PP.PP (Cryptol.TypeCheck.PP.WithNames Cryptol.TypeCheck.AST.Type)
- Cryptol.TypeCheck.AST: instance Cryptol.Utils.PP.PP Cryptol.TypeCheck.AST.Kind
- Cryptol.TypeCheck.AST: instance Cryptol.Utils.PP.PP Cryptol.TypeCheck.AST.PC
- Cryptol.TypeCheck.AST: instance Cryptol.Utils.PP.PP Cryptol.TypeCheck.AST.Schema
- Cryptol.TypeCheck.AST: instance Cryptol.Utils.PP.PP Cryptol.TypeCheck.AST.TC
- Cryptol.TypeCheck.AST: instance Cryptol.Utils.PP.PP Cryptol.TypeCheck.AST.TCon
- Cryptol.TypeCheck.AST: instance Cryptol.Utils.PP.PP Cryptol.TypeCheck.AST.TParam
- Cryptol.TypeCheck.AST: instance Cryptol.Utils.PP.PP Cryptol.TypeCheck.AST.TVar
- Cryptol.TypeCheck.AST: instance Cryptol.Utils.PP.PP Cryptol.TypeCheck.AST.TySyn
- Cryptol.TypeCheck.AST: instance Cryptol.Utils.PP.PP Cryptol.TypeCheck.AST.Type
- Cryptol.TypeCheck.AST: instance Cryptol.Utils.PP.PP Cryptol.TypeCheck.AST.UserTC
- Cryptol.TypeCheck.AST: instance GHC.Classes.Eq Cryptol.TypeCheck.AST.Kind
- Cryptol.TypeCheck.AST: instance GHC.Classes.Eq Cryptol.TypeCheck.AST.PC
- Cryptol.TypeCheck.AST: instance GHC.Classes.Eq Cryptol.TypeCheck.AST.Schema
- Cryptol.TypeCheck.AST: instance GHC.Classes.Eq Cryptol.TypeCheck.AST.TC
- Cryptol.TypeCheck.AST: instance GHC.Classes.Eq Cryptol.TypeCheck.AST.TCon
- Cryptol.TypeCheck.AST: instance GHC.Classes.Eq Cryptol.TypeCheck.AST.TParam
- Cryptol.TypeCheck.AST: instance GHC.Classes.Eq Cryptol.TypeCheck.AST.TVar
- Cryptol.TypeCheck.AST: instance GHC.Classes.Eq Cryptol.TypeCheck.AST.TySyn
- Cryptol.TypeCheck.AST: instance GHC.Classes.Eq Cryptol.TypeCheck.AST.Type
- Cryptol.TypeCheck.AST: instance GHC.Classes.Eq Cryptol.TypeCheck.AST.UserTC
- Cryptol.TypeCheck.AST: instance GHC.Classes.Ord Cryptol.TypeCheck.AST.PC
- Cryptol.TypeCheck.AST: instance GHC.Classes.Ord Cryptol.TypeCheck.AST.TC
- Cryptol.TypeCheck.AST: instance GHC.Classes.Ord Cryptol.TypeCheck.AST.TCon
- Cryptol.TypeCheck.AST: instance GHC.Classes.Ord Cryptol.TypeCheck.AST.TParam
- Cryptol.TypeCheck.AST: instance GHC.Classes.Ord Cryptol.TypeCheck.AST.TVar
- Cryptol.TypeCheck.AST: instance GHC.Classes.Ord Cryptol.TypeCheck.AST.Type
- Cryptol.TypeCheck.AST: instance GHC.Classes.Ord Cryptol.TypeCheck.AST.UserTC
- Cryptol.TypeCheck.AST: instance GHC.Generics.Generic Cryptol.TypeCheck.AST.Kind
- Cryptol.TypeCheck.AST: instance GHC.Generics.Generic Cryptol.TypeCheck.AST.Newtype
- Cryptol.TypeCheck.AST: instance GHC.Generics.Generic Cryptol.TypeCheck.AST.PC
- Cryptol.TypeCheck.AST: instance GHC.Generics.Generic Cryptol.TypeCheck.AST.Schema
- Cryptol.TypeCheck.AST: instance GHC.Generics.Generic Cryptol.TypeCheck.AST.TC
- Cryptol.TypeCheck.AST: instance GHC.Generics.Generic Cryptol.TypeCheck.AST.TCon
- Cryptol.TypeCheck.AST: instance GHC.Generics.Generic Cryptol.TypeCheck.AST.TParam
- Cryptol.TypeCheck.AST: instance GHC.Generics.Generic Cryptol.TypeCheck.AST.TVar
- Cryptol.TypeCheck.AST: instance GHC.Generics.Generic Cryptol.TypeCheck.AST.TySyn
- Cryptol.TypeCheck.AST: instance GHC.Generics.Generic Cryptol.TypeCheck.AST.Type
- Cryptol.TypeCheck.AST: instance GHC.Generics.Generic Cryptol.TypeCheck.AST.UserTC
- Cryptol.TypeCheck.AST: instance GHC.Show.Show Cryptol.TypeCheck.AST.Kind
- Cryptol.TypeCheck.AST: instance GHC.Show.Show Cryptol.TypeCheck.AST.Newtype
- Cryptol.TypeCheck.AST: instance GHC.Show.Show Cryptol.TypeCheck.AST.PC
- Cryptol.TypeCheck.AST: instance GHC.Show.Show Cryptol.TypeCheck.AST.Schema
- Cryptol.TypeCheck.AST: instance GHC.Show.Show Cryptol.TypeCheck.AST.TC
- Cryptol.TypeCheck.AST: instance GHC.Show.Show Cryptol.TypeCheck.AST.TCon
- Cryptol.TypeCheck.AST: instance GHC.Show.Show Cryptol.TypeCheck.AST.TParam
- Cryptol.TypeCheck.AST: instance GHC.Show.Show Cryptol.TypeCheck.AST.TVar
- Cryptol.TypeCheck.AST: instance GHC.Show.Show Cryptol.TypeCheck.AST.TySyn
- Cryptol.TypeCheck.AST: instance GHC.Show.Show Cryptol.TypeCheck.AST.Type
- Cryptol.TypeCheck.AST: instance GHC.Show.Show Cryptol.TypeCheck.AST.UserTC
- Cryptol.TypeCheck.AST: isBoundTV :: TVar -> Bool
- Cryptol.TypeCheck.AST: isFreeTV :: TVar -> Bool
- Cryptol.TypeCheck.AST: kindOf :: HasKind t => t -> Kind
- Cryptol.TypeCheck.AST: newtypeConType :: Newtype -> Schema
- Cryptol.TypeCheck.AST: newtypeTyCon :: Newtype -> TCon
- Cryptol.TypeCheck.AST: pArith :: Type -> Prop
- Cryptol.TypeCheck.AST: pCmp :: Type -> Prop
- Cryptol.TypeCheck.AST: pFin :: Type -> Prop
- Cryptol.TypeCheck.AST: pHas :: Selector -> Type -> Type -> Prop
- Cryptol.TypeCheck.AST: pIsArith :: Prop -> Maybe Type
- Cryptol.TypeCheck.AST: pIsCmp :: Prop -> Maybe Type
- Cryptol.TypeCheck.AST: pIsEq :: Prop -> Maybe (Type, Type)
- Cryptol.TypeCheck.AST: pIsFin :: Prop -> Maybe Type
- Cryptol.TypeCheck.AST: pIsGeq :: Prop -> Maybe (Type, Type)
- Cryptol.TypeCheck.AST: pIsNumeric :: Prop -> Bool
- Cryptol.TypeCheck.AST: ppNewtypeShort :: Newtype -> Doc
- Cryptol.TypeCheck.AST: quickApply :: Kind -> [a] -> Kind
- Cryptol.TypeCheck.AST: tBit :: Type
- Cryptol.TypeCheck.AST: tChar :: Type
- Cryptol.TypeCheck.AST: tDiv :: Type -> Type -> Type
- Cryptol.TypeCheck.AST: tFun :: Type -> Type -> Type
- Cryptol.TypeCheck.AST: tInf :: Type
- Cryptol.TypeCheck.AST: tIsBinFun :: TFun -> Type -> Maybe (Type, Type)
- Cryptol.TypeCheck.AST: tIsBit :: Type -> Bool
- Cryptol.TypeCheck.AST: tIsFun :: Type -> Maybe (Type, Type)
- Cryptol.TypeCheck.AST: tIsInf :: Type -> Bool
- Cryptol.TypeCheck.AST: tIsNat' :: Type -> Maybe Nat'
- Cryptol.TypeCheck.AST: tIsNum :: Type -> Maybe Integer
- Cryptol.TypeCheck.AST: tIsSeq :: Type -> Maybe (Type, Type)
- Cryptol.TypeCheck.AST: tIsTuple :: Type -> Maybe [Type]
- Cryptol.TypeCheck.AST: tIsVar :: Type -> Maybe TVar
- Cryptol.TypeCheck.AST: tLenFromThen :: Type -> Type -> Type -> Type
- Cryptol.TypeCheck.AST: tLenFromThenTo :: Type -> Type -> Type -> Type
- Cryptol.TypeCheck.AST: tMax :: Type -> Type -> Type
- Cryptol.TypeCheck.AST: tMin :: Type -> Type -> Type
- Cryptol.TypeCheck.AST: tMod :: Type -> Type -> Type
- Cryptol.TypeCheck.AST: tNat' :: Nat' -> Type
- Cryptol.TypeCheck.AST: tNoUser :: Type -> Type
- Cryptol.TypeCheck.AST: tNum :: Integral a => a -> Type
- Cryptol.TypeCheck.AST: tOne :: Type
- Cryptol.TypeCheck.AST: tRec :: [(Ident, Type)] -> Type
- Cryptol.TypeCheck.AST: tSeq :: Type -> Type -> Type
- Cryptol.TypeCheck.AST: tSplitFun :: TFun -> Type -> [Type]
- Cryptol.TypeCheck.AST: tString :: Int -> Type
- Cryptol.TypeCheck.AST: tTuple :: [Type] -> Type
- Cryptol.TypeCheck.AST: tTwo :: Type
- Cryptol.TypeCheck.AST: tWidth :: Type -> Type
- Cryptol.TypeCheck.AST: tWord :: Type -> Type
- Cryptol.TypeCheck.AST: tZero :: Type
- Cryptol.TypeCheck.AST: tpVar :: TParam -> TVar
- Cryptol.TypeCheck.AST: type Prop = Type
- Cryptol.TypeCheck.AST: type SType = Type
- Cryptol.TypeCheck.Infer: simpBind :: Decl -> Decl
- Cryptol.TypeCheck.InferTypes: Solved :: (Maybe Subst) -> [Goal] -> Solved
- Cryptol.TypeCheck.InferTypes: Unsolvable :: Solved
- Cryptol.TypeCheck.InferTypes: Unsolved :: Solved
- Cryptol.TypeCheck.InferTypes: UnsolvedGoal :: Bool -> Goal -> Error
- Cryptol.TypeCheck.InferTypes: data Solved
- Cryptol.TypeCheck.InferTypes: instance Cryptol.TypeCheck.Subst.FVS Cryptol.TypeCheck.InferTypes.DelayedCt
- Cryptol.TypeCheck.InferTypes: instance Cryptol.TypeCheck.Subst.FVS Cryptol.TypeCheck.InferTypes.Error
- Cryptol.TypeCheck.InferTypes: instance Cryptol.TypeCheck.Subst.FVS Cryptol.TypeCheck.InferTypes.Goal
- Cryptol.TypeCheck.InferTypes: instance Cryptol.TypeCheck.Subst.FVS Cryptol.TypeCheck.InferTypes.Warning
- Cryptol.TypeCheck.InferTypes: instance Cryptol.Utils.PP.PP Cryptol.TypeCheck.InferTypes.Solved
- Cryptol.TypeCheck.InferTypes: instance GHC.Show.Show Cryptol.TypeCheck.InferTypes.Solved
- Cryptol.TypeCheck.Sanity: instance Cryptol.TypeCheck.Sanity.Same Cryptol.TypeCheck.AST.Schema
- Cryptol.TypeCheck.Sanity: instance Cryptol.TypeCheck.Sanity.Same Cryptol.TypeCheck.AST.TParam
- Cryptol.TypeCheck.Sanity: instance Cryptol.TypeCheck.Sanity.Same Cryptol.TypeCheck.AST.Type
- Cryptol.TypeCheck.Solve: simpType :: Type -> Type
- Cryptol.TypeCheck.Solve: simpTypeMaybe :: Type -> Maybe Type
- Cryptol.TypeCheck.Solver.CrySAT: instance Cryptol.TypeCheck.Solver.CrySAT.DebugLog Cryptol.TypeCheck.AST.Type
- Cryptol.TypeCheck.Solver.CrySAT: instance Cryptol.TypeCheck.Solver.CrySAT.HasProp Cryptol.TypeCheck.AST.Prop
- Cryptol.TypeCheck.Solver.InfNat: nEq :: Maybe Nat' -> Maybe Nat' -> Bool
- Cryptol.TypeCheck.Solver.InfNat: nFin :: Maybe Nat' -> Bool
- Cryptol.TypeCheck.Solver.InfNat: nGt :: Maybe Nat' -> Maybe Nat' -> Bool
- Cryptol.TypeCheck.Solver.Numeric.AST: instance (GHC.Classes.Eq p, GHC.Classes.Eq a) => GHC.Classes.Eq (Cryptol.TypeCheck.Solver.Numeric.AST.IfExpr' p a)
- Cryptol.TypeCheck.Solver.Numeric.Simplify1: instance (GHC.Classes.Eq a, Cryptol.TypeCheck.Solver.Numeric.AST.HasVars a) => Cryptol.TypeCheck.Solver.Numeric.AST.HasVars (Cryptol.TypeCheck.Solver.Numeric.Simplify1.I a)
- Cryptol.TypeCheck.Solver.Numeric.Simplify1: instance GHC.Classes.Eq Cryptol.TypeCheck.Solver.Numeric.Simplify1.Atom
- Cryptol.TypeCheck.Solver.Numeric.Simplify1: ppProp' :: I Bool -> Doc
- Cryptol.TypeCheck.Solver.Numeric.Simplify1: propToProp' :: Prop -> I Bool
- Cryptol.TypeCheck.Solver.Simplify: tryRewritePropAsSubst :: Map TVar Interval -> Prop -> Maybe (TVar, Type)
- Cryptol.TypeCheck.Subst: S :: !(Map TVar Type) -> !Bool -> Subst
- Cryptol.TypeCheck.Subst: [suDefaulting] :: Subst -> !Bool
- Cryptol.TypeCheck.Subst: [suMap] :: Subst -> !(Map TVar Type)
- Cryptol.TypeCheck.Subst: defaultFreeVar :: TVar -> Type
- Cryptol.TypeCheck.Subst: instance (Cryptol.TypeCheck.Subst.FVS a, Cryptol.TypeCheck.Subst.FVS b) => Cryptol.TypeCheck.Subst.FVS (a, b)
- Cryptol.TypeCheck.Subst: instance Cryptol.TypeCheck.Subst.FVS Cryptol.TypeCheck.AST.Schema
- Cryptol.TypeCheck.Subst: instance Cryptol.TypeCheck.Subst.FVS Cryptol.TypeCheck.AST.Type
- Cryptol.TypeCheck.Subst: instance Cryptol.TypeCheck.Subst.FVS a => Cryptol.TypeCheck.Subst.FVS [a]
- Cryptol.TypeCheck.Subst: instance Cryptol.TypeCheck.Subst.TVars Cryptol.TypeCheck.AST.Schema
- Cryptol.TypeCheck.Subst: instance Cryptol.TypeCheck.Subst.TVars Cryptol.TypeCheck.AST.Type
- Cryptol.TypeCheck.TypeMap: instance Cryptol.TypeCheck.TypeMap.TrieMap Cryptol.TypeCheck.TypeMap.TypeMap Cryptol.TypeCheck.AST.Type
+ Cryptol.Eval: LoopError :: String -> EvalError
+ Cryptol.Eval: data Eval a
+ Cryptol.Eval: forceValue :: GenValue b w -> Eval ()
+ Cryptol.Eval: instance GHC.Base.Monoid (Cryptol.Eval.ListEnv b w)
+ Cryptol.Eval: runEval :: Eval a -> IO a
+ Cryptol.Eval: type EvalEnv = GenEvalEnv Bool BV
+ Cryptol.Eval.Env: bindVarDirect :: Name -> GenValue b w -> GenEvalEnv b w -> Eval (GenEvalEnv b w)
+ Cryptol.Eval.Env: data GenEvalEnv b w
+ Cryptol.Eval.Env: instance (Control.DeepSeq.NFData b, Control.DeepSeq.NFData w) => Control.DeepSeq.NFData (Cryptol.Eval.Env.GenEvalEnv b w)
+ Cryptol.Eval.Env: instance GHC.Base.Monoid (Cryptol.Eval.Env.GenEvalEnv b w)
+ Cryptol.Eval.Env: instance GHC.Generics.Generic (Cryptol.Eval.Env.GenEvalEnv b w)
+ Cryptol.Eval.Env: ppEnv :: BitWord b w => PPOpts -> GenEvalEnv b w -> Eval Doc
+ Cryptol.Eval.Monad: DivideByZero :: EvalError
+ Cryptol.Eval.Monad: InvalidIndex :: Integer -> EvalError
+ Cryptol.Eval.Monad: LoopError :: String -> EvalError
+ Cryptol.Eval.Monad: Ready :: !a -> Eval a
+ Cryptol.Eval.Monad: Thunk :: !(IO a) -> Eval a
+ Cryptol.Eval.Monad: TypeCannotBeDemoted :: Type -> EvalError
+ Cryptol.Eval.Monad: UserError :: String -> EvalError
+ Cryptol.Eval.Monad: WordTooWide :: Integer -> EvalError
+ Cryptol.Eval.Monad: blackhole :: String -> Eval (Eval a, Eval a -> Eval ())
+ Cryptol.Eval.Monad: cryLoopError :: String -> Eval a
+ Cryptol.Eval.Monad: cryUserError :: String -> Eval a
+ Cryptol.Eval.Monad: data Eval a
+ Cryptol.Eval.Monad: data EvalError
+ Cryptol.Eval.Monad: delay :: Maybe String -> Eval a -> Eval (Eval a)
+ Cryptol.Eval.Monad: delayFill :: Eval a -> Eval a -> Eval (Eval a)
+ Cryptol.Eval.Monad: divideByZero :: Eval a
+ Cryptol.Eval.Monad: evalPanic :: String -> [String] -> a
+ Cryptol.Eval.Monad: instance Control.DeepSeq.NFData a => Control.DeepSeq.NFData (Cryptol.Eval.Monad.Eval a)
+ Cryptol.Eval.Monad: instance Control.Monad.Fix.MonadFix Cryptol.Eval.Monad.Eval
+ Cryptol.Eval.Monad: instance Control.Monad.IO.Class.MonadIO Cryptol.Eval.Monad.Eval
+ Cryptol.Eval.Monad: instance Cryptol.Utils.PP.PP Cryptol.Eval.Monad.EvalError
+ Cryptol.Eval.Monad: instance GHC.Base.Applicative Cryptol.Eval.Monad.Eval
+ Cryptol.Eval.Monad: instance GHC.Base.Functor Cryptol.Eval.Monad.Eval
+ Cryptol.Eval.Monad: instance GHC.Base.Monad Cryptol.Eval.Monad.Eval
+ Cryptol.Eval.Monad: instance GHC.Exception.Exception Cryptol.Eval.Monad.EvalError
+ Cryptol.Eval.Monad: instance GHC.Show.Show Cryptol.Eval.Monad.EvalError
+ Cryptol.Eval.Monad: invalidIndex :: Integer -> Eval a
+ Cryptol.Eval.Monad: io :: IO a -> Eval a
+ Cryptol.Eval.Monad: ready :: a -> Eval a
+ Cryptol.Eval.Monad: runEval :: Eval a -> IO a
+ Cryptol.Eval.Monad: typeCannotBeDemoted :: Type -> a
+ Cryptol.Eval.Monad: wordTooWide :: Integer -> a
+ Cryptol.Eval.Reference: VBit :: (Either EvalError Bool) -> Value
+ Cryptol.Eval.Reference: VFun :: (Value -> Value) -> Value
+ Cryptol.Eval.Reference: VList :: [Value] -> Value
+ Cryptol.Eval.Reference: VNumPoly :: (Nat' -> Value) -> Value
+ Cryptol.Eval.Reference: VPoly :: (TValue -> Value) -> Value
+ Cryptol.Eval.Reference: VRecord :: [(Ident, Value)] -> Value
+ Cryptol.Eval.Reference: VTuple :: [Value] -> Value
+ Cryptol.Eval.Reference: data Value
+ Cryptol.Eval.Reference: evaluate :: Expr -> ModuleCmd Value
+ Cryptol.Eval.Reference: instance GHC.Base.Monoid Cryptol.Eval.Reference.Env
+ Cryptol.Eval.Reference: ppValue :: Value -> Doc
+ Cryptol.Eval.Type: TVBit :: TValue
+ Cryptol.Eval.Type: TVFun :: TValue -> TValue -> TValue
+ Cryptol.Eval.Type: TVRec :: [(Ident, TValue)] -> TValue
+ Cryptol.Eval.Type: TVSeq :: Integer -> TValue -> TValue
+ Cryptol.Eval.Type: TVStream :: TValue -> TValue
+ Cryptol.Eval.Type: TVTuple :: [TValue] -> TValue
+ Cryptol.Eval.Type: data TValue
+ Cryptol.Eval.Type: finNat' :: Nat' -> Integer
+ Cryptol.Eval.Type: instance Control.DeepSeq.NFData Cryptol.Eval.Type.TValue
+ Cryptol.Eval.Type: instance GHC.Generics.Generic Cryptol.Eval.Type.TValue
+ Cryptol.Eval.Type: instance GHC.Show.Show Cryptol.Eval.Type.TValue
+ Cryptol.Eval.Type: isTBit :: TValue -> Bool
+ Cryptol.Eval.Type: tValTy :: TValue -> Type
+ Cryptol.Eval.Type: tvSeq :: Nat' -> TValue -> TValue
+ Cryptol.Eval.Type: type TypeEnv = Map TVar (Either Nat' TValue)
+ Cryptol.Eval.Value: BitsVal :: !(Seq (Eval b)) -> WordValue b w
+ Cryptol.Eval.Value: IndexSeqMap :: !(Integer -> Eval (GenValue b w)) -> SeqMap b w
+ Cryptol.Eval.Value: UpdateSeqMap :: !(Map Integer (Eval (GenValue b w))) -> !(Integer -> Eval (GenValue b w)) -> SeqMap b w
+ Cryptol.Eval.Value: WordVal :: !w -> WordValue b w
+ Cryptol.Eval.Value: asBitsVal :: BitWord b w => WordValue b w -> Seq (Eval b)
+ Cryptol.Eval.Value: asWordVal :: BitWord b w => WordValue b w -> Eval w
+ Cryptol.Eval.Value: atFst :: Functor f => (a -> f b) -> (a, c) -> f (b, c)
+ Cryptol.Eval.Value: atSnd :: Functor f => (a -> f b) -> (c, a) -> f (c, b)
+ Cryptol.Eval.Value: binBV :: (Integer -> Integer -> Integer) -> BV -> BV -> BV
+ Cryptol.Eval.Value: bitLit :: BitWord b w => Bool -> b
+ Cryptol.Eval.Value: bitsSeq :: BitWord b w => WordValue b w -> Integer -> Eval b
+ Cryptol.Eval.Value: bvVal :: BV -> Integer
+ Cryptol.Eval.Value: class BitWord b w => EvalPrims b w
+ Cryptol.Eval.Value: data SeqMap b w
+ Cryptol.Eval.Value: data WordValue b w
+ Cryptol.Eval.Value: enumerateSeqMap :: (Integral n) => n -> SeqMap b w -> [Eval (GenValue b w)]
+ Cryptol.Eval.Value: evalPrim :: EvalPrims b w => Decl -> GenValue b w
+ Cryptol.Eval.Value: extractWord :: BitWord b w => Integer -> Integer -> w -> w
+ Cryptol.Eval.Value: finiteSeqMap :: [Eval (GenValue b w)] -> SeqMap b w
+ Cryptol.Eval.Value: forceValue :: GenValue b w -> Eval ()
+ Cryptol.Eval.Value: forceWordValue :: WordValue b w -> Eval ()
+ Cryptol.Eval.Value: fromWordVal :: String -> GenValue b w -> Eval (WordValue b w)
+ Cryptol.Eval.Value: indexWordValue :: BitWord b w => WordValue b w -> Integer -> Eval b
+ Cryptol.Eval.Value: infiniteSeqMap :: [Eval (GenValue b w)] -> Eval (SeqMap b w)
+ Cryptol.Eval.Value: instance (Control.DeepSeq.NFData b, Control.DeepSeq.NFData w) => Control.DeepSeq.NFData (Cryptol.Eval.Value.WordValue b w)
+ Cryptol.Eval.Value: instance (Control.DeepSeq.NFData w, Control.DeepSeq.NFData b) => Control.DeepSeq.NFData (Cryptol.Eval.Value.GenValue b w)
+ Cryptol.Eval.Value: instance (GHC.Show.Show b, GHC.Show.Show w) => GHC.Show.Show (Cryptol.Eval.Value.GenValue b w)
+ Cryptol.Eval.Value: instance Control.DeepSeq.NFData (Cryptol.Eval.Value.SeqMap b w)
+ Cryptol.Eval.Value: instance GHC.Generics.Generic (Cryptol.Eval.Value.WordValue b w)
+ Cryptol.Eval.Value: instance GHC.Show.Show Cryptol.Eval.Value.BV
+ Cryptol.Eval.Value: iteValue :: EvalPrims b w => b -> Eval (GenValue b w) -> Eval (GenValue b w) -> Eval (GenValue b w)
+ Cryptol.Eval.Value: joinWord :: BitWord b w => w -> w -> w
+ Cryptol.Eval.Value: lookupSeqMap :: SeqMap b w -> Integer -> Eval (GenValue b w)
+ Cryptol.Eval.Value: mapSeqMap :: (GenValue b w -> Eval (GenValue b w)) -> SeqMap b w -> Eval (SeqMap b w)
+ Cryptol.Eval.Value: memoMap :: SeqMap b w -> Eval (SeqMap b w)
+ Cryptol.Eval.Value: mkSeq :: Nat' -> TValue -> SeqMap b w -> GenValue b w
+ Cryptol.Eval.Value: ppBV :: PPOpts -> BV -> Doc
+ Cryptol.Eval.Value: ppBit :: BitWord b w => b -> Doc
+ Cryptol.Eval.Value: reverseSeqMap :: Integer -> SeqMap b w -> SeqMap b w
+ Cryptol.Eval.Value: splitSeqMap :: Integer -> SeqMap b w -> (SeqMap b w, SeqMap b w)
+ Cryptol.Eval.Value: splitWord :: BitWord b w => Integer -> Integer -> w -> (w, w)
+ Cryptol.Eval.Value: streamSeqMap :: SeqMap b w -> [Eval (GenValue b w)]
+ Cryptol.Eval.Value: tryFromBits :: BitWord b w => [Eval (GenValue b w)] -> Maybe w
+ Cryptol.Eval.Value: type SeqValMap = SeqMap Bool BV
+ Cryptol.Eval.Value: unaryBV :: (Integer -> Integer) -> BV -> BV
+ Cryptol.Eval.Value: updateSeqMap :: SeqMap b w -> Integer -> Eval (GenValue b w) -> SeqMap b w
+ Cryptol.Eval.Value: wlam :: BitWord b w => (w -> Eval (GenValue b w)) -> GenValue b w
+ Cryptol.Eval.Value: wordAsChar :: BitWord b w => w -> Maybe Char
+ Cryptol.Eval.Value: wordLen :: BitWord b w => w -> Integer
+ Cryptol.Eval.Value: wordLit :: BitWord b w => Integer -> Integer -> w
+ Cryptol.Eval.Value: wordMinus :: BitWord b w => w -> w -> w
+ Cryptol.Eval.Value: wordMult :: BitWord b w => w -> w -> w
+ Cryptol.Eval.Value: wordPlus :: BitWord b w => w -> w -> w
+ Cryptol.Eval.Value: zipSeqMap :: (GenValue b w -> GenValue b w -> Eval (GenValue b w)) -> SeqMap b w -> SeqMap b w -> Eval (SeqMap b w)
+ Cryptol.ModuleSystem.Env: [lmCanonicalPath] :: LoadedModule -> FilePath
+ Cryptol.ModuleSystem.Monad: instance Control.Monad.IO.Class.MonadIO m => Control.Monad.IO.Class.MonadIO (Cryptol.ModuleSystem.Monad.ModuleT m)
+ Cryptol.ModuleSystem.Renamer: DangerousFixity :: (Located Name) -> (Located Name) -> NameDisp -> RenamerWarning
+ Cryptol.Prims.Eval: errorV :: forall b w. BitWord b w => TValue -> String -> Eval (GenValue b w)
+ Cryptol.Prims.Eval: extractWordVal :: BitWord b w => Integer -> Integer -> WordValue b w -> WordValue b w
+ Cryptol.Prims.Eval: indexBack_bits :: Maybe Integer -> TValue -> SeqValMap -> Seq Bool -> Eval Value
+ Cryptol.Prims.Eval: indexFront_bits :: Maybe Integer -> TValue -> SeqValMap -> Seq Bool -> Eval Value
+ Cryptol.Prims.Eval: infFromThenV :: BitWord b w => GenValue b w
+ Cryptol.Prims.Eval: infFromV :: BitWord b w => GenValue b w
+ Cryptol.Prims.Eval: instance Cryptol.Eval.Value.EvalPrims GHC.Types.Bool Cryptol.Eval.Value.BV
+ Cryptol.Prims.Eval: joinSeq :: BitWord b w => Nat' -> Integer -> TValue -> SeqMap b w -> Eval (GenValue b w)
+ Cryptol.Prims.Eval: joinWordVal :: BitWord b w => WordValue b w -> WordValue b w -> WordValue b w
+ Cryptol.Prims.Eval: joinWords :: forall b w. BitWord b w => Integer -> Integer -> SeqMap b w -> Eval (GenValue b w)
+ Cryptol.Prims.Eval: liftDivArith :: (Integer -> Integer -> Integer) -> BinArith BV
+ Cryptol.Prims.Eval: liftUnaryArith :: (Integer -> Integer) -> UnaryArith BV
+ Cryptol.Prims.Eval: reverseV :: forall b w. BitWord b w => GenValue b w -> Eval (GenValue b w)
+ Cryptol.Prims.Eval: rotateLB :: Integer -> Seq (Eval Bool) -> Integer -> Seq (Eval Bool)
+ Cryptol.Prims.Eval: rotateRB :: Integer -> Seq (Eval Bool) -> Integer -> Seq (Eval Bool)
+ Cryptol.Prims.Eval: shiftLB :: Integer -> Seq (Eval Bool) -> Integer -> Seq (Eval Bool)
+ Cryptol.Prims.Eval: shiftRB :: Integer -> Seq (Eval Bool) -> Integer -> Seq (Eval Bool)
+ Cryptol.Prims.Eval: splitWordVal :: BitWord b w => Integer -> Integer -> WordValue b w -> (WordValue b w, WordValue b w)
+ Cryptol.Prims.Eval: transposeV :: BitWord b w => Nat' -> Nat' -> TValue -> GenValue b w -> Eval (GenValue b w)
+ Cryptol.Prims.Eval: type UnaryArith w = Integer -> w -> Eval w
+ Cryptol.Prims.Eval: updateBack :: Nat' -> TValue -> SeqMap Bool BV -> WordValue Bool BV -> Eval (GenValue Bool BV) -> Eval (SeqMap Bool BV)
+ Cryptol.Prims.Eval: updateBack_bits :: Nat' -> TValue -> Seq (Eval Bool) -> WordValue Bool BV -> Eval (GenValue Bool BV) -> Eval (Seq (Eval Bool))
+ Cryptol.Prims.Eval: updateFront :: Nat' -> TValue -> SeqMap Bool BV -> WordValue Bool BV -> Eval (GenValue Bool BV) -> Eval (SeqMap Bool BV)
+ Cryptol.Prims.Eval: updateFront_bits :: Nat' -> TValue -> Seq (Eval Bool) -> WordValue Bool BV -> Eval (GenValue Bool BV) -> Eval (Seq (Eval Bool))
+ Cryptol.Prims.Eval: updatePrim :: BitWord b w => (Nat' -> TValue -> Seq (Eval b) -> WordValue b w -> Eval (GenValue b w) -> Eval (Seq (Eval b))) -> (Nat' -> TValue -> SeqMap b w -> WordValue b w -> Eval (GenValue b w) -> Eval (SeqMap b w)) -> GenValue b w
+ Cryptol.Prims.Eval: wordValLogicOp :: BitWord b w => (b -> b -> b) -> (w -> w -> w) -> WordValue b w -> WordValue b w -> WordValue b w
+ Cryptol.Prims.Eval: wordValUnaryOp :: BitWord b w => (b -> b) -> (w -> w) -> WordValue b w -> WordValue b w
+ Cryptol.REPL.Command: CommandError :: CommandExitCode
+ Cryptol.REPL.Command: CommandOk :: CommandExitCode
+ Cryptol.REPL.Command: data CommandExitCode
+ Cryptol.REPL.Monad: getUserShowProverStats :: REPL Bool
+ Cryptol.Symbolic: [pcProverStats] :: ProverCommand -> !(IORef ProverStats)
+ Cryptol.Symbolic: type EvalEnv = GenEvalEnv SBool SWord
+ Cryptol.Symbolic: type ProverStats = NominalDiffTime
+ Cryptol.Symbolic.Prims: asBitList :: [Eval SBool] -> Maybe [SBool]
+ Cryptol.Symbolic.Prims: indexBack :: Maybe Integer -> TValue -> SeqMap SBool SWord -> SWord -> Eval Value
+ Cryptol.Symbolic.Prims: indexBack_bits :: Maybe Integer -> TValue -> SeqMap SBool SWord -> Seq SBool -> Eval Value
+ Cryptol.Symbolic.Prims: indexFront :: Maybe Integer -> TValue -> SeqMap SBool SWord -> SWord -> Eval Value
+ Cryptol.Symbolic.Prims: indexFront_bits :: Maybe Integer -> TValue -> SeqMap SBool SWord -> Seq SBool -> Eval Value
+ Cryptol.Symbolic.Prims: instance Cryptol.Eval.Value.EvalPrims Cryptol.Symbolic.Value.SBool Cryptol.Symbolic.Value.SWord
+ Cryptol.Symbolic.Prims: iteWord :: SBool -> Eval (WordValue SBool SWord) -> Eval (WordValue SBool SWord) -> Eval (WordValue SBool SWord)
+ Cryptol.Symbolic.Prims: liftBinArith :: (SWord -> SWord -> SWord) -> BinArith SWord
+ Cryptol.Symbolic.Prims: logicShift :: String -> (SWord -> SWord -> SWord) -> (Nat' -> Integer -> Integer -> Maybe Integer) -> Value
+ Cryptol.Symbolic.Prims: shifter :: Monad m => (SBool -> a -> a -> a) -> (a -> Integer -> m a) -> a -> [SBool] -> m a
+ Cryptol.Symbolic.Prims: updateBackSym :: Nat' -> TValue -> SeqMap SBool SWord -> WordValue SBool SWord -> Eval (GenValue SBool SWord) -> Eval (SeqMap SBool SWord)
+ Cryptol.Symbolic.Prims: updateBackSym_bits :: Nat' -> TValue -> Seq (Eval SBool) -> WordValue SBool SWord -> Eval (GenValue SBool SWord) -> Eval (Seq (Eval SBool))
+ Cryptol.Symbolic.Prims: updateFrontSym :: Nat' -> TValue -> SeqMap SBool SWord -> WordValue SBool SWord -> Eval (GenValue SBool SWord) -> Eval (SeqMap SBool SWord)
+ Cryptol.Symbolic.Prims: updateFrontSym_bits :: Nat' -> TValue -> Seq (Eval SBool) -> WordValue SBool SWord -> Eval (GenValue SBool SWord) -> Eval (Seq (Eval SBool))
+ Cryptol.Symbolic.Value: iteSValue :: SBool -> Value -> Value -> Value
+ Cryptol.Symbolic.Value: mergeBit :: Bool -> SBool -> SBool -> SBool -> SBool
+ Cryptol.Symbolic.Value: mergeBits :: Bool -> SBool -> Seq (Eval SBool) -> Seq (Eval SBool) -> Seq (Eval SBool)
+ Cryptol.Symbolic.Value: mergeSeqMap :: Bool -> SBool -> SeqMap SBool SWord -> SeqMap SBool SWord -> SeqMap SBool SWord
+ Cryptol.Symbolic.Value: mergeWord :: Bool -> SBool -> WordValue SBool SWord -> WordValue SBool SWord -> WordValue SBool SWord
+ Cryptol.Transform.MonoValues: instance Cryptol.TypeCheck.TypeMap.TrieMap Cryptol.Transform.MonoValues.RewMap' (Cryptol.ModuleSystem.Name.Name, [Cryptol.TypeCheck.Type.Type], GHC.Types.Int)
+ Cryptol.TypeCheck: UnsolvedGoals :: Bool -> [Goal] -> Error
+ Cryptol.TypeCheck: [inpSearchPath] :: InferInput -> [FilePath]
+ Cryptol.TypeCheck.AST: TCErrorMessage :: !String -> TCErrorMessage
+ Cryptol.TypeCheck.AST: [tcErrorMessage] :: TCErrorMessage -> !String
+ Cryptol.TypeCheck.AST: data TCErrorMessage
+ Cryptol.TypeCheck.InferTypes: UnsolvedGoals :: Bool -> [Goal] -> Error
+ Cryptol.TypeCheck.InferTypes: instance Cryptol.TypeCheck.Type.FVS Cryptol.TypeCheck.InferTypes.DelayedCt
+ Cryptol.TypeCheck.InferTypes: instance Cryptol.TypeCheck.Type.FVS Cryptol.TypeCheck.InferTypes.Error
+ Cryptol.TypeCheck.InferTypes: instance Cryptol.TypeCheck.Type.FVS Cryptol.TypeCheck.InferTypes.Goal
+ Cryptol.TypeCheck.InferTypes: instance Cryptol.TypeCheck.Type.FVS Cryptol.TypeCheck.InferTypes.Warning
+ Cryptol.TypeCheck.InferTypes: instance GHC.Classes.Eq Cryptol.TypeCheck.InferTypes.Goal
+ Cryptol.TypeCheck.InferTypes: instance GHC.Classes.Ord Cryptol.TypeCheck.InferTypes.Goal
+ Cryptol.TypeCheck.Monad: [iSolveCounter] :: RO -> !(IORef Int)
+ Cryptol.TypeCheck.Monad: [inpSearchPath] :: InferInput -> [FilePath]
+ Cryptol.TypeCheck.Monad: [kCtrs] :: KRW -> [(ConstraintSource, [Prop])]
+ Cryptol.TypeCheck.Monad: bumpCounter :: InferM ()
+ Cryptol.TypeCheck.Monad: simpGoal :: Goal -> InferM [Goal]
+ Cryptol.TypeCheck.Monad: simpGoals :: [Goal] -> InferM [Goal]
+ Cryptol.TypeCheck.Sanity: instance Cryptol.TypeCheck.Sanity.Same Cryptol.TypeCheck.Type.Schema
+ Cryptol.TypeCheck.Sanity: instance Cryptol.TypeCheck.Sanity.Same Cryptol.TypeCheck.Type.TParam
+ Cryptol.TypeCheck.Sanity: instance Cryptol.TypeCheck.Sanity.Same Cryptol.TypeCheck.Type.Type
+ Cryptol.TypeCheck.SimpType: op1 :: (a -> b) -> [a] -> b
+ Cryptol.TypeCheck.SimpType: op2 :: (a -> a -> b) -> [a] -> b
+ Cryptol.TypeCheck.SimpType: op3 :: (a -> a -> a -> b) -> [a] -> b
+ Cryptol.TypeCheck.SimpType: tAdd :: Type -> Type -> Type
+ Cryptol.TypeCheck.SimpType: tDiv :: Type -> Type -> Type
+ Cryptol.TypeCheck.SimpType: tExp :: Type -> Type -> Type
+ Cryptol.TypeCheck.SimpType: tLenFromThen :: Type -> Type -> Type -> Type
+ Cryptol.TypeCheck.SimpType: tLenFromThenTo :: Type -> Type -> Type -> Type
+ Cryptol.TypeCheck.SimpType: tMax :: Type -> Type -> Type
+ Cryptol.TypeCheck.SimpType: tMin :: Type -> Type -> Type
+ Cryptol.TypeCheck.SimpType: tMod :: Type -> Type -> Type
+ Cryptol.TypeCheck.SimpType: tMul :: Type -> Type -> Type
+ Cryptol.TypeCheck.SimpType: tOp :: TFun -> ([Nat'] -> Maybe Nat') -> [Type] -> Maybe Type
+ Cryptol.TypeCheck.SimpType: tRebuild :: Type -> Type
+ Cryptol.TypeCheck.SimpType: tRebuild' :: Bool -> Type -> Type
+ Cryptol.TypeCheck.SimpType: tSub :: Type -> Type -> Type
+ Cryptol.TypeCheck.SimpType: tWidth :: Type -> Type
+ Cryptol.TypeCheck.SimpType: total :: ([Nat'] -> Nat') -> ([Nat'] -> Maybe Nat')
+ Cryptol.TypeCheck.SimpleSolver: simplify :: Ctxt -> Prop -> Prop
+ Cryptol.TypeCheck.SimpleSolver: simplifyStep :: Ctxt -> Prop -> Solved
+ Cryptol.TypeCheck.Solver.Class: solveArithInst :: Type -> Solved
+ Cryptol.TypeCheck.Solver.Class: solveCmpInst :: Type -> Solved
+ Cryptol.TypeCheck.Solver.CrySAT: instance Cryptol.TypeCheck.Solver.CrySAT.DebugLog Cryptol.TypeCheck.Type.Type
+ Cryptol.TypeCheck.Solver.CrySAT: instance Cryptol.TypeCheck.Solver.CrySAT.HasProp Cryptol.TypeCheck.Type.Prop
+ Cryptol.TypeCheck.Solver.CrySAT: loadFile :: Solver -> FilePath -> IO ()
+ Cryptol.TypeCheck.Solver.CrySAT: rawSolver :: Solver -> Solver
+ Cryptol.TypeCheck.Solver.Improve: improveEq :: Bool -> Ctxt -> Prop -> Match (Subst, [Prop])
+ Cryptol.TypeCheck.Solver.Improve: improveProp :: Bool -> Ctxt -> Prop -> Match (Subst, [Prop])
+ Cryptol.TypeCheck.Solver.Improve: improveProps :: Bool -> Ctxt -> [Prop] -> Match (Subst, [Prop])
+ Cryptol.TypeCheck.Solver.Numeric: cryIsEqual :: Ctxt -> Type -> Type -> Solved
+ Cryptol.TypeCheck.Solver.Numeric: cryIsGeq :: Ctxt -> Type -> Type -> Solved
+ Cryptol.TypeCheck.Solver.Numeric: cryIsNotEqual :: Ctxt -> Type -> Type -> Solved
+ Cryptol.TypeCheck.Solver.Numeric.AST: instance (GHC.Classes.Eq a, GHC.Classes.Eq p) => GHC.Classes.Eq (Cryptol.TypeCheck.Solver.Numeric.AST.IfExpr' p a)
+ Cryptol.TypeCheck.Solver.SMT: checkUnsolvable :: Solver -> [Goal] -> IO Bool
+ Cryptol.TypeCheck.Solver.SMT: instance Cryptol.TypeCheck.Solver.SMT.Mk ()
+ Cryptol.TypeCheck.Solver.SMT: instance Cryptol.TypeCheck.Solver.SMT.Mk (Cryptol.TypeCheck.Type.Type, Cryptol.TypeCheck.Type.Type)
+ Cryptol.TypeCheck.Solver.SMT: instance Cryptol.TypeCheck.Solver.SMT.Mk (Cryptol.TypeCheck.Type.Type, Cryptol.TypeCheck.Type.Type, Cryptol.TypeCheck.Type.Type)
+ Cryptol.TypeCheck.Solver.SMT: instance Cryptol.TypeCheck.Solver.SMT.Mk Cryptol.TypeCheck.Type.TCErrorMessage
+ Cryptol.TypeCheck.Solver.SMT: instance Cryptol.TypeCheck.Solver.SMT.Mk Cryptol.TypeCheck.Type.TVar
+ Cryptol.TypeCheck.Solver.SMT: instance Cryptol.TypeCheck.Solver.SMT.Mk Cryptol.TypeCheck.Type.Type
+ Cryptol.TypeCheck.Solver.SMT: instance Cryptol.TypeCheck.Solver.SMT.Mk GHC.Integer.Type.Integer
+ Cryptol.TypeCheck.Solver.SMT: proveImp :: Solver -> [Prop] -> [Goal] -> IO [Goal]
+ Cryptol.TypeCheck.Solver.Types: SolvedIf :: [Prop] -> Solved
+ Cryptol.TypeCheck.Solver.Types: Unsolvable :: TCErrorMessage -> Solved
+ Cryptol.TypeCheck.Solver.Types: Unsolved :: Solved
+ Cryptol.TypeCheck.Solver.Types: data Solved
+ Cryptol.TypeCheck.Solver.Types: elseTry :: Solved -> Solved -> Solved
+ Cryptol.TypeCheck.Solver.Types: guarded :: Bool -> Solved -> Solved
+ Cryptol.TypeCheck.Solver.Types: instance Cryptol.Utils.PP.PP Cryptol.TypeCheck.Solver.Types.Solved
+ Cryptol.TypeCheck.Solver.Types: instance GHC.Show.Show Cryptol.TypeCheck.Solver.Types.Solved
+ Cryptol.TypeCheck.Solver.Types: matchThen :: Maybe a -> (a -> Solved) -> Solved
+ Cryptol.TypeCheck.Solver.Types: solveOpts :: [Solved] -> Solved
+ Cryptol.TypeCheck.Solver.Types: type Ctxt = Map TVar Interval
+ Cryptol.TypeCheck.Subst: applySubstToVar :: Subst -> TVar -> Maybe Type
+ Cryptol.TypeCheck.Subst: instance Cryptol.TypeCheck.Subst.TVars Cryptol.TypeCheck.Type.Schema
+ Cryptol.TypeCheck.Subst: instance Cryptol.TypeCheck.Subst.TVars Cryptol.TypeCheck.Type.Type
+ Cryptol.TypeCheck.Subst: substBinds :: Subst -> Set TVar
+ Cryptol.TypeCheck.Type: (:->) :: Kind -> Kind -> Kind
+ Cryptol.TypeCheck.Type: (=#=) :: Type -> Type -> Prop
+ Cryptol.TypeCheck.Type: (=/=) :: Type -> Type -> Prop
+ Cryptol.TypeCheck.Type: (>==) :: Type -> Type -> Prop
+ Cryptol.TypeCheck.Type: Forall :: [TParam] -> [Prop] -> Type -> Schema
+ Cryptol.TypeCheck.Type: KNum :: Kind
+ Cryptol.TypeCheck.Type: KProp :: Kind
+ Cryptol.TypeCheck.Type: KType :: Kind
+ Cryptol.TypeCheck.Type: Newtype :: Name -> [TParam] -> [Prop] -> [(Ident, Type)] -> Newtype
+ Cryptol.TypeCheck.Type: PAnd :: PC
+ Cryptol.TypeCheck.Type: PArith :: PC
+ Cryptol.TypeCheck.Type: PC :: PC -> TCon
+ Cryptol.TypeCheck.Type: PCmp :: PC
+ Cryptol.TypeCheck.Type: PEqual :: PC
+ Cryptol.TypeCheck.Type: PFin :: PC
+ Cryptol.TypeCheck.Type: PGeq :: PC
+ Cryptol.TypeCheck.Type: PHas :: Selector -> PC
+ Cryptol.TypeCheck.Type: PNeq :: PC
+ Cryptol.TypeCheck.Type: PTrue :: PC
+ Cryptol.TypeCheck.Type: TC :: TC -> TCon
+ Cryptol.TypeCheck.Type: TCAdd :: TFun
+ Cryptol.TypeCheck.Type: TCBit :: TC
+ Cryptol.TypeCheck.Type: TCDiv :: TFun
+ Cryptol.TypeCheck.Type: TCErrorMessage :: !String -> TCErrorMessage
+ Cryptol.TypeCheck.Type: TCExp :: TFun
+ Cryptol.TypeCheck.Type: TCFun :: TC
+ Cryptol.TypeCheck.Type: TCInf :: TC
+ Cryptol.TypeCheck.Type: TCLenFromThen :: TFun
+ Cryptol.TypeCheck.Type: TCLenFromThenTo :: TFun
+ Cryptol.TypeCheck.Type: TCMax :: TFun
+ Cryptol.TypeCheck.Type: TCMin :: TFun
+ Cryptol.TypeCheck.Type: TCMod :: TFun
+ Cryptol.TypeCheck.Type: TCMul :: TFun
+ Cryptol.TypeCheck.Type: TCNewtype :: UserTC -> TC
+ Cryptol.TypeCheck.Type: TCNum :: Integer -> TC
+ Cryptol.TypeCheck.Type: TCSeq :: TC
+ Cryptol.TypeCheck.Type: TCSub :: TFun
+ Cryptol.TypeCheck.Type: TCTuple :: Int -> TC
+ Cryptol.TypeCheck.Type: TCWidth :: TFun
+ Cryptol.TypeCheck.Type: TCon :: !TCon -> ![Type] -> Type
+ Cryptol.TypeCheck.Type: TError :: Kind -> TCErrorMessage -> TCon
+ Cryptol.TypeCheck.Type: TF :: TFun -> TCon
+ Cryptol.TypeCheck.Type: TParam :: !Int -> Kind -> Maybe Name -> TParam
+ Cryptol.TypeCheck.Type: TRec :: ![(Ident, Type)] -> Type
+ Cryptol.TypeCheck.Type: TUser :: !Name -> ![Type] -> !Type -> Type
+ Cryptol.TypeCheck.Type: TVBound :: !Int -> Kind -> TVar
+ Cryptol.TypeCheck.Type: TVFree :: !Int -> Kind -> (Set TVar) -> Doc -> TVar
+ Cryptol.TypeCheck.Type: TVar :: TVar -> Type
+ Cryptol.TypeCheck.Type: TySyn :: Name -> [TParam] -> [Prop] -> Type -> TySyn
+ Cryptol.TypeCheck.Type: UserTC :: Name -> Kind -> UserTC
+ Cryptol.TypeCheck.Type: [ntConstraints] :: Newtype -> [Prop]
+ Cryptol.TypeCheck.Type: [ntFields] :: Newtype -> [(Ident, Type)]
+ Cryptol.TypeCheck.Type: [ntName] :: Newtype -> Name
+ Cryptol.TypeCheck.Type: [ntParams] :: Newtype -> [TParam]
+ Cryptol.TypeCheck.Type: [sProps] :: Schema -> [Prop]
+ Cryptol.TypeCheck.Type: [sType] :: Schema -> Type
+ Cryptol.TypeCheck.Type: [sVars] :: Schema -> [TParam]
+ Cryptol.TypeCheck.Type: [tcErrorMessage] :: TCErrorMessage -> !String
+ Cryptol.TypeCheck.Type: [tpKind] :: TParam -> Kind
+ Cryptol.TypeCheck.Type: [tpName] :: TParam -> Maybe Name
+ Cryptol.TypeCheck.Type: [tpUnique] :: TParam -> !Int
+ Cryptol.TypeCheck.Type: [tsConstraints] :: TySyn -> [Prop]
+ Cryptol.TypeCheck.Type: [tsDef] :: TySyn -> Type
+ Cryptol.TypeCheck.Type: [tsName] :: TySyn -> Name
+ Cryptol.TypeCheck.Type: [tsParams] :: TySyn -> [TParam]
+ Cryptol.TypeCheck.Type: addTNames :: [TParam] -> NameMap -> NameMap
+ Cryptol.TypeCheck.Type: class FVS t
+ Cryptol.TypeCheck.Type: class HasKind t
+ Cryptol.TypeCheck.Type: data Kind
+ Cryptol.TypeCheck.Type: data Newtype
+ Cryptol.TypeCheck.Type: data PC
+ Cryptol.TypeCheck.Type: data Schema
+ Cryptol.TypeCheck.Type: data TC
+ Cryptol.TypeCheck.Type: data TCErrorMessage
+ Cryptol.TypeCheck.Type: data TCon
+ Cryptol.TypeCheck.Type: data TFun
+ Cryptol.TypeCheck.Type: data TParam
+ Cryptol.TypeCheck.Type: data TVar
+ Cryptol.TypeCheck.Type: data TySyn
+ Cryptol.TypeCheck.Type: data Type
+ Cryptol.TypeCheck.Type: data UserTC
+ Cryptol.TypeCheck.Type: fvs :: FVS t => t -> Set TVar
+ Cryptol.TypeCheck.Type: infix 4 >==
+ Cryptol.TypeCheck.Type: infixr 5 `tFun`
+ Cryptol.TypeCheck.Type: instance (Cryptol.TypeCheck.Type.FVS a, Cryptol.TypeCheck.Type.FVS b) => Cryptol.TypeCheck.Type.FVS (a, b)
+ Cryptol.TypeCheck.Type: instance Control.DeepSeq.NFData Cryptol.TypeCheck.Type.Kind
+ Cryptol.TypeCheck.Type: instance Control.DeepSeq.NFData Cryptol.TypeCheck.Type.Newtype
+ Cryptol.TypeCheck.Type: instance Control.DeepSeq.NFData Cryptol.TypeCheck.Type.PC
+ Cryptol.TypeCheck.Type: instance Control.DeepSeq.NFData Cryptol.TypeCheck.Type.Schema
+ Cryptol.TypeCheck.Type: instance Control.DeepSeq.NFData Cryptol.TypeCheck.Type.TC
+ Cryptol.TypeCheck.Type: instance Control.DeepSeq.NFData Cryptol.TypeCheck.Type.TCErrorMessage
+ Cryptol.TypeCheck.Type: instance Control.DeepSeq.NFData Cryptol.TypeCheck.Type.TCon
+ Cryptol.TypeCheck.Type: instance Control.DeepSeq.NFData Cryptol.TypeCheck.Type.TParam
+ Cryptol.TypeCheck.Type: instance Control.DeepSeq.NFData Cryptol.TypeCheck.Type.TVar
+ Cryptol.TypeCheck.Type: instance Control.DeepSeq.NFData Cryptol.TypeCheck.Type.TySyn
+ Cryptol.TypeCheck.Type: instance Control.DeepSeq.NFData Cryptol.TypeCheck.Type.Type
+ Cryptol.TypeCheck.Type: instance Control.DeepSeq.NFData Cryptol.TypeCheck.Type.UserTC
+ Cryptol.TypeCheck.Type: instance Cryptol.TypeCheck.Type.FVS Cryptol.TypeCheck.Type.Schema
+ Cryptol.TypeCheck.Type: instance Cryptol.TypeCheck.Type.FVS Cryptol.TypeCheck.Type.Type
+ Cryptol.TypeCheck.Type: instance Cryptol.TypeCheck.Type.FVS a => Cryptol.TypeCheck.Type.FVS (GHC.Base.Maybe a)
+ Cryptol.TypeCheck.Type: instance Cryptol.TypeCheck.Type.FVS a => Cryptol.TypeCheck.Type.FVS [a]
+ Cryptol.TypeCheck.Type: instance Cryptol.TypeCheck.Type.HasKind Cryptol.Prims.Syntax.TFun
+ Cryptol.TypeCheck.Type: instance Cryptol.TypeCheck.Type.HasKind Cryptol.TypeCheck.Type.Newtype
+ Cryptol.TypeCheck.Type: instance Cryptol.TypeCheck.Type.HasKind Cryptol.TypeCheck.Type.PC
+ Cryptol.TypeCheck.Type: instance Cryptol.TypeCheck.Type.HasKind Cryptol.TypeCheck.Type.TC
+ Cryptol.TypeCheck.Type: instance Cryptol.TypeCheck.Type.HasKind Cryptol.TypeCheck.Type.TCon
+ Cryptol.TypeCheck.Type: instance Cryptol.TypeCheck.Type.HasKind Cryptol.TypeCheck.Type.TParam
+ Cryptol.TypeCheck.Type: instance Cryptol.TypeCheck.Type.HasKind Cryptol.TypeCheck.Type.TVar
+ Cryptol.TypeCheck.Type: instance Cryptol.TypeCheck.Type.HasKind Cryptol.TypeCheck.Type.TySyn
+ Cryptol.TypeCheck.Type: instance Cryptol.TypeCheck.Type.HasKind Cryptol.TypeCheck.Type.Type
+ Cryptol.TypeCheck.Type: instance Cryptol.TypeCheck.Type.HasKind Cryptol.TypeCheck.Type.UserTC
+ Cryptol.TypeCheck.Type: instance Cryptol.Utils.PP.PP (Cryptol.TypeCheck.PP.WithNames Cryptol.TypeCheck.Type.Schema)
+ Cryptol.TypeCheck.Type: instance Cryptol.Utils.PP.PP (Cryptol.TypeCheck.PP.WithNames Cryptol.TypeCheck.Type.TParam)
+ Cryptol.TypeCheck.Type: instance Cryptol.Utils.PP.PP (Cryptol.TypeCheck.PP.WithNames Cryptol.TypeCheck.Type.TVar)
+ Cryptol.TypeCheck.Type: instance Cryptol.Utils.PP.PP (Cryptol.TypeCheck.PP.WithNames Cryptol.TypeCheck.Type.TySyn)
+ Cryptol.TypeCheck.Type: instance Cryptol.Utils.PP.PP (Cryptol.TypeCheck.PP.WithNames Cryptol.TypeCheck.Type.Type)
+ Cryptol.TypeCheck.Type: instance Cryptol.Utils.PP.PP Cryptol.TypeCheck.Type.Kind
+ Cryptol.TypeCheck.Type: instance Cryptol.Utils.PP.PP Cryptol.TypeCheck.Type.PC
+ Cryptol.TypeCheck.Type: instance Cryptol.Utils.PP.PP Cryptol.TypeCheck.Type.Schema
+ Cryptol.TypeCheck.Type: instance Cryptol.Utils.PP.PP Cryptol.TypeCheck.Type.TC
+ Cryptol.TypeCheck.Type: instance Cryptol.Utils.PP.PP Cryptol.TypeCheck.Type.TCErrorMessage
+ Cryptol.TypeCheck.Type: instance Cryptol.Utils.PP.PP Cryptol.TypeCheck.Type.TCon
+ Cryptol.TypeCheck.Type: instance Cryptol.Utils.PP.PP Cryptol.TypeCheck.Type.TParam
+ Cryptol.TypeCheck.Type: instance Cryptol.Utils.PP.PP Cryptol.TypeCheck.Type.TVar
+ Cryptol.TypeCheck.Type: instance Cryptol.Utils.PP.PP Cryptol.TypeCheck.Type.TySyn
+ Cryptol.TypeCheck.Type: instance Cryptol.Utils.PP.PP Cryptol.TypeCheck.Type.Type
+ Cryptol.TypeCheck.Type: instance Cryptol.Utils.PP.PP Cryptol.TypeCheck.Type.UserTC
+ Cryptol.TypeCheck.Type: instance GHC.Classes.Eq Cryptol.TypeCheck.Type.Kind
+ Cryptol.TypeCheck.Type: instance GHC.Classes.Eq Cryptol.TypeCheck.Type.PC
+ Cryptol.TypeCheck.Type: instance GHC.Classes.Eq Cryptol.TypeCheck.Type.Schema
+ Cryptol.TypeCheck.Type: instance GHC.Classes.Eq Cryptol.TypeCheck.Type.TC
+ Cryptol.TypeCheck.Type: instance GHC.Classes.Eq Cryptol.TypeCheck.Type.TCErrorMessage
+ Cryptol.TypeCheck.Type: instance GHC.Classes.Eq Cryptol.TypeCheck.Type.TCon
+ Cryptol.TypeCheck.Type: instance GHC.Classes.Eq Cryptol.TypeCheck.Type.TParam
+ Cryptol.TypeCheck.Type: instance GHC.Classes.Eq Cryptol.TypeCheck.Type.TVar
+ Cryptol.TypeCheck.Type: instance GHC.Classes.Eq Cryptol.TypeCheck.Type.Type
+ Cryptol.TypeCheck.Type: instance GHC.Classes.Eq Cryptol.TypeCheck.Type.UserTC
+ Cryptol.TypeCheck.Type: instance GHC.Classes.Ord Cryptol.TypeCheck.Type.Kind
+ Cryptol.TypeCheck.Type: instance GHC.Classes.Ord Cryptol.TypeCheck.Type.PC
+ Cryptol.TypeCheck.Type: instance GHC.Classes.Ord Cryptol.TypeCheck.Type.TC
+ Cryptol.TypeCheck.Type: instance GHC.Classes.Ord Cryptol.TypeCheck.Type.TCErrorMessage
+ Cryptol.TypeCheck.Type: instance GHC.Classes.Ord Cryptol.TypeCheck.Type.TCon
+ Cryptol.TypeCheck.Type: instance GHC.Classes.Ord Cryptol.TypeCheck.Type.TParam
+ Cryptol.TypeCheck.Type: instance GHC.Classes.Ord Cryptol.TypeCheck.Type.TVar
+ Cryptol.TypeCheck.Type: instance GHC.Classes.Ord Cryptol.TypeCheck.Type.Type
+ Cryptol.TypeCheck.Type: instance GHC.Classes.Ord Cryptol.TypeCheck.Type.UserTC
+ Cryptol.TypeCheck.Type: instance GHC.Generics.Generic Cryptol.TypeCheck.Type.Kind
+ Cryptol.TypeCheck.Type: instance GHC.Generics.Generic Cryptol.TypeCheck.Type.Newtype
+ Cryptol.TypeCheck.Type: instance GHC.Generics.Generic Cryptol.TypeCheck.Type.PC
+ Cryptol.TypeCheck.Type: instance GHC.Generics.Generic Cryptol.TypeCheck.Type.Schema
+ Cryptol.TypeCheck.Type: instance GHC.Generics.Generic Cryptol.TypeCheck.Type.TC
+ Cryptol.TypeCheck.Type: instance GHC.Generics.Generic Cryptol.TypeCheck.Type.TCErrorMessage
+ Cryptol.TypeCheck.Type: instance GHC.Generics.Generic Cryptol.TypeCheck.Type.TCon
+ Cryptol.TypeCheck.Type: instance GHC.Generics.Generic Cryptol.TypeCheck.Type.TParam
+ Cryptol.TypeCheck.Type: instance GHC.Generics.Generic Cryptol.TypeCheck.Type.TVar
+ Cryptol.TypeCheck.Type: instance GHC.Generics.Generic Cryptol.TypeCheck.Type.TySyn
+ Cryptol.TypeCheck.Type: instance GHC.Generics.Generic Cryptol.TypeCheck.Type.Type
+ Cryptol.TypeCheck.Type: instance GHC.Generics.Generic Cryptol.TypeCheck.Type.UserTC
+ Cryptol.TypeCheck.Type: instance GHC.Show.Show Cryptol.TypeCheck.Type.Kind
+ Cryptol.TypeCheck.Type: instance GHC.Show.Show Cryptol.TypeCheck.Type.Newtype
+ Cryptol.TypeCheck.Type: instance GHC.Show.Show Cryptol.TypeCheck.Type.PC
+ Cryptol.TypeCheck.Type: instance GHC.Show.Show Cryptol.TypeCheck.Type.Schema
+ Cryptol.TypeCheck.Type: instance GHC.Show.Show Cryptol.TypeCheck.Type.TC
+ Cryptol.TypeCheck.Type: instance GHC.Show.Show Cryptol.TypeCheck.Type.TCErrorMessage
+ Cryptol.TypeCheck.Type: instance GHC.Show.Show Cryptol.TypeCheck.Type.TCon
+ Cryptol.TypeCheck.Type: instance GHC.Show.Show Cryptol.TypeCheck.Type.TParam
+ Cryptol.TypeCheck.Type: instance GHC.Show.Show Cryptol.TypeCheck.Type.TVar
+ Cryptol.TypeCheck.Type: instance GHC.Show.Show Cryptol.TypeCheck.Type.TySyn
+ Cryptol.TypeCheck.Type: instance GHC.Show.Show Cryptol.TypeCheck.Type.Type
+ Cryptol.TypeCheck.Type: instance GHC.Show.Show Cryptol.TypeCheck.Type.UserTC
+ Cryptol.TypeCheck.Type: isBoundTV :: TVar -> Bool
+ Cryptol.TypeCheck.Type: isFreeTV :: TVar -> Bool
+ Cryptol.TypeCheck.Type: kindOf :: HasKind t => t -> Kind
+ Cryptol.TypeCheck.Type: kindResult :: Kind -> Kind
+ Cryptol.TypeCheck.Type: newtypeConType :: Newtype -> Schema
+ Cryptol.TypeCheck.Type: newtypeTyCon :: Newtype -> TCon
+ Cryptol.TypeCheck.Type: pAnd :: [Prop] -> Prop
+ Cryptol.TypeCheck.Type: pArith :: Type -> Prop
+ Cryptol.TypeCheck.Type: pCmp :: Type -> Prop
+ Cryptol.TypeCheck.Type: pError :: TCErrorMessage -> Prop
+ Cryptol.TypeCheck.Type: pFin :: Type -> Prop
+ Cryptol.TypeCheck.Type: pHas :: Selector -> Type -> Type -> Prop
+ Cryptol.TypeCheck.Type: pIsArith :: Prop -> Maybe Type
+ Cryptol.TypeCheck.Type: pIsCmp :: Prop -> Maybe Type
+ Cryptol.TypeCheck.Type: pIsEq :: Prop -> Maybe (Type, Type)
+ Cryptol.TypeCheck.Type: pIsFin :: Prop -> Maybe Type
+ Cryptol.TypeCheck.Type: pIsGeq :: Prop -> Maybe (Type, Type)
+ Cryptol.TypeCheck.Type: pIsTrue :: Prop -> Bool
+ Cryptol.TypeCheck.Type: pIsWidth :: Prop -> Maybe Type
+ Cryptol.TypeCheck.Type: pSplitAnd :: Prop -> [Prop]
+ Cryptol.TypeCheck.Type: pTrue :: Prop
+ Cryptol.TypeCheck.Type: ppNewtypeShort :: Newtype -> Doc
+ Cryptol.TypeCheck.Type: quickApply :: Kind -> [a] -> Kind
+ Cryptol.TypeCheck.Type: tBadNumber :: TCErrorMessage -> Type
+ Cryptol.TypeCheck.Type: tBit :: Type
+ Cryptol.TypeCheck.Type: tChar :: Type
+ Cryptol.TypeCheck.Type: tDiv :: Type -> Type -> Type
+ Cryptol.TypeCheck.Type: tExp :: Type -> Type -> Type
+ Cryptol.TypeCheck.Type: tFun :: Type -> Type -> Type
+ Cryptol.TypeCheck.Type: tInf :: Type
+ Cryptol.TypeCheck.Type: tIsBinFun :: TFun -> Type -> Maybe (Type, Type)
+ Cryptol.TypeCheck.Type: tIsBit :: Type -> Bool
+ Cryptol.TypeCheck.Type: tIsError :: Type -> Maybe TCErrorMessage
+ Cryptol.TypeCheck.Type: tIsFun :: Type -> Maybe (Type, Type)
+ Cryptol.TypeCheck.Type: tIsInf :: Type -> Bool
+ Cryptol.TypeCheck.Type: tIsNat' :: Type -> Maybe Nat'
+ Cryptol.TypeCheck.Type: tIsNum :: Type -> Maybe Integer
+ Cryptol.TypeCheck.Type: tIsSeq :: Type -> Maybe (Type, Type)
+ Cryptol.TypeCheck.Type: tIsTuple :: Type -> Maybe [Type]
+ Cryptol.TypeCheck.Type: tIsVar :: Type -> Maybe TVar
+ Cryptol.TypeCheck.Type: tLenFromThen :: Type -> Type -> Type -> Type
+ Cryptol.TypeCheck.Type: tLenFromThenTo :: Type -> Type -> Type -> Type
+ Cryptol.TypeCheck.Type: tMin :: Type -> Type -> Type
+ Cryptol.TypeCheck.Type: tMod :: Type -> Type -> Type
+ Cryptol.TypeCheck.Type: tMul :: Type -> Type -> Type
+ Cryptol.TypeCheck.Type: tNat' :: Nat' -> Type
+ Cryptol.TypeCheck.Type: tNoUser :: Type -> Type
+ Cryptol.TypeCheck.Type: tNum :: Integral a => a -> Type
+ Cryptol.TypeCheck.Type: tOne :: Type
+ Cryptol.TypeCheck.Type: tRec :: [(Ident, Type)] -> Type
+ Cryptol.TypeCheck.Type: tSeq :: Type -> Type -> Type
+ Cryptol.TypeCheck.Type: tSplitFun :: TFun -> Type -> [Type]
+ Cryptol.TypeCheck.Type: tString :: Int -> Type
+ Cryptol.TypeCheck.Type: tSub :: Type -> Type -> Type
+ Cryptol.TypeCheck.Type: tTuple :: [Type] -> Type
+ Cryptol.TypeCheck.Type: tTwo :: Type
+ Cryptol.TypeCheck.Type: tWidth :: Type -> Type
+ Cryptol.TypeCheck.Type: tWord :: Type -> Type
+ Cryptol.TypeCheck.Type: tZero :: Type
+ Cryptol.TypeCheck.Type: tf1 :: TFun -> Type -> Type
+ Cryptol.TypeCheck.Type: tf2 :: TFun -> Type -> Type -> Type
+ Cryptol.TypeCheck.Type: tf3 :: TFun -> Type -> Type -> Type -> Type
+ Cryptol.TypeCheck.Type: tpVar :: TParam -> TVar
+ Cryptol.TypeCheck.Type: type Prop = Type
+ Cryptol.TypeCheck.Type: type SType = Type
+ Cryptol.TypeCheck.TypeMap: instance Cryptol.TypeCheck.TypeMap.TrieMap Cryptol.TypeCheck.TypeMap.TypeMap Cryptol.TypeCheck.Type.Type
+ Cryptol.TypeCheck.TypePat: (|%|) :: Pat Type (Type, Type)
+ Cryptol.TypeCheck.TypePat: (|->|) :: Pat Type (Type, Type)
+ Cryptol.TypeCheck.TypePat: (|-|) :: Pat Type (Type, Type)
+ Cryptol.TypeCheck.TypePat: (|/=|) :: Pat Prop (Type, Type)
+ Cryptol.TypeCheck.TypePat: (|/|) :: Pat Type (Type, Type)
+ Cryptol.TypeCheck.TypePat: (|=|) :: Pat Prop (Type, Type)
+ Cryptol.TypeCheck.TypePat: (|>=|) :: Pat Prop (Type, Type)
+ Cryptol.TypeCheck.TypePat: (|^|) :: Pat Type (Type, Type)
+ Cryptol.TypeCheck.TypePat: aAnd :: Pat Prop (Prop, Prop)
+ Cryptol.TypeCheck.TypePat: aArith :: Pat Prop Type
+ Cryptol.TypeCheck.TypePat: aBit :: Pat Type ()
+ Cryptol.TypeCheck.TypePat: aChar :: Pat Type ()
+ Cryptol.TypeCheck.TypePat: aCmp :: Pat Prop Type
+ Cryptol.TypeCheck.TypePat: aFin :: Pat Prop Type
+ Cryptol.TypeCheck.TypePat: aInf :: Pat Type ()
+ Cryptol.TypeCheck.TypePat: aLenFromThen :: Pat Type (Type, Type, Type)
+ Cryptol.TypeCheck.TypePat: aLenFromThenTo :: Pat Type (Type, Type, Type)
+ Cryptol.TypeCheck.TypePat: aMax :: Pat Type (Type, Type)
+ Cryptol.TypeCheck.TypePat: aMin :: Pat Type (Type, Type)
+ Cryptol.TypeCheck.TypePat: aMul :: Pat Type (Type, Type)
+ Cryptol.TypeCheck.TypePat: aNat :: Pat Type Integer
+ Cryptol.TypeCheck.TypePat: aNat' :: Pat Type Nat'
+ Cryptol.TypeCheck.TypePat: aSeq :: Pat Type (Type, Type)
+ Cryptol.TypeCheck.TypePat: aTVar :: Pat Type TVar
+ Cryptol.TypeCheck.TypePat: aTrue :: Pat Prop ()
+ Cryptol.TypeCheck.TypePat: aTuple :: Pat Type [Type]
+ Cryptol.TypeCheck.TypePat: aWidth :: Pat Type Type
+ Cryptol.TypeCheck.TypePat: aWord :: Pat Type Type
+ Cryptol.TypeCheck.TypePat: anAdd :: Pat Type (Type, Type)
+ Cryptol.TypeCheck.TypePat: anError :: Kind -> Pat Type TCErrorMessage
+ Cryptol.Utils.Ident: preludeExtrasName :: ModName
+ Cryptol.Utils.Patterns: (&&&) :: Pat a b -> Pat a c -> Pat a (b, c)
+ Cryptol.Utils.Patterns: (<~) :: (a -> b) -> Pat b c -> Pat a c
+ Cryptol.Utils.Patterns: (><) :: Pat a b -> Pat x y -> Pat (a, x) (b, y)
+ Cryptol.Utils.Patterns: (|||) :: Pat a b -> Pat a b -> Pat a b
+ Cryptol.Utils.Patterns: (~>) :: Pat a b -> (b -> c) -> Pat a c
+ Cryptol.Utils.Patterns: (~~>) :: Pat a b -> c -> Pat a c
+ Cryptol.Utils.Patterns: Match :: (forall r. r -> (b -> r) -> r) -> Match b
+ Cryptol.Utils.Patterns: __ :: Pat a a
+ Cryptol.Utils.Patterns: checkThat :: (a -> Bool) -> Pat a ()
+ Cryptol.Utils.Patterns: class Matches thing pats res | pats -> thing res
+ Cryptol.Utils.Patterns: instance (f ~ Cryptol.Utils.Patterns.Pat a a1', a1 ~ Cryptol.Utils.Patterns.Pat a1' r1) => Cryptol.Utils.Patterns.Matches a (f, a1) r1
+ Cryptol.Utils.Patterns: instance (op ~ Cryptol.Utils.Patterns.Pat a (a1', a2'), a1 ~ Cryptol.Utils.Patterns.Pat a1' r1, a2 ~ Cryptol.Utils.Patterns.Pat a2' r2) => Cryptol.Utils.Patterns.Matches a (op, a1, a2) (r1, r2)
+ Cryptol.Utils.Patterns: instance (op ~ Cryptol.Utils.Patterns.Pat a (a1', a2', a3'), a1 ~ Cryptol.Utils.Patterns.Pat a1' r1, a2 ~ Cryptol.Utils.Patterns.Pat a2' r2, a3 ~ Cryptol.Utils.Patterns.Pat a3' r3) => Cryptol.Utils.Patterns.Matches a (op, a1, a2, a3) (r1, r2, r3)
+ Cryptol.Utils.Patterns: instance GHC.Base.Alternative Cryptol.Utils.Patterns.Match
+ Cryptol.Utils.Patterns: instance GHC.Base.Applicative Cryptol.Utils.Patterns.Match
+ Cryptol.Utils.Patterns: instance GHC.Base.Functor Cryptol.Utils.Patterns.Match
+ Cryptol.Utils.Patterns: instance GHC.Base.Monad Cryptol.Utils.Patterns.Match
+ Cryptol.Utils.Patterns: instance GHC.Base.MonadPlus Cryptol.Utils.Patterns.Match
+ Cryptol.Utils.Patterns: list :: [Pat a b] -> Pat [a] [b]
+ Cryptol.Utils.Patterns: lit :: Eq a => a -> Pat a ()
+ Cryptol.Utils.Patterns: match :: Match a -> a
+ Cryptol.Utils.Patterns: matchDefault :: a -> Match a -> a
+ Cryptol.Utils.Patterns: matchMaybe :: Match a -> Maybe a
+ Cryptol.Utils.Patterns: matches :: Matches thing pats res => thing -> pats -> Match res
+ Cryptol.Utils.Patterns: newtype Match b
+ Cryptol.Utils.Patterns: succeed :: a -> Pat x a
+ Cryptol.Utils.Patterns: type Pat a b = a -> Match b
- Cryptol.Eval: emptyEnv :: EvalEnv
+ Cryptol.Eval: emptyEnv :: GenEvalEnv b w
- Cryptol.Eval: evalDecls :: [DeclGroup] -> EvalEnv -> EvalEnv
+ Cryptol.Eval: evalDecls :: EvalPrims b w => [DeclGroup] -> GenEvalEnv b w -> Eval (GenEvalEnv b w)
- Cryptol.Eval: evalExpr :: EvalEnv -> Expr -> Value
+ Cryptol.Eval: evalExpr :: EvalPrims b w => GenEvalEnv b w -> Expr -> Eval (GenValue b w)
- Cryptol.Eval: moduleEnv :: Module -> EvalEnv -> EvalEnv
+ Cryptol.Eval: moduleEnv :: EvalPrims b w => Module -> GenEvalEnv b w -> Eval (GenEvalEnv b w)
- Cryptol.Eval.Env: EvalEnv :: Map Name Value -> Map TVar (Either Nat' TValue) -> EvalEnv
+ Cryptol.Eval.Env: EvalEnv :: !(Map Name (Eval (GenValue b w))) -> !TypeEnv -> GenEvalEnv b w
- Cryptol.Eval.Env: [envTypes] :: EvalEnv -> Map TVar (Either Nat' TValue)
+ Cryptol.Eval.Env: [envTypes] :: GenEvalEnv b w -> !TypeEnv
- Cryptol.Eval.Env: [envVars] :: EvalEnv -> Map Name Value
+ Cryptol.Eval.Env: [envVars] :: GenEvalEnv b w -> !(Map Name (Eval (GenValue b w)))
- Cryptol.Eval.Env: bindType :: TVar -> Either Nat' TValue -> EvalEnv -> EvalEnv
+ Cryptol.Eval.Env: bindType :: TVar -> Either Nat' TValue -> GenEvalEnv b w -> GenEvalEnv b w
- Cryptol.Eval.Env: bindVar :: Name -> Value -> EvalEnv -> EvalEnv
+ Cryptol.Eval.Env: bindVar :: Name -> Eval (GenValue b w) -> GenEvalEnv b w -> Eval (GenEvalEnv b w)
- Cryptol.Eval.Env: emptyEnv :: EvalEnv
+ Cryptol.Eval.Env: emptyEnv :: GenEvalEnv b w
- Cryptol.Eval.Env: lookupType :: TVar -> EvalEnv -> Maybe (Either Nat' TValue)
+ Cryptol.Eval.Env: lookupType :: TVar -> GenEvalEnv b w -> Maybe (Either Nat' TValue)
- Cryptol.Eval.Env: lookupVar :: Name -> EvalEnv -> Maybe Value
+ Cryptol.Eval.Env: lookupVar :: Name -> GenEvalEnv b w -> Maybe (Eval (GenValue b w))
- Cryptol.Eval.Type: evalNumType :: EvalEnv -> Type -> Nat'
+ Cryptol.Eval.Type: evalNumType :: TypeEnv -> Type -> Nat'
- Cryptol.Eval.Type: evalType :: EvalEnv -> Type -> Either Nat' TValue
+ Cryptol.Eval.Type: evalType :: TypeEnv -> Type -> Either Nat' TValue
- Cryptol.Eval.Type: evalValType :: EvalEnv -> Type -> TValue
+ Cryptol.Eval.Type: evalValType :: TypeEnv -> Type -> TValue
- Cryptol.Eval.Value: VBit :: b -> GenValue b w
+ Cryptol.Eval.Value: VBit :: !b -> GenValue b w
- Cryptol.Eval.Value: VFun :: (GenValue b w -> GenValue b w) -> GenValue b w
+ Cryptol.Eval.Value: VFun :: (Eval (GenValue b w) -> Eval (GenValue b w)) -> GenValue b w
- Cryptol.Eval.Value: VNumPoly :: (Nat' -> GenValue b w) -> GenValue b w
+ Cryptol.Eval.Value: VNumPoly :: (Nat' -> Eval (GenValue b w)) -> GenValue b w
- Cryptol.Eval.Value: VPoly :: (TValue -> GenValue b w) -> GenValue b w
+ Cryptol.Eval.Value: VPoly :: (TValue -> Eval (GenValue b w)) -> GenValue b w
- Cryptol.Eval.Value: VRecord :: [(Ident, GenValue b w)] -> GenValue b w
+ Cryptol.Eval.Value: VRecord :: ![(Ident, Eval (GenValue b w))] -> GenValue b w
- Cryptol.Eval.Value: VSeq :: Bool -> [GenValue b w] -> GenValue b w
+ Cryptol.Eval.Value: VSeq :: !Integer -> !(SeqMap b w) -> GenValue b w
- Cryptol.Eval.Value: VStream :: [GenValue b w] -> GenValue b w
+ Cryptol.Eval.Value: VStream :: !(SeqMap b w) -> GenValue b w
- Cryptol.Eval.Value: VTuple :: [GenValue b w] -> GenValue b w
+ Cryptol.Eval.Value: VTuple :: ![Eval (GenValue b w)] -> GenValue b w
- Cryptol.Eval.Value: VWord :: w -> GenValue b w
+ Cryptol.Eval.Value: VWord :: !Integer -> !(Eval (WordValue b w)) -> GenValue b w
- Cryptol.Eval.Value: class BitWord b w
+ Cryptol.Eval.Value: class BitWord b w | b -> w, w -> b
- Cryptol.Eval.Value: fromSeq :: BitWord b w => GenValue b w -> [GenValue b w]
+ Cryptol.Eval.Value: fromSeq :: forall b w. BitWord b w => String -> GenValue b w -> Eval (SeqMap b w)
- Cryptol.Eval.Value: fromStr :: Value -> String
+ Cryptol.Eval.Value: fromStr :: Value -> Eval String
- Cryptol.Eval.Value: fromVFun :: GenValue b w -> (GenValue b w -> GenValue b w)
+ Cryptol.Eval.Value: fromVFun :: GenValue b w -> (Eval (GenValue b w) -> Eval (GenValue b w))
- Cryptol.Eval.Value: fromVNumPoly :: GenValue b w -> (Nat' -> GenValue b w)
+ Cryptol.Eval.Value: fromVNumPoly :: GenValue b w -> (Nat' -> Eval (GenValue b w))
- Cryptol.Eval.Value: fromVPoly :: GenValue b w -> (TValue -> GenValue b w)
+ Cryptol.Eval.Value: fromVPoly :: GenValue b w -> (TValue -> Eval (GenValue b w))
- Cryptol.Eval.Value: fromVRecord :: GenValue b w -> [(Ident, GenValue b w)]
+ Cryptol.Eval.Value: fromVRecord :: GenValue b w -> [(Ident, Eval (GenValue b w))]
- Cryptol.Eval.Value: fromVTuple :: GenValue b w -> [GenValue b w]
+ Cryptol.Eval.Value: fromVTuple :: GenValue b w -> [Eval (GenValue b w)]
- Cryptol.Eval.Value: fromVWord :: BitWord b w => GenValue b w -> w
+ Cryptol.Eval.Value: fromVWord :: BitWord b w => String -> GenValue b w -> Eval w
- Cryptol.Eval.Value: fromWord :: Value -> Integer
+ Cryptol.Eval.Value: fromWord :: String -> Value -> Eval Integer
- Cryptol.Eval.Value: lam :: (GenValue b w -> GenValue b w) -> GenValue b w
+ Cryptol.Eval.Value: lam :: (Eval (GenValue b w) -> Eval (GenValue b w)) -> GenValue b w
- Cryptol.Eval.Value: lookupRecord :: Ident -> GenValue b w -> GenValue b w
+ Cryptol.Eval.Value: lookupRecord :: Ident -> GenValue b w -> Eval (GenValue b w)
- Cryptol.Eval.Value: ppValue :: PPOpts -> Value -> Doc
+ Cryptol.Eval.Value: ppValue :: forall b w. BitWord b w => PPOpts -> GenValue b w -> Eval Doc
- Cryptol.Eval.Value: ppWord :: PPOpts -> BV -> Doc
+ Cryptol.Eval.Value: ppWord :: BitWord b w => PPOpts -> w -> Doc
- Cryptol.Eval.Value: toExpr :: PrimMap -> Type -> Value -> Maybe Expr
+ Cryptol.Eval.Value: toExpr :: PrimMap -> Type -> Value -> Eval (Maybe Expr)
- Cryptol.Eval.Value: toFinSeq :: TValue -> [GenValue b w] -> GenValue b w
+ Cryptol.Eval.Value: toFinSeq :: BitWord b w => Integer -> TValue -> [GenValue b w] -> GenValue b w
- Cryptol.Eval.Value: toSeq :: Nat' -> TValue -> [GenValue b w] -> GenValue b w
+ Cryptol.Eval.Value: toSeq :: BitWord b w => Nat' -> TValue -> [GenValue b w] -> Eval (GenValue b w)
- Cryptol.Eval.Value: toStream :: [GenValue b w] -> GenValue b w
+ Cryptol.Eval.Value: toStream :: [GenValue b w] -> Eval (GenValue b w)
- Cryptol.Eval.Value: vWordLen :: Value -> Maybe Integer
+ Cryptol.Eval.Value: vWordLen :: BitWord b w => GenValue b w -> Maybe Integer
- Cryptol.Eval.Value: word :: Integer -> Integer -> Value
+ Cryptol.Eval.Value: word :: BitWord b w => Integer -> Integer -> GenValue b w
- Cryptol.ModuleSystem.Env: LoadedModule :: ModName -> FilePath -> Iface -> Module -> LoadedModule
+ Cryptol.ModuleSystem.Env: LoadedModule :: ModName -> FilePath -> FilePath -> Iface -> Module -> LoadedModule
- Cryptol.ModuleSystem.Env: addLoadedModule :: FilePath -> Module -> LoadedModules -> LoadedModules
+ Cryptol.ModuleSystem.Env: addLoadedModule :: FilePath -> FilePath -> Module -> LoadedModules -> LoadedModules
- Cryptol.ModuleSystem.Monad: loadedModule :: FilePath -> Module -> ModuleM ()
+ Cryptol.ModuleSystem.Monad: loadedModule :: FilePath -> FilePath -> Module -> ModuleM ()
- Cryptol.ModuleSystem.Monad: modifyEvalEnv :: (EvalEnv -> EvalEnv) -> ModuleM ()
+ Cryptol.ModuleSystem.Monad: modifyEvalEnv :: (EvalEnv -> Eval EvalEnv) -> ModuleM ()
- Cryptol.Parser.AST: Located :: !Range -> a -> Located a
+ Cryptol.Parser.AST: Located :: !Range -> !a -> Located a
- Cryptol.Parser.AST: [thing] :: Located a -> a
+ Cryptol.Parser.AST: [thing] :: Located a -> !a
- Cryptol.Parser.Lexer: ChrLit :: Char -> TokenT
+ Cryptol.Parser.Lexer: ChrLit :: !Char -> TokenT
- Cryptol.Parser.Lexer: Err :: TokenErr -> TokenT
+ Cryptol.Parser.Lexer: Err :: !TokenErr -> TokenT
- Cryptol.Parser.Lexer: Ident :: [Text] -> Text -> TokenT
+ Cryptol.Parser.Lexer: Ident :: ![Text] -> !Text -> TokenT
- Cryptol.Parser.Lexer: KW :: TokenKW -> TokenT
+ Cryptol.Parser.Lexer: KW :: !TokenKW -> TokenT
- Cryptol.Parser.Lexer: Located :: !Range -> a -> Located a
+ Cryptol.Parser.Lexer: Located :: !Range -> !a -> Located a
- Cryptol.Parser.Lexer: Num :: Integer -> Int -> Int -> TokenT
+ Cryptol.Parser.Lexer: Num :: !Integer -> !Int -> !Int -> TokenT
- Cryptol.Parser.Lexer: Op :: TokenOp -> TokenT
+ Cryptol.Parser.Lexer: Op :: !TokenOp -> TokenT
- Cryptol.Parser.Lexer: StrLit :: String -> TokenT
+ Cryptol.Parser.Lexer: StrLit :: !String -> TokenT
- Cryptol.Parser.Lexer: Sym :: TokenSym -> TokenT
+ Cryptol.Parser.Lexer: Sym :: !TokenSym -> TokenT
- Cryptol.Parser.Lexer: Token :: TokenT -> Text -> Token
+ Cryptol.Parser.Lexer: Token :: !TokenT -> !Text -> Token
- Cryptol.Parser.Lexer: Virt :: TokenV -> TokenT
+ Cryptol.Parser.Lexer: Virt :: !TokenV -> TokenT
- Cryptol.Parser.Lexer: White :: TokenW -> TokenT
+ Cryptol.Parser.Lexer: White :: !TokenW -> TokenT
- Cryptol.Parser.Lexer: [thing] :: Located a -> a
+ Cryptol.Parser.Lexer: [thing] :: Located a -> !a
- Cryptol.Parser.Lexer: [tokenText] :: Token -> Text
+ Cryptol.Parser.Lexer: [tokenText] :: Token -> !Text
- Cryptol.Parser.Lexer: [tokenType] :: Token -> TokenT
+ Cryptol.Parser.Lexer: [tokenType] :: Token -> !TokenT
- Cryptol.Parser.Position: Located :: !Range -> a -> Located a
+ Cryptol.Parser.Position: Located :: !Range -> !a -> Located a
- Cryptol.Parser.Position: [thing] :: Located a -> a
+ Cryptol.Parser.Position: [thing] :: Located a -> !a
- Cryptol.Prims.Eval: arithBinary :: BinArith -> Binary
+ Cryptol.Prims.Eval: arithBinary :: forall b w. BitWord b w => BinArith w -> Binary b w
- Cryptol.Prims.Eval: arithUnary :: (Integer -> Integer) -> Unary
+ Cryptol.Prims.Eval: arithUnary :: forall b w. BitWord b w => UnaryArith w -> Unary b w
- Cryptol.Prims.Eval: binary :: GenBinary b w -> GenValue b w
+ Cryptol.Prims.Eval: binary :: Binary b w -> GenValue b w
- Cryptol.Prims.Eval: ccatV :: Nat' -> Nat' -> TValue -> Value -> Value -> Value
+ Cryptol.Prims.Eval: ccatV :: (Show b, Show w, BitWord b w) => Nat' -> Nat' -> TValue -> (GenValue b w) -> (GenValue b w) -> Eval (GenValue b w)
- Cryptol.Prims.Eval: cmpOrder :: (Ordering -> Bool) -> Binary
+ Cryptol.Prims.Eval: cmpOrder :: String -> (Ordering -> Bool) -> Binary Bool BV
- Cryptol.Prims.Eval: ecDemoteV :: Value
+ Cryptol.Prims.Eval: ecDemoteV :: BitWord b w => GenValue b w
- Cryptol.Prims.Eval: ecSplitV :: Value
+ Cryptol.Prims.Eval: ecSplitV :: BitWord b w => GenValue b w
- Cryptol.Prims.Eval: fromThenToV :: Value
+ Cryptol.Prims.Eval: fromThenToV :: BitWord b w => GenValue b w
- Cryptol.Prims.Eval: fromThenV :: Value
+ Cryptol.Prims.Eval: fromThenV :: BitWord b w => GenValue b w
- Cryptol.Prims.Eval: fromToV :: Value
+ Cryptol.Prims.Eval: fromToV :: BitWord b w => GenValue b w
- Cryptol.Prims.Eval: indexBack :: Maybe Integer -> [Value] -> Integer -> Value
+ Cryptol.Prims.Eval: indexBack :: Maybe Integer -> TValue -> SeqValMap -> BV -> Eval Value
- Cryptol.Prims.Eval: indexFront :: Maybe Integer -> [Value] -> Integer -> Value
+ Cryptol.Prims.Eval: indexFront :: Maybe Integer -> TValue -> SeqValMap -> BV -> Eval Value
- Cryptol.Prims.Eval: indexPrimMany :: (Maybe Integer -> [Value] -> [Integer] -> [Value]) -> Value
+ Cryptol.Prims.Eval: indexPrimMany :: BitWord b w => (Maybe Integer -> TValue -> SeqMap b w -> Seq b -> Eval (GenValue b w)) -> (Maybe Integer -> TValue -> SeqMap b w -> w -> Eval (GenValue b w)) -> GenValue b w
- Cryptol.Prims.Eval: indexPrimOne :: (Maybe Integer -> [Value] -> Integer -> Value) -> Value
+ Cryptol.Prims.Eval: indexPrimOne :: BitWord b w => (Maybe Integer -> TValue -> SeqMap b w -> Seq b -> Eval (GenValue b w)) -> (Maybe Integer -> TValue -> SeqMap b w -> w -> Eval (GenValue b w)) -> GenValue b w
- Cryptol.Prims.Eval: joinV :: Nat' -> Nat' -> TValue -> Value -> Value
+ Cryptol.Prims.Eval: joinV :: BitWord b w => Nat' -> Integer -> TValue -> GenValue b w -> Eval (GenValue b w)
- Cryptol.Prims.Eval: lexCompare :: TValue -> Value -> Value -> Ordering
+ Cryptol.Prims.Eval: lexCompare :: String -> TValue -> Value -> Value -> Eval Ordering
- Cryptol.Prims.Eval: liftBinArith :: (Integer -> Integer -> Integer) -> BinArith
+ Cryptol.Prims.Eval: liftBinArith :: (Integer -> Integer -> Integer) -> BinArith BV
- Cryptol.Prims.Eval: logicBinary :: (forall a. Bits a => a -> a -> a) -> Binary
+ Cryptol.Prims.Eval: logicBinary :: forall b w. BitWord b w => (b -> b -> b) -> (w -> w -> w) -> Binary b w
- Cryptol.Prims.Eval: logicShift :: (Integer -> Integer -> Integer -> Integer) -> (Nat' -> TValue -> [Value] -> Integer -> [Value]) -> Value
+ Cryptol.Prims.Eval: logicShift :: (Integer -> Integer -> Integer -> Integer) -> (Integer -> Seq (Eval Bool) -> Integer -> Seq (Eval Bool)) -> (Nat' -> TValue -> SeqValMap -> Integer -> SeqValMap) -> Value
- Cryptol.Prims.Eval: logicUnary :: (forall a. Bits a => a -> a) -> Unary
+ Cryptol.Prims.Eval: logicUnary :: forall b w. BitWord b w => (b -> b) -> (w -> w) -> Unary b w
- Cryptol.Prims.Eval: modExp :: Integer -> Integer -> Integer -> Integer
+ Cryptol.Prims.Eval: modExp :: Integer -> BV -> BV -> Eval BV
- Cryptol.Prims.Eval: rotateLS :: Nat' -> TValue -> [Value] -> Integer -> [Value]
+ Cryptol.Prims.Eval: rotateLS :: Nat' -> TValue -> SeqValMap -> Integer -> SeqValMap
- Cryptol.Prims.Eval: rotateRS :: Nat' -> TValue -> [Value] -> Integer -> [Value]
+ Cryptol.Prims.Eval: rotateRS :: Nat' -> TValue -> SeqValMap -> Integer -> SeqValMap
- Cryptol.Prims.Eval: shiftLS :: Nat' -> TValue -> [Value] -> Integer -> [Value]
+ Cryptol.Prims.Eval: shiftLS :: Nat' -> TValue -> SeqValMap -> Integer -> SeqValMap
- Cryptol.Prims.Eval: shiftRS :: Nat' -> TValue -> [Value] -> Integer -> [Value]
+ Cryptol.Prims.Eval: shiftRS :: Nat' -> TValue -> SeqValMap -> Integer -> SeqValMap
- Cryptol.Prims.Eval: splitAtV :: Nat' -> Nat' -> TValue -> Value -> Value
+ Cryptol.Prims.Eval: splitAtV :: BitWord b w => Nat' -> Nat' -> TValue -> GenValue b w -> Eval (GenValue b w)
- Cryptol.Prims.Eval: type BinArith = Integer -> Integer -> Integer -> Integer
+ Cryptol.Prims.Eval: type BinArith w = Integer -> w -> w -> Eval w
- Cryptol.Prims.Eval: type Binary = GenBinary Bool BV
+ Cryptol.Prims.Eval: type Binary b w = TValue -> GenValue b w -> GenValue b w -> Eval (GenValue b w)
- Cryptol.Prims.Eval: type Unary = GenUnary Bool BV
+ Cryptol.Prims.Eval: type Unary b w = TValue -> GenValue b w -> Eval (GenValue b w)
- Cryptol.Prims.Eval: unary :: GenUnary b w -> GenValue b w
+ Cryptol.Prims.Eval: unary :: Unary b w -> GenValue b w
- Cryptol.Prims.Eval: withOrder :: (Ordering -> TValue -> Value -> Value -> Value) -> Binary
+ Cryptol.Prims.Eval: withOrder :: String -> (Ordering -> TValue -> Value -> Value -> Value) -> Binary Bool BV
- Cryptol.Prims.Eval: zeroV :: TValue -> Value
+ Cryptol.Prims.Eval: zeroV :: forall b w. BitWord b w => TValue -> GenValue b w
- Cryptol.Prims.Eval: zipLexCompare :: [TValue] -> [Value] -> [Value] -> Ordering
+ Cryptol.Prims.Eval: zipLexCompare :: String -> [TValue] -> [Eval Value] -> [Eval Value] -> Eval Ordering
- Cryptol.REPL.Command: handleCtrlC :: REPL ()
+ Cryptol.REPL.Command: handleCtrlC :: a -> REPL a
- Cryptol.REPL.Command: onlineProveSat :: Bool -> String -> Maybe FilePath -> REPL ProverResult
+ Cryptol.REPL.Command: onlineProveSat :: Bool -> String -> Maybe FilePath -> REPL (Maybe Solver, ProverResult, ProverStats)
- Cryptol.REPL.Command: runCommand :: Command -> REPL ()
+ Cryptol.REPL.Command: runCommand :: Command -> REPL CommandExitCode
- Cryptol.REPL.Monad: asBatch :: REPL () -> REPL ()
+ Cryptol.REPL.Monad: asBatch :: REPL a -> REPL a
- Cryptol.Symbolic: ProverCommand :: QueryType -> String -> Bool -> [DeclGroup] -> Maybe FilePath -> Expr -> Schema -> ProverCommand
+ Cryptol.Symbolic: ProverCommand :: QueryType -> String -> Bool -> !(IORef ProverStats) -> [DeclGroup] -> Maybe FilePath -> Expr -> Schema -> ProverCommand
- Cryptol.Symbolic: proverError :: String -> ModuleCmd ProverResult
+ Cryptol.Symbolic: proverError :: String -> ModuleCmd (Maybe Solver, ProverResult)
- Cryptol.Symbolic: satProve :: ProverCommand -> ModuleCmd ProverResult
+ Cryptol.Symbolic: satProve :: ProverCommand -> ModuleCmd (Maybe Solver, ProverResult)
- Cryptol.Symbolic.Prims: asWordList :: [Value] -> Maybe [SWord]
+ Cryptol.Symbolic.Prims: asWordList :: [WordValue SBool SWord] -> Maybe [SWord]
- Cryptol.Symbolic.Prims: cmpBinary :: (SBool -> SBool -> SBool -> SBool) -> (SWord -> SWord -> SBool -> SBool) -> SBool -> Binary
+ Cryptol.Symbolic.Prims: cmpBinary :: (SBool -> SBool -> Eval SBool -> Eval SBool) -> (SWord -> SWord -> Eval SBool -> Eval SBool) -> SBool -> Binary SBool SWord
- Cryptol.Symbolic.Prims: cmpEq :: SWord -> SWord -> SBool -> SBool
+ Cryptol.Symbolic.Prims: cmpEq :: SWord -> SWord -> Eval SBool -> Eval SBool
- Cryptol.Symbolic.Prims: cmpGt :: SWord -> SWord -> SBool -> SBool
+ Cryptol.Symbolic.Prims: cmpGt :: SWord -> SWord -> Eval SBool -> Eval SBool
- Cryptol.Symbolic.Prims: cmpGtEq :: SWord -> SWord -> SBool -> SBool
+ Cryptol.Symbolic.Prims: cmpGtEq :: SWord -> SWord -> Eval SBool -> Eval SBool
- Cryptol.Symbolic.Prims: cmpLt :: SWord -> SWord -> SBool -> SBool
+ Cryptol.Symbolic.Prims: cmpLt :: SWord -> SWord -> Eval SBool -> Eval SBool
- Cryptol.Symbolic.Prims: cmpLtEq :: SWord -> SWord -> SBool -> SBool
+ Cryptol.Symbolic.Prims: cmpLtEq :: SWord -> SWord -> Eval SBool -> Eval SBool
- Cryptol.Symbolic.Prims: cmpNotEq :: SWord -> SWord -> SBool -> SBool
+ Cryptol.Symbolic.Prims: cmpNotEq :: SWord -> SWord -> Eval SBool -> Eval SBool
- Cryptol.Symbolic.Prims: cmpValue :: (SBool -> SBool -> a -> a) -> (SWord -> SWord -> a -> a) -> (Value -> Value -> a -> a)
+ Cryptol.Symbolic.Prims: cmpValue :: (SBool -> SBool -> Eval a -> Eval a) -> (SWord -> SWord -> Eval a -> Eval a) -> (Value -> Value -> Eval a -> Eval a)
- Cryptol.Symbolic.Prims: nth :: a -> [a] -> Int -> a
+ Cryptol.Symbolic.Prims: nth :: [SBool] -> Int -> SBool
- Cryptol.Symbolic.Prims: sExp :: SWord -> SWord -> SWord
+ Cryptol.Symbolic.Prims: sExp :: Integer -> SWord -> SWord -> Eval SWord
- Cryptol.Symbolic.Prims: sLg2 :: SWord -> SWord
+ Cryptol.Symbolic.Prims: sLg2 :: Integer -> SWord -> Eval SWord
- Cryptol.Symbolic.Prims: selectV :: (Integer -> Value) -> Value -> Value
+ Cryptol.Symbolic.Prims: selectV :: forall a. (SBool -> Eval a -> Eval a -> Eval a) -> WordValue SBool SWord -> (Integer -> Eval a) -> Eval a
- Cryptol.Symbolic.Value: VBit :: b -> GenValue b w
+ Cryptol.Symbolic.Value: VBit :: !b -> GenValue b w
- Cryptol.Symbolic.Value: VFun :: (GenValue b w -> GenValue b w) -> GenValue b w
+ Cryptol.Symbolic.Value: VFun :: (Eval (GenValue b w) -> Eval (GenValue b w)) -> GenValue b w
- Cryptol.Symbolic.Value: VNumPoly :: (Nat' -> GenValue b w) -> GenValue b w
+ Cryptol.Symbolic.Value: VNumPoly :: (Nat' -> Eval (GenValue b w)) -> GenValue b w
- Cryptol.Symbolic.Value: VPoly :: (TValue -> GenValue b w) -> GenValue b w
+ Cryptol.Symbolic.Value: VPoly :: (TValue -> Eval (GenValue b w)) -> GenValue b w
- Cryptol.Symbolic.Value: VRecord :: [(Ident, GenValue b w)] -> GenValue b w
+ Cryptol.Symbolic.Value: VRecord :: ![(Ident, Eval (GenValue b w))] -> GenValue b w
- Cryptol.Symbolic.Value: VSeq :: Bool -> [GenValue b w] -> GenValue b w
+ Cryptol.Symbolic.Value: VSeq :: !Integer -> !(SeqMap b w) -> GenValue b w
- Cryptol.Symbolic.Value: VStream :: [GenValue b w] -> GenValue b w
+ Cryptol.Symbolic.Value: VStream :: !(SeqMap b w) -> GenValue b w
- Cryptol.Symbolic.Value: VTuple :: [GenValue b w] -> GenValue b w
+ Cryptol.Symbolic.Value: VTuple :: ![Eval (GenValue b w)] -> GenValue b w
- Cryptol.Symbolic.Value: VWord :: w -> GenValue b w
+ Cryptol.Symbolic.Value: VWord :: !Integer -> !(Eval (WordValue b w)) -> GenValue b w
- Cryptol.Symbolic.Value: fromSeq :: BitWord b w => GenValue b w -> [GenValue b w]
+ Cryptol.Symbolic.Value: fromSeq :: forall b w. BitWord b w => String -> GenValue b w -> Eval (SeqMap b w)
- Cryptol.Symbolic.Value: fromVFun :: GenValue b w -> (GenValue b w -> GenValue b w)
+ Cryptol.Symbolic.Value: fromVFun :: GenValue b w -> (Eval (GenValue b w) -> Eval (GenValue b w))
- Cryptol.Symbolic.Value: fromVPoly :: GenValue b w -> (TValue -> GenValue b w)
+ Cryptol.Symbolic.Value: fromVPoly :: GenValue b w -> (TValue -> Eval (GenValue b w))
- Cryptol.Symbolic.Value: fromVRecord :: GenValue b w -> [(Ident, GenValue b w)]
+ Cryptol.Symbolic.Value: fromVRecord :: GenValue b w -> [(Ident, Eval (GenValue b w))]
- Cryptol.Symbolic.Value: fromVTuple :: GenValue b w -> [GenValue b w]
+ Cryptol.Symbolic.Value: fromVTuple :: GenValue b w -> [Eval (GenValue b w)]
- Cryptol.Symbolic.Value: fromVWord :: BitWord b w => GenValue b w -> w
+ Cryptol.Symbolic.Value: fromVWord :: BitWord b w => String -> GenValue b w -> Eval w
- Cryptol.Symbolic.Value: lam :: (GenValue b w -> GenValue b w) -> GenValue b w
+ Cryptol.Symbolic.Value: lam :: (Eval (GenValue b w) -> Eval (GenValue b w)) -> GenValue b w
- Cryptol.Symbolic.Value: lookupRecord :: Ident -> GenValue b w -> GenValue b w
+ Cryptol.Symbolic.Value: lookupRecord :: Ident -> GenValue b w -> Eval (GenValue b w)
- Cryptol.Symbolic.Value: toFinSeq :: TValue -> [GenValue b w] -> GenValue b w
+ Cryptol.Symbolic.Value: toFinSeq :: BitWord b w => Integer -> TValue -> [GenValue b w] -> GenValue b w
- Cryptol.Symbolic.Value: toSeq :: Nat' -> TValue -> [GenValue b w] -> GenValue b w
+ Cryptol.Symbolic.Value: toSeq :: BitWord b w => Nat' -> TValue -> [GenValue b w] -> Eval (GenValue b w)
- Cryptol.Symbolic.Value: toStream :: [GenValue b w] -> GenValue b w
+ Cryptol.Symbolic.Value: toStream :: [GenValue b w] -> Eval (GenValue b w)
- Cryptol.TypeCheck: InferInput :: Range -> Map Name Schema -> Map Name TySyn -> Map Name Newtype -> NameSeeds -> Bool -> SolverConfig -> !PrimMap -> !Supply -> InferInput
+ Cryptol.TypeCheck: InferInput :: Range -> Map Name Schema -> Map Name TySyn -> Map Name Newtype -> NameSeeds -> Bool -> SolverConfig -> [FilePath] -> !PrimMap -> !Supply -> InferInput
- Cryptol.TypeCheck.AST: EComp :: Type -> Expr -> [[Match]] -> Expr
+ Cryptol.TypeCheck.AST: EComp :: Type -> Type -> Expr -> [[Match]] -> Expr
- Cryptol.TypeCheck.AST: From :: Name -> Type -> Expr -> Match
+ Cryptol.TypeCheck.AST: From :: Name -> Type -> Type -> Expr -> Match
- Cryptol.TypeCheck.Infer: checkHasType :: Expr -> Type -> Type -> InferM Expr
+ Cryptol.TypeCheck.Infer: checkHasType :: Type -> Type -> InferM ()
- Cryptol.TypeCheck.InferTypes: Goals :: (TypeMap Goal) -> Goals
+ Cryptol.TypeCheck.InferTypes: Goals :: (Set Goal) -> Goals
- Cryptol.TypeCheck.Monad: InferInput :: Range -> Map Name Schema -> Map Name TySyn -> Map Name Newtype -> NameSeeds -> Bool -> SolverConfig -> !PrimMap -> !Supply -> InferInput
+ Cryptol.TypeCheck.Monad: InferInput :: Range -> Map Name Schema -> Map Name TySyn -> Map Name Newtype -> NameSeeds -> Bool -> SolverConfig -> [FilePath] -> !PrimMap -> !Supply -> InferInput
- Cryptol.TypeCheck.Monad: KRW :: Map Name Kind -> KRW
+ Cryptol.TypeCheck.Monad: KRW :: Map Name Kind -> [(ConstraintSource, [Prop])] -> KRW
- Cryptol.TypeCheck.Monad: RO :: Range -> Map Name VarType -> [TParam] -> Map Name (DefLoc, TySyn) -> Map Name (DefLoc, Newtype) -> Map Int (Expr -> Expr) -> Bool -> Solver -> !PrimMap -> RO
+ Cryptol.TypeCheck.Monad: RO :: Range -> Map Name VarType -> [TParam] -> Map Name (DefLoc, TySyn) -> Map Name (DefLoc, Newtype) -> Map Int (Expr -> Expr) -> Bool -> Solver -> !PrimMap -> !(IORef Int) -> RO
- Cryptol.TypeCheck.Monad: runKindM :: Bool -> [(Name, Maybe Kind, Type)] -> KindM a -> InferM (a, Map Name Kind)
+ Cryptol.TypeCheck.Monad: runKindM :: Bool -> [(Name, Maybe Kind, Type)] -> KindM a -> InferM (a, Map Name Kind, [(ConstraintSource, [Prop])])
- Cryptol.TypeCheck.Solve: improveByDefaultingWith :: Solver -> [TVar] -> [Goal] -> IO ([TVar], [Goal], Subst, [Warning])
+ Cryptol.TypeCheck.Solve: improveByDefaultingWith :: Solver -> [TVar] -> [Goal] -> IO ([TVar], [Goal], Maybe Subst, [Warning])
- Cryptol.TypeCheck.Solver.Class: classStep :: Goal -> Solved
+ Cryptol.TypeCheck.Solver.Class: classStep :: Prop -> Solved
- Cryptol.TypeCheck.Solver.Numeric.Fin: cryIsFin :: Map TVar Interval -> Goal -> Solved
+ Cryptol.TypeCheck.Solver.Numeric.Fin: cryIsFin :: Map TVar Interval -> Prop -> Solved
- Cryptol.TypeCheck.Solver.Numeric.Fin: cryIsFinType :: Map TVar Interval -> Goal -> Type -> Solved
+ Cryptol.TypeCheck.Solver.Numeric.Fin: cryIsFinType :: Map TVar Interval -> Type -> Solved
- Cryptol.TypeCheck.Solver.Selector: tryHasGoal :: HasGoal -> InferM ()
+ Cryptol.TypeCheck.Solver.Selector: tryHasGoal :: HasGoal -> InferM (Bool, Bool)
- Cryptol.TypeCheck.Subst: substToList :: Subst -> Maybe [(TVar, Type)]
+ Cryptol.TypeCheck.Subst: substToList :: Subst -> [(TVar, Type)]

Files

bench/Main.hs view
@@ -7,11 +7,18 @@ -- Portability :  portable  {-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE ScopedTypeVariables #-} module Main where  import qualified Data.Text.Lazy     as T import qualified Data.Text.Lazy.IO  as T+import           System.FilePath ((</>))+import qualified System.Directory   as Dir +import qualified Cryptol.Eval as E+import qualified Cryptol.Eval.Monad as E+import qualified Cryptol.Eval.Value as E+ import qualified Cryptol.ModuleSystem.Base      as M import qualified Cryptol.ModuleSystem.Env       as M import qualified Cryptol.ModuleSystem.Monad     as M@@ -22,41 +29,50 @@ import qualified Cryptol.Parser.NoInclude as P  import qualified Cryptol.Symbolic as S+import qualified Cryptol.Symbolic.Value as S  import qualified Cryptol.TypeCheck     as T import qualified Cryptol.TypeCheck.AST as T  import qualified Cryptol.Utils.Ident as I +import qualified Data.SBV.Dynamic as SBV+ import Criterion.Main  main :: IO ()-main = defaultMain [+main = do+  cd <- Dir.getCurrentDirectory+  defaultMain [     bgroup "parser" [         parser "Prelude" "lib/Cryptol.cry"+      , parser "Extras"  "lib/Cryptol/Extras.cry"+      , parser "PreludeWithExtras" "bench/data/PreludeWithExtras.cry"       , parser "BigSequence" "bench/data/BigSequence.cry"       , parser "BigSequenceHex" "bench/data/BigSequenceHex.cry"       , parser "AES" "bench/data/AES.cry"       , parser "SHA512" "bench/data/SHA512.cry"       ]-  , bgroup "typechecker" [-        tc "Prelude" "lib/Cryptol.cry"-      , tc "BigSequence" "bench/data/BigSequence.cry"-      , tc "BigSequenceHex" "bench/data/BigSequenceHex.cry"-      , tc "AES" "bench/data/AES.cry"-      , tc "SHA512" "bench/data/SHA512.cry"+   , bgroup "typechecker" [+        tc cd "Prelude" "lib/Cryptol.cry"+      , tc cd "Extras"  "lib/Cryptol/Extras.cry"+      , tc cd "PreludeWithExtras" "bench/data/PreludeWithExtras.cry"+      , tc cd "BigSequence" "bench/data/BigSequence.cry"+      , tc cd "BigSequenceHex" "bench/data/BigSequenceHex.cry"+      , tc cd "AES" "bench/data/AES.cry"+      , tc cd "SHA512" "bench/data/SHA512.cry"       ]-  , bgroup "conc_eval" [-        ceval "AES" "bench/data/AES.cry" "bench bench_data"-      , ceval "SHA512" "bench/data/SHA512.cry" "testVector1 ()"+   , bgroup "conc_eval" [+        ceval cd "AES" "bench/data/AES.cry" "bench_correct"+      , ceval cd "ZUC" "bench/data/ZUC.cry" "ZUC_TestVectors"+      , ceval cd "SHA512" "bench/data/SHA512.cry" "testVector1 ()"       ]-  , bgroup "sym_eval" [-        seval "AES" "bench/data/AES.cry" "aesEncrypt (zero, zero)"-      , seval "ZUC" "bench/data/ZUC.cry"-          "ZUC_isResistantToCollisionAttack"-      , seval "SHA512" "bench/data/SHA512.cry" "testVector1 ()"+   , bgroup "sym_eval" [+        seval cd "AES" "bench/data/AES.cry" "bench_correct"+      , seval cd "ZUC" "bench/data/ZUC.cry" "ZUC_TestVectors"+      , seval cd "SHA512" "bench/data/SHA512.cry" "testVector1 ()"       ]-  ]+   ]  -- | Make a benchmark for parsing a Cryptol module parser :: String -> FilePath -> Benchmark@@ -73,8 +89,9 @@  -- | Make a benchmark for typechecking a Cryptol module. Does parsing -- in the setup phase in order to isolate typechecking-tc :: String -> FilePath -> Benchmark-tc name path =+tc :: String -> String -> FilePath -> Benchmark+tc cd name path =+  let withLib = M.withPrependedSearchPath [cd </> "lib"] in   let setup = do         bytes <- T.readFile path         let cfg = P.defaultConfig@@ -83,7 +100,7 @@                 }             Right pm = P.parseModule cfg bytes         menv <- M.initialModuleEnv-        (Right ((prims, scm, tcEnv), menv'), _) <- M.runModuleM menv $ do+        (Right ((prims, scm, tcEnv), menv'), _) <- M.runModuleM menv $ withLib $ do           -- code from `loadModule` and `checkModule` in           -- `Cryptol.ModuleSystem.Base`           let pm' = M.addPrelude pm@@ -97,18 +114,19 @@           return (prims, scm, tcEnv)         return (prims, scm, tcEnv, menv')   in env setup $ \ ~(prims, scm, tcEnv, menv) ->-    bench name $ nfIO $ M.runModuleM menv $ do+    bench name $ nfIO $ M.runModuleM menv $ withLib $ do       let act = M.TCAction { M.tcAction = T.tcModule                            , M.tcLinter = M.moduleLinter (P.thing (P.mName scm))                            , M.tcPrims  = prims                            }       M.typecheck act scm tcEnv -ceval :: String -> FilePath -> T.Text -> Benchmark-ceval name path expr =+ceval :: String -> String -> FilePath -> T.Text -> Benchmark+ceval cd name path expr =+  let withLib = M.withPrependedSearchPath [cd </> "lib"] in   let setup = do         menv <- M.initialModuleEnv-        (Right (texpr, menv'), _) <- M.runModuleM menv $ do+        (Right (texpr, menv'), _) <- M.runModuleM menv $ withLib $ do           m <- M.loadModuleByPath path           M.setFocusedModule (T.mName m)           let Right pexpr = P.parseExpr expr@@ -116,13 +134,18 @@           return texpr         return (texpr, menv')   in env setup $ \ ~(texpr, menv) ->-    bench name $ nfIO $ M.runModuleM menv $ M.evalExpr texpr+    bench name $ nfIO $ E.runEval $ do+      env' <- E.evalDecls (S.allDeclGroups menv) mempty+      (e :: E.Value) <- E.evalExpr env' texpr+      E.forceValue e -seval :: String -> FilePath -> T.Text -> Benchmark-seval name path expr =++seval :: String -> String -> FilePath -> T.Text -> Benchmark+seval cd name path expr =+  let withLib = M.withPrependedSearchPath [cd </> "lib"] in   let setup = do         menv <- M.initialModuleEnv-        (Right (texpr, menv'), _) <- M.runModuleM menv $ do+        (Right (texpr, menv'), _) <- M.runModuleM menv $ withLib $ do           m <- M.loadModuleByPath path           M.setFocusedModule (T.mName m)           let Right pexpr = P.parseExpr expr@@ -130,6 +153,8 @@           return texpr         return (texpr, menv')   in env setup $ \ ~(texpr, menv) ->-    bench name $ flip nf texpr $ \texpr' ->-      let senv = S.evalDecls mempty (S.allDeclGroups menv)-      in S.evalExpr senv texpr'+    bench name $ nfIO $ E.runEval $ do+      env' <- E.evalDecls (S.allDeclGroups menv) mempty+      (e :: S.Value) <- E.evalExpr env' texpr+      E.io $ SBV.generateSMTBenchmark False $+         return (S.fromVBit e)
bench/data/AES.cry view
@@ -242,9 +242,17 @@  type nblocks = 128 -bench_data : [128 * nblocks]-bench_data = random 0+property bench_correct = bench bench_data == bench_result  bench : [128 * nblocks] -> [128 * nblocks] bench data = join [ aesEncrypt (block, key) | block <- split data ]   where key = 0x3243f6a8885a308d313198a2e0370734++bench_data : [128 * nblocks]+bench_data = //random 0+  0xcddf97f18ad18da94ae27558e975608f673c896a718cffbc90c746160a003d540e353ea1a32cf650c25298cf353b36849f68360e07ad40a9e6c0e4dd2351dce8c06dd82c27642a5e9ce3804780d531af41768b4697b45383d58dfd98c9f2e6d5788e671229529d239b40fc9a52436c437e716cef3c5503d567eff3c2f35d806ae4431455ec096526b1b584cb4a80efde3174361e912a46bf8b7b8d3ca4cebacea935ccd766976614885f5330441ca4acee37c9728fb53708042d9952d8ef3ca544c870a7ee689f8b6d78764368e849274946d0e8bdc69f4a4004cbbce034f1d0a6f8447a756a5f9c217e377909d0c4bde859732e7263c03013c623cb1f2478b77f7838b3d3581e0aba9da951dd18466a131bca89252fc17b9bbe475530d425ac7a79cbc26a941dcc16ded680dddada735c76fa469ebeadf1c8fc33a2c7dc00b865eaec95f1448583425302a9023d39c3bb794685a5e30f196f7c0bdc2b8790d35f8bb9c4359e17ca53e8450da4db030bb67fb4cab68ef4a5edfbe120f1c9824b4faa0cc767bb7304238a798534f065cc1cc8fe310d76c2b440b64348a8e16873eddb5931313573c2cb43a47c2ff0f9c8ec264a0a6ec6474c1056fc7f376c01e5d3b6fea382b5086c7c80bb4c5505f2d4f18dc01cff4baa71eac658ca78e5acbde546dbe85dd71708fb46c8ec00ef75b9b577f93a3c550781a642d5bc4fa2da325656f737d272875b9185fe86a0e0e3eefaf51294d0f06340db93715c99df443e286c0d1e2ae869a7e0d705d6369362a220617ac4803fd205de679ea6ed82881cc2315d73c9cc8f4512ee61afaf127eac098d1d31b075c16aa902024594337c6b2a290cedcbd44190105d20de7ef16fb310400ccbc9ca6a1f4de0a9b1f82b780ee3eda52af664b883c32dd70c860905c0f9e83ee0ae5fc016b81c4c4ca70c05703035637e4988a827bf6e230ba30dc78b8c5663e14273827fb6c4aa700b95a04f1456ce15d18740ee79b7aeb85feffac9f5bd54c9a9bd494a9fc8fab4280316ac8f6552849a798e2b5d7326bb2208fdf2cf6b372311edcd87bb2b1805afd1b6e085fad1a28bc4578e1abea57227f49c141d7d08893d8083249e32cc9645748684cc5d4d492abbdaf5f8373b5e2e4bd91c15346e1d455415395bc0342185665ebeb94fda5fdf7e601961bf1f1109373e935a077a0088980844ce1c87f347380f3c805b01407cf9154f5818db41a6f5d87994df790421a9dbf7d56c11a5e723ec853f32bcf7dc0eef03bbf164564167c6212c35ddd9d6112eb43e4826d1da8f065b804fd48b5ff863b4f4246ba6ebaef90396843e084168d6826abf5f6b0e82c7a7a96707e650e86f82862c5910e0c4d6a48182656e0e76be4017c739feb2da56bb69db4b0885c772180607ce880b15064b5b9878cd1c3d4ae9657c5fdf5ca5d7755807d74e2a57aed4e9fe90c49ed4f01ae3cb812ada6b15c7009d98930d8a41cf23e8f5a962e93c8cecef6044cfcc8843d1f6b5dfb868de036fa5d992c861f056f504f54e8d077028143a2807676c02faf35435ee43cb1ece1a82c7f142be774c824b7e8e3fcad737f58f4818994842ab40a211f9569ad476beef0f2f97be0fb515cf0754641748b2af38d58937c3428a147647911734d54bf06be7f3fcab19b874ff52893af6a45c44adf11c17bf177fc0e90539327373e6594e249aca3a386272d1405455e7e8b463029c0460a31b59b9dc1a15d18cdf1997df250721735651c5e7de7059cb755aa4a0c99962e6485b2ccb02ffecb022fc867e36a63ef77ee8740af2e6f25b0d497d3bcc213a939a47a64057caf107e79661d15f469f8e32b2175bed98af21776a9a2cde4e4982ecd695b4dcef8822806cf74ac73aa5b9d8e6dc0a6d2b97b75d11553a9478296631b7a3c340113247f32bf7a7c42e85b9e517b4f9a09ab453de795f156f09d2704bfa56f5ade38e0eae826796bd54165967332985ecdd4991b8e2bb4016e0d2da173690feace03245c2ef868b44ea7892c0ce15d818a32e5bf57d53a1d86cbb3074221083cfa570c17104da26c063b3a349ce35facd3b7bf267383235a5620217d58201c74105302f3445e024313338fe93dd6f617088b41c836083ceae512782e458c4f5c74bd1987ccb098d1d89fe63a5e5881e56b0c5aba87ef2c5e8d6333d91e9dcbdc45a3c16d67b32c4e51e95231aa7e0b9342c599ebdc6ebb6e4dce1fcd98add42d6ab08707a6f5a38154ad5a3674e8a05105c5ecec180f9661122da31a94e9ad7d337ff5ab4a28a5c5cba9a393f484ed5e5f37bbb4b7caecbf9cbb432cae0b2f6bd5ce6068104f012d6428a9b172847e18f12708de6248cdf0401c865292645fb30114f4f4b53d4473b6ffc53ae0870e85c24f631f52c04d227ea9bc0a59828b6f9eafd95cac13ccfb1cdbae3550b0cd99e1812346d5d01b5a782d1d50fbedf858a4a044fd9384e3a6c10cb4227e276c7399b897b9dcbd2a5cb4e14d8341dd32029938f444fa3dcf2d23198f6bf042439cf96a534f3041774a6c3d5b6bb5bfcd8d7af57402431c7dd758da93ccef39495977cece58087ecc80b278d3e9966b7bd8b183f0379f28aa3c9a885065b8a090f3af15a15acb553b36a73d25a581e7f54f5e1f6f49c4f638ce40ba67629e910a04444d5f6b66c4548b611f851feb08d64fa4d99b83ad218d182d0e86e7f87d4923599a547effed6b9c86e853aef9e60767bff33de916bd799eaf3922ae80abadcc91c95f47e702e2fbd2631d0b77ef85f092204141250c4162b0369be64c1d6bdc2d58c02981cc1de13ae3efba34fbfb3dd0ef3ac4c502a1b87c6ee6bc1a9131b098a85d31560c60c599398d0bd80b37bf4d20df81522b2acc749178fb785+++bench_result : [128 * nblocks]+bench_result =+  0x9b00ae426bcc2cd6150a0af62b8be77fbb389c5b061a893588d1918f50f1f31ea1183bd81fd7faae77b4f6321a17130f46e21a2653b1f7dc520bf13305c5e7141cee9d8809d58b9b8ec2aa225120ea6ecec21fba09678bbbeda0b483ad299a8adb7b306599531cf717fd67a1c25e2adeeb48521619991e122b053c3a842936b14b6eea74734a6fc2abea6c1fc4780b2df8059ce9715299eeff7b6577409ebae71285929379cd065df0c249f9696e1b28da476ae52d55d0b1f676c619271d37d4211906d402e4eaf4df3031be5bc00962b7747e7b880bf55bee2882e5008e1c1fed70beb7e54be0545100a2e122b94536b888aaea25dde9e0715dfc892dee2b4fb8e94c6b15a2e77adad1f98e50ffef837309998fcdfd9bcb3d16dcd2a162a3b66c2533474981ba72321aaa9a611c670015fa6cbf9f7d7f26b3da415eccf01872cc3a686f659c0cc0d1d08a1d41470b0ceab527bd6499433a2f2df865982b3f616c246fe49f3a15b676983f7f853f6355bc2f4cdc39e5a29347f7031ab7d2659d0ddfb259fbdfe37eaee2e4dcbdfe0ac584038c5a98d85182ca2424f0e75b7f84d512828ed20bbd05065ed4ba0b850b51c31ecb231f2c879993038d7c9487e0fa46a84a02d4f5408faabd9f41edbbef5d6183dd880ea5b7272a2c46900e02357550c036f4b84168a3e891cd8fe33c2d521ce060a2863bb735e97614d0f5bf40068bfacb02297351db4a5bd80d8140a7e0734550967b2445d4236411e04f83e7f15f5148c9d758994cb8427238cea307ddde786dd74e5565b1dd905d085ebb5a7c725d72164adeeafd7387636c31eee2e729bd0fdf95686f957befdb190101cc23cc9b8e39c652e937bd1e21adad99b86d3b2ed0e4ed4ea4bd9d9ed2ad2b99adf40577fba6b25364cd6d96f79cb0f24ae551021904b57c1d469cfac780ea8469c530ab9d2fe6e98c270c5e1babed259878f48ab5824ebf327d8d18fd2e460334cc0ca9f3b0208c0b322a074185830c460cf58c45cef2234aa5ceb6ac294325bd4d4f9e569531165b9e731c84ffc92f453ce92464658592396f83555284a5f69288e3263d7bd083fa3257b0a11a9d8e4702ed06ebd172eacb7f559527637e0259573b1723c079465d593d5e89163e187ae7ac629ed75e398274daf9c420cac2d3b8f0de82dc9d50cd85d93460213416e3e5c0960c563d26fdb56e1e0dc79b251e95364389f6acbd78edd2664be1edc789b2c7a45b2101c69b3cdb8f9f6a2d7316d2cdca02fb5119d76c9bc93f7bc4e075eee1d453fa4668f368919d14035a7ba293d9787744f44e734443e9abc79a8d7aea71918f0a925026809cf43ae2fd1f6ea00fae2f87d4e7d83e4e86c81695d77e48d5f7080d61d878bde080cec46f4ed19d78f2b0c14db0bb6c871e6506064aa1c7b23c7d2baa9b5db5be3fc94923e09fddc13cd8322d05d990b3a9c5ce418c542eb80b1839a23ed7bc0b588ec957db3df1e1389ff0d541ec2f5331ab92fa7f85efa5ae9ec1c513365df179bb29d4f1914940c68468bd12e9fce04c8d08b6d3f1a4e2d632303ca99656bb248efbb6becad7ac6535678d6534aec746fbca6ec3dec85e4db505872e88bde65214b92eba09b91aff63c5db7e440a1f0ef0bca38759f9aaa35c0b8c565ec4307cc07a3226c992163aaa968ab9b9e507fa4b1910d1c24442615ffea299a8d7fcaf7aa2db3fac83d9f3b8a90bd9ae9100167944e01a07c011d0115870f5079d991d3dccd71fdd23b383b69409a1ba519c22194de6d1048e1195a4c716e0b27055aef816218d94972177732b0abd9df432d8f09293d8b22cc83e05522f7fa46742cd29b63357096601137130dc772717f8f4d02b5651fae2d74f72b25e9266090b95bf3ecb6ddda78edfa47346cf336e79548f9ea09eebe95da8903c86af35cb0abdaa4b78f05b2ef66342072b229a7f030e5b2f8e2ead7a8f5ea2a512cf0f02a4b0fc23e5aef4518f1c40674f5552a040cddf2daf47eec38103e6703720bdf40d68f8de4a9c9a39b1a21a2ea15337772526128abb3234bdce85dd7187a827f7aed625b862887f4ef41f656cc76c5311e34e654e0babe2230d3c1f7554106bab1dcdf18361e5579cf794af967421a1f06f80cfc254a9fa0a5b2a7bebd6dc8bbbf178f9647e356a4fd61e41301386784ba90dfaf5823a0007e50e61a0c3720b9b54edb800ba805e3817cddc7015febed997de87030f3341fad7249ce4530d55f5e0b3aac5a9de0d72c6c5672bc29440354d3a7d88873abdd090f41fa1db8740736583f74c7bfe526b283274f4bc08dea4884ccd75d34df9d8410f7e488b541f467331c5e7da352faa1019c394535472aa0f1ed1512928591e0b4335271df7a7d2d9d7fa1f7f4522be394b39bf15a7bc7a97ad21e171a638eb27d44efd57921938ed70335e3f3a8922553392db8a07e02cd4dc1184edbfbadaf09f97c50268d25dd5e7064968fde486d68b1051cef118d80c7a2c911a8cad22b26fd94f559cc12972b655ce014914cd3c20542815a0ff98ee166611eb2edc147bf2989d4fa1d72d88f7d211d05fe8e312b441edb3627982da6606d0cfa1c696979af5ff371e293c0a749f172343ab5f87ccd8a9d1c364f032e763a939f0696989a5316b48df43763d42170f598326579acba84e16508b5d4ffac1723c9bb98f7736e961c67caf3243b07760b3be602be9995a1a6b8c5360357e9fefab445229ccddd6214476a2c3af0eeadcd067db77ecaf7c84d605b99c89ab583edac68c3c8d951cce207c2df274709fe2d25477f14a8e50bc05f82b2cf49d9b56d97182b90a9395d90f23b9ee734d70d9312c9f6278f0ecd5f90c82f67693a589a94a6555f3abd8eac5408259879603acdc67b6fb
+ bench/data/PreludeWithExtras.cry view
@@ -0,0 +1,506 @@+/*+ * Copyright (c) 2013-2016 Galois, Inc.+ * Distributed under the terms of the BSD3 license (see LICENSE file)+ */++module Cryptol where++/**+ * The value corresponding to a numeric type.+ */+primitive demote : {val, bits} (fin val, fin bits, bits >= width val) => [bits]++infixr 10 ||+infixr 20 &&+infix  30 ==, ===, !=, !==+infix  40 >, >=, <, <=+infixl 50 ^+infixr 60 #+infixl 70 <<, <<<, >>, >>>+infixl 80 +, -+infixl 90 *, /, %+infixr 95 ^^+infixl 100 @, @@, !, !!++/**+ * Add two values.+ *  * For words, addition uses modulo arithmetic.+ *  * Structured values are added element-wise.+ */+primitive (+) : {a} (Arith a) => a -> a -> a++/**+ * For words, subtraction uses modulo arithmetic.+ * Structured values are subtracted element-wise. Defined as:+ * a - b = a + negate b+ * See also: `negate'.+ */+primitive (-) : {a} (Arith a) => a -> a -> a++/**+ * For words, multiplies two words, modulus 2^^a.+ * Structured values are multiplied element-wise.+ */+primitive (*) : {a} (Arith a) => a -> a -> a++/**+ * For words, divides two words, modulus 2^^a.+ * Structured values are divided element-wise.+ */+primitive (/) : {a} (Arith a) => a -> a -> a++/**+ * For words, takes the modulus of two words, modulus 2^^a.+ * Over structured values, operates element-wise.+ * Be careful, as this will often give unexpected results due to interaction of+ * the two moduli.+ */+primitive (%) : {a} (Arith a) => a -> a -> a++/**+ * For words, takes the exponent of two words, modulus 2^^a.+ * Over structured values, operates element-wise.+ * Be careful, due to its fast-growing nature, exponentiation is prone to+ * interacting poorly with defaulting.+ */+primitive (^^) : {a} (Arith a) => a -> a -> a++/**+ * Log base two.+ *+ * For words, computes the ceiling of log, base 2, of a number.+ * Over structured values, operates element-wise.+ */+primitive lg2 : {a} (Arith a) => a -> a+++type Bool = Bit++/**+ * The constant True. Corresponds to the bit value 1.+ */+primitive True  : Bit++/**+ * The constant False. Corresponds to the bit value 0.+ */+primitive False : Bit++/**+ * Returns the twos complement of its argument.+ * Over structured values, operates element-wise.+ * negate a = ~a + 1+ */+primitive negate : {a} (Arith a) => a -> a++/**+ * Binary complement.+ */+primitive complement : {a} a -> a++/**+ * Operator form of binary complement.+ */+(~) : {a} a -> a+(~) = complement++/**+ * Less-than. Only works on comparable arguments.+ */+primitive (<) : {a} (Cmp a) => a -> a -> Bit++/**+ * Greater-than of two comparable arguments.+ */+primitive (>) : {a} (Cmp a) => a -> a -> Bit++/**+ * Less-than or equal of two comparable arguments.+ */+primitive (<=) : {a} (Cmp a) => a -> a -> Bit++/**+ * Greater-than or equal of two comparable arguments.+ */+primitive (>=) : {a} (Cmp a) => a -> a -> Bit++/**+ * Compares any two values of the same type for equality.+ */+primitive (==) : {a} (Cmp a) => a -> a -> Bit++/**+ * Compares any two values of the same type for inequality.+ */+primitive (!=) : {a} (Cmp a) => a -> a -> Bit++/**+ * Compare the outputs of two functions for equality+ */+(===) : {a,b} (Cmp b) => (a -> b) -> (a -> b) -> (a -> Bit)+f === g = \ x -> f x == g x++/**+ * Compare the outputs of two functions for inequality+ */+(!==) : {a,b} (Cmp b) => (a -> b) -> (a -> b) -> (a -> Bit)+f !== g = \x -> f x != g x++/**+ * Returns the smaller of two comparable arguments.+ */+min : {a} (Cmp a) => a -> a -> a+min x y = if x < y then x else y++/**+ * Returns the greater of two comparable arguments.+ */+max : {a} (Cmp a) => a -> a -> a+max x y = if x > y then x else y++/**+ * Logical `and' over bits. Extends element-wise over sequences, tuples.+ */+primitive (&&) : {a} a -> a -> a++/**+ * Logical `or' over bits. Extends element-wise over sequences, tuples.+ */+primitive (||) : {a} a -> a -> a++/**+ * Logical `exclusive or' over bits. Extends element-wise over sequences, tuples.+ */+primitive (^) : {a} a -> a -> a++/**+ * Gives an arbitrary shaped value whose bits are all False.+ * ~zero likewise gives an arbitrary shaped value whose bits are all True.+ */+primitive zero : {a} a++/**+ * Left shift.  The first argument is the sequence to shift, the second is the+ * number of positions to shift by.+*/+primitive (<<) : {a, b, c} (fin b) => [a]c -> [b] -> [a]c++/**+ * Right shift.  The first argument is the sequence to shift, the second is the+ * number of positions to shift by.+ */+primitive (>>) : {a, b, c} (fin b) => [a]c -> [b] -> [a]c++/**+ * Left rotate.  The first argument is the sequence to rotate, the second is the+ * number of positions to rotate by.+ */+primitive (<<<) : {a, b, c} (fin a, fin b) => [a]c -> [b] -> [a]c++/**+ * Right rotate.  The first argument is the sequence to rotate, the second is+ * the number of positions to rotate by.+ */+primitive (>>>) : {a, b, c} (fin a, fin b) => [a]c -> [b] -> [a]c++primitive (#) : {front, back, a} (fin front) => [front]a -> [back]a+                                             -> [front + back] a+++/**+ * Split a sequence into a tuple of sequences.+ */+primitive splitAt : {front, back, a} (fin front) => [front + back]a+                                                 -> ([front]a, [back]a)+/**+ * Joins sequences.+ */+primitive join : {parts, each, a} (fin each) => [parts][each]a+                                             -> [parts * each]a++/**+ * Splits a sequence into 'parts' groups with 'each' elements.+ */+primitive split : {parts, each, a} (fin each) => [parts * each]a+                                              -> [parts][each]a++/**+ * Reverses the elements in a sequence.+ */+primitive reverse : {a, b} (fin a) => [a]b -> [a]b++/**+ * Transposes an [a][b] matrix into a [b][a] matrix.+ */+primitive transpose : {a, b, c} [a][b]c -> [b][a]c++/**+ * Index operator.  The first argument is a sequence.  The second argument is+ * the zero-based index of the element to select from the sequence.+ */+primitive (@) : {a, b, c} (fin c) => [a]b -> [c] -> b++/**+ * Bulk index operator.  The first argument is a sequence.  The second argument+ * is a sequence of the zero-based indices of the elements to select.+ */+primitive (@@) : {a, b, c, d} (fin d) => [a]b -> [c][d] -> [c]b++/**+ * Reverse index operator.  The first argument is a finite sequence.  The second+ * argument is the zero-based index of the element to select, starting from the+ * end of the sequence.+ */+primitive (!) : {a, b, c} (fin a, fin c) => [a]b -> [c] -> b++/**+ * Bulk reverse index operator.  The first argument is a finite sequence.  The+ * second argument is a sequence of the zero-based indices of the elements to+ z select, starting from the end of the sequence.+ */+primitive (!!) : {a, b, c, d} (fin a, fin d) => [a]b -> [c][d] -> [c]b++primitive fromThen : {first, next, bits, len}+                     ( fin first, fin next, fin bits+                     , bits >= width first, bits >= width next+                     , lengthFromThen first next bits == len) => [len][bits]++primitive fromTo : {first, last, bits} (fin last, fin bits, last >= first,+                              bits >= width last) => [1 + (last - first)][bits]++primitive fromThenTo : {first, next, last, bits, len} (fin first, fin next,+                        fin last, fin bits, bits >= width first,+                        bits >= width next, bits >= width last,+                        lengthFromThenTo first next last == len) => [len][bits]++primitive infFrom : {bits} (fin bits) => [bits] -> [inf][bits]++primitive infFromThen : {bits} (fin bits) => [bits] -> [bits] -> [inf][bits]++primitive error : {at, len} (fin len) => [len][8] -> at+++/**+ * Performs multiplication of polynomials over GF(2).+ */+primitive pmult : {a, b} (fin a, fin b) => [a] -> [b] -> [max 1 (a + b) - 1]++/**+ * Performs division of polynomials over GF(2).+ */+primitive pdiv : {a, b} (fin a, fin b) => [a] -> [b] -> [a]++/**+ * Performs modulus of polynomials over GF(2).+ */+primitive pmod : {a, b} (fin a, fin b) => [a] -> [1 + b] -> [b]++/**+ * Generates random values from a seed.  When called with a function, currently+ * generates a function that always returns zero.+ */+primitive random : {a} [256] -> a++type String n = [n][8]+type Word n = [n]+type Char   = [8]++take : {front,back,elem} (fin front) => [front + back] elem -> [front] elem+take (x # _) = x++drop : {front,back,elem} (fin front) => [front + back] elem -> [back] elem+drop ((_ : [front] _) # y) = y++tail : {a, b} [1 + a]b -> [a]b+tail xs = drop`{1} xs++width : {bits,len,elem} (fin len, fin bits, bits >= width len) => [len] elem -> [bits]+width _ = `len++undefined : {a} a+undefined = error "undefined"++groupBy : {each,parts,elem} (fin each) =>+  [parts * each] elem -> [parts][each]elem+groupBy = split`{parts=parts}++/**+ * Define the base 2 logarithm function in terms of width+ */+type lg2 n = width (max n 1 - 1)++/**+ * Debugging function for tracing.  The first argument is a string,+ * which is prepended to the printed value of the second argument.+ * This combined string is then printed when the trace function is+ * evaluated.  The return value is equal to the third argument.+ *+ * The exact timing and number of times the trace message is printed+ * depend on the internal details of the Cryptol evaluation order,+ * which are unspecified.  Thus, the output produced by this+ * operation may be difficult to predict.+ */+primitive trace : {n, a, b} [n][8] -> a -> b -> b++/**+ * Debugging function for tracing values.  The first argument is a string,+ * which is prepended to the printed value of the second argument.+ * This combined string is then printed when the trace function is+ * evaluated.  The return value is equal to the second argument.+ *+ * The exact timing and number of times the trace message is printed+ * depend on the internal details of the Cryptol evaluation order,+ * which are unspecified.  Thus, the output produced by this+ * operation may be difficult to predict.+ */+traceVal : {n, a} [n][8] -> a -> a+traceVal msg x = trace msg x x++/*+ * Copyright (c) 2016 Galois, Inc.+ * Distributed under the terms of the BSD3 license (see LICENSE file)+ *+ * This module contains definitions that we wish to eventually promote+ * into the Prelude, but which currently cause typechecking of the+ * Prelude to take too long (see #299)+ */++infixr 5 ==>++/**+ * Logical implication+ */+(==>) : Bit -> Bit -> Bit+a ==> b = if a then b else True++/**+ * Logical negation+ */+not : {a} a -> a+not a = ~ a++/**+ * Conjunction+ */+and : {n} (fin n) => [n]Bit -> Bit+and xs = ~zero == xs++/**+ * Disjunction+ */+or : {n} (fin n) => [n]Bit -> Bit+or xs = zero != xs++/**+ * Conjunction after applying a predicate to all elements.+ */+all : {a,n} (fin n) => (a -> Bit) -> [n]a -> Bit+all f xs = and (map f xs)++/**+ * Disjunction after applying a predicate to all elements.+ */+any : {a,n} (fin n) => (a -> Bit) -> [n]a -> Bit+any f xs = or (map f xs)++/**+ * Map a function over an array.+ */+map : {a, b, n} (a -> b) -> [n]a -> [n]b+map f xs = [f x | x <- xs]++/**+ * Functional left fold.+ *+ * foldl (+) 0 [1,2,3] = ((0 + 1) + 2) + 3+ */+foldl : {a, b, n} (fin n) => (a -> b -> a) -> a -> [n]b -> a+foldl f acc xs = ys ! 0+ where ys = [acc] # [f a x | a <- ys | x <- xs]++/**+ * Functional right fold.+ *+ * foldr (-) 0 [1,2,3] = 0 - (1 - (2 - 3))+ */+foldr : {a,b,n} (fin n) => (a -> b -> b) -> b -> [n]a -> b+foldr f acc xs = ys ! 0+ where ys = [acc] # [f x a | a <- ys | x <- reverse xs]++/**+ * Compute the sum of the words in the array.+ */+sum : {a,n} (fin n, Arith a) => [n]a -> a+sum xs = foldl (+) zero xs++/**+ * Scan left is like a fold that emits the intermediate values.+ */+scanl : {b, a, n}  (b -> a -> b) -> b -> [n]a -> [n+1]b+scanl f acc xs = ys+ where+  ys = [acc] # [f a x | a <- ys | x <- xs]++/**+ * Scan right+ */+scanr : {a,b,n} (fin n) => (a -> b -> b) -> b -> [n]a -> [n+1]b+scanr f acc xs = reverse ys+    where+     ys = [acc] # [f x a | a <- ys | x <- reverse xs]++/**+ * Zero extension+ */+extend : {total,n} (fin total, fin n, total >= n) => [n]Bit -> [total]Bit+extend n = zero # n++/**+ * Signed extension. `extendSigned 0bwxyz : [8] == 0bwwwwwxyz`.+ */+extendSigned : {total,n} (fin total, fin n, n >= 1, total >= n+1) => [n]Bit -> [total]Bit+extendSigned  xs = repeat (xs @ 0) # xs++/**+ * Repeat a value.+ */+repeat : {n, a} a -> [n]a+repeat x = [ x | _ <- zero ]++/**+ * `elem x xs` Returns true if x is equal to a value in xs.+ */+elem : {n,a} (fin n, Cmp a) => a -> [n]a -> Bit+elem a xs = any (\x -> x == a) xs++/**+ * Create a list of tuples from two lists.+ */+zip : {a,b,n} [n]a -> [n]b -> [n](a,b)+zip xs ys = [(x,y) | x <- xs | y <- ys]++/**+ * Create a list by applying the function to each pair of elements in the input.+ * lists+ */+zipWith : {a,b,c,n} (a -> b -> c) -> [n]a -> [n]b -> [n]c+zipWith f xs ys = [f x y | x <- xs | y <- ys]++/**+ * Transform a function into uncurried form.+ */+uncurry : {a,b,c} (a -> b -> c) -> (a,b) -> c+uncurry f = \(a,b) -> f a b++/**+ * Transform a function into curried form.+ */+curry : {a,b,c} ((a, b) -> c) -> a -> b -> c+curry f = \a b -> f (a,b)++/**+ * Map a function iteratively over a seed value, producing an infinite+ * list of successive function applications.+ */+iterate : { a } (a -> a) -> a -> [inf]a+iterate f x = [x] # [ f v | v <- iterate f x ]
bench/data/SHA512.cry view
@@ -2,11 +2,14 @@  module SHA512 where +/* sha512 : {b, a} (a*1024 == 128 + b + 1 + 1024 - (b+129) % 1024,                  a*1024 % 1024 == 0,                  a * 1024 - b >= 129,                  2^^128 - 1 >= b,                  fin (a + 1)) => [b] -> [512]++                 */ sha512 M = result   where     M' = (pad M)
− cryptol-server/Cryptol/Aeson.hs
@@ -1,179 +0,0 @@--- |--- Module      :  $Header$--- Copyright   :  (c) 2015-2016 Galois, Inc.--- License     :  BSD3--- Maintainer  :  cryptol@galois.com--- Stability   :  provisional--- Portability :  portable------ Orphan 'FromJSON' and 'ToJSON' instances for certain Cryptol--- types. Since these are meant to be consumed over a wire, they are--- mostly focused on base values and interfaces rather than a full--- serialization of internal ASTs and such.--{-# LANGUAGE ExtendedDefaultRules #-}-{-# LANGUAGE TemplateHaskell #-}-{-# LANGUAGE LambdaCase #-}-{-# LANGUAGE FlexibleInstances #-}-{-# LANGUAGE RecordWildCards #-}-{-# OPTIONS_GHC -Wall -fno-warn-orphans -fno-warn-type-defaults #-}-module Cryptol.Aeson where--import Control.Applicative-import Control.Exception-import Data.Aeson-import Data.Aeson.TH-import qualified Data.Map as M-import qualified Data.Text as T--import qualified Cryptol.Eval.Error as E-import qualified Cryptol.Eval.Value as E-import qualified Cryptol.ModuleSystem as M-import qualified Cryptol.ModuleSystem.Monad as M-import qualified Cryptol.ModuleSystem.Renamer as M-import Cryptol.ModuleSystem.Interface-import Cryptol.ModuleSystem.Name-import qualified Cryptol.Parser as P-import qualified Cryptol.Parser.AST as P-import qualified Cryptol.Parser.Lexer as P-import qualified Cryptol.Parser.NoInclude as P-import qualified Cryptol.Parser.NoPat as NoPat-import qualified Cryptol.Parser.Position as P-import Cryptol.REPL.Monad-import qualified Cryptol.Testing.Concrete as Test-import qualified Cryptol.TypeCheck.AST as T-import qualified Cryptol.TypeCheck.InferTypes as T-import Cryptol.Utils.Ident-import Cryptol.Utils.PP hiding (empty)--instance ToJSON Doc where-  toJSON = String . T.pack . render--instance ToJSON E.Value where-  toJSON = \case-    E.VRecord fs -> object-      [ "record" .= fs ]-    E.VTuple vs -> object-      [ "tuple" .= vs ]-    E.VBit b -> object-      [ "bit" .= b ]-    E.VSeq isWord xs -> object-      [ "sequence" .= object [ "isWord" .= isWord, "elements" .= xs ] ]-    E.VWord w -> object-      [ "word" .= w ]-    E.VStream _ -> object-      [ "stream" .= object [ "@note" .= "streams not supported" ] ]-    E.VFun _ -> object-      [ "function" .= object [ "@note" .= "functions not supported" ] ]-    E.VPoly _ -> object-      [ "poly" .= object [ "@note" .= "polymorphic values not supported" ] ]--instance FromJSON E.Value where-  parseJSON = withObject "Value" $ \o ->-        E.VRecord <$> o .: "record"-    <|> E.VTuple <$> o .: "tuple"-    <|> E.VBit <$> o .: "bit"-    <|> do s <- o .: "sequence"-           E.VSeq <$> s .: "isWord" <*> s .: "elements"-    <|> E.VWord <$> o .: "word"-    <|> error ("unexpected JSON value: " ++ show o)--instance ToJSON P.Token where-  toJSON = toJSON . pp--instance ToJSON REPLException where-  toJSON = \case-    ParseError pe -> object-      [ "ParseError" .= pe ]-    FileNotFound fp -> object-      [ "FileNotFound" .= fp ]-    DirectoryNotFound fp -> object-      [ "DirectoryNotFound" .= fp ]-    NoPatError npe -> object-      [ "NoPatError" .= npe ]-    NoIncludeError nie -> object-      [ "NoIncludeError" .= nie ]-    EvalError ee -> object-      [ "EvalError" .= ee ]-    ModuleSystemError _nameDisp me -> object-      [ "ModuleSystemError" .= me ]-    EvalPolyError sch -> object-      [ "EvalPolyError" .= sch ]-    TypeNotTestable ty -> object-      [ "TypeNotTestable" .= ty ]--instance ToJSON IOException where-  toJSON exn = object-    [ "IOException" .= show exn ]--instance ToJSON M.RenamerError where-  toJSON err = object-    [ "renamerError" .= pp err ]--instance ToJSON T.Error where-  toJSON err = object-    [ "inferError" .= pp err ]--instance ToJSON E.BV where-  toJSON = \case-    E.BV w v -> object-      [ "bitvector" .= object [ "width" .= w, "value" .= v ] ]--instance FromJSON E.BV where-  parseJSON = withObject "BV" $ \o -> do-    bv <- o .: "bitvector"-    E.BV <$> bv .: "width" <*> bv .: "value"--instance ToJSON Test.TestResult where-  toJSON = \case-    Test.Pass -> object [ "Pass" .= Null ]-    Test.FailFalse args -> object [ "FailFalse" .= args ]-    Test.FailError err args -> object-      [ "FailError" .= show (pp err), "args" .= args ]--instance (ToJSON v) => ToJSON (M.Map Name v) where-    toJSON = toJSON . M.mapKeys (unpackIdent . nameIdent)-    {-# INLINE toJSON #-}--$(deriveJSON defaultOptions { sumEncoding = ObjectWithSingleField } ''NameInfo)-$(deriveToJSON defaultOptions { sumEncoding = ObjectWithSingleField } ''E.EvalError)-$(deriveToJSON defaultOptions { sumEncoding = ObjectWithSingleField } ''P.ParseError)-$(deriveJSON defaultOptions { sumEncoding = ObjectWithSingleField } ''P.Position)-$(deriveToJSON defaultOptions { sumEncoding = ObjectWithSingleField } ''P.Located)-$(deriveToJSON defaultOptions { sumEncoding = ObjectWithSingleField } ''P.IncludeError)-$(deriveToJSON defaultOptions { sumEncoding = ObjectWithSingleField } ''P.Schema)-$(deriveToJSON defaultOptions { sumEncoding = ObjectWithSingleField } ''P.Type)-$(deriveToJSON defaultOptions { sumEncoding = ObjectWithSingleField } ''P.TParam)-$(deriveToJSON defaultOptions { sumEncoding = ObjectWithSingleField } ''P.Prop)-$(deriveToJSON defaultOptions { sumEncoding = ObjectWithSingleField } ''P.Named)-$(deriveToJSON defaultOptions { sumEncoding = ObjectWithSingleField } ''P.Kind)-$(deriveToJSON defaultOptions { sumEncoding = ObjectWithSingleField } ''NoPat.Error)-$(deriveToJSON defaultOptions { sumEncoding = ObjectWithSingleField } ''M.ModuleError)-$(deriveToJSON defaultOptions { sumEncoding = ObjectWithSingleField } ''M.ImportSource)-$(deriveToJSON defaultOptions { sumEncoding = ObjectWithSingleField } ''T.Import)-$(deriveToJSON defaultOptions { sumEncoding = ObjectWithSingleField } ''T.ImportSpec)-$(deriveToJSON defaultOptions { sumEncoding = ObjectWithSingleField } ''T.Type)-$(deriveToJSON defaultOptions { sumEncoding = ObjectWithSingleField } ''T.TParam)-$(deriveToJSON defaultOptions { sumEncoding = ObjectWithSingleField } ''T.Kind)-$(deriveToJSON defaultOptions { sumEncoding = ObjectWithSingleField } ''T.TVar)-$(deriveToJSON defaultOptions { sumEncoding = ObjectWithSingleField } ''T.TCon)-$(deriveToJSON defaultOptions { sumEncoding = ObjectWithSingleField } ''T.PC)-$(deriveToJSON defaultOptions { sumEncoding = ObjectWithSingleField } ''T.TC)-$(deriveToJSON defaultOptions { sumEncoding = ObjectWithSingleField } ''T.UserTC)-$(deriveToJSON defaultOptions { sumEncoding = ObjectWithSingleField } ''T.Schema)-$(deriveToJSON defaultOptions { sumEncoding = ObjectWithSingleField } ''T.TFun)-$(deriveToJSON defaultOptions { sumEncoding = ObjectWithSingleField } ''T.Selector)-$(deriveToJSON defaultOptions { sumEncoding = ObjectWithSingleField } { fieldLabelModifier = drop 1 } ''T.Fixity)-$(deriveToJSON defaultOptions { sumEncoding = ObjectWithSingleField } ''T.Pragma)-$(deriveToJSON defaultOptions { sumEncoding = ObjectWithSingleField } ''Assoc)-$(deriveToJSON defaultOptions { sumEncoding = ObjectWithSingleField } ''Name)-$(deriveToJSON defaultOptions { sumEncoding = ObjectWithSingleField } ''IfaceDecl)-$(deriveToJSON defaultOptions { sumEncoding = ObjectWithSingleField } ''T.Newtype)-$(deriveToJSON defaultOptions { sumEncoding = ObjectWithSingleField } ''T.TySyn)-$(deriveToJSON defaultOptions { sumEncoding = ObjectWithSingleField } ''IfaceDecls)-$(deriveToJSON defaultOptions { sumEncoding = ObjectWithSingleField } ''Iface)-$(deriveJSON defaultOptions { sumEncoding = ObjectWithSingleField } ''P.Ident)-$(deriveJSON defaultOptions { sumEncoding = ObjectWithSingleField } ''P.Range)-$(deriveToJSON defaultOptions { sumEncoding = ObjectWithSingleField } ''P.PName)-$(deriveToJSON defaultOptions { sumEncoding = ObjectWithSingleField } ''P.Pass)-$(deriveToJSON defaultOptions { sumEncoding = ObjectWithSingleField } ''Test.TestReport)
− cryptol-server/Main.hs
@@ -1,386 +0,0 @@--- |--- Module      :  $Header$--- Copyright   :  (c) 2015-2016 Galois, Inc.--- License     :  BSD3--- Maintainer  :  cryptol@galois.com--- Stability   :  provisional--- Portability :  portable------ Alpha version of a Cryptol server that communicates via JSON over--- ZeroMQ. This API is highly unstable and extremely likely to change--- in the near future.--{-# LANGUAGE CPP #-}-{-# LANGUAGE ExtendedDefaultRules #-}-{-# LANGUAGE GeneralizedNewtypeDeriving #-}-{-# LANGUAGE LambdaCase #-}-{-# LANGUAGE RecordWildCards #-}-{-# OPTIONS_GHC -Wall -fno-warn-type-defaults #-}-module Main where--import Control.Concurrent-import Control.Monad-import Control.Monad.IO.Class-import Control.Monad.Trans.Control-import qualified Control.Exception as X-import Data.Aeson-import Data.Aeson.Encode.Pretty-import qualified Data.ByteString.Char8 as BS-import qualified Data.ByteString.Lazy.Char8 as BSL-import Data.Char-import Data.IORef-import Data.Map (Map)-import qualified Data.Map as Map-import Data.Text (Text)-import qualified Data.Text as T-import Data.Word-import Options.Applicative-import System.Environment-import System.Exit-import System.FilePath-import System.Posix.Signals-import System.ZMQ4-import Text.Read--import qualified Cryptol.Eval.Value as E-import Cryptol.REPL.Command-import Cryptol.REPL.Monad-import Cryptol.Symbolic (ProverResult(..))-import qualified Cryptol.Testing.Concrete as Test-import qualified Cryptol.TypeCheck.AST as T-import qualified Cryptol.ModuleSystem as M-import Cryptol.Utils.PP hiding ((<>))--import Cryptol.Aeson ()--import Prelude ()-import Prelude.Compat--data RCommand-  = RCEvalExpr Text-  | RCApplyFun FunHandle E.Value-  | RCTypeOf Text-  | RCSetOpt Text Text-  | RCCheck Text-  | RCExhaust Text-  | RCProve Text-  | RCSat Text-  | RCLoadPrelude-  | RCLoadModule FilePath-  | RCDecls-  | RCUnknownCmd Text-  | RCExit--instance FromJSON RCommand where-  parseJSON = withObject "RCommand" $ \o -> do-    tag <- o .: "tag"-    flip (withText "tag") tag $ \case-      "evalExpr"    -> RCEvalExpr              <$> o .: "expr"-      "applyFun"    -> RCApplyFun              <$> o .: "handle" <*> o .: "arg"-      "typeOf"      -> RCTypeOf                <$> o .: "expr"-      "setOpt"      -> RCSetOpt                <$> o .: "key" <*> o .: "value"-      "check"       -> RCCheck                 <$> o .: "expr"-      "exhaust"     -> RCExhaust               <$> o .: "expr"-      "prove"       -> RCProve                 <$> o .: "expr"-      "sat"         -> RCSat                   <$> o .: "expr"-      "loadPrelude" -> return RCLoadPrelude-      "loadModule"  -> RCLoadModule . T.unpack <$> o .: "filePath"-      "browse"      -> return RCDecls-      "exit"        -> return RCExit-      unknown       -> return (RCUnknownCmd unknown)--newtype FunHandle = FH Int-  deriving (Eq, Ord, Enum, Bounded, Show)--instance ToJSON FunHandle where-  toJSON (FH i) = toJSON i--instance FromJSON FunHandle where-  parseJSON v = FH <$> parseJSON v--data RResult-  = RRValue E.Value-  | RRFunValue FunHandle T.Type-  | RRType T.Schema String -- pretty-printed type-  | RRDecls M.IfaceDecls-  | RRCheck [Test.TestReport]-  | RRExhaust [Test.TestReport]-  | RRSat [[E.Value]]-    -- ^ A list of satisfying assignments. Empty list means unsat, max-    -- length determined by @satNum@ interpreter option-  | RRProve (Maybe [E.Value])-    -- ^ Counterexample if invalid or 'Nothing' if valid-  | RRProverError String-  | RRInteractiveError REPLException String -- pretty-printed exception-  | RRUnknownCmd Text-  | RRBadMessage BS.ByteString String-  | RROk-  | RRInterrupted--instance ToJSON RResult where-  toJSON = \case-    RRValue v -> object-      [ "tag" .= "value", "value" .= v ]-    RRFunValue fh t -> object-      [ "tag" .= "funValue", "handle" .= fh, "type" .= t ]-    RRType s pps -> object-      [ "tag" .= "type", "value" .= s, "pp" .= pps ]-    RRDecls ifds -> object-      [ "tag" .= "decls", "decls" .= ifds ]-    RRCheck out -> object-      [ "tag" .= "check", "testReport" .= out ]-    RRExhaust out -> object-      [ "tag" .= "exhaust", "testReport" .= out ]-    RRSat out -> object-      [ "tag" .= "sat", "assignments" .= out ]-    RRProve out -> object-      [ "tag" .= "prove", "counterexample" .= out ]-    RRProverError msg -> object-      [ "tag" .= "proverError", "message" .= msg ]-    RRInteractiveError err pps -> object-      [ "tag" .= "interactiveError", "error" .= err, "pp" .= pps ]-    RRUnknownCmd txt -> object-      [ "tag" .= "unknownCommand", "command" .= txt ]-    RRBadMessage msg err -> object-      [ "tag" .= "badMessage", "message" .= BS.unpack msg, "error" .= err ]-    RROk -> object-      [ "tag" .= "ok" ]-    RRInterrupted -> object-      [ "tag" .= "interrupted" ]--data ControlMsg-  = CMConnect-    -- ^ Request a new Cryptol context and connection-  | CMInterrupt Word16-    -- ^ Request an interrupt of all current Cryptol contexts-  | CMExit-    -- ^ Request that the entire server shut down-  | CMUnknown Text-    -- ^ Unknown message--instance FromJSON ControlMsg where-  parseJSON = withObject "ControlMsg" $ \o -> do-    tag <- o .: "tag"-    flip (withText "tag") tag $ \case-      "connect" -> return CMConnect-      "interrupt" -> CMInterrupt <$> o .: "port"-      "exit" -> return CMExit-      other -> return $ CMUnknown other--data ControlReply-  = CRConnect Word16-    -- ^ Return the port for a new connection-  | CRInterrupted-    -- ^ Acknowledge receipt of an interrupt command-  | CRExiting-    -- ^ Acknowledge receipt of an exit command-  | CRBadMessage BS.ByteString String-    -- ^ Acknowledge receipt of an ill-formed control message--instance ToJSON ControlReply where-  toJSON = \case-    CRConnect port -> object-      [ "tag" .= "connect", "port" .= port ]-    CRInterrupted -> object-      [ "tag" .= "interrupted" ]-    CRExiting -> object-      [ "tag" .= "exiting" ]-    CRBadMessage msg err -> object-      [ "tag" .= "badMessage", "message" .= BS.unpack msg, "error" .= err ]--server :: Word16 -> IO ()-server port =-  withContext $ \ctx ->-  withSocket ctx Rep $ \rep -> do-  let addr = "tcp://127.0.0.1:" ++ show port-  putStrLn ("[cryptol-server] coming online at " ++ addr)-  bind rep addr-  workers <- newIORef Map.empty-  let loop = do-        msg <- receive rep-        putStrLn "[cryptol-server] received message:"-        case decodeStrict msg of-          Nothing -> BS.putStrLn msg-          Just js -> BSL.putStrLn (encodePretty (js :: Value))-        case eitherDecodeStrict msg of-          Left err -> reply rep $ CRBadMessage msg err-          Right CMConnect -> do-            putStrLn "[cryptol-server] handling new incoming connection"-            newRep <- socket ctx Rep-            bind newRep "tcp://127.0.0.1:*"-            newAddr <- lastEndpoint newRep-            let portStr = reverse . takeWhile isDigit . reverse $ newAddr-                workerPort = read portStr-            putStrLn ("[cryptol-server] starting worker on interface " ++ newAddr)-            tid <- forkFinally (runRepl newRep) (removeWorker workers port)-            addNewWorker workers workerPort tid-            reply rep $ CRConnect workerPort-          Right (CMInterrupt port') -> do-            s <- readIORef workers-            case Map.lookup port' s of-              Nothing -> reply rep $ CRBadMessage msg "invalid worker port"-              Just tid -> do-                throwTo tid X.UserInterrupt-                reply rep $ CRInterrupted-          Right CMExit -> do-            putStrLn "[cryptol-server] shutting down"-            reply rep $ CRExiting-            exitSuccess-          Right (CMUnknown cmd) -> do-            putStrLn ("[cryptol-server] unknown control command: " ++ T.unpack cmd)-            reply rep $ CRBadMessage msg "unknown control command"-        loop-  loop--reply :: (ToJSON a, MonadIO m) => Socket Rep -> a -> m ()-reply rep msg = liftIO $ do-  let bmsg = BS.concat . BSL.toChunks . encodePretty $ msg-  putStrLn "[cryptol-server] sending response:"-  BS.putStrLn bmsg-  send rep [] bmsg--addNewWorker :: IORef (Map Word16 ThreadId) -> Word16 -> ThreadId -> IO ()-addNewWorker workers port tid =-  atomicModifyIORef workers $ \s -> (Map.insert port tid s, ())--removeWorker :: IORef (Map Word16 ThreadId) -> Word16 -> a -> IO ()-removeWorker workers port _result =-  atomicModifyIORef workers $ \s -> (Map.delete port s, ())--runRepl :: Socket Rep -> IO ()-runRepl rep = runREPL False $ do -- TODO: batch mode?-  mCryptolPath <- io $ lookupEnv "CRYPTOLPATH"-  case mCryptolPath of-    Nothing -> return ()-    Just path -> prependSearchPath path'-#if defined(mingw32_HOST_OS) || defined(__MINGW32__)-      -- Windows paths search from end to beginning-      where path' = reverse (splitSearchPath path)-#else-      where path' = splitSearchPath path-#endif-  funHandles <- io $ newIORef (Map.empty, minBound :: FunHandle)-  let handle err = reply rep (RRInteractiveError err (show (pp err)))-      handleAsync :: X.AsyncException -> IO ()-      handleAsync _int = reply rep RRInterrupted-      loop = liftBaseWith $ \run -> X.handle handleAsync $ run $ do-        msg <- io $ receive rep-        io $ putStrLn "[cryptol-worker] received message:"-        case decodeStrict msg of-          Nothing -> io $ BS.putStrLn msg-          Just js -> io $ BSL.putStrLn (encodePretty (js :: Value))-        flip catch handle $ case eitherDecodeStrict msg of-          Left cmdErr -> reply rep (RRBadMessage msg cmdErr)-          Right rc -> case rc of-            RCEvalExpr txt -> do-              expr <- replParseExpr (T.unpack txt)-              (val, ty) <- replEvalExpr expr-              case val of-                E.VFun f -> do-                  fh <- io $ atomicModifyIORef' funHandles $ \(m, fh) ->-                    let m' = Map.insert fh f m-                        fh' = succ fh-                    in ((m', fh'), fh)-                  reply rep (RRFunValue fh ty)-                _ -> reply rep (RRValue val)-            RCApplyFun fh arg -> do-              (m, _) <- io $ readIORef funHandles-              case Map.lookup fh m of-                Nothing -> reply rep (RRBadMessage "invalid function handle" (show fh))-                Just f -> do-                  case f arg of-                    E.VFun g -> do-                      gh <- io $ atomicModifyIORef' funHandles $ \(m', gh) ->-                        let m'' = Map.insert gh g m'-                            gh' = succ gh-                        in ((m'', gh'), gh)-                      -- TODO: bookkeeping to track the type of this value-                      reply rep (RRFunValue gh T.tZero)-                    val -> reply rep (RRValue val)-            RCTypeOf txt -> do-              expr <- replParseExpr (T.unpack txt)-              (_expr, _def, sch) <- replCheckExpr expr-              reply rep (RRType sch (show (pp sch)))-            RCSetOpt key val -> do-              setOptionCmd (T.unpack key ++ "=" ++ T.unpack val)-              reply rep RROk-            RCCheck expr -> do-              reports <- qcCmd QCRandom (T.unpack expr)-              reply rep (RRCheck reports)-            RCExhaust expr -> do-              reports <- qcCmd QCExhaust (T.unpack expr)-              reply rep (RRExhaust reports)-            RCProve expr -> do-              result <- onlineProveSat False (T.unpack expr) Nothing-              case result of-                AllSatResult [cex] ->-                  reply rep (RRProve (Just (map (\(_,_,v) -> v) cex)))-                ThmResult _ ->-                  reply rep (RRProve Nothing)-                ProverError err ->-                  reply rep (RRProverError err)-                _ ->-                  reply rep (RRProverError "unexpected prover result")-            RCSat expr ->  do-              result <- onlineProveSat True (T.unpack expr) Nothing-              case result of-                AllSatResult sas ->-                  reply rep (RRSat (map (map (\(_,_,v) -> v)) sas))-                ThmResult _ ->-                  reply rep (RRSat [])-                ProverError err ->-                  reply rep (RRProverError err)-                _ ->-                  reply rep (RRProverError "unexpected prover result")-            RCLoadPrelude -> do-              loadPrelude-              reply rep RROk-            RCLoadModule fp -> do-              loadCmd fp-              reply rep RROk-            RCDecls -> do-              (decls, _namingEnv, _nameDisp) <- getFocusedEnv-              reply rep (RRDecls decls)-            RCUnknownCmd cmd -> reply rep (RRUnknownCmd cmd)-            RCExit -> do-              reply rep RROk-              io $ close rep-              io $ putStrLn "[cryptol-worker] shutting down"-  void $ forever loop--withCapturedOutput :: REPL a -> REPL (a, String)-withCapturedOutput m = do-  old <- getPutStr-  buf <- io $ newIORef ""-  setPutStr $ \s -> modifyIORef' buf (++ s)-  x <- m-  s <- io $ readIORef buf-  setPutStr old-  return (x, s)--data Server = Server { serverPort :: Word16-                     , serverMaskSIGINT :: Bool }-  deriving Show--main :: IO ()-main = execParser opts >>= mainWith-  where-    opts =-      info (helper <*> serverOpts)-           ( fullDesc-          <> progDesc "Run Cryptol as a server via ZeroMQ and JSON"-          <> header "cryptol-server" )-    serverOpts =-      Server-      <$> option auto-         ( long "port"-        <> short 'p'-        <> metavar "PORT"-        <> value 5555-        <> help "TCP port to bind" )-      <*> switch-         ( long "mask-interrupts"-        <> help "Suppress interrupt signals" )-    mainWith Server {..} = do-      when serverMaskSIGINT $ void $ installHandler sigINT Ignore Nothing-      server serverPort
cryptol.cabal view
@@ -1,5 +1,5 @@ Name:                cryptol-Version:             2.4.0+Version:             2.5.0 Synopsis:            Cryptol: The Language of Cryptography Description: Cryptol is a domain-specific language for specifying cryptographic algorithms. A Cryptol implementation of an algorithm resembles its mathematical specification more closely than an implementation in a general purpose language. For more, see <http://www.cryptol.net/>. License:             BSD3@@ -8,13 +8,13 @@ Maintainer:          cryptol@galois.com Homepage:            http://www.cryptol.net/ Bug-reports:         https://github.com/GaloisInc/cryptol/issues-Copyright:           2013-2016 Galois Inc.+Copyright:           2013-2017 Galois Inc. Category:            Language Build-type:          Simple Cabal-version:       >= 1.18 extra-source-files:  bench/data/*.cry -data-files:          *.cry Cryptol/*.cry+data-files:          *.cry Cryptol/*.cry *.z3 data-dir:            lib  source-repository head@@ -24,7 +24,7 @@ source-repository this   type:     git   location: https://github.com/GaloisInc/cryptol.git-  tag:      2.4.0+  tag:      2.5.0  flag static   default: False@@ -34,9 +34,10 @@   default: True   description: Don't use the Cabal-provided data directory for looking up Cryptol libraries. This is useful when the data directory can't be known ahead of time, like for a relocatable distribution. -flag server-  default: False-  description: Build with the ZeroMQ/JSON cryptol-server executable+-- Note: the Cryptol server needs to be updated to some new APIs.+--flag server+--  default: False+--  description: Build with the ZeroMQ/JSON cryptol-server executable  library   Default-language:@@ -61,16 +62,18 @@                        process           >= 1.2,                        QuickCheck        >= 2.7,                        random            >= 1.0.1,-                       sbv               >= 5.12,+                       sbv               >= 7.0,                        smtLib            >= 1.0.7,-                       simple-smt        >= 0.6.0,+                       simple-smt        >= 0.7.0,                        syb               >= 0.4,                        text              >= 1.1,                        template-haskell,                        tf-random         >= 0.5,                        transformers      >= 0.3,                        transformers-base >= 0.4,-                       utf8-string       >= 0.3+                       utf8-string       >= 0.3,+                       mtl               >= 2.2.1,+                       time >= 1.6.0.1    Build-tools:         alex, happy   hs-source-dirs:      src@@ -94,6 +97,7 @@                        Cryptol.Utils.Panic,                        Cryptol.Utils.Debug,                        Cryptol.Utils.Misc,+                       Cryptol.Utils.Patterns,                        Cryptol.Version,                         Cryptol.ModuleSystem,@@ -106,6 +110,9 @@                        Cryptol.ModuleSystem.Renamer,                         Cryptol.TypeCheck,+                       Cryptol.TypeCheck.Type,+                       Cryptol.TypeCheck.TypePat,+                       Cryptol.TypeCheck.SimpType,                        Cryptol.TypeCheck.AST,                        Cryptol.TypeCheck.Monad,                        Cryptol.TypeCheck.Infer,@@ -117,16 +124,20 @@                        Cryptol.TypeCheck.Depends,                        Cryptol.TypeCheck.PP,                        Cryptol.TypeCheck.Solve,+                       Cryptol.TypeCheck.SimpleSolver,                        Cryptol.TypeCheck.TypeMap,                        Cryptol.TypeCheck.TypeOf,                        Cryptol.TypeCheck.Sanity, +                       Cryptol.TypeCheck.Solver.Types,+                       Cryptol.TypeCheck.Solver.SMT,                        Cryptol.TypeCheck.Solver.InfNat,                        Cryptol.TypeCheck.Solver.Class,                        Cryptol.TypeCheck.Solver.Selector,                        Cryptol.TypeCheck.Solver.Utils,-                       Cryptol.TypeCheck.Solver.Simplify, +                       Cryptol.TypeCheck.Solver.Numeric,+                       Cryptol.TypeCheck.Solver.Improve,                        Cryptol.TypeCheck.Solver.CrySAT,                        Cryptol.TypeCheck.Solver.Numeric.AST,                        Cryptol.TypeCheck.Solver.Numeric.ImportExport,@@ -134,7 +145,6 @@                        Cryptol.TypeCheck.Solver.Numeric.Fin,                        Cryptol.TypeCheck.Solver.Numeric.Interval,                        Cryptol.TypeCheck.Solver.Numeric.Simplify,-                       Cryptol.TypeCheck.Solver.Numeric.Simplify1,                        Cryptol.TypeCheck.Solver.Numeric.SimplifyExpr,                        Cryptol.TypeCheck.Solver.Numeric.NonLin,                        Cryptol.TypeCheck.Solver.Numeric.SMT,@@ -145,7 +155,8 @@                        Cryptol.Eval,                        Cryptol.Eval.Arch,                        Cryptol.Eval.Env,-                       Cryptol.Eval.Error,+                       Cryptol.Eval.Monad,+                       Cryptol.Eval.Reference,                        Cryptol.Eval.Type,                        Cryptol.Eval.Value, @@ -196,10 +207,10 @@                      , monad-control                      , process                      , random-                     , sbv+                     , sbv >= 7.0                      , tf-random                      , transformers-  GHC-options:         -Wall -O2 -threaded -rtsopts -with-rtsopts=-N1+  GHC-options:         -Wall -O2 -threaded -rtsopts "-with-rtsopts=-N1 -A64m"   if impl(ghc >= 8.0.1)      ghc-options: -Wno-redundant-constraints   ghc-prof-options:    -auto-all -rtsopts@@ -207,43 +218,44 @@   if os(linux) && flag(static)       ld-options:      -static -pthread -executable cryptol-server-  main-is:             Main.hs-  hs-source-dirs:      cryptol-server-  other-modules:       Cryptol.Aeson-  default-language:    Haskell2010-  default-extensions:  OverloadedStrings-  GHC-options:         -Wall -O2 -threaded -rtsopts -with-rtsopts=-N1-  if impl(ghc >= 8.0.1)-     ghc-options: -Wno-redundant-constraints-  ghc-prof-options:    -auto-all -rtsopts-  if os(linux) && flag(static)-      ld-options:      -static -pthread-  if flag(server)-     build-depends: aeson >= 0.10-                  , aeson-pretty >= 0.7-                  , base-                  , base-compat-                  , bytestring >= 0.10-                  , containers-                  , cryptol-                  , filepath-                  , monad-control-                  , optparse-applicative >= 0.12-                  , text-                  , transformers-                  , unix-                  , unordered-containers >= 0.2-                  , zeromq4-haskell >= 0.6-  else-      buildable: False+-- Note: the Cryptol server needs to be updated to some new APIs.+--executable cryptol-server+--  main-is:             Main.hs+--  hs-source-dirs:      cryptol-server+--  other-modules:       Cryptol.Aeson+--  default-language:    Haskell2010+--  default-extensions:  OverloadedStrings+--  GHC-options:         -Wall -O2 -threaded -rtsopts "-with-rtsopts=-N1 -A64m"+--  if impl(ghc >= 8.0.1)+--     ghc-options: -Wno-redundant-constraints+--  ghc-prof-options:    -auto-all -rtsopts+--  if os(linux) && flag(static)+--      ld-options:      -static -pthread+--  if flag(server)+--     build-depends: aeson >= 0.10+--                  , aeson-pretty >= 0.7+--                  , base+--                  , base-compat+--                  , bytestring >= 0.10+--                  , containers+--                  , cryptol+--                  , filepath+--                  , monad-control+--                  , optparse-applicative >= 0.12+--                  , text+--                  , transformers+--                  , unix+--                  , unordered-containers >= 0.2+--                  , zeromq4-haskell >= 0.6+--  else+--      buildable: False  benchmark cryptol-bench   type:                exitcode-stdio-1.0   main-is:             Main.hs   hs-source-dirs:      bench   default-language:    Haskell2010-  GHC-options:         -Wall -O2 -threaded -rtsopts -with-rtsopts=-N+  GHC-options:         -Wall -O2 -threaded -rtsopts "-with-rtsopts=-N1 -A64m"   if impl(ghc >= 8.0.1)      ghc-options: -Wno-redundant-constraints   ghc-prof-options:    -auto-all -rtsopts@@ -253,4 +265,7 @@                      , criterion                      , cryptol                      , deepseq+                     , directory+                     , filepath+                     , sbv >= 7.0                      , text
cryptol/Main.hs view
@@ -13,7 +13,7 @@  import OptParser -import Cryptol.REPL.Command (loadCmd,loadPrelude)+import Cryptol.REPL.Command (loadCmd,loadPrelude,CommandExitCode(..)) import Cryptol.REPL.Monad (REPL,updateREPLTitle,setUpdateREPLTitle,                    io,prependSearchPath,setSearchPath) import qualified Cryptol.REPL.Monad as REPL@@ -33,7 +33,7 @@     (OptDescr(..),ArgOrder(..),ArgDescr(..),getOpt,usageInfo) import System.Directory (getTemporaryDirectory, removeFile) import System.Environment (getArgs, getProgName, lookupEnv)-import System.Exit (exitFailure)+import System.Exit (exitFailure,exitSuccess) import System.FilePath (searchPathSeparator, splitSearchPath, takeDirectory) import System.IO (hClose, hPutStr, openTempFile) @@ -41,14 +41,19 @@ import Prelude () import Prelude.Compat +data ColorMode = AutoColor | NoColor | AlwaysColor+  deriving (Show, Eq)+ data Options = Options   { optLoad            :: [FilePath]   , optVersion         :: Bool   , optHelp            :: Bool   , optBatch           :: Maybe FilePath   , optCommands        :: [String]+  , optColorMode       :: ColorMode   , optCryptolrc       :: Cryptolrc   , optCryptolPathOnly :: Bool+  , optStopOnError     :: Bool   } deriving (Show)  defaultOptions :: Options@@ -58,8 +63,10 @@   , optHelp            = False   , optBatch           = Nothing   , optCommands        = []+  , optColorMode       = AutoColor   , optCryptolrc       = CryrcDefault   , optCryptolPathOnly = False+  , optStopOnError     = False   }  options :: [OptDescr (OptParser Options)]@@ -67,12 +74,20 @@   [ Option "b" ["batch"] (ReqArg setBatchScript "FILE")     "run the script provided and exit" +  , Option "e" ["stop-on-error"] (NoArg setStopOnError)+    "stop script execution as soon as an error occurs."+   , Option "c" ["command"] (ReqArg addCommand "COMMAND")     (concat [ "run the given command and then exit; if multiple --command "             , "arguments are given, run them in the order they appear "             , "on the command line (overrides --batch)"             ]) +  , Option "" ["color"] (ReqArg setColorMode "MODE")+    (concat [ "control the color output for the terminal, which may be "+            , "'auto', 'none' or 'always' (default: 'auto')"+            ])+   , Option "v" ["version"] (NoArg setVersion)     "display version number" @@ -99,10 +114,21 @@ addCommand cmd =   modify $ \ opts -> opts { optCommands = cmd : optCommands opts } +-- | Stop script (batch mode) execution on first error.+setStopOnError :: OptParser Options+setStopOnError = modify $ \opts -> opts { optStopOnError = True }+ -- | Set a batch script to be run. setBatchScript :: String -> OptParser Options setBatchScript path = modify $ \ opts -> opts { optBatch = Just path } +-- | Set the color mode of the terminal output.+setColorMode :: String -> OptParser Options+setColorMode "auto"   = modify $ \ opts -> opts { optColorMode = AutoColor }+setColorMode "none"   = modify $ \ opts -> opts { optColorMode = NoColor }+setColorMode "always" = modify $ \ opts -> opts { optColorMode = AlwaysColor }+setColorMode x        = OptFailure ["invalid color mode: " ++ x ++ "\n"]+ -- | Signal that version should be displayed. setVersion :: OptParser Options setVersion  = modify $ \ opts -> opts { optVersion = True }@@ -180,13 +206,18 @@       | optVersion opts -> displayVersion       | otherwise       -> do           (opts', mCleanup) <- setupCmdScript opts-          repl (optCryptolrc opts')-               (optBatch opts')-               (setupREPL opts')+          status <- repl (optCryptolrc opts')+                         (optBatch opts')+                         (optStopOnError opts')+                         (setupREPL opts')           case mCleanup of             Nothing -> return ()             Just cmdFile -> removeFile cmdFile +          case status of+            CommandError -> exitFailure+            CommandOk    -> exitSuccess+ setupCmdScript :: Options -> IO (Options, Maybe FilePath) setupCmdScript opts =   case optCommands opts of@@ -202,16 +233,6 @@  setupREPL :: Options -> REPL () setupREPL opts = do-  smoke <- REPL.smokeTest-  case smoke of-    [] -> return ()-    _  -> io $ do-      print (hang "Errors encountered on startup; exiting:"-                4 (vcat (map pp smoke)))-      exitFailure-  displayLogo True-  setUpdateREPLTitle setREPLTitle-  updateREPLTitle   mCryptolPath <- io $ lookupEnv "CRYPTOLPATH"   case mCryptolPath of     Nothing -> return ()@@ -223,6 +244,22 @@ #else       where path' = splitSearchPath path #endif+  smoke <- REPL.smokeTest+  case smoke of+    [] -> return ()+    _  -> io $ do+      print (hang "Errors encountered on startup; exiting:"+                4 (vcat (map pp smoke)))+      exitFailure++  color <- case optColorMode opts of+    AlwaysColor -> return True+    NoColor     -> return False+    AutoColor   -> canDisplayColor+  displayLogo color++  setUpdateREPLTitle (shouldSetREPLTitle >>= \b -> when b setREPLTitle)+  updateREPLTitle   case optBatch opts of     Nothing -> return ()     -- add the directory containing the batch file to the module search path@@ -230,8 +267,14 @@   case optLoad opts of     []  -> loadPrelude `REPL.catch` \x -> io $ print $ pp x     [l] -> loadCmd l `REPL.catch` \x -> do-           io $ print $ pp x-           -- If the requested file fails to load, load the prelude instead-           loadPrelude `REPL.catch` \y -> do-           io $ print $ pp y+             io $ print $ pp x+             -- If the requested file fails to load, load the prelude instead...+             loadPrelude `REPL.catch` \y -> do+               io $ print $ pp y+             -- ... but make sure the loaded module is set to the file+             -- we tried, instead of the Prelude+             REPL.setLoadedMod REPL.LoadedModule+               { REPL.lName = Nothing+               , REPL.lPath = l+               }     _   -> io $ putStrLn "Only one file may be loaded at the command line."
cryptol/REPL/Haskeline.hs view
@@ -18,13 +18,15 @@ import           Cryptol.Utils.PP  import qualified Control.Exception as X-import           Control.Monad (guard, join, when)+import           Control.Monad (guard, join) import qualified Control.Monad.Trans.Class as MTL import           Control.Monad.Trans.Control import           Data.Char (isAlphaNum, isSpace)+import           Data.Maybe(isJust) import           Data.Function (on) import           Data.List (isPrefixOf,nub,sortBy,sort)-import           System.Console.ANSI (setTitle)+import           System.IO (stdout)+import           System.Console.ANSI (setTitle, hSupportsANSI) import           System.Console.Haskeline import           System.Directory ( doesFileExist                                   , getHomeDirectory@@ -34,72 +36,89 @@ import           Prelude () import           Prelude.Compat --- | Haskeline-specific repl implementation.-repl :: Cryptolrc -> Maybe FilePath -> REPL () -> IO ()-repl cryrc mbBatch begin =-  do settings <- setHistoryFile (replSettings isBatch)-     runREPL isBatch (runInputTBehavior behavior settings body)-  where-  body = withInterrupt $ do-    MTL.lift evalCryptolrc-    MTL.lift begin-    loop +-- | One REPL invocation, either form a file or from the terminal.+crySession :: Maybe FilePath -> Bool -> REPL CommandExitCode+crySession mbBatch stopOnError =+  do settings <- io (setHistoryFile (replSettings isBatch))+     let act = runInputTBehavior behavior settings (withInterrupt loop)+     if isBatch then asBatch act else act+  where   (isBatch,behavior) = case mbBatch of     Nothing   -> (False,defaultBehavior)     Just path -> (True,useFile path) -  loop = do-    prompt <- MTL.lift getPrompt-    mb     <- handleInterrupt (return (Just "")) (getInputLines prompt [])-    case mb of+  loop :: InputT REPL CommandExitCode+  loop =+    do ln <- getInputLines =<< MTL.lift getPrompt+       case ln of+         NoMoreLines -> return CommandOk+         Interrupted+           | isBatch && stopOnError -> return CommandError+           | otherwise -> loop+         NextLine line+           | all isSpace line -> loop+           | otherwise        -> doCommand line -      Just line-        | Just cmd <- parseCommand findCommandExact line -> do-          continue <- MTL.lift $ do-            handleInterrupt handleCtrlC (runCommand cmd)-            shouldContinue-          when continue loop+  doCommand txt =+    case parseCommand findCommandExact txt of+      Nothing | isBatch && stopOnError  -> return CommandError+              | otherwise -> loop -- say somtething?+      Just cmd -> join $ MTL.lift $+        do status <- handleInterrupt (handleCtrlC CommandError) (runCommand cmd)+           case status of+             CommandError | isBatch && stopOnError -> return (return status)+             _ -> do goOn <- shouldContinue+                     return (if goOn then loop else return status) -        | otherwise -> loop -      Nothing -> return ()+data NextLine = NextLine String | NoMoreLines | Interrupted -  getInputLines prompt ls =+getInputLines :: String -> InputT REPL NextLine+getInputLines = handleInterrupt (MTL.lift (handleCtrlC Interrupted)) . loop []+  where+  loop ls prompt =     do mb <- getInputLine prompt        let newPropmpt = map (\_ -> ' ') prompt        case mb of-          Nothing -> return Nothing-          Just l | not (null l) && last l == '\\' ->-                                      getInputLines newPropmpt (init l : ls)-                 | otherwise -> return $ Just $ unlines $ reverse $ l : ls+         Nothing -> return NoMoreLines+         Just l+           | not (null l) && last l == '\\' -> loop (init l : ls) newPropmpt+           | otherwise -> return $ NextLine $ unlines $ reverse $ l : ls -  evalCryptolrc =-    case cryrc of-      CryrcDefault -> do-        here <- io $ getCurrentDirectory-        home <- io $ getHomeDirectory-        let dcHere = here </> ".cryptolrc"-            dcHome = home </> ".cryptolrc"-        isHere <- io $ doesFileExist dcHere-        isHome <- io $ doesFileExist dcHome-        if | isHere    -> slurp dcHere-           | isHome    -> slurp dcHome-           | otherwise -> whenDebug $ io $ putStrLn "no .cryptolrc found"-      CryrcFiles paths -> mapM_ slurp paths-      CryrcDisabled -> return ()+loadCryRC :: Cryptolrc -> REPL CommandExitCode+loadCryRC cryrc =+  case cryrc of+    CryrcDisabled   -> return CommandOk+    CryrcDefault    -> check [ getCurrentDirectory, getHomeDirectory ]+    CryrcFiles opts -> loadMany opts+  where+  check [] = return CommandOk+  check (place : others) =+    do dir <- io place+       let file = dir </> ".cryptolrc"+       present <- io (doesFileExist file)+       if present+         then crySession (Just file) True+         else check others -  -- | Actually read the contents of a file, but don't save the-  -- history-  ---  -- XXX: friendlier error message would be nice if the file can't be-  -- found, but since these will be specified on the command line it-  -- should be obvious what's going wrong-  slurp path = do-    let settings' = defaultSettings { autoAddHistory = False }-    runInputTBehavior (useFile path) settings' (withInterrupt loop)+  loadMany []       = return CommandOk+  loadMany (f : fs) = do status <- crySession (Just f) True+                         case status of+                           CommandOk -> loadMany fs+                           _         -> return status +-- | Haskeline-specific repl implementation.+repl :: Cryptolrc -> Maybe FilePath -> Bool -> REPL () -> IO CommandExitCode+repl cryrc mbBatch stopOnError begin =+  runREPL (isJust mbBatch) $+  do status <- loadCryRC cryrc+     case status of+       CommandOk -> begin >> crySession mbBatch stopOnError+       _         -> return status ++ -- | Try to set the history file. setHistoryFile :: Settings REPL -> IO (Settings REPL) setHistoryFile ss =@@ -150,6 +169,22 @@ setREPLTitle = do   lm <- getLoadedMod   io (setTitle (mkTitle lm))++-- | In certain environments like Emacs, we shouldn't set the terminal+-- title. Note: this does not imply we can't use color output. We can+-- use ANSI color sequences in places like Emacs, but not terminal+-- codes.+--+-- This checks that @'stdout'@ is a proper terminal handle, and that the+-- terminal mode is not @dumb@, which is set by Emacs and others.+shouldSetREPLTitle :: REPL Bool+shouldSetREPLTitle = io (hSupportsANSI stdout)++-- | Whether we can display color titles. This checks that @'stdout'@+-- is a proper terminal handle, and that the terminal mode is not+-- @dumb@, which is set by Emacs and others.+canDisplayColor :: REPL Bool+canDisplayColor = io (hSupportsANSI stdout)  -- Completion ------------------------------------------------------------------ 
cryptol/REPL/Logo.hs view
@@ -49,4 +49,4 @@   lineLen   = length (head ls)  displayLogo :: Bool -> REPL ()-displayLogo useColor =unlessBatch (io (mapM_ putStrLn (logo useColor)))+displayLogo useColor = unlessBatch (io (mapM_ putStrLn (logo useColor)))
dist/build/Cryptol/Parser.hs view
@@ -48,3212 +48,3577 @@  -- parser produced by Happy Version 1.19.5 -newtype HappyAbsSyn t69 = HappyAbsSyn HappyAny-#if __GLASGOW_HASKELL__ >= 607-type HappyAny = Happy_GHC_Exts.Any-#else-type HappyAny = forall a . a-#endif-happyIn15 :: (Module PName) -> (HappyAbsSyn t69)-happyIn15 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn15 #-}-happyOut15 :: (HappyAbsSyn t69) -> (Module PName)-happyOut15 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut15 #-}-happyIn16 :: (([Located Import], [TopDecl PName])) -> (HappyAbsSyn t69)-happyIn16 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn16 #-}-happyOut16 :: (HappyAbsSyn t69) -> (([Located Import], [TopDecl PName]))-happyOut16 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut16 #-}-happyIn17 :: ([Located Import]) -> (HappyAbsSyn t69)-happyIn17 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn17 #-}-happyOut17 :: (HappyAbsSyn t69) -> ([Located Import])-happyOut17 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut17 #-}-happyIn18 :: (Located Import) -> (HappyAbsSyn t69)-happyIn18 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn18 #-}-happyOut18 :: (HappyAbsSyn t69) -> (Located Import)-happyOut18 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut18 #-}-happyIn19 :: (Maybe (Located ModName)) -> (HappyAbsSyn t69)-happyIn19 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn19 #-}-happyOut19 :: (HappyAbsSyn t69) -> (Maybe (Located ModName))-happyOut19 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut19 #-}-happyIn20 :: (Maybe (Located ImportSpec)) -> (HappyAbsSyn t69)-happyIn20 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn20 #-}-happyOut20 :: (HappyAbsSyn t69) -> (Maybe (Located ImportSpec))-happyOut20 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut20 #-}-happyIn21 :: ([LIdent]) -> (HappyAbsSyn t69)-happyIn21 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn21 #-}-happyOut21 :: (HappyAbsSyn t69) -> ([LIdent])-happyOut21 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut21 #-}-happyIn22 :: ([Ident] -> ImportSpec) -> (HappyAbsSyn t69)-happyIn22 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn22 #-}-happyOut22 :: (HappyAbsSyn t69) -> ([Ident] -> ImportSpec)-happyOut22 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut22 #-}-happyIn23 :: (Program PName) -> (HappyAbsSyn t69)-happyIn23 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn23 #-}-happyOut23 :: (HappyAbsSyn t69) -> (Program PName)-happyOut23 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut23 #-}-happyIn24 :: (Program PName) -> (HappyAbsSyn t69)-happyIn24 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn24 #-}-happyOut24 :: (HappyAbsSyn t69) -> (Program PName)-happyOut24 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut24 #-}-happyIn25 :: ([TopDecl PName]) -> (HappyAbsSyn t69)-happyIn25 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn25 #-}-happyOut25 :: (HappyAbsSyn t69) -> ([TopDecl PName])-happyOut25 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut25 #-}-happyIn26 :: ([TopDecl PName]) -> (HappyAbsSyn t69)-happyIn26 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn26 #-}-happyOut26 :: (HappyAbsSyn t69) -> ([TopDecl PName])-happyOut26 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut26 #-}-happyIn27 :: ([TopDecl PName]) -> (HappyAbsSyn t69)-happyIn27 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn27 #-}-happyOut27 :: (HappyAbsSyn t69) -> ([TopDecl PName])-happyOut27 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut27 #-}-happyIn28 :: ([TopDecl PName]) -> (HappyAbsSyn t69)-happyIn28 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn28 #-}-happyOut28 :: (HappyAbsSyn t69) -> ([TopDecl PName])-happyOut28 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut28 #-}-happyIn29 :: ([TopDecl PName]) -> (HappyAbsSyn t69)-happyIn29 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn29 #-}-happyOut29 :: (HappyAbsSyn t69) -> ([TopDecl PName])-happyOut29 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut29 #-}-happyIn30 :: ([TopDecl PName]) -> (HappyAbsSyn t69)-happyIn30 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn30 #-}-happyOut30 :: (HappyAbsSyn t69) -> ([TopDecl PName])-happyOut30 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut30 #-}-happyIn31 :: (Located String) -> (HappyAbsSyn t69)-happyIn31 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn31 #-}-happyOut31 :: (HappyAbsSyn t69) -> (Located String)-happyOut31 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut31 #-}-happyIn32 :: (Maybe (Located String)) -> (HappyAbsSyn t69)-happyIn32 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn32 #-}-happyOut32 :: (HappyAbsSyn t69) -> (Maybe (Located String))-happyOut32 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut32 #-}-happyIn33 :: (Decl PName) -> (HappyAbsSyn t69)-happyIn33 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn33 #-}-happyOut33 :: (HappyAbsSyn t69) -> (Decl PName)-happyOut33 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut33 #-}-happyIn34 :: (Decl PName) -> (HappyAbsSyn t69)-happyIn34 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn34 #-}-happyOut34 :: (HappyAbsSyn t69) -> (Decl PName)-happyOut34 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut34 #-}-happyIn35 :: (Newtype PName) -> (HappyAbsSyn t69)-happyIn35 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn35 #-}-happyOut35 :: (HappyAbsSyn t69) -> (Newtype PName)-happyOut35 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut35 #-}-happyIn36 :: ([Named (Type PName)]) -> (HappyAbsSyn t69)-happyIn36 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn36 #-}-happyOut36 :: (HappyAbsSyn t69) -> ([Named (Type PName)])-happyOut36 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut36 #-}-happyIn37 :: ([ LPName ]) -> (HappyAbsSyn t69)-happyIn37 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn37 #-}-happyOut37 :: (HappyAbsSyn t69) -> ([ LPName ])-happyOut37 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut37 #-}-happyIn38 :: (LPName) -> (HappyAbsSyn t69)-happyIn38 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn38 #-}-happyOut38 :: (HappyAbsSyn t69) -> (LPName)-happyOut38 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut38 #-}-happyIn39 :: ([Pattern PName]) -> (HappyAbsSyn t69)-happyIn39 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn39 #-}-happyOut39 :: (HappyAbsSyn t69) -> ([Pattern PName])-happyOut39 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut39 #-}-happyIn40 :: ([Pattern PName]) -> (HappyAbsSyn t69)-happyIn40 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn40 #-}-happyOut40 :: (HappyAbsSyn t69) -> ([Pattern PName])-happyOut40 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut40 #-}-happyIn41 :: ([Decl PName]) -> (HappyAbsSyn t69)-happyIn41 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn41 #-}-happyOut41 :: (HappyAbsSyn t69) -> ([Decl PName])-happyOut41 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut41 #-}-happyIn42 :: ([Decl PName]) -> (HappyAbsSyn t69)-happyIn42 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn42 #-}-happyOut42 :: (HappyAbsSyn t69) -> ([Decl PName])-happyOut42 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut42 #-}-happyIn43 :: ([Decl PName]) -> (HappyAbsSyn t69)-happyIn43 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn43 #-}-happyOut43 :: (HappyAbsSyn t69) -> ([Decl PName])-happyOut43 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut43 #-}-happyIn44 :: (ReplInput PName) -> (HappyAbsSyn t69)-happyIn44 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn44 #-}-happyOut44 :: (HappyAbsSyn t69) -> (ReplInput PName)-happyOut44 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut44 #-}-happyIn45 :: (Expr PName) -> (HappyAbsSyn t69)-happyIn45 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn45 #-}-happyOut45 :: (HappyAbsSyn t69) -> (Expr PName)-happyOut45 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut45 #-}-happyIn46 :: ([(Expr PName, Expr PName)]) -> (HappyAbsSyn t69)-happyIn46 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn46 #-}-happyOut46 :: (HappyAbsSyn t69) -> ([(Expr PName, Expr PName)])-happyOut46 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut46 #-}-happyIn47 :: ((Expr PName, Expr PName)) -> (HappyAbsSyn t69)-happyIn47 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn47 #-}-happyOut47 :: (HappyAbsSyn t69) -> ((Expr PName, Expr PName))-happyOut47 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut47 #-}-happyIn48 :: (Expr PName) -> (HappyAbsSyn t69)-happyIn48 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn48 #-}-happyOut48 :: (HappyAbsSyn t69) -> (Expr PName)-happyOut48 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut48 #-}-happyIn49 :: (Expr PName) -> (HappyAbsSyn t69)-happyIn49 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn49 #-}-happyOut49 :: (HappyAbsSyn t69) -> (Expr PName)-happyOut49 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut49 #-}-happyIn50 :: (Expr PName) -> (HappyAbsSyn t69)-happyIn50 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn50 #-}-happyOut50 :: (HappyAbsSyn t69) -> (Expr PName)-happyOut50 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut50 #-}-happyIn51 :: (Expr PName) -> (HappyAbsSyn t69)-happyIn51 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn51 #-}-happyOut51 :: (HappyAbsSyn t69) -> (Expr PName)-happyOut51 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut51 #-}-happyIn52 :: (LPName) -> (HappyAbsSyn t69)-happyIn52 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn52 #-}-happyOut52 :: (HappyAbsSyn t69) -> (LPName)-happyOut52 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut52 #-}-happyIn53 :: (LPName) -> (HappyAbsSyn t69)-happyIn53 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn53 #-}-happyOut53 :: (HappyAbsSyn t69) -> (LPName)-happyOut53 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut53 #-}-happyIn54 :: (LPName) -> (HappyAbsSyn t69)-happyIn54 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn54 #-}-happyOut54 :: (HappyAbsSyn t69) -> (LPName)-happyOut54 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut54 #-}-happyIn55 :: ([LPName]) -> (HappyAbsSyn t69)-happyIn55 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn55 #-}-happyOut55 :: (HappyAbsSyn t69) -> ([LPName])-happyOut55 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut55 #-}-happyIn56 :: ([Expr PName]) -> (HappyAbsSyn t69)-happyIn56 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn56 #-}-happyOut56 :: (HappyAbsSyn t69) -> ([Expr PName])-happyOut56 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut56 #-}-happyIn57 :: (Expr PName) -> (HappyAbsSyn t69)-happyIn57 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn57 #-}-happyOut57 :: (HappyAbsSyn t69) -> (Expr PName)-happyOut57 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut57 #-}-happyIn58 :: ([(Bool, Integer)]) -> (HappyAbsSyn t69)-happyIn58 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn58 #-}-happyOut58 :: (HappyAbsSyn t69) -> ([(Bool, Integer)])-happyOut58 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut58 #-}-happyIn59 :: ((Bool, Integer)) -> (HappyAbsSyn t69)-happyIn59 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn59 #-}-happyOut59 :: (HappyAbsSyn t69) -> ((Bool, Integer))-happyOut59 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut59 #-}-happyIn60 :: (Located Selector) -> (HappyAbsSyn t69)-happyIn60 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn60 #-}-happyOut60 :: (HappyAbsSyn t69) -> (Located Selector)-happyOut60 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut60 #-}-happyIn61 :: ([Expr PName]) -> (HappyAbsSyn t69)-happyIn61 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn61 #-}-happyOut61 :: (HappyAbsSyn t69) -> ([Expr PName])-happyOut61 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut61 #-}-happyIn62 :: (Named (Expr PName)) -> (HappyAbsSyn t69)-happyIn62 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn62 #-}-happyOut62 :: (HappyAbsSyn t69) -> (Named (Expr PName))-happyOut62 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut62 #-}-happyIn63 :: ([Named (Expr PName)]) -> (HappyAbsSyn t69)-happyIn63 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn63 #-}-happyOut63 :: (HappyAbsSyn t69) -> ([Named (Expr PName)])-happyOut63 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut63 #-}-happyIn64 :: (Expr PName) -> (HappyAbsSyn t69)-happyIn64 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn64 #-}-happyOut64 :: (HappyAbsSyn t69) -> (Expr PName)-happyOut64 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut64 #-}-happyIn65 :: ([[Match PName]]) -> (HappyAbsSyn t69)-happyIn65 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn65 #-}-happyOut65 :: (HappyAbsSyn t69) -> ([[Match PName]])-happyOut65 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut65 #-}-happyIn66 :: ([Match PName]) -> (HappyAbsSyn t69)-happyIn66 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn66 #-}-happyOut66 :: (HappyAbsSyn t69) -> ([Match PName])-happyOut66 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut66 #-}-happyIn67 :: (Match PName) -> (HappyAbsSyn t69)-happyIn67 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn67 #-}-happyOut67 :: (HappyAbsSyn t69) -> (Match PName)-happyOut67 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut67 #-}-happyIn68 :: (Pattern PName) -> (HappyAbsSyn t69)-happyIn68 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn68 #-}-happyOut68 :: (HappyAbsSyn t69) -> (Pattern PName)-happyOut68 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut68 #-}-happyIn69 :: t69 -> (HappyAbsSyn t69)-happyIn69 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn69 #-}-happyOut69 :: (HappyAbsSyn t69) -> t69-happyOut69 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut69 #-}-happyIn70 :: (Pattern PName) -> (HappyAbsSyn t69)-happyIn70 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn70 #-}-happyOut70 :: (HappyAbsSyn t69) -> (Pattern PName)-happyOut70 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut70 #-}-happyIn71 :: ([Pattern PName]) -> (HappyAbsSyn t69)-happyIn71 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn71 #-}-happyOut71 :: (HappyAbsSyn t69) -> ([Pattern PName])-happyOut71 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut71 #-}-happyIn72 :: (Named (Pattern PName)) -> (HappyAbsSyn t69)-happyIn72 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn72 #-}-happyOut72 :: (HappyAbsSyn t69) -> (Named (Pattern PName))-happyOut72 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut72 #-}-happyIn73 :: ([Named (Pattern PName)]) -> (HappyAbsSyn t69)-happyIn73 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn73 #-}-happyOut73 :: (HappyAbsSyn t69) -> ([Named (Pattern PName)])-happyOut73 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut73 #-}-happyIn74 :: (Schema PName) -> (HappyAbsSyn t69)-happyIn74 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn74 #-}-happyOut74 :: (HappyAbsSyn t69) -> (Schema PName)-happyOut74 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut74 #-}-happyIn75 :: (Located [TParam PName]) -> (HappyAbsSyn t69)-happyIn75 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn75 #-}-happyOut75 :: (HappyAbsSyn t69) -> (Located [TParam PName])-happyOut75 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut75 #-}-happyIn76 :: (Located [Prop PName]) -> (HappyAbsSyn t69)-happyIn76 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn76 #-}-happyOut76 :: (HappyAbsSyn t69) -> (Located [Prop PName])-happyOut76 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut76 #-}-happyIn77 :: (Located Kind) -> (HappyAbsSyn t69)-happyIn77 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn77 #-}-happyOut77 :: (HappyAbsSyn t69) -> (Located Kind)-happyOut77 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut77 #-}-happyIn78 :: (TParam PName) -> (HappyAbsSyn t69)-happyIn78 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn78 #-}-happyOut78 :: (HappyAbsSyn t69) -> (TParam PName)-happyOut78 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut78 #-}-happyIn79 :: ([TParam PName]) -> (HappyAbsSyn t69)-happyIn79 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn79 #-}-happyOut79 :: (HappyAbsSyn t69) -> ([TParam PName])-happyOut79 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut79 #-}-happyIn80 :: (TParam PName) -> (HappyAbsSyn t69)-happyIn80 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn80 #-}-happyOut80 :: (HappyAbsSyn t69) -> (TParam PName)-happyOut80 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut80 #-}-happyIn81 :: ([TParam PName]) -> (HappyAbsSyn t69)-happyIn81 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn81 #-}-happyOut81 :: (HappyAbsSyn t69) -> ([TParam PName])-happyOut81 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut81 #-}-happyIn82 :: (Type PName) -> (HappyAbsSyn t69)-happyIn82 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn82 #-}-happyOut82 :: (HappyAbsSyn t69) -> (Type PName)-happyOut82 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut82 #-}-happyIn83 :: (Type PName) -> (HappyAbsSyn t69)-happyIn83 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn83 #-}-happyOut83 :: (HappyAbsSyn t69) -> (Type PName)-happyOut83 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut83 #-}-happyIn84 :: (Type PName) -> (HappyAbsSyn t69)-happyIn84 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn84 #-}-happyOut84 :: (HappyAbsSyn t69) -> (Type PName)-happyOut84 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut84 #-}-happyIn85 :: ([ Type PName ]) -> (HappyAbsSyn t69)-happyIn85 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn85 #-}-happyOut85 :: (HappyAbsSyn t69) -> ([ Type PName ])-happyOut85 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut85 #-}-happyIn86 :: (Located [Type PName]) -> (HappyAbsSyn t69)-happyIn86 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn86 #-}-happyOut86 :: (HappyAbsSyn t69) -> (Located [Type PName])-happyOut86 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut86 #-}-happyIn87 :: ([Type PName]) -> (HappyAbsSyn t69)-happyIn87 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn87 #-}-happyOut87 :: (HappyAbsSyn t69) -> ([Type PName])-happyOut87 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut87 #-}-happyIn88 :: (Named (Type PName)) -> (HappyAbsSyn t69)-happyIn88 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn88 #-}-happyOut88 :: (HappyAbsSyn t69) -> (Named (Type PName))-happyOut88 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut88 #-}-happyIn89 :: ([Named (Type PName)]) -> (HappyAbsSyn t69)-happyIn89 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn89 #-}-happyOut89 :: (HappyAbsSyn t69) -> ([Named (Type PName)])-happyOut89 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut89 #-}-happyIn90 :: (Located Ident) -> (HappyAbsSyn t69)-happyIn90 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn90 #-}-happyOut90 :: (HappyAbsSyn t69) -> (Located Ident)-happyOut90 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut90 #-}-happyIn91 :: (LPName) -> (HappyAbsSyn t69)-happyIn91 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn91 #-}-happyOut91 :: (HappyAbsSyn t69) -> (LPName)-happyOut91 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut91 #-}-happyIn92 :: (Located ModName) -> (HappyAbsSyn t69)-happyIn92 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn92 #-}-happyOut92 :: (HappyAbsSyn t69) -> (Located ModName)-happyOut92 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut92 #-}-happyIn93 :: (Located PName) -> (HappyAbsSyn t69)-happyIn93 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn93 #-}-happyOut93 :: (HappyAbsSyn t69) -> (Located PName)-happyOut93 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut93 #-}-happyIn94 :: (Located PName) -> (HappyAbsSyn t69)-happyIn94 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn94 #-}-happyOut94 :: (HappyAbsSyn t69) -> (Located PName)-happyOut94 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut94 #-}-happyIn95 :: (Type PName) -> (HappyAbsSyn t69)-happyIn95 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn95 #-}-happyOut95 :: (HappyAbsSyn t69) -> (Type PName)-happyOut95 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut95 #-}-happyIn96 :: (Named (Type PName)) -> (HappyAbsSyn t69)-happyIn96 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn96 #-}-happyOut96 :: (HappyAbsSyn t69) -> (Named (Type PName))-happyOut96 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut96 #-}-happyIn97 :: ([Named (Type PName)]) -> (HappyAbsSyn t69)-happyIn97 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn97 #-}-happyOut97 :: (HappyAbsSyn t69) -> ([Named (Type PName)])-happyOut97 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut97 #-}-happyInTok :: (Located Token) -> (HappyAbsSyn t69)-happyInTok x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyInTok #-}-happyOutTok :: (HappyAbsSyn t69) -> (Located Token)-happyOutTok x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOutTok #-}---happyActOffsets :: HappyAddr-happyActOffsets = HappyA# "\xf9\xff\xc9\x01\xe1\x03\xd1\x02\xa8\x06\xa8\x06\xdf\x03\xf6\x03\xa2\x02\x00\x06\x36\x08\x0d\x03\xf7\x03\x36\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcc\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x09\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcc\x03\x00\x00\xcc\x03\xde\x05\xde\x05\x49\x08\xd8\x03\x00\x00\xd2\x05\xb0\x05\x00\x00\x00\x00\xa4\x05\xec\x04\x77\x07\x00\x00\x00\x00\xcb\x03\xf0\x03\x00\x00\x00\x00\x3b\x08\x00\x00\x28\x07\xde\x03\x00\x00\x00\x00\x00\x00\x00\x00\xf8\x06\xd1\x02\x73\x02\x7f\x01\xc6\x06\x05\x00\x6e\x07\xf8\x06\xea\x02\xea\x02\xc5\x03\xc5\x03\x3a\x06\xd9\x03\x89\x00\xf8\x06\xdd\x01\x65\x01\xbd\x03\x46\x01\xf9\x03\xed\x03\xec\x03\x38\x05\x10\x03\x19\x03\x29\x06\x00\x00\xad\x03\x09\x00\xad\x03\x2c\x02\xad\x03\xb5\x01\xbf\x03\x00\x00\x00\x00\xc8\x03\x00\x00\xdc\x03\x00\x00\xa2\x03\xf1\x01\xab\x03\x4e\x01\x00\x00\x0f\x01\x00\x00\x00\x00\x00\x00\x94\x06\x50\x01\x00\x00\x36\x08\x9e\x03\x00\x00\x9a\x07\x00\x00\xa0\x03\x71\x02\x00\x00\x6e\x00\x00\x00\x7a\x02\x8d\x03\x00\x00\x7c\x03\xb7\x03\xf6\xff\x00\x00\xb5\x03\x00\x00\xe4\x06\x00\x00\xfc\x01\x31\x00\x00\x00\x56\x07\x18\x09\x18\x09\x18\x09\xf8\x06\xd1\x02\xf8\x06\x85\x03\x6d\x03\xf8\x06\xda\x01\x97\x07\x82\x05\x00\x00\x00\x00\xfe\x01\x00\x00\x00\x00\x00\x00\x64\x03\x00\x00\x00\x00\x00\x00\x76\x05\xc5\x04\xe7\xff\x00\x00\x00\x00\x53\x03\x00\x00\x00\x00\x6f\x02\xd0\x06\x00\x00\x07\x02\x65\x03\xb3\x03\x00\x00\xea\x02\xea\x02\xbe\x01\x60\x03\x58\x03\x00\x00\xff\x00\x27\x00\x00\x00\x35\x00\xf8\x06\x32\x03\x54\x03\xea\x02\x76\x05\x00\x00\x63\x02\x00\x00\x44\x02\x43\x03\x95\x07\xa3\x07\xa7\x03\x00\x00\xa5\x01\x75\x07\x00\x00\x54\x05\x00\x00\x48\x05\x00\x00\x48\x05\x48\x05\x48\x05\x00\x00\x18\x09\x48\x05\x49\x08\x41\x03\x57\x03\x2d\x03\x00\x00\x18\x09\x00\x00\x18\x09\x62\x07\x54\x07\x00\x00\x03\x07\x0b\x03\x00\x00\x00\x00\x48\x05\x00\x00\x48\x05\x67\x02\x38\x05\x00\x00\x38\x05\x00\x00\x18\x09\x00\x00\x00\x00\x00\x00\x00\x00\x37\x03\xd1\x02\xd1\x02\xd1\x02\xd1\x02\x00\x00\xd1\x02\xd1\x02\x00\x00\xf8\x06\xd1\x02\x00\x00\x00\x00\x00\x00\xd1\x02\x22\x03\xd1\x02\x38\x05\x00\x00\x47\x03\x00\x00\x75\x00\xc6\x07\x30\x02\x0f\x03\x00\x00\x52\x01\x00\x00\xae\x07\xd1\x02\x80\x06\x00\x00\x80\x06\x00\x00\x00\x00\x00\x00\x18\x09\xdd\xff\xd1\x02\x00\x00\xfa\x02\x13\x03\x03\x03\x00\x00\xfd\x02\xfd\x02\xfd\x02\x00\x00\x4c\x07\x00\x00\x38\x05\x48\x05\x00\x00\xf8\x06\x00\x00\xf8\x06\x00\x00\x48\x05\x00\x00\xe4\x02\xf8\x06\x38\x05\x00\x00\x6c\x06\x1d\x06\x40\x02\x00\x00\x40\x02\x00\x00\xe5\x02\x18\x09\x40\x02\x00\x03\x00\x00\xc8\x02\x38\x05\xec\x07\x00\x00\xcc\x02\x05\x02\x05\x02\x00\x00\x00\x00\x36\x00\x00\x00\x36\x00\x40\x02\x3c\x07\xbc\x06\x00\x00\x81\x00\xab\x07\xf5\x01\xe0\x02\x26\x05\x00\x00\x00\x00\x02\x01\x00\x00\x4e\x06\x00\x00\x00\x00\x00\x00\xd1\x02\x18\x09\x00\x00\x00\x00\x18\x09\xce\x02\x00\x00\x1a\x05\x18\x09\xd1\x02\xae\x02\x94\x02\x00\x00\x00\x00\x00\x00\x00\x00\x38\x05\x00\x00\x1a\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa0\x02\xd1\x02\xa0\x02\x25\x02\x7f\x02\x70\x02\x00\x00\x5e\x02\x5b\x02\x5b\x02\x5b\x02\x00\x00\x00\x00\x5b\x02\xd1\x02\x00\x00\x2e\x02\x00\x00\x00\x00\x18\x09\x00\x00\x00\x00\x18\x09\x18\x09\x1a\x05\x00\x00\x03\x07\xf1\x01\x22\x02\xcd\x00\x1b\x02\xd1\x02\xf8\x06\xf8\x06\xd1\x02\x00\x00\x1b\x02\x18\x09\x1f\x02\x00\x00\x00\x00\xe1\x01\x00\x00\x18\x09\xcd\x00\xe1\x01\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\xcf\x01\x00\x00\xbc\x01\xd1\x02\xda\x02\xa7\x01\xcb\x00\x00\x00\x00\x00\x86\x01\xa7\x01\xae\x01\xd1\x02\x38\x05\xf8\x04\x9a\x01\x9e\x01\x89\x01\x00\x00\x6a\x01\x00\x00\x00\x00\x00\x00\x9a\x03\x00\x00\x6a\x01\x00\x00\xa4\x00\x00\x00\x00\x00\x00\x00\x38\x05\x00\x00\x00\x00"#--happyGotoOffsets :: HappyAddr-happyGotoOffsets = HappyA# "\x6f\x01\x63\x00\x39\x01\x9a\x04\x5b\x01\x11\x01\x0a\x01\x26\x01\xec\x00\xeb\x07\xdb\x02\x1a\x00\x00\x00\x7c\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa9\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\xf3\x08\x87\x03\x00\x00\x00\x00\x4f\x03\xbf\x02\x00\x00\x00\x00\xe7\x08\x3f\x08\x83\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x84\x03\x00\x00\x0c\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbb\x01\x5a\x03\x42\x03\x34\x03\x1f\x00\x78\x03\x49\x01\xe1\x00\xe9\x04\xac\x04\x00\x00\x00\x00\x07\x01\x00\x00\x00\x00\xb7\x00\x55\x01\x00\x00\xda\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x03\x70\x06\x60\x00\x6b\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa9\x00\x00\x00\xc7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x13\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2f\x01\xd4\x00\x00\x00\x4b\x02\x00\x00\x00\x00\xe2\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x16\x01\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x02\x7a\x03\x4e\x03\xb9\x02\xe3\x00\x8d\x04\x4f\x01\x00\x00\x00\x00\x9e\x00\x00\x00\xf0\xff\xde\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdb\x08\x18\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xab\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x65\x02\x37\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x76\x00\xdc\xff\x00\x00\x08\x02\xcf\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf5\x02\x00\x00\x00\x00\x64\x02\xf5\x02\x00\x00\xb1\x02\x00\x00\xc3\x08\x00\x00\xb7\x08\xab\x08\x23\x03\x00\x00\xf5\x02\x9f\x08\xf5\x02\x00\x00\x00\x00\x00\x00\x00\x00\xf5\x02\x00\x00\xf5\x02\xf5\x02\xf5\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x93\x08\x00\x00\x87\x08\x0c\x08\x36\x02\x00\x00\x71\x00\x00\x00\xf5\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x74\x04\xec\x05\x68\x03\x67\x04\x00\x00\x5a\x04\x41\x04\x00\x00\x88\x07\x34\x04\x00\x00\x00\x00\x00\x00\x27\x04\x00\x00\x0e\x04\xeb\xff\x00\x00\x00\x00\x00\x00\xcc\x00\xf5\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf5\x02\x9b\x02\x2d\x01\x00\x00\x1e\x01\x00\x00\x00\x00\x00\x00\xb6\x02\x00\x00\x01\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0e\x01\x00\x00\x42\x00\x7b\x08\x00\x00\xc0\x06\x00\x00\xbb\x06\x00\x00\x6f\x08\x00\x00\x00\x00\xba\x00\xd2\xff\x00\x00\x05\x01\x2c\x00\xd5\x00\x00\x00\xbc\x00\x00\x00\x00\x00\xaa\x02\x90\x00\xd6\x00\x00\x00\x00\x00\xd7\x01\x6c\x02\x00\x00\x00\x00\x45\x00\x23\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x72\x00\xfb\x01\x48\x00\x00\x00\x39\x02\x57\x01\x00\x00\x00\x00\xd1\x07\x00\x00\x00\x00\x00\x00\x00\x00\x13\x01\x00\x00\x00\x00\x00\x00\xf4\x03\x4c\x02\x00\x00\x00\x00\x4c\x02\x00\x00\x00\x00\x63\x08\x3c\x02\xdb\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3a\x00\x00\x00\x57\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xce\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc1\x03\x00\x00\x00\x00\x00\x00\x00\x00\xf4\x01\x00\x00\x00\x00\xf4\x01\xf4\x01\x4b\x08\x00\x00\x00\x00\x01\x00\x00\x00\x93\x00\x00\x00\xa8\x03\x49\x06\x92\x01\x9b\x03\x00\x00\x00\x00\xf4\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf4\x01\x33\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8e\x03\x0e\x01\x4f\x00\x00\x00\x00\x00\x00\x00\x2b\x01\x1b\x00\x00\x00\x75\x03\xfb\xff\xc4\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe0\xff\x00\x00\x00\x00"#--happyDefActions :: HappyAddr-happyDefActions = HappyA# "\x00\x00\xc5\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\xff\x91\xff\x8f\xff\x16\xff\x13\xff\x11\xff\x00\x00\x1b\xff\x12\xff\x18\xff\x17\xff\x19\xff\x1a\xff\x00\x00\x8d\xff\x8e\xff\x8a\xff\x8c\xff\x8b\xff\x89\xff\x88\xff\x90\xff\x15\xff\x00\x00\x14\xff\x00\x00\x00\x00\x00\x00\x45\xff\x32\xff\x2f\xff\x00\x00\x2e\xff\x2d\xff\x2c\xff\x00\x00\x00\x00\x00\x00\x25\xff\xa4\xff\x00\x00\xa5\xff\xa3\xff\x9b\xff\x98\xff\x96\xff\x94\xff\x85\xff\x83\xff\x82\xff\x81\xff\x80\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb4\xff\x00\x00\x00\x00\x55\xff\xb2\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53\xff\x00\x00\x00\x00\x00\x00\xc5\xff\x00\x00\xc5\xff\x00\x00\xcc\xff\xc6\xff\x00\x00\xce\xff\x00\x00\xc7\xff\x00\x00\xc5\xff\x00\x00\xef\xff\xea\xff\xee\xff\xd9\xff\xcf\xff\xd0\xff\xc6\xff\x00\x00\xd6\xff\x00\x00\x19\xff\xcd\xff\x00\x00\xdb\xff\x00\x00\x00\x00\xdc\xff\x00\x00\x47\xff\x00\x00\x00\x00\x4c\xff\x00\x00\x00\x00\x57\xff\x55\xff\x00\x00\x54\xff\x00\x00\x52\xff\x00\x00\x00\x00\x4f\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xae\xff\x00\x00\x00\x00\xac\xff\xaa\xff\x00\x00\xa6\xff\x92\xff\x93\xff\x00\x00\x0e\xff\x78\xff\x0d\xff\x00\x00\x00\x00\x00\x00\x73\xff\x71\xff\x70\xff\x75\xff\x68\xff\x00\x00\x00\x00\x7c\xff\x00\x00\x00\x00\x00\x00\x7d\xff\x8c\xff\x8b\xff\x65\xff\x64\xff\x00\x00\x7a\xff\x00\x00\x00\x00\x9e\xff\x00\x00\x54\xff\x00\x00\x84\xff\x00\x00\x00\x00\x3a\xff\x00\x00\x1d\xff\x00\x00\x3c\xff\x41\xff\x00\x00\x00\x00\x29\xff\x00\x00\x00\x00\x24\xff\x30\xff\x2e\xff\x00\x00\x31\xff\x00\x00\x00\x00\x00\x00\x3f\xff\x43\xff\x00\x00\x44\xff\x00\x00\x00\x00\x00\x00\x0f\xff\x42\xff\x33\xff\x34\xff\x00\x00\x00\x00\x23\xff\x22\xff\x00\x00\x27\xff\x28\xff\x00\x00\x2a\xff\x00\x00\x00\x00\x00\x00\x26\xff\x00\x00\x40\xff\x97\xff\x95\xff\x77\xff\x6e\xff\x6d\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x79\xff\x00\x00\x63\xff\x5f\xff\x00\x00\x00\x00\x7e\xff\x76\xff\x7f\xff\x00\x00\x00\x00\x00\x00\x00\x00\x7b\xff\x00\x00\x74\xff\x00\x00\x00\x00\x00\x00\x16\xff\x06\xff\x00\x00\x0b\xff\x00\x00\x00\x00\x00\x00\xa7\xff\x00\x00\xc4\xff\xb3\xff\xb2\xff\x00\x00\xad\xff\x00\x00\xab\xff\x56\xff\xc3\xff\x00\x00\x87\xff\xbb\xff\xbd\xff\xbc\xff\x36\xff\x00\x00\x38\xff\x00\x00\x00\x00\x4d\xff\x00\x00\x4e\xff\x00\x00\x50\xff\x00\x00\x51\xff\xb1\xff\x00\x00\x00\x00\x4b\xff\x00\x00\x00\x00\xc5\xff\xdd\xff\xc5\xff\xda\xff\x00\x00\x00\x00\xc5\xff\xe7\xff\xd1\xff\x00\x00\x00\x00\x00\x00\xd5\xff\x19\xff\xc5\xff\xc5\xff\xf2\xff\xec\xff\xf1\xff\xeb\xff\xf0\xff\xc5\xff\x00\x00\x00\x00\xd4\xff\xe0\xff\x00\x00\x00\x00\x00\x00\x00\x00\xd8\xff\xd7\xff\x00\x00\xa0\xff\x00\x00\xa2\xff\x46\xff\x48\xff\x00\x00\x58\xff\x4a\xff\x49\xff\xbf\xff\x00\x00\x35\xff\x00\x00\x00\x00\x00\x00\xc1\xff\x00\x00\xa9\xff\xa8\xff\x99\xff\x0c\xff\x00\x00\x0a\xff\x00\x00\x08\xff\x09\xff\x72\xff\x6f\xff\x67\xff\x6a\xff\x00\x00\x6c\xff\x6c\xff\x66\xff\x5d\xff\x5b\xff\x00\x00\x62\xff\x6b\xff\x9c\xff\x9d\xff\x9a\xff\xba\xff\x00\x00\x39\xff\x3c\xff\x1c\xff\x3b\xff\x1e\xff\x3d\xff\x3e\xff\x20\xff\x1f\xff\x00\x00\x2b\xff\x21\xff\xc5\xff\x00\x00\x00\x00\xb9\xff\x00\x00\x00\x00\x00\x00\x61\xff\x5e\xff\x69\xff\x07\xff\x00\x00\x05\xff\xb1\xff\xc0\xff\x86\xff\xbe\xff\x00\x00\xc2\xff\xa1\xff\x9f\xff\xc9\xff\x00\x00\xcb\xff\xe8\xff\xe9\xff\x00\x00\xe1\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xca\xff\xb8\xff\x00\x00\x00\x00\xd2\xff\x00\x00\xe2\xff\x00\x00\x00\x00\x60\xff\x5c\xff\x5a\xff\x59\xff\xf3\xff\x37\xff\xc8\xff\x00\x00\xe3\xff\xd3\xff\xb7\xff\x00\x00\xb6\xff\xb5\xff\xe6\xff\x00\x00\xe4\xff"#--happyCheck :: HappyAddr-happyCheck = HappyA# "\xff\xff\x06\x00\x01\x00\x02\x00\x03\x00\x28\x00\x01\x00\x17\x00\x2b\x00\x2d\x00\x11\x00\x39\x00\x0b\x00\x0c\x00\x27\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x01\x00\x02\x00\x03\x00\x16\x00\x17\x00\x32\x00\x2f\x00\x12\x00\x17\x00\x4b\x00\x0b\x00\x0c\x00\x2a\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x03\x00\x4b\x00\x2f\x00\x16\x00\x17\x00\x4b\x00\x27\x00\x37\x00\x0b\x00\x0c\x00\x15\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x4b\x00\x36\x00\x37\x00\x16\x00\x17\x00\x4b\x00\x4c\x00\x16\x00\x12\x00\x25\x00\x26\x00\x27\x00\x16\x00\x17\x00\x3b\x00\x1e\x00\x4b\x00\x1b\x00\x03\x00\x36\x00\x37\x00\x1a\x00\x4b\x00\x4c\x00\x2f\x00\x30\x00\x0b\x00\x0c\x00\x21\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x22\x00\x36\x00\x37\x00\x16\x00\x17\x00\x28\x00\x4b\x00\x4c\x00\x18\x00\x19\x00\x36\x00\x37\x00\x15\x00\x4b\x00\x4c\x00\x31\x00\x4e\x00\x4f\x00\x4b\x00\x08\x00\x37\x00\x0a\x00\x4b\x00\x4c\x00\x0d\x00\x3e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x01\x00\x4b\x00\x4c\x00\x16\x00\x17\x00\x36\x00\x37\x00\x0b\x00\x0c\x00\x37\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x4b\x00\x26\x00\x27\x00\x16\x00\x17\x00\x09\x00\x51\x00\x17\x00\x4b\x00\x18\x00\x19\x00\x4b\x00\x4c\x00\x24\x00\x4b\x00\x4c\x00\x35\x00\x36\x00\x37\x00\x38\x00\x36\x00\x37\x00\x0b\x00\x0c\x00\x2f\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x22\x00\x39\x00\x3a\x00\x16\x00\x17\x00\x36\x00\x37\x00\x21\x00\x4b\x00\x4c\x00\x37\x00\x4b\x00\x4c\x00\x3f\x00\x30\x00\x31\x00\x2a\x00\x0b\x00\x0c\x00\x4b\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x4b\x00\x4b\x00\x4c\x00\x16\x00\x17\x00\x4b\x00\x4c\x00\x18\x00\x19\x00\x21\x00\x36\x00\x37\x00\x0c\x00\x25\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x18\x00\x19\x00\x3e\x00\x16\x00\x17\x00\x0d\x00\x37\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x04\x00\x4b\x00\x4c\x00\x16\x00\x17\x00\x36\x00\x37\x00\x0c\x00\x37\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x14\x00\x4b\x00\x4c\x00\x16\x00\x17\x00\x22\x00\x37\x00\x35\x00\x36\x00\x37\x00\x36\x00\x37\x00\x4b\x00\x4c\x00\x4b\x00\x4c\x00\x2c\x00\x18\x00\x19\x00\x30\x00\x31\x00\x36\x00\x37\x00\x13\x00\x33\x00\x27\x00\x4b\x00\x4c\x00\x37\x00\x4b\x00\x4c\x00\x4b\x00\x4c\x00\x1d\x00\x1e\x00\x36\x00\x37\x00\x21\x00\x22\x00\x23\x00\x24\x00\x12\x00\x4b\x00\x4c\x00\x15\x00\x29\x00\x2a\x00\x12\x00\x37\x00\x12\x00\x37\x00\x16\x00\x17\x00\x16\x00\x17\x00\x1a\x00\x4b\x00\x4c\x00\x1b\x00\x12\x00\x22\x00\x12\x00\x1c\x00\x16\x00\x17\x00\x16\x00\x17\x00\x1a\x00\x4b\x00\x4c\x00\x4b\x00\x4c\x00\x12\x00\x22\x00\x30\x00\x31\x00\x16\x00\x17\x00\x2a\x00\x4b\x00\x4c\x00\x13\x00\x4e\x00\x36\x00\x37\x00\x36\x00\x37\x00\x12\x00\x31\x00\x12\x00\x09\x00\x16\x00\x17\x00\x16\x00\x17\x00\x36\x00\x37\x00\x36\x00\x37\x00\x35\x00\x36\x00\x37\x00\x38\x00\x41\x00\x4b\x00\x4c\x00\x4b\x00\x4c\x00\x36\x00\x37\x00\x06\x00\x4b\x00\x4c\x00\x4b\x00\x4e\x00\x0b\x00\x4b\x00\x4c\x00\x4b\x00\x4c\x00\x10\x00\x4b\x00\x4c\x00\x36\x00\x37\x00\x36\x00\x37\x00\x12\x00\x18\x00\x4b\x00\x4c\x00\x16\x00\x17\x00\x12\x00\x28\x00\x00\x00\x22\x00\x16\x00\x17\x00\x21\x00\x49\x00\x4a\x00\x4b\x00\x25\x00\x4b\x00\x4c\x00\x4b\x00\x4c\x00\x12\x00\x37\x00\x38\x00\x31\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x36\x00\x37\x00\x08\x00\x09\x00\x0a\x00\x04\x00\x36\x00\x37\x00\x28\x00\x08\x00\x09\x00\x0a\x00\x36\x00\x37\x00\x14\x00\x4b\x00\x4c\x00\x17\x00\x4e\x00\x19\x00\x50\x00\x4b\x00\x4c\x00\x37\x00\x17\x00\x1f\x00\x20\x00\x4b\x00\x4c\x00\x4b\x00\x24\x00\x4d\x00\x26\x00\x4b\x00\x4c\x00\x29\x00\x04\x00\x21\x00\x25\x00\x2d\x00\x08\x00\x09\x00\x0a\x00\x12\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x04\x00\x20\x00\x06\x00\x17\x00\x08\x00\x09\x00\x0a\x00\x12\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x25\x00\x24\x00\x17\x00\x04\x00\x19\x00\x06\x00\x12\x00\x08\x00\x09\x00\x0a\x00\x1f\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x24\x00\x1c\x00\x1d\x00\x1e\x00\x4b\x00\x4c\x00\x21\x00\x17\x00\x04\x00\x19\x00\x2e\x00\x28\x00\x08\x00\x09\x00\x0a\x00\x1f\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x24\x00\x1f\x00\x3a\x00\x3b\x00\x36\x00\x37\x00\x12\x00\x17\x00\x04\x00\x19\x00\x2e\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x1f\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x24\x00\x28\x00\x3a\x00\x3b\x00\x2b\x00\x4b\x00\x4c\x00\x17\x00\x04\x00\x19\x00\x2e\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x1f\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x24\x00\x1a\x00\x22\x00\x3b\x00\x12\x00\x26\x00\x27\x00\x17\x00\x21\x00\x19\x00\x2e\x00\x22\x00\x30\x00\x4b\x00\x4c\x00\x1f\x00\x30\x00\x31\x00\x20\x00\x21\x00\x24\x00\x2a\x00\x3a\x00\x24\x00\x12\x00\x30\x00\x31\x00\x04\x00\x29\x00\x2a\x00\x2e\x00\x08\x00\x09\x00\x0a\x00\x12\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x41\x00\x42\x00\x05\x00\x3a\x00\x07\x00\x1c\x00\x1d\x00\x17\x00\x04\x00\x19\x00\x4b\x00\x28\x00\x08\x00\x09\x00\x0a\x00\x1f\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x24\x00\x21\x00\x30\x00\x4b\x00\x4c\x00\x25\x00\x4e\x00\x17\x00\x2a\x00\x19\x00\x2e\x00\x24\x00\x30\x00\x41\x00\x42\x00\x1f\x00\x29\x00\x2a\x00\x26\x00\x27\x00\x24\x00\x21\x00\x3a\x00\x4b\x00\x01\x00\x25\x00\x03\x00\x04\x00\x05\x00\x12\x00\x2e\x00\x08\x00\x09\x00\x0a\x00\x26\x00\x27\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x1b\x00\x3a\x00\x08\x00\x09\x00\x0a\x00\x17\x00\x49\x00\x19\x00\x4b\x00\x4b\x00\x4c\x00\x21\x00\x4e\x00\x1f\x00\x14\x00\x25\x00\x24\x00\x17\x00\x24\x00\x19\x00\x1a\x00\x29\x00\x2a\x00\x21\x00\x21\x00\x1f\x00\x22\x00\x25\x00\x2e\x00\x4b\x00\x24\x00\x4d\x00\x26\x00\x33\x00\x21\x00\x29\x00\x1e\x00\x37\x00\x25\x00\x2d\x00\x30\x00\x31\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x35\x00\x36\x00\x08\x00\x09\x00\x0a\x00\x49\x00\x4a\x00\x4b\x00\x4b\x00\x4c\x00\x12\x00\x4e\x00\x20\x00\x13\x00\x14\x00\x4b\x00\x4c\x00\x17\x00\x4e\x00\x19\x00\x21\x00\x22\x00\x23\x00\x24\x00\x12\x00\x1f\x00\x3f\x00\x40\x00\x29\x00\x2a\x00\x24\x00\x4b\x00\x26\x00\x4d\x00\x02\x00\x29\x00\x49\x00\x4a\x00\x4b\x00\x2d\x00\x26\x00\x27\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x35\x00\x36\x00\x08\x00\x09\x00\x0a\x00\x26\x00\x27\x00\x04\x00\x26\x00\x27\x00\x28\x00\x08\x00\x09\x00\x0a\x00\x14\x00\x4b\x00\x4c\x00\x17\x00\x4e\x00\x19\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x1f\x00\x17\x00\x08\x00\x09\x00\x0a\x00\x24\x00\x45\x00\x26\x00\x2a\x00\x1f\x00\x29\x00\x2f\x00\x4b\x00\x4c\x00\x2d\x00\x4e\x00\x20\x00\x17\x00\x28\x00\x19\x00\x45\x00\x46\x00\x35\x00\x36\x00\x08\x00\x1f\x00\x4b\x00\x4c\x00\x28\x00\x4e\x00\x24\x00\x2a\x00\x26\x00\x04\x00\x05\x00\x29\x00\x04\x00\x08\x00\x09\x00\x0a\x00\x08\x00\x09\x00\x0a\x00\x26\x00\x27\x00\x04\x00\x21\x00\x35\x00\x36\x00\x08\x00\x09\x00\x0a\x00\x17\x00\x12\x00\x4b\x00\x17\x00\x4d\x00\x19\x00\x1a\x00\x28\x00\x1f\x00\x4b\x00\x4c\x00\x1f\x00\x17\x00\x37\x00\x19\x00\x01\x00\x24\x00\x2a\x00\x04\x00\x28\x00\x1f\x00\x20\x00\x08\x00\x09\x00\x0a\x00\x24\x00\x2e\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x2e\x00\x01\x00\x17\x00\x28\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x1e\x00\x4b\x00\x4c\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x2f\x00\x29\x00\x2a\x00\x28\x00\x1e\x00\x20\x00\x2e\x00\x21\x00\x22\x00\x23\x00\x24\x00\x44\x00\x45\x00\x12\x00\x47\x00\x29\x00\x2a\x00\x2a\x00\x4b\x00\x4c\x00\x2e\x00\x4e\x00\x1a\x00\x31\x00\x26\x00\x27\x00\x28\x00\x23\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x4b\x00\x4c\x00\x21\x00\x4e\x00\x29\x00\x2a\x00\x20\x00\x1e\x00\x34\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x4b\x00\x4c\x00\x2b\x00\x4e\x00\x29\x00\x2a\x00\x1e\x00\x45\x00\x28\x00\x21\x00\x22\x00\x23\x00\x24\x00\x4b\x00\x4c\x00\x20\x00\x4e\x00\x29\x00\x2a\x00\x26\x00\x27\x00\x28\x00\x2b\x00\x2c\x00\x4b\x00\x4c\x00\x22\x00\x4e\x00\x25\x00\x26\x00\x27\x00\x1e\x00\x26\x00\x27\x00\x21\x00\x22\x00\x23\x00\x24\x00\x4b\x00\x4c\x00\x28\x00\x4e\x00\x29\x00\x2a\x00\x1e\x00\x20\x00\x21\x00\x21\x00\x22\x00\x23\x00\x24\x00\x4b\x00\x4c\x00\x22\x00\x4e\x00\x29\x00\x2a\x00\x1e\x00\x20\x00\x21\x00\x21\x00\x22\x00\x23\x00\x24\x00\x2f\x00\x25\x00\x26\x00\x27\x00\x29\x00\x2a\x00\x20\x00\x21\x00\x20\x00\x21\x00\x20\x00\x21\x00\x4b\x00\x4c\x00\x30\x00\x4e\x00\x3b\x00\x02\x00\x1e\x00\x18\x00\x22\x00\x21\x00\x22\x00\x23\x00\x24\x00\x4b\x00\x4c\x00\x3b\x00\x4e\x00\x29\x00\x2a\x00\x1e\x00\x01\x00\x01\x00\x21\x00\x22\x00\x23\x00\x24\x00\x4b\x00\x4c\x00\x38\x00\x4e\x00\x29\x00\x2a\x00\x1e\x00\x01\x00\x22\x00\x21\x00\x22\x00\x23\x00\x24\x00\x3b\x00\x23\x00\x12\x00\x2b\x00\x29\x00\x2a\x00\x3b\x00\x3b\x00\x11\x00\x13\x00\xff\xff\xff\xff\x4b\x00\x4c\x00\x2f\x00\x4e\x00\x2f\x00\xff\xff\x1e\x00\xff\xff\xff\xff\x21\x00\x22\x00\x23\x00\x24\x00\x4b\x00\x4c\x00\xff\xff\x4e\x00\x29\x00\x2a\x00\x1e\x00\xff\xff\xff\xff\x21\x00\x22\x00\x23\x00\x24\x00\x4b\x00\x4c\x00\xff\xff\x4e\x00\x29\x00\x2a\x00\x1e\x00\xff\xff\xff\xff\x21\x00\x22\x00\x23\x00\x24\x00\xff\xff\xff\xff\xff\xff\xff\xff\x29\x00\x2a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4b\x00\x4c\x00\xff\xff\x4e\x00\xff\xff\xff\xff\x1e\x00\xff\xff\xff\xff\x21\x00\x22\x00\x23\x00\x24\x00\x4b\x00\x4c\x00\xff\xff\x4e\x00\x29\x00\x2a\x00\x1e\x00\xff\xff\xff\xff\x21\x00\x22\x00\x23\x00\x24\x00\x4b\x00\x4c\x00\xff\xff\x4e\x00\x29\x00\x2a\x00\x1e\x00\xff\xff\xff\xff\x21\x00\x22\x00\x23\x00\x24\x00\xff\xff\xff\xff\xff\xff\xff\xff\x29\x00\x2a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4b\x00\x4c\x00\xff\xff\x4e\x00\xff\xff\xff\xff\x1e\x00\xff\xff\xff\xff\x21\x00\x22\x00\x23\x00\x24\x00\x4b\x00\x4c\x00\xff\xff\x4e\x00\x29\x00\x2a\x00\x1e\x00\xff\xff\xff\xff\x21\x00\x22\x00\x23\x00\x24\x00\x4b\x00\x4c\x00\xff\xff\x4e\x00\x29\x00\x2a\x00\x1e\x00\xff\xff\xff\xff\x21\x00\x22\x00\x23\x00\x24\x00\xff\xff\xff\xff\xff\xff\xff\xff\x29\x00\x2a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4b\x00\x4c\x00\xff\xff\x4e\x00\xff\xff\xff\xff\x1e\x00\xff\xff\xff\xff\x21\x00\x22\x00\x23\x00\x24\x00\x4b\x00\x4c\x00\xff\xff\x4e\x00\x29\x00\x2a\x00\x1e\x00\xff\xff\xff\xff\x21\x00\x22\x00\x23\x00\x24\x00\x4b\x00\x4c\x00\xff\xff\x4e\x00\x29\x00\x2a\x00\xff\xff\x01\x00\xff\xff\x03\x00\x04\x00\x05\x00\xff\xff\xff\xff\x08\x00\x09\x00\x0a\x00\x24\x00\xff\xff\xff\xff\xff\xff\xff\xff\x29\x00\x2a\x00\xff\xff\x4b\x00\x4c\x00\xff\xff\x4e\x00\x17\x00\xff\xff\x19\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1f\x00\x4b\x00\x4c\x00\xff\xff\x4e\x00\x24\x00\x25\x00\xff\xff\xff\xff\x01\x00\xff\xff\x03\x00\x04\x00\x05\x00\xff\xff\x2e\x00\x08\x00\x09\x00\x0a\x00\x4b\x00\x4c\x00\x01\x00\x4e\x00\x03\x00\x04\x00\x05\x00\xff\xff\xff\xff\x08\x00\x09\x00\x0a\x00\x17\x00\xff\xff\x19\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1f\x00\x20\x00\x24\x00\xff\xff\x17\x00\x24\x00\x19\x00\x29\x00\x2a\x00\xff\xff\xff\xff\xff\xff\x1f\x00\xff\xff\xff\xff\x2e\x00\x01\x00\x24\x00\x03\x00\x04\x00\x05\x00\xff\xff\xff\xff\x08\x00\x09\x00\x0a\x00\xff\xff\x2e\x00\x01\x00\xff\xff\x03\x00\x04\x00\x05\x00\xff\xff\xff\xff\x08\x00\x09\x00\x0a\x00\x17\x00\xff\xff\x19\x00\x4b\x00\x4c\x00\xff\xff\x4e\x00\xff\xff\x1f\x00\xff\xff\xff\xff\x04\x00\x17\x00\x24\x00\x19\x00\x08\x00\x09\x00\x0a\x00\xff\xff\xff\xff\x1f\x00\xff\xff\xff\xff\x2e\x00\x01\x00\x24\x00\x03\x00\x04\x00\x05\x00\xff\xff\x17\x00\x08\x00\x09\x00\x0a\x00\xff\xff\x2e\x00\x01\x00\xff\xff\x03\x00\x04\x00\x05\x00\xff\xff\xff\xff\x08\x00\x09\x00\x0a\x00\x17\x00\xff\xff\x19\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1f\x00\xff\xff\xff\xff\xff\xff\x17\x00\x24\x00\x19\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1f\x00\xff\xff\xff\xff\x2e\x00\x01\x00\x24\x00\x03\x00\x04\x00\x05\x00\xff\xff\xff\xff\x08\x00\x09\x00\x0a\x00\xff\xff\x2e\x00\x01\x00\xff\xff\x03\x00\x04\x00\x05\x00\xff\xff\xff\xff\x08\x00\x09\x00\x0a\x00\x17\x00\xff\xff\x19\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1f\x00\xff\xff\xff\xff\xff\xff\x17\x00\x24\x00\x19\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1f\x00\xff\xff\xff\xff\x2e\x00\x01\x00\x24\x00\x03\x00\x04\x00\x05\x00\xff\xff\xff\xff\x08\x00\x09\x00\x0a\x00\xff\xff\x2e\x00\x01\x00\xff\xff\x03\x00\x04\x00\x05\x00\xff\xff\xff\xff\x08\x00\x09\x00\x0a\x00\x17\x00\xff\xff\x19\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1f\x00\xff\xff\xff\xff\xff\xff\x17\x00\x24\x00\x19\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1f\x00\xff\xff\xff\xff\x2e\x00\x01\x00\x24\x00\x03\x00\x04\x00\x05\x00\xff\xff\xff\xff\x08\x00\x09\x00\x0a\x00\xff\xff\x2e\x00\x01\x00\xff\xff\x03\x00\x04\x00\x05\x00\xff\xff\xff\xff\x08\x00\x09\x00\x0a\x00\x17\x00\xff\xff\x19\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1f\x00\xff\xff\xff\xff\xff\xff\x17\x00\x24\x00\x19\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1f\x00\xff\xff\xff\xff\x2e\x00\x01\x00\x24\x00\x03\x00\x04\x00\x05\x00\xff\xff\xff\xff\x08\x00\x09\x00\x0a\x00\xff\xff\x2e\x00\x21\x00\x22\x00\x23\x00\x24\x00\xff\xff\xff\xff\xff\xff\xff\xff\x29\x00\x2a\x00\x17\x00\xff\xff\x19\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1f\x00\xff\xff\x04\x00\xff\xff\xff\xff\x24\x00\x08\x00\x09\x00\x0a\x00\xff\xff\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x04\x00\x2e\x00\xff\xff\xff\xff\x08\x00\x09\x00\x0a\x00\x17\x00\xff\xff\x19\x00\x4b\x00\x4c\x00\xff\xff\x4e\x00\xff\xff\x1f\x00\xff\xff\x04\x00\xff\xff\x17\x00\x24\x00\x08\x00\x09\x00\x0a\x00\xff\xff\x0c\x00\x0d\x00\x0e\x00\x0f\x00\xff\xff\x2e\x00\xff\xff\x30\x00\x25\x00\xff\xff\xff\xff\x17\x00\x04\x00\x19\x00\xff\xff\xff\xff\x08\x00\x09\x00\x0a\x00\x1f\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x24\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x17\x00\xff\xff\x19\x00\x2e\x00\xff\xff\x30\x00\xff\xff\xff\xff\x1f\x00\xff\xff\xff\xff\x04\x00\xff\xff\x24\x00\x25\x00\x08\x00\x09\x00\x0a\x00\xff\xff\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x2e\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\xff\xff\x17\x00\x04\x00\x19\x00\xff\xff\xff\xff\x08\x00\x09\x00\x0a\x00\x1f\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x24\x00\x25\x00\xff\xff\xff\xff\x4b\x00\x4c\x00\xff\xff\x17\x00\x04\x00\x19\x00\x2e\x00\xff\xff\x08\x00\x09\x00\x0a\x00\x1f\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x24\x00\x35\x00\x36\x00\x37\x00\x38\x00\xff\xff\xff\xff\x17\x00\x04\x00\x19\x00\x2e\x00\xff\xff\x08\x00\x09\x00\x0a\x00\x1f\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x24\x00\xff\xff\xff\xff\x4b\x00\x4c\x00\xff\xff\xff\xff\x17\x00\x04\x00\x19\x00\x2e\x00\xff\xff\x08\x00\x09\x00\x0a\x00\x1f\x00\xff\xff\xff\xff\x04\x00\xff\xff\x24\x00\xff\xff\x08\x00\x09\x00\x0a\x00\xff\xff\xff\xff\x17\x00\x04\x00\x19\x00\x2e\x00\xff\xff\x08\x00\x09\x00\x0a\x00\x1f\x00\xff\xff\x17\x00\xff\xff\xff\xff\x24\x00\xff\xff\xff\xff\xff\xff\x28\x00\xff\xff\xff\xff\x17\x00\x04\x00\x19\x00\x2e\x00\x25\x00\x08\x00\x09\x00\x0a\x00\x1f\x00\x35\x00\x36\x00\x37\x00\xff\xff\x24\x00\x35\x00\x36\x00\x37\x00\x28\x00\xff\xff\xff\xff\x17\x00\x04\x00\x19\x00\x2e\x00\xff\xff\x08\x00\x09\x00\x0a\x00\x1f\x00\x20\x00\xff\xff\x4b\x00\x4c\x00\x24\x00\xff\xff\xff\xff\x4b\x00\x4c\x00\xff\xff\xff\xff\x17\x00\xff\xff\x19\x00\x2e\x00\xff\xff\xff\xff\x12\x00\xff\xff\x1f\x00\x15\x00\x16\x00\xff\xff\xff\xff\x24\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\xff\xff\x20\x00\x21\x00\x22\x00\x2e\x00\xff\xff\x25\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x2b\x00\x2c\x00\x08\x00\x09\x00\x0a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\xff\xff\xff\xff\x3b\x00\x17\x00\x04\x00\x19\x00\xff\xff\xff\xff\x08\x00\x09\x00\x0a\x00\x1f\x00\xff\xff\xff\xff\xff\xff\xff\xff\x24\x00\xff\xff\x26\x00\xff\xff\x04\x00\x29\x00\xff\xff\x17\x00\x08\x00\x09\x00\x0a\x00\xff\xff\xff\xff\xff\xff\x04\x00\x1f\x00\xff\xff\xff\xff\x08\x00\x09\x00\x0a\x00\xff\xff\xff\xff\x17\x00\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1f\x00\xff\xff\x17\x00\x1a\x00\x01\x00\xff\xff\xff\xff\x04\x00\x05\x00\x28\x00\x1f\x00\x08\x00\x09\x00\x0a\x00\xff\xff\xff\xff\x04\x00\x1a\x00\xff\xff\x28\x00\x08\x00\x09\x00\x0a\x00\xff\xff\xff\xff\xff\xff\x17\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x1f\x00\x17\x00\x1a\x00\xff\xff\xff\xff\x24\x00\xff\xff\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x04\x00\x25\x00\xff\xff\x04\x00\x08\x00\x09\x00\x0a\x00\x08\x00\x09\x00\x0a\x00\xff\xff\xff\xff\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x17\x00\x04\x00\x05\x00\x17\x00\xff\xff\x08\x00\x09\x00\x0a\x00\x1f\x00\x22\x00\xff\xff\x1f\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x2b\x00\x2c\x00\x17\x00\x20\x00\x21\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x20\x00\xff\xff\x3b\x00\xff\xff\xff\xff\x4b\x00\x4c\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\xff\xff\xff\xff\xff\xff\xff\xff\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x21\x00\xff\xff\xff\xff\xff\xff\x25\x00\xff\xff\xff\xff\xff\xff\xff\xff\x04\x00\x05\x00\xff\xff\xff\xff\x08\x00\x09\x00\x0a\x00\xff\xff\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x3b\x00\x3c\x00\x3d\x00\xff\xff\x17\x00\xff\xff\xff\xff\xff\xff\x43\x00\x44\x00\x45\x00\xff\xff\x47\x00\x3b\x00\x3c\x00\x3d\x00\x4b\x00\x4c\x00\xff\xff\x4e\x00\xff\xff\x43\x00\x44\x00\x45\x00\xff\xff\x47\x00\x3b\x00\x3c\x00\x3d\x00\x4b\x00\x4c\x00\xff\xff\x4e\x00\xff\xff\x43\x00\x44\x00\x45\x00\xff\xff\x47\x00\x3b\x00\x3c\x00\x3d\x00\x4b\x00\x4c\x00\xff\xff\x4e\x00\xff\xff\x43\x00\x44\x00\x45\x00\xff\xff\x47\x00\xff\xff\xff\xff\xff\xff\x4b\x00\x4c\x00\xff\xff\x4e\x00\x04\x00\x05\x00\xff\xff\x3d\x00\x08\x00\x09\x00\x0a\x00\xff\xff\xff\xff\x43\x00\x44\x00\x45\x00\xff\xff\x47\x00\xff\xff\xff\xff\x3e\x00\x4b\x00\x4c\x00\x17\x00\x4e\x00\x43\x00\x44\x00\x45\x00\xff\xff\x47\x00\xff\xff\xff\xff\xff\xff\x4b\x00\x4c\x00\xff\xff\x4e\x00\x43\x00\x44\x00\x45\x00\xff\xff\x47\x00\x48\x00\xff\xff\xff\xff\x4b\x00\x4c\x00\x2a\x00\x4e\x00\xff\xff\xff\xff\x51\x00\x52\x00\xff\xff\xff\xff\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x2c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x43\x00\x44\x00\x45\x00\xff\xff\x47\x00\x48\x00\xff\xff\xff\xff\x4b\x00\x4c\x00\xff\xff\x4e\x00\x43\x00\x44\x00\x45\x00\xff\xff\x47\x00\xff\xff\xff\xff\xff\xff\x4b\x00\x4c\x00\xff\xff\x4e\x00\x43\x00\x44\x00\x45\x00\xff\xff\x47\x00\xff\xff\xff\xff\xff\xff\x4b\x00\x4c\x00\xff\xff\x4e\x00\x43\x00\x44\x00\x45\x00\xff\xff\x47\x00\xff\xff\xff\xff\xff\xff\x4b\x00\x4c\x00\xff\xff\x4e\x00\x43\x00\x44\x00\x45\x00\xff\xff\x47\x00\xff\xff\xff\xff\xff\xff\x4b\x00\x4c\x00\xff\xff\x4e\x00\x43\x00\x44\x00\x45\x00\xff\xff\x47\x00\xff\xff\xff\xff\xff\xff\x4b\x00\x4c\x00\xff\xff\x4e\x00\x43\x00\x44\x00\x45\x00\xff\xff\x47\x00\xff\xff\xff\xff\xff\xff\x4b\x00\x4c\x00\xff\xff\x4e\x00\x43\x00\x44\x00\x45\x00\xff\xff\x47\x00\xff\xff\xff\xff\xff\xff\x4b\x00\x4c\x00\xff\xff\x4e\x00\x43\x00\x44\x00\x45\x00\xff\xff\x47\x00\xff\xff\xff\xff\xff\xff\x4b\x00\x4c\x00\xff\xff\x4e\x00\x43\x00\x44\x00\x45\x00\xff\xff\x47\x00\xff\xff\xff\xff\xff\xff\x4b\x00\x4c\x00\xff\xff\x4e\x00\x43\x00\x44\x00\x45\x00\xff\xff\x47\x00\xff\xff\xff\xff\xff\xff\x4b\x00\x4c\x00\xff\xff\x4e\x00\x43\x00\x44\x00\x45\x00\xff\xff\x47\x00\xff\xff\xff\xff\xff\xff\x4b\x00\x4c\x00\xff\xff\x4e\x00\x43\x00\x44\x00\x45\x00\xff\xff\x47\x00\xff\xff\xff\xff\xff\xff\x4b\x00\x4c\x00\xff\xff\x4e\x00\x43\x00\x44\x00\x45\x00\xff\xff\x47\x00\xff\xff\xff\xff\xff\xff\x4b\x00\x4c\x00\xff\xff\x4e\x00\x43\x00\x44\x00\x45\x00\xff\xff\x47\x00\xff\xff\xff\xff\xff\xff\x4b\x00\x4c\x00\xff\xff\x4e\x00\x43\x00\x44\x00\x45\x00\xff\xff\x47\x00\xff\xff\xff\xff\xff\xff\x4b\x00\x4c\x00\xff\xff\x4e\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"#--happyTable :: HappyAddr-happyTable = HappyA# "\x00\x00\xc1\x01\x91\x01\x6e\x00\x6f\x00\xaf\xff\xab\x00\x18\x01\xaf\xff\xf3\x00\x0e\x00\x5b\x01\x70\x00\x71\x00\x0b\x01\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x6d\x00\x6e\x00\x6f\x00\x50\x00\x51\x00\x0c\x01\x74\x01\x80\x00\xac\x00\x82\x00\x70\x00\x71\x00\x30\x01\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x48\x01\xf4\x00\x6d\x00\x50\x00\x51\x00\xca\x01\xad\x00\x96\x00\x49\x01\x71\x00\xc4\x01\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\xaf\x00\x53\x00\x54\x00\x50\x00\x51\x00\x11\x00\x19\x01\xf9\x00\x9d\x00\x0e\x00\x0f\x00\x10\x00\x50\x00\x51\x00\xff\xff\xfa\x00\xc2\x01\x57\x01\x4a\x01\x53\x00\x54\x00\x2b\x01\x11\x00\x55\x00\xad\x00\xae\x00\x4b\x01\x71\x00\x2c\x01\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x38\x01\x53\x00\x54\x00\x50\x00\x51\x00\xf8\x00\x11\x00\x55\x00\xac\x01\x98\x00\x53\x00\x54\x00\xb2\x01\x11\x00\x12\x00\x3a\x01\x13\x00\x14\x00\xaf\x00\x62\x00\x96\x00\x63\x00\x11\x00\x55\x00\x64\x00\xb9\x01\x65\x00\x66\x00\x67\x00\x68\x00\xab\x00\x11\x00\x55\x00\x50\x00\x51\x00\x53\x00\x54\x00\xb0\x01\x71\x00\x99\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x9b\x01\x84\x00\x10\x00\x50\x00\x51\x00\xac\x01\x9c\x01\xac\x00\x62\x01\xf6\x00\x98\x00\x11\x00\x55\x00\x36\x01\x11\x00\x89\x00\x85\x00\x86\x00\x87\x00\x88\x00\x53\x00\x54\x00\x52\x01\x71\x00\x37\x01\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\xe5\xff\x80\x00\x81\x00\x50\x00\x51\x00\x53\x00\x54\x00\x9b\x00\x11\x00\x89\x00\x99\x00\x11\x00\x55\x00\x84\x01\xe5\xff\xe5\xff\x9c\x00\x7d\x00\x71\x00\x82\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x85\x01\x11\x00\x55\x00\x50\x00\x51\x00\x11\x00\x89\x00\x05\x01\x98\x00\xee\x00\x53\x00\x54\x00\x55\x01\xc8\x01\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x97\x00\x98\x00\x87\x01\x50\x00\x51\x00\x7c\x00\x1b\x01\x65\x00\x66\x00\x67\x00\x68\x00\x50\x01\x11\x00\x55\x00\x50\x00\x51\x00\x53\x00\x54\x00\x56\x01\x99\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x3f\x01\x11\x00\x89\x00\x50\x00\x51\x00\x38\x01\x99\x00\x5c\x01\x86\x00\x87\x00\x53\x00\x54\x00\x11\x00\x55\x00\x11\x00\x89\x00\x72\x01\xa2\x00\x98\x00\xb2\x01\x3a\x01\x53\x00\x54\x00\x35\x00\x8a\x01\x93\x00\x11\x00\x89\x00\x8b\x01\x11\x00\x89\x00\x11\x00\x55\x00\x36\x00\x37\x00\x53\x00\x54\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x80\x00\x11\x00\x55\x00\xfb\x00\x3c\x00\x3d\x00\x4f\x00\x99\x00\x9d\x00\x20\x01\x50\x00\x51\x00\x50\x00\x51\x00\x59\x01\x11\x00\x55\x00\x9e\x00\x4f\x00\x15\x01\x96\x00\x4d\x00\x50\x00\x51\x00\x50\x00\x51\x00\x52\x00\x11\x00\x89\x00\x11\x00\x89\x00\x69\x01\x38\x01\xa5\x01\x17\x01\x50\x00\x51\x00\xc1\x00\x11\x00\x12\x00\x4c\x00\x3e\x00\x53\x00\x54\x00\x53\x00\x54\x00\x6a\x01\x3a\x01\x43\x01\x60\x00\x50\x00\x51\x00\x50\x00\x51\x00\x53\x00\x54\x00\x53\x00\x54\x00\x85\x00\x86\x00\x87\x00\x88\x00\x63\x01\x11\x00\x55\x00\x11\x00\x55\x00\x53\x00\x54\x00\x41\x01\x11\x00\x12\x00\x27\x01\x3e\x00\x42\x01\x11\x00\x55\x00\x11\x00\x55\x00\x43\x01\x11\x00\x89\x00\x53\x00\x54\x00\x53\x00\x54\x00\x96\x00\x7b\x00\x11\x00\x55\x00\x50\x00\x51\x00\x5e\x00\x54\xff\x6b\x00\x46\x01\x50\x00\x51\x00\x6e\x01\xc6\x00\xc5\x01\xe6\x00\x6f\x01\x11\x00\x55\x00\x11\x00\x55\x00\x80\x00\x54\xff\x54\xff\x47\x01\x40\x00\x41\x00\x42\x00\x16\x00\x17\x00\x1e\x01\x87\x00\x18\x00\x19\x00\x1a\x00\x16\x00\x53\x00\x54\x00\x95\x00\x18\x00\x19\x00\x1a\x00\x53\x00\x54\x00\x44\x00\x11\x00\x12\x00\x1b\x00\xa3\x00\x45\x00\xa4\x00\x11\x00\x89\x00\x96\x00\x1b\x00\x46\x00\xb5\x00\x11\x00\x55\x00\x24\x00\x47\x00\xa8\x01\x48\x00\x11\x00\x55\x00\x49\x00\x16\x00\x96\x01\xc7\x01\x4a\x00\x18\x00\x19\x00\x1a\x00\x80\x00\x1d\x00\x1e\x00\x1f\x00\xb6\x00\xb7\x00\x22\x00\x23\x00\x24\x00\x16\x00\xc0\x01\x6a\x00\x1b\x00\x18\x00\x19\x00\x1a\x00\x80\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xbb\x01\x7b\x01\x7c\x01\x86\x00\x87\x00\xe8\x00\xb4\x01\x1b\x00\x16\x00\x5b\x00\x6a\x00\x80\x00\x18\x00\x19\x00\x1a\x00\x5c\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5d\x00\xfe\x00\xff\x00\x00\x01\x11\x00\x89\x00\x01\x01\x1b\x00\x16\x00\x5b\x00\x5e\x00\xb7\x01\x18\x00\x19\x00\x1a\x00\x5c\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5d\x00\xb8\x01\x6b\x00\xdf\xff\xbe\x00\x87\x00\x80\x00\x1b\x00\x16\x00\x5b\x00\x5e\x00\x78\x00\x18\x00\x19\x00\x79\x00\x5c\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5d\x00\xb0\xff\x6b\x00\xde\xff\xb0\xff\x11\x00\xbf\x00\x1b\x00\x16\x00\x5b\x00\x5e\x00\x78\x00\x18\x00\x19\x00\x79\x00\x5c\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5d\x00\x2d\x01\x38\x01\xff\xff\x80\x00\xd6\x00\x10\x00\x1b\x00\x2e\x01\x5b\x00\x5e\x00\x15\x01\xed\xff\x11\x00\x4e\x01\x5c\x00\xa8\x01\x3a\x01\x04\x01\x05\x01\x5d\x00\xb9\x01\x6b\x00\xf2\x00\x80\x00\x16\x01\x17\x01\x16\x00\x3c\x00\x3d\x00\x5e\x00\x18\x00\x19\x00\x79\x00\x80\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x25\x01\xae\x01\xa9\x01\x6b\x00\xaa\x01\x98\x01\x99\x01\x1b\x00\x16\x00\x5b\x00\x27\x01\x70\x01\x18\x00\x19\x00\x79\x00\x5c\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5d\x00\xea\x00\xbf\x01\x11\x00\x12\x00\x71\x01\x3e\x00\x1b\x00\x93\x01\x5b\x00\x5e\x00\xa0\x00\x7f\x00\x25\x01\x26\x01\x5c\x00\x3c\x00\x3d\x00\x9f\x01\x10\x00\x5d\x00\xee\x00\x6b\x00\x27\x01\x30\x00\xef\x00\x31\x00\x16\x00\x17\x00\x80\x00\x5e\x00\x18\x00\x19\x00\x1a\x00\xd6\x00\x10\x00\x40\x00\x41\x00\x42\x00\x16\x00\x17\x00\x95\x01\x6b\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x86\x01\x32\x00\xe6\x00\x11\x00\x12\x00\xf0\x00\x3e\x00\x33\x00\x44\x00\xf1\x00\xa1\x00\x1b\x00\xce\x00\x45\x00\xbb\x00\x3c\x00\x3d\x00\x08\x01\x96\x01\x46\x00\x38\x01\x09\x01\x35\x00\x24\x00\x47\x00\x3e\x01\x48\x00\x8a\x01\x34\x01\x49\x00\x97\x01\x8b\x01\x35\x01\x4a\x00\x39\x01\x3a\x01\x40\x00\x41\x00\x42\x00\x16\x00\x17\x00\x4b\x00\x4c\x00\x18\x00\x19\x00\x1a\x00\xc6\x00\xc7\x00\xe6\x00\x11\x00\x12\x00\x80\x00\x3e\x00\x9e\x01\x43\x00\x44\x00\x11\x00\x12\x00\x1b\x00\x4d\x01\x45\x00\x6b\x01\x39\x00\x3a\x00\x3b\x00\x80\x00\x46\x00\xc4\x00\xc5\x00\x3c\x00\x3d\x00\x47\x00\x24\x00\x48\x00\xdc\x00\x50\x01\x49\x00\xc6\x00\xc7\x00\xc8\x00\x4a\x00\x53\x01\x10\x00\x40\x00\x41\x00\x42\x00\x16\x00\x17\x00\x4b\x00\x4c\x00\x18\x00\x19\x00\x1a\x00\x68\x01\x10\x00\x16\x00\x21\x01\x10\x00\x22\x01\x18\x00\x19\x00\x1a\x00\x44\x00\x11\x00\x12\x00\x1b\x00\x3e\x00\x45\x00\x40\x00\x41\x00\x42\x00\x16\x00\x17\x00\x46\x00\x1b\x00\x18\x00\x19\x00\x1a\x00\x47\x00\xe4\x00\x48\x00\xa2\x01\x29\x01\x49\x00\x4d\x01\x11\x00\x12\x00\x4a\x00\xd1\x00\xa7\x01\x1b\x00\xb5\x01\x45\x00\xcf\x00\xd0\x00\x4b\x00\x4c\x00\x52\x01\x46\x00\x11\x00\x12\x00\x5e\x01\xd1\x00\x47\x00\x55\x01\x48\x00\x16\x00\x17\x00\x49\x00\x16\x00\x18\x00\x19\x00\x1a\x00\x18\x00\x19\x00\x1a\x00\xd6\x00\x10\x00\x16\x00\x66\x01\x4b\x00\x4c\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x80\x00\x24\x00\x1b\x00\x25\x00\x5b\x00\x8f\x00\x67\x01\x1c\x00\x11\x00\x3b\x01\x8b\x00\x1b\x00\x96\x00\x5b\x00\xf6\x00\x5d\x00\x8e\x01\x16\x00\x70\x01\x8b\x00\x8c\x00\x18\x00\x19\x00\x1a\x00\x5d\x00\x5e\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x5e\x00\x74\x01\x1b\x00\x77\x01\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\xb1\x00\x11\x00\x8f\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\xb2\x00\x0f\x00\x10\x00\x91\x01\x3c\x00\x3d\x00\x84\x01\xb7\x00\xdf\x00\xb3\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\xe0\x00\x2c\x00\xde\x00\x2d\x00\x3c\x00\x3d\x00\xed\x00\x11\x00\x12\x00\xb8\x00\x2e\x00\xfc\x00\xb9\x00\x21\x01\x10\x00\x23\x01\xc1\x00\xbb\x00\xbc\x00\xbd\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x11\x00\x12\x00\xfd\x00\x3e\x00\x3c\x00\x3d\x00\x03\x01\xbb\x00\x0a\x01\x80\x01\x38\x00\x39\x00\x3a\x00\x3b\x00\x11\x00\x12\x00\x14\x01\x3e\x00\x3c\x00\x3d\x00\xc3\x01\xd3\x00\x1d\x01\x38\x00\x39\x00\x3a\x00\x3b\x00\x11\x00\x12\x00\x32\x01\xd1\x00\x3c\x00\x3d\x00\x21\x01\x10\x00\x24\x01\xa8\x00\xa9\x00\x11\x00\x12\x00\x1e\x01\x3e\x00\xc2\x00\x0f\x00\x10\x00\xb5\x01\xd6\x00\x10\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x11\x00\x12\x00\x33\x01\x3e\x00\x3c\x00\x3d\x00\xba\x01\xc9\x01\xca\x01\x38\x00\x39\x00\x3a\x00\x3b\x00\x11\x00\x12\x00\x3b\x01\x3e\x00\x3c\x00\x3d\x00\xbd\x01\xe9\x00\xea\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3e\x01\xdb\x00\x0f\x00\x10\x00\x3c\x00\x3d\x00\x02\x01\xfd\x00\x2f\x01\x2c\x01\x31\x01\x2e\x01\x11\x00\x12\x00\x48\x01\x3e\x00\xff\xff\x7a\x00\x93\x01\x7b\x00\x7c\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x11\x00\x12\x00\xff\xff\x3e\x00\x3c\x00\x3d\x00\x99\x01\x91\x00\x92\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x11\x00\x12\x00\x23\x00\x3e\x00\x3c\x00\x3d\x00\x9e\x01\x93\x00\x9d\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\xff\xff\xc1\x00\x80\x00\xd6\x00\x3c\x00\x3d\x00\xff\xff\xff\xff\x0e\x00\x43\x00\x00\x00\x00\x00\x11\x00\x12\x00\x4f\x00\x3e\x00\x62\x00\x00\x00\xa2\x01\x00\x00\x00\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x11\x00\x12\x00\x00\x00\x3e\x00\x3c\x00\x3d\x00\x67\x01\x00\x00\x00\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x11\x00\x12\x00\x00\x00\x3e\x00\x3c\x00\x3d\x00\x75\x01\x00\x00\x00\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3c\x00\x3d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x00\x12\x00\x00\x00\x3e\x00\x00\x00\x00\x00\x77\x01\x00\x00\x00\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x11\x00\x12\x00\x00\x00\x3e\x00\x3c\x00\x3d\x00\x78\x01\x00\x00\x00\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x11\x00\x12\x00\x00\x00\x3e\x00\x3c\x00\x3d\x00\x7d\x01\x00\x00\x00\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3c\x00\x3d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x00\x12\x00\x00\x00\x3e\x00\x00\x00\x00\x00\x7e\x01\x00\x00\x00\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x11\x00\x12\x00\x00\x00\x3e\x00\x3c\x00\x3d\x00\x7f\x01\x00\x00\x00\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x11\x00\x12\x00\x00\x00\x3e\x00\x3c\x00\x3d\x00\x82\x01\x00\x00\x00\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3c\x00\x3d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x00\x12\x00\x00\x00\x3e\x00\x00\x00\x00\x00\x1f\x01\x00\x00\x00\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x11\x00\x12\x00\x00\x00\x3e\x00\x3c\x00\x3d\x00\x5f\x00\x00\x00\x00\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x11\x00\x12\x00\x00\x00\x3e\x00\x3c\x00\x3d\x00\x00\x00\x30\x00\x00\x00\x31\x00\x16\x00\x17\x00\x00\x00\x00\x00\x18\x00\x19\x00\x1a\x00\xa0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3c\x00\x3d\x00\x00\x00\x11\x00\x12\x00\x00\x00\x3e\x00\x1b\x00\x00\x00\x32\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x33\x00\x11\x00\x12\x00\x00\x00\x3e\x00\xce\x00\x12\x01\x00\x00\x00\x00\x30\x00\x00\x00\x31\x00\x16\x00\x17\x00\x00\x00\x35\x00\x18\x00\x19\x00\x1a\x00\x11\x00\x12\x00\x30\x00\x3e\x00\x31\x00\x16\x00\x17\x00\x00\x00\x00\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x32\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x33\x00\xcd\x00\xa1\x00\x00\x00\x1b\x00\xce\x00\x32\x00\x3c\x00\x3d\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x35\x00\x30\x00\x34\x00\x31\x00\x16\x00\x17\x00\x00\x00\x00\x00\x18\x00\x19\x00\x1a\x00\x00\x00\x35\x00\x30\x00\x00\x00\x31\x00\x16\x00\x17\x00\x00\x00\x00\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x32\x00\x11\x00\x12\x00\x00\x00\x3e\x00\x00\x00\x33\x00\x00\x00\x00\x00\x16\x00\x1b\x00\xce\x00\x32\x00\x18\x00\x19\x00\x1a\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x35\x00\x30\x00\x34\x00\x31\x00\x16\x00\x17\x00\x00\x00\x1b\x00\x18\x00\x19\x00\x1a\x00\x00\x00\x35\x00\x30\x00\x00\x00\x31\x00\x16\x00\x17\x00\x00\x00\x00\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x32\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x00\x00\x1b\x00\xce\x00\xd3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x35\x00\x30\x00\xce\x00\x31\x00\x16\x00\x17\x00\x00\x00\x00\x00\x18\x00\x19\x00\x1a\x00\x00\x00\x35\x00\x30\x00\x00\x00\x31\x00\x16\x00\x17\x00\x00\x00\x00\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x32\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x00\x00\x1b\x00\xce\x00\x32\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x35\x00\x30\x00\x34\x00\x31\x00\x16\x00\x17\x00\x00\x00\x00\x00\x18\x00\x19\x00\x1a\x00\x00\x00\x35\x00\x30\x00\x00\x00\x31\x00\x16\x00\x17\x00\x00\x00\x00\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x32\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x00\x00\x1b\x00\xce\x00\xd3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x35\x00\x30\x00\xce\x00\x31\x00\x16\x00\x17\x00\x00\x00\x00\x00\x18\x00\x19\x00\x1a\x00\x00\x00\x35\x00\x30\x00\x00\x00\x31\x00\x16\x00\x17\x00\x00\x00\x00\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\xd5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x00\x00\x1b\x00\xce\x00\x32\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x35\x00\x30\x00\xce\x00\x31\x00\x16\x00\x17\x00\x00\x00\x00\x00\x18\x00\x19\x00\x1a\x00\x00\x00\x35\x00\x81\x01\x39\x00\x3a\x00\x3b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3c\x00\x3d\x00\x1b\x00\x00\x00\x32\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x16\x00\x00\x00\x00\x00\x34\x00\x18\x00\x19\x00\x1a\x00\x00\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x16\x00\x35\x00\x00\x00\x00\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x5b\x00\x11\x00\x12\x00\x00\x00\x3e\x00\x00\x00\x5c\x00\x00\x00\x16\x00\x00\x00\x1b\x00\x5d\x00\x18\x00\x19\x00\x1a\x00\x00\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x00\x00\x5e\x00\x00\x00\x59\x01\x84\x00\x00\x00\x00\x00\x1b\x00\x16\x00\x5b\x00\x00\x00\x00\x00\x18\x00\x19\x00\x1a\x00\x5c\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1b\x00\x00\x00\x5b\x00\x5e\x00\x00\x00\xa0\x00\x00\x00\x00\x00\x5c\x00\x00\x00\x00\x00\x16\x00\x00\x00\x5d\x00\xa4\x01\x18\x00\x19\x00\x1a\x00\x00\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5e\x00\xbc\x01\x7c\x01\x86\x00\x87\x00\x00\x00\x00\x00\x1b\x00\x16\x00\x5b\x00\x00\x00\x00\x00\x18\x00\x19\x00\x1a\x00\x5c\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5d\x00\x5b\x01\x00\x00\x00\x00\x11\x00\x89\x00\x00\x00\x1b\x00\x16\x00\x5b\x00\x5e\x00\x00\x00\x18\x00\x19\x00\x45\x01\x5c\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5d\x00\x8c\x00\x86\x00\x87\x00\x8d\x00\x00\x00\x00\x00\x1b\x00\x16\x00\x5b\x00\x5e\x00\x00\x00\x18\x00\x19\x00\x1a\x00\x5c\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5d\x00\x00\x00\x00\x00\x11\x00\x89\x00\x00\x00\x00\x00\x1b\x00\x16\x00\x5b\x00\x5e\x00\x00\x00\x18\x00\x19\x00\x1a\x00\x5c\x00\x00\x00\x00\x00\x16\x00\x00\x00\x5d\x00\x00\x00\x18\x00\x19\x00\x1a\x00\x00\x00\x00\x00\x1b\x00\x16\x00\x5b\x00\x5e\x00\x00\x00\x18\x00\x19\x00\x1a\x00\x8b\x00\x00\x00\x1b\x00\x00\x00\x00\x00\x5d\x00\x00\x00\x00\x00\x00\x00\xae\x01\x00\x00\x00\x00\x1b\x00\x16\x00\x5b\x00\x5e\x00\xb1\x00\x18\x00\x19\x00\x1a\x00\x8b\x00\x5f\x01\x86\x00\x87\x00\x00\x00\x5d\x00\x60\x01\x86\x00\x87\x00\x07\x01\x00\x00\x00\x00\x1b\x00\x16\x00\x5b\x00\x5e\x00\x00\x00\x18\x00\x19\x00\x1a\x00\x8b\x00\x8c\x00\x00\x00\x11\x00\x89\x00\x5d\x00\x00\x00\x00\x00\x11\x00\x89\x00\x00\x00\x00\x00\x1b\x00\x00\x00\x5b\x00\x5e\x00\x00\x00\x00\x00\x2b\xff\x00\x00\x8b\x00\x2b\xff\x2b\xff\x00\x00\x00\x00\x5d\x00\x2b\xff\x2b\xff\x2b\xff\x2b\xff\x2b\xff\x00\x00\x2b\xff\x2b\xff\x2b\xff\x5e\x00\x00\x00\x2b\xff\x40\x00\x41\x00\x42\x00\x16\x00\x17\x00\x2b\xff\x2b\xff\x18\x00\x19\x00\x1a\x00\x2b\xff\x2b\xff\x2b\xff\x2b\xff\x2b\xff\x2b\xff\x2b\xff\x2b\xff\x2b\xff\x00\x00\x00\x00\x2b\xff\x1b\x00\x16\x00\x45\x00\x00\x00\x00\x00\x18\x00\x19\x00\x1a\x00\x46\x00\x00\x00\x00\x00\x00\x00\x00\x00\x47\x00\x00\x00\x48\x00\x00\x00\x16\x00\x49\x00\x00\x00\x1b\x00\x18\x00\x19\x00\x1a\x00\x00\x00\x00\x00\x00\x00\x16\x00\x29\x01\x00\x00\x00\x00\x18\x00\x19\x00\x1a\x00\x00\x00\x00\x00\x1b\x00\xb0\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x29\x01\x00\x00\x1b\x00\x8f\x01\xa6\x00\x00\x00\x00\x00\x16\x00\x17\x00\x65\x01\x29\x01\x18\x00\x19\x00\x1a\x00\x00\x00\x00\x00\x16\x00\x90\x01\x00\x00\x2a\x01\x18\x00\x19\x00\x1a\x00\x00\x00\x00\x00\x00\x00\x1b\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\xa7\x00\x1b\x00\xe6\x00\x00\x00\x00\x00\xa8\x00\x00\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x16\x00\xca\x00\x00\x00\x16\x00\x18\x00\x19\x00\x1a\x00\x18\x00\x19\x00\x1a\x00\x00\x00\x00\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x1b\x00\x16\x00\x27\x00\x1b\x00\x00\x00\x18\x00\x19\x00\x1a\x00\x1b\x01\x27\xff\x00\x00\x3d\x01\x79\x01\x7a\x01\x7b\x01\x7c\x01\x86\x00\x87\x00\x27\xff\x27\xff\x1b\x00\xeb\x00\xec\x00\x27\xff\x27\xff\x27\xff\x27\xff\x27\xff\x27\xff\x27\xff\x27\xff\x27\xff\x6d\x01\x00\x00\x27\xff\x00\x00\x00\x00\x11\x00\x89\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\xec\x00\x00\x00\x00\x00\x00\x00\x72\x01\x00\x00\x00\x00\x00\x00\x00\x00\x16\x00\x17\x00\x00\x00\x00\x00\x18\x00\x19\x00\x1a\x00\x00\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\xc0\x01\x28\x00\x29\x00\x00\x00\x1b\x00\x00\x00\x00\x00\x00\x00\x2a\x00\x2b\x00\x2c\x00\x00\x00\x2d\x00\xa5\x01\x28\x00\x29\x00\x11\x00\x12\x00\x00\x00\x2e\x00\x00\x00\x2a\x00\x2b\x00\x2c\x00\x00\x00\x2d\x00\x17\x01\x28\x00\x29\x00\x11\x00\x12\x00\x00\x00\x2e\x00\x00\x00\x2a\x00\x2b\x00\x2c\x00\x00\x00\x2d\x00\x27\x00\x28\x00\x29\x00\x11\x00\x12\x00\x00\x00\x2e\x00\x00\x00\x2a\x00\x2b\x00\x2c\x00\x00\x00\x2d\x00\x00\x00\x00\x00\x00\x00\x11\x00\x12\x00\x00\x00\x2e\x00\x16\x00\x27\x00\x00\x00\xd9\x00\x18\x00\x19\x00\x1a\x00\x00\x00\x00\x00\xda\x00\x2b\x00\x2c\x00\x00\x00\x2d\x00\x00\x00\x00\x00\x87\x01\x11\x00\x12\x00\x1b\x00\x2e\x00\x88\x01\x2b\x00\x2c\x00\x00\x00\x2d\x00\x00\x00\x00\x00\x00\x00\x11\x00\x12\x00\x00\x00\x2e\x00\x0c\x01\x2b\x00\x2c\x00\x00\x00\x2d\x00\x0d\x01\x00\x00\x00\x00\x0e\x01\x12\x00\xc4\x00\x2e\x00\x00\x00\x00\x00\x0f\x01\x10\x01\x00\x00\x00\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\xd8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\xca\x00\x2b\x00\x2c\x00\x00\x00\x2d\x00\xcb\x00\x00\x00\x00\x00\x11\x00\x12\x00\x00\x00\x2e\x00\x88\x01\x2b\x00\x2c\x00\x00\x00\x2d\x00\x00\x00\x00\x00\x00\x00\x11\x00\x12\x00\x00\x00\x2e\x00\x9a\x01\x2b\x00\x2c\x00\x00\x00\x2d\x00\x00\x00\x00\x00\x00\x00\x11\x00\x12\x00\x00\x00\x2e\x00\xa0\x01\x2b\x00\x2c\x00\x00\x00\x2d\x00\x00\x00\x00\x00\x00\x00\x11\x00\x12\x00\x00\x00\x2e\x00\x5e\x01\x2b\x00\x2c\x00\x00\x00\x2d\x00\x00\x00\x00\x00\x00\x00\x11\x00\x12\x00\x00\x00\x2e\x00\x61\x01\x2b\x00\x2c\x00\x00\x00\x2d\x00\x00\x00\x00\x00\x00\x00\x11\x00\x12\x00\x00\x00\x2e\x00\x8b\x01\x2b\x00\x2c\x00\x00\x00\x2d\x00\x00\x00\x00\x00\x00\x00\x11\x00\x12\x00\x00\x00\x2e\x00\x8c\x01\x2b\x00\x2c\x00\x00\x00\x2d\x00\x00\x00\x00\x00\x00\x00\x11\x00\x12\x00\x00\x00\x2e\x00\xdf\x00\x2b\x00\x2c\x00\x00\x00\x2d\x00\x00\x00\x00\x00\x00\x00\x11\x00\x12\x00\x00\x00\x2e\x00\xe1\x00\x2b\x00\x2c\x00\x00\x00\x2d\x00\x00\x00\x00\x00\x00\x00\x11\x00\x12\x00\x00\x00\x2e\x00\xe2\x00\x2b\x00\x2c\x00\x00\x00\x2d\x00\x00\x00\x00\x00\x00\x00\x11\x00\x12\x00\x00\x00\x2e\x00\xe3\x00\x2b\x00\x2c\x00\x00\x00\x2d\x00\x00\x00\x00\x00\x00\x00\x11\x00\x12\x00\x00\x00\x2e\x00\xf1\x00\x2b\x00\x2c\x00\x00\x00\x2d\x00\x00\x00\x00\x00\x00\x00\x11\x00\x12\x00\x00\x00\x2e\x00\x12\x01\x2b\x00\x2c\x00\x00\x00\x2d\x00\x00\x00\x00\x00\x00\x00\x11\x00\x12\x00\x00\x00\x2e\x00\xce\x00\x2b\x00\x2c\x00\x00\x00\x2d\x00\x00\x00\x00\x00\x00\x00\x11\x00\x12\x00\x00\x00\x2e\x00\xd8\x00\x2b\x00\x2c\x00\x00\x00\x2d\x00\x00\x00\x00\x00\x00\x00\x11\x00\x12\x00\x00\x00\x2e\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"#--happyReduceArr = Happy_Data_Array.array (12, 250) [-	(12 , happyReduce_12),-	(13 , happyReduce_13),-	(14 , happyReduce_14),-	(15 , happyReduce_15),-	(16 , happyReduce_16),-	(17 , happyReduce_17),-	(18 , happyReduce_18),-	(19 , happyReduce_19),-	(20 , happyReduce_20),-	(21 , happyReduce_21),-	(22 , happyReduce_22),-	(23 , happyReduce_23),-	(24 , happyReduce_24),-	(25 , happyReduce_25),-	(26 , happyReduce_26),-	(27 , happyReduce_27),-	(28 , happyReduce_28),-	(29 , happyReduce_29),-	(30 , happyReduce_30),-	(31 , happyReduce_31),-	(32 , happyReduce_32),-	(33 , happyReduce_33),-	(34 , happyReduce_34),-	(35 , happyReduce_35),-	(36 , happyReduce_36),-	(37 , happyReduce_37),-	(38 , happyReduce_38),-	(39 , happyReduce_39),-	(40 , happyReduce_40),-	(41 , happyReduce_41),-	(42 , happyReduce_42),-	(43 , happyReduce_43),-	(44 , happyReduce_44),-	(45 , happyReduce_45),-	(46 , happyReduce_46),-	(47 , happyReduce_47),-	(48 , happyReduce_48),-	(49 , happyReduce_49),-	(50 , happyReduce_50),-	(51 , happyReduce_51),-	(52 , happyReduce_52),-	(53 , happyReduce_53),-	(54 , happyReduce_54),-	(55 , happyReduce_55),-	(56 , happyReduce_56),-	(57 , happyReduce_57),-	(58 , happyReduce_58),-	(59 , happyReduce_59),-	(60 , happyReduce_60),-	(61 , happyReduce_61),-	(62 , happyReduce_62),-	(63 , happyReduce_63),-	(64 , happyReduce_64),-	(65 , happyReduce_65),-	(66 , happyReduce_66),-	(67 , happyReduce_67),-	(68 , happyReduce_68),-	(69 , happyReduce_69),-	(70 , happyReduce_70),-	(71 , happyReduce_71),-	(72 , happyReduce_72),-	(73 , happyReduce_73),-	(74 , happyReduce_74),-	(75 , happyReduce_75),-	(76 , happyReduce_76),-	(77 , happyReduce_77),-	(78 , happyReduce_78),-	(79 , happyReduce_79),-	(80 , happyReduce_80),-	(81 , happyReduce_81),-	(82 , happyReduce_82),-	(83 , happyReduce_83),-	(84 , happyReduce_84),-	(85 , happyReduce_85),-	(86 , happyReduce_86),-	(87 , happyReduce_87),-	(88 , happyReduce_88),-	(89 , happyReduce_89),-	(90 , happyReduce_90),-	(91 , happyReduce_91),-	(92 , happyReduce_92),-	(93 , happyReduce_93),-	(94 , happyReduce_94),-	(95 , happyReduce_95),-	(96 , happyReduce_96),-	(97 , happyReduce_97),-	(98 , happyReduce_98),-	(99 , happyReduce_99),-	(100 , happyReduce_100),-	(101 , happyReduce_101),-	(102 , happyReduce_102),-	(103 , happyReduce_103),-	(104 , happyReduce_104),-	(105 , happyReduce_105),-	(106 , happyReduce_106),-	(107 , happyReduce_107),-	(108 , happyReduce_108),-	(109 , happyReduce_109),-	(110 , happyReduce_110),-	(111 , happyReduce_111),-	(112 , happyReduce_112),-	(113 , happyReduce_113),-	(114 , happyReduce_114),-	(115 , happyReduce_115),-	(116 , happyReduce_116),-	(117 , happyReduce_117),-	(118 , happyReduce_118),-	(119 , happyReduce_119),-	(120 , happyReduce_120),-	(121 , happyReduce_121),-	(122 , happyReduce_122),-	(123 , happyReduce_123),-	(124 , happyReduce_124),-	(125 , happyReduce_125),-	(126 , happyReduce_126),-	(127 , happyReduce_127),-	(128 , happyReduce_128),-	(129 , happyReduce_129),-	(130 , happyReduce_130),-	(131 , happyReduce_131),-	(132 , happyReduce_132),-	(133 , happyReduce_133),-	(134 , happyReduce_134),-	(135 , happyReduce_135),-	(136 , happyReduce_136),-	(137 , happyReduce_137),-	(138 , happyReduce_138),-	(139 , happyReduce_139),-	(140 , happyReduce_140),-	(141 , happyReduce_141),-	(142 , happyReduce_142),-	(143 , happyReduce_143),-	(144 , happyReduce_144),-	(145 , happyReduce_145),-	(146 , happyReduce_146),-	(147 , happyReduce_147),-	(148 , happyReduce_148),-	(149 , happyReduce_149),-	(150 , happyReduce_150),-	(151 , happyReduce_151),-	(152 , happyReduce_152),-	(153 , happyReduce_153),-	(154 , happyReduce_154),-	(155 , happyReduce_155),-	(156 , happyReduce_156),-	(157 , happyReduce_157),-	(158 , happyReduce_158),-	(159 , happyReduce_159),-	(160 , happyReduce_160),-	(161 , happyReduce_161),-	(162 , happyReduce_162),-	(163 , happyReduce_163),-	(164 , happyReduce_164),-	(165 , happyReduce_165),-	(166 , happyReduce_166),-	(167 , happyReduce_167),-	(168 , happyReduce_168),-	(169 , happyReduce_169),-	(170 , happyReduce_170),-	(171 , happyReduce_171),-	(172 , happyReduce_172),-	(173 , happyReduce_173),-	(174 , happyReduce_174),-	(175 , happyReduce_175),-	(176 , happyReduce_176),-	(177 , happyReduce_177),-	(178 , happyReduce_178),-	(179 , happyReduce_179),-	(180 , happyReduce_180),-	(181 , happyReduce_181),-	(182 , happyReduce_182),-	(183 , happyReduce_183),-	(184 , happyReduce_184),-	(185 , happyReduce_185),-	(186 , happyReduce_186),-	(187 , happyReduce_187),-	(188 , happyReduce_188),-	(189 , happyReduce_189),-	(190 , happyReduce_190),-	(191 , happyReduce_191),-	(192 , happyReduce_192),-	(193 , happyReduce_193),-	(194 , happyReduce_194),-	(195 , happyReduce_195),-	(196 , happyReduce_196),-	(197 , happyReduce_197),-	(198 , happyReduce_198),-	(199 , happyReduce_199),-	(200 , happyReduce_200),-	(201 , happyReduce_201),-	(202 , happyReduce_202),-	(203 , happyReduce_203),-	(204 , happyReduce_204),-	(205 , happyReduce_205),-	(206 , happyReduce_206),-	(207 , happyReduce_207),-	(208 , happyReduce_208),-	(209 , happyReduce_209),-	(210 , happyReduce_210),-	(211 , happyReduce_211),-	(212 , happyReduce_212),-	(213 , happyReduce_213),-	(214 , happyReduce_214),-	(215 , happyReduce_215),-	(216 , happyReduce_216),-	(217 , happyReduce_217),-	(218 , happyReduce_218),-	(219 , happyReduce_219),-	(220 , happyReduce_220),-	(221 , happyReduce_221),-	(222 , happyReduce_222),-	(223 , happyReduce_223),-	(224 , happyReduce_224),-	(225 , happyReduce_225),-	(226 , happyReduce_226),-	(227 , happyReduce_227),-	(228 , happyReduce_228),-	(229 , happyReduce_229),-	(230 , happyReduce_230),-	(231 , happyReduce_231),-	(232 , happyReduce_232),-	(233 , happyReduce_233),-	(234 , happyReduce_234),-	(235 , happyReduce_235),-	(236 , happyReduce_236),-	(237 , happyReduce_237),-	(238 , happyReduce_238),-	(239 , happyReduce_239),-	(240 , happyReduce_240),-	(241 , happyReduce_241),-	(242 , happyReduce_242),-	(243 , happyReduce_243),-	(244 , happyReduce_244),-	(245 , happyReduce_245),-	(246 , happyReduce_246),-	(247 , happyReduce_247),-	(248 , happyReduce_248),-	(249 , happyReduce_249),-	(250 , happyReduce_250)-	]--happy_n_terms = 60 :: Int-happy_n_nonterms = 83 :: Int--happyReduce_12 = happyReduce 6# 0# happyReduction_12-happyReduction_12 (happy_x_6 `HappyStk`-	happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut92 happy_x_2 of { happy_var_2 -> -	case happyOut16 happy_x_5 of { happy_var_5 -> -	happyIn15-		 (let (is,ts) = happy_var_5 in Module happy_var_2 is ts-	) `HappyStk` happyRest}}--happyReduce_13 = happySpecReduce_3  0# happyReduction_13-happyReduction_13 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut16 happy_x_2 of { happy_var_2 -> -	happyIn15-		 (let { (is,ts) = happy_var_2-            -- XXX make a location from is and ts-          ; modName = Located { srcRange = emptyRange-                              , thing    = mkModName ["Main"]-                              }-          } in Module modName is ts-	)}--happyReduce_14 = happySpecReduce_3  1# happyReduction_14-happyReduction_14 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut17 happy_x_1 of { happy_var_1 -> -	case happyOut26 happy_x_3 of { happy_var_3 -> -	happyIn16-		 ((reverse happy_var_1, reverse happy_var_3)-	)}}--happyReduce_15 = happySpecReduce_3  1# happyReduction_15-happyReduction_15 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut17 happy_x_1 of { happy_var_1 -> -	case happyOut26 happy_x_3 of { happy_var_3 -> -	happyIn16-		 ((reverse happy_var_1, reverse happy_var_3)-	)}}--happyReduce_16 = happySpecReduce_1  1# happyReduction_16-happyReduction_16 happy_x_1-	 =  case happyOut17 happy_x_1 of { happy_var_1 -> -	happyIn16-		 ((reverse happy_var_1, [])-	)}--happyReduce_17 = happySpecReduce_1  1# happyReduction_17-happyReduction_17 happy_x_1-	 =  case happyOut26 happy_x_1 of { happy_var_1 -> -	happyIn16-		 (([], reverse happy_var_1)-	)}--happyReduce_18 = happySpecReduce_0  1# happyReduction_18-happyReduction_18  =  happyIn16-		 (([], [])-	)--happyReduce_19 = happySpecReduce_3  2# happyReduction_19-happyReduction_19 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut17 happy_x_1 of { happy_var_1 -> -	case happyOut18 happy_x_3 of { happy_var_3 -> -	happyIn17-		 (happy_var_3 : happy_var_1-	)}}--happyReduce_20 = happySpecReduce_3  2# happyReduction_20-happyReduction_20 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut17 happy_x_1 of { happy_var_1 -> -	case happyOut18 happy_x_3 of { happy_var_3 -> -	happyIn17-		 (happy_var_3 : happy_var_1-	)}}--happyReduce_21 = happySpecReduce_1  2# happyReduction_21-happyReduction_21 happy_x_1-	 =  case happyOut18 happy_x_1 of { happy_var_1 -> -	happyIn17-		 ([happy_var_1]-	)}--happyReduce_22 = happyReduce 4# 3# happyReduction_22-happyReduction_22 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (KW KW_import)    _)) -> -	case happyOut92 happy_x_2 of { happy_var_2 -> -	case happyOut19 happy_x_3 of { happy_var_3 -> -	case happyOut20 happy_x_4 of { happy_var_4 -> -	happyIn18-		 (Located { srcRange = rComb happy_var_1-                                                   $ fromMaybe (srcRange happy_var_2)-                                                   $ msum [ fmap srcRange happy_var_4-                                                          , fmap srcRange happy_var_3-                                                          ]-                                        , thing    = Import-                                          { iModule    = thing happy_var_2-                                          , iAs        = fmap thing happy_var_3-                                          , iSpec      = fmap thing happy_var_4-                                          }-                                        }-	) `HappyStk` happyRest}}}}--happyReduce_23 = happySpecReduce_2  4# happyReduction_23-happyReduction_23 happy_x_2-	happy_x_1-	 =  case happyOut92 happy_x_2 of { happy_var_2 -> -	happyIn19-		 (Just happy_var_2-	)}--happyReduce_24 = happySpecReduce_0  4# happyReduction_24-happyReduction_24  =  happyIn19-		 (Nothing-	)--happyReduce_25 = happyReduce 4# 5# happyReduction_25-happyReduction_25 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut22 happy_x_1 of { happy_var_1 -> -	case happyOut21 happy_x_3 of { happy_var_3 -> -	happyIn20-		 (Just Located-                                  { srcRange = case happy_var_3 of-                                      { [] -> emptyRange-                                      ; xs -> rCombs (map srcRange xs) }-                                  , thing    = happy_var_1 (reverse (map thing happy_var_3))-                                  }-	) `HappyStk` happyRest}}--happyReduce_26 = happySpecReduce_0  5# happyReduction_26-happyReduction_26  =  happyIn20-		 (Nothing-	)--happyReduce_27 = happySpecReduce_3  6# happyReduction_27-happyReduction_27 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut21 happy_x_1 of { happy_var_1 -> -	case happyOut90 happy_x_3 of { happy_var_3 -> -	happyIn21-		 (happy_var_3 : happy_var_1-	)}}--happyReduce_28 = happySpecReduce_1  6# happyReduction_28-happyReduction_28 happy_x_1-	 =  case happyOut90 happy_x_1 of { happy_var_1 -> -	happyIn21-		 ([happy_var_1]-	)}--happyReduce_29 = happySpecReduce_0  6# happyReduction_29-happyReduction_29  =  happyIn21-		 ([]-	)--happyReduce_30 = happySpecReduce_1  7# happyReduction_30-happyReduction_30 happy_x_1-	 =  happyIn22-		 (Hiding-	)--happyReduce_31 = happySpecReduce_0  7# happyReduction_31-happyReduction_31  =  happyIn22-		 (Only-	)--happyReduce_32 = happySpecReduce_1  8# happyReduction_32-happyReduction_32 happy_x_1-	 =  case happyOut25 happy_x_1 of { happy_var_1 -> -	happyIn23-		 (Program (reverse happy_var_1)-	)}--happyReduce_33 = happySpecReduce_0  8# happyReduction_33-happyReduction_33  =  happyIn23-		 (Program []-	)--happyReduce_34 = happySpecReduce_3  9# happyReduction_34-happyReduction_34 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut26 happy_x_2 of { happy_var_2 -> -	happyIn24-		 (Program (reverse happy_var_2)-	)}--happyReduce_35 = happySpecReduce_2  9# happyReduction_35-happyReduction_35 happy_x_2-	happy_x_1-	 =  happyIn24-		 (Program []-	)--happyReduce_36 = happySpecReduce_2  10# happyReduction_36-happyReduction_36 happy_x_2-	happy_x_1-	 =  case happyOut28 happy_x_1 of { happy_var_1 -> -	happyIn25-		 (happy_var_1-	)}--happyReduce_37 = happySpecReduce_3  10# happyReduction_37-happyReduction_37 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut25 happy_x_1 of { happy_var_1 -> -	case happyOut28 happy_x_2 of { happy_var_2 -> -	happyIn25-		 (happy_var_2 ++ happy_var_1-	)}}--happyReduce_38 = happySpecReduce_1  11# happyReduction_38-happyReduction_38 happy_x_1-	 =  case happyOut27 happy_x_1 of { happy_var_1 -> -	happyIn26-		 (happy_var_1-	)}--happyReduce_39 = happySpecReduce_3  11# happyReduction_39-happyReduction_39 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut26 happy_x_1 of { happy_var_1 -> -	case happyOut27 happy_x_3 of { happy_var_3 -> -	happyIn26-		 (happy_var_3 ++ happy_var_1-	)}}--happyReduce_40 = happySpecReduce_3  11# happyReduction_40-happyReduction_40 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut26 happy_x_1 of { happy_var_1 -> -	case happyOut27 happy_x_3 of { happy_var_3 -> -	happyIn26-		 (happy_var_3 ++ happy_var_1-	)}}--happyReduce_41 = happySpecReduce_1  12# happyReduction_41-happyReduction_41 happy_x_1-	 =  case happyOut33 happy_x_1 of { happy_var_1 -> -	happyIn27-		 ([exportDecl Nothing   Public happy_var_1]-	)}--happyReduce_42 = happySpecReduce_2  12# happyReduction_42-happyReduction_42 happy_x_2-	happy_x_1-	 =  case happyOut31 happy_x_1 of { happy_var_1 -> -	case happyOut33 happy_x_2 of { happy_var_2 -> -	happyIn27-		 ([exportDecl (Just happy_var_1) Public happy_var_2]-	)}}--happyReduce_43 = happyMonadReduce 3# 12# happyReduction_43-happyReduction_43 (happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_3 of { (happy_var_3@(Located _ (Token (StrLit {}) _))) -> -	( (return . Include) `fmap` fromStrLit happy_var_3)}-	) (\r -> happyReturn (happyIn27 r))--happyReduce_44 = happyReduce 6# 12# happyReduction_44-happyReduction_44 (happy_x_6 `HappyStk`-	happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut32 happy_x_1 of { happy_var_1 -> -	case happyOut91 happy_x_3 of { happy_var_3 -> -	case happyOut39 happy_x_4 of { happy_var_4 -> -	case happyOut45 happy_x_6 of { happy_var_6 -> -	happyIn27-		 ([exportDecl happy_var_1 Public (mkProperty happy_var_3 happy_var_4 happy_var_6)]-	) `HappyStk` happyRest}}}}--happyReduce_45 = happyReduce 5# 12# happyReduction_45-happyReduction_45 (happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut32 happy_x_1 of { happy_var_1 -> -	case happyOut91 happy_x_3 of { happy_var_3 -> -	case happyOut45 happy_x_5 of { happy_var_5 -> -	happyIn27-		 ([exportDecl happy_var_1 Public (mkProperty happy_var_3 [] happy_var_5)]-	) `HappyStk` happyRest}}}--happyReduce_46 = happySpecReduce_2  12# happyReduction_46-happyReduction_46 happy_x_2-	happy_x_1-	 =  case happyOut35 happy_x_2 of { happy_var_2 -> -	happyIn27-		 ([exportNewtype Public happy_var_2]-	)}--happyReduce_47 = happySpecReduce_1  12# happyReduction_47-happyReduction_47 happy_x_1-	 =  case happyOut30 happy_x_1 of { happy_var_1 -> -	happyIn27-		 (happy_var_1-	)}--happyReduce_48 = happySpecReduce_1  12# happyReduction_48-happyReduction_48 happy_x_1-	 =  case happyOut29 happy_x_1 of { happy_var_1 -> -	happyIn27-		 (happy_var_1-	)}--happyReduce_49 = happySpecReduce_1  13# happyReduction_49-happyReduction_49 happy_x_1-	 =  case happyOut33 happy_x_1 of { happy_var_1 -> -	happyIn28-		 ([Decl (TopLevel {tlExport = Public, tlValue = happy_var_1 })]-	)}--happyReduce_50 = happyMonadReduce 2# 13# happyReduction_50-happyReduction_50 (happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_2 of { (happy_var_2@(Located _ (Token (StrLit {}) _))) -> -	( (return . Include) `fmap` fromStrLit happy_var_2)}-	) (\r -> happyReturn (happyIn28 r))--happyReduce_51 = happySpecReduce_1  13# happyReduction_51-happyReduction_51 happy_x_1-	 =  case happyOut30 happy_x_1 of { happy_var_1 -> -	happyIn28-		 (happy_var_1-	)}--happyReduce_52 = happyReduce 4# 14# happyReduction_52-happyReduction_52 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut26 happy_x_3 of { happy_var_3 -> -	happyIn29-		 (changeExport Private (reverse happy_var_3)-	) `HappyStk` happyRest}--happyReduce_53 = happyReduce 5# 14# happyReduction_53-happyReduction_53 (happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut26 happy_x_4 of { happy_var_4 -> -	happyIn29-		 (changeExport Private (reverse happy_var_4)-	) `HappyStk` happyRest}--happyReduce_54 = happyReduce 5# 15# happyReduction_54-happyReduction_54 (happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut32 happy_x_1 of { happy_var_1 -> -	case happyOut91 happy_x_3 of { happy_var_3 -> -	case happyOut74 happy_x_5 of { happy_var_5 -> -	happyIn30-		 (mkPrimDecl happy_var_1 happy_var_3 happy_var_5-	) `HappyStk` happyRest}}}--happyReduce_55 = happyReduce 7# 15# happyReduction_55-happyReduction_55 (happy_x_7 `HappyStk`-	happy_x_6 `HappyStk`-	happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut32 happy_x_1 of { happy_var_1 -> -	case happyOut53 happy_x_4 of { happy_var_4 -> -	case happyOut74 happy_x_7 of { happy_var_7 -> -	happyIn30-		 (mkPrimDecl happy_var_1 happy_var_4 happy_var_7-	) `HappyStk` happyRest}}}--happyReduce_56 = happySpecReduce_1  16# happyReduction_56-happyReduction_56 happy_x_1-	 =  case happyOutTok happy_x_1 of { (happy_var_1@(Located _ (Token (White DocStr) _))) -> -	happyIn31-		 (mkDoc (fmap tokenText happy_var_1)-	)}--happyReduce_57 = happySpecReduce_1  17# happyReduction_57-happyReduction_57 happy_x_1-	 =  case happyOut31 happy_x_1 of { happy_var_1 -> -	happyIn32-		 (Just happy_var_1-	)}--happyReduce_58 = happySpecReduce_0  17# happyReduction_58-happyReduction_58  =  happyIn32-		 (Nothing-	)--happyReduce_59 = happySpecReduce_3  18# happyReduction_59-happyReduction_59 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut37 happy_x_1 of { happy_var_1 -> -	case happyOut74 happy_x_3 of { happy_var_3 -> -	happyIn33-		 (at (head happy_var_1,happy_var_3) $ DSignature (reverse happy_var_1) happy_var_3-	)}}--happyReduce_60 = happySpecReduce_3  18# happyReduction_60-happyReduction_60 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut69 happy_x_1 of { happy_var_1 -> -	case happyOut45 happy_x_3 of { happy_var_3 -> -	happyIn33-		 (at (happy_var_1,happy_var_3) $ DPatBind happy_var_1 happy_var_3-	)}}--happyReduce_61 = happyReduce 5# 18# happyReduction_61-happyReduction_61 (happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym ParenL  ) _)) -> -	case happyOut53 happy_x_2 of { happy_var_2 -> -	case happyOut45 happy_x_5 of { happy_var_5 -> -	happyIn33-		 (at (happy_var_1,happy_var_5) $ DPatBind (PVar happy_var_2) happy_var_5-	) `HappyStk` happyRest}}}--happyReduce_62 = happyReduce 4# 18# happyReduction_62-happyReduction_62 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut38 happy_x_1 of { happy_var_1 -> -	case happyOut39 happy_x_2 of { happy_var_2 -> -	case happyOut45 happy_x_4 of { happy_var_4 -> -	happyIn33-		 (at (happy_var_1,happy_var_4) $-                             DBind $ Bind { bName      = happy_var_1-                                          , bParams    = reverse happy_var_2-                                          , bDef       = at happy_var_4 (Located emptyRange (DExpr happy_var_4))-                                          , bSignature = Nothing-                                          , bPragmas   = []-                                          , bMono      = False-                                          , bInfix     = False-                                          , bFixity    = Nothing-                                          , bDoc       = Nothing-                                          }-	) `HappyStk` happyRest}}}--happyReduce_63 = happyReduce 5# 18# happyReduction_63-happyReduction_63 (happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut70 happy_x_1 of { happy_var_1 -> -	case happyOut54 happy_x_2 of { happy_var_2 -> -	case happyOut70 happy_x_3 of { happy_var_3 -> -	case happyOut45 happy_x_5 of { happy_var_5 -> -	happyIn33-		 (at (happy_var_1,happy_var_5) $-                             DBind $ Bind { bName      = happy_var_2-                                          , bParams    = [happy_var_1,happy_var_3]-                                          , bDef       = at happy_var_5 (Located emptyRange (DExpr happy_var_5))-                                          , bSignature = Nothing-                                          , bPragmas   = []-                                          , bMono      = False-                                          , bInfix     = True-                                          , bFixity    = Nothing-                                          , bDoc       = Nothing-                                          }-	) `HappyStk` happyRest}}}}--happyReduce_64 = happyMonadReduce 4# 18# happyReduction_64-happyReduction_64 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (KW KW_type   ) _)) -> -	case happyOut91 happy_x_2 of { happy_var_2 -> -	case happyOut82 happy_x_4 of { happy_var_4 -> -	( at (happy_var_1,happy_var_4) `fmap` mkTySyn happy_var_2 [] happy_var_4)}}}-	) (\r -> happyReturn (happyIn33 r))--happyReduce_65 = happyMonadReduce 5# 18# happyReduction_65-happyReduction_65 (happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (KW KW_type   ) _)) -> -	case happyOut91 happy_x_2 of { happy_var_2 -> -	case happyOut81 happy_x_3 of { happy_var_3 -> -	case happyOut82 happy_x_5 of { happy_var_5 -> -	( at (happy_var_1,happy_var_5) `fmap` mkTySyn happy_var_2 (reverse happy_var_3) happy_var_5)}}}}-	) (\r -> happyReturn (happyIn33 r))--happyReduce_66 = happyMonadReduce 3# 18# happyReduction_66-happyReduction_66 (happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_2 of { (happy_var_2@(Located _ (Token (Num   {}) _))) -> -	case happyOut55 happy_x_3 of { happy_var_3 -> -	( mkFixity LeftAssoc  happy_var_2 (reverse happy_var_3))}}-	) (\r -> happyReturn (happyIn33 r))--happyReduce_67 = happyMonadReduce 3# 18# happyReduction_67-happyReduction_67 (happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_2 of { (happy_var_2@(Located _ (Token (Num   {}) _))) -> -	case happyOut55 happy_x_3 of { happy_var_3 -> -	( mkFixity RightAssoc happy_var_2 (reverse happy_var_3))}}-	) (\r -> happyReturn (happyIn33 r))--happyReduce_68 = happyMonadReduce 3# 18# happyReduction_68-happyReduction_68 (happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_2 of { (happy_var_2@(Located _ (Token (Num   {}) _))) -> -	case happyOut55 happy_x_3 of { happy_var_3 -> -	( mkFixity NonAssoc   happy_var_2 (reverse happy_var_3))}}-	) (\r -> happyReturn (happyIn33 r))--happyReduce_69 = happyReduce 4# 19# happyReduction_69-happyReduction_69 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut69 happy_x_2 of { happy_var_2 -> -	case happyOut45 happy_x_4 of { happy_var_4 -> -	happyIn34-		 (at (happy_var_2,happy_var_4) $ DPatBind happy_var_2 happy_var_4-	) `HappyStk` happyRest}}--happyReduce_70 = happyReduce 5# 19# happyReduction_70-happyReduction_70 (happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut91 happy_x_2 of { happy_var_2 -> -	case happyOut39 happy_x_3 of { happy_var_3 -> -	case happyOut45 happy_x_5 of { happy_var_5 -> -	happyIn34-		 (at (happy_var_2,happy_var_5) $-                                   DBind $ Bind { bName      = happy_var_2-                                                , bParams    = reverse happy_var_3-                                                , bDef       = at happy_var_5 (Located emptyRange (DExpr happy_var_5))-                                                , bSignature = Nothing-                                                , bPragmas   = []-                                                , bMono      = False-                                                , bInfix     = False-                                                , bFixity    = Nothing-                                                , bDoc       = Nothing-                                                }-	) `HappyStk` happyRest}}}--happyReduce_71 = happyReduce 4# 20# happyReduction_71-happyReduction_71 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut93 happy_x_2 of { happy_var_2 -> -	case happyOut36 happy_x_4 of { happy_var_4 -> -	happyIn35-		 (Newtype { nName = happy_var_2, nParams = [], nBody = happy_var_4 }-	) `HappyStk` happyRest}}--happyReduce_72 = happyReduce 5# 20# happyReduction_72-happyReduction_72 (happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut93 happy_x_2 of { happy_var_2 -> -	case happyOut81 happy_x_3 of { happy_var_3 -> -	case happyOut36 happy_x_5 of { happy_var_5 -> -	happyIn35-		 (Newtype { nName = happy_var_2, nParams = happy_var_3, nBody = happy_var_5 }-	) `HappyStk` happyRest}}}--happyReduce_73 = happySpecReduce_2  21# happyReduction_73-happyReduction_73 happy_x_2-	happy_x_1-	 =  happyIn36-		 ([]-	)--happyReduce_74 = happySpecReduce_3  21# happyReduction_74-happyReduction_74 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut89 happy_x_2 of { happy_var_2 -> -	happyIn36-		 (happy_var_2-	)}--happyReduce_75 = happySpecReduce_1  22# happyReduction_75-happyReduction_75 happy_x_1-	 =  case happyOut38 happy_x_1 of { happy_var_1 -> -	happyIn37-		 ([ happy_var_1]-	)}--happyReduce_76 = happySpecReduce_3  22# happyReduction_76-happyReduction_76 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut37 happy_x_1 of { happy_var_1 -> -	case happyOut38 happy_x_3 of { happy_var_3 -> -	happyIn37-		 (happy_var_3 : happy_var_1-	)}}--happyReduce_77 = happySpecReduce_1  23# happyReduction_77-happyReduction_77 happy_x_1-	 =  case happyOut91 happy_x_1 of { happy_var_1 -> -	happyIn38-		 (happy_var_1-	)}--happyReduce_78 = happySpecReduce_3  23# happyReduction_78-happyReduction_78 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut53 happy_x_2 of { happy_var_2 -> -	happyIn38-		 (happy_var_2-	)}--happyReduce_79 = happySpecReduce_1  24# happyReduction_79-happyReduction_79 happy_x_1-	 =  case happyOut70 happy_x_1 of { happy_var_1 -> -	happyIn39-		 ([happy_var_1]-	)}--happyReduce_80 = happySpecReduce_2  24# happyReduction_80-happyReduction_80 happy_x_2-	happy_x_1-	 =  case happyOut40 happy_x_1 of { happy_var_1 -> -	case happyOut70 happy_x_2 of { happy_var_2 -> -	happyIn39-		 (happy_var_2 : happy_var_1-	)}}--happyReduce_81 = happySpecReduce_1  25# happyReduction_81-happyReduction_81 happy_x_1-	 =  case happyOut70 happy_x_1 of { happy_var_1 -> -	happyIn40-		 ([happy_var_1]-	)}--happyReduce_82 = happySpecReduce_2  25# happyReduction_82-happyReduction_82 happy_x_2-	happy_x_1-	 =  case happyOut40 happy_x_1 of { happy_var_1 -> -	case happyOut70 happy_x_2 of { happy_var_2 -> -	happyIn40-		 (happy_var_2 : happy_var_1-	)}}--happyReduce_83 = happySpecReduce_2  26# happyReduction_83-happyReduction_83 happy_x_2-	happy_x_1-	 =  case happyOut33 happy_x_1 of { happy_var_1 -> -	happyIn41-		 ([happy_var_1]-	)}--happyReduce_84 = happySpecReduce_3  26# happyReduction_84-happyReduction_84 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut41 happy_x_1 of { happy_var_1 -> -	case happyOut33 happy_x_2 of { happy_var_2 -> -	happyIn41-		 (happy_var_2 : happy_var_1-	)}}--happyReduce_85 = happySpecReduce_1  27# happyReduction_85-happyReduction_85 happy_x_1-	 =  case happyOut33 happy_x_1 of { happy_var_1 -> -	happyIn42-		 ([happy_var_1]-	)}--happyReduce_86 = happySpecReduce_3  27# happyReduction_86-happyReduction_86 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut42 happy_x_1 of { happy_var_1 -> -	case happyOut33 happy_x_3 of { happy_var_3 -> -	happyIn42-		 (happy_var_3 : happy_var_1-	)}}--happyReduce_87 = happySpecReduce_3  27# happyReduction_87-happyReduction_87 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut42 happy_x_1 of { happy_var_1 -> -	case happyOut33 happy_x_3 of { happy_var_3 -> -	happyIn42-		 (happy_var_3 : happy_var_1-	)}}--happyReduce_88 = happySpecReduce_3  28# happyReduction_88-happyReduction_88 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut42 happy_x_2 of { happy_var_2 -> -	happyIn43-		 (happy_var_2-	)}--happyReduce_89 = happySpecReduce_2  28# happyReduction_89-happyReduction_89 happy_x_2-	happy_x_1-	 =  happyIn43-		 ([]-	)--happyReduce_90 = happySpecReduce_1  29# happyReduction_90-happyReduction_90 happy_x_1-	 =  case happyOut45 happy_x_1 of { happy_var_1 -> -	happyIn44-		 (ExprInput happy_var_1-	)}--happyReduce_91 = happySpecReduce_1  29# happyReduction_91-happyReduction_91 happy_x_1-	 =  case happyOut34 happy_x_1 of { happy_var_1 -> -	happyIn44-		 (LetInput happy_var_1-	)}--happyReduce_92 = happySpecReduce_1  30# happyReduction_92-happyReduction_92 happy_x_1-	 =  case happyOut48 happy_x_1 of { happy_var_1 -> -	happyIn45-		 (happy_var_1-	)}--happyReduce_93 = happyReduce 4# 30# happyReduction_93-happyReduction_93 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut45 happy_x_1 of { happy_var_1 -> -	case happyOutTok happy_x_4 of { (Located happy_var_4 (Token (Sym CurlyR  ) _)) -> -	happyIn45-		 (at (happy_var_1,happy_var_4) $ EWhere happy_var_1 []-	) `HappyStk` happyRest}}--happyReduce_94 = happyReduce 5# 30# happyReduction_94-happyReduction_94 (happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut45 happy_x_1 of { happy_var_1 -> -	case happyOut41 happy_x_4 of { happy_var_4 -> -	case happyOutTok happy_x_5 of { (Located happy_var_5 (Token (Sym CurlyR  ) _)) -> -	happyIn45-		 (at (happy_var_1,happy_var_5) $ EWhere happy_var_1 (reverse happy_var_4)-	) `HappyStk` happyRest}}}--happyReduce_95 = happyReduce 4# 30# happyReduction_95-happyReduction_95 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut45 happy_x_1 of { happy_var_1 -> -	case happyOutTok happy_x_2 of { (Located happy_var_2 (Token (KW KW_where  ) _)) -> -	happyIn45-		 (at (happy_var_1,happy_var_2) $ EWhere happy_var_1 []-	) `HappyStk` happyRest}}--happyReduce_96 = happyReduce 5# 30# happyReduction_96-happyReduction_96 (happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut45 happy_x_1 of { happy_var_1 -> -	case happyOut42 happy_x_4 of { happy_var_4 -> -	happyIn45-		 (at (happy_var_1,happy_var_4) $ EWhere happy_var_1 (reverse happy_var_4)-	) `HappyStk` happyRest}}--happyReduce_97 = happySpecReduce_1  31# happyReduction_97-happyReduction_97 happy_x_1-	 =  case happyOut47 happy_x_1 of { happy_var_1 -> -	happyIn46-		 ([happy_var_1]-	)}--happyReduce_98 = happySpecReduce_3  31# happyReduction_98-happyReduction_98 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut46 happy_x_1 of { happy_var_1 -> -	case happyOut47 happy_x_3 of { happy_var_3 -> -	happyIn46-		 (happy_var_3 : happy_var_1-	)}}--happyReduce_99 = happySpecReduce_3  32# happyReduction_99-happyReduction_99 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut45 happy_x_1 of { happy_var_1 -> -	case happyOut45 happy_x_3 of { happy_var_3 -> -	happyIn47-		 ((happy_var_1, happy_var_3)-	)}}--happyReduce_100 = happySpecReduce_1  33# happyReduction_100-happyReduction_100 happy_x_1-	 =  case happyOut49 happy_x_1 of { happy_var_1 -> -	happyIn48-		 (happy_var_1-	)}--happyReduce_101 = happyReduce 4# 33# happyReduction_101-happyReduction_101 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (KW KW_if     ) _)) -> -	case happyOut46 happy_x_2 of { happy_var_2 -> -	case happyOut48 happy_x_4 of { happy_var_4 -> -	happyIn48-		 (at (happy_var_1,happy_var_4) $ mkIf (reverse happy_var_2) happy_var_4-	) `HappyStk` happyRest}}}--happyReduce_102 = happyReduce 4# 33# happyReduction_102-happyReduction_102 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym Lambda  ) _)) -> -	case happyOut39 happy_x_2 of { happy_var_2 -> -	case happyOut48 happy_x_4 of { happy_var_4 -> -	happyIn48-		 (at (happy_var_1,happy_var_4) $ EFun (reverse happy_var_2) happy_var_4-	) `HappyStk` happyRest}}}--happyReduce_103 = happySpecReduce_1  34# happyReduction_103-happyReduction_103 happy_x_1-	 =  case happyOut50 happy_x_1 of { happy_var_1 -> -	happyIn49-		 (happy_var_1-	)}--happyReduce_104 = happySpecReduce_3  34# happyReduction_104-happyReduction_104 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut50 happy_x_1 of { happy_var_1 -> -	case happyOut82 happy_x_3 of { happy_var_3 -> -	happyIn49-		 (at (happy_var_1,happy_var_3) $ ETyped happy_var_1 happy_var_3-	)}}--happyReduce_105 = happySpecReduce_1  35# happyReduction_105-happyReduction_105 happy_x_1-	 =  case happyOut51 happy_x_1 of { happy_var_1 -> -	happyIn50-		 (happy_var_1-	)}--happyReduce_106 = happySpecReduce_3  35# happyReduction_106-happyReduction_106 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut50 happy_x_1 of { happy_var_1 -> -	case happyOut52 happy_x_2 of { happy_var_2 -> -	case happyOut51 happy_x_3 of { happy_var_3 -> -	happyIn50-		 (binOp happy_var_1 happy_var_2 happy_var_3-	)}}}--happyReduce_107 = happySpecReduce_1  36# happyReduction_107-happyReduction_107 happy_x_1-	 =  case happyOut56 happy_x_1 of { happy_var_1 -> -	happyIn51-		 (mkEApp happy_var_1-	)}--happyReduce_108 = happySpecReduce_2  36# happyReduction_108-happyReduction_108 happy_x_2-	happy_x_1-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Op Minus) _)) -> -	case happyOut51 happy_x_2 of { happy_var_2 -> -	happyIn51-		 (at (happy_var_1,happy_var_2) $ EApp (at happy_var_1 (EVar (mkUnqual "negate"))) happy_var_2-	)}}--happyReduce_109 = happySpecReduce_2  36# happyReduction_109-happyReduction_109 happy_x_2-	happy_x_1-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Op Complement) _)) -> -	case happyOut51 happy_x_2 of { happy_var_2 -> -	happyIn51-		 (at (happy_var_1,happy_var_2) $ EApp (at happy_var_1 (EVar (mkUnqual "complement"))) happy_var_2-	)}}--happyReduce_110 = happySpecReduce_1  37# happyReduction_110-happyReduction_110 happy_x_1-	 =  case happyOut53 happy_x_1 of { happy_var_1 -> -	happyIn52-		 (happy_var_1-	)}--happyReduce_111 = happySpecReduce_1  37# happyReduction_111-happyReduction_111 happy_x_1-	 =  case happyOutTok happy_x_1 of { (happy_var_1@(Located _ (Token (Op  Other{}   )  _))) -> -	happyIn52-		 (let Token (Op (Other ns i)) _ = thing happy_var_1-                                       in mkQual (mkModName ns) (mkInfix (T.toStrict i)) A.<$ happy_var_1-	)}--happyReduce_112 = happySpecReduce_1  38# happyReduction_112-happyReduction_112 happy_x_1-	 =  case happyOut54 happy_x_1 of { happy_var_1 -> -	happyIn53-		 (happy_var_1-	)}--happyReduce_113 = happySpecReduce_1  38# happyReduction_113-happyReduction_113 happy_x_1-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Op Mul)   _)) -> -	happyIn53-		 (Located happy_var_1 $ mkUnqual $ mkInfix "*"-	)}--happyReduce_114 = happySpecReduce_1  38# happyReduction_114-happyReduction_114 happy_x_1-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Op Plus)  _)) -> -	happyIn53-		 (Located happy_var_1 $ mkUnqual $ mkInfix "+"-	)}--happyReduce_115 = happySpecReduce_1  38# happyReduction_115-happyReduction_115 happy_x_1-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Op Minus) _)) -> -	happyIn53-		 (Located happy_var_1 $ mkUnqual $ mkInfix "-"-	)}--happyReduce_116 = happySpecReduce_1  38# happyReduction_116-happyReduction_116 happy_x_1-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Op Complement) _)) -> -	happyIn53-		 (Located happy_var_1 $ mkUnqual $ mkInfix "~"-	)}--happyReduce_117 = happySpecReduce_1  38# happyReduction_117-happyReduction_117 happy_x_1-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Op Exp)   _)) -> -	happyIn53-		 (Located happy_var_1 $ mkUnqual $ mkInfix "^^"-	)}--happyReduce_118 = happySpecReduce_1  38# happyReduction_118-happyReduction_118 happy_x_1-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Op Hash) _)) -> -	happyIn53-		 (Located happy_var_1 $ mkUnqual $ mkInfix "#"-	)}--happyReduce_119 = happySpecReduce_1  39# happyReduction_119-happyReduction_119 happy_x_1-	 =  case happyOutTok happy_x_1 of { (happy_var_1@(Located _ (Token (Op (Other [] _)) _))) -> -	happyIn54-		 (let Token (Op (Other [] str)) _ = thing happy_var_1-                                       in mkUnqual (mkInfix (T.toStrict str)) A.<$ happy_var_1-	)}--happyReduce_120 = happySpecReduce_1  40# happyReduction_120-happyReduction_120 happy_x_1-	 =  case happyOut53 happy_x_1 of { happy_var_1 -> -	happyIn55-		 ([happy_var_1]-	)}--happyReduce_121 = happySpecReduce_3  40# happyReduction_121-happyReduction_121 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut55 happy_x_1 of { happy_var_1 -> -	case happyOut53 happy_x_3 of { happy_var_3 -> -	happyIn55-		 (happy_var_3 : happy_var_1-	)}}--happyReduce_122 = happySpecReduce_1  41# happyReduction_122-happyReduction_122 happy_x_1-	 =  case happyOut57 happy_x_1 of { happy_var_1 -> -	happyIn56-		 ([happy_var_1]-	)}--happyReduce_123 = happySpecReduce_2  41# happyReduction_123-happyReduction_123 happy_x_2-	happy_x_1-	 =  case happyOut56 happy_x_1 of { happy_var_1 -> -	case happyOut57 happy_x_2 of { happy_var_2 -> -	happyIn56-		 (happy_var_2 : happy_var_1-	)}}--happyReduce_124 = happySpecReduce_1  42# happyReduction_124-happyReduction_124 happy_x_1-	 =  case happyOut93 happy_x_1 of { happy_var_1 -> -	happyIn57-		 (at happy_var_1 $ EVar (thing happy_var_1)-	)}--happyReduce_125 = happySpecReduce_1  42# happyReduction_125-happyReduction_125 happy_x_1-	 =  case happyOutTok happy_x_1 of { (happy_var_1@(Located _ (Token (Num   {}) _))) -> -	happyIn57-		 (at happy_var_1 $ numLit (tokenType (thing happy_var_1))-	)}--happyReduce_126 = happySpecReduce_1  42# happyReduction_126-happyReduction_126 happy_x_1-	 =  case happyOutTok happy_x_1 of { (happy_var_1@(Located _ (Token (StrLit {}) _))) -> -	happyIn57-		 (at happy_var_1 $ ELit $ ECString $ getStr happy_var_1-	)}--happyReduce_127 = happySpecReduce_1  42# happyReduction_127-happyReduction_127 happy_x_1-	 =  case happyOutTok happy_x_1 of { (happy_var_1@(Located _ (Token (ChrLit {}) _))) -> -	happyIn57-		 (at happy_var_1 $ ELit $ ECNum (getNum happy_var_1) CharLit-	)}--happyReduce_128 = happySpecReduce_3  42# happyReduction_128-happyReduction_128 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym ParenL  ) _)) -> -	case happyOut45 happy_x_2 of { happy_var_2 -> -	case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym ParenR  ) _)) -> -	happyIn57-		 (at (happy_var_1,happy_var_3) $ EParens happy_var_2-	)}}}--happyReduce_129 = happySpecReduce_3  42# happyReduction_129-happyReduction_129 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym ParenL  ) _)) -> -	case happyOut61 happy_x_2 of { happy_var_2 -> -	case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym ParenR  ) _)) -> -	happyIn57-		 (at (happy_var_1,happy_var_3) $ ETuple (reverse happy_var_2)-	)}}}--happyReduce_130 = happySpecReduce_2  42# happyReduction_130-happyReduction_130 happy_x_2-	happy_x_1-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym ParenL  ) _)) -> -	case happyOutTok happy_x_2 of { (Located happy_var_2 (Token (Sym ParenR  ) _)) -> -	happyIn57-		 (at (happy_var_1,happy_var_2) $ ETuple []-	)}}--happyReduce_131 = happySpecReduce_2  42# happyReduction_131-happyReduction_131 happy_x_2-	happy_x_1-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym CurlyL  ) _)) -> -	case happyOutTok happy_x_2 of { (Located happy_var_2 (Token (Sym CurlyR  ) _)) -> -	happyIn57-		 (at (happy_var_1,happy_var_2) $ ERecord []-	)}}--happyReduce_132 = happySpecReduce_3  42# happyReduction_132-happyReduction_132 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym CurlyL  ) _)) -> -	case happyOut63 happy_x_2 of { happy_var_2 -> -	case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym CurlyR  ) _)) -> -	happyIn57-		 (at (happy_var_1,happy_var_3) $ ERecord (reverse happy_var_2)-	)}}}--happyReduce_133 = happySpecReduce_2  42# happyReduction_133-happyReduction_133 happy_x_2-	happy_x_1-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym BracketL) _)) -> -	case happyOutTok happy_x_2 of { (Located happy_var_2 (Token (Sym BracketR) _)) -> -	happyIn57-		 (at (happy_var_1,happy_var_2) $ EList []-	)}}--happyReduce_134 = happySpecReduce_3  42# happyReduction_134-happyReduction_134 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym BracketL) _)) -> -	case happyOut64 happy_x_2 of { happy_var_2 -> -	case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym BracketR) _)) -> -	happyIn57-		 (at (happy_var_1,happy_var_3) happy_var_2-	)}}}--happyReduce_135 = happySpecReduce_2  42# happyReduction_135-happyReduction_135 happy_x_2-	happy_x_1-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym BackTick) _)) -> -	case happyOut95 happy_x_2 of { happy_var_2 -> -	happyIn57-		 (at (happy_var_1,happy_var_2) $ ETypeVal happy_var_2-	)}}--happyReduce_136 = happySpecReduce_3  42# happyReduction_136-happyReduction_136 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut57 happy_x_1 of { happy_var_1 -> -	case happyOut60 happy_x_3 of { happy_var_3 -> -	happyIn57-		 (at (happy_var_1,happy_var_3) $ ESel happy_var_1 (thing happy_var_3)-	)}}--happyReduce_137 = happySpecReduce_3  42# happyReduction_137-happyReduction_137 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym ParenL  ) _)) -> -	case happyOut52 happy_x_2 of { happy_var_2 -> -	case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym ParenR  ) _)) -> -	happyIn57-		 (at (happy_var_1,happy_var_3) $ EVar $ thing happy_var_2-	)}}}--happyReduce_138 = happyMonadReduce 2# 42# happyReduction_138-happyReduction_138 (happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym TriL    ) _)) -> -	case happyOutTok happy_x_2 of { (Located happy_var_2 (Token (Sym TriR    ) _)) -> -	( mkPoly (rComb happy_var_1 happy_var_2) [])}}-	) (\r -> happyReturn (happyIn57 r))--happyReduce_139 = happyMonadReduce 3# 42# happyReduction_139-happyReduction_139 (happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym TriL    ) _)) -> -	case happyOut58 happy_x_2 of { happy_var_2 -> -	case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym TriR    ) _)) -> -	( mkPoly (rComb happy_var_1 happy_var_3) happy_var_2)}}}-	) (\r -> happyReturn (happyIn57 r))--happyReduce_140 = happySpecReduce_1  43# happyReduction_140-happyReduction_140 happy_x_1-	 =  case happyOut59 happy_x_1 of { happy_var_1 -> -	happyIn58-		 ([happy_var_1]-	)}--happyReduce_141 = happySpecReduce_3  43# happyReduction_141-happyReduction_141 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut58 happy_x_1 of { happy_var_1 -> -	case happyOut59 happy_x_3 of { happy_var_3 -> -	happyIn58-		 (happy_var_3 : happy_var_1-	)}}--happyReduce_142 = happyMonadReduce 1# 44# happyReduction_142-happyReduction_142 (happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_1 of { (happy_var_1@(Located _ (Token (Num   {}) _))) -> -	( polyTerm (srcRange happy_var_1) (getNum happy_var_1) 0)}-	) (\r -> happyReturn (happyIn59 r))--happyReduce_143 = happyMonadReduce 1# 44# happyReduction_143-happyReduction_143 (happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (KW KW_x)       _)) -> -	( polyTerm happy_var_1 1 1)}-	) (\r -> happyReturn (happyIn59 r))--happyReduce_144 = happyMonadReduce 3# 44# happyReduction_144-happyReduction_144 (happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (KW KW_x)       _)) -> -	case happyOutTok happy_x_3 of { (happy_var_3@(Located _ (Token (Num   {}) _))) -> -	( polyTerm (rComb happy_var_1 (srcRange happy_var_3))-                                                            1 (getNum happy_var_3))}}-	) (\r -> happyReturn (happyIn59 r))--happyReduce_145 = happySpecReduce_1  45# happyReduction_145-happyReduction_145 happy_x_1-	 =  case happyOut90 happy_x_1 of { happy_var_1 -> -	happyIn60-		 (fmap (`RecordSel` Nothing) happy_var_1-	)}--happyReduce_146 = happyMonadReduce 1# 45# happyReduction_146-happyReduction_146 (happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_1 of { (happy_var_1@(Located _ (Token (Num   {}) _))) -> -	( mkTupleSel (srcRange happy_var_1) (getNum happy_var_1))}-	) (\r -> happyReturn (happyIn60 r))--happyReduce_147 = happySpecReduce_3  46# happyReduction_147-happyReduction_147 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut45 happy_x_1 of { happy_var_1 -> -	case happyOut45 happy_x_3 of { happy_var_3 -> -	happyIn61-		 ([ happy_var_3, happy_var_1]-	)}}--happyReduce_148 = happySpecReduce_3  46# happyReduction_148-happyReduction_148 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut61 happy_x_1 of { happy_var_1 -> -	case happyOut45 happy_x_3 of { happy_var_3 -> -	happyIn61-		 (happy_var_3 : happy_var_1-	)}}--happyReduce_149 = happySpecReduce_3  47# happyReduction_149-happyReduction_149 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut90 happy_x_1 of { happy_var_1 -> -	case happyOut45 happy_x_3 of { happy_var_3 -> -	happyIn62-		 (Named { name = happy_var_1, value = happy_var_3 }-	)}}--happyReduce_150 = happyReduce 4# 47# happyReduction_150-happyReduction_150 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut90 happy_x_1 of { happy_var_1 -> -	case happyOut39 happy_x_2 of { happy_var_2 -> -	case happyOut45 happy_x_4 of { happy_var_4 -> -	happyIn62-		 (Named { name = happy_var_1, value = EFun (reverse happy_var_2) happy_var_4 }-	) `HappyStk` happyRest}}}--happyReduce_151 = happySpecReduce_1  48# happyReduction_151-happyReduction_151 happy_x_1-	 =  case happyOut62 happy_x_1 of { happy_var_1 -> -	happyIn63-		 ([happy_var_1]-	)}--happyReduce_152 = happySpecReduce_3  48# happyReduction_152-happyReduction_152 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut63 happy_x_1 of { happy_var_1 -> -	case happyOut62 happy_x_3 of { happy_var_3 -> -	happyIn63-		 (happy_var_3 : happy_var_1-	)}}--happyReduce_153 = happySpecReduce_3  49# happyReduction_153-happyReduction_153 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut45 happy_x_1 of { happy_var_1 -> -	case happyOut65 happy_x_3 of { happy_var_3 -> -	happyIn64-		 (EComp happy_var_1 (reverse happy_var_3)-	)}}--happyReduce_154 = happySpecReduce_1  49# happyReduction_154-happyReduction_154 happy_x_1-	 =  case happyOut45 happy_x_1 of { happy_var_1 -> -	happyIn64-		 (EList [happy_var_1]-	)}--happyReduce_155 = happySpecReduce_1  49# happyReduction_155-happyReduction_155 happy_x_1-	 =  case happyOut61 happy_x_1 of { happy_var_1 -> -	happyIn64-		 (EList (reverse happy_var_1)-	)}--happyReduce_156 = happyMonadReduce 2# 49# happyReduction_156-happyReduction_156 (happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOut45 happy_x_1 of { happy_var_1 -> -	case happyOutTok happy_x_2 of { (Located happy_var_2 (Token (Sym DotDot  ) _)) -> -	( eFromTo happy_var_2 happy_var_1 Nothing   Nothing)}}-	) (\r -> happyReturn (happyIn64 r))--happyReduce_157 = happyMonadReduce 3# 49# happyReduction_157-happyReduction_157 (happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOut45 happy_x_1 of { happy_var_1 -> -	case happyOutTok happy_x_2 of { (Located happy_var_2 (Token (Sym DotDot  ) _)) -> -	case happyOut45 happy_x_3 of { happy_var_3 -> -	( eFromTo happy_var_2 happy_var_1 Nothing   (Just happy_var_3))}}}-	) (\r -> happyReturn (happyIn64 r))--happyReduce_158 = happyMonadReduce 4# 49# happyReduction_158-happyReduction_158 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOut45 happy_x_1 of { happy_var_1 -> -	case happyOut45 happy_x_3 of { happy_var_3 -> -	case happyOutTok happy_x_4 of { (Located happy_var_4 (Token (Sym DotDot  ) _)) -> -	( eFromTo happy_var_4 happy_var_1 (Just happy_var_3) Nothing)}}}-	) (\r -> happyReturn (happyIn64 r))--happyReduce_159 = happyMonadReduce 5# 49# happyReduction_159-happyReduction_159 (happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOut45 happy_x_1 of { happy_var_1 -> -	case happyOut45 happy_x_3 of { happy_var_3 -> -	case happyOutTok happy_x_4 of { (Located happy_var_4 (Token (Sym DotDot  ) _)) -> -	case happyOut45 happy_x_5 of { happy_var_5 -> -	( eFromTo happy_var_4 happy_var_1 (Just happy_var_3) (Just happy_var_5))}}}}-	) (\r -> happyReturn (happyIn64 r))--happyReduce_160 = happySpecReduce_2  49# happyReduction_160-happyReduction_160 happy_x_2-	happy_x_1-	 =  case happyOut45 happy_x_1 of { happy_var_1 -> -	happyIn64-		 (EInfFrom happy_var_1 Nothing-	)}--happyReduce_161 = happyReduce 4# 49# happyReduction_161-happyReduction_161 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut45 happy_x_1 of { happy_var_1 -> -	case happyOut45 happy_x_3 of { happy_var_3 -> -	happyIn64-		 (EInfFrom happy_var_1 (Just happy_var_3)-	) `HappyStk` happyRest}}--happyReduce_162 = happySpecReduce_1  50# happyReduction_162-happyReduction_162 happy_x_1-	 =  case happyOut66 happy_x_1 of { happy_var_1 -> -	happyIn65-		 ([ reverse happy_var_1 ]-	)}--happyReduce_163 = happySpecReduce_3  50# happyReduction_163-happyReduction_163 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut65 happy_x_1 of { happy_var_1 -> -	case happyOut66 happy_x_3 of { happy_var_3 -> -	happyIn65-		 (reverse happy_var_3 : happy_var_1-	)}}--happyReduce_164 = happySpecReduce_1  51# happyReduction_164-happyReduction_164 happy_x_1-	 =  case happyOut67 happy_x_1 of { happy_var_1 -> -	happyIn66-		 ([happy_var_1]-	)}--happyReduce_165 = happySpecReduce_3  51# happyReduction_165-happyReduction_165 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut66 happy_x_1 of { happy_var_1 -> -	case happyOut67 happy_x_3 of { happy_var_3 -> -	happyIn66-		 (happy_var_3 : happy_var_1-	)}}--happyReduce_166 = happySpecReduce_3  52# happyReduction_166-happyReduction_166 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut68 happy_x_1 of { happy_var_1 -> -	case happyOut45 happy_x_3 of { happy_var_3 -> -	happyIn67-		 (Match happy_var_1 happy_var_3-	)}}--happyReduce_167 = happySpecReduce_3  53# happyReduction_167-happyReduction_167 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut69 happy_x_1 of { happy_var_1 -> -	case happyOut82 happy_x_3 of { happy_var_3 -> -	happyIn68-		 (at (happy_var_1,happy_var_3) $ PTyped happy_var_1 happy_var_3-	)}}--happyReduce_168 = happySpecReduce_1  53# happyReduction_168-happyReduction_168 happy_x_1-	 =  case happyOut69 happy_x_1 of { happy_var_1 -> -	happyIn68-		 (happy_var_1-	)}--happyReduce_169 = happySpecReduce_3  54# happyReduction_169-happyReduction_169 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut69 happy_x_1 of { happy_var_1 -> -	case happyOut69 happy_x_3 of { happy_var_3 -> -	happyIn69-		 (at (happy_var_1,happy_var_3) $ PSplit happy_var_1 happy_var_3-	)}}--happyReduce_170 = happySpecReduce_1  54# happyReduction_170-happyReduction_170 happy_x_1-	 =  case happyOut70 happy_x_1 of { happy_var_1 -> -	happyIn69-		 (happy_var_1-	)}--happyReduce_171 = happySpecReduce_1  55# happyReduction_171-happyReduction_171 happy_x_1-	 =  case happyOut91 happy_x_1 of { happy_var_1 -> -	happyIn70-		 (PVar happy_var_1-	)}--happyReduce_172 = happySpecReduce_1  55# happyReduction_172-happyReduction_172 happy_x_1-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym Underscore ) _)) -> -	happyIn70-		 (at happy_var_1       $ PWild-	)}--happyReduce_173 = happySpecReduce_2  55# happyReduction_173-happyReduction_173 happy_x_2-	happy_x_1-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym ParenL  ) _)) -> -	case happyOutTok happy_x_2 of { (Located happy_var_2 (Token (Sym ParenR  ) _)) -> -	happyIn70-		 (at (happy_var_1,happy_var_2) $ PTuple []-	)}}--happyReduce_174 = happySpecReduce_3  55# happyReduction_174-happyReduction_174 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym ParenL  ) _)) -> -	case happyOut68 happy_x_2 of { happy_var_2 -> -	case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym ParenR  ) _)) -> -	happyIn70-		 (at (happy_var_1,happy_var_3)   happy_var_2-	)}}}--happyReduce_175 = happySpecReduce_3  55# happyReduction_175-happyReduction_175 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym ParenL  ) _)) -> -	case happyOut71 happy_x_2 of { happy_var_2 -> -	case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym ParenR  ) _)) -> -	happyIn70-		 (at (happy_var_1,happy_var_3) $ PTuple (reverse happy_var_2)-	)}}}--happyReduce_176 = happySpecReduce_2  55# happyReduction_176-happyReduction_176 happy_x_2-	happy_x_1-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym BracketL) _)) -> -	case happyOutTok happy_x_2 of { (Located happy_var_2 (Token (Sym BracketR) _)) -> -	happyIn70-		 (at (happy_var_1,happy_var_2) $ PList []-	)}}--happyReduce_177 = happySpecReduce_3  55# happyReduction_177-happyReduction_177 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym BracketL) _)) -> -	case happyOut68 happy_x_2 of { happy_var_2 -> -	case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym BracketR) _)) -> -	happyIn70-		 (at (happy_var_1,happy_var_3) $ PList [happy_var_2]-	)}}}--happyReduce_178 = happySpecReduce_3  55# happyReduction_178-happyReduction_178 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym BracketL) _)) -> -	case happyOut71 happy_x_2 of { happy_var_2 -> -	case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym BracketR) _)) -> -	happyIn70-		 (at (happy_var_1,happy_var_3) $ PList (reverse happy_var_2)-	)}}}--happyReduce_179 = happySpecReduce_2  55# happyReduction_179-happyReduction_179 happy_x_2-	happy_x_1-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym CurlyL  ) _)) -> -	case happyOutTok happy_x_2 of { (Located happy_var_2 (Token (Sym CurlyR  ) _)) -> -	happyIn70-		 (at (happy_var_1,happy_var_2) $ PRecord []-	)}}--happyReduce_180 = happySpecReduce_3  55# happyReduction_180-happyReduction_180 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym CurlyL  ) _)) -> -	case happyOut73 happy_x_2 of { happy_var_2 -> -	case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym CurlyR  ) _)) -> -	happyIn70-		 (at (happy_var_1,happy_var_3) $ PRecord (reverse happy_var_2)-	)}}}--happyReduce_181 = happySpecReduce_3  56# happyReduction_181-happyReduction_181 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut68 happy_x_1 of { happy_var_1 -> -	case happyOut68 happy_x_3 of { happy_var_3 -> -	happyIn71-		 ([happy_var_3, happy_var_1]-	)}}--happyReduce_182 = happySpecReduce_3  56# happyReduction_182-happyReduction_182 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut71 happy_x_1 of { happy_var_1 -> -	case happyOut68 happy_x_3 of { happy_var_3 -> -	happyIn71-		 (happy_var_3 : happy_var_1-	)}}--happyReduce_183 = happySpecReduce_3  57# happyReduction_183-happyReduction_183 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut90 happy_x_1 of { happy_var_1 -> -	case happyOut68 happy_x_3 of { happy_var_3 -> -	happyIn72-		 (Named { name = happy_var_1, value = happy_var_3 }-	)}}--happyReduce_184 = happySpecReduce_1  58# happyReduction_184-happyReduction_184 happy_x_1-	 =  case happyOut72 happy_x_1 of { happy_var_1 -> -	happyIn73-		 ([happy_var_1]-	)}--happyReduce_185 = happySpecReduce_3  58# happyReduction_185-happyReduction_185 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut73 happy_x_1 of { happy_var_1 -> -	case happyOut72 happy_x_3 of { happy_var_3 -> -	happyIn73-		 (happy_var_3 : happy_var_1-	)}}--happyReduce_186 = happySpecReduce_1  59# happyReduction_186-happyReduction_186 happy_x_1-	 =  case happyOut82 happy_x_1 of { happy_var_1 -> -	happyIn74-		 (at happy_var_1 $ mkSchema [] [] happy_var_1-	)}--happyReduce_187 = happySpecReduce_2  59# happyReduction_187-happyReduction_187 happy_x_2-	happy_x_1-	 =  case happyOut75 happy_x_1 of { happy_var_1 -> -	case happyOut82 happy_x_2 of { happy_var_2 -> -	happyIn74-		 (at (happy_var_1,happy_var_2) $ mkSchema (thing happy_var_1) [] happy_var_2-	)}}--happyReduce_188 = happySpecReduce_2  59# happyReduction_188-happyReduction_188 happy_x_2-	happy_x_1-	 =  case happyOut76 happy_x_1 of { happy_var_1 -> -	case happyOut82 happy_x_2 of { happy_var_2 -> -	happyIn74-		 (at (happy_var_1,happy_var_2) $ mkSchema [] (thing happy_var_1) happy_var_2-	)}}--happyReduce_189 = happySpecReduce_3  59# happyReduction_189-happyReduction_189 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut75 happy_x_1 of { happy_var_1 -> -	case happyOut76 happy_x_2 of { happy_var_2 -> -	case happyOut82 happy_x_3 of { happy_var_3 -> -	happyIn74-		 (at (happy_var_1,happy_var_3) $ mkSchema (thing happy_var_1)-                                                          (thing happy_var_2) happy_var_3-	)}}}--happyReduce_190 = happySpecReduce_2  60# happyReduction_190-happyReduction_190 happy_x_2-	happy_x_1-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym CurlyL  ) _)) -> -	case happyOutTok happy_x_2 of { (Located happy_var_2 (Token (Sym CurlyR  ) _)) -> -	happyIn75-		 (Located (rComb happy_var_1 happy_var_2) []-	)}}--happyReduce_191 = happySpecReduce_3  60# happyReduction_191-happyReduction_191 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym CurlyL  ) _)) -> -	case happyOut79 happy_x_2 of { happy_var_2 -> -	case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym CurlyR  ) _)) -> -	happyIn75-		 (Located (rComb happy_var_1 happy_var_3) (reverse happy_var_2)-	)}}}--happyReduce_192 = happyMonadReduce 2# 61# happyReduction_192-happyReduction_192 (happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOut82 happy_x_1 of { happy_var_1 -> -	case happyOutTok happy_x_2 of { (Located happy_var_2 (Token (Sym FatArrR ) _)) -> -	( fmap (\x -> at (x,happy_var_2) x) (mkProp happy_var_1))}}-	) (\r -> happyReturn (happyIn76 r))--happyReduce_193 = happySpecReduce_1  62# happyReduction_193-happyReduction_193 happy_x_1-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Op Hash) _)) -> -	happyIn77-		 (Located happy_var_1 KNum-	)}--happyReduce_194 = happySpecReduce_1  62# happyReduction_194-happyReduction_194 happy_x_1-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Op Mul)   _)) -> -	happyIn77-		 (Located happy_var_1 KType-	)}--happyReduce_195 = happyMonadReduce 1# 63# happyReduction_195-happyReduction_195 (happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOut90 happy_x_1 of { happy_var_1 -> -	( mkTParam happy_var_1 Nothing)}-	) (\r -> happyReturn (happyIn78 r))--happyReduce_196 = happyMonadReduce 3# 63# happyReduction_196-happyReduction_196 (happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOut90 happy_x_1 of { happy_var_1 -> -	case happyOut77 happy_x_3 of { happy_var_3 -> -	( mkTParam (at (happy_var_1,happy_var_3) happy_var_1) (Just (thing happy_var_3)))}}-	) (\r -> happyReturn (happyIn78 r))--happyReduce_197 = happySpecReduce_1  64# happyReduction_197-happyReduction_197 happy_x_1-	 =  case happyOut78 happy_x_1 of { happy_var_1 -> -	happyIn79-		 ([happy_var_1]-	)}--happyReduce_198 = happySpecReduce_3  64# happyReduction_198-happyReduction_198 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut79 happy_x_1 of { happy_var_1 -> -	case happyOut78 happy_x_3 of { happy_var_3 -> -	happyIn79-		 (happy_var_3 : happy_var_1-	)}}--happyReduce_199 = happyMonadReduce 1# 65# happyReduction_199-happyReduction_199 (happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOut90 happy_x_1 of { happy_var_1 -> -	( mkTParam happy_var_1 Nothing)}-	) (\r -> happyReturn (happyIn80 r))--happyReduce_200 = happyMonadReduce 5# 65# happyReduction_200-happyReduction_200 (happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym ParenL  ) _)) -> -	case happyOut90 happy_x_2 of { happy_var_2 -> -	case happyOut77 happy_x_4 of { happy_var_4 -> -	case happyOutTok happy_x_5 of { (Located happy_var_5 (Token (Sym ParenR  ) _)) -> -	( mkTParam (at (happy_var_1,happy_var_5) happy_var_2) (Just (thing happy_var_4)))}}}}-	) (\r -> happyReturn (happyIn80 r))--happyReduce_201 = happySpecReduce_1  66# happyReduction_201-happyReduction_201 happy_x_1-	 =  case happyOut80 happy_x_1 of { happy_var_1 -> -	happyIn81-		 ([happy_var_1]-	)}--happyReduce_202 = happySpecReduce_2  66# happyReduction_202-happyReduction_202 happy_x_2-	happy_x_1-	 =  case happyOut81 happy_x_1 of { happy_var_1 -> -	case happyOut80 happy_x_2 of { happy_var_2 -> -	happyIn81-		 (happy_var_2 : happy_var_1-	)}}--happyReduce_203 = happySpecReduce_3  67# happyReduction_203-happyReduction_203 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut83 happy_x_1 of { happy_var_1 -> -	case happyOut82 happy_x_3 of { happy_var_3 -> -	happyIn82-		 (at (happy_var_1,happy_var_3) $ TFun happy_var_1 happy_var_3-	)}}--happyReduce_204 = happySpecReduce_3  67# happyReduction_204-happyReduction_204 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut82 happy_x_1 of { happy_var_1 -> -	case happyOut53 happy_x_2 of { happy_var_2 -> -	case happyOut83 happy_x_3 of { happy_var_3 -> -	happyIn82-		 (at (happy_var_1,happy_var_3) $ TInfix happy_var_1 happy_var_2 defaultFixity happy_var_3-	)}}}--happyReduce_205 = happySpecReduce_1  67# happyReduction_205-happyReduction_205 happy_x_1-	 =  case happyOut83 happy_x_1 of { happy_var_1 -> -	happyIn82-		 (happy_var_1-	)}--happyReduce_206 = happySpecReduce_2  68# happyReduction_206-happyReduction_206 happy_x_2-	happy_x_1-	 =  case happyOut86 happy_x_1 of { happy_var_1 -> -	case happyOut84 happy_x_2 of { happy_var_2 -> -	happyIn83-		 (at (happy_var_1,happy_var_2) $ foldr TSeq happy_var_2 (reverse (thing happy_var_1))-	)}}--happyReduce_207 = happySpecReduce_2  68# happyReduction_207-happyReduction_207 happy_x_2-	happy_x_1-	 =  case happyOut93 happy_x_1 of { happy_var_1 -> -	case happyOut85 happy_x_2 of { happy_var_2 -> -	happyIn83-		 (at (happy_var_1,head happy_var_2)-                                     $ TUser (thing happy_var_1) (reverse happy_var_2)-	)}}--happyReduce_208 = happySpecReduce_1  68# happyReduction_208-happyReduction_208 happy_x_1-	 =  case happyOut84 happy_x_1 of { happy_var_1 -> -	happyIn83-		 (happy_var_1-	)}--happyReduce_209 = happySpecReduce_1  69# happyReduction_209-happyReduction_209 happy_x_1-	 =  case happyOut93 happy_x_1 of { happy_var_1 -> -	happyIn84-		 (at happy_var_1 $ TUser (thing happy_var_1) []-	)}--happyReduce_210 = happySpecReduce_1  69# happyReduction_210-happyReduction_210 happy_x_1-	 =  case happyOutTok happy_x_1 of { (happy_var_1@(Located _ (Token (Num   {}) _))) -> -	happyIn84-		 (at happy_var_1 $ TNum  (getNum happy_var_1)-	)}--happyReduce_211 = happySpecReduce_1  69# happyReduction_211-happyReduction_211 happy_x_1-	 =  case happyOutTok happy_x_1 of { (happy_var_1@(Located _ (Token (ChrLit {}) _))) -> -	happyIn84-		 (at happy_var_1 $ TChar (toEnum $ fromInteger-                                                          $ getNum happy_var_1)-	)}--happyReduce_212 = happySpecReduce_3  69# happyReduction_212-happyReduction_212 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym BracketL) _)) -> -	case happyOut82 happy_x_2 of { happy_var_2 -> -	case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym BracketR) _)) -> -	happyIn84-		 (at (happy_var_1,happy_var_3) $ TSeq happy_var_2 TBit-	)}}}--happyReduce_213 = happySpecReduce_3  69# happyReduction_213-happyReduction_213 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym ParenL  ) _)) -> -	case happyOut82 happy_x_2 of { happy_var_2 -> -	case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym ParenR  ) _)) -> -	happyIn84-		 (at (happy_var_1,happy_var_3) $ TParens happy_var_2-	)}}}--happyReduce_214 = happySpecReduce_2  69# happyReduction_214-happyReduction_214 happy_x_2-	happy_x_1-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym ParenL  ) _)) -> -	case happyOutTok happy_x_2 of { (Located happy_var_2 (Token (Sym ParenR  ) _)) -> -	happyIn84-		 (at (happy_var_1,happy_var_2) $ TTuple []-	)}}--happyReduce_215 = happySpecReduce_3  69# happyReduction_215-happyReduction_215 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym ParenL  ) _)) -> -	case happyOut87 happy_x_2 of { happy_var_2 -> -	case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym ParenR  ) _)) -> -	happyIn84-		 (at (happy_var_1,happy_var_3) $ TTuple  (reverse happy_var_2)-	)}}}--happyReduce_216 = happySpecReduce_2  69# happyReduction_216-happyReduction_216 happy_x_2-	happy_x_1-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym CurlyL  ) _)) -> -	case happyOutTok happy_x_2 of { (Located happy_var_2 (Token (Sym CurlyR  ) _)) -> -	happyIn84-		 (at (happy_var_1,happy_var_2) $ TRecord []-	)}}--happyReduce_217 = happySpecReduce_3  69# happyReduction_217-happyReduction_217 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym CurlyL  ) _)) -> -	case happyOut89 happy_x_2 of { happy_var_2 -> -	case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym CurlyR  ) _)) -> -	happyIn84-		 (at (happy_var_1,happy_var_3) $ TRecord (reverse happy_var_2)-	)}}}--happyReduce_218 = happySpecReduce_1  69# happyReduction_218-happyReduction_218 happy_x_1-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym Underscore ) _)) -> -	happyIn84-		 (at happy_var_1 TWild-	)}--happyReduce_219 = happySpecReduce_1  70# happyReduction_219-happyReduction_219 happy_x_1-	 =  case happyOut84 happy_x_1 of { happy_var_1 -> -	happyIn85-		 ([ happy_var_1 ]-	)}--happyReduce_220 = happySpecReduce_2  70# happyReduction_220-happyReduction_220 happy_x_2-	happy_x_1-	 =  case happyOut85 happy_x_1 of { happy_var_1 -> -	case happyOut84 happy_x_2 of { happy_var_2 -> -	happyIn85-		 (happy_var_2 : happy_var_1-	)}}--happyReduce_221 = happySpecReduce_3  71# happyReduction_221-happyReduction_221 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym BracketL) _)) -> -	case happyOut82 happy_x_2 of { happy_var_2 -> -	case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym BracketR) _)) -> -	happyIn86-		 (Located (rComb happy_var_1 happy_var_3) [ happy_var_2 ]-	)}}}--happyReduce_222 = happyReduce 4# 71# happyReduction_222-happyReduction_222 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut86 happy_x_1 of { happy_var_1 -> -	case happyOut82 happy_x_3 of { happy_var_3 -> -	case happyOutTok happy_x_4 of { (Located happy_var_4 (Token (Sym BracketR) _)) -> -	happyIn86-		 (at (happy_var_1,happy_var_4) (fmap (happy_var_3 :) happy_var_1)-	) `HappyStk` happyRest}}}--happyReduce_223 = happySpecReduce_3  72# happyReduction_223-happyReduction_223 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut82 happy_x_1 of { happy_var_1 -> -	case happyOut82 happy_x_3 of { happy_var_3 -> -	happyIn87-		 ([ happy_var_3, happy_var_1]-	)}}--happyReduce_224 = happySpecReduce_3  72# happyReduction_224-happyReduction_224 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut87 happy_x_1 of { happy_var_1 -> -	case happyOut82 happy_x_3 of { happy_var_3 -> -	happyIn87-		 (happy_var_3 : happy_var_1-	)}}--happyReduce_225 = happySpecReduce_3  73# happyReduction_225-happyReduction_225 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut90 happy_x_1 of { happy_var_1 -> -	case happyOut82 happy_x_3 of { happy_var_3 -> -	happyIn88-		 (Named { name = happy_var_1, value = happy_var_3 }-	)}}--happyReduce_226 = happySpecReduce_1  74# happyReduction_226-happyReduction_226 happy_x_1-	 =  case happyOut88 happy_x_1 of { happy_var_1 -> -	happyIn89-		 ([happy_var_1]-	)}--happyReduce_227 = happySpecReduce_3  74# happyReduction_227-happyReduction_227 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut89 happy_x_1 of { happy_var_1 -> -	case happyOut88 happy_x_3 of { happy_var_3 -> -	happyIn89-		 (happy_var_3 : happy_var_1-	)}}--happyReduce_228 = happySpecReduce_1  75# happyReduction_228-happyReduction_228 happy_x_1-	 =  case happyOutTok happy_x_1 of { (happy_var_1@(Located _ (Token (Ident [] _) _))) -> -	happyIn90-		 (let Token (Ident _ str) _ = thing happy_var_1-                         in happy_var_1 { thing = mkIdent (T.toStrict str) }-	)}--happyReduce_229 = happySpecReduce_1  75# happyReduction_229-happyReduction_229 happy_x_1-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (KW KW_x)       _)) -> -	happyIn90-		 (Located { srcRange = happy_var_1, thing = mkIdent "x" }-	)}--happyReduce_230 = happySpecReduce_1  75# happyReduction_230-happyReduction_230 happy_x_1-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (KW KW_private)   _)) -> -	happyIn90-		 (Located { srcRange = happy_var_1, thing = mkIdent "private" }-	)}--happyReduce_231 = happySpecReduce_1  75# happyReduction_231-happyReduction_231 happy_x_1-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (KW KW_as)        _)) -> -	happyIn90-		 (Located { srcRange = happy_var_1, thing = mkIdent "as" }-	)}--happyReduce_232 = happySpecReduce_1  75# happyReduction_232-happyReduction_232 happy_x_1-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (KW KW_hiding)    _)) -> -	happyIn90-		 (Located { srcRange = happy_var_1, thing = mkIdent "hiding" }-	)}--happyReduce_233 = happySpecReduce_1  76# happyReduction_233-happyReduction_233 happy_x_1-	 =  case happyOut90 happy_x_1 of { happy_var_1 -> -	happyIn91-		 (fmap mkUnqual happy_var_1-	)}--happyReduce_234 = happySpecReduce_1  77# happyReduction_234-happyReduction_234 happy_x_1-	 =  case happyOut90 happy_x_1 of { happy_var_1 -> -	happyIn92-		 (fmap identText happy_var_1-	)}--happyReduce_235 = happySpecReduce_1  77# happyReduction_235-happyReduction_235 happy_x_1-	 =  case happyOutTok happy_x_1 of { (happy_var_1@(Located _ (Token  Ident{}     _))) -> -	happyIn92-		 (let Token (Ident ns i) _ = thing happy_var_1-                                     in mkModName (ns ++ [i]) A.<$ happy_var_1-	)}--happyReduce_236 = happySpecReduce_1  78# happyReduction_236-happyReduction_236 happy_x_1-	 =  case happyOut91 happy_x_1 of { happy_var_1 -> -	happyIn93-		 (happy_var_1-	)}--happyReduce_237 = happySpecReduce_1  78# happyReduction_237-happyReduction_237 happy_x_1-	 =  case happyOutTok happy_x_1 of { (happy_var_1@(Located _ (Token  Ident{}     _))) -> -	happyIn93-		 (let Token (Ident ns i) _ = thing happy_var_1-                                     in mkQual (mkModName ns) (mkIdent (T.toStrict i)) A.<$ happy_var_1-	)}--happyReduce_238 = happySpecReduce_1  79# happyReduction_238-happyReduction_238 happy_x_1-	 =  case happyOut93 happy_x_1 of { happy_var_1 -> -	happyIn94-		 (happy_var_1-	)}--happyReduce_239 = happySpecReduce_1  79# happyReduction_239-happyReduction_239 happy_x_1-	 =  case happyOut52 happy_x_1 of { happy_var_1 -> -	happyIn94-		 (happy_var_1-	)}--happyReduce_240 = happySpecReduce_3  79# happyReduction_240-happyReduction_240 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut52 happy_x_2 of { happy_var_2 -> -	happyIn94-		 (happy_var_2-	)}--happyReduce_241 = happySpecReduce_1  80# happyReduction_241-happyReduction_241 happy_x_1-	 =  case happyOut93 happy_x_1 of { happy_var_1 -> -	happyIn95-		 (at happy_var_1 $ TUser (thing happy_var_1) []-	)}--happyReduce_242 = happySpecReduce_1  80# happyReduction_242-happyReduction_242 happy_x_1-	 =  case happyOutTok happy_x_1 of { (happy_var_1@(Located _ (Token (Num   {}) _))) -> -	happyIn95-		 (at happy_var_1 $ TNum  (getNum happy_var_1)-	)}--happyReduce_243 = happyMonadReduce 3# 80# happyReduction_243-happyReduction_243 (happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest) tk-	 = happyThen (case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym ParenL  ) _)) -> -	case happyOut82 happy_x_2 of { happy_var_2 -> -	case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym ParenR  ) _)) -> -	( validDemotedType (rComb happy_var_1 happy_var_3) happy_var_2)}}}-	) (\r -> happyReturn (happyIn95 r))--happyReduce_244 = happySpecReduce_2  80# happyReduction_244-happyReduction_244 happy_x_2-	happy_x_1-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym CurlyL  ) _)) -> -	case happyOutTok happy_x_2 of { (Located happy_var_2 (Token (Sym CurlyR  ) _)) -> -	happyIn95-		 (at (happy_var_1,happy_var_2) (TRecord [])-	)}}--happyReduce_245 = happySpecReduce_3  80# happyReduction_245-happyReduction_245 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym CurlyL  ) _)) -> -	case happyOut97 happy_x_2 of { happy_var_2 -> -	case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym CurlyR  ) _)) -> -	happyIn95-		 (at (happy_var_1,happy_var_3) (TRecord (reverse happy_var_2))-	)}}}--happyReduce_246 = happySpecReduce_3  80# happyReduction_246-happyReduction_246 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym CurlyL  ) _)) -> -	case happyOut82 happy_x_2 of { happy_var_2 -> -	case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym CurlyR  ) _)) -> -	happyIn95-		 (anonRecord (getLoc (happy_var_1,happy_var_3)) [happy_var_2]-	)}}}--happyReduce_247 = happySpecReduce_3  80# happyReduction_247-happyReduction_247 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym CurlyL  ) _)) -> -	case happyOut87 happy_x_2 of { happy_var_2 -> -	case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym CurlyR  ) _)) -> -	happyIn95-		 (anonRecord (getLoc (happy_var_1,happy_var_3)) (reverse happy_var_2)-	)}}}--happyReduce_248 = happySpecReduce_3  81# happyReduction_248-happyReduction_248 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut90 happy_x_1 of { happy_var_1 -> -	case happyOut82 happy_x_3 of { happy_var_3 -> -	happyIn96-		 (Named { name = happy_var_1, value = happy_var_3 }-	)}}--happyReduce_249 = happySpecReduce_1  82# happyReduction_249-happyReduction_249 happy_x_1-	 =  case happyOut96 happy_x_1 of { happy_var_1 -> -	happyIn97-		 ([happy_var_1]-	)}--happyReduce_250 = happySpecReduce_3  82# happyReduction_250-happyReduction_250 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut97 happy_x_1 of { happy_var_1 -> -	case happyOut96 happy_x_3 of { happy_var_3 -> -	happyIn97-		 (happy_var_3 : happy_var_1-	)}}--happyNewToken action sts stk-	= lexerP(\tk -> -	let cont i = happyDoAction i tk action sts stk in-	case tk of {-	Located _ (Token EOF _) -> happyDoAction 59# tk action sts stk;-	happy_dollar_dollar@(Located _ (Token (Num   {}) _)) -> cont 1#;-	happy_dollar_dollar@(Located _ (Token (StrLit {}) _)) -> cont 2#;-	happy_dollar_dollar@(Located _ (Token (ChrLit {}) _)) -> cont 3#;-	happy_dollar_dollar@(Located _ (Token (Ident [] _) _)) -> cont 4#;-	happy_dollar_dollar@(Located _ (Token  Ident{}     _)) -> cont 5#;-	Located happy_dollar_dollar (Token (KW KW_include)   _) -> cont 6#;-	Located happy_dollar_dollar (Token (KW KW_import)    _) -> cont 7#;-	Located happy_dollar_dollar (Token (KW KW_as)        _) -> cont 8#;-	Located happy_dollar_dollar (Token (KW KW_hiding)    _) -> cont 9#;-	Located happy_dollar_dollar (Token (KW KW_private)   _) -> cont 10#;-	Located happy_dollar_dollar (Token (KW KW_property)  _) -> cont 11#;-	Located happy_dollar_dollar (Token (KW KW_infix)     _) -> cont 12#;-	Located happy_dollar_dollar (Token (KW KW_infixl)    _) -> cont 13#;-	Located happy_dollar_dollar (Token (KW KW_infixr)    _) -> cont 14#;-	Located happy_dollar_dollar (Token (KW KW_type   ) _) -> cont 15#;-	Located happy_dollar_dollar (Token (KW KW_newtype) _) -> cont 16#;-	Located happy_dollar_dollar (Token (KW KW_module ) _) -> cont 17#;-	Located happy_dollar_dollar (Token (KW KW_where  ) _) -> cont 18#;-	Located happy_dollar_dollar (Token (KW KW_let    ) _) -> cont 19#;-	Located happy_dollar_dollar (Token (KW KW_if     ) _) -> cont 20#;-	Located happy_dollar_dollar (Token (KW KW_then   ) _) -> cont 21#;-	Located happy_dollar_dollar (Token (KW KW_else   ) _) -> cont 22#;-	Located happy_dollar_dollar (Token (KW KW_x)       _) -> cont 23#;-	Located happy_dollar_dollar (Token (KW KW_primitive) _) -> cont 24#;-	Located happy_dollar_dollar (Token (Sym BracketL) _) -> cont 25#;-	Located happy_dollar_dollar (Token (Sym BracketR) _) -> cont 26#;-	Located happy_dollar_dollar (Token (Sym ArrL    ) _) -> cont 27#;-	Located happy_dollar_dollar (Token (Sym DotDot  ) _) -> cont 28#;-	Located happy_dollar_dollar (Token (Sym DotDotDot) _) -> cont 29#;-	Located happy_dollar_dollar (Token (Sym Bar     ) _) -> cont 30#;-	Located happy_dollar_dollar (Token (Sym ParenL  ) _) -> cont 31#;-	Located happy_dollar_dollar (Token (Sym ParenR  ) _) -> cont 32#;-	Located happy_dollar_dollar (Token (Sym Comma   ) _) -> cont 33#;-	Located happy_dollar_dollar (Token (Sym Semi    ) _) -> cont 34#;-	Located happy_dollar_dollar (Token (Sym Dot     ) _) -> cont 35#;-	Located happy_dollar_dollar (Token (Sym CurlyL  ) _) -> cont 36#;-	Located happy_dollar_dollar (Token (Sym CurlyR  ) _) -> cont 37#;-	Located happy_dollar_dollar (Token (Sym TriL    ) _) -> cont 38#;-	Located happy_dollar_dollar (Token (Sym TriR    ) _) -> cont 39#;-	Located happy_dollar_dollar (Token (Sym EqDef   ) _) -> cont 40#;-	Located happy_dollar_dollar (Token (Sym BackTick) _) -> cont 41#;-	Located happy_dollar_dollar (Token (Sym Colon   ) _) -> cont 42#;-	Located happy_dollar_dollar (Token (Sym ArrR    ) _) -> cont 43#;-	Located happy_dollar_dollar (Token (Sym FatArrR ) _) -> cont 44#;-	Located happy_dollar_dollar (Token (Sym Lambda  ) _) -> cont 45#;-	Located happy_dollar_dollar (Token (Sym Underscore ) _) -> cont 46#;-	Located happy_dollar_dollar (Token (Virt VCurlyL)  _) -> cont 47#;-	Located happy_dollar_dollar (Token (Virt VCurlyR)  _) -> cont 48#;-	Located happy_dollar_dollar (Token (Virt VSemi)    _) -> cont 49#;-	Located happy_dollar_dollar (Token (Op Plus)  _) -> cont 50#;-	Located happy_dollar_dollar (Token (Op Mul)   _) -> cont 51#;-	Located happy_dollar_dollar (Token (Op Exp)   _) -> cont 52#;-	Located happy_dollar_dollar (Token (Op Minus) _) -> cont 53#;-	Located happy_dollar_dollar (Token (Op Complement) _) -> cont 54#;-	Located happy_dollar_dollar (Token (Op Hash) _) -> cont 55#;-	happy_dollar_dollar@(Located _ (Token (Op (Other [] _)) _)) -> cont 56#;-	happy_dollar_dollar@(Located _ (Token (Op  Other{}   )  _)) -> cont 57#;-	happy_dollar_dollar@(Located _ (Token (White DocStr) _)) -> cont 58#;-	_ -> happyError' tk-	})--happyError_ 59# tk = happyError' tk-happyError_ _ tk = happyError' tk--happyThen :: () => ParseM a -> (a -> ParseM b) -> ParseM b-happyThen = (>>=)-happyReturn :: () => a -> ParseM a-happyReturn = (return)-happyThen1 = happyThen-happyReturn1 :: () => a -> ParseM a-happyReturn1 = happyReturn-happyError' :: () => (Located Token) -> ParseM a-happyError' tk = (\token -> happyError) tk--vmodule = happySomeParser where-  happySomeParser = happyThen (happyParse 0#) (\x -> happyReturn (happyOut15 x))--program = happySomeParser where-  happySomeParser = happyThen (happyParse 1#) (\x -> happyReturn (happyOut23 x))--programLayout = happySomeParser where-  happySomeParser = happyThen (happyParse 2#) (\x -> happyReturn (happyOut24 x))--expr = happySomeParser where-  happySomeParser = happyThen (happyParse 3#) (\x -> happyReturn (happyOut45 x))--decl = happySomeParser where-  happySomeParser = happyThen (happyParse 4#) (\x -> happyReturn (happyOut33 x))--decls = happySomeParser where-  happySomeParser = happyThen (happyParse 5#) (\x -> happyReturn (happyOut41 x))--declsLayout = happySomeParser where-  happySomeParser = happyThen (happyParse 6#) (\x -> happyReturn (happyOut43 x))--letDecl = happySomeParser where-  happySomeParser = happyThen (happyParse 7#) (\x -> happyReturn (happyOut34 x))--repl = happySomeParser where-  happySomeParser = happyThen (happyParse 8#) (\x -> happyReturn (happyOut44 x))--schema = happySomeParser where-  happySomeParser = happyThen (happyParse 9#) (\x -> happyReturn (happyOut74 x))--modName = happySomeParser where-  happySomeParser = happyThen (happyParse 10#) (\x -> happyReturn (happyOut92 x))--helpName = happySomeParser where-  happySomeParser = happyThen (happyParse 11#) (\x -> happyReturn (happyOut94 x))--happySeq = happyDontSeq---parseModName :: String -> Maybe ModName-parseModName txt =-  case parseString defaultConfig { cfgModuleScope = False } modName txt of-    Right a -> Just (thing a)-    Left _  -> Nothing--parseHelpName :: String -> Maybe PName-parseHelpName txt =-  case parseString defaultConfig { cfgModuleScope = False } helpName txt of-    Right a -> Just (thing a)-    Left _  -> Nothing--addImplicitIncludes :: Config -> Program PName -> Program PName-addImplicitIncludes cfg (Program ds) =-  Program $ map path (cfgAutoInclude cfg) ++ ds-  where path p = Include Located { srcRange = rng, thing = p }-        rng    = Range { source = cfgSource cfg, from = start, to = start }---parseProgramWith :: Config -> Text -> Either ParseError (Program PName)-parseProgramWith cfg s = case res s of-                          Left err -> Left err-                          Right a  -> Right (addImplicitIncludes cfg a)-  where-  res = parse cfg $ case cfgLayout cfg of-                      Layout   -> programLayout-                      NoLayout -> program--parseModule :: Config -> Text -> Either ParseError (Module PName)-parseModule cfg = parse cfg { cfgModuleScope = True } vmodule--parseProgram :: Layout -> Text -> Either ParseError (Program PName)-parseProgram l = parseProgramWith defaultConfig { cfgLayout = l }--parseExprWith :: Config -> Text -> Either ParseError (Expr PName)-parseExprWith cfg = parse cfg { cfgModuleScope = False } expr--parseExpr :: Text -> Either ParseError (Expr PName)-parseExpr = parseExprWith defaultConfig--parseDeclWith :: Config -> Text -> Either ParseError (Decl PName)-parseDeclWith cfg = parse cfg { cfgModuleScope = False } decl--parseDecl :: Text -> Either ParseError (Decl PName)-parseDecl = parseDeclWith defaultConfig--parseDeclsWith :: Config -> Text -> Either ParseError [Decl PName]-parseDeclsWith cfg = parse cfg { cfgModuleScope = ms } decls'-  where (ms, decls') = case cfgLayout cfg of-                         Layout   -> (True, declsLayout)-                         NoLayout -> (False, decls)--parseDecls :: Text -> Either ParseError [Decl PName]-parseDecls = parseDeclsWith defaultConfig--parseLetDeclWith :: Config -> Text -> Either ParseError (Decl PName)-parseLetDeclWith cfg = parse cfg { cfgModuleScope = False } letDecl--parseLetDecl :: Text -> Either ParseError (Decl PName)-parseLetDecl = parseLetDeclWith defaultConfig--parseReplWith :: Config -> Text -> Either ParseError (ReplInput PName)-parseReplWith cfg = parse cfg { cfgModuleScope = False } repl--parseRepl :: Text -> Either ParseError (ReplInput PName)-parseRepl = parseReplWith defaultConfig--parseSchemaWith :: Config -> Text -> Either ParseError (Schema PName)-parseSchemaWith cfg = parse cfg { cfgModuleScope = False } schema--parseSchema :: Text -> Either ParseError (Schema PName)-parseSchema = parseSchemaWith defaultConfig---- vim: ft=haskell-{-# LINE 1 "templates/GenericTemplate.hs" #-}-{-# LINE 1 "templates/GenericTemplate.hs" #-}-{-# LINE 1 "<built-in>" #-}-{-# LINE 19 "<built-in>" #-}-{-# LINE 1 "/usr/local/Cellar/ghc/7.10.3b/lib/ghc-7.10.3/include/ghcversion.h" #-}-------------------{-# LINE 20 "<built-in>" #-}+newtype HappyAbsSyn t70 = HappyAbsSyn HappyAny+#if __GLASGOW_HASKELL__ >= 607+type HappyAny = Happy_GHC_Exts.Any+#else+type HappyAny = forall a . a+#endif+happyIn15 :: (Module PName) -> (HappyAbsSyn t70)+happyIn15 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn15 #-}+happyOut15 :: (HappyAbsSyn t70) -> (Module PName)+happyOut15 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut15 #-}+happyIn16 :: (([Located Import], [TopDecl PName])) -> (HappyAbsSyn t70)+happyIn16 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn16 #-}+happyOut16 :: (HappyAbsSyn t70) -> (([Located Import], [TopDecl PName]))+happyOut16 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut16 #-}+happyIn17 :: ([Located Import]) -> (HappyAbsSyn t70)+happyIn17 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn17 #-}+happyOut17 :: (HappyAbsSyn t70) -> ([Located Import])+happyOut17 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut17 #-}+happyIn18 :: (Located Import) -> (HappyAbsSyn t70)+happyIn18 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn18 #-}+happyOut18 :: (HappyAbsSyn t70) -> (Located Import)+happyOut18 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut18 #-}+happyIn19 :: (Maybe (Located ModName)) -> (HappyAbsSyn t70)+happyIn19 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn19 #-}+happyOut19 :: (HappyAbsSyn t70) -> (Maybe (Located ModName))+happyOut19 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut19 #-}+happyIn20 :: (Maybe (Located ImportSpec)) -> (HappyAbsSyn t70)+happyIn20 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn20 #-}+happyOut20 :: (HappyAbsSyn t70) -> (Maybe (Located ImportSpec))+happyOut20 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut20 #-}+happyIn21 :: ([LIdent]) -> (HappyAbsSyn t70)+happyIn21 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn21 #-}+happyOut21 :: (HappyAbsSyn t70) -> ([LIdent])+happyOut21 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut21 #-}+happyIn22 :: ([Ident] -> ImportSpec) -> (HappyAbsSyn t70)+happyIn22 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn22 #-}+happyOut22 :: (HappyAbsSyn t70) -> ([Ident] -> ImportSpec)+happyOut22 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut22 #-}+happyIn23 :: (Program PName) -> (HappyAbsSyn t70)+happyIn23 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn23 #-}+happyOut23 :: (HappyAbsSyn t70) -> (Program PName)+happyOut23 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut23 #-}+happyIn24 :: (Program PName) -> (HappyAbsSyn t70)+happyIn24 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn24 #-}+happyOut24 :: (HappyAbsSyn t70) -> (Program PName)+happyOut24 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut24 #-}+happyIn25 :: ([TopDecl PName]) -> (HappyAbsSyn t70)+happyIn25 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn25 #-}+happyOut25 :: (HappyAbsSyn t70) -> ([TopDecl PName])+happyOut25 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut25 #-}+happyIn26 :: ([TopDecl PName]) -> (HappyAbsSyn t70)+happyIn26 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn26 #-}+happyOut26 :: (HappyAbsSyn t70) -> ([TopDecl PName])+happyOut26 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut26 #-}+happyIn27 :: ([TopDecl PName]) -> (HappyAbsSyn t70)+happyIn27 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn27 #-}+happyOut27 :: (HappyAbsSyn t70) -> ([TopDecl PName])+happyOut27 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut27 #-}+happyIn28 :: ([TopDecl PName]) -> (HappyAbsSyn t70)+happyIn28 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn28 #-}+happyOut28 :: (HappyAbsSyn t70) -> ([TopDecl PName])+happyOut28 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut28 #-}+happyIn29 :: ([TopDecl PName]) -> (HappyAbsSyn t70)+happyIn29 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn29 #-}+happyOut29 :: (HappyAbsSyn t70) -> ([TopDecl PName])+happyOut29 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut29 #-}+happyIn30 :: ([TopDecl PName]) -> (HappyAbsSyn t70)+happyIn30 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn30 #-}+happyOut30 :: (HappyAbsSyn t70) -> ([TopDecl PName])+happyOut30 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut30 #-}+happyIn31 :: (Located String) -> (HappyAbsSyn t70)+happyIn31 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn31 #-}+happyOut31 :: (HappyAbsSyn t70) -> (Located String)+happyOut31 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut31 #-}+happyIn32 :: (Maybe (Located String)) -> (HappyAbsSyn t70)+happyIn32 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn32 #-}+happyOut32 :: (HappyAbsSyn t70) -> (Maybe (Located String))+happyOut32 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut32 #-}+happyIn33 :: (Decl PName) -> (HappyAbsSyn t70)+happyIn33 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn33 #-}+happyOut33 :: (HappyAbsSyn t70) -> (Decl PName)+happyOut33 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut33 #-}+happyIn34 :: (Decl PName) -> (HappyAbsSyn t70)+happyIn34 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn34 #-}+happyOut34 :: (HappyAbsSyn t70) -> (Decl PName)+happyOut34 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut34 #-}+happyIn35 :: (Newtype PName) -> (HappyAbsSyn t70)+happyIn35 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn35 #-}+happyOut35 :: (HappyAbsSyn t70) -> (Newtype PName)+happyOut35 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut35 #-}+happyIn36 :: ([Named (Type PName)]) -> (HappyAbsSyn t70)+happyIn36 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn36 #-}+happyOut36 :: (HappyAbsSyn t70) -> ([Named (Type PName)])+happyOut36 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut36 #-}+happyIn37 :: ([ LPName ]) -> (HappyAbsSyn t70)+happyIn37 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn37 #-}+happyOut37 :: (HappyAbsSyn t70) -> ([ LPName ])+happyOut37 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut37 #-}+happyIn38 :: (LPName) -> (HappyAbsSyn t70)+happyIn38 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn38 #-}+happyOut38 :: (HappyAbsSyn t70) -> (LPName)+happyOut38 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut38 #-}+happyIn39 :: ([Pattern PName]) -> (HappyAbsSyn t70)+happyIn39 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn39 #-}+happyOut39 :: (HappyAbsSyn t70) -> ([Pattern PName])+happyOut39 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut39 #-}+happyIn40 :: ([Pattern PName]) -> (HappyAbsSyn t70)+happyIn40 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn40 #-}+happyOut40 :: (HappyAbsSyn t70) -> ([Pattern PName])+happyOut40 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut40 #-}+happyIn41 :: ([Decl PName]) -> (HappyAbsSyn t70)+happyIn41 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn41 #-}+happyOut41 :: (HappyAbsSyn t70) -> ([Decl PName])+happyOut41 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut41 #-}+happyIn42 :: ([Decl PName]) -> (HappyAbsSyn t70)+happyIn42 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn42 #-}+happyOut42 :: (HappyAbsSyn t70) -> ([Decl PName])+happyOut42 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut42 #-}+happyIn43 :: ([Decl PName]) -> (HappyAbsSyn t70)+happyIn43 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn43 #-}+happyOut43 :: (HappyAbsSyn t70) -> ([Decl PName])+happyOut43 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut43 #-}+happyIn44 :: (ReplInput PName) -> (HappyAbsSyn t70)+happyIn44 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn44 #-}+happyOut44 :: (HappyAbsSyn t70) -> (ReplInput PName)+happyOut44 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut44 #-}+happyIn45 :: (Expr PName) -> (HappyAbsSyn t70)+happyIn45 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn45 #-}+happyOut45 :: (HappyAbsSyn t70) -> (Expr PName)+happyOut45 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut45 #-}+happyIn46 :: ([(Expr PName, Expr PName)]) -> (HappyAbsSyn t70)+happyIn46 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn46 #-}+happyOut46 :: (HappyAbsSyn t70) -> ([(Expr PName, Expr PName)])+happyOut46 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut46 #-}+happyIn47 :: ((Expr PName, Expr PName)) -> (HappyAbsSyn t70)+happyIn47 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn47 #-}+happyOut47 :: (HappyAbsSyn t70) -> ((Expr PName, Expr PName))+happyOut47 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut47 #-}+happyIn48 :: (Expr PName) -> (HappyAbsSyn t70)+happyIn48 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn48 #-}+happyOut48 :: (HappyAbsSyn t70) -> (Expr PName)+happyOut48 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut48 #-}+happyIn49 :: (Expr PName) -> (HappyAbsSyn t70)+happyIn49 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn49 #-}+happyOut49 :: (HappyAbsSyn t70) -> (Expr PName)+happyOut49 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut49 #-}+happyIn50 :: (Expr PName) -> (HappyAbsSyn t70)+happyIn50 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn50 #-}+happyOut50 :: (HappyAbsSyn t70) -> (Expr PName)+happyOut50 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut50 #-}+happyIn51 :: (Expr PName) -> (HappyAbsSyn t70)+happyIn51 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn51 #-}+happyOut51 :: (HappyAbsSyn t70) -> (Expr PName)+happyOut51 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut51 #-}+happyIn52 :: (LPName) -> (HappyAbsSyn t70)+happyIn52 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn52 #-}+happyOut52 :: (HappyAbsSyn t70) -> (LPName)+happyOut52 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut52 #-}+happyIn53 :: (LPName) -> (HappyAbsSyn t70)+happyIn53 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn53 #-}+happyOut53 :: (HappyAbsSyn t70) -> (LPName)+happyOut53 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut53 #-}+happyIn54 :: (LPName) -> (HappyAbsSyn t70)+happyIn54 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn54 #-}+happyOut54 :: (HappyAbsSyn t70) -> (LPName)+happyOut54 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut54 #-}+happyIn55 :: (LPName) -> (HappyAbsSyn t70)+happyIn55 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn55 #-}+happyOut55 :: (HappyAbsSyn t70) -> (LPName)+happyOut55 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut55 #-}+happyIn56 :: ([LPName]) -> (HappyAbsSyn t70)+happyIn56 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn56 #-}+happyOut56 :: (HappyAbsSyn t70) -> ([LPName])+happyOut56 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut56 #-}+happyIn57 :: ([Expr PName]) -> (HappyAbsSyn t70)+happyIn57 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn57 #-}+happyOut57 :: (HappyAbsSyn t70) -> ([Expr PName])+happyOut57 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut57 #-}+happyIn58 :: (Expr PName) -> (HappyAbsSyn t70)+happyIn58 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn58 #-}+happyOut58 :: (HappyAbsSyn t70) -> (Expr PName)+happyOut58 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut58 #-}+happyIn59 :: ([(Bool, Integer)]) -> (HappyAbsSyn t70)+happyIn59 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn59 #-}+happyOut59 :: (HappyAbsSyn t70) -> ([(Bool, Integer)])+happyOut59 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut59 #-}+happyIn60 :: ((Bool, Integer)) -> (HappyAbsSyn t70)+happyIn60 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn60 #-}+happyOut60 :: (HappyAbsSyn t70) -> ((Bool, Integer))+happyOut60 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut60 #-}+happyIn61 :: (Located Selector) -> (HappyAbsSyn t70)+happyIn61 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn61 #-}+happyOut61 :: (HappyAbsSyn t70) -> (Located Selector)+happyOut61 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut61 #-}+happyIn62 :: ([Expr PName]) -> (HappyAbsSyn t70)+happyIn62 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn62 #-}+happyOut62 :: (HappyAbsSyn t70) -> ([Expr PName])+happyOut62 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut62 #-}+happyIn63 :: (Named (Expr PName)) -> (HappyAbsSyn t70)+happyIn63 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn63 #-}+happyOut63 :: (HappyAbsSyn t70) -> (Named (Expr PName))+happyOut63 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut63 #-}+happyIn64 :: ([Named (Expr PName)]) -> (HappyAbsSyn t70)+happyIn64 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn64 #-}+happyOut64 :: (HappyAbsSyn t70) -> ([Named (Expr PName)])+happyOut64 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut64 #-}+happyIn65 :: (Expr PName) -> (HappyAbsSyn t70)+happyIn65 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn65 #-}+happyOut65 :: (HappyAbsSyn t70) -> (Expr PName)+happyOut65 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut65 #-}+happyIn66 :: ([[Match PName]]) -> (HappyAbsSyn t70)+happyIn66 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn66 #-}+happyOut66 :: (HappyAbsSyn t70) -> ([[Match PName]])+happyOut66 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut66 #-}+happyIn67 :: ([Match PName]) -> (HappyAbsSyn t70)+happyIn67 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn67 #-}+happyOut67 :: (HappyAbsSyn t70) -> ([Match PName])+happyOut67 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut67 #-}+happyIn68 :: (Match PName) -> (HappyAbsSyn t70)+happyIn68 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn68 #-}+happyOut68 :: (HappyAbsSyn t70) -> (Match PName)+happyOut68 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut68 #-}+happyIn69 :: (Pattern PName) -> (HappyAbsSyn t70)+happyIn69 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn69 #-}+happyOut69 :: (HappyAbsSyn t70) -> (Pattern PName)+happyOut69 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut69 #-}+happyIn70 :: t70 -> (HappyAbsSyn t70)+happyIn70 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn70 #-}+happyOut70 :: (HappyAbsSyn t70) -> t70+happyOut70 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut70 #-}+happyIn71 :: (Pattern PName) -> (HappyAbsSyn t70)+happyIn71 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn71 #-}+happyOut71 :: (HappyAbsSyn t70) -> (Pattern PName)+happyOut71 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut71 #-}+happyIn72 :: ([Pattern PName]) -> (HappyAbsSyn t70)+happyIn72 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn72 #-}+happyOut72 :: (HappyAbsSyn t70) -> ([Pattern PName])+happyOut72 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut72 #-}+happyIn73 :: (Named (Pattern PName)) -> (HappyAbsSyn t70)+happyIn73 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn73 #-}+happyOut73 :: (HappyAbsSyn t70) -> (Named (Pattern PName))+happyOut73 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut73 #-}+happyIn74 :: ([Named (Pattern PName)]) -> (HappyAbsSyn t70)+happyIn74 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn74 #-}+happyOut74 :: (HappyAbsSyn t70) -> ([Named (Pattern PName)])+happyOut74 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut74 #-}+happyIn75 :: (Schema PName) -> (HappyAbsSyn t70)+happyIn75 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn75 #-}+happyOut75 :: (HappyAbsSyn t70) -> (Schema PName)+happyOut75 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut75 #-}+happyIn76 :: (Located [TParam PName]) -> (HappyAbsSyn t70)+happyIn76 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn76 #-}+happyOut76 :: (HappyAbsSyn t70) -> (Located [TParam PName])+happyOut76 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut76 #-}+happyIn77 :: (Located [Prop PName]) -> (HappyAbsSyn t70)+happyIn77 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn77 #-}+happyOut77 :: (HappyAbsSyn t70) -> (Located [Prop PName])+happyOut77 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut77 #-}+happyIn78 :: (Located Kind) -> (HappyAbsSyn t70)+happyIn78 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn78 #-}+happyOut78 :: (HappyAbsSyn t70) -> (Located Kind)+happyOut78 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut78 #-}+happyIn79 :: (TParam PName) -> (HappyAbsSyn t70)+happyIn79 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn79 #-}+happyOut79 :: (HappyAbsSyn t70) -> (TParam PName)+happyOut79 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut79 #-}+happyIn80 :: ([TParam PName]) -> (HappyAbsSyn t70)+happyIn80 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn80 #-}+happyOut80 :: (HappyAbsSyn t70) -> ([TParam PName])+happyOut80 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut80 #-}+happyIn81 :: (TParam PName) -> (HappyAbsSyn t70)+happyIn81 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn81 #-}+happyOut81 :: (HappyAbsSyn t70) -> (TParam PName)+happyOut81 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut81 #-}+happyIn82 :: ([TParam PName]) -> (HappyAbsSyn t70)+happyIn82 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn82 #-}+happyOut82 :: (HappyAbsSyn t70) -> ([TParam PName])+happyOut82 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut82 #-}+happyIn83 :: (Type PName) -> (HappyAbsSyn t70)+happyIn83 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn83 #-}+happyOut83 :: (HappyAbsSyn t70) -> (Type PName)+happyOut83 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut83 #-}+happyIn84 :: (Type PName) -> (HappyAbsSyn t70)+happyIn84 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn84 #-}+happyOut84 :: (HappyAbsSyn t70) -> (Type PName)+happyOut84 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut84 #-}+happyIn85 :: (Type PName) -> (HappyAbsSyn t70)+happyIn85 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn85 #-}+happyOut85 :: (HappyAbsSyn t70) -> (Type PName)+happyOut85 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut85 #-}+happyIn86 :: ([ Type PName ]) -> (HappyAbsSyn t70)+happyIn86 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn86 #-}+happyOut86 :: (HappyAbsSyn t70) -> ([ Type PName ])+happyOut86 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut86 #-}+happyIn87 :: (Located [Type PName]) -> (HappyAbsSyn t70)+happyIn87 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn87 #-}+happyOut87 :: (HappyAbsSyn t70) -> (Located [Type PName])+happyOut87 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut87 #-}+happyIn88 :: ([Type PName]) -> (HappyAbsSyn t70)+happyIn88 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn88 #-}+happyOut88 :: (HappyAbsSyn t70) -> ([Type PName])+happyOut88 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut88 #-}+happyIn89 :: (Named (Type PName)) -> (HappyAbsSyn t70)+happyIn89 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn89 #-}+happyOut89 :: (HappyAbsSyn t70) -> (Named (Type PName))+happyOut89 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut89 #-}+happyIn90 :: ([Named (Type PName)]) -> (HappyAbsSyn t70)+happyIn90 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn90 #-}+happyOut90 :: (HappyAbsSyn t70) -> ([Named (Type PName)])+happyOut90 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut90 #-}+happyIn91 :: (Located Ident) -> (HappyAbsSyn t70)+happyIn91 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn91 #-}+happyOut91 :: (HappyAbsSyn t70) -> (Located Ident)+happyOut91 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut91 #-}+happyIn92 :: (LPName) -> (HappyAbsSyn t70)+happyIn92 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn92 #-}+happyOut92 :: (HappyAbsSyn t70) -> (LPName)+happyOut92 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut92 #-}+happyIn93 :: (Located ModName) -> (HappyAbsSyn t70)+happyIn93 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn93 #-}+happyOut93 :: (HappyAbsSyn t70) -> (Located ModName)+happyOut93 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut93 #-}+happyIn94 :: (Located PName) -> (HappyAbsSyn t70)+happyIn94 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn94 #-}+happyOut94 :: (HappyAbsSyn t70) -> (Located PName)+happyOut94 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut94 #-}+happyIn95 :: (Located PName) -> (HappyAbsSyn t70)+happyIn95 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn95 #-}+happyOut95 :: (HappyAbsSyn t70) -> (Located PName)+happyOut95 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut95 #-}+happyIn96 :: (Type PName) -> (HappyAbsSyn t70)+happyIn96 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn96 #-}+happyOut96 :: (HappyAbsSyn t70) -> (Type PName)+happyOut96 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut96 #-}+happyIn97 :: (Named (Type PName)) -> (HappyAbsSyn t70)+happyIn97 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn97 #-}+happyOut97 :: (HappyAbsSyn t70) -> (Named (Type PName))+happyOut97 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut97 #-}+happyIn98 :: ([Named (Type PName)]) -> (HappyAbsSyn t70)+happyIn98 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn98 #-}+happyOut98 :: (HappyAbsSyn t70) -> ([Named (Type PName)])+happyOut98 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut98 #-}+happyInTok :: (Located Token) -> (HappyAbsSyn t70)+happyInTok x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyInTok #-}+happyOutTok :: (HappyAbsSyn t70) -> (Located Token)+happyOutTok x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOutTok #-}+++happyActOffsets :: HappyAddr+happyActOffsets = HappyA# "\x08\x00\xad\x01\x7f\x03\xb5\x02\x83\x06\x83\x06\x7a\x03\x93\x03\x86\x02\xee\x05\xbf\x07\xf1\x02\x90\x03\xbf\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x65\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8c\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x65\x03\x00\x00\x65\x03\xd5\x05\xd5\x05\xc5\x07\x70\x03\x00\x00\xbc\x05\xa3\x05\x00\x00\x00\x00\x8a\x05\xc2\x04\x33\x07\x00\x00\x00\x00\x5d\x03\x72\x03\x00\x00\x00\x00\xb7\x07\x00\x00\x03\x07\x5f\x03\x00\x00\x00\x00\x00\x00\x00\x00\xd3\x06\xb5\x02\x57\x02\x63\x01\x1c\x07\x43\x00\x30\x07\xd3\x06\xce\x02\xce\x02\x40\x03\x40\x03\x16\x06\x53\x03\x22\x00\xd3\x06\xc1\x01\x2a\x01\x1d\x05\xb0\x07\x71\x03\x6b\x03\x69\x03\xc2\x07\xf4\x02\xfd\x02\xa1\x06\x00\x00\x2b\x03\xf3\xff\x2b\x03\x10\x02\x2b\x03\x99\x01\x41\x03\x00\x00\x00\x00\x43\x03\x00\x00\x58\x03\x00\x00\x1d\x03\xd5\x01\x23\x03\x19\x01\x00\x00\x05\x01\x00\x00\x00\x00\x00\x00\x6f\x06\x70\x01\x00\x00\xbf\x07\x20\x03\x00\x00\x93\x05\x00\x00\x22\x03\x35\x02\x00\x00\x70\x00\x00\x00\x2c\x02\x10\x03\x00\x00\x21\x03\xdf\x02\x3f\x00\x00\x00\xc0\x02\x00\x00\xbf\x06\x00\x00\xed\x01\x2e\x00\x00\x00\x2f\x05\x94\x08\x94\x08\x94\x08\xd3\x06\xb5\x02\xd3\x06\xf7\x02\x0f\x03\xd3\x06\x41\x02\x7a\x05\x71\x05\x00\x00\x00\x00\x14\x02\x00\x00\x00\x00\x00\x00\x01\x03\x00\x00\x00\x00\x00\x00\x58\x05\xa9\x04\x1f\x00\x00\x00\x00\x00\xfa\x02\x00\x00\x00\x00\x01\x02\xab\x06\x00\x00\x04\x02\xf2\x02\x94\x02\x00\x00\xce\x02\xce\x02\xf4\x01\xf6\x02\xfb\x02\x00\x00\xc0\x01\x4d\x00\x00\x00\xb8\x00\xd3\x06\xf6\x00\xee\x02\xce\x02\x58\x05\x00\x00\xdc\x01\x00\x00\xc5\x01\xe5\x02\x2a\x07\x43\x07\x90\x02\x00\x00\x80\x04\x32\x05\x00\x00\x3f\x05\x00\x00\x26\x05\x00\x00\x26\x05\x26\x05\x26\x05\x00\x00\x94\x08\x26\x05\xc5\x07\xec\x02\xf8\x02\xda\x02\x00\x00\x94\x08\x00\x00\x94\x08\x9e\x04\x8e\x02\x00\x00\xde\x06\xd8\x02\x00\x00\x00\x00\x26\x05\x00\x00\x26\x05\x4b\x02\xc2\x07\x00\x00\xc2\x07\x00\x00\x94\x08\x00\x00\x00\x00\x00\x00\x00\x00\xcb\x02\xb5\x02\xb5\x02\xb5\x02\xb5\x02\x00\x00\xb5\x02\xb5\x02\x00\x00\xd3\x06\xb5\x02\x00\x00\x00\x00\x00\x00\xb5\x02\xc8\x02\xb5\x02\xc2\x07\x00\x00\xeb\x02\x00\x00\x41\x00\x4f\x07\x7f\x01\xb2\x02\x00\x00\x6e\x01\x00\x00\x37\x07\xb5\x02\x5b\x06\x00\x00\x5b\x06\x00\x00\x00\x00\x00\x00\x94\x08\x59\x01\xb5\x02\x00\x00\x9e\x02\x9c\x02\xa5\x02\x00\x00\x8c\x02\x8c\x02\x8c\x02\x00\x00\x16\x05\x00\x00\xc2\x07\x26\x05\x00\x00\xd3\x06\x00\x00\xd3\x06\x00\x00\x26\x05\x00\x00\x83\x02\xd3\x06\xc2\x07\x00\x00\x47\x06\x02\x06\x24\x02\x00\x00\x24\x02\x00\x00\x7f\x02\x94\x08\x24\x02\x93\x02\x00\x00\x96\x02\xc2\x07\xac\x05\x00\x00\x64\x02\xe9\x01\xe9\x01\x00\x00\x00\x00\x23\x00\x00\x00\x23\x00\x24\x02\xfd\x04\x97\x06\x00\x00\x86\x00\x16\x03\x08\x02\x74\x02\x0d\x05\x00\x00\x00\x00\xa6\x01\x00\x00\x33\x06\x00\x00\x00\x00\x00\x00\xb5\x02\x94\x08\x00\x00\x00\x00\x94\x08\x5c\x02\x00\x00\xf4\x04\x94\x08\xb5\x02\x6a\x02\x4d\x02\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x07\x00\x00\xf4\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x51\x02\xb5\x02\x51\x02\x25\x02\x3f\x02\x1e\x02\x00\x00\x3b\x02\x19\x02\x19\x02\x19\x02\x00\x00\x00\x00\x19\x02\xb5\x02\x00\x00\x0b\x02\x00\x00\x00\x00\x94\x08\x00\x00\x00\x00\x94\x08\x94\x08\xf4\x04\x00\x00\xde\x06\xd5\x01\xe3\x01\x74\x00\x09\x02\xb5\x02\xd3\x06\xd3\x06\xb5\x02\x00\x00\x09\x02\x94\x08\xe1\x01\x00\x00\x00\x00\xa2\x01\x00\x00\x94\x08\x74\x00\xa2\x01\x00\x00\x00\x00\x00\x00\x85\x01\x00\x00\x00\x00\x00\x00\x8a\x01\x00\x00\x6c\x01\xb5\x02\xe4\x04\x7a\x01\x23\x01\x00\x00\x00\x00\x8d\x02\x7a\x01\x3a\x01\xb5\x02\xc2\x07\xdb\x04\x31\x01\x27\x01\x01\x01\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00\x47\x02\x00\x00\xff\x00\x00\x00\xef\x00\x00\x00\x00\x00\x00\x00\xc2\x07\x00\x00\x00\x00"#++happyGotoOffsets :: HappyAddr+happyGotoOffsets = HappyA# "\x04\x01\x6d\x00\xed\x00\x44\x04\x39\x01\x0f\x01\xd5\x00\xd9\x00\xe8\x00\x73\x07\x50\x02\x7b\x02\x00\x00\x37\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2b\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x03\x6e\x08\x18\x07\x00\x00\x00\x00\x71\x06\xa2\x02\x00\x00\x00\x00\x62\x08\xba\x07\x27\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa6\x06\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0b\x01\x3e\x03\x27\x03\x18\x03\x8c\x00\xd2\x01\xfa\x01\x5a\x02\x6e\x04\x6a\x04\x00\x00\x00\x00\xe6\x00\x00\x00\x00\x00\x72\x01\x32\x01\x00\x00\x99\x00\x00\x00\x00\x00\x00\x00\x00\x00\x74\x01\xdf\x05\xf7\x06\x34\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9e\x00\x00\x00\xbb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x13\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x28\x01\xd0\x00\x00\x00\x33\x02\x00\x00\x00\x00\x92\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc7\x05\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x01\x6e\x06\x5a\x06\x01\x06\x45\x01\x36\x04\xe2\x00\x00\x00\x00\x00\xe4\x00\x00\x00\xf0\xff\x66\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x56\x08\x9c\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x68\x03\x76\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x83\x00\xda\xff\x00\x00\x2c\x00\x4a\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x07\x00\x00\x00\x00\x44\x03\xaa\x06\x00\x00\x34\x03\x00\x00\x3e\x08\x00\x00\x32\x08\x26\x08\x97\x02\x00\x00\xaa\x06\x1a\x08\xaa\x06\x00\x00\x00\x00\x00\x00\x00\x00\xaa\x06\x00\x00\xaa\x06\xaa\x06\xaa\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0e\x08\x00\x00\x02\x08\x8f\x07\xf0\x01\x00\x00\xdc\xff\x00\x00\xaa\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2b\x04\x5c\x04\x4d\x03\x1d\x04\x00\x00\x0f\x04\x04\x04\x00\x00\x95\x05\xf6\x03\x00\x00\x00\x00\x00\x00\xe8\x03\x00\x00\xdd\x03\xfd\xff\x00\x00\x00\x00\x00\x00\x9c\x00\xaa\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xaa\x06\x51\x04\x26\x01\x00\x00\x16\x01\x00\x00\x00\x00\x00\x00\x21\x06\x00\x00\xcf\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x82\x00\x00\x00\x3b\x00\xf6\x07\x00\x00\x23\x06\x00\x00\x55\x04\x00\x00\xea\x07\x00\x00\x00\x00\xd4\x01\xcf\xff\x00\x00\xf4\xff\xde\x00\xd7\x00\x00\x00\xcb\x00\x00\x00\x00\x00\xa8\x05\x87\x00\xaf\x00\x00\x00\x00\x00\x35\x00\x28\x02\x00\x00\x00\x00\x56\x00\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x00\x2c\x01\x26\x00\x00\x00\x73\x02\x9d\x01\x00\x00\x00\x00\x59\x07\x00\x00\x00\x00\x00\x00\x00\x00\x09\x01\x00\x00\x00\x00\x00\x00\xc1\x03\x59\x05\x00\x00\x00\x00\x59\x05\x00\x00\x00\x00\xde\x07\xc3\x04\xb6\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xce\xff\x00\x00\xd2\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa8\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9a\x03\x00\x00\x00\x00\x00\x00\x00\x00\x74\x04\x00\x00\x00\x00\x74\x04\x74\x04\xc6\x07\x00\x00\x00\x00\x01\x00\x00\x00\x79\x00\x00\x00\x8f\x03\x76\x01\xaf\x05\x81\x03\x00\x00\x00\x00\x74\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x74\x04\x67\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x73\x03\x82\x00\x5f\x00\x00\x00\x00\x00\x00\x00\x3d\x03\x48\x00\x00\x00\x5b\x03\xfb\xff\x4c\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd1\xff\x00\x00\x00\x00"#++happyDefActions :: HappyAddr+happyDefActions = HappyA# "\x00\x00\xc5\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0f\xff\x91\xff\x8f\xff\x8d\xff\x15\xff\x12\xff\x10\xff\x00\x00\x1a\xff\x11\xff\x17\xff\x16\xff\x18\xff\x19\xff\x00\x00\x8b\xff\x8c\xff\x88\xff\x8a\xff\x89\xff\x8e\xff\x87\xff\x90\xff\x14\xff\x00\x00\x13\xff\x00\x00\x00\x00\x00\x00\x44\xff\x31\xff\x2e\xff\x00\x00\x2d\xff\x2c\xff\x2b\xff\x00\x00\x00\x00\x00\x00\x24\xff\xa4\xff\x00\x00\xa5\xff\xa3\xff\x9b\xff\x98\xff\x96\xff\x94\xff\x84\xff\x82\xff\x81\xff\x80\xff\x7f\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb4\xff\x00\x00\x00\x00\x54\xff\xb2\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x52\xff\x00\x00\x00\x00\x00\x00\xc5\xff\x00\x00\xc5\xff\x00\x00\xcc\xff\xc6\xff\x00\x00\xce\xff\x00\x00\xc7\xff\x00\x00\xc5\xff\x00\x00\xef\xff\xea\xff\xee\xff\xd9\xff\xcf\xff\xd0\xff\xc6\xff\x00\x00\xd6\xff\x00\x00\x18\xff\xcd\xff\x00\x00\xdb\xff\x00\x00\x00\x00\xdc\xff\x00\x00\x46\xff\x00\x00\x00\x00\x4b\xff\x00\x00\x00\x00\x56\xff\x54\xff\x00\x00\x53\xff\x00\x00\x51\xff\x00\x00\x00\x00\x4e\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xae\xff\x00\x00\x00\x00\xac\xff\xaa\xff\x00\x00\xa6\xff\x92\xff\x93\xff\x00\x00\x0d\xff\x77\xff\x0c\xff\x00\x00\x00\x00\x00\x00\x72\xff\x70\xff\x6f\xff\x74\xff\x67\xff\x00\x00\x00\x00\x7b\xff\x00\x00\x00\x00\x00\x00\x7c\xff\x8a\xff\x89\xff\x64\xff\x63\xff\x00\x00\x79\xff\x00\x00\x00\x00\x9e\xff\x00\x00\x53\xff\x00\x00\x83\xff\x00\x00\x00\x00\x39\xff\x00\x00\x1c\xff\x00\x00\x3b\xff\x40\xff\x00\x00\x00\x00\x28\xff\x00\x00\x00\x00\x23\xff\x2f\xff\x2d\xff\x00\x00\x30\xff\x00\x00\x00\x00\x00\x00\x3e\xff\x42\xff\x00\x00\x43\xff\x00\x00\x00\x00\x00\x00\x0e\xff\x41\xff\x32\xff\x33\xff\x00\x00\x00\x00\x22\xff\x21\xff\x00\x00\x26\xff\x27\xff\x00\x00\x29\xff\x00\x00\x00\x00\x00\x00\x25\xff\x00\x00\x3f\xff\x97\xff\x95\xff\x76\xff\x6d\xff\x6c\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x78\xff\x00\x00\x62\xff\x5e\xff\x00\x00\x00\x00\x7d\xff\x75\xff\x7e\xff\x00\x00\x00\x00\x00\x00\x00\x00\x7a\xff\x00\x00\x73\xff\x00\x00\x00\x00\x00\x00\x15\xff\x05\xff\x00\x00\x0a\xff\x00\x00\x00\x00\x00\x00\xa7\xff\x00\x00\xc4\xff\xb3\xff\xb2\xff\x00\x00\xad\xff\x00\x00\xab\xff\x55\xff\xc3\xff\x00\x00\x86\xff\xbb\xff\xbd\xff\xbc\xff\x35\xff\x00\x00\x37\xff\x00\x00\x00\x00\x4c\xff\x00\x00\x4d\xff\x00\x00\x4f\xff\x00\x00\x50\xff\xb1\xff\x00\x00\x00\x00\x4a\xff\x00\x00\x00\x00\xc5\xff\xdd\xff\xc5\xff\xda\xff\x00\x00\x00\x00\xc5\xff\xe7\xff\xd1\xff\x00\x00\x00\x00\x00\x00\xd5\xff\x18\xff\xc5\xff\xc5\xff\xf2\xff\xec\xff\xf1\xff\xeb\xff\xf0\xff\xc5\xff\x00\x00\x00\x00\xd4\xff\xe0\xff\x00\x00\x00\x00\x00\x00\x00\x00\xd8\xff\xd7\xff\x00\x00\xa0\xff\x00\x00\xa2\xff\x45\xff\x47\xff\x00\x00\x57\xff\x49\xff\x48\xff\xbf\xff\x00\x00\x34\xff\x00\x00\x00\x00\x00\x00\xc1\xff\x00\x00\xa9\xff\xa8\xff\x99\xff\x0b\xff\x00\x00\x09\xff\x00\x00\x07\xff\x08\xff\x71\xff\x6e\xff\x66\xff\x69\xff\x00\x00\x6b\xff\x6b\xff\x65\xff\x5c\xff\x5a\xff\x00\x00\x61\xff\x6a\xff\x9c\xff\x9d\xff\x9a\xff\xba\xff\x00\x00\x38\xff\x3b\xff\x1b\xff\x3a\xff\x1d\xff\x3c\xff\x3d\xff\x1f\xff\x1e\xff\x00\x00\x2a\xff\x20\xff\xc5\xff\x00\x00\x00\x00\xb9\xff\x00\x00\x00\x00\x00\x00\x60\xff\x5d\xff\x68\xff\x06\xff\x00\x00\x04\xff\xb1\xff\xc0\xff\x85\xff\xbe\xff\x00\x00\xc2\xff\xa1\xff\x9f\xff\xc9\xff\x00\x00\xcb\xff\xe8\xff\xe9\xff\x00\x00\xe1\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xca\xff\xb8\xff\x00\x00\x00\x00\xd2\xff\x00\x00\xe2\xff\x00\x00\x00\x00\x5f\xff\x5b\xff\x59\xff\x58\xff\xf3\xff\x36\xff\xc8\xff\x00\x00\xe3\xff\xd3\xff\xb7\xff\x00\x00\xb6\xff\xb5\xff\xe6\xff\x00\x00\xe4\xff"#++happyCheck :: HappyAddr+happyCheck = HappyA# "\xff\xff\x06\x00\x01\x00\x02\x00\x03\x00\x12\x00\x12\x00\x17\x00\x2e\x00\x3a\x00\x16\x00\x17\x00\x0b\x00\x0c\x00\x1a\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x01\x00\x02\x00\x03\x00\x16\x00\x17\x00\x11\x00\x4c\x00\x4c\x00\x40\x00\x4c\x00\x0b\x00\x0c\x00\x52\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x4c\x00\x03\x00\x4c\x00\x16\x00\x17\x00\x37\x00\x38\x00\x30\x00\x3b\x00\x0b\x00\x0c\x00\x2b\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x2f\x00\x37\x00\x38\x00\x16\x00\x17\x00\x4c\x00\x4d\x00\x18\x00\x19\x00\x4c\x00\x4d\x00\x01\x00\x21\x00\x01\x00\x22\x00\x27\x00\x4c\x00\x1a\x00\x4c\x00\x37\x00\x38\x00\x2a\x00\x4c\x00\x4d\x00\x21\x00\x24\x00\x32\x00\x4c\x00\x4d\x00\x31\x00\x4f\x00\x2a\x00\x2b\x00\x17\x00\x03\x00\x17\x00\x37\x00\x38\x00\x15\x00\x38\x00\x4c\x00\x4d\x00\x0b\x00\x0c\x00\x16\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x2a\x00\x27\x00\x1e\x00\x16\x00\x17\x00\x3a\x00\x3b\x00\x4c\x00\x4d\x00\x4c\x00\x4d\x00\x15\x00\x08\x00\x37\x00\x0a\x00\x4c\x00\x4d\x00\x0d\x00\x4f\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x4c\x00\x4c\x00\x4d\x00\x16\x00\x17\x00\x0b\x00\x0c\x00\x4c\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x37\x00\x38\x00\x09\x00\x16\x00\x17\x00\x0b\x00\x0c\x00\x24\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x24\x00\x18\x00\x19\x00\x16\x00\x17\x00\x2f\x00\x2a\x00\x2b\x00\x4c\x00\x4d\x00\x37\x00\x38\x00\x3f\x00\x33\x00\x22\x00\x0b\x00\x0c\x00\x37\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x37\x00\x38\x00\x04\x00\x16\x00\x17\x00\x30\x00\x31\x00\x3f\x00\x4c\x00\x4d\x00\x38\x00\x30\x00\x31\x00\x37\x00\x38\x00\x27\x00\x28\x00\x4c\x00\x4d\x00\x42\x00\x4f\x00\x4c\x00\x4d\x00\x0d\x00\x2d\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x4c\x00\x4c\x00\x4d\x00\x16\x00\x17\x00\x4c\x00\x4d\x00\x37\x00\x38\x00\x0c\x00\x4c\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x4c\x00\x4d\x00\x28\x00\x16\x00\x17\x00\x0c\x00\x14\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x4c\x00\x4d\x00\x13\x00\x16\x00\x17\x00\x37\x00\x12\x00\x1c\x00\x37\x00\x38\x00\x16\x00\x17\x00\x09\x00\x01\x00\x12\x00\x1b\x00\x04\x00\x13\x00\x16\x00\x17\x00\x08\x00\x09\x00\x0a\x00\x1b\x00\x37\x00\x38\x00\x00\x00\x1d\x00\x1e\x00\x4c\x00\x4d\x00\x21\x00\x22\x00\x23\x00\x24\x00\x17\x00\x37\x00\x38\x00\x21\x00\x12\x00\x2a\x00\x2b\x00\x25\x00\x37\x00\x38\x00\x4c\x00\x4d\x00\x37\x00\x38\x00\x12\x00\x38\x00\x37\x00\x38\x00\x16\x00\x17\x00\x12\x00\x21\x00\x4c\x00\x4d\x00\x16\x00\x17\x00\x22\x00\x12\x00\x1a\x00\x4c\x00\x4d\x00\x16\x00\x17\x00\x4c\x00\x4d\x00\x4c\x00\x4d\x00\x4c\x00\x4d\x00\x4c\x00\x4d\x00\x31\x00\x4f\x00\x12\x00\x12\x00\x12\x00\x22\x00\x16\x00\x17\x00\x16\x00\x17\x00\x37\x00\x38\x00\x37\x00\x38\x00\x12\x00\x22\x00\x37\x00\x38\x00\x16\x00\x17\x00\x31\x00\x12\x00\x12\x00\x37\x00\x38\x00\x16\x00\x17\x00\x20\x00\x28\x00\x30\x00\x31\x00\x4c\x00\x4d\x00\x4c\x00\x4d\x00\x18\x00\x19\x00\x4c\x00\x4d\x00\x37\x00\x38\x00\x37\x00\x38\x00\x37\x00\x4c\x00\x4d\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x37\x00\x38\x00\x08\x00\x09\x00\x0a\x00\x42\x00\x43\x00\x37\x00\x38\x00\x4c\x00\x4d\x00\x4c\x00\x4d\x00\x06\x00\x14\x00\x4c\x00\x38\x00\x17\x00\x0b\x00\x19\x00\x38\x00\x4c\x00\x4d\x00\x10\x00\x28\x00\x1f\x00\x20\x00\x2b\x00\x4c\x00\x4d\x00\x24\x00\x18\x00\x26\x00\x18\x00\x19\x00\x29\x00\x4c\x00\x4d\x00\x21\x00\x2d\x00\x4c\x00\x4d\x00\x25\x00\x28\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x04\x00\x24\x00\x06\x00\x21\x00\x08\x00\x09\x00\x0a\x00\x25\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x1f\x00\x38\x00\x35\x00\x36\x00\x37\x00\x38\x00\x2a\x00\x17\x00\x04\x00\x19\x00\x06\x00\x12\x00\x08\x00\x09\x00\x0a\x00\x1f\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x24\x00\x4c\x00\x4d\x00\x4c\x00\x4d\x00\x4c\x00\x4d\x00\x17\x00\x04\x00\x19\x00\x2e\x00\x22\x00\x08\x00\x09\x00\x0a\x00\x1f\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x24\x00\x12\x00\x3a\x00\x3b\x00\x15\x00\x30\x00\x31\x00\x17\x00\x04\x00\x19\x00\x2e\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x1f\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x24\x00\x21\x00\x3a\x00\x3b\x00\x4c\x00\x25\x00\x4e\x00\x17\x00\x04\x00\x19\x00\x2e\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x1f\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x24\x00\x42\x00\x43\x00\x3b\x00\x21\x00\x2c\x00\x2d\x00\x17\x00\x25\x00\x19\x00\x2e\x00\x4c\x00\x30\x00\x12\x00\x1a\x00\x1f\x00\x28\x00\x36\x00\x37\x00\x38\x00\x24\x00\x21\x00\x3a\x00\x1c\x00\x1d\x00\x1e\x00\x30\x00\x04\x00\x21\x00\x12\x00\x2e\x00\x08\x00\x09\x00\x0a\x00\x12\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x4c\x00\x4d\x00\x21\x00\x3a\x00\x20\x00\x21\x00\x25\x00\x17\x00\x04\x00\x19\x00\x22\x00\x12\x00\x08\x00\x09\x00\x0a\x00\x1f\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x24\x00\x2a\x00\x22\x00\x12\x00\x30\x00\x31\x00\x4a\x00\x17\x00\x4c\x00\x19\x00\x2e\x00\x21\x00\x30\x00\x1c\x00\x1d\x00\x1f\x00\x30\x00\x31\x00\x4c\x00\x4d\x00\x24\x00\x4f\x00\x3a\x00\x51\x00\x01\x00\x21\x00\x03\x00\x04\x00\x05\x00\x25\x00\x2e\x00\x08\x00\x09\x00\x0a\x00\x1b\x00\x22\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x1e\x00\x3a\x00\x08\x00\x09\x00\x0a\x00\x17\x00\x12\x00\x19\x00\x30\x00\x31\x00\x20\x00\x21\x00\x28\x00\x1f\x00\x14\x00\x2b\x00\x20\x00\x17\x00\x24\x00\x19\x00\x1a\x00\x18\x00\x19\x00\x4c\x00\x4d\x00\x1f\x00\x4f\x00\x05\x00\x2e\x00\x07\x00\x24\x00\x12\x00\x26\x00\x33\x00\x4c\x00\x29\x00\x4e\x00\x37\x00\x4c\x00\x2d\x00\x4e\x00\x2a\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x35\x00\x36\x00\x08\x00\x09\x00\x0a\x00\x04\x00\x38\x00\x2f\x00\x20\x00\x08\x00\x09\x00\x0a\x00\x02\x00\x13\x00\x14\x00\x08\x00\x4c\x00\x17\x00\x4e\x00\x19\x00\x25\x00\x26\x00\x27\x00\x28\x00\x17\x00\x1f\x00\x4c\x00\x4d\x00\x1a\x00\x2a\x00\x24\x00\x28\x00\x26\x00\x21\x00\x12\x00\x29\x00\x20\x00\x21\x00\x25\x00\x2d\x00\x20\x00\x21\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x35\x00\x36\x00\x08\x00\x09\x00\x0a\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x4c\x00\x4d\x00\x14\x00\x4f\x00\x50\x00\x17\x00\x28\x00\x19\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x1f\x00\x37\x00\x08\x00\x09\x00\x0a\x00\x24\x00\x28\x00\x26\x00\x45\x00\x46\x00\x29\x00\x48\x00\x20\x00\x21\x00\x2d\x00\x4c\x00\x4d\x00\x17\x00\x4f\x00\x19\x00\x46\x00\x47\x00\x35\x00\x36\x00\x01\x00\x1f\x00\x4c\x00\x4d\x00\x28\x00\x4f\x00\x24\x00\x28\x00\x26\x00\x04\x00\x05\x00\x29\x00\x04\x00\x08\x00\x09\x00\x0a\x00\x08\x00\x09\x00\x0a\x00\x20\x00\x21\x00\x04\x00\x2a\x00\x35\x00\x36\x00\x08\x00\x09\x00\x0a\x00\x17\x00\x2f\x00\x12\x00\x17\x00\x20\x00\x19\x00\x1a\x00\x2a\x00\x1f\x00\x23\x00\x20\x00\x1f\x00\x17\x00\x1a\x00\x19\x00\x21\x00\x24\x00\x22\x00\x04\x00\x05\x00\x1f\x00\x20\x00\x08\x00\x09\x00\x0a\x00\x24\x00\x2e\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x2e\x00\x2b\x00\x17\x00\x34\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x1e\x00\x28\x00\x28\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x20\x00\x2a\x00\x2b\x00\x22\x00\x1e\x00\x3e\x00\x2f\x00\x21\x00\x22\x00\x23\x00\x24\x00\x44\x00\x45\x00\x46\x00\x2f\x00\x48\x00\x2a\x00\x2b\x00\x30\x00\x4c\x00\x4d\x00\x2f\x00\x4f\x00\x3b\x00\x32\x00\x02\x00\x18\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x22\x00\x4c\x00\x4d\x00\x3b\x00\x4f\x00\x2a\x00\x2b\x00\x01\x00\x1e\x00\x01\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x01\x00\x4c\x00\x4d\x00\x22\x00\x4f\x00\x2a\x00\x2b\x00\x1e\x00\x46\x00\x3b\x00\x21\x00\x22\x00\x23\x00\x24\x00\x4c\x00\x4d\x00\x23\x00\x4f\x00\x12\x00\x2a\x00\x2b\x00\x4a\x00\x4b\x00\x4c\x00\x4c\x00\x4d\x00\x24\x00\x4f\x00\x4a\x00\x4b\x00\x4c\x00\x1e\x00\x2a\x00\x2b\x00\x21\x00\x22\x00\x23\x00\x24\x00\x3b\x00\x4c\x00\x4d\x00\x2b\x00\x4f\x00\x2a\x00\x2b\x00\x1e\x00\x3b\x00\x11\x00\x21\x00\x22\x00\x23\x00\x24\x00\x13\x00\x4c\x00\x4d\x00\x2f\x00\x4f\x00\x2a\x00\x2b\x00\x1e\x00\x2f\x00\xff\xff\x21\x00\x22\x00\x23\x00\x24\x00\x4c\x00\x4d\x00\xff\xff\x4f\x00\x1e\x00\x2a\x00\x2b\x00\x21\x00\x22\x00\x23\x00\x24\x00\x4c\x00\x4d\x00\xff\xff\x4f\x00\xff\xff\x2a\x00\x2b\x00\x1e\x00\xff\xff\xff\xff\x21\x00\x22\x00\x23\x00\x24\x00\x4c\x00\x4d\x00\xff\xff\x4f\x00\xff\xff\x2a\x00\x2b\x00\x1e\x00\xff\xff\xff\xff\x21\x00\x22\x00\x23\x00\x24\x00\x4c\x00\x4d\x00\xff\xff\x4f\x00\x1e\x00\x2a\x00\x2b\x00\x21\x00\x22\x00\x23\x00\x24\x00\x4c\x00\x4d\x00\xff\xff\x4f\x00\xff\xff\x2a\x00\x2b\x00\x1e\x00\xff\xff\xff\xff\x21\x00\x22\x00\x23\x00\x24\x00\x4c\x00\x4d\x00\xff\xff\x4f\x00\xff\xff\x2a\x00\x2b\x00\x1e\x00\xff\xff\xff\xff\x21\x00\x22\x00\x23\x00\x24\x00\x4c\x00\x4d\x00\xff\xff\x4f\x00\x1e\x00\x2a\x00\x2b\x00\x21\x00\x22\x00\x23\x00\x24\x00\x4c\x00\x4d\x00\xff\xff\x4f\x00\xff\xff\x2a\x00\x2b\x00\x1e\x00\xff\xff\xff\xff\x21\x00\x22\x00\x23\x00\x24\x00\x4c\x00\x4d\x00\xff\xff\x4f\x00\xff\xff\x2a\x00\x2b\x00\x1e\x00\xff\xff\xff\xff\x21\x00\x22\x00\x23\x00\x24\x00\x4c\x00\x4d\x00\xff\xff\x4f\x00\x1e\x00\x2a\x00\x2b\x00\x21\x00\x22\x00\x23\x00\x24\x00\x4c\x00\x4d\x00\xff\xff\x4f\x00\xff\xff\x2a\x00\x2b\x00\x1e\x00\xff\xff\xff\xff\x21\x00\x22\x00\x23\x00\x24\x00\x4c\x00\x4d\x00\xff\xff\x4f\x00\xff\xff\x2a\x00\x2b\x00\x1e\x00\xff\xff\xff\xff\x21\x00\x22\x00\x23\x00\x24\x00\x4c\x00\x4d\x00\xff\xff\x4f\x00\x1e\x00\x2a\x00\x2b\x00\x21\x00\x22\x00\x23\x00\x24\x00\x4c\x00\x4d\x00\xff\xff\x4f\x00\xff\xff\x2a\x00\x2b\x00\x1e\x00\xff\xff\xff\xff\x21\x00\x22\x00\x23\x00\x24\x00\x4c\x00\x4d\x00\xff\xff\x4f\x00\xff\xff\x2a\x00\x2b\x00\xff\xff\xff\xff\x21\x00\x22\x00\x23\x00\x24\x00\xff\xff\x4c\x00\x4d\x00\xff\xff\x4f\x00\x2a\x00\x2b\x00\x21\x00\x22\x00\x23\x00\x24\x00\xff\xff\x4c\x00\x4d\x00\x04\x00\x4f\x00\x2a\x00\x2b\x00\x08\x00\x09\x00\x0a\x00\x36\x00\x37\x00\x38\x00\x24\x00\xff\xff\x4c\x00\x4d\x00\x24\x00\x4f\x00\x2a\x00\x2b\x00\xff\xff\x17\x00\x2a\x00\x2b\x00\x26\x00\x27\x00\x28\x00\x4c\x00\x4d\x00\xff\xff\x4f\x00\x4c\x00\x4d\x00\xff\xff\xff\xff\x25\x00\xff\xff\xff\xff\x4c\x00\x4d\x00\x01\x00\x4f\x00\x03\x00\x04\x00\x05\x00\xff\xff\xff\xff\x08\x00\x09\x00\x0a\x00\xff\xff\xff\xff\x4c\x00\x4d\x00\x1a\x00\x4f\x00\x4c\x00\x4d\x00\xff\xff\x4f\x00\xff\xff\xff\xff\x17\x00\xff\xff\x19\x00\x01\x00\xff\xff\x03\x00\x04\x00\x05\x00\x1f\x00\xff\xff\x08\x00\x09\x00\x0a\x00\x24\x00\x25\x00\xff\xff\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x2e\x00\xff\xff\x17\x00\xff\xff\x19\x00\x01\x00\xff\xff\x03\x00\x04\x00\x05\x00\x1f\x00\x20\x00\x08\x00\x09\x00\x0a\x00\x24\x00\xff\xff\x04\x00\x26\x00\x27\x00\x28\x00\x08\x00\x09\x00\x0a\x00\xff\xff\x2e\x00\xff\xff\x17\x00\xff\xff\x19\x00\x01\x00\xff\xff\x03\x00\x04\x00\x05\x00\x1f\x00\x17\x00\x08\x00\x09\x00\x0a\x00\x24\x00\xff\xff\x04\x00\xff\xff\x1f\x00\xff\xff\x08\x00\x09\x00\x0a\x00\xff\xff\x2e\x00\xff\xff\x17\x00\x28\x00\x19\x00\x01\x00\xff\xff\x03\x00\x04\x00\x05\x00\x1f\x00\x17\x00\x08\x00\x09\x00\x0a\x00\x24\x00\xff\xff\x04\x00\xff\xff\x1f\x00\xff\xff\x08\x00\x09\x00\x0a\x00\xff\xff\x2e\x00\xff\xff\x17\x00\x28\x00\x19\x00\x01\x00\xff\xff\x03\x00\x04\x00\x05\x00\x1f\x00\x17\x00\x08\x00\x09\x00\x0a\x00\x24\x00\xff\xff\x04\x00\xff\xff\x1f\x00\xff\xff\x08\x00\x09\x00\x0a\x00\xff\xff\x2e\x00\xff\xff\x17\x00\x28\x00\x19\x00\x01\x00\xff\xff\x03\x00\x04\x00\x05\x00\x1f\x00\x17\x00\x08\x00\x09\x00\x0a\x00\x24\x00\xff\xff\x1a\x00\xff\xff\x1f\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x2e\x00\x38\x00\x17\x00\x28\x00\x19\x00\x01\x00\xff\xff\x03\x00\x04\x00\x05\x00\x1f\x00\xff\xff\x08\x00\x09\x00\x0a\x00\x24\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\xff\xff\xff\xff\x2e\x00\xff\xff\x17\x00\xff\xff\x19\x00\x01\x00\xff\xff\x03\x00\x04\x00\x05\x00\x1f\x00\xff\xff\x08\x00\x09\x00\x0a\x00\x24\x00\xff\xff\x04\x00\x26\x00\x27\x00\x28\x00\x08\x00\x09\x00\x0a\x00\xff\xff\x2e\x00\xff\xff\x17\x00\xff\xff\x19\x00\x01\x00\xff\xff\x03\x00\x04\x00\x05\x00\x1f\x00\x17\x00\x08\x00\x09\x00\x0a\x00\x24\x00\xff\xff\x04\x00\xff\xff\x1f\x00\xff\xff\x08\x00\x09\x00\x0a\x00\xff\xff\x2e\x00\xff\xff\x17\x00\xff\xff\x19\x00\x01\x00\xff\xff\x03\x00\x04\x00\x05\x00\x1f\x00\x17\x00\x08\x00\x09\x00\x0a\x00\x24\x00\xff\xff\x04\x00\x05\x00\x1f\x00\xff\xff\x08\x00\x09\x00\x0a\x00\xff\xff\x2e\x00\xff\xff\x17\x00\xff\xff\x19\x00\x01\x00\xff\xff\x03\x00\x04\x00\x05\x00\x1f\x00\x17\x00\x08\x00\x09\x00\x0a\x00\x24\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x26\x00\x27\x00\x28\x00\x2e\x00\xff\xff\x17\x00\xff\xff\x19\x00\x01\x00\xff\xff\x03\x00\x04\x00\x05\x00\x1f\x00\xff\xff\x08\x00\x09\x00\x0a\x00\x24\x00\x4c\x00\x4d\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\xff\xff\xff\xff\x2e\x00\xff\xff\x17\x00\xff\xff\x19\x00\x01\x00\xff\xff\x03\x00\x04\x00\x05\x00\x1f\x00\xff\xff\x08\x00\x09\x00\x0a\x00\x24\x00\xff\xff\x4c\x00\x4d\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x2e\x00\xff\xff\x17\x00\x04\x00\x19\x00\xff\xff\xff\xff\x08\x00\x09\x00\x0a\x00\x1f\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x24\x00\x4c\x00\x4d\x00\x36\x00\x37\x00\x38\x00\x39\x00\x17\x00\x04\x00\x19\x00\x2e\x00\xff\xff\x08\x00\x09\x00\x0a\x00\x1f\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x24\x00\x26\x00\x27\x00\x28\x00\x29\x00\x4c\x00\x4d\x00\x17\x00\xff\xff\x19\x00\x2e\x00\xff\xff\x30\x00\xff\xff\xff\xff\x1f\x00\xff\xff\x04\x00\xff\xff\xff\xff\x24\x00\x08\x00\x09\x00\x0a\x00\xff\xff\x0c\x00\x0d\x00\x0e\x00\x0f\x00\xff\xff\x2e\x00\xff\xff\x30\x00\x26\x00\x27\x00\x28\x00\x17\x00\x04\x00\x19\x00\xff\xff\xff\xff\x08\x00\x09\x00\x0a\x00\x1f\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x24\x00\x25\x00\x36\x00\x37\x00\x38\x00\xff\xff\xff\xff\x17\x00\x04\x00\x19\x00\x2e\x00\xff\xff\x08\x00\x09\x00\x0a\x00\x1f\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x24\x00\x25\x00\xff\xff\xff\xff\x4c\x00\x4d\x00\xff\xff\x17\x00\x04\x00\x19\x00\x2e\x00\xff\xff\x08\x00\x09\x00\x0a\x00\x1f\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x24\x00\x26\x00\x27\x00\x28\x00\x29\x00\xff\xff\xff\xff\x17\x00\x04\x00\x19\x00\x2e\x00\xff\xff\x08\x00\x09\x00\x0a\x00\x1f\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x24\x00\x26\x00\x27\x00\x28\x00\x29\x00\xff\xff\xff\xff\x17\x00\x04\x00\x19\x00\x2e\x00\xff\xff\x08\x00\x09\x00\x0a\x00\x1f\x00\xff\xff\xff\xff\x04\x00\xff\xff\x24\x00\xff\xff\x08\x00\x09\x00\x0a\x00\xff\xff\xff\xff\x17\x00\x04\x00\x19\x00\x2e\x00\xff\xff\x08\x00\x09\x00\x0a\x00\x1f\x00\x46\x00\x17\x00\xff\xff\xff\xff\x24\x00\xff\xff\x4c\x00\x4d\x00\x28\x00\x4f\x00\xff\xff\x17\x00\x04\x00\x19\x00\x2e\x00\x25\x00\x08\x00\x09\x00\x0a\x00\x1f\x00\x25\x00\x26\x00\x27\x00\x28\x00\x24\x00\x26\x00\x27\x00\x28\x00\x28\x00\xff\xff\xff\xff\x17\x00\x04\x00\x19\x00\x2e\x00\xff\xff\x08\x00\x09\x00\x0a\x00\x1f\x00\x20\x00\x44\x00\x45\x00\x46\x00\x24\x00\x48\x00\x49\x00\xff\xff\xff\xff\x4c\x00\x4d\x00\x17\x00\x4f\x00\x19\x00\x2e\x00\x52\x00\x53\x00\x12\x00\xff\xff\x1f\x00\x15\x00\x16\x00\xff\xff\xff\xff\x24\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\xff\xff\x20\x00\x21\x00\x22\x00\x2e\x00\xff\xff\x25\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x2b\x00\x2c\x00\x08\x00\x09\x00\x0a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\xff\xff\xff\xff\x3b\x00\x17\x00\xff\xff\x19\x00\x26\x00\x27\x00\x28\x00\x04\x00\xff\xff\x1f\x00\xff\xff\x08\x00\x09\x00\x0a\x00\x24\x00\xff\xff\x26\x00\xff\xff\xff\xff\x29\x00\x36\x00\x37\x00\x38\x00\x39\x00\x01\x00\xff\xff\x17\x00\x04\x00\x05\x00\xff\xff\x04\x00\x08\x00\x09\x00\x0a\x00\x08\x00\x09\x00\x0a\x00\x26\x00\x27\x00\x28\x00\x25\x00\xff\xff\x4c\x00\x4d\x00\xff\xff\xff\xff\x17\x00\xff\xff\xff\xff\x17\x00\xff\xff\x22\x00\xff\xff\xff\xff\x1f\x00\x25\x00\x26\x00\x27\x00\x28\x00\x24\x00\x2b\x00\x2c\x00\x20\x00\x25\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x20\x00\x21\x00\x3b\x00\xff\xff\x40\x00\x41\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x21\x00\x4a\x00\x4b\x00\x4c\x00\x25\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x3c\x00\x3d\x00\x3e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x44\x00\x45\x00\x46\x00\xff\xff\x48\x00\x3c\x00\x3d\x00\x3e\x00\x4c\x00\x4d\x00\xff\xff\x4f\x00\xff\xff\x44\x00\x45\x00\x46\x00\xff\xff\x48\x00\x3c\x00\x3d\x00\x3e\x00\x4c\x00\x4d\x00\xff\xff\x4f\x00\xff\xff\x44\x00\x45\x00\x46\x00\xff\xff\x48\x00\x3c\x00\x3d\x00\x3e\x00\x4c\x00\x4d\x00\xff\xff\x4f\x00\xff\xff\x44\x00\x45\x00\x46\x00\xff\xff\x48\x00\xff\xff\xff\xff\xff\xff\x4c\x00\x4d\x00\xff\xff\x4f\x00\x04\x00\x05\x00\xff\xff\x04\x00\x08\x00\x09\x00\x0a\x00\x08\x00\x09\x00\x0a\x00\xff\xff\x3f\x00\xff\xff\xff\xff\xff\xff\xff\xff\x44\x00\x45\x00\x46\x00\x17\x00\x48\x00\x28\x00\x17\x00\xff\xff\x4c\x00\x4d\x00\xff\xff\x4f\x00\xff\xff\xff\xff\x2a\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x2c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x44\x00\x45\x00\x46\x00\xff\xff\x48\x00\x49\x00\xff\xff\xff\xff\x4c\x00\x4d\x00\xff\xff\x4f\x00\x44\x00\x45\x00\x46\x00\xff\xff\x48\x00\xff\xff\xff\xff\xff\xff\x4c\x00\x4d\x00\xff\xff\x4f\x00\x44\x00\x45\x00\x46\x00\xff\xff\x48\x00\xff\xff\xff\xff\xff\xff\x4c\x00\x4d\x00\xff\xff\x4f\x00\x44\x00\x45\x00\x46\x00\xff\xff\x48\x00\xff\xff\xff\xff\xff\xff\x4c\x00\x4d\x00\xff\xff\x4f\x00\x44\x00\x45\x00\x46\x00\xff\xff\x48\x00\xff\xff\xff\xff\xff\xff\x4c\x00\x4d\x00\xff\xff\x4f\x00\x44\x00\x45\x00\x46\x00\xff\xff\x48\x00\xff\xff\xff\xff\xff\xff\x4c\x00\x4d\x00\xff\xff\x4f\x00\x44\x00\x45\x00\x46\x00\xff\xff\x48\x00\xff\xff\xff\xff\xff\xff\x4c\x00\x4d\x00\xff\xff\x4f\x00\x44\x00\x45\x00\x46\x00\xff\xff\x48\x00\xff\xff\xff\xff\xff\xff\x4c\x00\x4d\x00\xff\xff\x4f\x00\x44\x00\x45\x00\x46\x00\xff\xff\x48\x00\xff\xff\xff\xff\xff\xff\x4c\x00\x4d\x00\xff\xff\x4f\x00\x44\x00\x45\x00\x46\x00\xff\xff\x48\x00\xff\xff\xff\xff\xff\xff\x4c\x00\x4d\x00\xff\xff\x4f\x00\x44\x00\x45\x00\x46\x00\xff\xff\x48\x00\xff\xff\xff\xff\xff\xff\x4c\x00\x4d\x00\xff\xff\x4f\x00\x44\x00\x45\x00\x46\x00\xff\xff\x48\x00\xff\xff\xff\xff\xff\xff\x4c\x00\x4d\x00\xff\xff\x4f\x00\x44\x00\x45\x00\x46\x00\xff\xff\x48\x00\xff\xff\xff\xff\xff\xff\x4c\x00\x4d\x00\xff\xff\x4f\x00\x44\x00\x45\x00\x46\x00\xff\xff\x48\x00\xff\xff\xff\xff\xff\xff\x4c\x00\x4d\x00\xff\xff\x4f\x00\x44\x00\x45\x00\x46\x00\xff\xff\x48\x00\xff\xff\xff\xff\xff\xff\x4c\x00\x4d\x00\xff\xff\x4f\x00\x44\x00\x45\x00\x46\x00\xff\xff\x48\x00\xff\xff\xff\xff\xff\xff\x4c\x00\x4d\x00\xff\xff\x4f\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"#++happyTable :: HappyAddr+happyTable = HappyA# "\x00\x00\xc2\x01\x92\x01\x6f\x00\x70\x00\x81\x00\x50\x00\x19\x01\xf4\x00\x5c\x01\x51\x00\x52\x00\x71\x00\x72\x00\x5a\x01\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x6e\x00\x6f\x00\x70\x00\x51\x00\x52\x00\x0e\x00\x9c\x01\x83\x00\x85\x01\xcb\x01\x71\x00\x72\x00\x9d\x01\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\xf5\x00\x49\x01\x86\x01\x51\x00\x52\x00\x54\x00\x55\x00\x75\x01\xff\xff\x4a\x01\x72\x00\xc2\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x6e\x00\x54\x00\x55\x00\x51\x00\x52\x00\x12\x00\x1a\x01\xad\x01\x99\x00\x12\x00\x56\x00\xac\x00\x9c\x00\xac\x00\x39\x01\x0c\x01\xc3\x01\x2c\x01\xb0\x00\x54\x00\x55\x00\x9d\x00\x12\x00\x56\x00\x2d\x01\xf3\x00\x0d\x01\x12\x00\x13\x00\x3b\x01\x3f\x00\x3d\x00\x3e\x00\xad\x00\x4b\x01\xad\x00\x54\x00\x55\x00\xc5\x01\x9a\x00\x12\x00\x56\x00\x4c\x01\x72\x00\xfa\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x31\x01\xae\x00\xfb\x00\x51\x00\x52\x00\x81\x00\x82\x00\x12\x00\x56\x00\x12\x00\x8a\x00\xb3\x01\x63\x00\x97\x00\x64\x00\x12\x00\x13\x00\x65\x00\x3f\x00\x66\x00\x67\x00\x68\x00\x69\x00\x83\x00\x12\x00\x4f\x01\x51\x00\x52\x00\xb1\x01\x72\x00\x63\x01\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x54\x00\x55\x00\xad\x01\x51\x00\x52\x00\x53\x01\x72\x00\x37\x01\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\xa1\x00\xf7\x00\x99\x00\x51\x00\x52\x00\x38\x01\x3d\x00\x3e\x00\x12\x00\x56\x00\x54\x00\x55\x00\xba\x01\x8b\x01\xe5\xff\x7e\x00\x72\x00\x8c\x01\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x54\x00\x55\x00\x51\x01\x51\x00\x52\x00\xe5\xff\xe5\xff\x88\x01\x12\x00\x56\x00\x9a\x00\xae\x00\xaf\x00\x54\x00\x55\x00\x94\x00\x11\x00\x12\x00\x13\x00\x64\x01\x3f\x00\x12\x00\x56\x00\x7d\x00\x73\x01\x66\x00\x67\x00\x68\x00\x69\x00\x28\x01\x12\x00\x8a\x00\x51\x00\x52\x00\x12\x00\x56\x00\x54\x00\x55\x00\x56\x01\xb0\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x12\x00\x3c\x01\xf9\x00\x51\x00\x52\x00\x57\x01\x40\x01\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x12\x00\x56\x00\x4d\x00\x51\x00\x52\x00\x97\x00\x9e\x00\x4e\x00\x54\x00\x55\x00\x51\x00\x52\x00\x61\x00\xf7\x00\x9e\x00\x58\x01\x17\x00\x36\x00\x51\x00\x52\x00\x19\x00\x1a\x00\x1b\x00\x9f\x00\x54\x00\x55\x00\x6c\x00\x37\x00\x38\x00\x12\x00\x56\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x1c\x00\x54\x00\x55\x00\xef\x00\x81\x00\x3d\x00\x3e\x00\xc9\x01\x54\x00\x55\x00\x12\x00\x56\x00\x1f\x01\x88\x00\x97\x00\x1c\x01\x54\x00\x55\x00\x51\x00\x52\x00\x50\x00\x97\x01\x12\x00\x56\x00\x51\x00\x52\x00\x39\x01\x6a\x01\x53\x00\x12\x00\x56\x00\x51\x00\x52\x00\x12\x00\x8a\x00\x12\x00\x8a\x00\x12\x00\x56\x00\x12\x00\x13\x00\x3b\x01\x3f\x00\x6b\x01\x81\x00\x44\x01\x47\x01\x51\x00\x52\x00\x51\x00\x52\x00\x54\x00\x55\x00\xbf\x00\x88\x00\x97\x00\x39\x01\x54\x00\x55\x00\x51\x00\x52\x00\x48\x01\x5f\x00\x81\x00\x54\x00\x55\x00\x51\x00\x52\x00\xc1\x01\x96\x00\xb3\x01\x3b\x01\x12\x00\x56\x00\x12\x00\xc0\x00\x06\x01\x99\x00\x12\x00\x56\x00\x54\x00\x55\x00\x54\x00\x55\x00\x97\x00\x12\x00\x56\x00\x41\x00\x42\x00\x43\x00\x17\x00\x18\x00\x54\x00\x55\x00\x19\x00\x1a\x00\x1b\x00\x26\x01\xaf\x01\x54\x00\x55\x00\x12\x00\x56\x00\x12\x00\x56\x00\x42\x01\x45\x00\x28\x01\x9a\x00\x1c\x00\x43\x01\x46\x00\x21\x01\x12\x00\x56\x00\x44\x01\xaf\xff\x47\x00\xb6\x00\xaf\xff\x12\x00\x56\x00\x48\x00\x7c\x00\x49\x00\x98\x00\x99\x00\x4a\x00\x12\x00\x8a\x00\x6f\x01\x4b\x00\x12\x00\x8a\x00\x70\x01\xb8\x01\x1e\x00\x1f\x00\x20\x00\xb7\x00\xb8\x00\x23\x00\x24\x00\x25\x00\x17\x00\xb5\x01\x6b\x00\xeb\x00\x19\x00\x1a\x00\x1b\x00\x72\x01\x58\x00\x59\x00\x5a\x00\x5b\x00\xb9\x01\x9a\x00\xbd\x01\x7d\x01\x87\x00\x88\x00\xba\x01\x1c\x00\x17\x00\x5c\x00\x6b\x00\x81\x00\x19\x00\x1a\x00\x1b\x00\x5d\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5e\x00\x12\x00\x8a\x00\x12\x00\x90\x00\x12\x00\x8a\x00\x1c\x00\x17\x00\x5c\x00\x5f\x00\x16\x01\x19\x00\x1a\x00\x1b\x00\x5d\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5e\x00\x81\x00\x6c\x00\xdf\xff\xfc\x00\xa6\x01\x18\x01\x1c\x00\x17\x00\x5c\x00\x5f\x00\x79\x00\x19\x00\x1a\x00\x7a\x00\x5d\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5e\x00\xef\x00\x6c\x00\xde\xff\x25\x00\xf0\x00\xa9\x01\x1c\x00\x17\x00\x5c\x00\x5f\x00\x79\x00\x19\x00\x1a\x00\x7a\x00\x5d\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5e\x00\x26\x01\x27\x01\xff\xff\xf1\x00\xa9\x00\xaa\x00\x1c\x00\xf2\x00\x5c\x00\x5f\x00\x28\x01\xed\xff\x81\x00\x2e\x01\x5d\x00\x71\x01\x5d\x01\x87\x00\x88\x00\x5e\x00\x2f\x01\x6c\x00\xff\x00\x00\x01\x01\x01\xc0\x01\x17\x00\x02\x01\x81\x00\x5f\x00\x19\x00\x1a\x00\x7a\x00\x81\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x12\x00\x8a\x00\x09\x01\x6c\x00\x05\x01\x06\x01\x0a\x01\x1c\x00\x17\x00\x5c\x00\x39\x01\x81\x00\x19\x00\x1a\x00\x7a\x00\x5d\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5e\x00\x94\x01\x16\x01\x81\x00\xa9\x01\x3b\x01\x87\x01\x1c\x00\xe7\x00\x5c\x00\x5f\x00\x97\x01\x80\x00\x99\x01\x9a\x01\x5d\x00\x17\x01\x18\x01\x12\x00\x13\x00\x5e\x00\xa4\x00\x6c\x00\xa5\x00\x31\x00\x35\x01\x32\x00\x17\x00\x18\x00\x36\x01\x5f\x00\x19\x00\x1a\x00\x1b\x00\x96\x01\x39\x01\x41\x00\x42\x00\x43\x00\x17\x00\x18\x00\x98\x01\x6c\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x81\x00\x33\x00\x3a\x01\x3b\x01\xca\x01\xcb\x01\xb0\xff\x34\x00\x45\x00\xb0\xff\x9f\x01\x1c\x00\xcf\x00\x46\x00\xbc\x00\xa3\x00\x99\x00\x12\x00\x13\x00\x47\x00\x4e\x01\xaa\x01\x36\x00\xab\x01\x48\x00\x81\x00\x49\x00\x8b\x01\x25\x00\x4a\x00\x3f\x01\x8c\x01\x25\x00\x4b\x00\xdd\x00\xa3\x01\x41\x00\x42\x00\x43\x00\x17\x00\x18\x00\x4c\x00\x4d\x00\x19\x00\x1a\x00\x1b\x00\x17\x00\x9a\x00\x4e\x01\xa8\x01\x19\x00\x1a\x00\x1b\x00\x51\x01\x44\x00\x45\x00\x53\x01\x25\x00\x1c\x00\x26\x00\x46\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x1c\x00\x47\x00\x12\x00\x8a\x00\x90\x01\x56\x01\x48\x00\x5f\x01\x49\x00\x67\x01\x81\x00\x4a\x00\xea\x00\xeb\x00\xc8\x01\x4b\x00\x03\x01\xfe\x00\x41\x00\x42\x00\x43\x00\x17\x00\x18\x00\x4c\x00\x4d\x00\x19\x00\x1a\x00\x1b\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x12\x00\x13\x00\x45\x00\x14\x00\x15\x00\x1c\x00\x68\x01\x46\x00\x41\x00\x42\x00\x43\x00\x17\x00\x18\x00\x47\x00\x97\x00\x19\x00\x1a\x00\x1b\x00\x48\x00\x71\x01\x49\x00\xe1\x00\x2d\x00\x4a\x00\x2e\x00\x30\x01\x2d\x01\x4b\x00\x12\x00\x13\x00\x1c\x00\x2f\x00\x46\x00\xd0\x00\xd1\x00\x4c\x00\x4d\x00\x75\x01\x47\x00\x12\x00\x13\x00\x78\x01\xd2\x00\x48\x00\x85\x01\x49\x00\x17\x00\x18\x00\x4a\x00\x17\x00\x19\x00\x1a\x00\x1b\x00\x19\x00\x1a\x00\x1b\x00\x32\x01\x2f\x01\x17\x00\x8f\x01\x4c\x00\x4d\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x92\x01\xdf\x00\x1c\x00\xe0\x00\x5c\x00\x90\x00\xee\x00\x1d\x00\xc2\x00\x04\x01\x8c\x00\x1c\x00\xfd\x00\x5c\x00\xfe\x00\x5e\x00\x1f\x01\x17\x00\x28\x00\x8c\x00\x8d\x00\x19\x00\x1a\x00\x1b\x00\x5e\x00\x5f\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x5f\x00\x15\x01\x1c\x00\x0b\x01\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\xb2\x00\x1e\x01\x34\x01\x39\x00\x3a\x00\x3b\x00\x3c\x00\xb3\x00\x0f\x00\x10\x00\x11\x00\x33\x01\x3d\x00\x3e\x00\x3c\x01\xb8\x00\xda\x00\xb4\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\xdb\x00\x2c\x00\x2d\x00\x3f\x01\x2e\x00\x3d\x00\x3e\x00\x49\x01\x12\x00\x13\x00\xb9\x00\x2f\x00\xff\xff\xba\x00\x7b\x00\x7c\x00\xbc\x00\xbd\x00\xbe\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x7d\x00\x12\x00\x13\x00\xff\xff\x3f\x00\x3d\x00\x3e\x00\x92\x00\xbc\x00\x93\x00\x81\x01\x39\x00\x3a\x00\x3b\x00\x3c\x00\x94\x00\x12\x00\x13\x00\x9e\x00\x3f\x00\x3d\x00\x3e\x00\xc4\x01\xe5\x00\xff\xff\x39\x00\x3a\x00\x3b\x00\x3c\x00\x12\x00\x13\x00\xc2\x00\xd2\x00\x81\x00\x3d\x00\x3e\x00\xc7\x00\xc6\x01\xe7\x00\x12\x00\x13\x00\xa2\x00\x3f\x00\xc7\x00\xc8\x00\xe7\x00\xb6\x01\x3d\x00\x3e\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\xff\xff\x12\x00\x13\x00\xd7\x00\x3f\x00\x3d\x00\x3e\x00\xbb\x01\xff\xff\x0e\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x44\x00\x12\x00\x13\x00\x50\x00\x3f\x00\x3d\x00\x3e\x00\xbe\x01\x63\x00\x00\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x12\x00\x13\x00\x00\x00\x3f\x00\x94\x01\x3d\x00\x3e\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x12\x00\x13\x00\x00\x00\x3f\x00\x00\x00\x3d\x00\x3e\x00\x9a\x01\x00\x00\x00\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x12\x00\x13\x00\x00\x00\x3f\x00\x00\x00\x3d\x00\x3e\x00\x9f\x01\x00\x00\x00\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x12\x00\x13\x00\x00\x00\x3f\x00\xa3\x01\x3d\x00\x3e\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x12\x00\x13\x00\x00\x00\x3f\x00\x00\x00\x3d\x00\x3e\x00\x68\x01\x00\x00\x00\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x12\x00\x13\x00\x00\x00\x3f\x00\x00\x00\x3d\x00\x3e\x00\x76\x01\x00\x00\x00\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x12\x00\x13\x00\x00\x00\x3f\x00\x78\x01\x3d\x00\x3e\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x12\x00\x13\x00\x00\x00\x3f\x00\x00\x00\x3d\x00\x3e\x00\x79\x01\x00\x00\x00\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x12\x00\x13\x00\x00\x00\x3f\x00\x00\x00\x3d\x00\x3e\x00\x7e\x01\x00\x00\x00\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x12\x00\x13\x00\x00\x00\x3f\x00\x7f\x01\x3d\x00\x3e\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x12\x00\x13\x00\x00\x00\x3f\x00\x00\x00\x3d\x00\x3e\x00\x80\x01\x00\x00\x00\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x12\x00\x13\x00\x00\x00\x3f\x00\x00\x00\x3d\x00\x3e\x00\x83\x01\x00\x00\x00\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x12\x00\x13\x00\x00\x00\x3f\x00\x20\x01\x3d\x00\x3e\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x12\x00\x13\x00\x00\x00\x3f\x00\x00\x00\x3d\x00\x3e\x00\x60\x00\x00\x00\x00\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x12\x00\x13\x00\x00\x00\x3f\x00\x00\x00\x3d\x00\x3e\x00\x00\x00\x00\x00\x6c\x01\x3a\x00\x3b\x00\x3c\x00\x00\x00\x12\x00\x13\x00\x00\x00\x3f\x00\x3d\x00\x3e\x00\x82\x01\x3a\x00\x3b\x00\x3c\x00\x00\x00\x12\x00\x13\x00\x17\x00\x3f\x00\x3d\x00\x3e\x00\x19\x00\x1a\x00\x1b\x00\x60\x01\x87\x00\x88\x00\xa1\x00\x00\x00\x12\x00\x13\x00\xa2\x00\x3f\x00\x3d\x00\x3e\x00\x00\x00\x1c\x00\x3d\x00\x3e\x00\xd7\x00\x10\x00\x11\x00\x12\x00\x13\x00\x00\x00\x3f\x00\x12\x00\x8a\x00\x00\x00\x00\x00\xe9\x00\x00\x00\x00\x00\x12\x00\x13\x00\x31\x00\x3f\x00\x32\x00\x17\x00\x18\x00\x00\x00\x00\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x00\x00\x12\x00\x13\x00\x91\x01\x3f\x00\x12\x00\x13\x00\x00\x00\x3f\x00\x00\x00\x00\x00\x1c\x00\x00\x00\x33\x00\x31\x00\x00\x00\x32\x00\x17\x00\x18\x00\x34\x00\x00\x00\x19\x00\x1a\x00\x1b\x00\xcf\x00\x13\x01\x00\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x36\x00\x00\x00\x1c\x00\x00\x00\x33\x00\x31\x00\x00\x00\x32\x00\x17\x00\x18\x00\x34\x00\xce\x00\x19\x00\x1a\x00\x1b\x00\xcf\x00\x00\x00\x17\x00\xa0\x01\x10\x00\x11\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x36\x00\x00\x00\x1c\x00\x00\x00\x33\x00\x31\x00\x00\x00\x32\x00\x17\x00\x18\x00\x34\x00\x1c\x00\x19\x00\x1a\x00\x1b\x00\x35\x00\x00\x00\x17\x00\x00\x00\x2a\x01\x00\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x36\x00\x00\x00\x1c\x00\xb6\x01\x33\x00\x31\x00\x00\x00\x32\x00\x17\x00\x18\x00\x34\x00\x1c\x00\x19\x00\x1a\x00\x1b\x00\xcf\x00\x00\x00\x17\x00\x00\x00\x2a\x01\x00\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x36\x00\x00\x00\x1c\x00\xb1\x01\x33\x00\x31\x00\x00\x00\x32\x00\x17\x00\x18\x00\x34\x00\x1c\x00\x19\x00\x1a\x00\x1b\x00\x35\x00\x00\x00\x17\x00\x00\x00\x2a\x01\x00\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x36\x00\x00\x00\x1c\x00\x66\x01\x33\x00\x31\x00\x00\x00\x32\x00\x17\x00\x18\x00\x34\x00\x1c\x00\x19\x00\x1a\x00\x1b\x00\xcf\x00\x00\x00\xe7\x00\x00\x00\x2a\x01\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x36\x00\x24\x00\x1c\x00\x2b\x01\xd4\x00\x31\x00\x00\x00\x32\x00\x17\x00\x18\x00\x34\x00\x00\x00\x19\x00\x1a\x00\x1b\x00\xcf\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x00\x00\x00\x00\x36\x00\x00\x00\x1c\x00\x00\x00\x33\x00\x31\x00\x00\x00\x32\x00\x17\x00\x18\x00\x34\x00\x00\x00\x19\x00\x1a\x00\x1b\x00\xcf\x00\x00\x00\x17\x00\xd7\x00\x10\x00\x11\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x36\x00\x00\x00\x1c\x00\x00\x00\x33\x00\x31\x00\x00\x00\x32\x00\x17\x00\x18\x00\x34\x00\x1c\x00\x19\x00\x1a\x00\x1b\x00\x35\x00\x00\x00\x17\x00\x00\x00\x1c\x01\x00\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x36\x00\x00\x00\x1c\x00\x00\x00\x33\x00\x31\x00\x00\x00\x32\x00\x17\x00\x18\x00\x34\x00\x1c\x00\x19\x00\x1a\x00\x1b\x00\xcf\x00\x00\x00\x17\x00\x18\x00\x3e\x01\x00\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x36\x00\x00\x00\x1c\x00\x00\x00\xd4\x00\x31\x00\x00\x00\x32\x00\x17\x00\x18\x00\x34\x00\x1c\x00\x19\x00\x1a\x00\x1b\x00\xcf\x00\x7a\x01\x7b\x01\x7c\x01\x7d\x01\x87\x00\x88\x00\x54\x01\x10\x00\x11\x00\x36\x00\x00\x00\x1c\x00\x00\x00\xd6\x00\x31\x00\x00\x00\x32\x00\x17\x00\x18\x00\x34\x00\x00\x00\x19\x00\x1a\x00\x1b\x00\xcf\x00\x12\x00\x8a\x00\xbc\x01\x7c\x01\x7d\x01\x87\x00\x88\x00\x00\x00\x00\x00\x36\x00\x00\x00\x1c\x00\x00\x00\x33\x00\x31\x00\x00\x00\x32\x00\x17\x00\x18\x00\x34\x00\x00\x00\x19\x00\x1a\x00\x1b\x00\xcf\x00\x00\x00\x12\x00\x8a\x00\x86\x00\x87\x00\x88\x00\x89\x00\x00\x00\x00\x00\x36\x00\x00\x00\x1c\x00\x17\x00\x33\x00\x00\x00\x00\x00\x19\x00\x1a\x00\x1b\x00\x34\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x35\x00\x12\x00\x8a\x00\x8d\x00\x87\x00\x88\x00\x8e\x00\x1c\x00\x17\x00\x5c\x00\x36\x00\x00\x00\x19\x00\x1a\x00\x1b\x00\x5d\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5e\x00\x22\x01\x10\x00\x11\x00\x23\x01\x12\x00\x8a\x00\x1c\x00\x00\x00\x5c\x00\x5f\x00\x00\x00\x5a\x01\x00\x00\x00\x00\x5d\x00\x00\x00\x17\x00\x00\x00\x00\x00\x5e\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x00\x00\x5f\x00\x00\x00\xa1\x00\x69\x01\x10\x00\x11\x00\x1c\x00\x17\x00\x5c\x00\x00\x00\x00\x00\x19\x00\x1a\x00\x1b\x00\x5d\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5e\x00\xa5\x01\x61\x01\x87\x00\x88\x00\x00\x00\x00\x00\x1c\x00\x17\x00\x5c\x00\x5f\x00\x00\x00\x19\x00\x1a\x00\x1b\x00\x5d\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5e\x00\x5c\x01\x00\x00\x00\x00\x12\x00\x8a\x00\x00\x00\x1c\x00\x17\x00\x5c\x00\x5f\x00\x00\x00\x19\x00\x1a\x00\x46\x01\x5d\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5e\x00\x22\x01\x10\x00\x11\x00\x24\x01\x00\x00\x00\x00\x1c\x00\x17\x00\x5c\x00\x5f\x00\x00\x00\x19\x00\x1a\x00\x1b\x00\x5d\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5e\x00\x22\x01\x10\x00\x11\x00\x25\x01\x00\x00\x00\x00\x1c\x00\x17\x00\x5c\x00\x5f\x00\x00\x00\x19\x00\x1a\x00\x1b\x00\x5d\x00\x00\x00\x00\x00\x17\x00\x00\x00\x5e\x00\x00\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x00\x00\x1c\x00\x17\x00\x5c\x00\x5f\x00\x00\x00\x19\x00\x1a\x00\x1b\x00\x8c\x00\xd4\x00\x1c\x00\x00\x00\x00\x00\x5e\x00\x00\x00\x12\x00\x13\x00\xaf\x01\xd2\x00\x00\x00\x1c\x00\x17\x00\x5c\x00\x5f\x00\x85\x00\x19\x00\x1a\x00\x1b\x00\x8c\x00\xc3\x00\x0f\x00\x10\x00\x11\x00\x5e\x00\xd7\x00\x10\x00\x11\x00\x08\x01\x00\x00\x00\x00\x1c\x00\x17\x00\x5c\x00\x5f\x00\x00\x00\x19\x00\x1a\x00\x1b\x00\x8c\x00\x8d\x00\x0d\x01\x2c\x00\x2d\x00\x5e\x00\x2e\x00\x0e\x01\x00\x00\x00\x00\x0f\x01\x13\x00\x1c\x00\x2f\x00\x5c\x00\x5f\x00\x10\x01\x11\x01\x2a\xff\x00\x00\x8c\x00\x2a\xff\x2a\xff\x00\x00\x00\x00\x5e\x00\x2a\xff\x2a\xff\x2a\xff\x2a\xff\x2a\xff\x00\x00\x2a\xff\x2a\xff\x2a\xff\x5f\x00\x00\x00\x2a\xff\x41\x00\x42\x00\x43\x00\x17\x00\x18\x00\x2a\xff\x2a\xff\x19\x00\x1a\x00\x1b\x00\x2a\xff\x2a\xff\x2a\xff\x2a\xff\x2a\xff\x2a\xff\x2a\xff\x2a\xff\x2a\xff\x00\x00\x00\x00\x2a\xff\x1c\x00\x00\x00\x46\x00\x85\x00\x10\x00\x11\x00\x17\x00\x00\x00\x47\x00\x00\x00\x19\x00\x1a\x00\x1b\x00\x48\x00\x00\x00\x49\x00\x00\x00\x00\x00\x4a\x00\x86\x00\x87\x00\x88\x00\x89\x00\xa7\x00\x00\x00\x1c\x00\x17\x00\x18\x00\x00\x00\x17\x00\x19\x00\x1a\x00\x1b\x00\x19\x00\x1a\x00\x1b\x00\xd7\x00\x10\x00\x11\x00\xb2\x00\x00\x00\x12\x00\x8a\x00\x00\x00\x00\x00\x1c\x00\x00\x00\x00\x00\x1c\x00\x00\x00\x26\xff\x00\x00\x00\x00\xa8\x00\xdc\x00\x0f\x00\x10\x00\x11\x00\xa9\x00\x26\xff\x26\xff\x6e\x01\xcb\x00\x00\x00\x26\xff\x26\xff\x26\xff\x26\xff\x26\xff\x26\xff\x26\xff\x26\xff\x26\xff\xec\x00\xed\x00\x26\xff\x00\x00\xc5\x00\xc6\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\xed\x00\xc7\x00\xc8\x00\xc9\x00\x73\x01\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\xc1\x01\x29\x00\x2a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2b\x00\x2c\x00\x2d\x00\x00\x00\x2e\x00\xa6\x01\x29\x00\x2a\x00\x12\x00\x13\x00\x00\x00\x2f\x00\x00\x00\x2b\x00\x2c\x00\x2d\x00\x00\x00\x2e\x00\x18\x01\x29\x00\x2a\x00\x12\x00\x13\x00\x00\x00\x2f\x00\x00\x00\x2b\x00\x2c\x00\x2d\x00\x00\x00\x2e\x00\x28\x00\x29\x00\x2a\x00\x12\x00\x13\x00\x00\x00\x2f\x00\x00\x00\x2b\x00\x2c\x00\x2d\x00\x00\x00\x2e\x00\x00\x00\x00\x00\x00\x00\x12\x00\x13\x00\x00\x00\x2f\x00\x17\x00\x28\x00\x00\x00\x17\x00\x19\x00\x1a\x00\x1b\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x88\x01\x00\x00\x00\x00\x00\x00\x00\x00\x89\x01\x2c\x00\x2d\x00\x1c\x00\x2e\x00\x53\xff\x1c\x00\x00\x00\x12\x00\x13\x00\x00\x00\x2f\x00\x00\x00\x00\x00\xc5\x00\x53\xff\x53\xff\x53\xff\x53\xff\x53\xff\x53\xff\x53\xff\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\xd9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\xcb\x00\x2c\x00\x2d\x00\x00\x00\x2e\x00\xcc\x00\x00\x00\x00\x00\x12\x00\x13\x00\x00\x00\x2f\x00\x89\x01\x2c\x00\x2d\x00\x00\x00\x2e\x00\x00\x00\x00\x00\x00\x00\x12\x00\x13\x00\x00\x00\x2f\x00\x9b\x01\x2c\x00\x2d\x00\x00\x00\x2e\x00\x00\x00\x00\x00\x00\x00\x12\x00\x13\x00\x00\x00\x2f\x00\xa1\x01\x2c\x00\x2d\x00\x00\x00\x2e\x00\x00\x00\x00\x00\x00\x00\x12\x00\x13\x00\x00\x00\x2f\x00\x5f\x01\x2c\x00\x2d\x00\x00\x00\x2e\x00\x00\x00\x00\x00\x00\x00\x12\x00\x13\x00\x00\x00\x2f\x00\x62\x01\x2c\x00\x2d\x00\x00\x00\x2e\x00\x00\x00\x00\x00\x00\x00\x12\x00\x13\x00\x00\x00\x2f\x00\x8c\x01\x2c\x00\x2d\x00\x00\x00\x2e\x00\x00\x00\x00\x00\x00\x00\x12\x00\x13\x00\x00\x00\x2f\x00\x8d\x01\x2c\x00\x2d\x00\x00\x00\x2e\x00\x00\x00\x00\x00\x00\x00\x12\x00\x13\x00\x00\x00\x2f\x00\xe0\x00\x2c\x00\x2d\x00\x00\x00\x2e\x00\x00\x00\x00\x00\x00\x00\x12\x00\x13\x00\x00\x00\x2f\x00\xe2\x00\x2c\x00\x2d\x00\x00\x00\x2e\x00\x00\x00\x00\x00\x00\x00\x12\x00\x13\x00\x00\x00\x2f\x00\xe3\x00\x2c\x00\x2d\x00\x00\x00\x2e\x00\x00\x00\x00\x00\x00\x00\x12\x00\x13\x00\x00\x00\x2f\x00\xe4\x00\x2c\x00\x2d\x00\x00\x00\x2e\x00\x00\x00\x00\x00\x00\x00\x12\x00\x13\x00\x00\x00\x2f\x00\xf2\x00\x2c\x00\x2d\x00\x00\x00\x2e\x00\x00\x00\x00\x00\x00\x00\x12\x00\x13\x00\x00\x00\x2f\x00\x13\x01\x2c\x00\x2d\x00\x00\x00\x2e\x00\x00\x00\x00\x00\x00\x00\x12\x00\x13\x00\x00\x00\x2f\x00\xcf\x00\x2c\x00\x2d\x00\x00\x00\x2e\x00\x00\x00\x00\x00\x00\x00\x12\x00\x13\x00\x00\x00\x2f\x00\xd9\x00\x2c\x00\x2d\x00\x00\x00\x2e\x00\x00\x00\x00\x00\x00\x00\x12\x00\x13\x00\x00\x00\x2f\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"#++happyReduceArr = Happy_Data_Array.array (12, 251) [+	(12 , happyReduce_12),+	(13 , happyReduce_13),+	(14 , happyReduce_14),+	(15 , happyReduce_15),+	(16 , happyReduce_16),+	(17 , happyReduce_17),+	(18 , happyReduce_18),+	(19 , happyReduce_19),+	(20 , happyReduce_20),+	(21 , happyReduce_21),+	(22 , happyReduce_22),+	(23 , happyReduce_23),+	(24 , happyReduce_24),+	(25 , happyReduce_25),+	(26 , happyReduce_26),+	(27 , happyReduce_27),+	(28 , happyReduce_28),+	(29 , happyReduce_29),+	(30 , happyReduce_30),+	(31 , happyReduce_31),+	(32 , happyReduce_32),+	(33 , happyReduce_33),+	(34 , happyReduce_34),+	(35 , happyReduce_35),+	(36 , happyReduce_36),+	(37 , happyReduce_37),+	(38 , happyReduce_38),+	(39 , happyReduce_39),+	(40 , happyReduce_40),+	(41 , happyReduce_41),+	(42 , happyReduce_42),+	(43 , happyReduce_43),+	(44 , happyReduce_44),+	(45 , happyReduce_45),+	(46 , happyReduce_46),+	(47 , happyReduce_47),+	(48 , happyReduce_48),+	(49 , happyReduce_49),+	(50 , happyReduce_50),+	(51 , happyReduce_51),+	(52 , happyReduce_52),+	(53 , happyReduce_53),+	(54 , happyReduce_54),+	(55 , happyReduce_55),+	(56 , happyReduce_56),+	(57 , happyReduce_57),+	(58 , happyReduce_58),+	(59 , happyReduce_59),+	(60 , happyReduce_60),+	(61 , happyReduce_61),+	(62 , happyReduce_62),+	(63 , happyReduce_63),+	(64 , happyReduce_64),+	(65 , happyReduce_65),+	(66 , happyReduce_66),+	(67 , happyReduce_67),+	(68 , happyReduce_68),+	(69 , happyReduce_69),+	(70 , happyReduce_70),+	(71 , happyReduce_71),+	(72 , happyReduce_72),+	(73 , happyReduce_73),+	(74 , happyReduce_74),+	(75 , happyReduce_75),+	(76 , happyReduce_76),+	(77 , happyReduce_77),+	(78 , happyReduce_78),+	(79 , happyReduce_79),+	(80 , happyReduce_80),+	(81 , happyReduce_81),+	(82 , happyReduce_82),+	(83 , happyReduce_83),+	(84 , happyReduce_84),+	(85 , happyReduce_85),+	(86 , happyReduce_86),+	(87 , happyReduce_87),+	(88 , happyReduce_88),+	(89 , happyReduce_89),+	(90 , happyReduce_90),+	(91 , happyReduce_91),+	(92 , happyReduce_92),+	(93 , happyReduce_93),+	(94 , happyReduce_94),+	(95 , happyReduce_95),+	(96 , happyReduce_96),+	(97 , happyReduce_97),+	(98 , happyReduce_98),+	(99 , happyReduce_99),+	(100 , happyReduce_100),+	(101 , happyReduce_101),+	(102 , happyReduce_102),+	(103 , happyReduce_103),+	(104 , happyReduce_104),+	(105 , happyReduce_105),+	(106 , happyReduce_106),+	(107 , happyReduce_107),+	(108 , happyReduce_108),+	(109 , happyReduce_109),+	(110 , happyReduce_110),+	(111 , happyReduce_111),+	(112 , happyReduce_112),+	(113 , happyReduce_113),+	(114 , happyReduce_114),+	(115 , happyReduce_115),+	(116 , happyReduce_116),+	(117 , happyReduce_117),+	(118 , happyReduce_118),+	(119 , happyReduce_119),+	(120 , happyReduce_120),+	(121 , happyReduce_121),+	(122 , happyReduce_122),+	(123 , happyReduce_123),+	(124 , happyReduce_124),+	(125 , happyReduce_125),+	(126 , happyReduce_126),+	(127 , happyReduce_127),+	(128 , happyReduce_128),+	(129 , happyReduce_129),+	(130 , happyReduce_130),+	(131 , happyReduce_131),+	(132 , happyReduce_132),+	(133 , happyReduce_133),+	(134 , happyReduce_134),+	(135 , happyReduce_135),+	(136 , happyReduce_136),+	(137 , happyReduce_137),+	(138 , happyReduce_138),+	(139 , happyReduce_139),+	(140 , happyReduce_140),+	(141 , happyReduce_141),+	(142 , happyReduce_142),+	(143 , happyReduce_143),+	(144 , happyReduce_144),+	(145 , happyReduce_145),+	(146 , happyReduce_146),+	(147 , happyReduce_147),+	(148 , happyReduce_148),+	(149 , happyReduce_149),+	(150 , happyReduce_150),+	(151 , happyReduce_151),+	(152 , happyReduce_152),+	(153 , happyReduce_153),+	(154 , happyReduce_154),+	(155 , happyReduce_155),+	(156 , happyReduce_156),+	(157 , happyReduce_157),+	(158 , happyReduce_158),+	(159 , happyReduce_159),+	(160 , happyReduce_160),+	(161 , happyReduce_161),+	(162 , happyReduce_162),+	(163 , happyReduce_163),+	(164 , happyReduce_164),+	(165 , happyReduce_165),+	(166 , happyReduce_166),+	(167 , happyReduce_167),+	(168 , happyReduce_168),+	(169 , happyReduce_169),+	(170 , happyReduce_170),+	(171 , happyReduce_171),+	(172 , happyReduce_172),+	(173 , happyReduce_173),+	(174 , happyReduce_174),+	(175 , happyReduce_175),+	(176 , happyReduce_176),+	(177 , happyReduce_177),+	(178 , happyReduce_178),+	(179 , happyReduce_179),+	(180 , happyReduce_180),+	(181 , happyReduce_181),+	(182 , happyReduce_182),+	(183 , happyReduce_183),+	(184 , happyReduce_184),+	(185 , happyReduce_185),+	(186 , happyReduce_186),+	(187 , happyReduce_187),+	(188 , happyReduce_188),+	(189 , happyReduce_189),+	(190 , happyReduce_190),+	(191 , happyReduce_191),+	(192 , happyReduce_192),+	(193 , happyReduce_193),+	(194 , happyReduce_194),+	(195 , happyReduce_195),+	(196 , happyReduce_196),+	(197 , happyReduce_197),+	(198 , happyReduce_198),+	(199 , happyReduce_199),+	(200 , happyReduce_200),+	(201 , happyReduce_201),+	(202 , happyReduce_202),+	(203 , happyReduce_203),+	(204 , happyReduce_204),+	(205 , happyReduce_205),+	(206 , happyReduce_206),+	(207 , happyReduce_207),+	(208 , happyReduce_208),+	(209 , happyReduce_209),+	(210 , happyReduce_210),+	(211 , happyReduce_211),+	(212 , happyReduce_212),+	(213 , happyReduce_213),+	(214 , happyReduce_214),+	(215 , happyReduce_215),+	(216 , happyReduce_216),+	(217 , happyReduce_217),+	(218 , happyReduce_218),+	(219 , happyReduce_219),+	(220 , happyReduce_220),+	(221 , happyReduce_221),+	(222 , happyReduce_222),+	(223 , happyReduce_223),+	(224 , happyReduce_224),+	(225 , happyReduce_225),+	(226 , happyReduce_226),+	(227 , happyReduce_227),+	(228 , happyReduce_228),+	(229 , happyReduce_229),+	(230 , happyReduce_230),+	(231 , happyReduce_231),+	(232 , happyReduce_232),+	(233 , happyReduce_233),+	(234 , happyReduce_234),+	(235 , happyReduce_235),+	(236 , happyReduce_236),+	(237 , happyReduce_237),+	(238 , happyReduce_238),+	(239 , happyReduce_239),+	(240 , happyReduce_240),+	(241 , happyReduce_241),+	(242 , happyReduce_242),+	(243 , happyReduce_243),+	(244 , happyReduce_244),+	(245 , happyReduce_245),+	(246 , happyReduce_246),+	(247 , happyReduce_247),+	(248 , happyReduce_248),+	(249 , happyReduce_249),+	(250 , happyReduce_250),+	(251 , happyReduce_251)+	]++happy_n_terms = 60 :: Int+happy_n_nonterms = 84 :: Int++happyReduce_12 = happyReduce 6# 0# happyReduction_12+happyReduction_12 (happy_x_6 `HappyStk`+	happy_x_5 `HappyStk`+	happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest)+	 = case happyOut93 happy_x_2 of { happy_var_2 -> +	case happyOut16 happy_x_5 of { happy_var_5 -> +	happyIn15+		 (let (is,ts) = happy_var_5 in Module happy_var_2 is ts+	) `HappyStk` happyRest}}++happyReduce_13 = happySpecReduce_3  0# happyReduction_13+happyReduction_13 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut16 happy_x_2 of { happy_var_2 -> +	happyIn15+		 (let { (is,ts) = happy_var_2+            -- XXX make a location from is and ts+          ; modName = Located { srcRange = emptyRange+                              , thing    = mkModName ["Main"]+                              }+          } in Module modName is ts+	)}++happyReduce_14 = happySpecReduce_3  1# happyReduction_14+happyReduction_14 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut17 happy_x_1 of { happy_var_1 -> +	case happyOut26 happy_x_3 of { happy_var_3 -> +	happyIn16+		 ((reverse happy_var_1, reverse happy_var_3)+	)}}++happyReduce_15 = happySpecReduce_3  1# happyReduction_15+happyReduction_15 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut17 happy_x_1 of { happy_var_1 -> +	case happyOut26 happy_x_3 of { happy_var_3 -> +	happyIn16+		 ((reverse happy_var_1, reverse happy_var_3)+	)}}++happyReduce_16 = happySpecReduce_1  1# happyReduction_16+happyReduction_16 happy_x_1+	 =  case happyOut17 happy_x_1 of { happy_var_1 -> +	happyIn16+		 ((reverse happy_var_1, [])+	)}++happyReduce_17 = happySpecReduce_1  1# happyReduction_17+happyReduction_17 happy_x_1+	 =  case happyOut26 happy_x_1 of { happy_var_1 -> +	happyIn16+		 (([], reverse happy_var_1)+	)}++happyReduce_18 = happySpecReduce_0  1# happyReduction_18+happyReduction_18  =  happyIn16+		 (([], [])+	)++happyReduce_19 = happySpecReduce_3  2# happyReduction_19+happyReduction_19 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut17 happy_x_1 of { happy_var_1 -> +	case happyOut18 happy_x_3 of { happy_var_3 -> +	happyIn17+		 (happy_var_3 : happy_var_1+	)}}++happyReduce_20 = happySpecReduce_3  2# happyReduction_20+happyReduction_20 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut17 happy_x_1 of { happy_var_1 -> +	case happyOut18 happy_x_3 of { happy_var_3 -> +	happyIn17+		 (happy_var_3 : happy_var_1+	)}}++happyReduce_21 = happySpecReduce_1  2# happyReduction_21+happyReduction_21 happy_x_1+	 =  case happyOut18 happy_x_1 of { happy_var_1 -> +	happyIn17+		 ([happy_var_1]+	)}++happyReduce_22 = happyReduce 4# 3# happyReduction_22+happyReduction_22 (happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest)+	 = case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (KW KW_import)    _)) -> +	case happyOut93 happy_x_2 of { happy_var_2 -> +	case happyOut19 happy_x_3 of { happy_var_3 -> +	case happyOut20 happy_x_4 of { happy_var_4 -> +	happyIn18+		 (Located { srcRange = rComb happy_var_1+                                                   $ fromMaybe (srcRange happy_var_2)+                                                   $ msum [ fmap srcRange happy_var_4+                                                          , fmap srcRange happy_var_3+                                                          ]+                                        , thing    = Import+                                          { iModule    = thing happy_var_2+                                          , iAs        = fmap thing happy_var_3+                                          , iSpec      = fmap thing happy_var_4+                                          }+                                        }+	) `HappyStk` happyRest}}}}++happyReduce_23 = happySpecReduce_2  4# happyReduction_23+happyReduction_23 happy_x_2+	happy_x_1+	 =  case happyOut93 happy_x_2 of { happy_var_2 -> +	happyIn19+		 (Just happy_var_2+	)}++happyReduce_24 = happySpecReduce_0  4# happyReduction_24+happyReduction_24  =  happyIn19+		 (Nothing+	)++happyReduce_25 = happyReduce 4# 5# happyReduction_25+happyReduction_25 (happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest)+	 = case happyOut22 happy_x_1 of { happy_var_1 -> +	case happyOut21 happy_x_3 of { happy_var_3 -> +	happyIn20+		 (Just Located+                                  { srcRange = case happy_var_3 of+                                      { [] -> emptyRange+                                      ; xs -> rCombs (map srcRange xs) }+                                  , thing    = happy_var_1 (reverse (map thing happy_var_3))+                                  }+	) `HappyStk` happyRest}}++happyReduce_26 = happySpecReduce_0  5# happyReduction_26+happyReduction_26  =  happyIn20+		 (Nothing+	)++happyReduce_27 = happySpecReduce_3  6# happyReduction_27+happyReduction_27 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut21 happy_x_1 of { happy_var_1 -> +	case happyOut91 happy_x_3 of { happy_var_3 -> +	happyIn21+		 (happy_var_3 : happy_var_1+	)}}++happyReduce_28 = happySpecReduce_1  6# happyReduction_28+happyReduction_28 happy_x_1+	 =  case happyOut91 happy_x_1 of { happy_var_1 -> +	happyIn21+		 ([happy_var_1]+	)}++happyReduce_29 = happySpecReduce_0  6# happyReduction_29+happyReduction_29  =  happyIn21+		 ([]+	)++happyReduce_30 = happySpecReduce_1  7# happyReduction_30+happyReduction_30 happy_x_1+	 =  happyIn22+		 (Hiding+	)++happyReduce_31 = happySpecReduce_0  7# happyReduction_31+happyReduction_31  =  happyIn22+		 (Only+	)++happyReduce_32 = happySpecReduce_1  8# happyReduction_32+happyReduction_32 happy_x_1+	 =  case happyOut25 happy_x_1 of { happy_var_1 -> +	happyIn23+		 (Program (reverse happy_var_1)+	)}++happyReduce_33 = happySpecReduce_0  8# happyReduction_33+happyReduction_33  =  happyIn23+		 (Program []+	)++happyReduce_34 = happySpecReduce_3  9# happyReduction_34+happyReduction_34 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut26 happy_x_2 of { happy_var_2 -> +	happyIn24+		 (Program (reverse happy_var_2)+	)}++happyReduce_35 = happySpecReduce_2  9# happyReduction_35+happyReduction_35 happy_x_2+	happy_x_1+	 =  happyIn24+		 (Program []+	)++happyReduce_36 = happySpecReduce_2  10# happyReduction_36+happyReduction_36 happy_x_2+	happy_x_1+	 =  case happyOut28 happy_x_1 of { happy_var_1 -> +	happyIn25+		 (happy_var_1+	)}++happyReduce_37 = happySpecReduce_3  10# happyReduction_37+happyReduction_37 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut25 happy_x_1 of { happy_var_1 -> +	case happyOut28 happy_x_2 of { happy_var_2 -> +	happyIn25+		 (happy_var_2 ++ happy_var_1+	)}}++happyReduce_38 = happySpecReduce_1  11# happyReduction_38+happyReduction_38 happy_x_1+	 =  case happyOut27 happy_x_1 of { happy_var_1 -> +	happyIn26+		 (happy_var_1+	)}++happyReduce_39 = happySpecReduce_3  11# happyReduction_39+happyReduction_39 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut26 happy_x_1 of { happy_var_1 -> +	case happyOut27 happy_x_3 of { happy_var_3 -> +	happyIn26+		 (happy_var_3 ++ happy_var_1+	)}}++happyReduce_40 = happySpecReduce_3  11# happyReduction_40+happyReduction_40 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut26 happy_x_1 of { happy_var_1 -> +	case happyOut27 happy_x_3 of { happy_var_3 -> +	happyIn26+		 (happy_var_3 ++ happy_var_1+	)}}++happyReduce_41 = happySpecReduce_1  12# happyReduction_41+happyReduction_41 happy_x_1+	 =  case happyOut33 happy_x_1 of { happy_var_1 -> +	happyIn27+		 ([exportDecl Nothing   Public happy_var_1]+	)}++happyReduce_42 = happySpecReduce_2  12# happyReduction_42+happyReduction_42 happy_x_2+	happy_x_1+	 =  case happyOut31 happy_x_1 of { happy_var_1 -> +	case happyOut33 happy_x_2 of { happy_var_2 -> +	happyIn27+		 ([exportDecl (Just happy_var_1) Public happy_var_2]+	)}}++happyReduce_43 = happyMonadReduce 3# 12# happyReduction_43+happyReduction_43 (happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOutTok happy_x_3 of { (happy_var_3@(Located _ (Token (StrLit {}) _))) -> +	( (return . Include) `fmap` fromStrLit happy_var_3)}+	) (\r -> happyReturn (happyIn27 r))++happyReduce_44 = happyReduce 6# 12# happyReduction_44+happyReduction_44 (happy_x_6 `HappyStk`+	happy_x_5 `HappyStk`+	happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest)+	 = case happyOut32 happy_x_1 of { happy_var_1 -> +	case happyOut92 happy_x_3 of { happy_var_3 -> +	case happyOut39 happy_x_4 of { happy_var_4 -> +	case happyOut45 happy_x_6 of { happy_var_6 -> +	happyIn27+		 ([exportDecl happy_var_1 Public (mkProperty happy_var_3 happy_var_4 happy_var_6)]+	) `HappyStk` happyRest}}}}++happyReduce_45 = happyReduce 5# 12# happyReduction_45+happyReduction_45 (happy_x_5 `HappyStk`+	happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest)+	 = case happyOut32 happy_x_1 of { happy_var_1 -> +	case happyOut92 happy_x_3 of { happy_var_3 -> +	case happyOut45 happy_x_5 of { happy_var_5 -> +	happyIn27+		 ([exportDecl happy_var_1 Public (mkProperty happy_var_3 [] happy_var_5)]+	) `HappyStk` happyRest}}}++happyReduce_46 = happySpecReduce_2  12# happyReduction_46+happyReduction_46 happy_x_2+	happy_x_1+	 =  case happyOut35 happy_x_2 of { happy_var_2 -> +	happyIn27+		 ([exportNewtype Public happy_var_2]+	)}++happyReduce_47 = happySpecReduce_1  12# happyReduction_47+happyReduction_47 happy_x_1+	 =  case happyOut30 happy_x_1 of { happy_var_1 -> +	happyIn27+		 (happy_var_1+	)}++happyReduce_48 = happySpecReduce_1  12# happyReduction_48+happyReduction_48 happy_x_1+	 =  case happyOut29 happy_x_1 of { happy_var_1 -> +	happyIn27+		 (happy_var_1+	)}++happyReduce_49 = happySpecReduce_1  13# happyReduction_49+happyReduction_49 happy_x_1+	 =  case happyOut33 happy_x_1 of { happy_var_1 -> +	happyIn28+		 ([Decl (TopLevel {tlExport = Public, tlValue = happy_var_1 })]+	)}++happyReduce_50 = happyMonadReduce 2# 13# happyReduction_50+happyReduction_50 (happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOutTok happy_x_2 of { (happy_var_2@(Located _ (Token (StrLit {}) _))) -> +	( (return . Include) `fmap` fromStrLit happy_var_2)}+	) (\r -> happyReturn (happyIn28 r))++happyReduce_51 = happySpecReduce_1  13# happyReduction_51+happyReduction_51 happy_x_1+	 =  case happyOut30 happy_x_1 of { happy_var_1 -> +	happyIn28+		 (happy_var_1+	)}++happyReduce_52 = happyReduce 4# 14# happyReduction_52+happyReduction_52 (happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest)+	 = case happyOut26 happy_x_3 of { happy_var_3 -> +	happyIn29+		 (changeExport Private (reverse happy_var_3)+	) `HappyStk` happyRest}++happyReduce_53 = happyReduce 5# 14# happyReduction_53+happyReduction_53 (happy_x_5 `HappyStk`+	happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest)+	 = case happyOut26 happy_x_4 of { happy_var_4 -> +	happyIn29+		 (changeExport Private (reverse happy_var_4)+	) `HappyStk` happyRest}++happyReduce_54 = happyReduce 5# 15# happyReduction_54+happyReduction_54 (happy_x_5 `HappyStk`+	happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest)+	 = case happyOut32 happy_x_1 of { happy_var_1 -> +	case happyOut92 happy_x_3 of { happy_var_3 -> +	case happyOut75 happy_x_5 of { happy_var_5 -> +	happyIn30+		 (mkPrimDecl happy_var_1 happy_var_3 happy_var_5+	) `HappyStk` happyRest}}}++happyReduce_55 = happyReduce 7# 15# happyReduction_55+happyReduction_55 (happy_x_7 `HappyStk`+	happy_x_6 `HappyStk`+	happy_x_5 `HappyStk`+	happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest)+	 = case happyOut32 happy_x_1 of { happy_var_1 -> +	case happyOut53 happy_x_4 of { happy_var_4 -> +	case happyOut75 happy_x_7 of { happy_var_7 -> +	happyIn30+		 (mkPrimDecl happy_var_1 happy_var_4 happy_var_7+	) `HappyStk` happyRest}}}++happyReduce_56 = happySpecReduce_1  16# happyReduction_56+happyReduction_56 happy_x_1+	 =  case happyOutTok happy_x_1 of { (happy_var_1@(Located _ (Token (White DocStr) _))) -> +	happyIn31+		 (mkDoc (fmap tokenText happy_var_1)+	)}++happyReduce_57 = happySpecReduce_1  17# happyReduction_57+happyReduction_57 happy_x_1+	 =  case happyOut31 happy_x_1 of { happy_var_1 -> +	happyIn32+		 (Just happy_var_1+	)}++happyReduce_58 = happySpecReduce_0  17# happyReduction_58+happyReduction_58  =  happyIn32+		 (Nothing+	)++happyReduce_59 = happySpecReduce_3  18# happyReduction_59+happyReduction_59 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut37 happy_x_1 of { happy_var_1 -> +	case happyOut75 happy_x_3 of { happy_var_3 -> +	happyIn33+		 (at (head happy_var_1,happy_var_3) $ DSignature (reverse happy_var_1) happy_var_3+	)}}++happyReduce_60 = happySpecReduce_3  18# happyReduction_60+happyReduction_60 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut70 happy_x_1 of { happy_var_1 -> +	case happyOut45 happy_x_3 of { happy_var_3 -> +	happyIn33+		 (at (happy_var_1,happy_var_3) $ DPatBind happy_var_1 happy_var_3+	)}}++happyReduce_61 = happyReduce 5# 18# happyReduction_61+happyReduction_61 (happy_x_5 `HappyStk`+	happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest)+	 = case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym ParenL  ) _)) -> +	case happyOut53 happy_x_2 of { happy_var_2 -> +	case happyOut45 happy_x_5 of { happy_var_5 -> +	happyIn33+		 (at (happy_var_1,happy_var_5) $ DPatBind (PVar happy_var_2) happy_var_5+	) `HappyStk` happyRest}}}++happyReduce_62 = happyReduce 4# 18# happyReduction_62+happyReduction_62 (happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest)+	 = case happyOut38 happy_x_1 of { happy_var_1 -> +	case happyOut39 happy_x_2 of { happy_var_2 -> +	case happyOut45 happy_x_4 of { happy_var_4 -> +	happyIn33+		 (at (happy_var_1,happy_var_4) $+                             DBind $ Bind { bName      = happy_var_1+                                          , bParams    = reverse happy_var_2+                                          , bDef       = at happy_var_4 (Located emptyRange (DExpr happy_var_4))+                                          , bSignature = Nothing+                                          , bPragmas   = []+                                          , bMono      = False+                                          , bInfix     = False+                                          , bFixity    = Nothing+                                          , bDoc       = Nothing+                                          }+	) `HappyStk` happyRest}}}++happyReduce_63 = happyReduce 5# 18# happyReduction_63+happyReduction_63 (happy_x_5 `HappyStk`+	happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest)+	 = case happyOut71 happy_x_1 of { happy_var_1 -> +	case happyOut54 happy_x_2 of { happy_var_2 -> +	case happyOut71 happy_x_3 of { happy_var_3 -> +	case happyOut45 happy_x_5 of { happy_var_5 -> +	happyIn33+		 (at (happy_var_1,happy_var_5) $+                             DBind $ Bind { bName      = happy_var_2+                                          , bParams    = [happy_var_1,happy_var_3]+                                          , bDef       = at happy_var_5 (Located emptyRange (DExpr happy_var_5))+                                          , bSignature = Nothing+                                          , bPragmas   = []+                                          , bMono      = False+                                          , bInfix     = True+                                          , bFixity    = Nothing+                                          , bDoc       = Nothing+                                          }+	) `HappyStk` happyRest}}}}++happyReduce_64 = happyMonadReduce 4# 18# happyReduction_64+happyReduction_64 (happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (KW KW_type   ) _)) -> +	case happyOut92 happy_x_2 of { happy_var_2 -> +	case happyOut83 happy_x_4 of { happy_var_4 -> +	( at (happy_var_1,happy_var_4) `fmap` mkTySyn happy_var_2 [] happy_var_4)}}}+	) (\r -> happyReturn (happyIn33 r))++happyReduce_65 = happyMonadReduce 5# 18# happyReduction_65+happyReduction_65 (happy_x_5 `HappyStk`+	happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (KW KW_type   ) _)) -> +	case happyOut92 happy_x_2 of { happy_var_2 -> +	case happyOut82 happy_x_3 of { happy_var_3 -> +	case happyOut83 happy_x_5 of { happy_var_5 -> +	( at (happy_var_1,happy_var_5) `fmap` mkTySyn happy_var_2 (reverse happy_var_3) happy_var_5)}}}}+	) (\r -> happyReturn (happyIn33 r))++happyReduce_66 = happyMonadReduce 3# 18# happyReduction_66+happyReduction_66 (happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOutTok happy_x_2 of { (happy_var_2@(Located _ (Token (Num   {}) _))) -> +	case happyOut56 happy_x_3 of { happy_var_3 -> +	( mkFixity LeftAssoc  happy_var_2 (reverse happy_var_3))}}+	) (\r -> happyReturn (happyIn33 r))++happyReduce_67 = happyMonadReduce 3# 18# happyReduction_67+happyReduction_67 (happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOutTok happy_x_2 of { (happy_var_2@(Located _ (Token (Num   {}) _))) -> +	case happyOut56 happy_x_3 of { happy_var_3 -> +	( mkFixity RightAssoc happy_var_2 (reverse happy_var_3))}}+	) (\r -> happyReturn (happyIn33 r))++happyReduce_68 = happyMonadReduce 3# 18# happyReduction_68+happyReduction_68 (happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOutTok happy_x_2 of { (happy_var_2@(Located _ (Token (Num   {}) _))) -> +	case happyOut56 happy_x_3 of { happy_var_3 -> +	( mkFixity NonAssoc   happy_var_2 (reverse happy_var_3))}}+	) (\r -> happyReturn (happyIn33 r))++happyReduce_69 = happyReduce 4# 19# happyReduction_69+happyReduction_69 (happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest)+	 = case happyOut70 happy_x_2 of { happy_var_2 -> +	case happyOut45 happy_x_4 of { happy_var_4 -> +	happyIn34+		 (at (happy_var_2,happy_var_4) $ DPatBind happy_var_2 happy_var_4+	) `HappyStk` happyRest}}++happyReduce_70 = happyReduce 5# 19# happyReduction_70+happyReduction_70 (happy_x_5 `HappyStk`+	happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest)+	 = case happyOut92 happy_x_2 of { happy_var_2 -> +	case happyOut39 happy_x_3 of { happy_var_3 -> +	case happyOut45 happy_x_5 of { happy_var_5 -> +	happyIn34+		 (at (happy_var_2,happy_var_5) $+                                   DBind $ Bind { bName      = happy_var_2+                                                , bParams    = reverse happy_var_3+                                                , bDef       = at happy_var_5 (Located emptyRange (DExpr happy_var_5))+                                                , bSignature = Nothing+                                                , bPragmas   = []+                                                , bMono      = False+                                                , bInfix     = False+                                                , bFixity    = Nothing+                                                , bDoc       = Nothing+                                                }+	) `HappyStk` happyRest}}}++happyReduce_71 = happyReduce 4# 20# happyReduction_71+happyReduction_71 (happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest)+	 = case happyOut94 happy_x_2 of { happy_var_2 -> +	case happyOut36 happy_x_4 of { happy_var_4 -> +	happyIn35+		 (Newtype { nName = happy_var_2, nParams = [], nBody = happy_var_4 }+	) `HappyStk` happyRest}}++happyReduce_72 = happyReduce 5# 20# happyReduction_72+happyReduction_72 (happy_x_5 `HappyStk`+	happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest)+	 = case happyOut94 happy_x_2 of { happy_var_2 -> +	case happyOut82 happy_x_3 of { happy_var_3 -> +	case happyOut36 happy_x_5 of { happy_var_5 -> +	happyIn35+		 (Newtype { nName = happy_var_2, nParams = happy_var_3, nBody = happy_var_5 }+	) `HappyStk` happyRest}}}++happyReduce_73 = happySpecReduce_2  21# happyReduction_73+happyReduction_73 happy_x_2+	happy_x_1+	 =  happyIn36+		 ([]+	)++happyReduce_74 = happySpecReduce_3  21# happyReduction_74+happyReduction_74 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut90 happy_x_2 of { happy_var_2 -> +	happyIn36+		 (happy_var_2+	)}++happyReduce_75 = happySpecReduce_1  22# happyReduction_75+happyReduction_75 happy_x_1+	 =  case happyOut38 happy_x_1 of { happy_var_1 -> +	happyIn37+		 ([ happy_var_1]+	)}++happyReduce_76 = happySpecReduce_3  22# happyReduction_76+happyReduction_76 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut37 happy_x_1 of { happy_var_1 -> +	case happyOut38 happy_x_3 of { happy_var_3 -> +	happyIn37+		 (happy_var_3 : happy_var_1+	)}}++happyReduce_77 = happySpecReduce_1  23# happyReduction_77+happyReduction_77 happy_x_1+	 =  case happyOut92 happy_x_1 of { happy_var_1 -> +	happyIn38+		 (happy_var_1+	)}++happyReduce_78 = happySpecReduce_3  23# happyReduction_78+happyReduction_78 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut53 happy_x_2 of { happy_var_2 -> +	happyIn38+		 (happy_var_2+	)}++happyReduce_79 = happySpecReduce_1  24# happyReduction_79+happyReduction_79 happy_x_1+	 =  case happyOut71 happy_x_1 of { happy_var_1 -> +	happyIn39+		 ([happy_var_1]+	)}++happyReduce_80 = happySpecReduce_2  24# happyReduction_80+happyReduction_80 happy_x_2+	happy_x_1+	 =  case happyOut40 happy_x_1 of { happy_var_1 -> +	case happyOut71 happy_x_2 of { happy_var_2 -> +	happyIn39+		 (happy_var_2 : happy_var_1+	)}}++happyReduce_81 = happySpecReduce_1  25# happyReduction_81+happyReduction_81 happy_x_1+	 =  case happyOut71 happy_x_1 of { happy_var_1 -> +	happyIn40+		 ([happy_var_1]+	)}++happyReduce_82 = happySpecReduce_2  25# happyReduction_82+happyReduction_82 happy_x_2+	happy_x_1+	 =  case happyOut40 happy_x_1 of { happy_var_1 -> +	case happyOut71 happy_x_2 of { happy_var_2 -> +	happyIn40+		 (happy_var_2 : happy_var_1+	)}}++happyReduce_83 = happySpecReduce_2  26# happyReduction_83+happyReduction_83 happy_x_2+	happy_x_1+	 =  case happyOut33 happy_x_1 of { happy_var_1 -> +	happyIn41+		 ([happy_var_1]+	)}++happyReduce_84 = happySpecReduce_3  26# happyReduction_84+happyReduction_84 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut41 happy_x_1 of { happy_var_1 -> +	case happyOut33 happy_x_2 of { happy_var_2 -> +	happyIn41+		 (happy_var_2 : happy_var_1+	)}}++happyReduce_85 = happySpecReduce_1  27# happyReduction_85+happyReduction_85 happy_x_1+	 =  case happyOut33 happy_x_1 of { happy_var_1 -> +	happyIn42+		 ([happy_var_1]+	)}++happyReduce_86 = happySpecReduce_3  27# happyReduction_86+happyReduction_86 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut42 happy_x_1 of { happy_var_1 -> +	case happyOut33 happy_x_3 of { happy_var_3 -> +	happyIn42+		 (happy_var_3 : happy_var_1+	)}}++happyReduce_87 = happySpecReduce_3  27# happyReduction_87+happyReduction_87 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut42 happy_x_1 of { happy_var_1 -> +	case happyOut33 happy_x_3 of { happy_var_3 -> +	happyIn42+		 (happy_var_3 : happy_var_1+	)}}++happyReduce_88 = happySpecReduce_3  28# happyReduction_88+happyReduction_88 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut42 happy_x_2 of { happy_var_2 -> +	happyIn43+		 (happy_var_2+	)}++happyReduce_89 = happySpecReduce_2  28# happyReduction_89+happyReduction_89 happy_x_2+	happy_x_1+	 =  happyIn43+		 ([]+	)++happyReduce_90 = happySpecReduce_1  29# happyReduction_90+happyReduction_90 happy_x_1+	 =  case happyOut45 happy_x_1 of { happy_var_1 -> +	happyIn44+		 (ExprInput happy_var_1+	)}++happyReduce_91 = happySpecReduce_1  29# happyReduction_91+happyReduction_91 happy_x_1+	 =  case happyOut34 happy_x_1 of { happy_var_1 -> +	happyIn44+		 (LetInput happy_var_1+	)}++happyReduce_92 = happySpecReduce_1  30# happyReduction_92+happyReduction_92 happy_x_1+	 =  case happyOut48 happy_x_1 of { happy_var_1 -> +	happyIn45+		 (happy_var_1+	)}++happyReduce_93 = happyReduce 4# 30# happyReduction_93+happyReduction_93 (happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest)+	 = case happyOut45 happy_x_1 of { happy_var_1 -> +	case happyOutTok happy_x_4 of { (Located happy_var_4 (Token (Sym CurlyR  ) _)) -> +	happyIn45+		 (at (happy_var_1,happy_var_4) $ EWhere happy_var_1 []+	) `HappyStk` happyRest}}++happyReduce_94 = happyReduce 5# 30# happyReduction_94+happyReduction_94 (happy_x_5 `HappyStk`+	happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest)+	 = case happyOut45 happy_x_1 of { happy_var_1 -> +	case happyOut41 happy_x_4 of { happy_var_4 -> +	case happyOutTok happy_x_5 of { (Located happy_var_5 (Token (Sym CurlyR  ) _)) -> +	happyIn45+		 (at (happy_var_1,happy_var_5) $ EWhere happy_var_1 (reverse happy_var_4)+	) `HappyStk` happyRest}}}++happyReduce_95 = happyReduce 4# 30# happyReduction_95+happyReduction_95 (happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest)+	 = case happyOut45 happy_x_1 of { happy_var_1 -> +	case happyOutTok happy_x_2 of { (Located happy_var_2 (Token (KW KW_where  ) _)) -> +	happyIn45+		 (at (happy_var_1,happy_var_2) $ EWhere happy_var_1 []+	) `HappyStk` happyRest}}++happyReduce_96 = happyReduce 5# 30# happyReduction_96+happyReduction_96 (happy_x_5 `HappyStk`+	happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest)+	 = case happyOut45 happy_x_1 of { happy_var_1 -> +	case happyOut42 happy_x_4 of { happy_var_4 -> +	happyIn45+		 (at (happy_var_1,happy_var_4) $ EWhere happy_var_1 (reverse happy_var_4)+	) `HappyStk` happyRest}}++happyReduce_97 = happySpecReduce_1  31# happyReduction_97+happyReduction_97 happy_x_1+	 =  case happyOut47 happy_x_1 of { happy_var_1 -> +	happyIn46+		 ([happy_var_1]+	)}++happyReduce_98 = happySpecReduce_3  31# happyReduction_98+happyReduction_98 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut46 happy_x_1 of { happy_var_1 -> +	case happyOut47 happy_x_3 of { happy_var_3 -> +	happyIn46+		 (happy_var_3 : happy_var_1+	)}}++happyReduce_99 = happySpecReduce_3  32# happyReduction_99+happyReduction_99 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut45 happy_x_1 of { happy_var_1 -> +	case happyOut45 happy_x_3 of { happy_var_3 -> +	happyIn47+		 ((happy_var_1, happy_var_3)+	)}}++happyReduce_100 = happySpecReduce_1  33# happyReduction_100+happyReduction_100 happy_x_1+	 =  case happyOut49 happy_x_1 of { happy_var_1 -> +	happyIn48+		 (happy_var_1+	)}++happyReduce_101 = happyReduce 4# 33# happyReduction_101+happyReduction_101 (happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest)+	 = case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (KW KW_if     ) _)) -> +	case happyOut46 happy_x_2 of { happy_var_2 -> +	case happyOut48 happy_x_4 of { happy_var_4 -> +	happyIn48+		 (at (happy_var_1,happy_var_4) $ mkIf (reverse happy_var_2) happy_var_4+	) `HappyStk` happyRest}}}++happyReduce_102 = happyReduce 4# 33# happyReduction_102+happyReduction_102 (happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest)+	 = case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym Lambda  ) _)) -> +	case happyOut39 happy_x_2 of { happy_var_2 -> +	case happyOut48 happy_x_4 of { happy_var_4 -> +	happyIn48+		 (at (happy_var_1,happy_var_4) $ EFun (reverse happy_var_2) happy_var_4+	) `HappyStk` happyRest}}}++happyReduce_103 = happySpecReduce_1  34# happyReduction_103+happyReduction_103 happy_x_1+	 =  case happyOut50 happy_x_1 of { happy_var_1 -> +	happyIn49+		 (happy_var_1+	)}++happyReduce_104 = happySpecReduce_3  34# happyReduction_104+happyReduction_104 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut50 happy_x_1 of { happy_var_1 -> +	case happyOut83 happy_x_3 of { happy_var_3 -> +	happyIn49+		 (at (happy_var_1,happy_var_3) $ ETyped happy_var_1 happy_var_3+	)}}++happyReduce_105 = happySpecReduce_1  35# happyReduction_105+happyReduction_105 happy_x_1+	 =  case happyOut51 happy_x_1 of { happy_var_1 -> +	happyIn50+		 (happy_var_1+	)}++happyReduce_106 = happySpecReduce_3  35# happyReduction_106+happyReduction_106 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut50 happy_x_1 of { happy_var_1 -> +	case happyOut52 happy_x_2 of { happy_var_2 -> +	case happyOut51 happy_x_3 of { happy_var_3 -> +	happyIn50+		 (binOp happy_var_1 happy_var_2 happy_var_3+	)}}}++happyReduce_107 = happySpecReduce_1  36# happyReduction_107+happyReduction_107 happy_x_1+	 =  case happyOut57 happy_x_1 of { happy_var_1 -> +	happyIn51+		 (mkEApp happy_var_1+	)}++happyReduce_108 = happySpecReduce_2  36# happyReduction_108+happyReduction_108 happy_x_2+	happy_x_1+	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Op Minus) _)) -> +	case happyOut51 happy_x_2 of { happy_var_2 -> +	happyIn51+		 (at (happy_var_1,happy_var_2) $ EApp (at happy_var_1 (EVar (mkUnqual "negate"))) happy_var_2+	)}}++happyReduce_109 = happySpecReduce_2  36# happyReduction_109+happyReduction_109 happy_x_2+	happy_x_1+	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Op Complement) _)) -> +	case happyOut51 happy_x_2 of { happy_var_2 -> +	happyIn51+		 (at (happy_var_1,happy_var_2) $ EApp (at happy_var_1 (EVar (mkUnqual "complement"))) happy_var_2+	)}}++happyReduce_110 = happySpecReduce_1  37# happyReduction_110+happyReduction_110 happy_x_1+	 =  case happyOut53 happy_x_1 of { happy_var_1 -> +	happyIn52+		 (happy_var_1+	)}++happyReduce_111 = happySpecReduce_1  37# happyReduction_111+happyReduction_111 happy_x_1+	 =  case happyOutTok happy_x_1 of { (happy_var_1@(Located _ (Token (Op  Other{}   )  _))) -> +	happyIn52+		 (let Token (Op (Other ns i)) _ = thing happy_var_1+                                       in mkQual (mkModName ns) (mkInfix (T.toStrict i)) A.<$ happy_var_1+	)}++happyReduce_112 = happySpecReduce_1  38# happyReduction_112+happyReduction_112 happy_x_1+	 =  case happyOut54 happy_x_1 of { happy_var_1 -> +	happyIn53+		 (happy_var_1+	)}++happyReduce_113 = happySpecReduce_1  38# happyReduction_113+happyReduction_113 happy_x_1+	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Op Hash) _)) -> +	happyIn53+		 (Located happy_var_1 $ mkUnqual $ mkInfix "#"+	)}++happyReduce_114 = happySpecReduce_1  39# happyReduction_114+happyReduction_114 happy_x_1+	 =  case happyOut55 happy_x_1 of { happy_var_1 -> +	happyIn54+		 (happy_var_1+	)}++happyReduce_115 = happySpecReduce_1  39# happyReduction_115+happyReduction_115 happy_x_1+	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Op Mul)   _)) -> +	happyIn54+		 (Located happy_var_1 $ mkUnqual $ mkInfix "*"+	)}++happyReduce_116 = happySpecReduce_1  39# happyReduction_116+happyReduction_116 happy_x_1+	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Op Plus)  _)) -> +	happyIn54+		 (Located happy_var_1 $ mkUnqual $ mkInfix "+"+	)}++happyReduce_117 = happySpecReduce_1  39# happyReduction_117+happyReduction_117 happy_x_1+	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Op Minus) _)) -> +	happyIn54+		 (Located happy_var_1 $ mkUnqual $ mkInfix "-"+	)}++happyReduce_118 = happySpecReduce_1  39# happyReduction_118+happyReduction_118 happy_x_1+	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Op Complement) _)) -> +	happyIn54+		 (Located happy_var_1 $ mkUnqual $ mkInfix "~"+	)}++happyReduce_119 = happySpecReduce_1  39# happyReduction_119+happyReduction_119 happy_x_1+	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Op Exp)   _)) -> +	happyIn54+		 (Located happy_var_1 $ mkUnqual $ mkInfix "^^"+	)}++happyReduce_120 = happySpecReduce_1  40# happyReduction_120+happyReduction_120 happy_x_1+	 =  case happyOutTok happy_x_1 of { (happy_var_1@(Located _ (Token (Op (Other [] _)) _))) -> +	happyIn55+		 (let Token (Op (Other [] str)) _ = thing happy_var_1+                                       in mkUnqual (mkInfix (T.toStrict str)) A.<$ happy_var_1+	)}++happyReduce_121 = happySpecReduce_1  41# happyReduction_121+happyReduction_121 happy_x_1+	 =  case happyOut53 happy_x_1 of { happy_var_1 -> +	happyIn56+		 ([happy_var_1]+	)}++happyReduce_122 = happySpecReduce_3  41# happyReduction_122+happyReduction_122 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut56 happy_x_1 of { happy_var_1 -> +	case happyOut53 happy_x_3 of { happy_var_3 -> +	happyIn56+		 (happy_var_3 : happy_var_1+	)}}++happyReduce_123 = happySpecReduce_1  42# happyReduction_123+happyReduction_123 happy_x_1+	 =  case happyOut58 happy_x_1 of { happy_var_1 -> +	happyIn57+		 ([happy_var_1]+	)}++happyReduce_124 = happySpecReduce_2  42# happyReduction_124+happyReduction_124 happy_x_2+	happy_x_1+	 =  case happyOut57 happy_x_1 of { happy_var_1 -> +	case happyOut58 happy_x_2 of { happy_var_2 -> +	happyIn57+		 (happy_var_2 : happy_var_1+	)}}++happyReduce_125 = happySpecReduce_1  43# happyReduction_125+happyReduction_125 happy_x_1+	 =  case happyOut94 happy_x_1 of { happy_var_1 -> +	happyIn58+		 (at happy_var_1 $ EVar (thing happy_var_1)+	)}++happyReduce_126 = happySpecReduce_1  43# happyReduction_126+happyReduction_126 happy_x_1+	 =  case happyOutTok happy_x_1 of { (happy_var_1@(Located _ (Token (Num   {}) _))) -> +	happyIn58+		 (at happy_var_1 $ numLit (tokenType (thing happy_var_1))+	)}++happyReduce_127 = happySpecReduce_1  43# happyReduction_127+happyReduction_127 happy_x_1+	 =  case happyOutTok happy_x_1 of { (happy_var_1@(Located _ (Token (StrLit {}) _))) -> +	happyIn58+		 (at happy_var_1 $ ELit $ ECString $ getStr happy_var_1+	)}++happyReduce_128 = happySpecReduce_1  43# happyReduction_128+happyReduction_128 happy_x_1+	 =  case happyOutTok happy_x_1 of { (happy_var_1@(Located _ (Token (ChrLit {}) _))) -> +	happyIn58+		 (at happy_var_1 $ ELit $ ECNum (getNum happy_var_1) CharLit+	)}++happyReduce_129 = happySpecReduce_3  43# happyReduction_129+happyReduction_129 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym ParenL  ) _)) -> +	case happyOut45 happy_x_2 of { happy_var_2 -> +	case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym ParenR  ) _)) -> +	happyIn58+		 (at (happy_var_1,happy_var_3) $ EParens happy_var_2+	)}}}++happyReduce_130 = happySpecReduce_3  43# happyReduction_130+happyReduction_130 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym ParenL  ) _)) -> +	case happyOut62 happy_x_2 of { happy_var_2 -> +	case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym ParenR  ) _)) -> +	happyIn58+		 (at (happy_var_1,happy_var_3) $ ETuple (reverse happy_var_2)+	)}}}++happyReduce_131 = happySpecReduce_2  43# happyReduction_131+happyReduction_131 happy_x_2+	happy_x_1+	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym ParenL  ) _)) -> +	case happyOutTok happy_x_2 of { (Located happy_var_2 (Token (Sym ParenR  ) _)) -> +	happyIn58+		 (at (happy_var_1,happy_var_2) $ ETuple []+	)}}++happyReduce_132 = happySpecReduce_2  43# happyReduction_132+happyReduction_132 happy_x_2+	happy_x_1+	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym CurlyL  ) _)) -> +	case happyOutTok happy_x_2 of { (Located happy_var_2 (Token (Sym CurlyR  ) _)) -> +	happyIn58+		 (at (happy_var_1,happy_var_2) $ ERecord []+	)}}++happyReduce_133 = happySpecReduce_3  43# happyReduction_133+happyReduction_133 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym CurlyL  ) _)) -> +	case happyOut64 happy_x_2 of { happy_var_2 -> +	case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym CurlyR  ) _)) -> +	happyIn58+		 (at (happy_var_1,happy_var_3) $ ERecord (reverse happy_var_2)+	)}}}++happyReduce_134 = happySpecReduce_2  43# happyReduction_134+happyReduction_134 happy_x_2+	happy_x_1+	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym BracketL) _)) -> +	case happyOutTok happy_x_2 of { (Located happy_var_2 (Token (Sym BracketR) _)) -> +	happyIn58+		 (at (happy_var_1,happy_var_2) $ EList []+	)}}++happyReduce_135 = happySpecReduce_3  43# happyReduction_135+happyReduction_135 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym BracketL) _)) -> +	case happyOut65 happy_x_2 of { happy_var_2 -> +	case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym BracketR) _)) -> +	happyIn58+		 (at (happy_var_1,happy_var_3) happy_var_2+	)}}}++happyReduce_136 = happySpecReduce_2  43# happyReduction_136+happyReduction_136 happy_x_2+	happy_x_1+	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym BackTick) _)) -> +	case happyOut96 happy_x_2 of { happy_var_2 -> +	happyIn58+		 (at (happy_var_1,happy_var_2) $ ETypeVal happy_var_2+	)}}++happyReduce_137 = happySpecReduce_3  43# happyReduction_137+happyReduction_137 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut58 happy_x_1 of { happy_var_1 -> +	case happyOut61 happy_x_3 of { happy_var_3 -> +	happyIn58+		 (at (happy_var_1,happy_var_3) $ ESel happy_var_1 (thing happy_var_3)+	)}}++happyReduce_138 = happySpecReduce_3  43# happyReduction_138+happyReduction_138 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym ParenL  ) _)) -> +	case happyOut52 happy_x_2 of { happy_var_2 -> +	case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym ParenR  ) _)) -> +	happyIn58+		 (at (happy_var_1,happy_var_3) $ EVar $ thing happy_var_2+	)}}}++happyReduce_139 = happyMonadReduce 2# 43# happyReduction_139+happyReduction_139 (happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym TriL    ) _)) -> +	case happyOutTok happy_x_2 of { (Located happy_var_2 (Token (Sym TriR    ) _)) -> +	( mkPoly (rComb happy_var_1 happy_var_2) [])}}+	) (\r -> happyReturn (happyIn58 r))++happyReduce_140 = happyMonadReduce 3# 43# happyReduction_140+happyReduction_140 (happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym TriL    ) _)) -> +	case happyOut59 happy_x_2 of { happy_var_2 -> +	case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym TriR    ) _)) -> +	( mkPoly (rComb happy_var_1 happy_var_3) happy_var_2)}}}+	) (\r -> happyReturn (happyIn58 r))++happyReduce_141 = happySpecReduce_1  44# happyReduction_141+happyReduction_141 happy_x_1+	 =  case happyOut60 happy_x_1 of { happy_var_1 -> +	happyIn59+		 ([happy_var_1]+	)}++happyReduce_142 = happySpecReduce_3  44# happyReduction_142+happyReduction_142 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut59 happy_x_1 of { happy_var_1 -> +	case happyOut60 happy_x_3 of { happy_var_3 -> +	happyIn59+		 (happy_var_3 : happy_var_1+	)}}++happyReduce_143 = happyMonadReduce 1# 45# happyReduction_143+happyReduction_143 (happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOutTok happy_x_1 of { (happy_var_1@(Located _ (Token (Num   {}) _))) -> +	( polyTerm (srcRange happy_var_1) (getNum happy_var_1) 0)}+	) (\r -> happyReturn (happyIn60 r))++happyReduce_144 = happyMonadReduce 1# 45# happyReduction_144+happyReduction_144 (happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (KW KW_x)       _)) -> +	( polyTerm happy_var_1 1 1)}+	) (\r -> happyReturn (happyIn60 r))++happyReduce_145 = happyMonadReduce 3# 45# happyReduction_145+happyReduction_145 (happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (KW KW_x)       _)) -> +	case happyOutTok happy_x_3 of { (happy_var_3@(Located _ (Token (Num   {}) _))) -> +	( polyTerm (rComb happy_var_1 (srcRange happy_var_3))+                                                            1 (getNum happy_var_3))}}+	) (\r -> happyReturn (happyIn60 r))++happyReduce_146 = happySpecReduce_1  46# happyReduction_146+happyReduction_146 happy_x_1+	 =  case happyOut91 happy_x_1 of { happy_var_1 -> +	happyIn61+		 (fmap (`RecordSel` Nothing) happy_var_1+	)}++happyReduce_147 = happyMonadReduce 1# 46# happyReduction_147+happyReduction_147 (happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOutTok happy_x_1 of { (happy_var_1@(Located _ (Token (Num   {}) _))) -> +	( mkTupleSel (srcRange happy_var_1) (getNum happy_var_1))}+	) (\r -> happyReturn (happyIn61 r))++happyReduce_148 = happySpecReduce_3  47# happyReduction_148+happyReduction_148 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut45 happy_x_1 of { happy_var_1 -> +	case happyOut45 happy_x_3 of { happy_var_3 -> +	happyIn62+		 ([ happy_var_3, happy_var_1]+	)}}++happyReduce_149 = happySpecReduce_3  47# happyReduction_149+happyReduction_149 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut62 happy_x_1 of { happy_var_1 -> +	case happyOut45 happy_x_3 of { happy_var_3 -> +	happyIn62+		 (happy_var_3 : happy_var_1+	)}}++happyReduce_150 = happySpecReduce_3  48# happyReduction_150+happyReduction_150 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut91 happy_x_1 of { happy_var_1 -> +	case happyOut45 happy_x_3 of { happy_var_3 -> +	happyIn63+		 (Named { name = happy_var_1, value = happy_var_3 }+	)}}++happyReduce_151 = happyReduce 4# 48# happyReduction_151+happyReduction_151 (happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest)+	 = case happyOut91 happy_x_1 of { happy_var_1 -> +	case happyOut39 happy_x_2 of { happy_var_2 -> +	case happyOut45 happy_x_4 of { happy_var_4 -> +	happyIn63+		 (Named { name = happy_var_1, value = EFun (reverse happy_var_2) happy_var_4 }+	) `HappyStk` happyRest}}}++happyReduce_152 = happySpecReduce_1  49# happyReduction_152+happyReduction_152 happy_x_1+	 =  case happyOut63 happy_x_1 of { happy_var_1 -> +	happyIn64+		 ([happy_var_1]+	)}++happyReduce_153 = happySpecReduce_3  49# happyReduction_153+happyReduction_153 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut64 happy_x_1 of { happy_var_1 -> +	case happyOut63 happy_x_3 of { happy_var_3 -> +	happyIn64+		 (happy_var_3 : happy_var_1+	)}}++happyReduce_154 = happySpecReduce_3  50# happyReduction_154+happyReduction_154 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut45 happy_x_1 of { happy_var_1 -> +	case happyOut66 happy_x_3 of { happy_var_3 -> +	happyIn65+		 (EComp happy_var_1 (reverse happy_var_3)+	)}}++happyReduce_155 = happySpecReduce_1  50# happyReduction_155+happyReduction_155 happy_x_1+	 =  case happyOut45 happy_x_1 of { happy_var_1 -> +	happyIn65+		 (EList [happy_var_1]+	)}++happyReduce_156 = happySpecReduce_1  50# happyReduction_156+happyReduction_156 happy_x_1+	 =  case happyOut62 happy_x_1 of { happy_var_1 -> +	happyIn65+		 (EList (reverse happy_var_1)+	)}++happyReduce_157 = happyMonadReduce 2# 50# happyReduction_157+happyReduction_157 (happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOut45 happy_x_1 of { happy_var_1 -> +	case happyOutTok happy_x_2 of { (Located happy_var_2 (Token (Sym DotDot  ) _)) -> +	( eFromTo happy_var_2 happy_var_1 Nothing   Nothing)}}+	) (\r -> happyReturn (happyIn65 r))++happyReduce_158 = happyMonadReduce 3# 50# happyReduction_158+happyReduction_158 (happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOut45 happy_x_1 of { happy_var_1 -> +	case happyOutTok happy_x_2 of { (Located happy_var_2 (Token (Sym DotDot  ) _)) -> +	case happyOut45 happy_x_3 of { happy_var_3 -> +	( eFromTo happy_var_2 happy_var_1 Nothing   (Just happy_var_3))}}}+	) (\r -> happyReturn (happyIn65 r))++happyReduce_159 = happyMonadReduce 4# 50# happyReduction_159+happyReduction_159 (happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOut45 happy_x_1 of { happy_var_1 -> +	case happyOut45 happy_x_3 of { happy_var_3 -> +	case happyOutTok happy_x_4 of { (Located happy_var_4 (Token (Sym DotDot  ) _)) -> +	( eFromTo happy_var_4 happy_var_1 (Just happy_var_3) Nothing)}}}+	) (\r -> happyReturn (happyIn65 r))++happyReduce_160 = happyMonadReduce 5# 50# happyReduction_160+happyReduction_160 (happy_x_5 `HappyStk`+	happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOut45 happy_x_1 of { happy_var_1 -> +	case happyOut45 happy_x_3 of { happy_var_3 -> +	case happyOutTok happy_x_4 of { (Located happy_var_4 (Token (Sym DotDot  ) _)) -> +	case happyOut45 happy_x_5 of { happy_var_5 -> +	( eFromTo happy_var_4 happy_var_1 (Just happy_var_3) (Just happy_var_5))}}}}+	) (\r -> happyReturn (happyIn65 r))++happyReduce_161 = happySpecReduce_2  50# happyReduction_161+happyReduction_161 happy_x_2+	happy_x_1+	 =  case happyOut45 happy_x_1 of { happy_var_1 -> +	happyIn65+		 (EInfFrom happy_var_1 Nothing+	)}++happyReduce_162 = happyReduce 4# 50# happyReduction_162+happyReduction_162 (happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest)+	 = case happyOut45 happy_x_1 of { happy_var_1 -> +	case happyOut45 happy_x_3 of { happy_var_3 -> +	happyIn65+		 (EInfFrom happy_var_1 (Just happy_var_3)+	) `HappyStk` happyRest}}++happyReduce_163 = happySpecReduce_1  51# happyReduction_163+happyReduction_163 happy_x_1+	 =  case happyOut67 happy_x_1 of { happy_var_1 -> +	happyIn66+		 ([ reverse happy_var_1 ]+	)}++happyReduce_164 = happySpecReduce_3  51# happyReduction_164+happyReduction_164 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut66 happy_x_1 of { happy_var_1 -> +	case happyOut67 happy_x_3 of { happy_var_3 -> +	happyIn66+		 (reverse happy_var_3 : happy_var_1+	)}}++happyReduce_165 = happySpecReduce_1  52# happyReduction_165+happyReduction_165 happy_x_1+	 =  case happyOut68 happy_x_1 of { happy_var_1 -> +	happyIn67+		 ([happy_var_1]+	)}++happyReduce_166 = happySpecReduce_3  52# happyReduction_166+happyReduction_166 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut67 happy_x_1 of { happy_var_1 -> +	case happyOut68 happy_x_3 of { happy_var_3 -> +	happyIn67+		 (happy_var_3 : happy_var_1+	)}}++happyReduce_167 = happySpecReduce_3  53# happyReduction_167+happyReduction_167 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut69 happy_x_1 of { happy_var_1 -> +	case happyOut45 happy_x_3 of { happy_var_3 -> +	happyIn68+		 (Match happy_var_1 happy_var_3+	)}}++happyReduce_168 = happySpecReduce_3  54# happyReduction_168+happyReduction_168 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut70 happy_x_1 of { happy_var_1 -> +	case happyOut83 happy_x_3 of { happy_var_3 -> +	happyIn69+		 (at (happy_var_1,happy_var_3) $ PTyped happy_var_1 happy_var_3+	)}}++happyReduce_169 = happySpecReduce_1  54# happyReduction_169+happyReduction_169 happy_x_1+	 =  case happyOut70 happy_x_1 of { happy_var_1 -> +	happyIn69+		 (happy_var_1+	)}++happyReduce_170 = happySpecReduce_3  55# happyReduction_170+happyReduction_170 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut70 happy_x_1 of { happy_var_1 -> +	case happyOut70 happy_x_3 of { happy_var_3 -> +	happyIn70+		 (at (happy_var_1,happy_var_3) $ PSplit happy_var_1 happy_var_3+	)}}++happyReduce_171 = happySpecReduce_1  55# happyReduction_171+happyReduction_171 happy_x_1+	 =  case happyOut71 happy_x_1 of { happy_var_1 -> +	happyIn70+		 (happy_var_1+	)}++happyReduce_172 = happySpecReduce_1  56# happyReduction_172+happyReduction_172 happy_x_1+	 =  case happyOut92 happy_x_1 of { happy_var_1 -> +	happyIn71+		 (PVar happy_var_1+	)}++happyReduce_173 = happySpecReduce_1  56# happyReduction_173+happyReduction_173 happy_x_1+	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym Underscore ) _)) -> +	happyIn71+		 (at happy_var_1       $ PWild+	)}++happyReduce_174 = happySpecReduce_2  56# happyReduction_174+happyReduction_174 happy_x_2+	happy_x_1+	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym ParenL  ) _)) -> +	case happyOutTok happy_x_2 of { (Located happy_var_2 (Token (Sym ParenR  ) _)) -> +	happyIn71+		 (at (happy_var_1,happy_var_2) $ PTuple []+	)}}++happyReduce_175 = happySpecReduce_3  56# happyReduction_175+happyReduction_175 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym ParenL  ) _)) -> +	case happyOut69 happy_x_2 of { happy_var_2 -> +	case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym ParenR  ) _)) -> +	happyIn71+		 (at (happy_var_1,happy_var_3)   happy_var_2+	)}}}++happyReduce_176 = happySpecReduce_3  56# happyReduction_176+happyReduction_176 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym ParenL  ) _)) -> +	case happyOut72 happy_x_2 of { happy_var_2 -> +	case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym ParenR  ) _)) -> +	happyIn71+		 (at (happy_var_1,happy_var_3) $ PTuple (reverse happy_var_2)+	)}}}++happyReduce_177 = happySpecReduce_2  56# happyReduction_177+happyReduction_177 happy_x_2+	happy_x_1+	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym BracketL) _)) -> +	case happyOutTok happy_x_2 of { (Located happy_var_2 (Token (Sym BracketR) _)) -> +	happyIn71+		 (at (happy_var_1,happy_var_2) $ PList []+	)}}++happyReduce_178 = happySpecReduce_3  56# happyReduction_178+happyReduction_178 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym BracketL) _)) -> +	case happyOut69 happy_x_2 of { happy_var_2 -> +	case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym BracketR) _)) -> +	happyIn71+		 (at (happy_var_1,happy_var_3) $ PList [happy_var_2]+	)}}}++happyReduce_179 = happySpecReduce_3  56# happyReduction_179+happyReduction_179 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym BracketL) _)) -> +	case happyOut72 happy_x_2 of { happy_var_2 -> +	case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym BracketR) _)) -> +	happyIn71+		 (at (happy_var_1,happy_var_3) $ PList (reverse happy_var_2)+	)}}}++happyReduce_180 = happySpecReduce_2  56# happyReduction_180+happyReduction_180 happy_x_2+	happy_x_1+	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym CurlyL  ) _)) -> +	case happyOutTok happy_x_2 of { (Located happy_var_2 (Token (Sym CurlyR  ) _)) -> +	happyIn71+		 (at (happy_var_1,happy_var_2) $ PRecord []+	)}}++happyReduce_181 = happySpecReduce_3  56# happyReduction_181+happyReduction_181 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym CurlyL  ) _)) -> +	case happyOut74 happy_x_2 of { happy_var_2 -> +	case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym CurlyR  ) _)) -> +	happyIn71+		 (at (happy_var_1,happy_var_3) $ PRecord (reverse happy_var_2)+	)}}}++happyReduce_182 = happySpecReduce_3  57# happyReduction_182+happyReduction_182 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut69 happy_x_1 of { happy_var_1 -> +	case happyOut69 happy_x_3 of { happy_var_3 -> +	happyIn72+		 ([happy_var_3, happy_var_1]+	)}}++happyReduce_183 = happySpecReduce_3  57# happyReduction_183+happyReduction_183 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut72 happy_x_1 of { happy_var_1 -> +	case happyOut69 happy_x_3 of { happy_var_3 -> +	happyIn72+		 (happy_var_3 : happy_var_1+	)}}++happyReduce_184 = happySpecReduce_3  58# happyReduction_184+happyReduction_184 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut91 happy_x_1 of { happy_var_1 -> +	case happyOut69 happy_x_3 of { happy_var_3 -> +	happyIn73+		 (Named { name = happy_var_1, value = happy_var_3 }+	)}}++happyReduce_185 = happySpecReduce_1  59# happyReduction_185+happyReduction_185 happy_x_1+	 =  case happyOut73 happy_x_1 of { happy_var_1 -> +	happyIn74+		 ([happy_var_1]+	)}++happyReduce_186 = happySpecReduce_3  59# happyReduction_186+happyReduction_186 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut74 happy_x_1 of { happy_var_1 -> +	case happyOut73 happy_x_3 of { happy_var_3 -> +	happyIn74+		 (happy_var_3 : happy_var_1+	)}}++happyReduce_187 = happySpecReduce_1  60# happyReduction_187+happyReduction_187 happy_x_1+	 =  case happyOut83 happy_x_1 of { happy_var_1 -> +	happyIn75+		 (at happy_var_1 $ mkSchema [] [] happy_var_1+	)}++happyReduce_188 = happySpecReduce_2  60# happyReduction_188+happyReduction_188 happy_x_2+	happy_x_1+	 =  case happyOut76 happy_x_1 of { happy_var_1 -> +	case happyOut83 happy_x_2 of { happy_var_2 -> +	happyIn75+		 (at (happy_var_1,happy_var_2) $ mkSchema (thing happy_var_1) [] happy_var_2+	)}}++happyReduce_189 = happySpecReduce_2  60# happyReduction_189+happyReduction_189 happy_x_2+	happy_x_1+	 =  case happyOut77 happy_x_1 of { happy_var_1 -> +	case happyOut83 happy_x_2 of { happy_var_2 -> +	happyIn75+		 (at (happy_var_1,happy_var_2) $ mkSchema [] (thing happy_var_1) happy_var_2+	)}}++happyReduce_190 = happySpecReduce_3  60# happyReduction_190+happyReduction_190 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut76 happy_x_1 of { happy_var_1 -> +	case happyOut77 happy_x_2 of { happy_var_2 -> +	case happyOut83 happy_x_3 of { happy_var_3 -> +	happyIn75+		 (at (happy_var_1,happy_var_3) $ mkSchema (thing happy_var_1)+                                                          (thing happy_var_2) happy_var_3+	)}}}++happyReduce_191 = happySpecReduce_2  61# happyReduction_191+happyReduction_191 happy_x_2+	happy_x_1+	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym CurlyL  ) _)) -> +	case happyOutTok happy_x_2 of { (Located happy_var_2 (Token (Sym CurlyR  ) _)) -> +	happyIn76+		 (Located (rComb happy_var_1 happy_var_2) []+	)}}++happyReduce_192 = happySpecReduce_3  61# happyReduction_192+happyReduction_192 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym CurlyL  ) _)) -> +	case happyOut80 happy_x_2 of { happy_var_2 -> +	case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym CurlyR  ) _)) -> +	happyIn76+		 (Located (rComb happy_var_1 happy_var_3) (reverse happy_var_2)+	)}}}++happyReduce_193 = happyMonadReduce 2# 62# happyReduction_193+happyReduction_193 (happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOut83 happy_x_1 of { happy_var_1 -> +	case happyOutTok happy_x_2 of { (Located happy_var_2 (Token (Sym FatArrR ) _)) -> +	( fmap (\x -> at (x,happy_var_2) x) (mkProp happy_var_1))}}+	) (\r -> happyReturn (happyIn77 r))++happyReduce_194 = happySpecReduce_1  63# happyReduction_194+happyReduction_194 happy_x_1+	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Op Hash) _)) -> +	happyIn78+		 (Located happy_var_1 KNum+	)}++happyReduce_195 = happySpecReduce_1  63# happyReduction_195+happyReduction_195 happy_x_1+	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Op Mul)   _)) -> +	happyIn78+		 (Located happy_var_1 KType+	)}++happyReduce_196 = happyMonadReduce 1# 64# happyReduction_196+happyReduction_196 (happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOut91 happy_x_1 of { happy_var_1 -> +	( mkTParam happy_var_1 Nothing)}+	) (\r -> happyReturn (happyIn79 r))++happyReduce_197 = happyMonadReduce 3# 64# happyReduction_197+happyReduction_197 (happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOut91 happy_x_1 of { happy_var_1 -> +	case happyOut78 happy_x_3 of { happy_var_3 -> +	( mkTParam (at (happy_var_1,happy_var_3) happy_var_1) (Just (thing happy_var_3)))}}+	) (\r -> happyReturn (happyIn79 r))++happyReduce_198 = happySpecReduce_1  65# happyReduction_198+happyReduction_198 happy_x_1+	 =  case happyOut79 happy_x_1 of { happy_var_1 -> +	happyIn80+		 ([happy_var_1]+	)}++happyReduce_199 = happySpecReduce_3  65# happyReduction_199+happyReduction_199 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut80 happy_x_1 of { happy_var_1 -> +	case happyOut79 happy_x_3 of { happy_var_3 -> +	happyIn80+		 (happy_var_3 : happy_var_1+	)}}++happyReduce_200 = happyMonadReduce 1# 66# happyReduction_200+happyReduction_200 (happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOut91 happy_x_1 of { happy_var_1 -> +	( mkTParam happy_var_1 Nothing)}+	) (\r -> happyReturn (happyIn81 r))++happyReduce_201 = happyMonadReduce 5# 66# happyReduction_201+happyReduction_201 (happy_x_5 `HappyStk`+	happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym ParenL  ) _)) -> +	case happyOut91 happy_x_2 of { happy_var_2 -> +	case happyOut78 happy_x_4 of { happy_var_4 -> +	case happyOutTok happy_x_5 of { (Located happy_var_5 (Token (Sym ParenR  ) _)) -> +	( mkTParam (at (happy_var_1,happy_var_5) happy_var_2) (Just (thing happy_var_4)))}}}}+	) (\r -> happyReturn (happyIn81 r))++happyReduce_202 = happySpecReduce_1  67# happyReduction_202+happyReduction_202 happy_x_1+	 =  case happyOut81 happy_x_1 of { happy_var_1 -> +	happyIn82+		 ([happy_var_1]+	)}++happyReduce_203 = happySpecReduce_2  67# happyReduction_203+happyReduction_203 happy_x_2+	happy_x_1+	 =  case happyOut82 happy_x_1 of { happy_var_1 -> +	case happyOut81 happy_x_2 of { happy_var_2 -> +	happyIn82+		 (happy_var_2 : happy_var_1+	)}}++happyReduce_204 = happySpecReduce_3  68# happyReduction_204+happyReduction_204 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut84 happy_x_1 of { happy_var_1 -> +	case happyOut83 happy_x_3 of { happy_var_3 -> +	happyIn83+		 (at (happy_var_1,happy_var_3) $ TFun happy_var_1 happy_var_3+	)}}++happyReduce_205 = happySpecReduce_3  68# happyReduction_205+happyReduction_205 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut83 happy_x_1 of { happy_var_1 -> +	case happyOut53 happy_x_2 of { happy_var_2 -> +	case happyOut84 happy_x_3 of { happy_var_3 -> +	happyIn83+		 (at (happy_var_1,happy_var_3) $ TInfix happy_var_1 happy_var_2 defaultFixity happy_var_3+	)}}}++happyReduce_206 = happySpecReduce_1  68# happyReduction_206+happyReduction_206 happy_x_1+	 =  case happyOut84 happy_x_1 of { happy_var_1 -> +	happyIn83+		 (happy_var_1+	)}++happyReduce_207 = happySpecReduce_2  69# happyReduction_207+happyReduction_207 happy_x_2+	happy_x_1+	 =  case happyOut87 happy_x_1 of { happy_var_1 -> +	case happyOut85 happy_x_2 of { happy_var_2 -> +	happyIn84+		 (at (happy_var_1,happy_var_2) $ foldr TSeq happy_var_2 (reverse (thing happy_var_1))+	)}}++happyReduce_208 = happySpecReduce_2  69# happyReduction_208+happyReduction_208 happy_x_2+	happy_x_1+	 =  case happyOut94 happy_x_1 of { happy_var_1 -> +	case happyOut86 happy_x_2 of { happy_var_2 -> +	happyIn84+		 (at (happy_var_1,head happy_var_2)+                                     $ TUser (thing happy_var_1) (reverse happy_var_2)+	)}}++happyReduce_209 = happySpecReduce_1  69# happyReduction_209+happyReduction_209 happy_x_1+	 =  case happyOut85 happy_x_1 of { happy_var_1 -> +	happyIn84+		 (happy_var_1+	)}++happyReduce_210 = happySpecReduce_1  70# happyReduction_210+happyReduction_210 happy_x_1+	 =  case happyOut94 happy_x_1 of { happy_var_1 -> +	happyIn85+		 (at happy_var_1 $ TUser (thing happy_var_1) []+	)}++happyReduce_211 = happySpecReduce_1  70# happyReduction_211+happyReduction_211 happy_x_1+	 =  case happyOutTok happy_x_1 of { (happy_var_1@(Located _ (Token (Num   {}) _))) -> +	happyIn85+		 (at happy_var_1 $ TNum  (getNum happy_var_1)+	)}++happyReduce_212 = happySpecReduce_1  70# happyReduction_212+happyReduction_212 happy_x_1+	 =  case happyOutTok happy_x_1 of { (happy_var_1@(Located _ (Token (ChrLit {}) _))) -> +	happyIn85+		 (at happy_var_1 $ TChar (toEnum $ fromInteger+                                                          $ getNum happy_var_1)+	)}++happyReduce_213 = happySpecReduce_3  70# happyReduction_213+happyReduction_213 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym BracketL) _)) -> +	case happyOut83 happy_x_2 of { happy_var_2 -> +	case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym BracketR) _)) -> +	happyIn85+		 (at (happy_var_1,happy_var_3) $ TSeq happy_var_2 TBit+	)}}}++happyReduce_214 = happySpecReduce_3  70# happyReduction_214+happyReduction_214 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym ParenL  ) _)) -> +	case happyOut83 happy_x_2 of { happy_var_2 -> +	case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym ParenR  ) _)) -> +	happyIn85+		 (at (happy_var_1,happy_var_3) $ TParens happy_var_2+	)}}}++happyReduce_215 = happySpecReduce_2  70# happyReduction_215+happyReduction_215 happy_x_2+	happy_x_1+	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym ParenL  ) _)) -> +	case happyOutTok happy_x_2 of { (Located happy_var_2 (Token (Sym ParenR  ) _)) -> +	happyIn85+		 (at (happy_var_1,happy_var_2) $ TTuple []+	)}}++happyReduce_216 = happySpecReduce_3  70# happyReduction_216+happyReduction_216 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym ParenL  ) _)) -> +	case happyOut88 happy_x_2 of { happy_var_2 -> +	case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym ParenR  ) _)) -> +	happyIn85+		 (at (happy_var_1,happy_var_3) $ TTuple  (reverse happy_var_2)+	)}}}++happyReduce_217 = happySpecReduce_2  70# happyReduction_217+happyReduction_217 happy_x_2+	happy_x_1+	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym CurlyL  ) _)) -> +	case happyOutTok happy_x_2 of { (Located happy_var_2 (Token (Sym CurlyR  ) _)) -> +	happyIn85+		 (at (happy_var_1,happy_var_2) $ TRecord []+	)}}++happyReduce_218 = happySpecReduce_3  70# happyReduction_218+happyReduction_218 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym CurlyL  ) _)) -> +	case happyOut90 happy_x_2 of { happy_var_2 -> +	case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym CurlyR  ) _)) -> +	happyIn85+		 (at (happy_var_1,happy_var_3) $ TRecord (reverse happy_var_2)+	)}}}++happyReduce_219 = happySpecReduce_1  70# happyReduction_219+happyReduction_219 happy_x_1+	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym Underscore ) _)) -> +	happyIn85+		 (at happy_var_1 TWild+	)}++happyReduce_220 = happySpecReduce_1  71# happyReduction_220+happyReduction_220 happy_x_1+	 =  case happyOut85 happy_x_1 of { happy_var_1 -> +	happyIn86+		 ([ happy_var_1 ]+	)}++happyReduce_221 = happySpecReduce_2  71# happyReduction_221+happyReduction_221 happy_x_2+	happy_x_1+	 =  case happyOut86 happy_x_1 of { happy_var_1 -> +	case happyOut85 happy_x_2 of { happy_var_2 -> +	happyIn86+		 (happy_var_2 : happy_var_1+	)}}++happyReduce_222 = happySpecReduce_3  72# happyReduction_222+happyReduction_222 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym BracketL) _)) -> +	case happyOut83 happy_x_2 of { happy_var_2 -> +	case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym BracketR) _)) -> +	happyIn87+		 (Located (rComb happy_var_1 happy_var_3) [ happy_var_2 ]+	)}}}++happyReduce_223 = happyReduce 4# 72# happyReduction_223+happyReduction_223 (happy_x_4 `HappyStk`+	happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest)+	 = case happyOut87 happy_x_1 of { happy_var_1 -> +	case happyOut83 happy_x_3 of { happy_var_3 -> +	case happyOutTok happy_x_4 of { (Located happy_var_4 (Token (Sym BracketR) _)) -> +	happyIn87+		 (at (happy_var_1,happy_var_4) (fmap (happy_var_3 :) happy_var_1)+	) `HappyStk` happyRest}}}++happyReduce_224 = happySpecReduce_3  73# happyReduction_224+happyReduction_224 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut83 happy_x_1 of { happy_var_1 -> +	case happyOut83 happy_x_3 of { happy_var_3 -> +	happyIn88+		 ([ happy_var_3, happy_var_1]+	)}}++happyReduce_225 = happySpecReduce_3  73# happyReduction_225+happyReduction_225 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut88 happy_x_1 of { happy_var_1 -> +	case happyOut83 happy_x_3 of { happy_var_3 -> +	happyIn88+		 (happy_var_3 : happy_var_1+	)}}++happyReduce_226 = happySpecReduce_3  74# happyReduction_226+happyReduction_226 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut91 happy_x_1 of { happy_var_1 -> +	case happyOut83 happy_x_3 of { happy_var_3 -> +	happyIn89+		 (Named { name = happy_var_1, value = happy_var_3 }+	)}}++happyReduce_227 = happySpecReduce_1  75# happyReduction_227+happyReduction_227 happy_x_1+	 =  case happyOut89 happy_x_1 of { happy_var_1 -> +	happyIn90+		 ([happy_var_1]+	)}++happyReduce_228 = happySpecReduce_3  75# happyReduction_228+happyReduction_228 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut90 happy_x_1 of { happy_var_1 -> +	case happyOut89 happy_x_3 of { happy_var_3 -> +	happyIn90+		 (happy_var_3 : happy_var_1+	)}}++happyReduce_229 = happySpecReduce_1  76# happyReduction_229+happyReduction_229 happy_x_1+	 =  case happyOutTok happy_x_1 of { (happy_var_1@(Located _ (Token (Ident [] _) _))) -> +	happyIn91+		 (let Token (Ident _ str) _ = thing happy_var_1+                         in happy_var_1 { thing = mkIdent (T.toStrict str) }+	)}++happyReduce_230 = happySpecReduce_1  76# happyReduction_230+happyReduction_230 happy_x_1+	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (KW KW_x)       _)) -> +	happyIn91+		 (Located { srcRange = happy_var_1, thing = mkIdent "x" }+	)}++happyReduce_231 = happySpecReduce_1  76# happyReduction_231+happyReduction_231 happy_x_1+	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (KW KW_private)   _)) -> +	happyIn91+		 (Located { srcRange = happy_var_1, thing = mkIdent "private" }+	)}++happyReduce_232 = happySpecReduce_1  76# happyReduction_232+happyReduction_232 happy_x_1+	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (KW KW_as)        _)) -> +	happyIn91+		 (Located { srcRange = happy_var_1, thing = mkIdent "as" }+	)}++happyReduce_233 = happySpecReduce_1  76# happyReduction_233+happyReduction_233 happy_x_1+	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (KW KW_hiding)    _)) -> +	happyIn91+		 (Located { srcRange = happy_var_1, thing = mkIdent "hiding" }+	)}++happyReduce_234 = happySpecReduce_1  77# happyReduction_234+happyReduction_234 happy_x_1+	 =  case happyOut91 happy_x_1 of { happy_var_1 -> +	happyIn92+		 (fmap mkUnqual happy_var_1+	)}++happyReduce_235 = happySpecReduce_1  78# happyReduction_235+happyReduction_235 happy_x_1+	 =  case happyOut91 happy_x_1 of { happy_var_1 -> +	happyIn93+		 (fmap identText happy_var_1+	)}++happyReduce_236 = happySpecReduce_1  78# happyReduction_236+happyReduction_236 happy_x_1+	 =  case happyOutTok happy_x_1 of { (happy_var_1@(Located _ (Token  Ident{}     _))) -> +	happyIn93+		 (let Token (Ident ns i) _ = thing happy_var_1+                                     in mkModName (ns ++ [i]) A.<$ happy_var_1+	)}++happyReduce_237 = happySpecReduce_1  79# happyReduction_237+happyReduction_237 happy_x_1+	 =  case happyOut92 happy_x_1 of { happy_var_1 -> +	happyIn94+		 (happy_var_1+	)}++happyReduce_238 = happySpecReduce_1  79# happyReduction_238+happyReduction_238 happy_x_1+	 =  case happyOutTok happy_x_1 of { (happy_var_1@(Located _ (Token  Ident{}     _))) -> +	happyIn94+		 (let Token (Ident ns i) _ = thing happy_var_1+                                     in mkQual (mkModName ns) (mkIdent (T.toStrict i)) A.<$ happy_var_1+	)}++happyReduce_239 = happySpecReduce_1  80# happyReduction_239+happyReduction_239 happy_x_1+	 =  case happyOut94 happy_x_1 of { happy_var_1 -> +	happyIn95+		 (happy_var_1+	)}++happyReduce_240 = happySpecReduce_1  80# happyReduction_240+happyReduction_240 happy_x_1+	 =  case happyOut52 happy_x_1 of { happy_var_1 -> +	happyIn95+		 (happy_var_1+	)}++happyReduce_241 = happySpecReduce_3  80# happyReduction_241+happyReduction_241 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut52 happy_x_2 of { happy_var_2 -> +	happyIn95+		 (happy_var_2+	)}++happyReduce_242 = happySpecReduce_1  81# happyReduction_242+happyReduction_242 happy_x_1+	 =  case happyOut94 happy_x_1 of { happy_var_1 -> +	happyIn96+		 (at happy_var_1 $ TUser (thing happy_var_1) []+	)}++happyReduce_243 = happySpecReduce_1  81# happyReduction_243+happyReduction_243 happy_x_1+	 =  case happyOutTok happy_x_1 of { (happy_var_1@(Located _ (Token (Num   {}) _))) -> +	happyIn96+		 (at happy_var_1 $ TNum  (getNum happy_var_1)+	)}++happyReduce_244 = happyMonadReduce 3# 81# happyReduction_244+happyReduction_244 (happy_x_3 `HappyStk`+	happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym ParenL  ) _)) -> +	case happyOut83 happy_x_2 of { happy_var_2 -> +	case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym ParenR  ) _)) -> +	( validDemotedType (rComb happy_var_1 happy_var_3) happy_var_2)}}}+	) (\r -> happyReturn (happyIn96 r))++happyReduce_245 = happySpecReduce_2  81# happyReduction_245+happyReduction_245 happy_x_2+	happy_x_1+	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym CurlyL  ) _)) -> +	case happyOutTok happy_x_2 of { (Located happy_var_2 (Token (Sym CurlyR  ) _)) -> +	happyIn96+		 (at (happy_var_1,happy_var_2) (TRecord [])+	)}}++happyReduce_246 = happySpecReduce_3  81# happyReduction_246+happyReduction_246 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym CurlyL  ) _)) -> +	case happyOut98 happy_x_2 of { happy_var_2 -> +	case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym CurlyR  ) _)) -> +	happyIn96+		 (at (happy_var_1,happy_var_3) (TRecord (reverse happy_var_2))+	)}}}++happyReduce_247 = happySpecReduce_3  81# happyReduction_247+happyReduction_247 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym CurlyL  ) _)) -> +	case happyOut83 happy_x_2 of { happy_var_2 -> +	case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym CurlyR  ) _)) -> +	happyIn96+		 (anonRecord (getLoc (happy_var_1,happy_var_3)) [happy_var_2]+	)}}}++happyReduce_248 = happySpecReduce_3  81# happyReduction_248+happyReduction_248 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym CurlyL  ) _)) -> +	case happyOut88 happy_x_2 of { happy_var_2 -> +	case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym CurlyR  ) _)) -> +	happyIn96+		 (anonRecord (getLoc (happy_var_1,happy_var_3)) (reverse happy_var_2)+	)}}}++happyReduce_249 = happySpecReduce_3  82# happyReduction_249+happyReduction_249 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut91 happy_x_1 of { happy_var_1 -> +	case happyOut83 happy_x_3 of { happy_var_3 -> +	happyIn97+		 (Named { name = happy_var_1, value = happy_var_3 }+	)}}++happyReduce_250 = happySpecReduce_1  83# happyReduction_250+happyReduction_250 happy_x_1+	 =  case happyOut97 happy_x_1 of { happy_var_1 -> +	happyIn98+		 ([happy_var_1]+	)}++happyReduce_251 = happySpecReduce_3  83# happyReduction_251+happyReduction_251 happy_x_3+	happy_x_2+	happy_x_1+	 =  case happyOut98 happy_x_1 of { happy_var_1 -> +	case happyOut97 happy_x_3 of { happy_var_3 -> +	happyIn98+		 (happy_var_3 : happy_var_1+	)}}++happyNewToken action sts stk+	= lexerP(\tk -> +	let cont i = happyDoAction i tk action sts stk in+	case tk of {+	Located _ (Token EOF _) -> happyDoAction 59# tk action sts stk;+	happy_dollar_dollar@(Located _ (Token (Num   {}) _)) -> cont 1#;+	happy_dollar_dollar@(Located _ (Token (StrLit {}) _)) -> cont 2#;+	happy_dollar_dollar@(Located _ (Token (ChrLit {}) _)) -> cont 3#;+	happy_dollar_dollar@(Located _ (Token (Ident [] _) _)) -> cont 4#;+	happy_dollar_dollar@(Located _ (Token  Ident{}     _)) -> cont 5#;+	Located happy_dollar_dollar (Token (KW KW_include)   _) -> cont 6#;+	Located happy_dollar_dollar (Token (KW KW_import)    _) -> cont 7#;+	Located happy_dollar_dollar (Token (KW KW_as)        _) -> cont 8#;+	Located happy_dollar_dollar (Token (KW KW_hiding)    _) -> cont 9#;+	Located happy_dollar_dollar (Token (KW KW_private)   _) -> cont 10#;+	Located happy_dollar_dollar (Token (KW KW_property)  _) -> cont 11#;+	Located happy_dollar_dollar (Token (KW KW_infix)     _) -> cont 12#;+	Located happy_dollar_dollar (Token (KW KW_infixl)    _) -> cont 13#;+	Located happy_dollar_dollar (Token (KW KW_infixr)    _) -> cont 14#;+	Located happy_dollar_dollar (Token (KW KW_type   ) _) -> cont 15#;+	Located happy_dollar_dollar (Token (KW KW_newtype) _) -> cont 16#;+	Located happy_dollar_dollar (Token (KW KW_module ) _) -> cont 17#;+	Located happy_dollar_dollar (Token (KW KW_where  ) _) -> cont 18#;+	Located happy_dollar_dollar (Token (KW KW_let    ) _) -> cont 19#;+	Located happy_dollar_dollar (Token (KW KW_if     ) _) -> cont 20#;+	Located happy_dollar_dollar (Token (KW KW_then   ) _) -> cont 21#;+	Located happy_dollar_dollar (Token (KW KW_else   ) _) -> cont 22#;+	Located happy_dollar_dollar (Token (KW KW_x)       _) -> cont 23#;+	Located happy_dollar_dollar (Token (KW KW_primitive) _) -> cont 24#;+	Located happy_dollar_dollar (Token (Sym BracketL) _) -> cont 25#;+	Located happy_dollar_dollar (Token (Sym BracketR) _) -> cont 26#;+	Located happy_dollar_dollar (Token (Sym ArrL    ) _) -> cont 27#;+	Located happy_dollar_dollar (Token (Sym DotDot  ) _) -> cont 28#;+	Located happy_dollar_dollar (Token (Sym DotDotDot) _) -> cont 29#;+	Located happy_dollar_dollar (Token (Sym Bar     ) _) -> cont 30#;+	Located happy_dollar_dollar (Token (Sym ParenL  ) _) -> cont 31#;+	Located happy_dollar_dollar (Token (Sym ParenR  ) _) -> cont 32#;+	Located happy_dollar_dollar (Token (Sym Comma   ) _) -> cont 33#;+	Located happy_dollar_dollar (Token (Sym Semi    ) _) -> cont 34#;+	Located happy_dollar_dollar (Token (Sym Dot     ) _) -> cont 35#;+	Located happy_dollar_dollar (Token (Sym CurlyL  ) _) -> cont 36#;+	Located happy_dollar_dollar (Token (Sym CurlyR  ) _) -> cont 37#;+	Located happy_dollar_dollar (Token (Sym TriL    ) _) -> cont 38#;+	Located happy_dollar_dollar (Token (Sym TriR    ) _) -> cont 39#;+	Located happy_dollar_dollar (Token (Sym EqDef   ) _) -> cont 40#;+	Located happy_dollar_dollar (Token (Sym BackTick) _) -> cont 41#;+	Located happy_dollar_dollar (Token (Sym Colon   ) _) -> cont 42#;+	Located happy_dollar_dollar (Token (Sym ArrR    ) _) -> cont 43#;+	Located happy_dollar_dollar (Token (Sym FatArrR ) _) -> cont 44#;+	Located happy_dollar_dollar (Token (Sym Lambda  ) _) -> cont 45#;+	Located happy_dollar_dollar (Token (Sym Underscore ) _) -> cont 46#;+	Located happy_dollar_dollar (Token (Virt VCurlyL)  _) -> cont 47#;+	Located happy_dollar_dollar (Token (Virt VCurlyR)  _) -> cont 48#;+	Located happy_dollar_dollar (Token (Virt VSemi)    _) -> cont 49#;+	Located happy_dollar_dollar (Token (Op Plus)  _) -> cont 50#;+	Located happy_dollar_dollar (Token (Op Mul)   _) -> cont 51#;+	Located happy_dollar_dollar (Token (Op Exp)   _) -> cont 52#;+	Located happy_dollar_dollar (Token (Op Minus) _) -> cont 53#;+	Located happy_dollar_dollar (Token (Op Complement) _) -> cont 54#;+	Located happy_dollar_dollar (Token (Op Hash) _) -> cont 55#;+	happy_dollar_dollar@(Located _ (Token (Op (Other [] _)) _)) -> cont 56#;+	happy_dollar_dollar@(Located _ (Token (Op  Other{}   )  _)) -> cont 57#;+	happy_dollar_dollar@(Located _ (Token (White DocStr) _)) -> cont 58#;+	_ -> happyError' tk+	})++happyError_ 59# tk = happyError' tk+happyError_ _ tk = happyError' tk++happyThen :: () => ParseM a -> (a -> ParseM b) -> ParseM b+happyThen = (>>=)+happyReturn :: () => a -> ParseM a+happyReturn = (return)+happyThen1 = happyThen+happyReturn1 :: () => a -> ParseM a+happyReturn1 = happyReturn+happyError' :: () => (Located Token) -> ParseM a+happyError' tk = (\token -> happyError) tk++vmodule = happySomeParser where+  happySomeParser = happyThen (happyParse 0#) (\x -> happyReturn (happyOut15 x))++program = happySomeParser where+  happySomeParser = happyThen (happyParse 1#) (\x -> happyReturn (happyOut23 x))++programLayout = happySomeParser where+  happySomeParser = happyThen (happyParse 2#) (\x -> happyReturn (happyOut24 x))++expr = happySomeParser where+  happySomeParser = happyThen (happyParse 3#) (\x -> happyReturn (happyOut45 x))++decl = happySomeParser where+  happySomeParser = happyThen (happyParse 4#) (\x -> happyReturn (happyOut33 x))++decls = happySomeParser where+  happySomeParser = happyThen (happyParse 5#) (\x -> happyReturn (happyOut41 x))++declsLayout = happySomeParser where+  happySomeParser = happyThen (happyParse 6#) (\x -> happyReturn (happyOut43 x))++letDecl = happySomeParser where+  happySomeParser = happyThen (happyParse 7#) (\x -> happyReturn (happyOut34 x))++repl = happySomeParser where+  happySomeParser = happyThen (happyParse 8#) (\x -> happyReturn (happyOut44 x))++schema = happySomeParser where+  happySomeParser = happyThen (happyParse 9#) (\x -> happyReturn (happyOut75 x))++modName = happySomeParser where+  happySomeParser = happyThen (happyParse 10#) (\x -> happyReturn (happyOut93 x))++helpName = happySomeParser where+  happySomeParser = happyThen (happyParse 11#) (\x -> happyReturn (happyOut95 x))++happySeq = happyDontSeq+++parseModName :: String -> Maybe ModName+parseModName txt =+  case parseString defaultConfig { cfgModuleScope = False } modName txt of+    Right a -> Just (thing a)+    Left _  -> Nothing++parseHelpName :: String -> Maybe PName+parseHelpName txt =+  case parseString defaultConfig { cfgModuleScope = False } helpName txt of+    Right a -> Just (thing a)+    Left _  -> Nothing++addImplicitIncludes :: Config -> Program PName -> Program PName+addImplicitIncludes cfg (Program ds) =+  Program $ map path (cfgAutoInclude cfg) ++ ds+  where path p = Include Located { srcRange = rng, thing = p }+        rng    = Range { source = cfgSource cfg, from = start, to = start }+++parseProgramWith :: Config -> Text -> Either ParseError (Program PName)+parseProgramWith cfg s = case res s of+                          Left err -> Left err+                          Right a  -> Right (addImplicitIncludes cfg a)+  where+  res = parse cfg $ case cfgLayout cfg of+                      Layout   -> programLayout+                      NoLayout -> program++parseModule :: Config -> Text -> Either ParseError (Module PName)+parseModule cfg = parse cfg { cfgModuleScope = True } vmodule++parseProgram :: Layout -> Text -> Either ParseError (Program PName)+parseProgram l = parseProgramWith defaultConfig { cfgLayout = l }++parseExprWith :: Config -> Text -> Either ParseError (Expr PName)+parseExprWith cfg = parse cfg { cfgModuleScope = False } expr++parseExpr :: Text -> Either ParseError (Expr PName)+parseExpr = parseExprWith defaultConfig++parseDeclWith :: Config -> Text -> Either ParseError (Decl PName)+parseDeclWith cfg = parse cfg { cfgModuleScope = False } decl++parseDecl :: Text -> Either ParseError (Decl PName)+parseDecl = parseDeclWith defaultConfig++parseDeclsWith :: Config -> Text -> Either ParseError [Decl PName]+parseDeclsWith cfg = parse cfg { cfgModuleScope = ms } decls'+  where (ms, decls') = case cfgLayout cfg of+                         Layout   -> (True, declsLayout)+                         NoLayout -> (False, decls)++parseDecls :: Text -> Either ParseError [Decl PName]+parseDecls = parseDeclsWith defaultConfig++parseLetDeclWith :: Config -> Text -> Either ParseError (Decl PName)+parseLetDeclWith cfg = parse cfg { cfgModuleScope = False } letDecl++parseLetDecl :: Text -> Either ParseError (Decl PName)+parseLetDecl = parseLetDeclWith defaultConfig++parseReplWith :: Config -> Text -> Either ParseError (ReplInput PName)+parseReplWith cfg = parse cfg { cfgModuleScope = False } repl++parseRepl :: Text -> Either ParseError (ReplInput PName)+parseRepl = parseReplWith defaultConfig++parseSchemaWith :: Config -> Text -> Either ParseError (Schema PName)+parseSchemaWith cfg = parse cfg { cfgModuleScope = False } schema++parseSchema :: Text -> Either ParseError (Schema PName)+parseSchema = parseSchemaWith defaultConfig++-- vim: ft=haskell+{-# LINE 1 "templates/GenericTemplate.hs" #-}+{-# LINE 1 "templates/GenericTemplate.hs" #-}+{-# LINE 1 "<built-in>" #-}+{-# LINE 19 "<built-in>" #-}+{-# LINE 1 "/usr/local/Cellar/ghc/8.0.2/lib/ghc-8.0.2/include/ghcversion.h" #-}+++++++++++++++++++{-# LINE 20 "<built-in>" #-}+{-# LINE 1 "/var/folders/n8/s7z9ns8d4k39v2y_2sn__12m0000gp/T/ghc5977_0/ghc_2.h" #-}++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++{-# LINE 21 "<built-in>" #-} {-# LINE 1 "templates/GenericTemplate.hs" #-} -- Id: GenericTemplate.hs,v 1.26 2005/01/14 14:47:22 simonmar Exp  
dist/build/Cryptol/Parser/Lexer.hs view
@@ -1,3 +1,4 @@+{-# OPTIONS_GHC -fno-warn-unused-binds -fno-warn-missing-signatures #-} {-# LANGUAGE CPP,MagicHash #-} {-# LINE 1 "src/Cryptol/Parser/Lexer.x" #-} @@ -35,30 +36,33 @@ #endif #if __GLASGOW_HASKELL__ >= 503 import Data.Array-import Data.Char (ord) import Data.Array.Base (unsafeAt) #else import Array-import Char (ord) #endif #if __GLASGOW_HASKELL__ >= 503 import GHC.Exts #else import GlaExts #endif+alex_tab_size :: Int+alex_tab_size = 8 alex_base :: AlexAddr-alex_base = AlexA# "\x01\x00\x00\x00\x76\x00\x00\x00\x6c\x01\x00\x00\x62\x02\x00\x00\xd7\xff\xff\xff\x61\x03\x00\x00\x60\x03\x00\x00\xe0\x03\x00\x00\x60\x04\x00\x00\xe0\x04\x00\x00\x60\x05\x00\x00\xe0\x05\x00\x00\x60\x06\x00\x00\xe0\x06\x00\x00\x60\x07\x00\x00\xe0\x07\x00\x00\x60\x08\x00\x00\xe0\x08\x00\x00\x78\x00\x00\x00\x00\x00\x00\x00\x51\x09\x00\x00\x00\x00\x00\x00\xc2\x09\x00\x00\x00\x00\x00\x00\x33\x0a\x00\x00\x00\x00\x00\x00\xa4\x0a\x00\x00\x00\x00\x00\x00\x15\x0b\x00\x00\x00\x00\x00\x00\x86\x0b\x00\x00\xca\xff\xff\xff\x00\x00\x00\x00\xdd\x00\x00\x00\x00\x00\x00\x00\xc7\x0b\x00\x00\x00\x00\x00\x00\x08\x0c\x00\x00\x00\x00\x00\x00\x49\x0c\x00\x00\x00\x00\x00\x00\x8a\x0c\x00\x00\x00\x00\x00\x00\xcb\x0c\x00\x00\x5d\x00\x00\x00\xdf\xff\xff\xff\xd8\xff\xff\xff\xcb\x0d\x00\x00\x8b\x0d\x00\x00\x00\x00\x00\x00\x8b\x0e\x00\x00\x01\x0f\x00\x00\x4c\x0e\x00\x00\x00\x00\x00\x00\x01\x10\x00\x00\xc1\x0f\x00\x00\x00\x00\x00\x00\xc1\x10\x00\x00\x37\x11\x00\x00\x82\x10\x00\x00\x00\x00\x00\x00\x37\x12\x00\x00\xf7\x11\x00\x00\x00\x00\x00\x00\xf7\x12\x00\x00\xb7\x12\x00\x00\x00\x00\x00\x00\xed\xff\xff\xff\xb3\x13\x00\x00\xee\xff\xff\xff\xd6\x13\x00\x00\x00\x00\x00\x00\xf9\x13\x00\x00\x00\x00\x00\x00\xf8\x13\x00\x00\xef\xff\xff\xff\xdd\xff\xff\xff\x00\x00\x00\x00\xee\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe4\x15\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9b\x00\x00\x00\xda\x16\x00\x00\xd9\x17\x00\x00\x33\x18\x00\x00\x73\x18\x00\x00\xed\x18\x00\x00\x67\x19\x00\x00\xe1\x19\x00\x00\x5b\x1a\x00\x00\xd5\x1a\x00\x00\x4f\x1b\x00\x00\xc9\x1b\x00\x00\x43\x1c\x00\x00\xbd\x1c\x00\x00\x37\x1d\x00\x00\xb1\x1d\x00\x00\x2b\x1e\x00\x00\xa5\x1e\x00\x00\x1f\x1f\x00\x00\x99\x1f\x00\x00\x13\x20\x00\x00\x8d\x20\x00\x00\x07\x21\x00\x00\x81\x21\x00\x00\xfb\x21\x00\x00\xea\xff\xff\xff\x79\x00\x00\x00\x94\x00\x00\x00\x3d\x02\x00\x00\x55\x02\x00\x00\x75\x22\x00\x00\xef\x22\x00\x00\x69\x23\x00\x00\xe3\x23\x00\x00\x5d\x24\x00\x00\xd7\x24\x00\x00\x51\x25\x00\x00\xcb\x25\x00\x00\x45\x26\x00\x00\xbf\x26\x00\x00\x39\x27\x00\x00\xb3\x27\x00\x00\x2d\x28\x00\x00\xa7\x28\x00\x00\x21\x29\x00\x00\x9b\x29\x00\x00\x15\x2a\x00\x00\x8f\x2a\x00\x00\x09\x2b\x00\x00\x83\x2b\x00\x00\xfd\x2b\x00\x00\x77\x2c\x00\x00\xf1\x2c\x00\x00\x6b\x2d\x00\x00\xe5\x2d\x00\x00\x5f\x2e\x00\x00\xd9\x2e\x00\x00\x53\x2f\x00\x00\xcd\x2f\x00\x00\x47\x30\x00\x00\xc1\x30\x00\x00\x3b\x31\x00\x00\xb5\x31\x00\x00\x2f\x32\x00\x00\xa9\x32\x00\x00\x23\x33\x00\x00\x9d\x33\x00\x00\x17\x34\x00\x00\x91\x34\x00\x00\x0b\x35\x00\x00\x85\x35\x00\x00\xff\x35\x00\x00\x79\x36\x00\x00\xf3\x36\x00\x00\x6d\x37\x00\x00\xe7\x37\x00\x00\x61\x38\x00\x00\xdb\x38\x00\x00\x55\x39\x00\x00\xcf\x39\x00\x00\x49\x3a\x00\x00\xc3\x3a\x00\x00\x3d\x3b\x00\x00\xb7\x3b\x00\x00\x31\x3c\x00\x00\xab\x3c\x00\x00\x25\x3d\x00\x00\x9f\x3d\x00\x00\x19\x3e\x00\x00\x93\x3e\x00\x00\x0d\x3f\x00\x00\x87\x3f\x00\x00\x01\x40\x00\x00\x7b\x40\x00\x00\xf5\x40\x00\x00\x6f\x41\x00\x00\xe9\x41\x00\x00\x63\x42\x00\x00\xbd\x42\x00\x00\xe0\x42\x00\x00\x03\x43\x00\x00\x26\x43\x00\x00\x49\x43\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf1\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xf2\xff\xff\xff\x00\x00\x00\x00\x6c\x43\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8f\x43\x00\x00\xb2\x43\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd5\x43\x00\x00\xf8\x43\x00\x00\x1b\x44\x00\x00\x3e\x44\x00\x00\x61\x44\x00\x00\x84\x44\x00\x00\xa7\x44\x00\x00\xca\x44\x00\x00\xed\x44\x00\x00\x10\x45\x00\x00"#+alex_base = AlexA# "\x01\x00\x00\x00\x76\x00\x00\x00\x6c\x01\x00\x00\x62\x02\x00\x00\xd7\xff\xff\xff\x61\x03\x00\x00\x60\x03\x00\x00\xe0\x03\x00\x00\x60\x04\x00\x00\xe0\x04\x00\x00\x60\x05\x00\x00\xe0\x05\x00\x00\x60\x06\x00\x00\xe0\x06\x00\x00\x60\x07\x00\x00\xe0\x07\x00\x00\x60\x08\x00\x00\xe0\x08\x00\x00\x78\x00\x00\x00\x00\x00\x00\x00\x51\x09\x00\x00\x00\x00\x00\x00\xc2\x09\x00\x00\x00\x00\x00\x00\x33\x0a\x00\x00\x00\x00\x00\x00\xa4\x0a\x00\x00\x00\x00\x00\x00\x15\x0b\x00\x00\x00\x00\x00\x00\x86\x0b\x00\x00\xca\xff\xff\xff\x00\x00\x00\x00\xdd\x00\x00\x00\x00\x00\x00\x00\xc7\x0b\x00\x00\x00\x00\x00\x00\x08\x0c\x00\x00\x00\x00\x00\x00\x49\x0c\x00\x00\x00\x00\x00\x00\x8a\x0c\x00\x00\x00\x00\x00\x00\xcb\x0c\x00\x00\x5d\x00\x00\x00\xdf\xff\xff\xff\xd8\xff\xff\xff\xcb\x0d\x00\x00\x8b\x0d\x00\x00\x00\x00\x00\x00\x8b\x0e\x00\x00\x01\x0f\x00\x00\x4c\x0e\x00\x00\x00\x00\x00\x00\x01\x10\x00\x00\xc1\x0f\x00\x00\x00\x00\x00\x00\xc1\x10\x00\x00\x37\x11\x00\x00\x82\x10\x00\x00\x00\x00\x00\x00\x37\x12\x00\x00\xf7\x11\x00\x00\x00\x00\x00\x00\xf7\x12\x00\x00\xb7\x12\x00\x00\x00\x00\x00\x00\xed\xff\xff\xff\xb3\x13\x00\x00\xee\xff\xff\xff\xd6\x13\x00\x00\x00\x00\x00\x00\xf9\x13\x00\x00\x00\x00\x00\x00\xff\x13\x00\x00\xef\xff\xff\xff\xdd\xff\xff\xff\x00\x00\x00\x00\xf5\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xeb\x15\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9b\x00\x00\x00\xe1\x16\x00\x00\xe0\x17\x00\x00\x3a\x18\x00\x00\x7a\x18\x00\x00\xf4\x18\x00\x00\x6e\x19\x00\x00\xe8\x19\x00\x00\x62\x1a\x00\x00\xdc\x1a\x00\x00\x56\x1b\x00\x00\xd0\x1b\x00\x00\x4a\x1c\x00\x00\xc4\x1c\x00\x00\x3e\x1d\x00\x00\xb8\x1d\x00\x00\x32\x1e\x00\x00\xac\x1e\x00\x00\x26\x1f\x00\x00\xa0\x1f\x00\x00\x1a\x20\x00\x00\x94\x20\x00\x00\x0e\x21\x00\x00\x88\x21\x00\x00\x02\x22\x00\x00\xea\xff\xff\xff\x79\x00\x00\x00\x94\x00\x00\x00\x3d\x02\x00\x00\x55\x02\x00\x00\x7c\x22\x00\x00\xf6\x22\x00\x00\x70\x23\x00\x00\xea\x23\x00\x00\x64\x24\x00\x00\xde\x24\x00\x00\x58\x25\x00\x00\xd2\x25\x00\x00\x4c\x26\x00\x00\xc6\x26\x00\x00\x40\x27\x00\x00\xba\x27\x00\x00\x34\x28\x00\x00\xae\x28\x00\x00\x28\x29\x00\x00\xa2\x29\x00\x00\x1c\x2a\x00\x00\x96\x2a\x00\x00\x10\x2b\x00\x00\x8a\x2b\x00\x00\x04\x2c\x00\x00\x7e\x2c\x00\x00\xf8\x2c\x00\x00\x72\x2d\x00\x00\xec\x2d\x00\x00\x66\x2e\x00\x00\xe0\x2e\x00\x00\x5a\x2f\x00\x00\xd4\x2f\x00\x00\x4e\x30\x00\x00\xc8\x30\x00\x00\x42\x31\x00\x00\xbc\x31\x00\x00\x36\x32\x00\x00\xb0\x32\x00\x00\x2a\x33\x00\x00\xa4\x33\x00\x00\x1e\x34\x00\x00\x98\x34\x00\x00\x12\x35\x00\x00\x8c\x35\x00\x00\x06\x36\x00\x00\x80\x36\x00\x00\xfa\x36\x00\x00\x74\x37\x00\x00\xee\x37\x00\x00\x68\x38\x00\x00\xe2\x38\x00\x00\x5c\x39\x00\x00\xd6\x39\x00\x00\x50\x3a\x00\x00\xca\x3a\x00\x00\x44\x3b\x00\x00\xbe\x3b\x00\x00\x38\x3c\x00\x00\xb2\x3c\x00\x00\x2c\x3d\x00\x00\xa6\x3d\x00\x00\x20\x3e\x00\x00\x9a\x3e\x00\x00\x14\x3f\x00\x00\x8e\x3f\x00\x00\x08\x40\x00\x00\x82\x40\x00\x00\xfc\x40\x00\x00\x76\x41\x00\x00\xf0\x41\x00\x00\x6a\x42\x00\x00\xc4\x42\x00\x00\xe7\x42\x00\x00\x0a\x43\x00\x00\x2d\x43\x00\x00\x50\x43\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x73\x43\x00\x00\x96\x43\x00\x00\x00\x00\x00\x00\xb9\x43\x00\x00\xdc\x43\x00\x00\xff\x43\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x22\x44\x00\x00\x45\x44\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x68\x44\x00\x00\x8b\x44\x00\x00\xae\x44\x00\x00\xd1\x44\x00\x00\xf4\x44\x00\x00\x17\x45\x00\x00\x3a\x45\x00\x00\x5d\x45\x00\x00\x80\x45\x00\x00\xa3\x45\x00\x00"#  alex_table :: AlexAddr-alex_table = AlexA# "\x00\x00\x04\x00\x97\x00\x97\x00\x05\x00\xd6\x00\x49\x00\x43\x00\x6f\x00\x6f\x00\x56\x00\x56\x00\x56\x00\x56\x00\x56\x00\x70\x00\x70\x00\x70\x00\x70\x00\x70\x00\x70\x00\x70\x00\x70\x00\x45\x00\x45\x00\x04\x00\x6f\x00\x6f\x00\x47\x00\x47\x00\x49\x00\xc2\x00\xc3\x00\x56\x00\xd6\x00\xcd\x00\xd3\x00\xd6\x00\xd6\x00\xd6\x00\xce\x00\xc5\x00\xc6\x00\xd1\x00\xcf\x00\xbd\x00\xd0\x00\xbf\x00\xd8\x00\x72\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\xc0\x00\xbe\x00\xd5\x00\xbc\x00\xd6\x00\xd6\x00\xd6\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\xc7\x00\xb8\x00\xc8\x00\xd7\x00\x74\x00\xc1\x00\x7e\x00\x97\x00\x97\x00\x97\x00\xa6\x00\x97\x00\x97\x00\x94\x00\xb6\x00\x97\x00\x97\x00\x84\x00\x92\x00\x96\x00\x97\x00\x99\x00\x97\x00\x97\x00\x97\x00\xa4\x00\x97\x00\x97\x00\x9d\x00\x67\x00\x97\x00\x97\x00\xc9\x00\xc4\x00\xca\x00\xd4\x00\x55\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x56\x00\x56\x00\x56\x00\x56\x00\x56\x00\x70\x00\x70\x00\x70\x00\x70\x00\x70\x00\x70\x00\x70\x00\x70\x00\x00\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x56\x00\x00\x00\x00\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x00\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x36\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x37\x00\x09\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x25\x00\x0f\x00\x17\x00\x17\x00\x17\x00\x18\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4c\x00\x30\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x40\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x41\x00\x06\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2b\x00\x0c\x00\x1d\x00\x1d\x00\x1d\x00\x1e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x51\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4f\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x00\x00\x00\x00\x00\x00\x2e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2c\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x00\x00\x00\x00\x3a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3d\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3e\x00\x07\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x29\x00\x0d\x00\x1b\x00\x1b\x00\x1b\x00\x1c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x58\x00\x58\x00\x00\x00\x59\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x59\x00\x00\x00\x59\x00\x59\x00\x59\x00\x59\x00\x00\x00\x00\x00\x00\x00\x59\x00\x59\x00\x00\x00\x59\x00\x00\x00\x59\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x59\x00\x59\x00\x59\x00\x59\x00\x59\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x00\x00\x59\x00\x00\x00\x59\x00\x58\x00\x00\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x00\x00\x59\x00\x00\x00\x59\x00\x40\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x3d\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x39\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x36\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x32\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x2f\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x06\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x07\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x08\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x09\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x0a\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x0b\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x21\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x23\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x25\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x29\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x34\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x37\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x32\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x0a\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x23\x00\x10\x00\x15\x00\x15\x00\x15\x00\x16\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x39\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3b\x00\x08\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x27\x00\x0e\x00\x19\x00\x19\x00\x19\x00\x1a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xd6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\x46\x00\xd6\x00\x00\x00\xd6\x00\x00\x00\x48\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\x46\x00\xd6\x00\xff\xff\xd6\x00\x00\x00\x48\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\xff\xff\xd6\x00\xd6\x00\x00\x00\xd6\x00\xff\xff\xd6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\x00\x00\xd6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x40\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x41\x00\x06\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2b\x00\x0c\x00\x1d\x00\x1d\x00\x1d\x00\x1e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3d\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3e\x00\x07\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x29\x00\x0d\x00\x1b\x00\x1b\x00\x1b\x00\x1c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x36\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x37\x00\x09\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x25\x00\x0f\x00\x17\x00\x17\x00\x17\x00\x18\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2f\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x30\x00\x0b\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x21\x00\x11\x00\x13\x00\x13\x00\x13\x00\x14\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x58\x00\x58\x00\x58\x00\x00\x00\x00\x00\x00\x00\x58\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x58\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x00\x00\x00\x00\x00\x00\x59\x00\x58\x00\x00\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x59\x00\x00\x00\x59\x00\x59\x00\x59\x00\x59\x00\x00\x00\x00\x00\x00\x00\x59\x00\x59\x00\x00\x00\x59\x00\x00\x00\x59\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x59\x00\x59\x00\x59\x00\x59\x00\x59\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x59\x00\x00\x00\x59\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x59\x00\x00\x00\x59\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x6b\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x6c\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x5a\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x5d\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x5e\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x5f\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x60\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x61\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x62\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x64\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x65\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x69\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x6a\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x6e\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x75\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x7a\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\xb5\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\xb4\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\xb2\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\xb1\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\xb0\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\xaf\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\xae\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\xad\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x82\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\xaa\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\xa9\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\xa8\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\xa7\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x8b\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\xa1\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x98\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\xa5\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x9f\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x9e\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x9b\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x9a\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x93\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x91\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x90\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x8f\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x8e\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x8d\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x8c\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x8a\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x89\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x88\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x95\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x87\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x86\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\xa0\x00\x97\x00\x97\x00\x85\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x83\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\xab\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\xac\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x81\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\xa2\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x80\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x7f\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\xb3\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x7d\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x7c\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x7b\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x79\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x78\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x77\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x76\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\xb7\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x6d\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x68\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x66\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x63\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x5c\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x9c\x00\xa3\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x5b\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\xd6\x00\xd6\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\xd6\x00\xd6\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\xd6\x00\xd6\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\xd6\x00\xd6\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\xd6\x00\xd6\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xbb\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\xd6\x00\xd6\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xcc\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\xd6\x00\xd6\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\xd6\x00\xd6\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\xd6\x00\xd6\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\xd6\x00\xd6\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xb9\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\xd6\x00\xd6\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\xd6\x00\xd6\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\xd6\x00\xd6\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\xd6\x00\xd6\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\xd6\x00\xd6\x00\x00\x00\xba\x00\x00\x00\xd6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\xd6\x00\xd6\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\xd6\x00\xd6\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcb\x00\x00\x00\xd6\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\x00\x00\x44\x00\xd6\x00\x00\x00\xd6\x00\x00\x00\x57\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\x00\x00\xd2\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\x00\x00\xd6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"#+alex_table = AlexA# "\x00\x00\x04\x00\x97\x00\x97\x00\x05\x00\xd6\x00\x49\x00\x43\x00\x6f\x00\x6f\x00\x56\x00\x56\x00\x56\x00\x56\x00\x56\x00\x70\x00\x70\x00\x70\x00\x70\x00\x70\x00\x70\x00\x70\x00\x70\x00\x45\x00\x45\x00\x04\x00\x6f\x00\x6f\x00\x47\x00\x47\x00\x49\x00\x00\x00\x00\x00\x56\x00\xd6\x00\xcd\x00\xd3\x00\xd6\x00\xd6\x00\xd6\x00\xce\x00\xc5\x00\xc6\x00\xd1\x00\xcf\x00\xbd\x00\xd0\x00\xbf\x00\xd8\x00\x72\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\xc0\x00\xbe\x00\xd5\x00\xbc\x00\xd6\x00\xd6\x00\xd6\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\xc7\x00\xb8\x00\xc8\x00\xd7\x00\x74\x00\xc1\x00\x7e\x00\x97\x00\x97\x00\x97\x00\xa6\x00\x97\x00\x97\x00\x94\x00\xb6\x00\x97\x00\x97\x00\x84\x00\x92\x00\x96\x00\x97\x00\x99\x00\x97\x00\x97\x00\x97\x00\xa4\x00\x97\x00\x97\x00\x9d\x00\x67\x00\x97\x00\x97\x00\xc9\x00\xc4\x00\xca\x00\xd4\x00\x55\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x56\x00\x56\x00\x56\x00\x56\x00\x56\x00\x70\x00\x70\x00\x70\x00\x70\x00\x70\x00\x70\x00\x70\x00\x70\x00\x00\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x56\x00\x00\x00\x00\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x00\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x36\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x37\x00\x09\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x25\x00\x0f\x00\x17\x00\x17\x00\x17\x00\x18\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4c\x00\x30\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x40\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x41\x00\x06\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2b\x00\x0c\x00\x1d\x00\x1d\x00\x1d\x00\x1e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x51\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4f\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x00\x00\x00\x00\x00\x00\x2e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2c\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x00\x00\x00\x00\x3a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3d\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3e\x00\x07\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x29\x00\x0d\x00\x1b\x00\x1b\x00\x1b\x00\x1c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x58\x00\x58\x00\x00\x00\x59\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x59\x00\x00\x00\x59\x00\x59\x00\x59\x00\x59\x00\x00\x00\x00\x00\x00\x00\x59\x00\x59\x00\x00\x00\x59\x00\x59\x00\x59\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x59\x00\x00\x00\x59\x00\x59\x00\x59\x00\x59\x00\x59\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x00\x00\x59\x00\x00\x00\x59\x00\x58\x00\x00\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x00\x00\x59\x00\x00\x00\x59\x00\x40\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x3d\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x39\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x36\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x32\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x2f\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x06\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x07\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x08\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x09\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x0a\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x0b\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x21\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x23\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x25\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x29\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x34\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x37\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x32\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x0a\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x23\x00\x10\x00\x15\x00\x15\x00\x15\x00\x16\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x39\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3b\x00\x08\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x27\x00\x0e\x00\x19\x00\x19\x00\x19\x00\x1a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xd6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\x46\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\x48\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\x46\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\x48\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\x00\x00\xd6\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\x00\x00\xd6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x40\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x41\x00\x06\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2b\x00\x0c\x00\x1d\x00\x1d\x00\x1d\x00\x1e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3d\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3e\x00\x07\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x29\x00\x0d\x00\x1b\x00\x1b\x00\x1b\x00\x1c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x36\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x37\x00\x09\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x25\x00\x0f\x00\x17\x00\x17\x00\x17\x00\x18\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2f\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x30\x00\x0b\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x21\x00\x11\x00\x13\x00\x13\x00\x13\x00\x14\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x58\x00\x58\x00\x58\x00\x00\x00\x00\x00\x00\x00\x58\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x58\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x00\x00\x00\x00\x00\x00\x59\x00\x58\x00\x00\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x59\x00\x00\x00\x59\x00\x59\x00\x59\x00\x59\x00\x00\x00\x00\x00\x00\x00\x59\x00\x59\x00\x00\x00\x59\x00\x59\x00\x59\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x59\x00\x00\x00\x59\x00\x59\x00\x59\x00\x59\x00\x59\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x59\x00\x00\x00\x59\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x59\x00\x00\x00\x59\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x6b\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x6c\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x5a\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x5d\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x5e\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x5f\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x60\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x61\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x62\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x64\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x65\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x69\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x6a\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x6e\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x75\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x7a\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\xb5\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\xb4\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\xb2\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\xb1\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\xb0\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\xaf\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\xae\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\xad\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x82\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\xaa\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\xa9\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\xa8\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\xa7\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x8b\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\xa1\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x98\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\xa5\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x9f\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x9e\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x9b\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x9a\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x93\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x91\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x90\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x8f\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x8e\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x8d\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x8c\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x8a\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x89\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x88\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x95\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x87\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x86\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\xa0\x00\x97\x00\x97\x00\x85\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x83\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\xab\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\xac\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x81\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\xa2\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x80\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x7f\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\xb3\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x7d\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x7c\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x7b\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x79\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x78\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x77\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x76\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\xb7\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x6d\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x68\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x66\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x63\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x5c\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x9c\x00\xa3\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x5b\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\xd6\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\xd6\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\xd6\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\xd6\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\xd6\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xbb\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\xd6\x00\xd6\x00\x00\x00\xd6\x00\xc2\x00\xd6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\xd6\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\xd6\x00\xd6\x00\x00\x00\xd6\x00\xc3\x00\xd6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\xd6\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\xd6\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xcc\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\xd6\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\xd6\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\xd6\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\xd6\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xb9\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\xd6\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\xd6\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\xd6\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\xd6\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\xd6\x00\xd6\x00\x00\x00\xba\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\xd6\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\xd6\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcb\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\x00\x00\x44\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\x57\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd2\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\x00\x00\xd6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"#  alex_check :: AlexAddr-alex_check = AlexA# "\xff\xff\x2a\x00\x01\x00\x02\x00\x3a\x00\x04\x00\x2f\x00\x2a\x00\x30\x00\x31\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x2a\x00\x2a\x00\x2a\x00\x30\x00\x31\x00\x2f\x00\x2f\x00\x2f\x00\x2e\x00\x2e\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x0a\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x0a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x2f\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x0a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x22\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x62\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x6f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x78\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x01\x00\x02\x00\xff\xff\x04\x00\xff\xff\xff\xff\xff\xff\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\xff\xff\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\xff\xff\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\xff\xff\x7e\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\x0a\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\x0a\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x04\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x04\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\xff\xff\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x04\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x0a\x00\x2d\x00\xff\xff\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\x5e\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\xff\xff\xff\xff\x2a\x00\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2f\x00\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7c\x00\xff\xff\x7e\x00\x5c\x00\xff\xff\x5e\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7c\x00\xff\xff\x7e\x00\x5c\x00\xff\xff\x5e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7c\x00\xff\xff\x7e\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x0a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x0a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x0a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\x04\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\xff\xff\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\xff\xff\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\x5e\x00\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x7c\x00\xff\xff\x7e\x00\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\x04\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x04\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\xff\xff\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x04\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\xff\xff\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\x5e\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x04\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\xff\xff\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7c\x00\xff\xff\x7e\x00\x5c\x00\xff\xff\x5e\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x04\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\xff\xff\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7c\x00\xff\xff\x7e\x00\x5c\x00\xff\xff\x5e\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x04\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\xff\xff\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7c\x00\xff\xff\x7e\x00\x5c\x00\xff\xff\x5e\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x04\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\xff\xff\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7c\x00\xff\xff\x7e\x00\x5c\x00\xff\xff\x5e\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x04\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\xff\xff\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7c\x00\xff\xff\x7e\x00\x5c\x00\xff\xff\x5e\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x04\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\xff\xff\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7c\x00\xff\xff\x7e\x00\x5c\x00\xff\xff\x5e\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x04\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\xff\xff\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7c\x00\xff\xff\x7e\x00\x5c\x00\xff\xff\x5e\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x04\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\xff\xff\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7c\x00\xff\xff\x7e\x00\x5c\x00\xff\xff\x5e\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x04\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\xff\xff\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7c\x00\xff\xff\x7e\x00\x5c\x00\xff\xff\x5e\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x04\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\xff\xff\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7c\x00\xff\xff\x7e\x00\x5c\x00\xff\xff\x5e\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x04\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\xff\xff\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7c\x00\xff\xff\x7e\x00\x5c\x00\xff\xff\x5e\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x04\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\xff\xff\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7c\x00\xff\xff\x7e\x00\x5c\x00\xff\xff\x5e\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x04\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\xff\xff\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7c\x00\xff\xff\x7e\x00\x5c\x00\xff\xff\x5e\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x04\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\xff\xff\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7c\x00\xff\xff\x7e\x00\x5c\x00\xff\xff\x5e\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x04\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\xff\xff\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7c\x00\xff\xff\x7e\x00\x5c\x00\xff\xff\x5e\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\xff\xff\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\xff\xff\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7c\x00\xff\xff\x7e\x00\x5c\x00\xff\xff\x5e\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7c\x00\xff\xff\x7e\x00\x5c\x00\xff\xff\x5e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7c\x00\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"#+alex_check = AlexA# "\xff\xff\x2a\x00\x01\x00\x02\x00\x3a\x00\x04\x00\x2f\x00\x2a\x00\x30\x00\x31\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x2a\x00\x2a\x00\x2a\x00\x30\x00\x31\x00\x2f\x00\x2f\x00\x2f\x00\xff\xff\xff\xff\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x0a\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x0a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x2f\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x0a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x22\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x62\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x6f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x78\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x01\x00\x02\x00\xff\xff\x04\x00\xff\xff\xff\xff\xff\xff\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\xff\xff\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\xff\xff\x7e\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\x0a\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\x0a\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x04\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x04\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x04\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\xff\xff\xff\xff\xff\xff\x0a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\x3a\x00\x5e\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\xff\xff\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\x2a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x2f\x00\x7c\x00\xff\xff\x7e\x00\x5c\x00\x3a\x00\x5e\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7c\x00\xff\xff\x7e\x00\x5c\x00\xff\xff\x5e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7c\x00\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x0a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x0a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x0a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\x04\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\xff\xff\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\x5e\x00\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x7c\x00\xff\xff\x7e\x00\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\x04\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x04\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x04\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\x3a\x00\x5e\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x04\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7c\x00\xff\xff\x7e\x00\x5c\x00\x3a\x00\x5e\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x04\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7c\x00\xff\xff\x7e\x00\x5c\x00\x3a\x00\x5e\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x04\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7c\x00\xff\xff\x7e\x00\x5c\x00\x3a\x00\x5e\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x04\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7c\x00\xff\xff\x7e\x00\x5c\x00\x3a\x00\x5e\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x04\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7c\x00\xff\xff\x7e\x00\x5c\x00\x3a\x00\x5e\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x04\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7c\x00\xff\xff\x7e\x00\x5c\x00\x3a\x00\x5e\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x04\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7c\x00\xff\xff\x7e\x00\x5c\x00\x3a\x00\x5e\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x04\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7c\x00\xff\xff\x7e\x00\x5c\x00\x3a\x00\x5e\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x04\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7c\x00\xff\xff\x7e\x00\x5c\x00\x3a\x00\x5e\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x04\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7c\x00\xff\xff\x7e\x00\x5c\x00\x3a\x00\x5e\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x04\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7c\x00\xff\xff\x7e\x00\x5c\x00\x3a\x00\x5e\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x04\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7c\x00\xff\xff\x7e\x00\x5c\x00\x3a\x00\x5e\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x04\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7c\x00\xff\xff\x7e\x00\x5c\x00\x3a\x00\x5e\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x04\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7c\x00\xff\xff\x7e\x00\x5c\x00\x3a\x00\x5e\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x04\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7c\x00\xff\xff\x7e\x00\x5c\x00\x3a\x00\x5e\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x04\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7c\x00\xff\xff\x7e\x00\x5c\x00\x3a\x00\x5e\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x04\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7c\x00\xff\xff\x7e\x00\x5c\x00\x3a\x00\x5e\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x04\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7c\x00\xff\xff\x7e\x00\x5c\x00\x3a\x00\x5e\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x04\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7c\x00\xff\xff\x7e\x00\x5c\x00\x3a\x00\x5e\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\xff\xff\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7c\x00\xff\xff\x7e\x00\x5c\x00\x3a\x00\x5e\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7c\x00\xff\xff\x7e\x00\x5c\x00\xff\xff\x5e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7c\x00\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"#  alex_deflt :: AlexAddr alex_deflt = AlexA# "\xff\xff\x52\x00\x4a\x00\x4e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\x20\x00\x22\x00\x22\x00\x24\x00\x24\x00\x26\x00\x26\x00\x28\x00\x28\x00\x2a\x00\x2a\x00\xff\xff\x31\x00\x31\x00\x35\x00\x35\x00\x38\x00\x38\x00\x3c\x00\x3c\x00\x3f\x00\x3f\x00\x42\x00\x42\x00\xff\xff\xff\xff\xff\xff\x57\x00\x57\x00\x57\x00\x54\x00\x54\x00\x54\x00\x54\x00\x52\x00\x52\x00\x52\x00\x50\x00\x50\x00\x50\x00\x50\x00\x4e\x00\x4e\x00\x4e\x00\x4a\x00\x4a\x00\x4a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4a\x00\xff\xff\xff\xff\xff\xff\x4e\x00\xff\xff\xff\xff\xff\xff\x52\x00\xff\xff\xff\xff\xff\xff\xff\xff\x57\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"# -alex_accept = listArray (0::Int,216) [AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAcc (alex_action_0),AlexAcc (alex_action_0),AlexAcc (alex_action_1),AlexAcc (alex_action_1),AlexAcc (alex_action_2),AlexAcc (alex_action_2),AlexAcc (alex_action_3),AlexAcc (alex_action_4),AlexAcc (alex_action_5),AlexAcc (alex_action_6),AlexAcc (alex_action_7),AlexAcc (alex_action_8),AlexAcc (alex_action_9),AlexAcc (alex_action_10),AlexAcc (alex_action_11),AlexAcc (alex_action_12),AlexAcc (alex_action_13),AlexAcc (alex_action_14),AlexAcc (alex_action_15),AlexAcc (alex_action_16),AlexAcc (alex_action_17),AlexAcc (alex_action_18),AlexAcc (alex_action_19),AlexAcc (alex_action_20),AlexAcc (alex_action_21),AlexAcc (alex_action_22),AlexAcc (alex_action_23),AlexAcc (alex_action_24),AlexAcc (alex_action_25),AlexAcc (alex_action_26),AlexAcc (alex_action_27),AlexAcc (alex_action_28),AlexAcc (alex_action_29),AlexAcc (alex_action_30),AlexAcc (alex_action_31),AlexAcc (alex_action_32),AlexAcc (alex_action_33),AlexAcc (alex_action_34),AlexAcc (alex_action_35),AlexAcc (alex_action_36),AlexAcc (alex_action_38),AlexAcc (alex_action_39),AlexAcc (alex_action_40),AlexAcc (alex_action_41),AlexAcc (alex_action_42),AlexAcc (alex_action_43),AlexAcc (alex_action_44),AlexAcc (alex_action_44),AlexAcc (alex_action_45),AlexAcc (alex_action_46),AlexAcc (alex_action_47),AlexAcc (alex_action_47),AlexAcc (alex_action_47),AlexAcc (alex_action_47),AlexAcc (alex_action_47),AlexAcc (alex_action_47),AlexAcc (alex_action_47),AlexAcc (alex_action_47),AlexAcc (alex_action_47),AlexAcc (alex_action_47),AlexAcc (alex_action_47),AlexAcc (alex_action_47),AlexAcc (alex_action_47),AlexAcc (alex_action_47),AlexAcc (alex_action_47),AlexAcc (alex_action_47),AlexAcc (alex_action_47),AlexAcc (alex_action_47),AlexAcc (alex_action_47),AlexAcc (alex_action_47),AlexAcc (alex_action_47),AlexAcc (alex_action_47),AlexAcc (alex_action_47),AlexAcc (alex_action_47),AlexAcc (alex_action_47),AlexAcc (alex_action_47),AlexAcc (alex_action_47),AlexAcc (alex_action_47),AlexAcc (alex_action_47),AlexAcc (alex_action_47),AlexAcc (alex_action_47),AlexAcc (alex_action_47),AlexAcc (alex_action_47),AlexAcc (alex_action_47),AlexAcc (alex_action_47),AlexAcc (alex_action_47),AlexAcc (alex_action_47),AlexAcc (alex_action_47),AlexAcc (alex_action_47),AlexAcc (alex_action_47),AlexAcc (alex_action_47),AlexAcc (alex_action_47),AlexAcc (alex_action_47),AlexAcc (alex_action_47),AlexAcc (alex_action_47),AlexAcc (alex_action_47),AlexAcc (alex_action_47),AlexAcc (alex_action_47),AlexAcc (alex_action_47),AlexAcc (alex_action_47),AlexAcc (alex_action_47),AlexAcc (alex_action_47),AlexAcc (alex_action_47),AlexAcc (alex_action_47),AlexAcc (alex_action_47),AlexAcc (alex_action_47),AlexAcc (alex_action_47),AlexAcc (alex_action_47),AlexAcc (alex_action_47),AlexAcc (alex_action_47),AlexAcc (alex_action_47),AlexAcc (alex_action_47),AlexAcc (alex_action_47),AlexAcc (alex_action_47),AlexAcc (alex_action_47),AlexAcc (alex_action_47),AlexAcc (alex_action_47),AlexAcc (alex_action_48),AlexAcc (alex_action_49),AlexAcc (alex_action_50),AlexAcc (alex_action_51),AlexAcc (alex_action_52),AlexAcc (alex_action_53),AlexAcc (alex_action_54),AlexAcc (alex_action_55),AlexAcc (alex_action_56),AlexAcc (alex_action_57),AlexAcc (alex_action_58),AlexAcc (alex_action_59),AlexAcc (alex_action_60),AlexAcc (alex_action_61),AlexAcc (alex_action_62),AlexAcc (alex_action_63),AlexAcc (alex_action_64),AlexAcc (alex_action_65),AlexAcc (alex_action_66),AlexAcc (alex_action_67),AlexAcc (alex_action_68),AlexAcc (alex_action_69),AlexAcc (alex_action_70),AlexAcc (alex_action_71),AlexAcc (alex_action_72),AlexAcc (alex_action_73),AlexAcc (alex_action_74),AlexAcc (alex_action_75),AlexAcc (alex_action_76),AlexAcc (alex_action_77),AlexAcc (alex_action_77),AlexAcc (alex_action_77),AlexAcc (alex_action_77)]+alex_accept = listArray (0::Int,216) [AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAcc 149,AlexAcc 148,AlexAcc 147,AlexAcc 146,AlexAcc 145,AlexAcc 144,AlexAcc 143,AlexAcc 142,AlexAcc 141,AlexAcc 140,AlexAcc 139,AlexAcc 138,AlexAcc 137,AlexAcc 136,AlexAcc 135,AlexAcc 134,AlexAcc 133,AlexAcc 132,AlexAcc 131,AlexAcc 130,AlexAcc 129,AlexAcc 128,AlexAcc 127,AlexAcc 126,AlexAcc 125,AlexAcc 124,AlexAcc 123,AlexAcc 122,AlexAcc 121,AlexAcc 120,AlexAcc 119,AlexAcc 118,AlexAcc 117,AlexAcc 116,AlexAcc 115,AlexAcc 114,AlexAcc 113,AlexAcc 112,AlexAcc 111,AlexAcc 110,AlexAcc 109,AlexAcc 108,AlexAcc 107,AlexAcc 106,AlexAcc 105,AlexAcc 104,AlexAcc 103,AlexAcc 102,AlexAcc 101,AlexAcc 100,AlexAcc 99,AlexAcc 98,AlexAcc 97,AlexAcc 96,AlexAcc 95,AlexAcc 94,AlexAcc 93,AlexAcc 92,AlexAcc 91,AlexAcc 90,AlexAcc 89,AlexAcc 88,AlexAcc 87,AlexAcc 86,AlexAcc 85,AlexAcc 84,AlexAcc 83,AlexAcc 82,AlexAcc 81,AlexAcc 80,AlexAcc 79,AlexAcc 78,AlexAcc 77,AlexAcc 76,AlexAcc 75,AlexAcc 74,AlexAcc 73,AlexAcc 72,AlexAcc 71,AlexAcc 70,AlexAcc 69,AlexAcc 68,AlexAcc 67,AlexAcc 66,AlexAcc 65,AlexAcc 64,AlexAcc 63,AlexAcc 62,AlexAcc 61,AlexAcc 60,AlexAcc 59,AlexAcc 58,AlexAcc 57,AlexAcc 56,AlexAcc 55,AlexAcc 54,AlexAcc 53,AlexAcc 52,AlexAcc 51,AlexAcc 50,AlexAcc 49,AlexAcc 48,AlexAcc 47,AlexAcc 46,AlexAcc 45,AlexAcc 44,AlexAcc 43,AlexAcc 42,AlexAcc 41,AlexAcc 40,AlexAcc 39,AlexAcc 38,AlexAcc 37,AlexAcc 36,AlexAcc 35,AlexAcc 34,AlexAcc 33,AlexAcc 32,AlexAcc 31,AlexAcc 30,AlexAcc 29,AlexAcc 28,AlexAcc 27,AlexAcc 26,AlexAcc 25,AlexAcc 24,AlexAcc 23,AlexAcc 22,AlexAcc 21,AlexAcc 20,AlexAcc 19,AlexAcc 18,AlexAcc 17,AlexAcc 16,AlexAcc 15,AlexAcc 14,AlexAcc 13,AlexAcc 12,AlexAcc 11,AlexAcc 10,AlexAcc 9,AlexAcc 8,AlexAcc 7,AlexAcc 6,AlexAcc 5,AlexAcc 4,AlexAcc 3,AlexAcc 2,AlexAcc 1,AlexAcc 0]++alex_actions = array (0::Int,150) [(149,alex_action_0),(148,alex_action_0),(147,alex_action_1),(146,alex_action_1),(145,alex_action_2),(144,alex_action_2),(143,alex_action_3),(142,alex_action_4),(141,alex_action_5),(140,alex_action_6),(139,alex_action_7),(138,alex_action_8),(137,alex_action_9),(136,alex_action_10),(135,alex_action_11),(134,alex_action_12),(133,alex_action_13),(132,alex_action_14),(131,alex_action_15),(130,alex_action_16),(129,alex_action_17),(128,alex_action_18),(127,alex_action_19),(126,alex_action_20),(125,alex_action_21),(124,alex_action_22),(123,alex_action_23),(122,alex_action_24),(121,alex_action_25),(120,alex_action_26),(119,alex_action_27),(118,alex_action_28),(117,alex_action_29),(116,alex_action_30),(115,alex_action_31),(114,alex_action_32),(113,alex_action_33),(112,alex_action_34),(111,alex_action_35),(110,alex_action_36),(109,alex_action_38),(108,alex_action_39),(107,alex_action_40),(106,alex_action_41),(105,alex_action_42),(104,alex_action_43),(103,alex_action_44),(102,alex_action_44),(101,alex_action_45),(100,alex_action_46),(99,alex_action_47),(98,alex_action_47),(97,alex_action_47),(96,alex_action_47),(95,alex_action_47),(94,alex_action_47),(93,alex_action_47),(92,alex_action_47),(91,alex_action_47),(90,alex_action_47),(89,alex_action_47),(88,alex_action_47),(87,alex_action_47),(86,alex_action_47),(85,alex_action_47),(84,alex_action_47),(83,alex_action_47),(82,alex_action_47),(81,alex_action_47),(80,alex_action_47),(79,alex_action_47),(78,alex_action_47),(77,alex_action_47),(76,alex_action_47),(75,alex_action_47),(74,alex_action_47),(73,alex_action_47),(72,alex_action_47),(71,alex_action_47),(70,alex_action_47),(69,alex_action_47),(68,alex_action_47),(67,alex_action_47),(66,alex_action_47),(65,alex_action_47),(64,alex_action_47),(63,alex_action_47),(62,alex_action_47),(61,alex_action_47),(60,alex_action_47),(59,alex_action_47),(58,alex_action_47),(57,alex_action_47),(56,alex_action_47),(55,alex_action_47),(54,alex_action_47),(53,alex_action_47),(52,alex_action_47),(51,alex_action_47),(50,alex_action_47),(49,alex_action_47),(48,alex_action_47),(47,alex_action_47),(46,alex_action_47),(45,alex_action_47),(44,alex_action_47),(43,alex_action_47),(42,alex_action_47),(41,alex_action_47),(40,alex_action_47),(39,alex_action_47),(38,alex_action_47),(37,alex_action_47),(36,alex_action_47),(35,alex_action_47),(34,alex_action_47),(33,alex_action_47),(32,alex_action_48),(31,alex_action_49),(30,alex_action_50),(29,alex_action_51),(28,alex_action_52),(27,alex_action_53),(26,alex_action_54),(25,alex_action_55),(24,alex_action_56),(23,alex_action_57),(22,alex_action_58),(21,alex_action_59),(20,alex_action_60),(19,alex_action_61),(18,alex_action_62),(17,alex_action_63),(16,alex_action_64),(15,alex_action_65),(14,alex_action_66),(13,alex_action_67),(12,alex_action_68),(11,alex_action_69),(10,alex_action_70),(9,alex_action_71),(8,alex_action_72),(7,alex_action_73),(6,alex_action_74),(5,alex_action_75),(4,alex_action_76),(3,alex_action_77),(2,alex_action_77),(1,alex_action_77),(0,alex_action_77)]+ {-# LINE 172 "src/Cryptol/Parser/Lexer.x" #-}  -- This code is here because it depends on `comment`, which is defined@@ -145,7 +149,7 @@ alex_action_0 =  startComment False  alex_action_1 =  startComment True   alex_action_2 =  startEndComment    -alex_action_3 =  endComent +alex_action_3 =  endComment  alex_action_4 =  addToComment  alex_action_5 =  addToComment  alex_action_6 =  addToComment @@ -224,7 +228,7 @@ {-# LINE 1 "templates/GenericTemplate.hs" #-} {-# LINE 1 "<built-in>" #-} {-# LINE 18 "<built-in>" #-}-{-# LINE 1 "/usr/local/Cellar/ghc/7.10.3b/lib/ghc-7.10.3/include/ghcversion.h" #-}+{-# LINE 1 "/usr/local/Cellar/ghc/8.0.2/lib/ghc-8.0.2/include/ghcversion.h" #-}   @@ -244,6 +248,357 @@   {-# LINE 19 "<built-in>" #-}+{-# LINE 1 "/var/folders/n8/s7z9ns8d4k39v2y_2sn__12m0000gp/T/ghc5352_0/ghc_2.h" #-}++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++{-# LINE 20 "<built-in>" #-} {-# LINE 1 "templates/GenericTemplate.hs" #-} -- ----------------------------------------------------------------------------- -- ALEX TEMPLATE@@ -297,13 +652,13 @@   {-# INLINE alexIndexInt32OffAddr #-}-alexIndexInt32OffAddr (AlexA# arr) off = +alexIndexInt32OffAddr (AlexA# arr) off = #ifdef WORDS_BIGENDIAN   narrow32Int# i   where    i    = word2Int# ((b3 `uncheckedShiftL#` 24#) `or#`-		     (b2 `uncheckedShiftL#` 16#) `or#`-		     (b1 `uncheckedShiftL#` 8#) `or#` b0)+                     (b2 `uncheckedShiftL#` 16#) `or#`+                     (b1 `uncheckedShiftL#` 8#) `or#` b0)    b3   = int2Word# (ord# (indexCharOffAddr# arr (off' +# 3#)))    b2   = int2Word# (ord# (indexCharOffAddr# arr (off' +# 2#)))    b1   = int2Word# (ord# (indexCharOffAddr# arr (off' +# 1#)))@@ -343,30 +698,30 @@  alexScanUser user input (I# (sc))   = case alex_scan_tkn user input 0# input sc AlexNone of-	(AlexNone, input') ->-		case alexGetByte input of-			Nothing -> +  (AlexNone, input') ->+    case alexGetByte input of+      Nothing ->   -				   AlexEOF-			Just _ ->+                                   AlexEOF+      Just _ ->   -				   AlexError input'+                                   AlexError input' -	(AlexLastSkip input'' len, _) ->+  (AlexLastSkip input'' len, _) ->   -		AlexSkip input'' len+    AlexSkip input'' len -	(AlexLastAcc k input''' len, _) ->+  (AlexLastAcc k input''' len, _) ->   -		AlexToken input''' len k+    AlexToken input''' len (alex_actions ! k)   -- Push the input through the DFA, remembering the most recent accepting@@ -374,13 +729,13 @@  alex_scan_tkn user orig_input len input s last_acc =   input `seq` -- strict in the input-  let -	new_acc = (check_accs (alex_accept `quickIndex` (I# (s))))+  let+  new_acc = (check_accs (alex_accept `quickIndex` (I# (s))))   in   new_acc `seq`   case alexGetByte input of      Nothing -> (new_acc, input)-     Just (c, new_input) -> +     Just (c, new_input) ->   @@ -389,43 +744,33 @@                 base   = alexIndexInt32OffAddr alex_base s                 offset = (base +# ord_c)                 check  = alexIndexInt16OffAddr alex_check offset-		+                 new_s = if GTE(offset,0#) && EQ(check,ord_c)-			  then alexIndexInt16OffAddr alex_table offset-			  else alexIndexInt16OffAddr alex_deflt s-	in+                          then alexIndexInt16OffAddr alex_table offset+                          else alexIndexInt16OffAddr alex_deflt s+        in         case new_s of-	    -1# -> (new_acc, input)-		-- on an error, we want to keep the input *before* the-		-- character that failed, not after.-    	    _ -> alex_scan_tkn user orig_input (if c < 0x80 || c >= 0xC0 then (len +# 1#) else len)+            -1# -> (new_acc, input)+                -- on an error, we want to keep the input *before* the+                -- character that failed, not after.+            _ -> alex_scan_tkn user orig_input (if c < 0x80 || c >= 0xC0 then (len +# 1#) else len)                                                 -- note that the length is increased ONLY if this is the 1st byte in a char encoding)-			new_input new_s new_acc+                        new_input new_s new_acc       }   where-	check_accs (AlexAccNone) = last_acc-	check_accs (AlexAcc a  ) = AlexLastAcc a input (I# (len))-	check_accs (AlexAccSkip) = AlexLastSkip  input (I# (len))+        check_accs (AlexAccNone) = last_acc+        check_accs (AlexAcc a  ) = AlexLastAcc a input (I# (len))+        check_accs (AlexAccSkip) = AlexLastSkip  input (I# (len))  {-# LINE 198 "templates/GenericTemplate.hs" #-} -data AlexLastAcc a+data AlexLastAcc   = AlexNone-  | AlexLastAcc a !AlexInput !Int-  | AlexLastSkip  !AlexInput !Int--instance Functor AlexLastAcc where-    fmap f AlexNone = AlexNone-    fmap f (AlexLastAcc x y z) = AlexLastAcc (f x) y z-    fmap f (AlexLastSkip x y) = AlexLastSkip x y+  | AlexLastAcc !Int !AlexInput !Int+  | AlexLastSkip     !AlexInput !Int -data AlexAcc a user+data AlexAcc user   = AlexAccNone-  | AlexAcc a+  | AlexAcc Int   | AlexAccSkip--{-# LINE 242 "templates/GenericTemplate.hs" #-}---- used by wrappers-iUnbox (I# (i)) = i 
lib/Cryptol.cry view
@@ -10,15 +10,18 @@  */ primitive demote : {val, bits} (fin val, fin bits, bits >= width val) => [bits] -infixr 10 ||-infixr 20 &&+infixr  5 ==>+infixr 10 \/+infixr 15 /\+infixr 20 ||+infixr 25 && infix  30 ==, ===, !=, !== infix  40 >, >=, <, <= infixl 50 ^ infixr 60 # infixl 70 <<, <<<, >>, >>> infixl 80 +, --infixl 90 *, /+infixl 90 *, /, % infixr 95 ^^ infixl 100 @, @@, !, !! @@ -94,17 +97,12 @@ primitive negate : {a} (Arith a) => a -> a  /**- * Binary complement.+ * Bitwise complement. The prefix notation '~ x'+ * is syntactic sugar for 'complement x'.  */ primitive complement : {a} a -> a  /**- * Operator form of binary complement.- */-(~) : {a} a -> a-(~) = complement--/**  * Less-than. Only works on comparable arguments.  */ primitive (<) : {a} (Cmp a) => a -> a -> Bit@@ -135,13 +133,13 @@ primitive (!=) : {a} (Cmp a) => a -> a -> Bit  /**- * Compare the outputs of two functions for equality+ * Compare the outputs of two functions for equality.  */ (===) : {a,b} (Cmp b) => (a -> b) -> (a -> b) -> (a -> Bit) f === g = \ x -> f x == g x  /**- * Compare the outputs of two functions for inequality+ * Compare the outputs of two functions for inequality.  */ (!==) : {a,b} (Cmp b) => (a -> b) -> (a -> b) -> (a -> Bit) f !== g = \x -> f x != g x@@ -159,6 +157,30 @@ max x y = if x > y then x else y  /**+ * Short-cutting boolean conjuction function.+ * If the first argument is False, the second argument+ * is not evaluated.+ */+(/\) : Bit -> Bit -> Bit+x /\ y = if x then y else False++/**+ * Short-cutting boolean disjuction function.+ * If the first argument is True, the second argument+ * is not evaluated.+ */+(\/) : Bit -> Bit -> Bit+x \/ y = if x then True else y++/**+ * Short-cutting logical implication.+ * If the first argument is False, the second argument is+ * not evaluated.+ */+(==>) : Bit -> Bit -> Bit+a ==> b = if a then b else True++/**  * Logical `and' over bits. Extends element-wise over sequences, tuples.  */ primitive (&&) : {a} a -> a -> a@@ -212,7 +234,6 @@  */ primitive splitAt : {front, back, a} (fin front) => [front + back]a                                                  -> ([front]a, [back]a)- /**  * Joins sequences.  */@@ -257,25 +278,103 @@ /**  * Bulk reverse index operator.  The first argument is a finite sequence.  The  * second argument is a sequence of the zero-based indices of the elements to- z select, starting from the end of the sequence.+ * select, starting from the end of the sequence.  */ primitive (!!) : {a, b, c, d} (fin a, fin d) => [a]b -> [c][d] -> [c]b +/**+ * Update the given sequence with new value at the given index position.+ * The first argument is a sequence. The second argument is the zero-based+ * index of the element to update, starting from the front of the sequence.+ * The third argument is the new element.  The return value is the+ * initial sequence updated so that the indicated index has the given value.+ */+primitive update : {a, b, c} (fin c) => [a]b -> [c] -> b -> [a]b++/**+ * Update the given sequence with new value at the given index position.+ * The first argument is a sequence. The second argument is the zero-based+ * index of the element to update, starting from the end of the sequence.+ * The third argument is the new element.  The return value is the+ * initial sequence updated so that the indicated index has the given value.+ */+primitive updateEnd : {a, b, c} (fin a, fin c) => [a]b -> [c] -> b -> [a]b++/**+ * Perform a series of updates to a sequence.  The first argument is+ * the initial sequence to update.  The second argument is a sequence+ * of indices, and the third argument is a sequence of values.+ * This function applies the 'update' function in sequence with the+ * given update pairs.+ */+updates : {a,b,c,d} (fin c, fin d) => [a]b -> [d][c] -> [d]b -> [a]b+updates xs0 idxs vals = xss!0+ where+   xss = [ xs0 ] #+         [ update xs i b+         | xs <- xss+         | i  <- idxs+         | b  <- vals+         ]++/**+ * Perform a series of updates to a sequence.  The first argument is+ * the initial sequence to update.  The second argument is a sequence+ * of indices, and the third argument is a sequence of values.+ * This function applies the 'updateEnd' function in sequence with the+ * given update pairs.+ */+updatesEnd : {a,b,c,d} (fin a, fin c, fin d) => [a]b -> [d][c] -> [d]b -> [a]b+updatesEnd xs0 idxs vals = xss!0+ where+   xss = [ xs0 ] #+         [ updateEnd xs i b+         | xs  <- xss+         | i   <- idxs+         | b   <- vals+         ]++/**+ * A finite arithmetic sequence starting with 'first' and 'next',+ * stopping when the values would wrap around modulo '2^^bits'.+ *+ * '[a,b..]' is syntactic sugar for 'fromThen`{first=a,next=b}'.+ */ primitive fromThen : {first, next, bits, len}                      ( fin first, fin next, fin bits                      , bits >= width first, bits >= width next                      , lengthFromThen first next bits == len) => [len][bits] +/**+ * A finite sequence counting up from 'first' to 'last'.+ *+ * '[a..b]' is syntactic sugar for 'fromTo`{first=a,last=b}'.+ * '[a..]' is syntactic sugar for 'fromTo`{first=a,last=(2^^bits)-1}'.+ */ primitive fromTo : {first, last, bits} (fin last, fin bits, last >= first,                               bits >= width last) => [1 + (last - first)][bits] +/**+ * A finite arithmetic sequence starting with 'first' and 'next',+ * stopping when the values reach or would skip over 'last'.+ *+ * '[a,b..c]' is syntactic sugar for 'fromThenTo`{first=a,next=b,last=c}'.+ */ primitive fromThenTo : {first, next, last, bits, len} (fin first, fin next,                         fin last, fin bits, bits >= width first,                         bits >= width next, bits >= width last,                         lengthFromThenTo first next last == len) => [len][bits] +/**+ * An infinite sequence counting up from the given starting value.+ * '[x...]' is syntactic sugar for 'infFrom x'.+ */ primitive infFrom : {bits} (fin bits) => [bits] -> [inf][bits] +/**+ * An infinite arithmetic sequence starting with the given two values.+ * '[x,y...]' is syntactic sugar for 'infFromThen x y'.+ */ primitive infFromThen : {bits} (fin bits) => [bits] -> [bits] -> [inf][bits]  primitive error : {at, len} (fin len) => [len][8] -> at@@ -284,7 +383,7 @@ /**  * Performs multiplication of polynomials over GF(2).  */-primitive pmult : {a, b} (fin a, fin b) => [a] -> [b] -> [max 1 (a + b) - 1]+primitive pmult : {a, b} (fin a, fin b) => [1 + a] -> [1 + b] -> [1 + a + b]  /**  * Performs division of polynomials over GF(2).@@ -329,3 +428,30 @@  * Define the base 2 logarithm function in terms of width  */ type lg2 n = width (max n 1 - 1)++/**+ * Debugging function for tracing.  The first argument is a string,+ * which is prepended to the printed value of the second argument.+ * This combined string is then printed when the trace function is+ * evaluated.  The return value is equal to the third argument.+ *+ * The exact timing and number of times the trace message is printed+ * depend on the internal details of the Cryptol evaluation order,+ * which are unspecified.  Thus, the output produced by this+ * operation may be difficult to predict.+ */+primitive trace : {n, a, b} (fin n) => [n][8] -> a -> b -> b++/**+ * Debugging function for tracing values.  The first argument is a string,+ * which is prepended to the printed value of the second argument.+ * This combined string is then printed when the trace function is+ * evaluated.  The return value is equal to the second argument.+ *+ * The exact timing and number of times the trace message is printed+ * depend on the internal details of the Cryptol evaluation order,+ * which are unspecified.  Thus, the output produced by this+ * operation may be difficult to predict.+ */+traceVal : {n, a} (fin n) => [n][8] -> a -> a+traceVal msg x = trace msg x x
lib/Cryptol/Extras.cry view
@@ -9,15 +9,7 @@  module Cryptol::Extras where -infixr 5 ==>- /**- * Logical implication- */-(==>) : Bit -> Bit -> Bit-a ==> b = if a then b else True--/**  * Logical negation  */ not : {a} a -> a@@ -141,3 +133,10 @@  */ curry : {a,b,c} ((a, b) -> c) -> a -> b -> c curry f = \a b -> f (a,b)++/**+ * Map a function iteratively over a seed value, producing an infinite+ * list of successive function applications.+ */+iterate : { a } (a -> a) -> a -> [inf]a+iterate f x = [x] # [ f v | v <- iterate f x ]
+ lib/CryptolTC.z3 view
@@ -0,0 +1,293 @@+; ------------------------------------------------------------------------------+; Basic datatypes++(declare-datatypes ()+  ( (InfNat (mk-infnat (value Int) (isFin Bool) (isErr Bool)))+  )+)++(declare-datatypes ()+  ( (MaybeBool (mk-mb (prop Bool) (isErrorProp Bool)))+  )+)++(define-fun cryBool ((x Bool)) MaybeBool+  (mk-mb x false)+)++(define-fun cryErrProp () MaybeBool+  (mk-mb false true)+)++(define-fun cryInf () InfNat+  (mk-infnat 0 false false)+)++(define-fun cryNat ((x Int)) InfNat+  (mk-infnat x true false)+)++(define-fun cryErr () InfNat+  (mk-infnat 0 false true)+)++; ------------------------------------------------------------------------------+; Cryptol version of logic+++(define-fun cryEq ((x InfNat) (y InfNat)) MaybeBool+  (ite (or (isErr x) (isErr y)) cryErrProp (cryBool+  (ite (isFin x)+     (ite (isFin y) (= (value x) (value y)) false)+     (not (isFin y))+  )))+)++(define-fun cryFin ((x InfNat)) MaybeBool+  (ite (isErr x) cryErrProp (cryBool+  (isFin x)))+)++(define-fun cryGeq ((x InfNat) (y InfNat)) MaybeBool+  (ite (or (isErr x) (isErr y)) cryErrProp (cryBool+  (ite (isFin x)+    (ite (isFin y) (>= (value x) (value y)) false)+    true+  )))+)++(define-fun cryAnd ((x MaybeBool) (y MaybeBool)) MaybeBool+  (ite (or (isErrorProp x) (isErrorProp y)) cryErrProp+    (cryBool (and (prop x) (prop y)))+  )+)+++(define-fun cryTrue () MaybeBool+  (cryBool true)+)++; ------------------------------------------------------------------------------+; Basic Cryptol assume/assert+++(define-fun cryVar ((x InfNat)) Bool+  (and (not (isErr x)) (>= (value x) 0))+)++(define-fun cryAssume ((x MaybeBool)) Bool+  (ite (isErrorProp x) true (prop x))+)++(declare-fun cryUnknown () Bool)++(define-fun cryProve ((x MaybeBool)) Bool+  (ite (isErrorProp x) cryUnknown (not (prop x)))+)++++; ------------------------------------------------------------------------------+; Arithmetic+++(define-fun cryAdd ((x InfNat) (y InfNat)) InfNat+  (ite (or (isErr x) (isErr y)) cryErr+  (ite (isFin x)+       (ite (isFin y) (cryNat (+ (value x) (value y))) cryInf)+       cryInf+  ))+)++(define-fun crySub ((x InfNat) (y InfNat)) InfNat+  (ite (or (isErr x) (isErr y) (not (isFin y))) cryErr+  (ite (isFin x)+       (ite (>= (value x) (value y)) (cryNat (- (value x) (value y))) cryErr)+       cryInf+  ))+)++(define-fun cryMul ((x InfNat) (y InfNat)) InfNat+  (ite (or (isErr x) (isErr y)) cryErr+  (ite (isFin x)+       (ite (isFin y) (cryNat (* (value x) (value y)))+                      (ite (= (value x) 0) (cryNat 0) cryInf))+       (ite (and (isFin y) (= (value y) 0)) (cryNat 0) cryInf)+  ))+)++(define-fun cryDiv ((x InfNat) (y InfNat)) InfNat+  (ite (or (isErr x) (isErr y) (not (isFin x))) cryErr+  (ite (isFin y)+       (ite (= (value y) 0) cryErr (cryNat (div (value x) (value y))))+       (cryNat 0)+  ))+)++(define-fun cryMod ((x InfNat) (y InfNat)) InfNat+  (ite (or (isErr x) (isErr y) (not (isFin x))) cryErr+  (ite (isFin y)+       (ite (= (value y) 0) cryErr (cryNat (mod (value x) (value y))))+       x+  ))+)++++(define-fun cryMin ((x InfNat) (y InfNat)) InfNat+  (ite (or (isErr x) (isErr y)) cryErr+  (ite (isFin x)+       (ite (isFin y)+            (ite (<= (value x) (value y)) x y)+            x)+       y+  ))+)++(define-fun cryMax ((x InfNat) (y InfNat)) InfNat+  (ite (or (isErr x) (isErr y)) cryErr+  (ite (isFin x)+       (ite (isFin y)+            (ite (<= (value x) (value y)) y x)+            y)+       x+  ))+)+++(declare-fun cryWidthUnknown (Int) Int)++; Some axioms about cryWidthUnknown++(assert (forall ((x Int)) (> (cryWidthUnknown x) 64)))+(assert (forall ((x Int)) (or (> x (cryWidthUnknown x))+                              (< x 18446744073709551616))))+(assert (forall ((x Int) (y Int))+  (=> (and (>= x y) (> y 64))+      (>= (cryWidthUnknown x) (cryWidthUnknown y)))))+++(define-fun cryWidthTable ((x Int)) Int+  (ite (< x 1) 0+  (ite (< x 2) 1+  (ite (< x 4) 2+  (ite (< x 8) 3+  (ite (< x 16) 4+  (ite (< x 32) 5+  (ite (< x 64) 6+  (ite (< x 128) 7+  (ite (< x 256) 8+  (ite (< x 512) 9+  (ite (< x 1024) 10+  (ite (< x 2048) 11+  (ite (< x 4096) 12+  (ite (< x 8192) 13+  (ite (< x 16384) 14+  (ite (< x 32768) 15+  (ite (< x 65536) 16+  (ite (< x 131072) 17+  (ite (< x 262144) 18+  (ite (< x 524288) 19+  (ite (< x 1048576) 20+  (ite (< x 2097152) 21+  (ite (< x 4194304) 22+  (ite (< x 8388608) 23+  (ite (< x 16777216) 24+  (ite (< x 33554432) 25+  (ite (< x 67108864) 26+  (ite (< x 134217728) 27+  (ite (< x 268435456) 28+  (ite (< x 536870912) 29+  (ite (< x 1073741824) 30+  (ite (< x 2147483648) 31+  (ite (< x 4294967296) 32+  (ite (< x 8589934592) 33+  (ite (< x 17179869184) 34+  (ite (< x 34359738368) 35+  (ite (< x 68719476736) 36+  (ite (< x 137438953472) 37+  (ite (< x 274877906944) 38+  (ite (< x 549755813888) 39+  (ite (< x 1099511627776) 40+  (ite (< x 2199023255552) 41+  (ite (< x 4398046511104) 42+  (ite (< x 8796093022208) 43+  (ite (< x 17592186044416) 44+  (ite (< x 35184372088832) 45+  (ite (< x 70368744177664) 46+  (ite (< x 140737488355328) 47+  (ite (< x 281474976710656) 48+  (ite (< x 562949953421312) 49+  (ite (< x 1125899906842624) 50+  (ite (< x 2251799813685248) 51+  (ite (< x 4503599627370496) 52+  (ite (< x 9007199254740992) 53+  (ite (< x 18014398509481984) 54+  (ite (< x 36028797018963968) 55+  (ite (< x 72057594037927936) 56+  (ite (< x 144115188075855872) 57+  (ite (< x 288230376151711744) 58+  (ite (< x 576460752303423488) 59+  (ite (< x 1152921504606846976) 60+  (ite (< x 2305843009213693952) 61+  (ite (< x 4611686018427387904) 62+  (ite (< x 9223372036854775808) 63+  (ite (< x 18446744073709551616) 64+  (cryWidthUnknown x))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))+)++(define-fun cryWidth ((x InfNat)) InfNat+  (ite (isErr x) cryErr+  (ite (isFin x) (cryNat (cryWidthTable (value x)))+       cryInf+  ))+)++++(declare-fun cryExpUnknown (Int Int) Int)++(define-fun cryExpTable ((x Int) (y Int)) Int+  (ite (= y 0) 1+  (ite (= y 1) x+  (ite (= x 0) 0+  (cryExpUnknown x y))))+)++(define-fun cryExp ((x InfNat) (y InfNat)) InfNat+  (ite (or (isErr x) (isErr y)) cryErr+    (ite (isFin x)+         (ite (isFin y)+              (cryNat (cryExpTable (value x) (value y)))+              (ite (< (value x) 2) x cryInf))+         (ite (isFin y)+              (ite (= (value y) 0) (cryNat 1) cryInf)+              cryInf)+  ))+)++(define-fun cryLenFromThenTo ((x InfNat) (y InfNat) (z InfNat)) InfNat+  (ite (or (isErr x) (not (isFin x))+           (isErr y) (not (isFin y))+           (isErr z) (not (isFin z))+           (= (value x) (value y))) cryErr (cryNat+  (ite (> (value x) (value y))+       (ite (> (value z) (value x)) 0 (+ (div (- (value x) (value z))+                                              (- (value x) (value y))) 1))+       (ite (< (value z) (value x)) 0 (+ (div (- (value z) (value x))+                                              (- (value y) (value x))) 1))+  )))+)+++(define-fun cryLenFromThen ((x InfNat) (y InfNat) (z InfNat)) InfNat+  (ite (or (isErr x) (not (isFin x))+           (isErr y) (not (isFin y))+           (isErr z) (not (isFin z))+           (= (value x) (value y))) cryErr+  (ite (< (value y) (value x)) (cryLenFromThenTo x y (cryNat 0))+       (cryLenFromThenTo x y (cryNat (- (cryExpTable 2 (value z)) 1))))+  )+)++
src/Cryptol/Eval.hs view
@@ -6,105 +6,171 @@ -- Stability   :  provisional -- Portability :  portable +{-# LANGUAGE DoAndIfThenElse #-}+{-# LANGUAGE LambdaCase #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE ParallelListComp #-}+{-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE Safe #-} {-# LANGUAGE PatternGuards #-}  module Cryptol.Eval (     moduleEnv-  , EvalEnv()+  , runEval+  , Eval+  , EvalEnv   , emptyEnv   , evalExpr   , evalDecls   , EvalError(..)-  , WithBase(..)+  , forceValue   ) where -import Cryptol.Eval.Error import Cryptol.Eval.Env+import Cryptol.Eval.Monad import Cryptol.Eval.Type import Cryptol.Eval.Value import Cryptol.ModuleSystem.Name import Cryptol.TypeCheck.AST-import Cryptol.TypeCheck.Solver.InfNat (Nat')+import Cryptol.TypeCheck.Solver.InfNat(Nat'(..)) import Cryptol.Utils.Panic (panic) import Cryptol.Utils.PP-import Cryptol.Prims.Eval -import qualified Data.Map as Map+import           Control.Monad+import qualified Data.Sequence as Seq+import           Data.List+import           Data.Maybe+import qualified Data.Map.Strict as Map  import Prelude () import Prelude.Compat +type EvalEnv = GenEvalEnv Bool BV+ -- Expression Evaluation ------------------------------------------------------- -moduleEnv :: Module -> EvalEnv -> EvalEnv-moduleEnv m env = evalDecls (mDecls m) (evalNewtypes (mNewtypes m) env)+-- | Extend the given evaluation environment with all the declarations+--   contained in the given module.+moduleEnv :: EvalPrims b w+          => Module         -- ^ Module containing declarations to evaluate+          -> GenEvalEnv b w -- ^ Environment to extend+          -> Eval (GenEvalEnv b w)+moduleEnv m env = evalDecls (mDecls m) =<< evalNewtypes (mNewtypes m) env -evalExpr :: EvalEnv -> Expr -> Value+-- | Evaluate a Cryptol expression to a value.  This evaluator is parameterized+--   by the `EvalPrims` class, which defines the behavior of bits and words, in+--   addition to providing implementations for all the primitives.+evalExpr :: EvalPrims b w+         => GenEvalEnv b w     -- ^ Evaluation environment+         -> Expr               -- ^ Expression to evaluate+         -> Eval (GenValue b w) evalExpr env expr = case expr of -  EList es ty -> VSeq (isTBit (evalValType env ty)) (map (evalExpr env) es)+  -- Try to detect when the user has directly written a finite sequence of+  -- literal bit values and pack these into a word.+  EList es ty+    -- NB, even if the list cannot be packed, we must use `VWord`+    -- when the element type is `Bit`.+    | isTBit tyv -> {-# SCC "evalExpr->Elist/bit" #-}+        return $ VWord len $ return $+          case tryFromBits vs of+            Just w  -> WordVal w+            Nothing -> BitsVal $ Seq.fromList $ map (fromVBit <$>) vs+    | otherwise -> {-# SCC "evalExpr->EList" #-}+        return $ VSeq len $ finiteSeqMap vs+   where+    tyv = evalValType (envTypes env) ty+    vs  = map (evalExpr env) es+    len = genericLength es -  ETuple es -> VTuple (map eval es)+  ETuple es -> {-# SCC "evalExpr->ETuple" #-} do+     let xs = map eval es+     return $ VTuple xs -  ERec fields -> VRecord [ (f,eval e) | (f,e) <- fields ]+  ERec fields -> {-# SCC "evalExpr->ERec" #-} do+     let xs = [ (f, eval e)+              | (f,e) <- fields+              ]+     return $ VRecord xs -  ESel e sel -> evalSel env e sel+  ESel e sel -> {-# SCC "evalExpr->ESel" #-} do+     x <- eval e+     evalSel x sel -  EIf c t f | fromVBit (eval c) -> eval t-            | otherwise         -> eval f+  EIf c t f -> {-# SCC "evalExpr->EIf" #-} do+     b <- fromVBit <$> eval c+     iteValue b (eval t) (eval f) -  EComp l h gs -> evalComp env (evalValType env l) h gs+  EComp n t h gs -> {-# SCC "evalExpr->EComp" #-} do+      let len  = evalNumType (envTypes env) n+      let elty = evalValType (envTypes env) t+      evalComp env len elty h gs -  EVar n -> case lookupVar n env of-    Just val -> val-    Nothing  -> panic "[Eval] evalExpr"+  EVar n -> {-# SCC "evalExpr->EVar" #-} do+    case lookupVar n env of+      Just val -> val+      Nothing  -> do+        envdoc <- ppEnv defaultPPOpts env+        panic "[Eval] evalExpr"                      ["var `" ++ show (pp n) ++ "` is not defined"-                     , pretty (WithBase defaultPPOpts env)+                     , show envdoc                      ] -  ETAbs tv b -> case tpKind tv of-    KType -> VPoly $ \ty -> evalExpr (bindType (tpVar tv) (Right ty) env) b-    KNum  -> VNumPoly $ \n -> evalExpr (bindType (tpVar tv) (Left n) env) b-    k     -> panic "[Eval] evalExpr" ["invalid kind on type abstraction", show k]+  ETAbs tv b -> {-# SCC "evalExpr->ETAbs" #-}+    case tpKind tv of+      KType -> return $ VPoly    $ \ty -> evalExpr (bindType (tpVar tv) (Right ty) env) b+      KNum  -> return $ VNumPoly $ \n  -> evalExpr (bindType (tpVar tv) (Left n) env) b+      k     -> panic "[Eval] evalExpr" ["invalid kind on type abstraction", show k] -  ETApp e ty -> case eval e of-    VPoly f    -> f (evalValType env ty)-    VNumPoly f -> f (evalNumType env ty)-    val        -> panic "[Eval] evalExpr"-                       ["expected a polymorphic value"-                       , show (ppV val), show e, show ty-                       ]+  ETApp e ty -> {-# SCC "evalExpr->ETApp" #-} do+    eval e >>= \case+      VPoly f     -> f $! (evalValType (envTypes env) ty)+      VNumPoly f  -> f $! (evalNumType (envTypes env) ty)+      val     -> do vdoc <- ppV val+                    panic "[Eval] evalExpr"+                      ["expected a polymorphic value"+                      , show vdoc, show e, show ty+                      ] -  EApp f x -> case eval f of-    VFun f' -> f' (eval x)-    it       -> panic "[Eval] evalExpr" ["not a function", show (ppV it) ]+  EApp f x -> {-# SCC "evalExpr->EApp" #-} do+    eval f >>= \case+      VFun f' -> f' (eval x)+      it      -> do itdoc <- ppV it+                    panic "[Eval] evalExpr" ["not a function", show itdoc ] -  EAbs n _ty b -> VFun (\ val -> evalExpr (bindVar n val env) b )+  EAbs n _ty b -> {-# SCC "evalExpr->EAbs" #-}+    return $ VFun (\v -> do env' <- bindVar n v env+                            evalExpr env' b)    -- XXX these will likely change once there is an evidence value   EProofAbs _ e -> evalExpr env e   EProofApp e   -> evalExpr env e -  ECast e _ty -> evalExpr env e--  EWhere e ds -> evalExpr (evalDecls ds env) e+  EWhere e ds -> {-# SCC "evalExpr->EWhere" #-} do+     env' <- evalDecls ds env+     evalExpr env' e    where +  {-# INLINE eval #-}   eval = evalExpr env-   ppV = ppValue defaultPPOpts   -- Newtypes -------------------------------------------------------------------- -evalNewtypes :: Map.Map Name Newtype -> EvalEnv -> EvalEnv-evalNewtypes nts env = Map.foldl (flip evalNewtype) env nts+evalNewtypes :: EvalPrims b w+             => Map.Map Name Newtype+             -> GenEvalEnv b w+             -> Eval (GenEvalEnv b w)+evalNewtypes nts env = foldM (flip evalNewtype) env $ Map.elems nts  -- | Introduce the constructor function for a newtype.-evalNewtype :: Newtype -> EvalEnv -> EvalEnv-evalNewtype nt = bindVar (ntName nt) (foldr tabs con (ntParams nt))+evalNewtype :: EvalPrims b w+            => Newtype+            -> GenEvalEnv b w+            -> Eval (GenEvalEnv b w)+evalNewtype nt = bindVar (ntName nt) (return (foldr tabs con (ntParams nt)))   where   tabs _tp body = tlam (\ _ -> body)   con           = VFun id@@ -112,169 +178,396 @@  -- Declarations ---------------------------------------------------------------- -evalDecls :: [DeclGroup] -> EvalEnv -> EvalEnv-evalDecls dgs env = foldl (flip evalDeclGroup) env dgs+-- | Extend the given evaluation environment with the result of evaluating the+--   given collection of declaration groups.+evalDecls :: EvalPrims b w+          => [DeclGroup]         -- ^ Declaration groups to evaluate+          -> GenEvalEnv b w      -- ^ Environment to extend+          -> Eval (GenEvalEnv b w)+evalDecls dgs env = foldM evalDeclGroup env dgs -evalDeclGroup :: DeclGroup -> EvalEnv -> EvalEnv-evalDeclGroup dg env = env'+evalDeclGroup :: EvalPrims b w+              => GenEvalEnv b w+              -> DeclGroup+              -> Eval (GenEvalEnv b w)+evalDeclGroup env dg = do+  case dg of+    Recursive ds -> do+      -- declare a "hole" for each declaration+      -- and extend the evaluation environment+      holes <- mapM declHole ds+      let holeEnv = Map.fromList $ [ (nm,h) | (nm,_,h,_) <- holes ]+      let env' = env `mappend` emptyEnv{ envVars = holeEnv }++      -- evaluate the declaration bodies, building a new evaluation environment+      env'' <- foldM (evalDecl env') env ds++      -- now backfill the holes we declared earlier using the definitions+      -- calculated in the previous step+      mapM_ (fillHole env'') holes++      -- return the map containing the holes+      return env'++    NonRecursive d -> do+      evalDecl env env d+++-- | This operation is used to complete the process of setting up recursive declaration+--   groups.  It 'backfills' previously-allocated thunk values with the actual evaluation+--   procedure for the body of recursive definitions.+--+--   In order to faithfully evaluate the nonstrict semantics of Cryptol, we have to take some+--   care in this process.  In particular, we need to ensure that every recursive definition+--   binding is indistinguishable from it's eta-expanded form.  The straightforward solution+--   to this is to force an eta-expansion procedure on all recursive definitions.+--   However, for the so-called 'Value' types we can instead optimisticly use the 'delayFill'+--   operation and only fall back on full eta expansion if the thunk is double-forced.+fillHole :: BitWord b w+         => GenEvalEnv b w+         -> (Name, Schema, Eval (GenValue b w), Eval (GenValue b w) -> Eval ())+         -> Eval ()+fillHole env (nm, sch, _, fill) = do+  case lookupVar nm env of+    Nothing -> evalPanic "fillHole" ["Recursive definition not completed", show (ppLocName nm)]+    Just x+     | isValueType env sch -> fill =<< delayFill x (etaDelay (show (ppLocName nm)) env sch x)+     | otherwise           -> fill (etaDelay (show (ppLocName nm)) env sch x)+++-- | 'Value' types are non-polymorphic types recursive constructed from+--   bits, finite sequences, tuples and records.  Types of this form can+--   be implemented rather more efficently than general types because we can+--   rely on the 'delayFill' operation to build a thunk that falls back on performing+--   eta-expansion rather than doing it eagerly.+isValueType :: GenEvalEnv b w -> Schema -> Bool+isValueType env Forall{ sVars = [], sProps = [], sType = t0 }+   = go (evalValType (envTypes env) t0)+ where+  go TVBit = True+  go (TVSeq _ x)  = go x+  go (TVTuple xs) = and (map go xs)+  go (TVRec xs)   = and (map (go . snd) xs)+  go _            = False++isValueType _ _ = False+++-- | Eta-expand a word value.  This forces an unpacked word representation.+etaWord  :: BitWord b w+         => Integer+         -> Eval (GenValue b w)+         -> Eval (WordValue b w)+etaWord n x = do+  w <- delay Nothing (fromWordVal "during eta-expansion" =<< x)+  return $ BitsVal $ Seq.fromFunction (fromInteger n) $ \i ->+    do w' <- w; indexWordValue w' (toInteger i)+++-- | Given a simulator value and it's type, fully eta-expand the value.  This+--   is a type-directed pass that always produces a canonical value of the+--   expected shape.  Eta expansion of values is sometimes necessary to ensure+--   the correct evaluation semantics of recursive definitions.  Otherwise,+--   expressions that should be expected to produce well-defined values in the+--   denotational semantics will fail to terminate instead.+etaDelay :: BitWord b w+         => String+         -> GenEvalEnv b w+         -> Schema+         -> Eval (GenValue b w)+         -> Eval (GenValue b w)+etaDelay msg env0 Forall{ sVars = vs0, sType = tp0 } = goTpVars env0 vs0   where-  -- the final environment is passed in for each declaration, to permit-  -- recursive values.-  env' = case dg of-    Recursive ds   -> foldr (evalDecl env') env ds-    NonRecursive d -> evalDecl env d env+  goTpVars env []     x = go (evalValType (envTypes env) tp0) x+  goTpVars env (v:vs) x =+    case tpKind v of+      KType -> return $ VPoly $ \t ->+                  goTpVars (bindType (tpVar v) (Right t) env) vs ( ($t) . fromVPoly =<< x )+      KNum  -> return $ VNumPoly $ \n ->+                  goTpVars (bindType (tpVar v) (Left n) env) vs ( ($n) . fromVNumPoly =<< x )+      k     -> panic "[Eval] etaDelay" ["invalid kind on type abstraction", show k] -evalDecl :: ReadEnv -> Decl -> EvalEnv -> EvalEnv-evalDecl renv d =-  bindVar (dName d) $-    case dDefinition d of-      DPrim   -> evalPrim d-      DExpr e -> evalExpr renv e+  go tp (Ready x) =+    case x of+      VBit _    -> return x+      VWord _ _ -> return x+      VSeq n xs+        | TVSeq _nt el <- tp+        -> return $ VSeq n $ IndexSeqMap $ \i -> go el (lookupSeqMap xs i) +      VStream xs+        | TVStream el <- tp+        -> return $ VStream $ IndexSeqMap $ \i -> go el (lookupSeqMap xs i) +      VTuple xs+        | TVTuple ts <- tp+        -> return $ VTuple (zipWith go ts xs)++      VRecord fs+        | TVRec fts <- tp+        -> return $ VRecord $+             let err f = evalPanic "expected record value with field" [show f] in+             [ (f, go (fromMaybe (err f) (lookup f fts)) y)+             | (f, y) <- fs+             ]++      VFun f+        | TVFun _t1 t2 <- tp+        -> return $ VFun $ \a -> go t2 (f a)++      _ -> evalPanic "type mismatch during eta-expansion" []++  go tp x =+    case tp of+      TVBit -> x++      TVSeq n TVBit ->+          do w <- delayFill (fromWordVal "during eta-expansion" =<< x) (etaWord n x)+             return $ VWord n w++      TVSeq n el ->+          do x' <- delay (Just msg) (fromSeq "during eta-expansion" =<< x)+             return $ VSeq n $ IndexSeqMap $ \i -> do+               go el (flip lookupSeqMap i =<< x')++      TVStream el ->+          do x' <- delay (Just msg) (fromSeq "during eta-expansion" =<< x)+             return $ VStream $ IndexSeqMap $ \i ->+               go el (flip lookupSeqMap i =<< x')++      TVFun _t1 t2 ->+          do x' <- delay (Just msg) (fromVFun <$> x)+             return $ VFun $ \a -> go t2 ( ($a) =<< x' )++      TVTuple ts ->+          do let n = length ts+             x' <- delay (Just msg) (fromVTuple <$> x)+             return $ VTuple $+                [ go t =<< (flip genericIndex i <$> x')+                | i <- [0..(n-1)]+                | t <- ts+                ]++      TVRec fs ->+          do x' <- delay (Just msg) (fromVRecord <$> x)+             let err f = evalPanic "expected record value with field" [show f]+             return $ VRecord $+                [ (f, go t =<< (fromMaybe (err f) . lookup f <$> x'))+                | (f,t) <- fs+                ]+++declHole :: Decl+         -> Eval (Name, Schema, Eval (GenValue b w), Eval (GenValue b w) -> Eval ())+declHole d =+  case dDefinition d of+    DPrim   -> evalPanic "Unexpected primitive declaration in recursive group"+                         [show (ppLocName nm)]+    DExpr _ -> do+      (hole, fill) <- blackhole msg+      return (nm, sch, hole, fill)+  where+  nm = dName d+  sch = dSignature d+  msg = unwords ["<<loop>> while evaluating", show (pp nm)]+++-- | Evaluate a declaration, extending the evaluation environment.+--   Two input environments are given: the first is an environment+--   to use when evaluating the body of the declaration; the second+--   is the environment to extend.  There are two environments to+--   handle the subtle name-binding issues that arise from recursive+--   definitions.  The 'read only' environment is used to bring recursive+--   names into scope while we are still defining them.+evalDecl :: EvalPrims b w+         => GenEvalEnv b w  -- ^ A 'read only' environment for use in declaration bodies+         -> GenEvalEnv b w  -- ^ An evaluation environment to extend with the given declaration+         -> Decl            -- ^ The declaration to evaluate+         -> Eval (GenEvalEnv b w)+evalDecl renv env d =+  case dDefinition d of+    DPrim   -> bindVarDirect (dName d) (evalPrim d) env+    DExpr e -> bindVar (dName d) (evalExpr renv e) env++ -- Selectors ------------------------------------------------------------------- -evalSel :: ReadEnv -> Expr -> Selector -> Value-evalSel env e sel = case sel of+-- | Apply the the given "selector" form to the given value.  This function pushes+--   tuple and record selections pointwise down into other value constructs+--   (e.g., streams and functions).+evalSel :: forall b w+         . EvalPrims b w+        => GenValue b w+        -> Selector+        -> Eval (GenValue b w)+evalSel val sel = case sel of    TupleSel n _  -> tupleSel n val   RecordSel n _ -> recordSel n val-  ListSel ix _  -> fromSeq val !! ix-+  ListSel ix _  -> listSel ix val   where -  val = evalExpr env e-   tupleSel n v =     case v of-      VTuple vs     -> vs !! n-      VSeq False vs -> VSeq False [ tupleSel n v1 | v1 <- vs ]-      VStream vs    -> VStream [ tupleSel n v1 | v1 <- vs ]-      VFun f        -> VFun (\x -> tupleSel n (f x))-      _             -> evalPanic "Cryptol.Eval.evalSel"-                          [ "Unexpected value in tuple selection"-                          , show (ppValue defaultPPOpts v) ]+      VTuple vs       -> vs !! n+      VSeq w vs       -> VSeq w <$> mapSeqMap (tupleSel n) vs+      VStream vs      -> VStream <$> mapSeqMap (tupleSel n) vs+      VFun f          -> return $ VFun (\x -> tupleSel n =<< f x)+      _               -> do vdoc <- ppValue defaultPPOpts v+                            evalPanic "Cryptol.Eval.evalSel"+                              [ "Unexpected value in tuple selection"+                              , show vdoc ]    recordSel n v =     case v of-      VRecord {}    -> lookupRecord n v-      VSeq False vs -> VSeq False [ recordSel n v1 | v1 <- vs ]-      VStream vs    -> VStream [recordSel n v1 | v1 <- vs ]-      VFun f        -> VFun (\x -> recordSel n (f x))-      _             -> evalPanic "Cryptol.Eval.evalSel"-                          [ "Unexpected value in record selection"-                          , show (ppValue defaultPPOpts v) ]+      VRecord {}      -> lookupRecord n v+      VSeq w vs       -> VSeq w <$> mapSeqMap (recordSel n) vs+      VStream vs      -> VStream <$> mapSeqMap (recordSel n) vs+      VFun f          -> return $ VFun (\x -> recordSel n =<< f x)+      _               -> do vdoc <- ppValue defaultPPOpts v+                            evalPanic "Cryptol.Eval.evalSel"+                              [ "Unexpected value in record selection"+                              , show vdoc ] +  listSel n v =+    case v of+      VSeq _ vs       -> lookupSeqMap vs (toInteger n)+      VStream vs      -> lookupSeqMap vs (toInteger n)+      VWord _ wv      -> VBit <$> (flip indexWordValue (toInteger n) =<< wv)+      _               -> do vdoc <- ppValue defaultPPOpts val+                            evalPanic "Cryptol.Eval.evalSel"+                              [ "Unexpected value in list selection"+                              , show vdoc ]     -- List Comprehension Environments --------------------------------------------- --- | A variation of the ZipList type from Control.Applicative, with a--- separate constructor for pure values. This datatype is used to--- represent the list of values that each variable takes on within a--- list comprehension. The @Zip@ constructor is for bindings that take--- different values at different positions in the list, while the--- @Pure@ constructor is for bindings originating outside the list--- comprehension, which have the same value for all list positions.-data ZList a = Pure a | Zip [a]--getZList :: ZList a -> [a]-getZList (Pure x) = repeat x-getZList (Zip xs) = xs--instance Functor ZList where-  fmap f (Pure x) = Pure (f x)-  fmap f (Zip xs) = Zip (map f xs)--instance Applicative ZList where-  pure x = Pure x-  Pure f <*> Pure x = Pure (f x)-  Pure f <*> Zip xs = Zip (map f xs)-  Zip fs <*> Pure x = Zip (map ($ x) fs)-  Zip fs <*> Zip xs = Zip (zipWith ($) fs xs)- -- | Evaluation environments for list comprehensions: Each variable -- name is bound to a list of values, one for each element in the list -- comprehension.-data ListEnv = ListEnv-  { leVars :: Map.Map Name (ZList Value)-  , leTypes :: Map.Map TVar (Either Nat' TValue)+data ListEnv b w = ListEnv+  { leVars   :: !(Map.Map Name (Integer -> Eval (GenValue b w)))+      -- ^ Bindings whose values vary by position+  , leStatic :: !(Map.Map Name (Eval (GenValue b w)))+      -- ^ Bindings whose values are constant+  , leTypes  :: !TypeEnv   } -instance Monoid ListEnv where+instance Monoid (ListEnv b w) where   mempty = ListEnv-    { leVars  = Map.empty-    , leTypes = Map.empty+    { leVars   = Map.empty+    , leStatic = Map.empty+    , leTypes  = Map.empty     }    mappend l r = ListEnv-    { leVars  = Map.union (leVars  l) (leVars  r)-    , leTypes = Map.union (leTypes l) (leTypes r)+    { leVars   = Map.union (leVars  l)  (leVars  r)+    , leStatic = Map.union (leStatic l) (leStatic r)+    , leTypes  = Map.union (leTypes l)  (leTypes r)     } -toListEnv :: EvalEnv -> ListEnv+toListEnv :: GenEvalEnv b w -> ListEnv b w toListEnv e =   ListEnv-  { leVars = fmap Pure (envVars e)-  , leTypes = envTypes e+  { leVars   = mempty+  , leStatic = envVars e+  , leTypes  = envTypes e   } --- | Take parallel slices of the list environment. If some names are--- bound to longer lists of values (e.g. if they come from a different--- parallel branch of a comprehension) then the last elements will be--- dropped as the lists are zipped together.-zipListEnv :: ListEnv -> [EvalEnv]-zipListEnv (ListEnv vm tm) =-  [ EvalEnv { envVars = v, envTypes = tm }-  | v <- getZList (sequenceA vm) ]--bindVarList :: Name -> [Value] -> ListEnv -> ListEnv-bindVarList n vs lenv = lenv { leVars = Map.insert n (Zip vs) (leVars lenv) }+-- | Evaluate a list environment at a position.+--   This choses a particular value for the varying+--   locations.+evalListEnv :: ListEnv b w -> Integer -> GenEvalEnv b w+evalListEnv (ListEnv vm st tm) i =+    let v = fmap ($i) vm+     in EvalEnv{ envVars = Map.union v st+               , envTypes = tm+               } +bindVarList :: Name+            -> (Integer -> Eval (GenValue b w))+            -> ListEnv b w+            -> ListEnv b w+bindVarList n vs lenv = lenv { leVars = Map.insert n vs (leVars lenv) }  -- List Comprehensions ---------------------------------------------------------  -- | Evaluate a comprehension.-evalComp :: ReadEnv -> TValue -> Expr -> [[Match]] -> Value-evalComp env seqty body ms =-  case isTSeq seqty of-    Just (len, el) -> toSeq len el [ evalExpr e body | e <- envs ]-    _ -> evalPanic "Cryptol.Eval" ["evalComp given a non sequence", show seqty]--  -- XXX we could potentially print this as a number if the type was available.-  where-  -- generate a new environment for each iteration of each parallel branch-  benvs :: [ListEnv]-  benvs = map (branchEnvs (toListEnv env)) ms--  -- join environments to produce environments at each step through the process.-  envs :: [EvalEnv]-  envs = zipListEnv (mconcat benvs)+evalComp :: EvalPrims b w+         => GenEvalEnv b w  -- ^ Starting evaluation environment+         -> Nat'            -- ^ Length of the comprehension+         -> TValue          -- ^ Type of the comprehension elements+         -> Expr            -- ^ Head expression of the comprehension+         -> [[Match]]       -- ^ List of parallel comprehension branches+         -> Eval (GenValue b w)+evalComp env len elty body ms =+       do lenv <- mconcat <$> mapM (branchEnvs (toListEnv env)) ms+          mkSeq len elty <$> memoMap (IndexSeqMap $ \i -> do+              evalExpr (evalListEnv lenv i) body)  -- | Turn a list of matches into the final environments for each iteration of -- the branch.-branchEnvs :: ListEnv -> [Match] -> ListEnv-branchEnvs env matches = foldl evalMatch env matches+branchEnvs :: EvalPrims b w+           => ListEnv b w+           -> [Match]+           -> Eval (ListEnv b w)+branchEnvs env matches = foldM evalMatch env matches  -- | Turn a match into the list of environments it represents.-evalMatch :: ListEnv -> Match -> ListEnv+evalMatch :: EvalPrims b w+          => ListEnv b w+          -> Match+          -> Eval (ListEnv b w) evalMatch lenv m = case m of    -- many envs-  From n _ty expr -> bindVarList n (concat vss) lenv'+  From n l _ty expr ->+    case len of+      -- Select from a sequence of finite length.  This causes us to 'stutter'+      -- through our previous choices `nLen` times.+      Nat nLen -> do+        vss <- memoMap $ IndexSeqMap $ \i -> evalExpr (evalListEnv lenv i) expr+        let stutter xs = \i -> xs (i `div` nLen)+        let lenv' = lenv { leVars = fmap stutter (leVars lenv) }+        let vs i = do let (q, r) = i `divMod` nLen+                      lookupSeqMap vss q >>= \case+                        VWord _ w   -> VBit <$> (flip indexWordValue r =<< w)+                        VSeq _ xs'  -> lookupSeqMap xs' r+                        VStream xs' -> lookupSeqMap xs' r+                        _           -> evalPanic "evalMatch" ["Not a list value"]+        return $ bindVarList n vs lenv'++      -- Select from a sequence of infinite length.  Note that this means we+      -- will never need to backtrack into previous branches.  Thus, we can convert+      -- `leVars` elements of the comprehension environment into `leStatic` elements+      -- by selecting out the 0th element.+      Inf -> do+        let allvars = Map.union (fmap ($0) (leVars lenv)) (leStatic lenv)+        let lenv' = lenv { leVars   = Map.empty+                         , leStatic = allvars+                         }+        let env   = EvalEnv allvars (leTypes lenv)+        xs <- evalExpr env expr+        let vs i = case xs of+                     VWord _ w   -> VBit <$> (flip indexWordValue i =<< w)+                     VSeq _ xs'  -> lookupSeqMap xs' i+                     VStream xs' -> lookupSeqMap xs' i+                     _           -> evalPanic "evalMatch" ["Not a list value"]+        return $ bindVarList n vs lenv'+     where-      vss = [ fromSeq (evalExpr env expr) | env <- zipListEnv lenv ]-      stutter (Pure x) = Pure x-      stutter (Zip xs) = Zip [ x | (x, vs) <- zip xs vss, _ <- vs ]-      lenv' = lenv { leVars = fmap stutter (leVars lenv) }+      len  = evalNumType (leTypes lenv) l    -- XXX we don't currently evaluate these as though they could be recursive, as   -- they are typechecked that way; the read environment to evalExpr is the same   -- as the environment to bind a new name in.-  Let d -> bindVarList (dName d) (map f (zipListEnv lenv)) lenv-    where f env =-            case dDefinition d of-              DPrim   -> evalPrim d-              DExpr e -> evalExpr env e+  Let d -> return $ bindVarList (dName d) (\i -> f (evalListEnv lenv i)) lenv+    where+      f env =+          case dDefinition d of+            -- Primitives here should never happen, I think...+            --    perhaps this should be converted to an error.+            DPrim   -> return $ evalPrim d+            DExpr e -> evalExpr env e
src/Cryptol/Eval/Env.hs view
@@ -14,14 +14,17 @@ {-# LANGUAGE DeriveGeneric #-} module Cryptol.Eval.Env where +import Cryptol.Eval.Monad( Eval, delay, ready )+import Cryptol.Eval.Type import Cryptol.Eval.Value import Cryptol.ModuleSystem.Name import Cryptol.TypeCheck.AST-import Cryptol.TypeCheck.Solver.InfNat (Nat'(..))+import Cryptol.TypeCheck.Solver.InfNat import Cryptol.Utils.PP -import qualified Data.Map as Map +import qualified Data.Map.Strict as Map+ import GHC.Generics (Generic) import Control.DeepSeq @@ -30,14 +33,12 @@  -- Evaluation Environment ------------------------------------------------------ -type ReadEnv = EvalEnv--data EvalEnv = EvalEnv-  { envVars       :: Map.Map Name Value-  , envTypes      :: Map.Map TVar (Either Nat' TValue)+data GenEvalEnv b w = EvalEnv+  { envVars       :: !(Map.Map Name (Eval (GenValue b w)))+  , envTypes      :: !TypeEnv   } deriving (Generic, NFData) -instance Monoid EvalEnv where+instance Monoid (GenEvalEnv b w) where   mempty = EvalEnv     { envVars       = Map.empty     , envTypes      = Map.empty@@ -48,26 +49,47 @@     , envTypes    = Map.union (envTypes    l) (envTypes    r)     } -instance PP (WithBase EvalEnv) where-  ppPrec _ (WithBase opts env) = brackets (fsep (map bind (Map.toList (envVars env))))-    where-    bind (k,v) = pp k <+> text "->" <+> ppValue opts v+ppEnv :: BitWord b w => PPOpts -> GenEvalEnv b w -> Eval Doc+ppEnv opts env = brackets . fsep <$> mapM bind (Map.toList (envVars env))+  where+   bind (k,v) = do vdoc <- ppValue opts =<< v+                   return (pp k <+> text "->" <+> vdoc) -emptyEnv :: EvalEnv+-- | Evaluation environment with no bindings+emptyEnv :: GenEvalEnv b w emptyEnv  = mempty  -- | Bind a variable in the evaluation environment.-bindVar :: Name -> Value -> EvalEnv -> EvalEnv-bindVar n val env = env { envVars = Map.insert n val (envVars env) }+bindVar :: Name+        -> Eval (GenValue b w)+        -> GenEvalEnv b w+        -> Eval (GenEvalEnv b w)+bindVar n val env = do+  let nm = show $ ppLocName n+  val' <- delay (Just nm) val+  return $ env{ envVars = Map.insert n val' (envVars env) } +-- | Bind a variable to a value in the evaluation environment, without+--   creating a thunk.+bindVarDirect :: Name+              -> GenValue b w+              -> GenEvalEnv b w+              -> Eval (GenEvalEnv b w)+bindVarDirect n val env = do+  return $ env{ envVars = Map.insert n (ready val) (envVars env) }+ -- | Lookup a variable in the environment.-lookupVar :: Name -> EvalEnv -> Maybe Value+{-# INLINE lookupVar #-}+lookupVar :: Name -> GenEvalEnv b w -> Maybe (Eval (GenValue b w)) lookupVar n env = Map.lookup n (envVars env) --- | Bind a type variable of kind # or *.-bindType :: TVar -> Either Nat' TValue -> EvalEnv -> EvalEnv+-- | Bind a type variable of kind *.+{-# INLINE bindType #-}+bindType :: TVar -> Either Nat' TValue -> GenEvalEnv b w -> GenEvalEnv b w bindType p ty env = env { envTypes = Map.insert p ty (envTypes env) }  -- | Lookup a type variable.-lookupType :: TVar -> EvalEnv -> Maybe (Either Nat' TValue)+{-# INLINE lookupType #-}+lookupType :: TVar -> GenEvalEnv b w -> Maybe (Either Nat' TValue) lookupType p env = Map.lookup p (envTypes env)+
− src/Cryptol/Eval/Error.hs
@@ -1,69 +0,0 @@--- |--- Module      :  $Header$--- Copyright   :  (c) 2013-2016 Galois, Inc.--- License     :  BSD3--- Maintainer  :  cryptol@galois.com--- Stability   :  provisional--- Portability :  portable--{-# LANGUAGE Safe #-}-{-# LANGUAGE DeriveDataTypeable #-}--module Cryptol.Eval.Error where--import Cryptol.Utils.Panic-import Cryptol.Utils.PP-import Cryptol.TypeCheck.AST(Type)--import           Data.Typeable (Typeable)-import qualified Control.Exception as X----- Errors -------------------------------------------------------------------------- | Panic from an Eval context.-evalPanic :: String -> [String] -> a-evalPanic cxt = panic ("[Eval] " ++ cxt)---data EvalError-  = InvalidIndex Integer-  | TypeCannotBeDemoted Type-  | DivideByZero-  | WordTooWide Integer-  | UserError String-    deriving (Typeable,Show)--instance PP EvalError where-  ppPrec _ e = case e of-    InvalidIndex i -> text "invalid sequence index:" <+> integer i-    TypeCannotBeDemoted t -> text "type cannot be demoted:" <+> pp t-    DivideByZero -> text "division by 0"-    WordTooWide w ->-      text "word too wide for memory:" <+> integer w <+> text "bits"-    UserError x -> text "Run-time error:" <+> text x--instance X.Exception EvalError---- | A sequencing operation has gotten an invalid index.-invalidIndex :: Integer -> a-invalidIndex i = X.throw (InvalidIndex i)---- | For things like `(inf) or `(0-1)-typeCannotBeDemoted :: Type -> a-typeCannotBeDemoted t = X.throw (TypeCannotBeDemoted t)---- | For division by 0.-divideByZero :: a-divideByZero = X.throw DivideByZero---- | For when we know that a word is too wide and will exceed gmp's--- limits (though words approaching this size will probably cause the--- system to crash anyway due to lack of memory)-wordTooWide :: Integer -> a-wordTooWide w = X.throw (WordTooWide w)---- | For `error`-cryUserError :: String -> a-cryUserError msg = X.throw (UserError msg)-
+ src/Cryptol/Eval/Monad.hs view
@@ -0,0 +1,210 @@+-- |+-- Module      :  $Header$+-- Copyright   :  (c) 2013-2016 Galois, Inc.+-- License     :  BSD3+-- Maintainer  :  cryptol@galois.com+-- Stability   :  provisional+-- Portability :  portable++{-# LANGUAGE Safe #-}+{-# LANGUAGE DeriveDataTypeable #-}+{-# LANGUAGE DeriveFunctor #-}++module Cryptol.Eval.Monad+( -- * Evaluation monad+  Eval(..)+, runEval+, io+, delay+, delayFill+, ready+, blackhole+  -- * Error reporting+, EvalError(..)+, evalPanic+, typeCannotBeDemoted+, divideByZero+, wordTooWide+, cryUserError+, cryLoopError+, invalidIndex+) where++import           Control.DeepSeq+import           Control.Monad+import           Control.Monad.Fix+import           Control.Monad.IO.Class+import           Data.IORef+import           Data.Typeable (Typeable)+import qualified Control.Exception as X+++import Cryptol.Utils.Panic+import Cryptol.Utils.PP+import Cryptol.TypeCheck.AST(Type)++-- | A computation that returns an already-evaluated value.+ready :: a -> Eval a+ready a = Ready a++-- | The monad for Cryptol evaluation.+data Eval a+   = Ready !a+   | Thunk !(IO a)++data ThunkState a+  = Unforced        -- ^ This thunk has not yet been forced+  | BlackHole       -- ^ This thunk is currently being evaluated+  | Forced !a       -- ^ This thunk has previously been forced, and has the given value++{-# INLINE delay #-}+-- | Delay the given evaluation computation, returning a thunk+--   which will run the computation when forced.  Raise a loop+--   error if the resulting thunk is forced during its own evaluation.+delay :: Maybe String     -- ^ Optional name to print if a loop is detected+      -> Eval a           -- ^ Computation to delay+      -> Eval (Eval a)+delay _ (Ready a) = Ready (Ready a)+delay msg (Thunk x) = Thunk $ do+  let msg' = maybe "" ("while evaluating "++) msg+  let retry = cryLoopError msg'+  r <- newIORef Unforced+  return $ unDelay retry r x++{-# INLINE delayFill #-}++-- | Delay the given evaluation computation, returning a thunk+--   which will run the computation when forced.  Run the 'retry'+--   computation instead if the resulting thunk is forced during+--   its own evaluation.+delayFill :: Eval a        -- ^ Computation to delay+          -> Eval a        -- ^ Backup computation to run if a tight loop is detected+          -> Eval (Eval a)+delayFill (Ready x) _ = Ready (Ready x)+delayFill (Thunk x) retry = Thunk $ do+  r <- newIORef Unforced+  return $ unDelay retry r x++-- | Produce a thunk value which can be filled with its associated computation+--   after the fact.  A preallocated thunk is returned, along with an operation to+--   fill the thunk with the associated computation.+--   This is used to implement recursive declaration groups.+blackhole :: String -- ^ A name to associate with this thunk.+          -> Eval (Eval a, Eval a -> Eval ())+blackhole msg = do+  r <- io $ newIORef (fail msg)+  let get = join (io $ readIORef r)+  let set = io . writeIORef r+  return (get, set)++unDelay :: Eval a -> IORef (ThunkState a) -> IO a -> Eval a+unDelay retry r x = do+  rval <- io $ readIORef r+  case rval of+    Forced val -> return val+    BlackHole  ->+      retry+    Unforced -> io $ do+      writeIORef r BlackHole+      val <- x+      writeIORef r (Forced val)+      return val++-- | Execute the given evaluation action.+runEval :: Eval a -> IO a+runEval (Ready a) = return a+runEval (Thunk x) = x++{-# INLINE evalBind #-}+evalBind :: Eval a -> (a -> Eval b) -> Eval b+evalBind (Ready a) f  = f a+evalBind (Thunk x) f  = Thunk (x >>= runEval . f)++instance Functor Eval where+  fmap f (Ready x) = Ready (f x)+  fmap f (Thunk m) = Thunk (f <$> m)+  {-# INLINE fmap #-}++instance Applicative Eval where+  pure  = return+  (<*>) = ap+  {-# INLINE pure #-}+  {-# INLINE (<*>) #-}++instance Monad Eval where+  return = Ready+  fail   = Thunk . fail+  (>>=)  = evalBind+  {-# INLINE return #-}+  {-# INLINE (>>=) #-}++instance MonadIO Eval where+  liftIO = io++instance NFData a => NFData (Eval a) where+  rnf (Ready a) = rnf a+  rnf (Thunk _) = ()++instance MonadFix Eval where+  mfix f = Thunk $ mfix (\x -> runEval (f x))++-- | Lift an 'IO' computation into the 'Eval' monad.+io :: IO a -> Eval a+io = Thunk+{-# INLINE io #-}+++-- Errors ----------------------------------------------------------------------++-- | Panic from an @Eval@ context.+evalPanic :: String -> [String] -> a+evalPanic cxt = panic ("[Eval] " ++ cxt)+++-- | Data type describing errors that can occur during evaluation.+data EvalError+  = InvalidIndex Integer          -- ^ Out-of-bounds index+  | TypeCannotBeDemoted Type      -- ^ Non-numeric type passed to demote function+  | DivideByZero                  -- ^ Division or modulus by 0+  | WordTooWide Integer           -- ^ Bitvector too large+  | UserError String              -- ^ Call to the Cryptol @error@ primitive+  | LoopError String              -- ^ Detectable nontermination+    deriving (Typeable,Show)++instance PP EvalError where+  ppPrec _ e = case e of+    InvalidIndex i -> text "invalid sequence index:" <+> integer i+    TypeCannotBeDemoted t -> text "type cannot be demoted:" <+> pp t+    DivideByZero -> text "division by 0"+    WordTooWide w ->+      text "word too wide for memory:" <+> integer w <+> text "bits"+    UserError x -> text "Run-time error:" <+> text x+    LoopError x -> text "<<loop>>" <+> text x++instance X.Exception EvalError++-- | For things like @`(inf)@ or @`(0-1)@.+typeCannotBeDemoted :: Type -> a+typeCannotBeDemoted t = X.throw (TypeCannotBeDemoted t)++-- | For division by 0.+divideByZero :: Eval a+divideByZero = Thunk (X.throwIO DivideByZero)++-- | For when we know that a word is too wide and will exceed gmp's+-- limits (though words approaching this size will probably cause the+-- system to crash anyway due to lack of memory).+wordTooWide :: Integer -> a+wordTooWide w = X.throw (WordTooWide w)++-- | For the Cryptol @error@ function.+cryUserError :: String -> Eval a+cryUserError msg = Thunk (X.throwIO (UserError msg))++-- | For cases where we can detect tight loops.+cryLoopError :: String -> Eval a+cryLoopError msg = Thunk (X.throwIO (LoopError msg))++-- | A sequencing operation has gotten an invalid index.+invalidIndex :: Integer -> Eval a+invalidIndex i = Thunk (X.throwIO (InvalidIndex i))
+ src/Cryptol/Eval/Reference.lhs view
@@ -0,0 +1,1090 @@+> -- |+> -- Module      :  $Header$+> -- Description :  The reference implementation of the Cryptol evaluation semantics.+> -- Copyright   :  (c) 2013-2016 Galois, Inc.+> -- License     :  BSD3+> -- Maintainer  :  cryptol@galois.com+> -- Stability   :  provisional+> -- Portability :  portable+>+> {-# LANGUAGE PatternGuards #-}+>+> module Cryptol.Eval.Reference+>   ( Value(..)+>   , evaluate+>   , ppValue+>   ) where+>+> import Control.Applicative (liftA2)+> import Data.Bits+> import Data.List+>   (genericDrop, genericIndex, genericLength, genericReplicate, genericSplitAt,+>    genericTake, sortBy)+> import Data.Ord (comparing)+> import Data.Map (Map)+> import qualified Data.Map as Map+> import qualified Data.Text as T (pack)+>+> import Cryptol.ModuleSystem.Name (asPrim)+> import Cryptol.TypeCheck.Solver.InfNat (Nat'(..))+> import Cryptol.TypeCheck.AST+> import Cryptol.Eval.Monad (EvalError(..))+> import Cryptol.Eval.Type (TValue(..), isTBit, evalValType, evalNumType, tvSeq)+> import Cryptol.Prims.Eval (lg2, divModPoly)+> import Cryptol.Utils.Ident (Ident, mkIdent)+> import Cryptol.Utils.Panic (panic)+> import Cryptol.Utils.PP+>+> import qualified Cryptol.ModuleSystem as M+> import qualified Cryptol.ModuleSystem.Env as M (loadedModules)++Overview+========++This file describes the semantics of the explicitly-typed Cryptol+language (i.e., terms after type checking). Issues related to type+inference, type functions, and type constraints are beyond the scope+of this document.++Cryptol Types+-------------++Cryptol types come in two kinds: numeric types (kind `#`) and value+types (kind `*`). While value types are inhabited by well-typed+Cryptol expressions, numeric types are only used as parameters to+other types; they have no inhabitants. In this implementation we+represent numeric types as values of the Haskell type `Nat'` of+natural numbers with infinity; value types are represented as values+of type `TValue`.++The value types of Cryptol, along with their Haskell representations,+are as follows:++| Cryptol type      | Description    | `TValue` representation     |+|:----------------- |:-------------- |:--------------------------- |+| `Bit`             | booleans       | `TVBit`                     |+| `[n]a`            | finite lists   | `TVSeq n a`                 |+| `[inf]a`          | infinite lists | `TVStream a`                |+| `(a, b, c)`       | tuples         | `TVTuple [a,b,c]`           |+| `{x:a, y:b, z:c}` | records        | `TVRec [(x,a),(y,b),(z,c)]` |+| `a -> b`          | functions      | `TVFun a b`                 |++We model each Cryptol value type `t` as a complete partial order (cpo)+*M*(`t`). To each Cryptol expression `e : t` we assign a meaning+*M*(`e`) in *M*(`t`); in particular, recursive Cryptol programs of+type `t` are modeled as least fixed points in *M*(`t`). In other words,+this is a domain-theoretic denotational semantics.++Evaluating a Cryptol expression of type `Bit` may result in:++- a defined value `True` or `False`++- a run-time error, or++- non-termination.++Accordingly, *M*(`Bit`) is a flat cpo with values for `True`,+`False`, run-time errors of type `EvalError`, and $\bot$; we+represent it with the Haskell type `Either EvalError Bool`.++The cpos for lists, tuples, and records are cartesian products. The+cpo ordering is pointwise, and the bottom element $\bot$ is the+list/tuple/record whose elements are all $\bot$. Trivial types `[0]t`,+`()` and `{}` denote single-element cpos where the unique value+`[]`/`()`/`{}` *is* the bottom element $\bot$. *M*(`a -> b`) is the+continuous function space *M*(`a`) $\to$ *M*(`b`).++Type schemas of the form `{a1 ... an} (p1 ... pk) => t` classify+polymorphic values in Cryptol. These are represented with the Haskell+type `Schema`. The meaning of a schema is cpo whose elements are+functions: For each valid instantiation `t1 ... tn` of the type+parameters `a1 ... an` that satisfies the constraints `p1 ... pk`, the+function returns a value in *M*(`t[t1/a1 ... tn/an]`).++Values+------++The Haskell code in this module defines the semantics of typed Cryptol+terms by providing an evaluator to an appropriate `Value` type.++> -- | Value type for the reference evaluator.+> data Value+>   = VBit (Either EvalError Bool) -- ^ @ Bit    @ booleans+>   | VList [Value]                -- ^ @ [n]a   @ finite or infinite lists+>   | VTuple [Value]               -- ^ @ ( .. ) @ tuples+>   | VRecord [(Ident, Value)]     -- ^ @ { .. } @ records+>   | VFun (Value -> Value)        -- ^ functions+>   | VPoly (TValue -> Value)      -- ^ polymorphic values (kind *)+>   | VNumPoly (Nat' -> Value)     -- ^ polymorphic values (kind #)++Invariant: Undefinedness and run-time exceptions are only allowed+inside the argument of a `VBit` constructor. All other `Value` and+list constructors should evaluate without error. For example, a+non-terminating computation at type `(Bit,Bit)` must be represented as+`VTuple [VBit undefined, VBit undefined]`, and not simply as+`undefined`. Similarly, an expression like `1/0:[2]` that raises a+run-time error must be encoded as `VList [VBit (Left e), VBit (Left+e)]` where `e = DivideByZero`.++Copy Functions+--------------++Functions `copyBySchema` and `copyByTValue` make a copy of the given+value, building the spine based only on the type without forcing the+value argument. This ensures that undefinedness appears inside `VBit`+values only, and never on any constructors of the `Value` type. In+turn, this gives the appropriate semantics to recursive definitions:+The bottom value for a compound type is equal to a value of the same+type where every individual bit is bottom.++For each Cryptol type `t`, the cpo *M*(`t`) can be represented as a+subset of values of type `Value` that satisfy the datatype invariant.+This subset consists precisely of the output range of `copyByTValue+t`. Similarly, the range of output values of `copyBySchema` yields the+cpo that represents any given schema.++> copyBySchema :: Env -> Schema -> Value -> Value+> copyBySchema env0 (Forall params _props ty) = go params env0+>   where+>     go :: [TParam] -> Env -> Value -> Value+>     go []       env v = copyByTValue (evalValType (envTypes env) ty) v+>     go (p : ps) env v =+>       case v of+>         VPoly    f -> VPoly    $ \t -> go ps (bindType (tpVar p) (Right t) env) (f t)+>         VNumPoly f -> VNumPoly $ \n -> go ps (bindType (tpVar p) (Left n)  env) (f n)+>         _          -> evalPanic "copyBySchema" ["Expected polymorphic value"]+>+> copyByTValue :: TValue -> Value -> Value+> copyByTValue = go+>   where+>     go :: TValue -> Value -> Value+>     go ty val =+>       case ty of+>         TVBit        -> VBit (fromVBit val)+>         TVSeq w ety  -> VList (map (go ety) (copyList w (fromVList val)))+>         TVStream ety -> VList (map (go ety) (copyStream (fromVList val)))+>         TVTuple etys -> VTuple (zipWith go etys (copyList (genericLength etys) (fromVTuple val)))+>         TVRec fields -> VRecord [ (f, go fty (lookupRecord f val)) | (f, fty) <- fields ]+>         TVFun _ bty  -> VFun (\v -> go bty (fromVFun val v))+>+> copyStream :: [a] -> [a]+> copyStream xs = head xs : copyStream (tail xs)+>+> copyList :: Integer -> [a] -> [a]+> copyList 0 _ = []+> copyList n xs = head xs : copyList (n - 1) (tail xs)++Operations on Values+--------------------++> -- | Destructor for @VBit@.+> fromVBit :: Value -> Either EvalError Bool+> fromVBit (VBit b) = b+> fromVBit _        = evalPanic "fromVBit" ["Expected a bit"]+>+> -- | Destructor for @VList@.+> fromVList :: Value -> [Value]+> fromVList (VList vs) = vs+> fromVList _          = evalPanic "fromVList" ["Expected a list"]+>+> -- | Destructor for @VTuple@.+> fromVTuple :: Value -> [Value]+> fromVTuple (VTuple vs) = vs+> fromVTuple _           = evalPanic "fromVTuple" ["Expected a tuple"]+>+> -- | Destructor for @VRecord@.+> fromVRecord :: Value -> [(Ident, Value)]+> fromVRecord (VRecord fs) = fs+> fromVRecord _            = evalPanic "fromVRecord" ["Expected a record"]+>+> -- | Destructor for @VFun@.+> fromVFun :: Value -> (Value -> Value)+> fromVFun (VFun f) = f+> fromVFun _        = evalPanic "fromVFun" ["Expected a function"]+>+> -- | Destructor for @VPoly@.+> fromVPoly :: Value -> (TValue -> Value)+> fromVPoly (VPoly f) = f+> fromVPoly _         = evalPanic "fromVPoly" ["Expected a polymorphic value"]+>+> -- | Destructor for @VNumPoly@.+> fromVNumPoly :: Value -> (Nat' -> Value)+> fromVNumPoly (VNumPoly f) = f+> fromVNumPoly _            = evalPanic "fromVNumPoly" ["Expected a polymorphic value"]+>+> -- | Look up a field in a record.+> lookupRecord :: Ident -> Value -> Value+> lookupRecord f v =+>   case lookup f (fromVRecord v) of+>     Just val -> val+>     Nothing  -> evalPanic "lookupRecord" ["Malformed record"]+>+> -- | Polymorphic function values that expect a finite numeric type.+> vFinPoly :: (Integer -> Value) -> Value+> vFinPoly f = VNumPoly g+>   where+>     g (Nat n) = f n+>     g Inf     = evalPanic "vFinPoly" ["Expected finite numeric type"]+++Environments+------------++An evaluation environment keeps track of the values of term variables+and type variables that are in scope at any point.++> data Env = Env+>   { envVars       :: !(Map Name Value)+>   , envTypes      :: !(Map TVar (Either Nat' TValue))+>   }+>+> instance Monoid Env where+>   mempty = Env+>     { envVars  = Map.empty+>     , envTypes = Map.empty+>     }+>   mappend l r = Env+>     { envVars  = Map.union (envVars  l) (envVars  r)+>     , envTypes = Map.union (envTypes l) (envTypes r)+>     }+>+> -- | Bind a variable in the evaluation environment.+> bindVar :: (Name, Value) -> Env -> Env+> bindVar (n, val) env = env { envVars = Map.insert n val (envVars env) }+>+> -- | Bind a type variable of kind # or *.+> bindType :: TVar -> Either Nat' TValue -> Env -> Env+> bindType p ty env = env { envTypes = Map.insert p ty (envTypes env) }+++Evaluation+==========++The meaning *M*(`expr`) of a Cryptol expression `expr` is defined by+recursion over its structure. For an expression that contains free+variables, the meaning also depends on the environment `env`, which+assigns values to those variables.++> evalExpr :: Env     -- ^ Evaluation environment+>          -> Expr    -- ^ Expression to evaluate+>          -> Value+> evalExpr env expr =+>   case expr of+>+>     EList es _ty  -> VList [ evalExpr env e | e <- es ]+>     ETuple es     -> VTuple [ evalExpr env e | e <- es ]+>     ERec fields   -> VRecord [ (f, evalExpr env e) | (f, e) <- fields ]+>     ESel e sel    -> evalSel (evalExpr env e) sel+>+>     EIf c t f ->+>       condValue (fromVBit (evalExpr env c)) (evalExpr env t) (evalExpr env f)+>+>     EComp _n _ty e branches ->+>       evalComp env e branches+>+>     EVar n ->+>       case Map.lookup n (envVars env) of+>         Just val -> val+>         Nothing  -> evalPanic "evalExpr" ["var `" ++ show (pp n) ++ "` is not defined" ]+>+>     ETAbs tv b ->+>       case tpKind tv of+>         KType -> VPoly    $ \ty -> evalExpr (bindType (tpVar tv) (Right ty) env) b+>         KNum  -> VNumPoly $ \n  -> evalExpr (bindType (tpVar tv) (Left n) env) b+>         k     -> evalPanic "evalExpr" ["Invalid kind on type abstraction", show k]+>+>     ETApp e ty ->+>       case evalExpr env e of+>         VPoly f     -> f $! (evalValType (envTypes env) ty)+>         VNumPoly f  -> f $! (evalNumType (envTypes env) ty)+>         _           -> evalPanic "evalExpr" ["Expected a polymorphic value"]+>+>     EApp e1 e2     -> fromVFun (evalExpr env e1) (evalExpr env e2)+>     EAbs n _ty b   -> VFun (\v -> evalExpr (bindVar (n, v) env) b)+>     EProofAbs _ e  -> evalExpr env e+>     EProofApp e    -> evalExpr env e+>     EWhere e dgs   -> evalExpr (foldl evalDeclGroup env dgs) e+++Selectors+---------++Apply the the given selector form to the given value. This function+pushes tuple and record selections pointwise down into sequences and+functions.++> evalSel :: Value -> Selector -> Value+> evalSel val sel =+>   case sel of+>     TupleSel n _  -> tupleSel n val+>     RecordSel n _ -> recordSel n val+>     ListSel n _  -> listSel n val+>   where+>     tupleSel n v =+>       case v of+>         VTuple vs   -> vs !! n+>         VList vs    -> VList (map (tupleSel n) vs)+>         VFun f      -> VFun (\x -> tupleSel n (f x))+>         _           -> evalPanic "evalSel"+>                        ["Unexpected value in tuple selection."]+>     recordSel n v =+>       case v of+>         VRecord _   -> lookupRecord n v+>         VList vs    -> VList (map (recordSel n) vs)+>         VFun f      -> VFun (\x -> recordSel n (f x))+>         _           -> evalPanic "evalSel"+>                        ["Unexpected value in record selection."]+>     listSel n v =+>       case v of+>         VList vs    -> vs !! n+>         _           -> evalPanic "evalSel"+>                        ["Unexpected value in list selection."]+++Conditionals+------------++We evaluate conditionals on larger types by pushing the conditionals+down to the individual bits.++> condValue :: Either EvalError Bool -> Value -> Value -> Value+> condValue c l r =+>   case l of+>     VBit b     -> VBit (condBit c b (fromVBit r))+>     VList vs   -> VList (zipWith (condValue c) vs (fromVList r))+>     VTuple vs  -> VTuple (zipWith (condValue c) vs (fromVTuple r))+>     VRecord fs -> VRecord [ (f, condValue c v (lookupRecord f r)) | (f, v) <- fs ]+>     VFun f     -> VFun (\v -> condValue c (f v) (fromVFun r v))+>     VPoly f    -> VPoly (\t -> condValue c (f t) (fromVPoly r t))+>     VNumPoly f -> VNumPoly (\n -> condValue c (f n) (fromVNumPoly r n))++Conditionals are explicitly lazy: Run-time errors in an untaken branch+are ignored.++> condBit :: Either e Bool -> Either e Bool -> Either e Bool -> Either e Bool+> condBit (Left e)  _ _ = Left e+> condBit (Right b) x y = if b then x else y+++List Comprehensions+-------------------++Cryptol list comprehensions consist of one or more parallel branches;+each branch has one or more matches that bind values to variables.++The result of evaluating a match in an initial environment is a list+of extended environments. Each new environment binds the same single+variable to a different element of the match's list.++> evalMatch :: Env -> Match -> [Env]+> evalMatch env m =+>   case m of+>     Let d ->+>       [ bindVar (evalDecl env d) env ]+>     From n _l _ty expr ->+>       [ bindVar (n, v) env | v <- fromVList (evalExpr env expr) ]++The result of of evaluating a branch in an initial environment is a+list of extended environments, each of which extends the initial+environment with the same set of new variables. The length of the list+is equal to the product of the lengths of the lists in the matches.++> evalBranch :: Env -> [Match] -> [Env]+> evalBranch env [] = [env]+> evalBranch env (match : matches) =+>   [ env'' | env' <- evalMatch env match+>           , env'' <- evalBranch env' matches ]++The head expression of the comprehension can refer to any variable+bound in any of the parallel branches. So to evaluate the+comprehension, we zip and merge together the lists of extended+environments from each branch. The head expression is then evaluated+separately in each merged environment. The length of the resulting+list is equal to the mininum length over all parallel branches.++> evalComp :: Env         -- ^ Starting evaluation environment+>          -> Expr        -- ^ Head expression of the comprehension+>          -> [[Match]]   -- ^ List of parallel comprehension branches+>          -> Value+> evalComp env expr branches = VList [ evalExpr e expr | e <- envs ]+>   where+>     -- Generate a new environment for each iteration of each+>     -- parallel branch.+>     benvs :: [[Env]]+>     benvs = map (evalBranch env) branches+>+>     -- Zip together the lists of environments from each branch,+>     -- producing a list of merged environments. Longer branches get+>     -- truncated to the length of the shortest branch.+>     envs :: [Env]+>     envs = foldr1 (zipWith mappend) benvs+++Declarations+------------++Function `evalDeclGroup` extends the given evaluation environment with+the result of evaluating the given declaration group. In the case of a+recursive declaration group, we tie the recursive knot by evaluating+each declaration in the extended environment `env'` that includes all+the new bindings.++> evalDeclGroup :: Env -> DeclGroup -> Env+> evalDeclGroup env dg = do+>   case dg of+>     NonRecursive d ->+>       bindVar (evalDecl env d) env+>     Recursive ds ->+>       let env' = foldr bindVar env bindings+>           bindings = map (evalDeclRecursive env') ds+>       in env'++To evaluate a declaration in a non-recursive context, we need only+evaluate the expression on the right-hand side or look up the+appropriate primitive.++> evalDecl :: Env -> Decl -> (Name, Value)+> evalDecl env d =+>   case dDefinition d of+>     DPrim   -> (dName d, evalPrim (dName d))+>     DExpr e -> (dName d, evalExpr env e)++To evaluate a declaration in a recursive context, we must perform a+type-directed copy to build the spine of the value. This ensures that+the definedness invariant for type `Value` will be maintained.++> evalDeclRecursive :: Env -> Decl -> (Name, Value)+> evalDeclRecursive env d =+>   case dDefinition d of+>     DPrim   -> (dName d, evalPrim (dName d))+>     DExpr e -> (dName d, copyBySchema env (dSignature d) (evalExpr env e))+++Primitives+==========++To evaluate a primitive, we look up its implementation by name in a table.++> evalPrim :: Name -> Value+> evalPrim n+>   | Just i <- asPrim n, Just v <- Map.lookup i primTable = v+>   | otherwise = evalPanic "evalPrim" ["Unimplemented primitive", show n]++Cryptol primitives fall into several groups:++* Logic: `&&`, `||`, `^`, `complement`, `zero`, `True`, `False`++* Arithmetic: `+`, `-`, `*`, `/`, `%`, `^^`, `lg2`, `negate`, `demote`++* Comparison: `<`, `>`, `<=`, `>=`, `==`, `!=`++* Sequences: `#`, `join`, `split`, `splitAt`, `reverse`, `transpose`++* Shifting: `<<`, `>>`, `<<<`, `>>>`++* Indexing: `@`, `@@`, `!`, `!!`, `update`, `updateEnd`++* Enumerations: `fromThen`, `fromTo`, `fromThenTo`, `infFrom`, `infFromThen`++* Polynomials: `pmult`, `pdiv`, `pmod`++* Miscellaneous: `error`, `random`, `trace`++> primTable :: Map Ident Value+> primTable = Map.fromList $ map (\(n, v) -> (mkIdent (T.pack n), v))+>+>   -- Logic (bitwise):+>   [ ("&&"         , binary (logicBinary (&&)))+>   , ("||"         , binary (logicBinary (||)))+>   , ("^"          , binary (logicBinary (/=)))+>   , ("complement" , unary  (logicUnary not))+>   , ("zero"       , VPoly (logicNullary (Right False)))+>   , ("True"       , VBit (Right True))+>   , ("False"      , VBit (Right False))+>+>   -- Arithmetic:+>   , ("+"          , binary (arithBinary (\_ x y -> Right (x + y))))+>   , ("-"          , binary (arithBinary (\_ x y -> Right (x - y))))+>   , ("*"          , binary (arithBinary (\_ x y -> Right (x * y))))+>   , ("/"          , binary (arithBinary (const divWrap)))+>   , ("%"          , binary (arithBinary (const modWrap)))+>   , ("^^"         , binary (arithBinary (\_ x y -> Right (x ^ y))))+>   , ("lg2"        , unary  (arithUnary (const lg2)))+>   , ("negate"     , unary  (arithUnary (const negate)))+>   , ("demote"     , vFinPoly $ \val ->+>                     vFinPoly $ \bits ->+>                     vWordValue bits val)+>+>   -- Comparison:+>   , ("<"          , binary (cmpOrder (\o -> o == LT)))+>   , (">"          , binary (cmpOrder (\o -> o == GT)))+>   , ("<="         , binary (cmpOrder (\o -> o /= GT)))+>   , (">="         , binary (cmpOrder (\o -> o /= LT)))+>   , ("=="         , binary (cmpOrder (\o -> o == EQ)))+>   , ("!="         , binary (cmpOrder (\o -> o /= EQ)))+>+>   -- Sequences:+>   , ("#"          , VNumPoly $ \_front ->+>                     VNumPoly $ \_back  ->+>                     VPoly $ \_elty  ->+>                     VFun $ \l ->+>                     VFun $ \r ->+>                     VList (fromVList l ++ fromVList r))+>+>   , ("join"       , VNumPoly $ \_parts ->+>                     VNumPoly $ \each  ->+>                     VPoly $ \_a ->+>                     VFun $ \xss ->+>                       case each of+>                         -- special case when the inner sequences are of length 0+>                         Nat 0 -> VList []+>                         _ -> VList (concat (map fromVList (fromVList xss))))+>+>   , ("split"      , VNumPoly $ \parts ->+>                     vFinPoly $ \each  ->+>                     VPoly $ \_a ->+>                     VFun $ \val ->+>                     VList (splitV parts each (fromVList val)))+>+>   , ("splitAt"    , vFinPoly $ \front ->+>                     VNumPoly $ \_back ->+>                     VPoly $ \_a ->+>                     VFun $ \v ->+>                     let (xs, ys) = genericSplitAt front (fromVList v)+>                     in VTuple [VList xs, VList ys])+>+>   , ("reverse"    , VNumPoly $ \_a ->+>                     VPoly $ \_b ->+>                     VFun $ \v ->+>                     VList (reverse (fromVList v)))+>+>   , ("transpose"  , VNumPoly $ \_a ->+>                     VNumPoly $ \b ->+>                     VPoly $ \_c ->+>                     VFun $ \v ->+>                     VList (map VList (transposeV b (map fromVList (fromVList v)))))+>+>   -- Shifting:+>   , ("<<"         , shiftV shiftLV)+>   , (">>"         , shiftV shiftRV)+>   , ("<<<"        , rotateV rotateLV)+>   , (">>>"        , rotateV rotateRV)+>+>   -- Indexing:+>   , ("@"          , indexPrimOne  indexFront)+>   , ("@@"         , indexPrimMany indexFront)+>   , ("!"          , indexPrimOne  indexBack)+>   , ("!!"         , indexPrimMany indexBack)+>   , ("update"     , updatePrim updateFront)+>   , ("updateEnd"  , updatePrim updateBack)+>+>   -- Enumerations:+>   , ("fromThen"   , vFinPoly $ \first ->+>                     vFinPoly $ \next  ->+>                     vFinPoly $ \bits  ->+>                     vFinPoly $ \len   ->+>                     VList (map (vWordValue bits) (genericTake len [first, next ..])))+>+>   , ("fromTo"     , vFinPoly $ \first ->+>                     vFinPoly $ \lst   ->+>                     vFinPoly $ \bits  ->+>                     VList (map (vWordValue bits) [first .. lst]))+>+>   , ("fromThenTo" , vFinPoly $ \first ->+>                     vFinPoly $ \next  ->+>                     vFinPoly $ \_lst  ->+>                     vFinPoly $ \bits  ->+>                     vFinPoly $ \len   ->+>                     VList (map (vWordValue bits) (genericTake len [first, next ..])))+>+>   , ("infFrom"    , vFinPoly $ \bits ->+>                     VFun $ \first ->+>                     copyByTValue (TVStream (TVSeq bits TVBit)) $+>                     case fromVWord first of+>                       Left e -> VList (repeat (vWordError bits e))+>                       Right i -> VList (map (vWordValue bits) [i ..]))+>+>   , ("infFromThen", vFinPoly $ \bits ->+>                     VFun $ \first ->+>                     VFun $ \next ->+>                     copyByTValue (TVStream (TVSeq bits TVBit)) $+>                     case fromVWord first of+>                       Left e -> VList (repeat (vWordError bits e))+>                       Right i ->+>                         case fromVWord next of+>                           Left e -> VList (repeat (vWordError bits e))+>                           Right j -> VList (map (vWordValue bits) [i, j ..]))+>+>   -- Polynomials:+>   , ("pmult"      , let mul res _  _  0 = res+>                         mul res bs as n = mul (if even as then res else xor res bs)+>                                           (bs `shiftL` 1) (as `shiftR` 1) (n-1)+>                     in vFinPoly $ \a ->+>                        vFinPoly $ \b ->+>                        VFun $ \x ->+>                        VFun $ \y ->+>                        vWord (1 + a + b) $+>                        case fromVWord x of+>                          Left e -> Left e+>                          Right i ->+>                            case fromVWord y of+>                              Left e -> Left e+>                              Right j -> Right (mul 0 i j (1+b)))+>   , ("pdiv"       , vFinPoly $ \a ->+>                     vFinPoly $ \b ->+>                     VFun $ \x ->+>                     VFun $ \y ->+>                     vWord a $+>                     case fromVWord x of+>                       Left e -> Left e+>                       Right i ->+>                         case fromVWord y of+>                           Left e -> Left e+>                           Right j+>                             | j == 0 -> Left DivideByZero+>                             | otherwise ->+>                               Right (fst (divModPoly i (fromInteger a) j (fromInteger b))))+>+>   , ("pmod"       , vFinPoly $ \a ->+>                     vFinPoly $ \b ->+>                     VFun $ \x ->+>                     VFun $ \y ->+>                     vWord b $+>                     case fromVWord x of+>                       Left e -> Left e+>                       Right i ->+>                         case fromVWord y of+>                           Left e -> Left e+>                           Right j+>                             | j == 0 -> Left DivideByZero+>                             | otherwise ->+>                               Right (snd (divModPoly i (fromInteger a) j (fromInteger b + 1))))+>+>   -- Miscellaneous:+>   , ("error"      , VPoly $ \a ->+>                     VNumPoly $ \_ ->+>                     VFun $ \_s -> logicNullary (Left (UserError "error")) a)+>                     -- TODO: obtain error string from argument s+>+>   , ("random"     , VPoly $ \a ->+>                     VFun $ \_seed ->+>                     logicNullary (Left (UserError "random: unimplemented")) a)+>+>   , ("trace"      , VNumPoly $ \_n ->+>                     VPoly $ \_a ->+>                     VPoly $ \_b ->+>                     VFun $ \_s ->+>                     VFun $ \_x ->+>                     VFun $ \y -> y)+>   ]+>+> unary :: (TValue -> Value -> Value) -> Value+> unary f = VPoly $ \ty -> VFun $ \x -> f ty x+>+> binary :: (TValue -> Value -> Value -> Value) -> Value+> binary f = VPoly $ \ty -> VFun $ \x -> VFun $ \y -> f ty x y+++Word operations+---------------++Many Cryptol primitives take numeric arguments in the form of+bitvectors. For such operations, any output bit that depends on the+numeric value is strict in *all* bits of the numeric argument. This is+implemented in function `fromVWord`, which converts a value from a+big-endian binary format to an integer. The result is an evaluation+error if any of the input bits contain an evaluation error.++> fromVWord :: Value -> Either EvalError Integer+> fromVWord v = fmap bitsToInteger (mapM fromVBit (fromVList v))+>+> -- | Convert a list of booleans in big-endian format to an integer.+> bitsToInteger :: [Bool] -> Integer+> bitsToInteger bs = foldl f 0 bs+>   where f x b = if b then 2 * x + 1 else 2 * x++Functions `vWord`, `vWordValue`, and `vWordError` convert from+integers back to the big-endian bitvector representation. If an+integer-producing function raises a run-time exception, then the+output bitvector will contain the exception in all bit positions.++> -- | Convert an integer to big-endian binary value of the specified width.+> vWordValue :: Integer -> Integer -> Value+> vWordValue w x = VList (map (VBit . Right) (integerToBits w x))+>+> -- | Convert an integer to a big-endian format of the specified width.+> integerToBits :: Integer -> Integer -> [Bool]+> integerToBits w x = go [] w x+>   where go bs 0 _ = bs+>         go bs n a = go (odd a : bs) (n - 1) $! (a `div` 2)+>+> -- | Create a run-time error value of bitvector type.+> vWordError :: Integer -> EvalError -> Value+> vWordError w e = VList (genericReplicate w (VBit (Left e)))+>+> vWord :: Integer -> Either EvalError Integer -> Value+> vWord w e = VList [ VBit (fmap (test i) e) | i <- [w-1, w-2 .. 0] ]+>   where test i x = testBit x (fromInteger i)+++Logic+-----++Bitwise logic primitives are defined by recursion over the type+structure. On type `Bit`, we use `fmap` and `liftA2` to make these+operations strict in all arguments. For example, `True || error "foo"`+does not evaluate to `True`, but yields a run-time exception. On other+types, run-time exceptions on input bits only affect the output bits+at the same positions.++> logicNullary :: Either EvalError Bool -> TValue -> Value+> logicNullary b = go+>   where+>     go TVBit          = VBit b+>     go (TVSeq n ety)  = VList (genericReplicate n (go ety))+>     go (TVStream ety) = VList (repeat (go ety))+>     go (TVTuple tys)  = VTuple (map go tys)+>     go (TVRec fields) = VRecord [ (f, go fty) | (f, fty) <- fields ]+>     go (TVFun _ bty)  = VFun (\_ -> go bty)+>+> logicUnary :: (Bool -> Bool) -> TValue -> Value -> Value+> logicUnary op = go+>   where+>     go :: TValue -> Value -> Value+>     go ty val =+>       case ty of+>         TVBit        -> VBit (fmap op (fromVBit val))+>         TVSeq _w ety -> VList (map (go ety) (fromVList val))+>         TVStream ety -> VList (map (go ety) (fromVList val))+>         TVTuple etys -> VTuple (zipWith go etys (fromVTuple val))+>         TVRec fields -> VRecord [ (f, go fty (lookupRecord f val)) | (f, fty) <- fields ]+>         TVFun _ bty  -> VFun (\v -> go bty (fromVFun val v))+>+> logicBinary :: (Bool -> Bool -> Bool) -> TValue -> Value -> Value -> Value+> logicBinary op = go+>   where+>     go :: TValue -> Value -> Value -> Value+>     go ty l r =+>       case ty of+>         TVBit        -> VBit (liftA2 op (fromVBit l) (fromVBit r))+>         TVSeq _w ety -> VList (zipWith (go ety) (fromVList l) (fromVList r))+>         TVStream ety -> VList (zipWith (go ety) (fromVList l) (fromVList r))+>         TVTuple etys -> VTuple (zipWith3 go etys (fromVTuple l) (fromVTuple r))+>         TVRec fields -> VRecord [ (f, go fty (lookupRecord f l) (lookupRecord f r))+>                                 | (f, fty) <- fields ]+>         TVFun _ bty  -> VFun (\v -> go bty (fromVFun l v) (fromVFun r v))+++Arithmetic+----------++Arithmetic primitives may be applied to any type that is made up of+finite bitvectors. On type `[n]`, arithmetic operators are strict in+all input bits, as indicated by the definition of `fromVWord`. For+example, `[error "foo", True] * 2` does not evaluate to `[True,+False]`, but to `[error "foo", error "foo"]`.++> arithUnary :: (Integer -> Integer -> Integer)+>            -> TValue -> Value -> Value+> arithUnary op = go+>   where+>     go :: TValue -> Value -> Value+>     go ty val =+>       case ty of+>         TVBit ->+>           evalPanic "arithUnary" ["Bit not in class Arith"]+>         TVSeq w a+>           | isTBit a  -> vWord w (op w <$> fromVWord val)+>           | otherwise -> VList (map (go a) (fromVList val))+>         TVStream a ->+>           VList (map (go a) (fromVList val))+>         TVFun _ ety ->+>           VFun (\x -> go ety (fromVFun val x))+>         TVTuple tys ->+>           VTuple (zipWith go tys (fromVTuple val))+>         TVRec fs ->+>           VRecord [ (f, go fty (lookupRecord f val)) | (f, fty) <- fs ]+>+> arithBinary :: (Integer -> Integer -> Integer -> Either EvalError Integer)+>             -> TValue -> Value -> Value -> Value+> arithBinary op = go+>   where+>     go :: TValue -> Value -> Value -> Value+>     go ty l r =+>       case ty of+>         TVBit ->+>           evalPanic "arithBinary" ["Bit not in class Arith"]+>         TVSeq w a+>           | isTBit a  -> vWord w $+>                          case fromVWord l of+>                            Left e -> Left e+>                            Right i ->+>                              case fromVWord r of+>                                Left e -> Left e+>                                Right j -> op w i j+>           | otherwise -> VList (zipWith (go a) (fromVList l) (fromVList r))+>         TVStream a ->+>           VList (zipWith (go a) (fromVList l) (fromVList r))+>         TVFun _ ety ->+>           VFun (\x -> go ety (fromVFun l x) (fromVFun r x))+>         TVTuple tys ->+>           VTuple (zipWith3 go tys (fromVTuple l) (fromVTuple r))+>         TVRec fs ->+>           VRecord [ (f, go fty (lookupRecord f l) (lookupRecord f r)) | (f, fty) <- fs ]+>+> divWrap :: Integer -> Integer -> Either EvalError Integer+> divWrap _ 0 = Left DivideByZero+> divWrap x y = Right (x `div` y)+>+> modWrap :: Integer -> Integer -> Either EvalError Integer+> modWrap _ 0 = Left DivideByZero+> modWrap x y = Right (x `mod` y)+++Comparison+----------++Comparison primitives may be applied to any type that contains a+finite number of bits. All such types are compared using a+lexicographic ordering on bits, where `False` < `True`. Lists and+tuples are compared left-to-right, and record fields are compared in+alphabetical order.++Comparisons on type `Bit` are strict in both arguments. Comparisons on+larger types have short-circuiting behavior: A comparison involving an+error/undefined element will only yield an error if all corresponding+bits to the *left* of that position are equal.++> -- | Process two elements based on their lexicographic ordering.+> cmpOrder :: (Ordering -> Bool) -> TValue -> Value -> Value -> Value+> cmpOrder p ty l r = VBit (fmap p (lexCompare ty l r))+>+> -- | Lexicographic ordering on two values.+> lexCompare :: TValue -> Value -> Value -> Either EvalError Ordering+> lexCompare ty l r =+>   case ty of+>     TVBit ->+>       compare <$> fromVBit l <*> fromVBit r+>     TVSeq _w ety ->+>       lexList (zipWith (lexCompare ety) (fromVList l) (fromVList r))+>     TVStream _ ->+>       evalPanic "lexCompare" ["invalid type"]+>     TVFun _ _ ->+>       evalPanic "lexCompare" ["invalid type"]+>     TVTuple etys ->+>       lexList (zipWith3 lexCompare etys (fromVTuple l) (fromVTuple r))+>     TVRec fields ->+>       let tys    = map snd (sortBy (comparing fst) fields)+>           ls     = map snd (sortBy (comparing fst) (fromVRecord l))+>           rs     = map snd (sortBy (comparing fst) (fromVRecord r))+>        in lexList (zipWith3 lexCompare tys ls rs)+>+> lexList :: [Either EvalError Ordering] -> Either EvalError Ordering+> lexList [] = Right EQ+> lexList (e : es) =+>   case e of+>     Left err -> Left err+>     Right LT -> Right LT+>     Right EQ -> lexList es+>     Right GT -> Right GT+++Sequences+---------++> -- | Split a list into 'w' pieces, each of length 'k'.+> splitV :: Nat' -> Integer -> [Value] -> [Value]+> splitV w k xs =+>   case w of+>     Nat 0 -> []+>     Nat n -> VList ys : splitV (Nat (n - 1)) k zs+>     Inf   -> VList ys : splitV Inf k zs+>   where+>     (ys, zs) = genericSplitAt k xs+>+> -- | Transpose a list of length-'w' lists into 'w' lists.+> transposeV :: Nat' -> [[Value]] -> [[Value]]+> transposeV w xss =+>   case w of+>     Nat 0 -> []+>     Nat n -> heads : transposeV (Nat (n - 1)) tails+>     Inf   -> heads : transposeV Inf tails+>   where+>     (heads, tails) = dest xss+>+>     -- Split a list of non-empty lists into+>     -- a list of heads and a list of tails+>     dest :: [[Value]] -> ([Value], [[Value]])+>     dest [] = ([], [])+>     dest ([] : _) = evalPanic "transposeV" ["Expected non-empty list"]+>     dest ((y : ys) : yss) = (y : zs, ys : zss)+>       where (zs, zss) = dest yss+++Shifting+--------++Shift and rotate operations are strict in all bits of the shift/rotate+amount, but as lazy as possible in the list values.++> shiftV :: (Nat' -> Value -> [Value] -> Integer -> [Value]) -> Value+> shiftV op =+>   VNumPoly $ \a ->+>   VNumPoly $ \_b ->+>   VPoly $ \c ->+>   VFun $ \v ->+>   VFun $ \x ->+>   copyByTValue (tvSeq a c) $+>   case fromVWord x of+>     Left e -> logicNullary (Left e) (tvSeq a c)+>     Right i -> VList (op a (logicNullary (Right False) c) (fromVList v) i)+>+> shiftLV :: Nat' -> Value -> [Value] -> Integer -> [Value]+> shiftLV w z vs i =+>   case w of+>     Nat n -> genericDrop (min n i) vs ++ genericReplicate (min n i) z+>     Inf   -> genericDrop i vs+>+> shiftRV :: Nat' -> Value -> [Value] -> Integer -> [Value]+> shiftRV w z vs i =+>   case w of+>     Nat n -> genericReplicate (min n i) z ++ genericTake (n - min n i) vs+>     Inf   -> genericReplicate i z ++ vs+>+> rotateV :: (Integer -> [Value] -> Integer -> [Value]) -> Value+> rotateV op =+>   vFinPoly $ \a ->+>   VNumPoly $ \_b ->+>   VPoly $ \c ->+>   VFun $ \v ->+>   VFun $ \x ->+>   copyByTValue (TVSeq a c) $+>   case fromVWord x of+>     Left e -> VList (genericReplicate a (logicNullary (Left e) c))+>     Right i -> VList (op a (fromVList v) i)+>+> rotateLV :: Integer -> [Value] -> Integer -> [Value]+> rotateLV 0 vs _ = vs+> rotateLV w vs i = ys ++ xs+>   where (xs, ys) = genericSplitAt (i `mod` w) vs+>+> rotateRV :: Integer -> [Value] -> Integer -> [Value]+> rotateRV 0 vs _ = vs+> rotateRV w vs i = ys ++ xs+>   where (xs, ys) = genericSplitAt ((w - i) `mod` w) vs+++Indexing+--------++Indexing operations are strict in all index bits, but as lazy as+possible in the list values. An index greater than or equal to the+length of the list produces a run-time error.++> -- | Indexing operations that return one element.+> indexPrimOne :: (Nat' -> TValue -> [Value] -> Integer -> Value) -> Value+> indexPrimOne op =+>   VNumPoly $ \n ->+>   VPoly $ \a ->+>   VNumPoly $ \_w ->+>   VFun $ \l ->+>   VFun $ \r ->+>   copyByTValue a $+>   case fromVWord r of+>     Left e -> logicNullary (Left e) a+>     Right i -> op n a (fromVList l) i+>+> -- | Indexing operations that return many elements.+> indexPrimMany :: (Nat' -> TValue -> [Value] -> Integer -> Value) -> Value+> indexPrimMany op =+>   VNumPoly $ \n ->+>   VPoly    $ \a ->+>   VNumPoly $ \_m ->+>   VNumPoly $ \_w ->+>   VFun $ \l ->+>   VFun $ \r ->+>   VList [ copyByTValue a $+>           case fromVWord y of+>              Left e -> logicNullary (Left e) a+>              Right i -> op n a xs i+>         | let xs = fromVList l, y <- fromVList r ]+>+> indexFront :: Nat' -> TValue -> [Value] -> Integer -> Value+> indexFront w a vs ix =+>   case w of+>     Nat n | n <= ix -> logicNullary (Left (InvalidIndex ix)) a+>     _               -> genericIndex vs ix+>+> indexBack :: Nat' -> TValue -> [Value] -> Integer -> Value+> indexBack w a vs ix =+>   case w of+>     Nat n | n > ix    -> genericIndex vs (n - ix - 1)+>           | otherwise -> logicNullary (Left (InvalidIndex ix)) a+>     Inf               -> evalPanic "indexBack" ["unexpected infinite sequence"]+>+> updatePrim :: (Nat' -> [Value] -> Integer -> Value -> [Value]) -> Value+> updatePrim op =+>   VNumPoly $ \len ->+>   VPoly $ \eltTy ->+>   VNumPoly $ \_idxLen ->+>   VFun $ \xs ->+>   VFun $ \idx ->+>   VFun $ \val ->+>   copyByTValue (tvSeq len eltTy) $+>   case fromVWord idx of+>     Left e -> logicNullary (Left e) (tvSeq len eltTy)+>     Right i+>       | Nat i < len -> VList (op len (fromVList xs) i val)+>       | otherwise   -> logicNullary (Left (InvalidIndex i)) (tvSeq len eltTy)+>+> updateFront :: Nat' -> [Value] -> Integer -> Value -> [Value]+> updateFront _ vs i x = updateAt vs i x+>+> updateBack :: Nat' -> [Value] -> Integer -> Value -> [Value]+> updateBack Inf _vs _i _x = evalPanic "Unexpected infinite sequence in updateEnd" []+> updateBack (Nat n) vs i x = updateAt vs (n - i - 1) x+>+> updateAt :: [a] -> Integer -> a -> [a]+> updateAt []       _ _ = []+> updateAt (_ : xs) 0 y = y : xs+> updateAt (x : xs) i y = x : updateAt xs (i - 1) y+++Error Handling+--------------++The `evalPanic` function is only called if an internal data invariant+is violated, such as an expression that is not well-typed. Panics+should (hopefully) never occur in practice; a panic message indicates+a bug in Cryptol.++> evalPanic :: String -> [String] -> a+> evalPanic cxt = panic ("[Reference Evaluator]" ++ cxt)++Pretty Printing+---------------++> ppValue :: Value -> Doc+> ppValue val =+>   case val of+>     VBit b     -> text (either show show b)+>     VList vs   -> brackets (fsep (punctuate comma (map ppValue vs)))+>     VTuple vs  -> parens (sep (punctuate comma (map ppValue vs)))+>     VRecord fs -> braces (sep (punctuate comma (map ppField fs)))+>       where ppField (f,r) = pp f <+> char '=' <+> ppValue r+>     VFun _     -> text "<function>"+>     VPoly _    -> text "<polymorphic value>"+>     VNumPoly _ -> text "<polymorphic value>"++Module Command+--------------++This module implements the core functionality of the `:eval+<expression>` command for the Cryptol REPL, which prints the result of+running the reference evaluator on an expression.++> evaluate :: Expr -> M.ModuleCmd Value+> evaluate expr modEnv = return (Right (evalExpr env expr, modEnv), [])+>   where+>     extDgs = concatMap mDecls (M.loadedModules modEnv)+>     env = foldl evalDeclGroup mempty extDgs
src/Cryptol/Eval/Type.hs view
@@ -7,26 +7,80 @@ -- Portability :  portable  {-# LANGUAGE Safe, PatternGuards #-}--module Cryptol.Eval.Type (evalType, evalValType, evalNumType, evalTF) where+{-# LANGUAGE DeriveAnyClass #-}+{-# LANGUAGE DeriveGeneric #-}+module Cryptol.Eval.Type where -import Cryptol.Eval.Env-import Cryptol.Eval.Error-import Cryptol.Eval.Value (TValue(..), tvSeq)+import Cryptol.Eval.Monad import Cryptol.TypeCheck.AST+import Cryptol.TypeCheck.PP(pp) import Cryptol.TypeCheck.Solver.InfNat+import Cryptol.Utils.Panic (panic)+import Cryptol.Utils.Ident (Ident)  import Data.Maybe(fromMaybe)+import qualified Data.Map.Strict as Map+import GHC.Generics (Generic)+import Control.DeepSeq +-- | An evaluated type of kind *.+-- These types do not contain type variables, type synonyms, or type functions.+data TValue+  = TVBit                    -- ^ @ Bit @+  | TVSeq Integer TValue     -- ^ @ [n]a @+  | TVStream TValue          -- ^ @ [inf]t @+  | TVTuple [TValue]         -- ^ @ (a, b, c )@+  | TVRec [(Ident, TValue)]  -- ^ @ { x : a, y : b, z : c } @+  | TVFun TValue TValue      -- ^ @ a -> b @+    deriving (Generic, NFData) +-- | Convert a type value back into a regular type+tValTy :: TValue -> Type+tValTy tv =+  case tv of+    TVBit       -> tBit+    TVSeq n t   -> tSeq (tNum n) (tValTy t)+    TVStream t  -> tSeq tInf (tValTy t)+    TVTuple ts  -> tTuple (map tValTy ts)+    TVRec fs    -> tRec [ (f, tValTy t) | (f, t) <- fs ]+    TVFun t1 t2 -> tFun (tValTy t1) (tValTy t2)++instance Show TValue where+  showsPrec p v = showsPrec p (tValTy v)+++-- Utilities -------------------------------------------------------------------++-- | True if the evaluated value is @Bit@+isTBit :: TValue -> Bool+isTBit TVBit = True+isTBit _ = False++-- | Produce a sequence type value+tvSeq :: Nat' -> TValue -> TValue+tvSeq (Nat n) t = TVSeq n t+tvSeq Inf     t = TVStream t++-- | Coerce an extended natural into an integer,+--   for values known to be finite+finNat' :: Nat' -> Integer+finNat' n' =+  case n' of+    Nat x -> x+    Inf   -> panic "Cryptol.Eval.Value.finNat'" [ "Unexpected `inf`" ]++ -- Type Evaluation ------------------------------------------------------------- +type TypeEnv = Map.Map TVar (Either Nat' TValue)++ -- | Evaluation for types (kind * or #).-evalType :: EvalEnv -> Type -> Either Nat' TValue+evalType :: TypeEnv -> Type -> Either Nat' TValue evalType env ty =   case ty of     TVar tv ->-      case lookupType tv env of+      case Map.lookup tv env of         Just v -> v         Nothing -> evalPanic "evalType" ["type variable not bound", show tv] @@ -44,22 +98,26 @@         _ -> evalPanic "evalType" ["not a value type", show ty]     TCon (TF f) ts      -> Left $ evalTF f (map num ts)     TCon (PC p) _       -> evalPanic "evalType" ["invalid predicate symbol", show p]+    TCon (TError _ x) _ -> evalPanic "evalType"+                                ["Lingering typer error", show (pp x)]   where     val = evalValType env     num = evalNumType env  -- | Evaluation for value types (kind *).-evalValType :: EvalEnv -> Type -> TValue+evalValType :: TypeEnv -> Type -> TValue evalValType env ty =   case evalType env ty of     Left _ -> evalPanic "evalValType" ["expected value type, found numeric type"]     Right t -> t -evalNumType :: EvalEnv -> Type -> Nat'+-- | Evaluation for number types (kind #).+evalNumType :: TypeEnv -> Type -> Nat' evalNumType env ty =   case evalType env ty of     Left n -> n     Right _ -> evalPanic "evalValType" ["expected numeric type, found value type"]+  -- | Reduce type functions, raising an exception for undefined values. evalTF :: TFun -> [Nat'] -> Nat'
src/Cryptol/Eval/Value.hs view
@@ -6,118 +6,251 @@ -- Stability   :  provisional -- Portability :  portable -{-# LANGUAGE Safe #-}- {-# LANGUAGE DeriveAnyClass #-} {-# LANGUAGE DeriveFunctor #-} {-# LANGUAGE DeriveGeneric #-}+{-# LANGUAGE DoAndIfThenElse #-}+{-# LANGUAGE FunctionalDependencies #-} {-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE LambdaCase #-} {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE PatternGuards #-}+{-# LANGUAGE Safe #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE TupleSections #-}+{-# LANGUAGE ViewPatterns #-}+ module Cryptol.Eval.Value where +import Data.Bits+import Data.IORef+import qualified Data.Sequence as Seq+import qualified Data.Foldable as Fold+import Data.Map.Strict (Map)+import qualified Data.Map.Strict as Map+import MonadLib+ import qualified Cryptol.Eval.Arch as Arch-import Cryptol.Eval.Error+import Cryptol.Eval.Monad+import Cryptol.Eval.Type+ import Cryptol.TypeCheck.AST import Cryptol.TypeCheck.Solver.InfNat(Nat'(..)) import Cryptol.Utils.Ident (Ident,mkIdent) import Cryptol.Utils.PP import Cryptol.Utils.Panic(panic) -import Control.Monad (guard, zipWithM)-import Data.List(genericTake)-import Data.Bits (setBit,testBit,(.&.),shiftL)+import Data.List(genericLength, genericIndex) import qualified Data.Text as T import Numeric (showIntAtBase)  import GHC.Generics (Generic) import Control.DeepSeq --- Utilities -------------------------------------------------------------------+-- Values ---------------------------------------------------------------------- -isTBit :: TValue -> Bool-isTBit TVBit = True-isTBit _ = False+-- | Concrete bitvector values: width, value+-- Invariant: The value must be within the range 0 .. 2^width-1+data BV = BV !Integer !Integer deriving (Generic, NFData) -isTSeq :: TValue -> Maybe (Nat', TValue)-isTSeq (TVSeq n t) = Just (Nat n, t)-isTSeq (TVStream t) = Just (Inf, t)-isTSeq _ = Nothing+instance Show BV where+  show = show . bvVal -isTFun :: TValue -> Maybe (TValue, TValue)-isTFun (TVFun t1 t2) = Just (t1, t2)-isTFun _ = Nothing+-- | Apply an integer function to the values of bitvectors.+--   This function assumes both bitvectors are the same width.+binBV :: (Integer -> Integer -> Integer) -> BV -> BV -> BV+binBV f (BV w x) (BV _ y) = mkBv w (f x y) -isTTuple :: TValue -> Maybe (Int,[TValue])-isTTuple (TVTuple ts) = Just (length ts, ts)-isTTuple _ = Nothing+-- | Apply an integer function to the values of a bitvector.+--   This function assumes the function will not require masking.+unaryBV :: (Integer -> Integer) -> BV -> BV+unaryBV f (BV w x) = mkBv w $ f x -isTRec :: TValue -> Maybe [(Ident, TValue)]-isTRec (TVRec fs) = Just fs-isTRec _ = Nothing+bvVal :: BV -> Integer+bvVal (BV _w x) = x -tvSeq :: Nat' -> TValue -> TValue-tvSeq (Nat n) t = TVSeq n t-tvSeq Inf     t = TVStream t+-- | Smart constructor for 'BV's that checks for the width limit+mkBv :: Integer -> Integer -> BV+mkBv w i = BV w (mask w i) -finNat' :: Nat' -> Integer-finNat' n' =-  case n' of-    Nat x -> x-    Inf   -> panic "Cryptol.Eval.Value.finNat'" [ "Unexpected `inf`" ]+-- | A sequence map represents a mapping from nonnegative integer indices+--   to values.  These are used to represent both finite and infinite sequences.+data SeqMap b w+  = IndexSeqMap  !(Integer -> Eval (GenValue b w))+  | UpdateSeqMap !(Map Integer (Eval (GenValue b w)))+                 !(Integer -> Eval (GenValue b w)) --- Values ----------------------------------------------------------------------+lookupSeqMap :: SeqMap b w -> Integer -> Eval (GenValue b w)+lookupSeqMap (IndexSeqMap f) i = f i+lookupSeqMap (UpdateSeqMap m f) i =+  case Map.lookup i m of+    Just x  -> x+    Nothing -> f i --- | width, value--- Invariant: The value must be within the range 0 .. 2^width-1-data BV = BV !Integer !Integer deriving (Generic, NFData)+type SeqValMap = SeqMap Bool BV --- | Smart constructor for 'BV's that checks for the width limit-mkBv :: Integer -> Integer -> BV-mkBv w i = BV w (mask w i)+instance NFData (SeqMap b w) where+  rnf x = seq x () +-- | Generate a finite sequence map from a list of values+finiteSeqMap :: [Eval (GenValue b w)] -> SeqMap b w+finiteSeqMap xs =+   UpdateSeqMap+      (Map.fromList (zip [0..] xs))+      invalidIndex++-- | Generate an infinite sequence map from a stream of values+infiniteSeqMap :: [Eval (GenValue b w)] -> Eval (SeqMap b w)+infiniteSeqMap xs =+   -- TODO: use an int-trie?+   memoMap (IndexSeqMap $ \i -> genericIndex xs i)++-- | Create a finite list of length `n` of the values from [0..n-1] in+--   the given the sequence emap.+enumerateSeqMap :: (Integral n) => n -> SeqMap b w -> [Eval (GenValue b w)]+enumerateSeqMap n m = [ lookupSeqMap m i | i <- [0 .. (toInteger n)-1] ]++-- | Create an infinite stream of all the values in a sequence map+streamSeqMap :: SeqMap b w -> [Eval (GenValue b w)]+streamSeqMap m = [ lookupSeqMap m i | i <- [0..] ]++-- | Reverse the order of a finite sequence map+reverseSeqMap :: Integer     -- ^ Size of the sequence map+              -> SeqMap b w+              -> SeqMap b w+reverseSeqMap n vals = IndexSeqMap $ \i -> lookupSeqMap vals (n - 1 - i)++updateSeqMap :: SeqMap b w -> Integer -> Eval (GenValue b w) -> SeqMap b w+updateSeqMap (UpdateSeqMap m sm) i x = UpdateSeqMap (Map.insert i x m) sm+updateSeqMap (IndexSeqMap f) i x = UpdateSeqMap (Map.singleton i x) f++-- | Given a number `n` and a sequence map, return two new sequence maps:+--   the first containing the values from `[0..n-1]` and the next containing+--   the values from `n` onward.+splitSeqMap :: Integer -> SeqMap b w -> (SeqMap b w, SeqMap b w)+splitSeqMap n xs = (hd,tl)+  where+  hd = xs+  tl = IndexSeqMap $ \i -> lookupSeqMap xs (i+n)++-- | Given a sequence map, return a new sequence map that is memoized using+--   a finite map memo table.+memoMap :: SeqMap b w -> Eval (SeqMap b w)+memoMap x = do+  cache <- io $ newIORef $ Map.empty+  return $ IndexSeqMap (memo cache)++  where+  memo cache i = do+    mz <- io (Map.lookup i <$> readIORef cache)+    case mz of+      Just z  -> return z+      Nothing -> doEval cache i++  doEval cache i = do+    v <- lookupSeqMap x i+    io $ modifyIORef' cache (Map.insert i v)+    return v++-- | Apply the given evaluation function pointwise to the two given+--   sequence maps.+zipSeqMap :: (GenValue b w -> GenValue b w -> Eval (GenValue b w))+          -> SeqMap b w+          -> SeqMap b w+          -> Eval (SeqMap b w)+zipSeqMap f x y =+  memoMap (IndexSeqMap $ \i -> join (f <$> lookupSeqMap x i <*> lookupSeqMap y i))++-- | Apply the given function to each value in the given sequence map+mapSeqMap :: (GenValue b w -> Eval (GenValue b w))+          -> SeqMap b w -> Eval (SeqMap b w)+mapSeqMap f x =+  memoMap (IndexSeqMap $ \i -> f =<< lookupSeqMap x i)++-- | For efficency reasons, we handle finite sequences of bits as special cases+--   in the evaluator.  In cases where we know it is safe to do so, we prefer to+--   used a "packed word" representation of bit sequences.  This allows us to rely+--   directly on Integer types (in the concrete evalautor) and SBV's Word types (in+--   the symbolic simulator).+--+--   However, if we cannot be sure all the bits of the sequence+--   will eventually be forced, we must instead rely on an explicit sequence of bits+--   representation.+data WordValue b w+  = WordVal !w                    -- ^ Packed word representation for bit sequences.+  | BitsVal !(Seq.Seq (Eval b))   -- ^ Sequence of thunks representing bits.+ deriving (Generic, NFData)++-- | Force a word value into packed word form+asWordVal :: BitWord b w => WordValue b w -> Eval w+asWordVal (WordVal w)  = return w+asWordVal (BitsVal bs) = packWord <$> sequence (Fold.toList bs)++-- | Force a word value into a sequence of bits+asBitsVal :: BitWord b w => WordValue b w -> Seq.Seq (Eval b)+asBitsVal (WordVal w)  = Seq.fromList $ map ready $ unpackWord w+asBitsVal (BitsVal bs) = bs++-- | Select an individual bit from a word value+indexWordValue :: BitWord b w => WordValue b w -> Integer -> Eval b+indexWordValue (WordVal w)  idx = return $ genericIndex (unpackWord w) idx+indexWordValue (BitsVal bs) idx = Seq.index bs (fromInteger idx)++ -- | Generic value type, parameterized by bit and word types.+--+--   NOTE: we maintain an important invariant regarding sequence types.+--   `VSeq` must never be used for finite sequences of bits.+--   Always use the `VWord` constructor instead!  Infinite sequences of bits+--   are handled by the `VStream` constructor, just as for other types. data GenValue b w-  = VRecord [(Ident, GenValue b w)]     -- @ { .. } @-  | VTuple [GenValue b w]               -- @ ( .. ) @-  | VBit b                              -- @ Bit    @-  | VSeq Bool [GenValue b w]            -- @ [n]a   @-                                        -- The boolean parameter indicates whether or not-                                        -- this is a sequence of bits.-  | VWord w                             -- @ [n]Bit @-  | VStream [GenValue b w]              -- @ [inf]a @-  | VFun (GenValue b w -> GenValue b w) -- functions-  | VPoly (TValue -> GenValue b w)      -- polymorphic values (kind *)-  | VNumPoly (Nat' -> GenValue b w)     -- polymorphic values (kind #)-  deriving (Generic, NFData)+  = VRecord ![(Ident, Eval (GenValue b w))] -- ^ @ { .. } @+  | VTuple ![Eval (GenValue b w)]           -- ^ @ ( .. ) @+  | VBit !b                                 -- ^ @ Bit    @+  | VSeq !Integer !(SeqMap b w)             -- ^ @ [n]a   @+                                            --   Invariant: VSeq is never a sequence of bits+  | VWord !Integer !(Eval (WordValue b w))  -- ^ @ [n]Bit @+  | VStream !(SeqMap b w)                   -- ^ @ [inf]a @+  | VFun (Eval (GenValue b w) -> Eval (GenValue b w)) -- ^ functions+  | VPoly (TValue -> Eval (GenValue b w))   -- ^ polymorphic values (kind *)+  | VNumPoly (Nat' -> Eval (GenValue b w))  -- ^ polymorphic values (kind #)+ deriving (Generic, NFData) -type Value = GenValue Bool BV --- | An evaluated type of kind *.--- These types do not contain type variables, type synonyms, or type functions.-data TValue-  = TVBit-  | TVSeq Integer TValue-  | TVStream TValue -- ^ [inf]t-  | TVTuple [TValue]-  | TVRec [(Ident, TValue)]-  | TVFun TValue TValue-    deriving (Generic, NFData)+-- | Force the evaluation of a word value+forceWordValue :: WordValue b w -> Eval ()+forceWordValue (WordVal _w)  = return ()+forceWordValue (BitsVal bs) = mapM_ (\b -> const () <$> b) bs -tValTy :: TValue -> Type-tValTy tv =-  case tv of-    TVBit       -> tBit-    TVSeq n t   -> tSeq (tNum n) (tValTy t)-    TVStream t  -> tSeq tInf (tValTy t)-    TVTuple ts  -> tTuple (map tValTy ts)-    TVRec fs    -> tRec [ (f, tValTy t) | (f, t) <- fs ]-    TVFun t1 t2 -> tFun (tValTy t1) (tValTy t2)+-- | Force the evaluation of a value+forceValue :: GenValue b w -> Eval ()+forceValue v = case v of+  VRecord fs  -> mapM_ (\x -> forceValue =<< snd x) fs+  VTuple xs   -> mapM_ (forceValue =<<) xs+  VSeq n xs   -> mapM_ (forceValue =<<) (enumerateSeqMap n xs)+  VBit _b     -> return ()+  VWord _ wv  -> forceWordValue =<< wv+  VStream _   -> return ()+  VFun _      -> return ()+  VPoly _     -> return ()+  VNumPoly _  -> return () -instance Show TValue where-  showsPrec p v = showsPrec p (tValTy v) +instance (Show b, Show w) => Show (GenValue b w) where+  show v = case v of+    VRecord fs -> "record:" ++ show (map fst fs)+    VTuple xs  -> "tuple:" ++ show (length xs)+    VBit b     -> show b+    VSeq n _   -> "seq:" ++ show n+    VWord n _  -> "word:"  ++ show n+    VStream _  -> "stream"+    VFun _     -> "fun"+    VPoly _    -> "poly"+    VNumPoly _ -> "numpoly" +type Value = GenValue Bool BV++ -- Pretty Printing -------------------------------------------------------------  data PPOpts = PPOpts@@ -129,36 +262,55 @@ defaultPPOpts :: PPOpts defaultPPOpts = PPOpts { useAscii = False, useBase = 10, useInfLength = 5 } -ppValue :: PPOpts -> Value -> Doc+atFst :: Functor f => (a -> f b) -> (a, c) -> f (b, c)+atFst f (x,y) = fmap (,y) $ f x++atSnd :: Functor f => (a -> f b) -> (c, a) -> f (c, b)+atSnd f (x,y) = fmap (x,) $ f y++ppValue :: forall b w+         . BitWord b w+        => PPOpts+        -> GenValue b w+        -> Eval Doc ppValue opts = loop   where+  loop :: GenValue b w -> Eval Doc   loop val = case val of-    VRecord fs         -> braces (sep (punctuate comma (map ppField fs)))+    VRecord fs         -> do fs' <- traverse (atSnd (>>=loop)) $ fs+                             return $ braces (sep (punctuate comma (map ppField fs')))       where-      ppField (f,r) = pp f <+> char '=' <+> loop r-    VTuple vals        -> parens (sep (punctuate comma (map loop vals)))-    VBit b | b         -> text "True"-           | otherwise -> text "False"-    VSeq isWord vals-       | isWord        -> ppWord opts (fromVWord val)-       | otherwise     -> ppWordSeq vals-    VWord (BV w i)     -> ppWord opts (BV w i)-    VStream vals       -> brackets $ fsep+      ppField (f,r) = pp f <+> char '=' <+> r+    VTuple vals        -> do vals' <- traverse (>>=loop) vals+                             return $ parens (sep (punctuate comma vals'))+    VBit b             -> return $ ppBit b+    VSeq sz vals       -> ppWordSeq sz vals+    VWord _ wv         -> ppWordVal =<< wv+    VStream vals       -> do vals' <- traverse (>>=loop) $ enumerateSeqMap (useInfLength opts) vals+                             return $ brackets $ fsep                                    $ punctuate comma-                                   ( take (useInfLength opts) (map loop vals)-                                     ++ [text "..."]+                                   ( vals' ++ [text "..."]                                    )-    VFun _             -> text "<function>"-    VPoly _            -> text "<polymorphic value>"-    VNumPoly _         -> text "<polymorphic value>"+    VFun _             -> return $ text "<function>"+    VPoly _            -> return $ text "<polymorphic value>"+    VNumPoly _         -> return $ text "<polymorphic value>" -  ppWordSeq ws =+  ppWordVal :: WordValue b w -> Eval Doc+  ppWordVal w = ppWord opts <$> asWordVal w++  ppWordSeq :: Integer -> SeqMap b w -> Eval Doc+  ppWordSeq sz vals = do+    ws <- sequence (enumerateSeqMap sz vals)     case ws of       w : _-        | Just l <- vWordLen w, asciiMode opts l ->-                text $ show $ map (integerToChar . fromWord) ws-      _ -> brackets (fsep (punctuate comma (map loop ws)))-+        | Just l <- vWordLen w+        , asciiMode opts l+        -> do vs <- traverse (fromVWord "ppWordSeq") ws+              case traverse wordAsChar vs of+                Just str -> return $ text (show str)+                _ -> return $ brackets (fsep (punctuate comma $ map (ppWord opts) vs))+      _ -> do ws' <- traverse loop ws+              return $ brackets (fsep (punctuate comma ws'))  asciiMode :: PPOpts -> Integer -> Bool asciiMode opts width = useAscii opts && (width == 7 || width == 8)@@ -166,14 +318,9 @@ integerToChar :: Integer -> Char integerToChar = toEnum . fromInteger -data WithBase a = WithBase PPOpts a-    deriving (Functor) -instance PP (WithBase Value) where-  ppPrec _ (WithBase opts v) = ppValue opts v--ppWord :: PPOpts -> BV -> Doc-ppWord opts (BV width i)+ppBV :: PPOpts -> BV -> Doc+ppBV opts (BV width i)   | base > 36 = integer i -- not sure how to rule this out   | asciiMode opts width = text (show (toEnum (fromInteger i) :: Char))   | otherwise = prefix <> text value@@ -199,93 +346,204 @@   digits = "0123456789abcdefghijklmnopqrstuvwxyz"  --- Big-endian Words ------------------------------------------------------------+-- | This type class defines a collection of operations on bits and words that+--   are necessary to define generic evaluator primitives that operate on both concrete+--   and symbolic values uniformly.+class BitWord b w | b -> w, w -> b where+  -- | Pretty-print an individual bit+  ppBit :: b -> Doc -class BitWord b w where+  -- | Pretty-print a word value+  ppWord :: PPOpts -> w -> Doc -  -- | NOTE this assumes that the sequence of bits is big-endian and finite, so the-  -- first element of the list will be the most significant bit.+  -- | Attempt to render a word value as an ASCII character.  Return `Nothing`+  --   if the character value is unknown (e.g., for symbolic values).+  wordAsChar :: w -> Maybe Char++  -- | The number of bits in a word value.+  wordLen :: w -> Integer++  -- | Construct a literal bit value from a boolean.+  bitLit :: Bool -> b++  -- | Construct a literal word value given a bit width and a value.+  wordLit :: Integer -- ^ Width+          -> Integer -- ^ Value+          -> w++  -- | Construct a word value from a finite sequence of bits.+  --   NOTE: this assumes that the sequence of bits is big-endian and finite, so the+  --   first element of the list will be the most significant bit.   packWord :: [b] -> w -  -- | NOTE this produces a list of bits that represent a big-endian word, so the-  -- most significant bit is the first element of the list.+  -- | Deconstruct a packed word value in to a finite sequence of bits.+  --   NOTE: this produces a list of bits that represent a big-endian word, so+  --   the most significant bit is the first element of the list.   unpackWord :: w -> [b] +  -- | Concatenate the two given word values.+  --   NOTE: the first argument represents the more-significant bits+  joinWord :: w -> w -> w +  -- | Take the most-significant bits, and return+  --   those bits and the remainder.  The first element+  --   of the pair is the most significant bits.+  --   The two integer sizes must sum to the length of the given word value.+  splitWord :: Integer -- ^ left width+            -> Integer -- ^ right width+            -> w+            -> (w, w)++  -- | Extract a subsequence of bits from a packed word value.+  --   The first integer argument is the number of bits in the+  --   resulting word.  The second integer argument is the+  --   number of less-significant digits to discard.  Stated another+  --   way, the operation `extractWord n i w` is equivelant to+  --   first shifting `w` right by `i` bits, and then truncating to+  --   `n` bits.+  extractWord :: Integer -- ^ Number of bits to take+              -> Integer -- ^ starting bit+              -> w+              -> w++  -- | 2's complement addition of packed words.  The arguments must have+  --   equal bit width, and the result is of the same width. Overflow is silently+  --   discarded.+  wordPlus :: w -> w -> w++  -- | 2's complement subtraction of packed words.  The arguments must have+  --   equal bit width, and the result is of the same width. Overflow is silently+  --   discarded.+  wordMinus :: w -> w -> w++  -- | 2's complement multiplication of packed words.  The arguments must have+  --   equal bit width, and the result is of the same width. The high bits of the+  --   multiplication are silently discarded.+  wordMult :: w -> w -> w+++-- | This class defines additional operations necessary to define generic evaluation+--   functions.+class BitWord b w => EvalPrims b w where+  -- | Eval prim binds primitive declarations to the primitive values that implement them.+  evalPrim :: Decl -> GenValue b w++  -- | if/then/else operation.  Choose either the 'then' value or the 'else' value depending+  --   on the value of the test bit.+  iteValue :: b                    -- ^ Test bit+           -> Eval (GenValue b w)  -- ^ 'then' value+           -> Eval (GenValue b w)  -- ^ 'else' value+           -> Eval (GenValue b w)+++-- Concrete Big-endian Words ------------------------------------------------------------+ mask :: Integer  -- ^ Bit-width      -> Integer  -- ^ Value      -> Integer  -- ^ Masked result mask w i | w >= Arch.maxBigIntWidth = wordTooWide w          | otherwise                = i .&. ((1 `shiftL` fromInteger w) - 1) - instance BitWord Bool BV where+  wordLen (BV w _) = w+  wordAsChar (BV _ x) = Just $ integerToChar x +  ppBit b | b         = text "True"+          | otherwise = text "False"++  ppWord = ppBV++  bitLit b = b+  wordLit = mkBv+   packWord bits = BV (toInteger w) a     where       w = case length bits of             len | toInteger len >= Arch.maxBigIntWidth -> wordTooWide (toInteger len)                 | otherwise                  -> len-      a = foldl set 0 (zip [w - 1, w - 2 .. 0] bits)-      set acc (n,b) | b         = setBit acc n-                    | otherwise = acc+      a = foldl setb 0 (zip [w - 1, w - 2 .. 0] bits)+      setb acc (n,b) | b         = setBit acc n+                     | otherwise = acc    unpackWord (BV w a) = [ testBit a n | n <- [w' - 1, w' - 2 .. 0] ]     where       w' = fromInteger w +  joinWord (BV i x) (BV j y) =+    BV (i + j) (shiftL x (fromInteger j) + y) +  splitWord leftW rightW (BV _ x) =+     ( BV leftW (x `shiftR` (fromInteger rightW)), mkBv rightW x )++  extractWord n i (BV _ x) = mkBv n (x `shiftR` (fromInteger i))++  wordPlus (BV i x) (BV j y)+    | i == j = mkBv i (x+y)+    | otherwise = panic "Attempt to add words of different sizes: wordPlus" []++  wordMinus (BV i x) (BV j y)+    | i == j = mkBv i (x-y)+    | otherwise = panic "Attempt to subtract words of different sizes: wordMinus" []++  wordMult (BV i x) (BV j y)+    | i == j = mkBv i (x*y)+    | otherwise = panic "Attempt to multiply words of different sizes: wordMult" []++ -- Value Constructors ----------------------------------------------------------  -- | Create a packed word of n bits.-word :: Integer -> Integer -> Value-word n i = VWord (mkBv n i)+word :: BitWord b w => Integer -> Integer -> GenValue b w+word n i = VWord n $ ready $ WordVal $ wordLit n i -lam :: (GenValue b w -> GenValue b w) -> GenValue b w+lam :: (Eval (GenValue b w) -> Eval (GenValue b w)) -> GenValue b w lam  = VFun --- | A type lambda that expects a @Type@ of kind *.+-- | Functions that assume word inputs+wlam :: BitWord b w => (w -> Eval (GenValue b w)) -> GenValue b w+wlam f = VFun (\x -> x >>= fromVWord "wlam" >>= f)++-- | A type lambda that expects a @Type@. tlam :: (TValue -> GenValue b w) -> GenValue b w-tlam = VPoly+tlam f = VPoly (return . f)  -- | A type lambda that expects a @Type@ of kind #. nlam :: (Nat' -> GenValue b w) -> GenValue b w-nlam = VNumPoly+nlam f = VNumPoly (return . f)  -- | Generate a stream.-toStream :: [GenValue b w] -> GenValue b w-toStream  = VStream+toStream :: [GenValue b w] -> Eval (GenValue b w)+toStream vs =+   VStream <$> infiniteSeqMap (map ready vs) -toFinSeq :: TValue -> [GenValue b w] -> GenValue b w-toFinSeq elty = VSeq (isTBit elty)+toFinSeq :: BitWord b w+         => Integer -> TValue -> [GenValue b w] -> GenValue b w+toFinSeq len elty vs+   | isTBit elty = VWord len $ ready $ WordVal $ packWord $ map fromVBit vs+   | otherwise   = VSeq len $ finiteSeqMap (map ready vs)  -- | This is strict! boolToWord :: [Bool] -> Value-boolToWord = VWord . packWord+boolToWord bs = VWord (genericLength bs) $ ready $ WordVal $ packWord bs  -- | Construct either a finite sequence, or a stream.  In the finite case, -- record whether or not the elements were bits, to aid pretty-printing.-toSeq :: Nat' -> TValue -> [GenValue b w] -> GenValue b w+toSeq :: BitWord b w+      => Nat' -> TValue -> [GenValue b w] -> Eval (GenValue b w) toSeq len elty vals = case len of-  Nat n -> toFinSeq elty (genericTake n vals)+  Nat n -> return $ toFinSeq n elty vals   Inf   -> toStream vals --- | Construct one of:---   * a word, when the sequence is finite and the elements are bits---   * a sequence, when the sequence is finite but the elements aren't bits---   * a stream, when the sequence is not finite------ NOTE: do not use this constructor in the case where the thing may be a--- finite, but recursive, sequence.-toPackedSeq :: Nat' -> TValue -> [Value] -> Value-toPackedSeq len elty vals = case len of -  -- finite sequence, pack a word if the elements are bits.-  Nat _ | isTBit elty -> boolToWord (map fromVBit vals)-        | otherwise  -> VSeq False vals--  -- infinite sequence, construct a stream-  Inf -> VStream vals+-- | Construct either a finite sequence, or a stream.  In the finite case,+-- record whether or not the elements were bits, to aid pretty-printing.+mkSeq :: Nat' -> TValue -> SeqMap b w -> GenValue b w+mkSeq len elty vals = case len of+  Nat n+    | isTBit elty -> VWord n $ return $ BitsVal $ Seq.fromFunction (fromInteger n) $ \i ->+                        fromVBit <$> lookupSeqMap vals (toInteger i)+    | otherwise   -> VSeq n vals+  Inf             -> VStream vals   -- Value Destructors -----------------------------------------------------------@@ -296,68 +554,84 @@   VBit b -> b   _      -> evalPanic "fromVBit" ["not a Bit"] +bitsSeq :: BitWord b w => WordValue b w -> Integer -> Eval b+bitsSeq (WordVal w) =+  let bs = unpackWord w+   in \i -> return $ genericIndex bs i+bitsSeq (BitsVal bs) = \i -> Seq.index bs (fromInteger i)+ -- | Extract a sequence.-fromSeq :: BitWord b w => GenValue b w -> [GenValue b w]-fromSeq val = case val of-  VSeq _ vs  -> vs-  VWord bv   -> map VBit (unpackWord bv)-  VStream vs -> vs-  _          -> evalPanic "fromSeq" ["not a sequence"]+fromSeq :: forall b w. BitWord b w => String -> GenValue b w -> Eval (SeqMap b w)+fromSeq msg val = case val of+  VSeq _ vs   -> return vs+  VStream vs  -> return vs+  _           -> evalPanic "fromSeq" ["not a sequence", msg] -fromStr :: Value -> String-fromStr = map (toEnum . fromInteger . fromWord) . fromSeq+fromStr :: Value -> Eval String+fromStr (VSeq n vals) =+  traverse (\x -> toEnum . fromInteger <$> (fromWord "fromStr" =<< x)) (enumerateSeqMap n vals)+fromStr _ = evalPanic "fromStr" ["Not a finite sequence"] +fromWordVal :: String -> GenValue b w -> Eval (WordValue b w)+fromWordVal _msg (VWord _ wval) = wval+fromWordVal msg _ = evalPanic "fromWordVal" ["not a word value", msg]+ -- | Extract a packed word.-fromVWord :: BitWord b w => GenValue b w -> w-fromVWord val = case val of-  VWord bv                -> bv -- this should always mask-  VSeq isWord bs | isWord -> packWord (map fromVBit bs)-  _                       -> evalPanic "fromVWord" ["not a word"]+fromVWord :: BitWord b w => String -> GenValue b w -> Eval w+fromVWord _msg (VWord _ wval) = wval >>= asWordVal +fromVWord msg _ = evalPanic "fromVWord" ["not a word", msg] -vWordLen :: Value -> Maybe Integer+vWordLen :: BitWord b w => GenValue b w -> Maybe Integer vWordLen val = case val of-  VWord (BV w _)          -> Just w-  VSeq isWord bs | isWord -> Just (toInteger (length bs))-  _                       -> Nothing+  VWord n _wv              -> Just n+  _                        -> Nothing +-- | If the given list of values are all fully-evaluated thunks+--   containing bits, return a packed word built from the same bits.+--   However, if any value is not a fully-evaluated bit, return `Nothing`.+tryFromBits :: BitWord b w => [Eval (GenValue b w)] -> Maybe w+tryFromBits = go id+  where+  go f [] = Just (packWord (f []))+  go f (Ready (VBit b) : vs) = go (f . (b :)) vs+  go _ (_ : _) = Nothing  -- | Turn a value into an integer represented by w bits.-fromWord :: Value -> Integer-fromWord val = a-  where BV _ a = fromVWord val+fromWord :: String -> Value -> Eval Integer+fromWord msg val = bvVal <$> fromVWord msg val  -- | Extract a function from a value.-fromVFun :: GenValue b w -> (GenValue b w -> GenValue b w)+fromVFun :: GenValue b w -> (Eval (GenValue b w) -> Eval (GenValue b w)) fromVFun val = case val of   VFun f -> f   _      -> evalPanic "fromVFun" ["not a function"]  -- | Extract a polymorphic function from a value.-fromVPoly :: GenValue b w -> (TValue -> GenValue b w)+fromVPoly :: GenValue b w -> (TValue -> Eval (GenValue b w)) fromVPoly val = case val of   VPoly f -> f   _       -> evalPanic "fromVPoly" ["not a polymorphic value"]  -- | Extract a polymorphic function from a value.-fromVNumPoly :: GenValue b w -> (Nat' -> GenValue b w)+fromVNumPoly :: GenValue b w -> (Nat' -> Eval (GenValue b w)) fromVNumPoly val = case val of   VNumPoly f -> f   _          -> evalPanic "fromVNumPoly" ["not a polymorphic value"]  -- | Extract a tuple from a value.-fromVTuple :: GenValue b w -> [GenValue b w]+fromVTuple :: GenValue b w -> [Eval (GenValue b w)] fromVTuple val = case val of   VTuple vs -> vs   _         -> evalPanic "fromVTuple" ["not a tuple"]  -- | Extract a record from a value.-fromVRecord :: GenValue b w -> [(Ident, GenValue b w)]+fromVRecord :: GenValue b w -> [(Ident, Eval (GenValue b w))] fromVRecord val = case val of   VRecord fs -> fs   _          -> evalPanic "fromVRecord" ["not a record"]  -- | Lookup a field in a record.-lookupRecord :: Ident -> GenValue b w -> GenValue b w+lookupRecord :: Ident -> GenValue b w -> Eval (GenValue b w) lookupRecord f rec = case lookup f (fromVRecord rec) of   Just val -> val   Nothing  -> evalPanic "lookupRecord" ["malformed record"]@@ -368,38 +642,41 @@ -- this value, if we can determine it. -- -- XXX: View patterns would probably clean up this definition a lot.-toExpr :: PrimMap -> Type -> Value -> Maybe Expr-toExpr prims = go+toExpr :: PrimMap -> Type -> Value -> Eval (Maybe Expr)+toExpr prims t0 v0 = findOne (go t0 v0)   where    prim n = ePrim prims (mkIdent (T.pack n)) +  go :: Type -> Value -> ChoiceT Eval Expr   go ty val = case (ty, val) of     (TRec tfs, VRecord vfs) -> do       let fns = map fst vfs       guard (map fst tfs == fns)-      fes <- zipWithM go (map snd tfs) (map snd vfs)+      fes <- zipWithM go (map snd tfs) =<< lift (traverse snd vfs)       return $ ERec (zip fns fes)     (TCon (TC (TCTuple tl)) ts, VTuple tvs) -> do       guard (tl == (length tvs))-      ETuple `fmap` zipWithM go ts tvs+      ETuple `fmap` (zipWithM go ts =<< lift (sequence tvs))     (TCon (TC TCBit) [], VBit True ) -> return (prim "True")     (TCon (TC TCBit) [], VBit False) -> return (prim "False")-    (TCon (TC TCSeq) [a,b], VSeq _ []) -> do+    (TCon (TC TCSeq) [a,b], VSeq 0 _) -> do       guard (a == tZero)       return $ EList [] b-    (TCon (TC TCSeq) [a,b], VSeq _ svs) -> do-      guard (a == tNum (length svs))-      ses <- mapM (go b) svs+    (TCon (TC TCSeq) [a,b], VSeq n svs) -> do+      guard (a == tNum n)+      ses <- mapM (go b) =<< lift (sequence (enumerateSeqMap n svs))       return $ EList ses b-    (TCon (TC TCSeq) [a,(TCon (TC TCBit) [])], VWord (BV w v)) -> do+    (TCon (TC TCSeq) [a,(TCon (TC TCBit) [])], VWord _ wval) -> do+      BV w v <- lift (asWordVal =<< wval)       guard (a == tNum w)       return $ ETApp (ETApp (prim "demote") (tNum v)) (tNum w)     (_, VStream _) -> fail "cannot construct infinite expressions"     (_, VFun    _) -> fail "cannot convert function values to expressions"     (_, VPoly   _) -> fail "cannot convert polymorphic values to expressions"-    _ -> panic "Cryptol.Eval.Value.toExpr"-           ["type mismatch:"-           , pretty ty-           , render (ppValue defaultPPOpts val)-           ]+    _ -> do doc <- lift (ppValue defaultPPOpts val)+            panic "Cryptol.Eval.Value.toExpr"+             ["type mismatch:"+             , pretty ty+             , render doc+             ]
src/Cryptol/ModuleSystem/Base.hs view
@@ -19,6 +19,7 @@                                 , meCoreLint, CoreLint(..)) import qualified Cryptol.Eval                 as E import qualified Cryptol.Eval.Value           as E+import           Cryptol.Prims.Eval () import qualified Cryptol.ModuleSystem.NamingEnv as R import qualified Cryptol.ModuleSystem.Renamer as R import qualified Cryptol.Parser               as P@@ -31,11 +32,11 @@ import qualified Cryptol.TypeCheck.AST as T import qualified Cryptol.TypeCheck.PP as T import qualified Cryptol.TypeCheck.Sanity as TcSanity-import Cryptol.Utils.Ident (preludeName,interactiveName,unpackModName)+import Cryptol.Utils.Ident (preludeName, preludeExtrasName, interactiveName,unpackModName) import Cryptol.Utils.PP (pretty) import Cryptol.Utils.Panic (panic) -import Cryptol.Prelude (writePreludeContents)+import Cryptol.Prelude (writePreludeContents, writePreludeExtrasContents)  import Cryptol.Transform.MonoValues (rewModule) @@ -48,7 +49,7 @@ import Data.Monoid ((<>)) import           Data.Text.Lazy (Text) import qualified Data.Text.Lazy.IO as T-import System.Directory (doesFileExist)+import System.Directory (doesFileExist, canonicalizePath) import System.FilePath ( addExtension                        , isAbsolute                        , joinPath@@ -124,20 +125,22 @@ loadModuleByPath :: FilePath -> ModuleM T.Module loadModuleByPath path = withPrependedSearchPath [ takeDirectory path ] $ do   let fileName = takeFileName path-  -- path' is the resolved, absolute path-  path' <- findFile fileName-  pm <- parseModule path'+  foundPath <- findFile fileName+  pm <- parseModule foundPath   let n = thing (P.mName pm)    -- Check whether this module name has already been loaded from a different file   env <- getModuleEnv+  -- path' is the resolved, absolute path, used only for checking+  -- whether it's already been loaded+  path' <- io $ canonicalizePath foundPath   case lookupModule n env of-    Nothing -> loadingModule n (loadModule path' pm)+    -- loadModule will calculate the canonical path again+    Nothing -> loadingModule n (loadModule foundPath pm)     Just lm-      | path' == loaded -> return (lmModule lm)-      | otherwise       -> duplicateModuleName n path' loaded-      where loaded = lmFilePath lm-+     | path' == loaded -> return (lmModule lm)+     | otherwise       -> duplicateModuleName n path' loaded+     where loaded = lmCanonicalPath lm  -- | Load the module specified by an import. loadImport :: Located P.Import -> ModuleM ()@@ -173,8 +176,10 @@   -- extend the eval env   modifyEvalEnv (E.moduleEnv tcm) -  loadedModule path tcm+  canonicalPath <- io (canonicalizePath path) +  loadedModule path canonicalPath tcm+   return tcm  @@ -214,7 +219,8 @@    handleNotFound =     case n of-      m | m == preludeName -> writePreludeContents+      m | m == preludeName -> io writePreludeContents+      m | m == preludeExtrasName -> io writePreludeExtrasContents       _ -> moduleNotFound n =<< getSearchPath    -- generate all possible search paths@@ -433,6 +439,7 @@   monoBinds <- getMonoBinds   cfg <- getSolverConfig   supply <- getSupply+  searchPath <- getSearchPath    -- TODO: include the environment needed by the module   return T.InferInput@@ -443,6 +450,7 @@     , T.inpNameSeeds = seeds     , T.inpMonoBinds = monoBinds     , T.inpSolverConfig = cfg+    , T.inpSearchPath = searchPath     , T.inpSupply    = supply     , T.inpPrimNames = prims     }@@ -454,14 +462,15 @@ evalExpr e = do   env <- getEvalEnv   denv <- getDynEnv-  return (E.evalExpr (env <> deEnv denv) e)+  io $ E.runEval $ (E.evalExpr (env <> deEnv denv) e)  evalDecls :: [T.DeclGroup] -> ModuleM () evalDecls dgs = do   env <- getEvalEnv   denv <- getDynEnv   let env' = env <> deEnv denv-      denv' = denv { deDecls = deDecls denv ++ dgs-                   , deEnv = E.evalDecls dgs env'+  deEnv' <- io $ E.runEval $ E.evalDecls dgs env'+  let denv' = denv { deDecls = deDecls denv ++ dgs+                   , deEnv = deEnv'                    }   setDynEnv denv'
src/Cryptol/ModuleSystem/Env.hs view
@@ -192,7 +192,8 @@  data LoadedModule = LoadedModule   { lmName      :: ModName-  , lmFilePath  :: FilePath+  , lmFilePath  :: FilePath -- ^ The file path used to load this module (may not be canonical)+  , lmCanonicalPath :: FilePath -- ^ The canonical version of the path of this module   , lmInterface :: Iface   , lmModule    :: T.Module   } deriving (Show, Generic, NFData)@@ -203,14 +204,15 @@ lookupModule :: ModName -> ModuleEnv -> Maybe LoadedModule lookupModule mn env = List.find ((mn ==) . lmName) (getLoadedModules (meLoadedModules env)) -addLoadedModule :: FilePath -> T.Module -> LoadedModules -> LoadedModules-addLoadedModule path tm lm+addLoadedModule :: FilePath -> FilePath -> T.Module -> LoadedModules -> LoadedModules+addLoadedModule path canonicalPath tm lm   | isLoaded (T.mName tm) lm = lm   | otherwise                = LoadedModules (getLoadedModules lm ++ [loaded])   where   loaded = LoadedModule     { lmName      = T.mName tm     , lmFilePath  = path+    , lmCanonicalPath = canonicalPath     , lmInterface = genIface tm     , lmModule    = tm     }
src/Cryptol/ModuleSystem/Monad.hs view
@@ -11,7 +11,9 @@ {-# LANGUAGE DeriveGeneric #-} module Cryptol.ModuleSystem.Monad where -import           Cryptol.Eval.Env (EvalEnv)+import           Cryptol.Eval (EvalEnv)++import qualified Cryptol.Eval.Monad           as E import           Cryptol.ModuleSystem.Env import           Cryptol.ModuleSystem.Interface import           Cryptol.ModuleSystem.Name (FreshM(..),Supply)@@ -26,9 +28,10 @@ import qualified Cryptol.TypeCheck as T import qualified Cryptol.TypeCheck.AST as T import           Cryptol.Parser.Position (Range)-import           Cryptol.Utils.Ident (interactiveName)+import           Cryptol.Utils.Ident (interactiveName, packModName) import           Cryptol.Utils.PP +import Control.Monad.IO.Class import Control.Exception (IOException) import Data.Function (on) import Data.Maybe (isJust)@@ -273,6 +276,9 @@        set $! me { meSupply = s' }        return a +instance MonadIO m => MonadIO (ModuleT m) where+  liftIO m = lift $ liftIO m+ runModuleT :: Monad m            => ModuleEnv            -> ModuleT m a@@ -340,8 +346,7 @@   ro <- ask   case roLoading ro of     is : _ -> return is-    _      -> panic "ModuleSystem: getImportSource" ["Import stack is empty"]-+    _      -> return (FromModule (packModName ["<none>"])) -- panic "ModuleSystem: getImportSource" ["Import stack is empty"]  getIface :: P.ModName -> ModuleM Iface getIface mn = ModuleT $ do@@ -380,15 +385,17 @@   env <- get   set $! env { meLoadedModules = removeLoadedModule path (meLoadedModules env) } -loadedModule :: FilePath -> T.Module -> ModuleM ()-loadedModule path m = ModuleT $ do+loadedModule :: FilePath -> FilePath -> T.Module -> ModuleM ()+loadedModule path canonicalPath m = ModuleT $ do   env <- get-  set $! env { meLoadedModules = addLoadedModule path m (meLoadedModules env) }+  set $! env { meLoadedModules = addLoadedModule path canonicalPath m (meLoadedModules env) } -modifyEvalEnv :: (EvalEnv -> EvalEnv) -> ModuleM ()+modifyEvalEnv :: (EvalEnv -> E.Eval EvalEnv) -> ModuleM () modifyEvalEnv f = ModuleT $ do   env <- get-  set $! env { meEvalEnv = f (meEvalEnv env) }+  let evalEnv = meEvalEnv env+  evalEnv' <- inBase $ E.runEval (f evalEnv)+  set $! env { meEvalEnv = evalEnv' }  getEvalEnv :: ModuleM EvalEnv getEvalEnv  = ModuleT (meEvalEnv `fmap` get)
src/Cryptol/ModuleSystem/NamingEnv.hs view
@@ -300,12 +300,14 @@       TDNewtype d -> namingEnv (InModule ns (tlValue d))       Include _   -> mempty +-- NOTE: we use the same name at the type and expression level, as there's only+-- ever one name introduced in the declaration. The names are only ever used in+-- different namespaces, so there's no ambiguity. instance BindsNames (InModule (Newtype PName)) where   namingEnv (InModule ns Newtype { .. }) = BuildNamingEnv $     do let Located { .. } = nName-       tyName <- liftSupply (mkDeclared ns (getIdent thing) Nothing srcRange)-       eName  <- liftSupply (mkDeclared ns (getIdent thing) Nothing srcRange)-       return (singletonT thing tyName `mappend` singletonE thing eName)+       ntName <- liftSupply (mkDeclared ns (getIdent thing) Nothing srcRange)+       return (singletonT thing ntName `mappend` singletonE thing ntName)  -- | The naming environment for a single declaration. instance BindsNames (InModule (Decl PName)) where
src/Cryptol/ModuleSystem/Renamer.hs view
@@ -13,6 +13,7 @@ {-# LANGUAGE MultiWayIf #-} {-# LANGUAGE PatternGuards #-} {-# LANGUAGE RecordWildCards #-}+{-# LANGUAGE ViewPatterns #-} module Cryptol.ModuleSystem.Renamer (     NamingEnv(), shadowing   , BindsNames(..), InModule(..), namingEnv'@@ -38,6 +39,7 @@ import qualified Data.Foldable as F import qualified Data.Map.Strict as Map import qualified Data.Sequence as Seq+import           Data.String (IsString(..)) import           MonadLib hiding (mapM, mapM_)  import GHC.Generics (Generic)@@ -138,6 +140,10 @@  data RenamerWarning   = SymbolShadowed Name [Name] NameDisp++    -- Warn when fixity is used to resolve parses, and the relative+    -- fixity is planned to change.  See https://github.com/GaloisInc/cryptol/issues/241+  | DangerousFixity (Located Name) (Located Name) NameDisp     deriving (Show, Generic, NFData)  instance PP RenamerWarning where@@ -154,6 +160,12 @@     loc = pp (nameLoc new)     sym = pp new +  ppPrec _ (DangerousFixity o1 o2 disp) = fixNameDisp disp $+    hang (text "[warning] at" <+> pp (srcRange o1))+       4 $ fsep [ text "Using fixity to resolve the parsing of operators" <+> pp (thing o1) <+> text "and" <+> pp (thing o2) <> text ";"+                , text "the relative fixity of these operators is planned to change in a future Cryptol release."+                , text "Use parentheses to disambiguate this parse, or consider replacing (&&) with (/\\), or (||) with (\\/)."+                ]  -- Renaming Monad -------------------------------------------------------------- @@ -232,6 +244,12 @@      RW { .. } <- get      set RW { rwErrors = rwErrors Seq.|> f roDisp, .. } +recordW :: (NameDisp -> RenamerWarning) -> RenameM ()+recordW f = RenameM $+  do RO { .. } <- ask+     RW { .. } <- get+     set RW { rwWarnings = rwWarnings Seq.|> f roDisp, .. }+ curLoc :: RenameM Range curLoc  = RenameM (roLoc `fmap` ask) @@ -712,20 +730,61 @@                         z' <- rename z                         mkEInfix x' op z' +-- | Check if we are resolving operators whose precedence will change in the+--   future, and issue a warning in that event.+--+--   (&&) is scheduled to have higher precedence than the comparisons and (^)+--   (||) is scheduled to have higher precedence than the comparisons+--+--   See https://github.com/GaloisInc/cryptol/issues/241+isDangerousFixity :: Name -> Name -> Bool+isDangerousFixity (asPrim -> Just x) (asPrim -> Just y) = test x y || test y x+ where+ test n m+   | n == mkInfix (fromString "&&")+   , (m `elem` comparisons) || (m == mkInfix (fromString "^"))+   = True++   | n == mkInfix (fromString "||")+   , m `elem` comparisons+   = True++   | otherwise+   = False++ comparisons =+   [ mkInfix $ fromString "=="+   , mkInfix $ fromString "==="+   , mkInfix $ fromString "!="+   , mkInfix $ fromString "!=="+   , mkInfix $ fromString ">"+   , mkInfix $ fromString ">="+   , mkInfix $ fromString "<"+   , mkInfix $ fromString "<="+   ]+isDangerousFixity _ _ = False+++ mkEInfix :: Expr Name             -- ^ May contain infix expressions          -> (Located Name,Fixity) -- ^ The operator to use          -> Expr Name             -- ^ Will not contain infix expressions          -> RenameM (Expr Name)  mkEInfix e@(EInfix x o1 f1 y) op@(o2,f2) z =-  case compareFixity f1 f2 of-    FCLeft  -> return (EInfix e o2 f2 z)+  -- Temporary warning while we transition the fixity of && and || relative+  -- to comparisons and xor.  See https://github.com/GaloisInc/cryptol/issues/241+  do when (isDangerousFixity (thing o1) (thing o2))+          (recordW (DangerousFixity o1 o2)) -    FCRight -> do r <- mkEInfix y op z-                  return (EInfix x o1 f1 r)+     case compareFixity f1 f2 of+       FCLeft  -> return (EInfix e o2 f2 z) -    FCError -> do record (FixityError o1 o2)-                  return (EInfix e o2 f2 z)+       FCRight -> do r <- mkEInfix y op z+                     return (EInfix x o1 f1 r)++       FCError -> do record (FixityError o1 o2)+                     return (EInfix e o2 f2 z)  mkEInfix (ELocated e' _) op z =      mkEInfix e' op z
src/Cryptol/Parser.y view
@@ -280,7 +280,7 @@                                           , bDoc       = Nothing                                           } } -  | apat other_op apat '=' expr+  | apat pat_op apat '=' expr                            { at ($1,$5) $                              DBind $ Bind { bName      = $2                                           , bParams    = [$1,$3]@@ -401,6 +401,10 @@                                        in mkQual (mkModName ns) (mkInfix (T.toStrict i)) A.<$ $1 }  op                               :: { LPName }+  : pat_op                          { $1 }+  | '#'                             { Located $1 $ mkUnqual $ mkInfix "#" }++pat_op                           :: { LPName }   : other_op                        { $1 }      -- special cases for operators that are re-used elsewhere@@ -409,10 +413,9 @@   | '-'                             { Located $1 $ mkUnqual $ mkInfix "-" }   | '~'                             { Located $1 $ mkUnqual $ mkInfix "~" }   | '^^'                            { Located $1 $ mkUnqual $ mkInfix "^^" }-  | '#'                             { Located $1 $ mkUnqual $ mkInfix "#" }  -other_op                            :: { LPName }+other_op                         :: { LPName }   : OP                              { let Token (Op (Other [] str)) _ = thing $1                                        in mkUnqual (mkInfix (T.toStrict str)) A.<$ $1 } 
src/Cryptol/Parser/Lexer.x view
@@ -39,7 +39,7 @@ @id_next      = [a-zA-Z0-9_'] | $unilower | $uniupper | $unidigit | $unitick  @id           = @id_first @id_next*-@op           = ([\!\@\#\$\%\^\&\*\~\>\<\?\+\=\|\/\\\-] | $unisymbol)++@op           = ([\!\#\$\%\&\*\+\-\.\/\:\<\=\>\?\@\\\^\|\~] | $unisymbol)+  @qual         = (@id $white* :: $white*)+ @qual_id      = @qual @id@@ -62,7 +62,7 @@ }  <comment> {-\*+\/                     { endComent }+\*+\/                     { endComment } [^\*\/]+                  { addToComment } \*                        { addToComment } \/                        { addToComment }
src/Cryptol/Parser/LexerUtils.hs view
@@ -62,8 +62,8 @@                            InComment doc q qs cs -> (doc, q : qs, txt : cs)                            _                     -> panic "[Lexer] startComment" ["in a string"] -endComent :: Action-endComent cfg p txt s =+endComment :: Action+endComment cfg p txt s =   case s of     InComment d f [] cs     -> (Just (mkToken d f cs), Normal)     InComment d _ (q:qs) cs -> (Nothing, InComment d q qs (txt : cs))@@ -216,20 +216,14 @@ numToken :: Integer -> Text -> TokenT numToken rad ds = Num (toVal ds) (fromInteger rad) (fromIntegral (T.length ds))   where-  toVal = T.foldl' (\x c -> rad * x + toDig c) 0-  toDig = if rad == 16 then fromHexDigit else fromDecDigit--fromDecDigit   :: Char -> Integer-fromDecDigit x  = read [x]+  toVal = T.foldl' (\x c -> rad * x + fromDigit c) 0 -fromHexDigit :: Char -> Integer-fromHexDigit x'-  | 'a' <= x && x <= 'f'  = fromIntegral (10 + fromEnum x - fromEnum 'a')-  | otherwise             = fromDecDigit x+fromDigit :: Char -> Integer+fromDigit x'+  | 'a' <= x && x <= 'z'  = fromIntegral (10 + fromEnum x - fromEnum 'a')+  | otherwise             = fromIntegral (fromEnum x - fromEnum '0')   where x                 = toLower x' -- -------------------------------------------------------------------------------  data AlexInput            = Inp { alexPos           :: !Position@@ -354,7 +348,7 @@  -------------------------------------------------------------------------------- -data Token    = Token { tokenType :: TokenT, tokenText :: Text }+data Token    = Token { tokenType :: !TokenT, tokenText :: !Text }                 deriving (Show, Generic, NFData)  -- | Virtual tokens, inserted by layout processing.@@ -432,16 +426,16 @@               | LexicalError                 deriving (Eq, Show, Generic, NFData) -data TokenT   = Num Integer Int Int   -- ^ value, base, number of digits-              | ChrLit  Char          -- ^ character literal-              | Ident [T.Text] T.Text -- ^ (qualified) identifier-              | StrLit String         -- ^ string literal-              | KW    TokenKW         -- ^ keyword-              | Op    TokenOp         -- ^ operator-              | Sym   TokenSym        -- ^ symbol-              | Virt  TokenV          -- ^ virtual token (for layout)-              | White TokenW          -- ^ white space token-              | Err   TokenErr        -- ^ error token+data TokenT   = Num !Integer !Int !Int   -- ^ value, base, number of digits+              | ChrLit  !Char         -- ^ character literal+              | Ident ![T.Text] !T.Text -- ^ (qualified) identifier+              | StrLit !String         -- ^ string literal+              | KW    !TokenKW         -- ^ keyword+              | Op    !TokenOp         -- ^ operator+              | Sym   !TokenSym        -- ^ symbol+              | Virt  !TokenV          -- ^ virtual token (for layout)+              | White !TokenW          -- ^ white space token+              | Err   !TokenErr        -- ^ error token               | EOF                 deriving (Eq, Show, Generic, NFData) 
src/Cryptol/Parser/ParserUtils.hs view
@@ -157,7 +157,7 @@ mkFixity assoc tok qns =   do l <- intVal tok      unless (l >= 1 && l <= 100)-          (errorMessage (srcRange tok) "Fixity levels must be between 0 and 20")+          (errorMessage (srcRange tok) "Fixity levels must be between 1 and 100")      return (DFixity (Fixity assoc (fromInteger l)) qns)  mkTupleSel :: Range -> Integer -> ParseM (Located Selector)
src/Cryptol/Parser/Position.hs view
@@ -21,7 +21,7 @@  import Cryptol.Utils.PP -data Located a  = Located { srcRange :: !Range, thing :: a }+data Located a  = Located { srcRange :: !Range, thing :: !a }                   deriving (Eq, Show, Generic, NFData)  data Position   = Position { line :: !Int, col :: !Int }
src/Cryptol/Parser/Utils.hs view
@@ -38,7 +38,8 @@                          e2 <- translateExprToNumT b                          return (TInfix e1 o f e2) -    EParens e    -> translateExprToNumT e+    EParens e    -> do t <- translateExprToNumT e+                       return (TParens t)      _            -> Nothing 
src/Cryptol/Prelude.hs view
@@ -8,13 +8,17 @@ -- -- Compile the prelude into the executable as a last resort +{-# LANGUAGE Trustworthy #-} {-# LANGUAGE CPP #-} {-# LANGUAGE QuasiQuotes #-} {-# LANGUAGE OverloadedStrings #-} -module Cryptol.Prelude (writePreludeContents) where+module Cryptol.Prelude (+  writePreludeContents,+  writePreludeExtrasContents,+  writeTcPreludeContents,+  ) where -import Cryptol.ModuleSystem.Monad  import System.Directory (getTemporaryDirectory) import System.IO (hClose, hPutStr, openTempFile)@@ -25,10 +29,34 @@  -- | Write the contents of the Prelude to a temporary file so that -- Cryptol can load the module.-writePreludeContents :: ModuleM FilePath-writePreludeContents = io $ do+writePreludeContents :: IO FilePath+writePreludeContents = do   tmpdir <- getTemporaryDirectory   (path, h) <- openTempFile tmpdir "Cryptol.cry"   hPutStr h preludeContents+  hClose h+  return path++preludeExtrasContents :: String+preludeExtrasContents = [there|lib/Cryptol/Extras.cry|]++writePreludeExtrasContents :: IO FilePath+writePreludeExtrasContents = do+  tmpdir <- getTemporaryDirectory+  (path, h) <- openTempFile tmpdir "CryptolExtras.cry"+  hPutStr h preludeExtrasContents+  hClose h+  return path++cryptolTcContents :: String+cryptolTcContents = [there|lib/CryptolTC.z3|]++-- | Write the contents of the Prelude to a temporary file so that+-- Cryptol can load the module.+writeTcPreludeContents :: IO FilePath+writeTcPreludeContents = do+  tmpdir <- getTemporaryDirectory+  (path, h) <- openTempFile tmpdir "CryptolTC.z3"+  hPutStr h cryptolTcContents   hClose h   return path
src/Cryptol/Prims/Eval.hs view
@@ -6,706 +6,1294 @@ -- Stability   :  provisional -- Portability :  portable -{-# LANGUAGE Trustworthy #-}-{-# LANGUAGE TupleSections #-}-{-# LANGUAGE RecordWildCards #-}-{-# LANGUAGE Rank2Types #-}-{-# LANGUAGE PatternGuards #-}-{-# LANGUAGE ViewPatterns #-}-{-# LANGUAGE BangPatterns #-}-module Cryptol.Prims.Eval where--import Cryptol.TypeCheck.AST-import Cryptol.TypeCheck.Solver.InfNat (Nat'(..),fromNat,genLog, nMul)-import qualified Cryptol.Eval.Arch as Arch-import Cryptol.Eval.Error-import Cryptol.Eval.Type(evalTF)-import Cryptol.Eval.Value-import Cryptol.Testing.Random (randomValue)-import Cryptol.Utils.Panic (panic)-import Cryptol.ModuleSystem.Name (asPrim)-import Cryptol.Utils.Ident (Ident,mkIdent)--import Data.List (sortBy, transpose, genericTake, genericDrop,-                  genericReplicate, genericSplitAt, genericIndex)-import Data.Ord (comparing)-import Data.Bits (Bits(..))--import qualified Data.Map.Strict as Map-import qualified Data.Text as T--import System.Random.TF.Gen (seedTFGen)---- Primitives --------------------------------------------------------------------evalPrim :: Decl -> Value-evalPrim Decl { dName = n, .. }-  | Just prim <- asPrim n, Just val <- Map.lookup prim primTable = val--evalPrim Decl { .. } =-    panic "Eval" [ "Unimplemented primitive", show dName ]--primTable :: Map.Map Ident Value-primTable = Map.fromList $ map (\(n, v) -> (mkIdent (T.pack n), v))-  [ ("+"          , binary (arithBinary (liftBinArith (+))))-  , ("-"          , binary (arithBinary (liftBinArith (-))))-  , ("*"          , binary (arithBinary (liftBinArith (*))))-  , ("/"          , binary (arithBinary (liftBinArith divWrap)))-  , ("%"          , binary (arithBinary (liftBinArith modWrap)))-  , ("^^"         , binary (arithBinary modExp))-  , ("lg2"        , unary  (arithUnary lg2))-  , ("negate"     , unary  (arithUnary negate))-  , ("<"          , binary (cmpOrder (\o -> o == LT           )))-  , (">"          , binary (cmpOrder (\o -> o == GT           )))-  , ("<="         , binary (cmpOrder (\o -> o == LT || o == EQ)))-  , (">="         , binary (cmpOrder (\o -> o == GT || o == EQ)))-  , ("=="         , binary (cmpOrder (\o ->            o == EQ)))-  , ("!="         , binary (cmpOrder (\o ->            o /= EQ)))-  , ("&&"         , binary (logicBinary (.&.)))-  , ("||"         , binary (logicBinary (.|.)))-  , ("^"          , binary (logicBinary xor))-  , ("complement" , unary  (logicUnary complement))-  , ("<<"         , logicShift shiftLW shiftLS)-  , (">>"         , logicShift shiftRW shiftRS)-  , ("<<<"        , logicShift rotateLW rotateLS)-  , (">>>"        , logicShift rotateRW rotateRS)-  , ("True"       , VBit True)-  , ("False"      , VBit False)--  , ("demote"     , ecDemoteV)--  , ("#"          , nlam $ \ front ->-                    nlam $ \ back  ->-                    tlam $ \ elty  ->-                    lam  $ \ l     ->-                    lam  $ \ r     -> ccatV front back elty l r)--  , ("@"          , indexPrimOne  indexFront)-  , ("@@"         , indexPrimMany indexFrontRange)-  , ("!"          , indexPrimOne  indexBack)-  , ("!!"         , indexPrimMany indexBackRange)--  , ("zero"       , tlam zeroV)--  , ("join"       , nlam $ \ parts ->-                    nlam $ \ each  ->-                    tlam $ \ a     -> lam (joinV parts each a))--  , ("split"      , ecSplitV)--  , ("splitAt"    , nlam $ \ front ->-                    nlam $ \ back  ->-                    tlam $ \ a     -> lam (splitAtV front back a))--  , ("fromThen"   , fromThenV)-  , ("fromTo"     , fromToV)-  , ("fromThenTo" , fromThenToV)--  , ("infFrom"    , nlam $ \(finNat'  -> bits)  ->-                     lam $ \(fromWord -> first) ->-                    toStream (map (word bits) [ first .. ]))--  , ("infFromThen", nlam $ \(finNat'  -> bits)  ->-                     lam $ \(fromWord -> first) ->-                     lam $ \(fromWord -> next)  ->-                    toStream [ word bits n | n <- [ first, next .. ] ])--  , ("error"      , tlam $ \_              ->-                    tlam $ \_              ->-                     lam $ \(fromStr -> s) -> cryUserError s)--  , ("reverse"    , nlam $ \a ->-                    tlam $ \b ->-                     lam $ \(fromSeq -> xs) -> toSeq a b (reverse xs))--  , ("transpose"  , nlam $ \a ->-                    nlam $ \b ->-                    tlam $ \c ->-                     lam $ \((map fromSeq . fromSeq) -> xs) ->-                        case a of-                           Nat 0 ->-                             let val = toSeq a c []-                             in case b of-                                  Nat n -> toSeq b (tvSeq a c) $ genericReplicate n val-                                  Inf   -> VStream $ repeat val-                           _ -> toSeq b (tvSeq a c) $ map (toSeq a c) $ transpose xs)--  , ("pmult"       ,-    let mul !res !_ !_ 0 = res-        mul  res bs as n = mul (if even as then res else xor res bs)-                               (bs `shiftL` 1) (as `shiftR` 1) (n-1)-     in nlam $ \(finNat'  -> a) ->-        nlam $ \(finNat'  -> b) ->-         lam $ \(fromWord -> x) ->-         lam $ \(fromWord -> y) -> word (max 1 (a + b) - 1) (mul 0 x y b))--  , ("pdiv"        , nlam $ \(fromInteger . finNat' -> a) ->-                     nlam $ \(fromInteger . finNat' -> b) ->-                      lam $ \(fromWord  -> x) ->-                      lam $ \(fromWord  -> y) -> word (toInteger a)-                                                      (fst (divModPoly x a y b)))--  , ("pmod"        , nlam $ \(fromInteger . finNat' -> a) ->-                     nlam $ \(fromInteger . finNat' -> b) ->-                      lam $ \(fromWord  -> x) ->-                      lam $ \(fromWord  -> y) -> word (toInteger b)-                                                      (snd (divModPoly x a y (b+1))))-  , ("random"      , tlam $ \a ->-                      lam $ \(fromWord -> x) -> randomV a x)-  ]----- | Make a numeric constant.-ecDemoteV :: Value-ecDemoteV = nlam $ \valT ->-            nlam $ \bitT ->-            case (valT, bitT) of-              (Nat v, Nat bs) -> VWord (mkBv bs v)-              _ -> evalPanic "Cryptol.Eval.Prim.evalConst"-                       ["Unexpected Inf in constant."-                       , show valT-                       , show bitT-                       ]-----------------------------------------------------------------------------------divModPoly :: Integer -> Int -> Integer -> Int -> (Integer, Integer)-divModPoly xs xsLen ys ysLen-  | ys == 0   = divideByZero-  | otherwise = go 0 initR (xsLen - degree) todoBits--  where-  downIxes n  = [ n - 1, n - 2 .. 0 ]--  degree      = head [ n | n <- downIxes ysLen, testBit ys n ]--  initR       = xs `shiftR` (xsLen - degree)-  nextR r b   = (r `shiftL` 1) .|. (if b then 1 else 0)--  go !res !r !bitN todo =-     let x = xor r ys-         (res',r') | testBit x degree = (res,             r)-                   | otherwise        = (setBit res bitN, x)-     in case todo of-          b : bs -> go res' (nextR r' b) (bitN-1) bs-          []     -> (res',r')--  todoBits  = map (testBit xs) (downIxes (xsLen - degree))----- | Create a packed word-modExp :: Integer -- ^ bit size of the resulting word-       -> Integer -- ^ base-       -> Integer -- ^ exponent-       -> Integer-modExp bits base e-  | bits == 0            = 0-  | base < 0 || bits < 0 = evalPanic "modExp"-                             [ "bad args: "-                             , "  base = " ++ show base-                             , "  e    = " ++ show e-                             , "  bits = " ++ show modulus-                             ]-  | otherwise            = doubleAndAdd base e modulus-  where-  modulus = 0 `setBit` fromInteger bits--doubleAndAdd :: Integer -- ^ base-             -> Integer -- ^ exponent mask-             -> Integer -- ^ modulus-             -> Integer-doubleAndAdd base0 expMask modulus = go 1 base0 expMask-  where-  go acc base k-    | k > 0     = acc' `seq` base' `seq` go acc' base' (k `shiftR` 1)-    | otherwise = acc-    where-    acc' | k `testBit` 0 = acc `modMul` base-         | otherwise     = acc--    base' = base `modMul` base--    modMul x y = (x * y) `mod` modulus------ Operation Lifting -------------------------------------------------------------type GenBinary b w = TValue -> GenValue b w -> GenValue b w -> GenValue b w-type Binary = GenBinary Bool BV--binary :: GenBinary b w -> GenValue b w-binary f = tlam $ \ ty ->-            lam $ \ a  ->-            lam $ \ b  -> f ty a b--type GenUnary b w = TValue -> GenValue b w -> GenValue b w-type Unary = GenUnary Bool BV--unary :: GenUnary b w -> GenValue b w-unary f = tlam $ \ ty ->-           lam $ \ a  -> f ty a----- Arith --------------------------------------------------------------------------- | Turn a normal binop on Integers into one that can also deal with a bitsize.-liftBinArith :: (Integer -> Integer -> Integer) -> BinArith-liftBinArith op _ = op--type BinArith = Integer -> Integer -> Integer -> Integer--arithBinary :: BinArith -> Binary-arithBinary op = loop-  where-  loop ty l r = case ty of--    -- words and finite sequences-    TVSeq w a-      | isTBit a  -> VWord (mkBv w (op w (fromWord l) (fromWord r)))-      | otherwise -> VSeq False (zipWith (loop a) (fromSeq l) (fromSeq r))--    -- streams-    TVStream a -> toStream (zipWith (loop a) (fromSeq l) (fromSeq r))--    -- functions-    TVFun _ ety ->-      lam $ \ x -> loop ety (fromVFun l x) (fromVFun r x)--    -- tuples-    TVTuple tys ->-      let ls = fromVTuple l-          rs = fromVTuple r-       in VTuple (zipWith3 loop tys ls rs)--    -- records-    TVRec fs ->-      VRecord [ (f, loop fty (lookupRecord f l) (lookupRecord f r))-              | (f,fty) <- fs ]--    _ -> evalPanic "arithBinop" ["Invalid arguments"]--arithUnary :: (Integer -> Integer) -> Unary-arithUnary op = loop-  where-  loop ty x = case ty of--    -- words and finite sequences-    TVSeq w a-      | isTBit a  -> VWord (mkBv w (op (fromWord x)))-      | otherwise -> VSeq False (map (loop a) (fromSeq x))--    -- infinite sequences-    TVStream a -> toStream (map (loop a) (fromSeq x))--    -- functions-    TVFun _ ety ->-      lam $ \ y -> loop ety (fromVFun x y)--    -- tuples-    TVTuple tys ->-      let as = fromVTuple x-       in VTuple (zipWith loop tys as)--    -- records-    TVRec fs ->-      VRecord [ (f, loop fty (lookupRecord f x)) | (f,fty) <- fs ]--    _ -> evalPanic "arithUnary" ["Invalid arguments"]--lg2 :: Integer -> Integer-lg2 i = case genLog i 2 of-  Just (i',isExact) | isExact   -> i'-                    | otherwise -> i' + 1-  Nothing                       -> 0--divWrap :: Integral a => a -> a -> a-divWrap _ 0 = divideByZero-divWrap x y = x `div` y--modWrap :: Integral a => a -> a -> a-modWrap _ 0 = divideByZero-modWrap x y = x `mod` y---- Cmp ----------------------------------------------------------------------------- | Lexicographic ordering on two values.-lexCompare :: TValue -> Value -> Value -> Ordering-lexCompare ty l r =-  case ty of-    TVBit         -> compare (fromVBit l) (fromVBit r)-    TVSeq _ TVBit -> compare (fromWord l) (fromWord r)-    TVSeq _ e     -> zipLexCompare (repeat e) (fromSeq l) (fromSeq r)-    TVTuple etys  -> zipLexCompare etys (fromVTuple l) (fromVTuple r)-    TVRec fields  ->-      let tys    = map snd (sortBy (comparing fst) fields)-          ls     = map snd (sortBy (comparing fst) (fromVRecord l))-          rs     = map snd (sortBy (comparing fst) (fromVRecord r))-       in zipLexCompare tys ls rs-    _ -> evalPanic "lexCompare" ["invalid type"]----- XXX the lists are expected to be of the same length, as this should only be--- used with values that come from type-correct expressions.-zipLexCompare :: [TValue] -> [Value] -> [Value] -> Ordering-zipLexCompare tys ls rs = foldr choose EQ (zipWith3 lexCompare tys ls rs)-  where-  choose c acc = case c of-    EQ -> acc-    _  -> c---- | Process two elements based on their lexicographic ordering.-cmpOrder :: (Ordering -> Bool) -> Binary-cmpOrder op ty l r = VBit (op (lexCompare ty l r))--withOrder :: (Ordering -> TValue -> Value -> Value -> Value) -> Binary-withOrder choose ty l r = choose (lexCompare ty l r) ty l r--maxV :: Ordering -> TValue -> Value -> Value -> Value-maxV o _ l r = case o of-  LT -> r-  _  -> l--minV :: Ordering -> TValue -> Value -> Value -> Value-minV o _ l r = case o of-  GT -> r-  _  -> l---funCmp :: (Ordering -> Bool) -> Value-funCmp op =-  tlam $ \ _a ->-  tlam $ \  b ->-   lam $ \  l ->-   lam $ \  r ->-   lam $ \  x -> cmpOrder op b (fromVFun l x) (fromVFun r x)----- Logic -------------------------------------------------------------------------zeroV :: TValue -> Value-zeroV ty = case ty of--  -- bits-  TVBit ->-    VBit False--  -- finite sequences-  TVSeq w ety-    | isTBit ety -> word w 0-    | otherwise  -> toFinSeq ety (replicate (fromInteger w) (zeroV ety))--  -- infinite sequences-  TVStream ety -> toStream (repeat (zeroV ety))--  -- functions-  TVFun _ bty ->-    lam (\ _ -> zeroV bty)--  -- tuples-  TVTuple tys ->-    VTuple (map zeroV tys)--  -- records-  TVRec fields ->-    VRecord [ (f,zeroV fty) | (f,fty) <- fields ]----- | Join a sequence of sequences into a single sequence.-joinV :: Nat' -> Nat' -> TValue -> Value -> Value-joinV parts each a val =-  let len = parts `nMul` each-  in toSeq len a (concatMap fromSeq (fromSeq val))--splitAtV :: Nat' -> Nat' -> TValue -> Value -> Value-splitAtV front back a val =-  case back of--    -- Remember that words are big-endian in cryptol, so the first component-    -- needs to be shifted, and the second component just needs to be masked.-    Nat rightWidth | aBit, VWord (BV _ i) <- val ->-          VTuple [ VWord (BV leftWidth (i `shiftR` fromInteger rightWidth))-                 , VWord (mkBv rightWidth i) ]--    _ ->-      let (ls,rs) = genericSplitAt leftWidth (fromSeq val)-       in VTuple [VSeq aBit ls, toSeq back a rs]--  where--  aBit = isTBit a--  leftWidth = case front of-    Nat n -> n-    _     -> evalPanic "splitAtV" ["invalid `front` len"]----- | Split implementation.-ecSplitV :: Value-ecSplitV =-  nlam $ \ parts ->-  nlam $ \ each  ->-  tlam $ \ a     ->-  lam  $ \ val ->-  let mkChunks f = map (toFinSeq a) $ f $ fromSeq val-  in case (parts, each) of-       (Nat p, Nat e) -> VSeq False $ mkChunks (finChunksOf p e)-       (Inf  , Nat e) -> toStream   $ mkChunks (infChunksOf e)-       _              -> evalPanic "splitV" ["invalid type arguments to split"]---- | Split into infinitely many chunks-infChunksOf :: Integer -> [a] -> [[a]]-infChunksOf each xs = let (as,bs) = genericSplitAt each xs-                      in as : infChunksOf each bs---- | Split into finitely many chunks-finChunksOf :: Integer -> Integer -> [a] -> [[a]]-finChunksOf 0 _ _ = []-finChunksOf parts each xs = let (as,bs) = genericSplitAt each xs-                            in as : finChunksOf (parts - 1) each bs---ccatV :: Nat' -> Nat' -> TValue -> Value -> Value -> Value-ccatV _front _back (isTBit -> True) (VWord (BV i x)) (VWord (BV j y)) =-  VWord (BV (i + j) (shiftL x (fromInteger j) + y))-ccatV front back elty l r =-  toSeq (evalTF TCAdd [front,back]) elty (fromSeq l ++ fromSeq r)---- | Merge two values given a binop.  This is used for and, or and xor.-logicBinary :: (forall a. Bits a => a -> a -> a) -> Binary-logicBinary op = loop-  where-  loop ty l r = case ty of-    TVBit -> VBit (op (fromVBit l) (fromVBit r))-    -- words or finite sequences-    TVSeq w aty-      | isTBit aty -> VWord (BV w (op (fromWord l) (fromWord r)))-                      -- We assume that bitwise ops do not need re-masking-      | otherwise -> VSeq False (zipWith (loop aty) (fromSeq l)-                                                    (fromSeq r))--    -- streams-    TVStream aty -> toStream (zipWith (loop aty) (fromSeq l) (fromSeq r))--    TVTuple etys ->-      let ls = fromVTuple l-          rs = fromVTuple r-       in VTuple (zipWith3 loop etys ls rs)--    TVFun _ bty ->-      lam $ \ a -> loop bty (fromVFun l a) (fromVFun r a)--    TVRec fields ->-      VRecord [ (f,loop fty a b) | (f,fty) <- fields-                                 , let a = lookupRecord f l-                                       b = lookupRecord f r-                                 ]--logicUnary :: (forall a. Bits a => a -> a) -> Unary-logicUnary op = loop-  where-  loop ty val = case ty of-    TVBit -> VBit (op (fromVBit val))--    -- words or finite sequences-    TVSeq w ety-      | isTBit ety -> VWord (mkBv w (op (fromWord val)))-      | otherwise -> VSeq False (map (loop ety) (fromSeq val))--    -- streams-    TVStream ety -> toStream (map (loop ety) (fromSeq val))--    TVTuple etys ->-      let as = fromVTuple val-       in VTuple (zipWith loop etys as)--    TVFun _ bty ->-      lam $ \ a -> loop bty (fromVFun val a)--    TVRec fields ->-      VRecord [ (f,loop fty a) | (f,fty) <- fields, let a = lookupRecord f val ]---logicShift :: (Integer -> Integer -> Integer -> Integer)-              -- ^ The function may assume its arguments are masked.-              -- It is responsible for masking its result if needed.-           -> (Nat' -> TValue -> [Value] -> Integer -> [Value])-           -> Value-logicShift opW opS-  = nlam $ \ a ->-    tlam $ \ _ ->-    tlam $ \ c ->-     lam  $ \ l ->-     lam  $ \ r ->-        if isTBit c-          then -- words-            let BV w i  = fromVWord l-            in VWord (BV w (opW w i (fromWord r)))--          else toSeq a c (opS a c (fromSeq l) (fromWord r))---- Left shift for words.-shiftLW :: Integer -> Integer -> Integer -> Integer-shiftLW w ival by-  | by >= w   = 0-  | otherwise = mask w (shiftL ival (fromInteger by))--shiftLS :: Nat' -> TValue -> [Value] -> Integer -> [Value]-shiftLS w ety vs by =-  case w of-    Nat len-      | by < len  -> genericTake len (genericDrop by vs ++ repeat (zeroV ety))-      | otherwise -> genericReplicate len (zeroV ety)-    Inf           -> genericDrop by vs--shiftRW :: Integer -> Integer -> Integer -> Integer-shiftRW w i by-  | by >= w   = 0-  | otherwise = shiftR i (fromInteger by)--shiftRS :: Nat' -> TValue -> [Value] -> Integer -> [Value]-shiftRS w ety vs by =-  case w of-    Nat len-      | by < len  -> genericTake len (genericReplicate by (zeroV ety) ++ vs)-      | otherwise -> genericReplicate len (zeroV ety)-    Inf           -> genericReplicate by (zeroV ety) ++ vs---- XXX integer doesn't implement rotateL, as there's no bit bound-rotateLW :: Integer -> Integer -> Integer -> Integer-rotateLW 0 i _  = i-rotateLW w i by = mask w $ (i `shiftL` b) .|. (i `shiftR` (fromInteger w - b))-  where b = fromInteger (by `mod` w)--rotateLS :: Nat' -> TValue -> [Value] -> Integer -> [Value]-rotateLS w _ vs at =-  case w of-    Nat len -> let at'     = at `mod` len-                   (ls,rs) = genericSplitAt at' vs-                in rs ++ ls-    _ -> panic "Cryptol.Eval.Prim.rotateLS" [ "unexpected infinite sequence" ]---- XXX integer doesn't implement rotateR, as there's no bit bound-rotateRW :: Integer -> Integer -> Integer -> Integer-rotateRW 0 i _  = i-rotateRW w i by = mask w $ (i `shiftR` b) .|. (i `shiftL` (fromInteger w - b))-  where b = fromInteger (by `mod` w)--rotateRS :: Nat' -> TValue -> [Value] -> Integer -> [Value]-rotateRS w _ vs at =-  case w of-    Nat len -> let at'     = at `mod` len-                   (ls,rs) = genericSplitAt (len - at') vs-                in rs ++ ls-    _ -> panic "Cryptol.Eval.Prim.rotateRS" [ "unexpected infinite sequence" ]----- Sequence Primitives ------------------------------------------------------------- | Indexing operations that return one element.-indexPrimOne :: (Maybe Integer -> [Value] -> Integer -> Value) -> Value-indexPrimOne op =-  nlam $ \ n  ->-  tlam $ \ _a ->-  nlam $ \ _i ->-   lam $ \ l  ->-   lam $ \ r  ->-     let vs  = fromSeq l-         ix  = fromWord r-      in op (fromNat n) vs ix--indexFront :: Maybe Integer -> [Value] -> Integer -> Value-indexFront mblen vs ix =-  case mblen of-    Just len | len <= ix -> invalidIndex ix-    _                    -> genericIndex vs ix--indexBack :: Maybe Integer -> [Value] -> Integer -> Value-indexBack mblen vs ix =-  case mblen of-    Just len | len > ix  -> genericIndex vs (len - ix - 1)-             | otherwise -> invalidIndex ix-    Nothing              -> evalPanic "indexBack"-                            ["unexpected infinite sequence"]---- | Indexing operations that return many elements.-indexPrimMany :: (Maybe Integer -> [Value] -> [Integer] -> [Value]) -> Value-indexPrimMany op =-  nlam $ \ n  ->-  tlam $ \ a  ->-  nlam $ \ m  ->-  tlam $ \ _i ->-   lam $ \ l  ->-   lam $ \ r  ->-     let vs    = fromSeq l-         ixs   = map fromWord (fromSeq r)-     in toSeq m a (op (fromNat (n)) vs ixs)--indexFrontRange :: Maybe Integer -> [Value] -> [Integer] -> [Value]-indexFrontRange mblen vs = map (indexFront mblen vs)--indexBackRange :: Maybe Integer -> [Value] -> [Integer] -> [Value]-indexBackRange mblen vs = map (indexBack mblen vs)---- @[ 0, 1 .. ]@-fromThenV :: Value-fromThenV  =-  nlam $ \ first ->-  nlam $ \ next  ->-  nlam $ \ bits  ->-  nlam $ \ len   ->-    case (first, next, len, bits) of-      (_         , _        , _       , Nat bits')-        | bits' >= Arch.maxBigIntWidth -> wordTooWide bits'-      (Nat first', Nat next', Nat len', Nat bits') ->-        let nums = enumFromThen first' next'-         in VSeq False (genericTake len' (map (VWord . BV bits') nums))-      _ -> evalPanic "fromThenV" ["invalid arguments"]---- @[ 0 .. 10 ]@-fromToV :: Value-fromToV  =-  nlam $ \ first ->-  nlam $ \ lst   ->-  nlam $ \ bits  ->-    case (first, lst, bits) of-      (_         , _       , Nat bits')-        | bits' >= Arch.maxBigIntWidth -> wordTooWide bits'-      (Nat first', Nat lst', Nat bits') ->-        let nums = enumFromThenTo first' (first' + 1) lst'-            len  = 1 + (lst' - first')-         in VSeq False (genericTake len (map (VWord . BV bits') nums))--      _ -> evalPanic "fromThenV" ["invalid arguments"]---- @[ 0, 1 .. 10 ]@-fromThenToV :: Value-fromThenToV  =-  nlam $ \ first ->-  nlam $ \ next  ->-  nlam $ \ lst   ->-  nlam $ \ bits  ->-  nlam $ \ len   ->-    case (first, next, lst, len, bits) of-      (_         , _        , _       , _       , Nat bits')-        | bits' >= Arch.maxBigIntWidth -> wordTooWide bits'-      (Nat first', Nat next', Nat lst', Nat len', Nat bits') ->-        let nums = enumFromThenTo first' next' lst'-         in VSeq False (genericTake len' (map (VWord . BV bits') nums))--      _ -> evalPanic "fromThenV" ["invalid arguments"]---- Random Values ------------------------------------------------------------------- | Produce a random value with the given seed. If we do not support--- making values of the given type, return zero of that type.--- TODO: do better than returning zero-randomV :: TValue -> Integer -> Value-randomV ty seed =-  case randomValue (tValTy ty) of-    Nothing -> zeroV ty-    Just gen ->-      -- unpack the seed into four Word64s-      let mask64 = 0xFFFFFFFFFFFFFFFF-          unpack s = fromIntegral (s .&. mask64) : unpack (s `shiftR` 64)-          [a, b, c, d] = take 4 (unpack seed)-      in fst $ gen 100 $ seedTFGen (a, b, c, d)+{-# LANGUAGE LambdaCase #-}+{-# LANGUAGE Trustworthy #-}+{-# LANGUAGE TupleSections #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE RecordWildCards #-}+{-# LANGUAGE Rank2Types #-}+{-# LANGUAGE PatternGuards #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE ViewPatterns #-}+{-# LANGUAGE BangPatterns #-}+{-# OPTIONS_GHC -fno-warn-orphans #-}+module Cryptol.Prims.Eval where++import Control.Monad (join, unless)++import Cryptol.TypeCheck.AST+import Cryptol.TypeCheck.Solver.InfNat (Nat'(..),fromNat,genLog, nMul)+import qualified Cryptol.Eval.Arch as Arch+import Cryptol.Eval.Monad+import Cryptol.Eval.Type+import Cryptol.Eval.Value+import Cryptol.Testing.Random (randomValue)+import Cryptol.Utils.Panic (panic)+import Cryptol.ModuleSystem.Name (asPrim)+import Cryptol.Utils.Ident (Ident,mkIdent)+import Cryptol.Utils.PP++import qualified Data.Foldable as Fold+import Data.List (sortBy)+import qualified Data.Sequence as Seq+import Data.Ord (comparing)+import Data.Bits (Bits(..))++import qualified Data.Map.Strict as Map+import qualified Data.Text as T++import System.Random.TF.Gen (seedTFGen)++-- Primitives ------------------------------------------------------------------++instance EvalPrims Bool BV where+  evalPrim Decl { dName = n, .. }+    | Just prim <- asPrim n, Just val <- Map.lookup prim primTable = val++  evalPrim Decl { .. } =+      panic "Eval" [ "Unimplemented primitive", show dName ]++  iteValue b t f = if b then t else f+++primTable :: Map.Map Ident Value+primTable = Map.fromList $ map (\(n, v) -> (mkIdent (T.pack n), v))+  [ ("+"          , {-# SCC "Prelude::(+)" #-}+                    binary (arithBinary (liftBinArith (+))))+  , ("-"          , {-# SCC "Prelude::(-)" #-}+                    binary (arithBinary (liftBinArith (-))))+  , ("*"          , {-# SCC "Prelude::(*)" #-}+                    binary (arithBinary (liftBinArith (*))))+  , ("/"          , {-# SCC "Prelude::(/)" #-}+                    binary (arithBinary (liftDivArith div)))+  , ("%"          , {-# SCC "Prelude::(%)" #-}+                    binary (arithBinary (liftDivArith mod)))+  , ("^^"         , {-# SCC "Prelude::(^^)" #-}+                    binary (arithBinary modExp))+  , ("lg2"        , {-# SCC "Prelude::lg2" #-}+                    unary  (arithUnary (liftUnaryArith lg2)))+  , ("negate"     , {-# SCC "Prelude::negate" #-}+                    unary  (arithUnary (liftUnaryArith negate)))+  , ("<"          , {-# SCC "Prelude::(<)" #-}+                    binary (cmpOrder "<"  (\o -> o == LT           )))+  , (">"          , {-# SCC "Prelude::(>)" #-}+                    binary (cmpOrder ">"  (\o -> o == GT           )))+  , ("<="         , {-# SCC "Prelude::(<=)" #-}+                    binary (cmpOrder "<=" (\o -> o == LT || o == EQ)))+  , (">="         , {-# SCC "Prelude::(>=)" #-}+                    binary (cmpOrder ">=" (\o -> o == GT || o == EQ)))+  , ("=="         , {-# SCC "Prelude::(==)" #-}+                    binary (cmpOrder "==" (\o ->            o == EQ)))+  , ("!="         , {-# SCC "Prelude::(!=)" #-}+                    binary (cmpOrder "!=" (\o ->            o /= EQ)))+  , ("&&"         , {-# SCC "Prelude::(&&)" #-}+                    binary (logicBinary (.&.) (binBV (.&.))))+  , ("||"         , {-# SCC "Prelude::(||)" #-}+                    binary (logicBinary (.|.) (binBV (.|.))))+  , ("^"          , {-# SCC "Prelude::(^)" #-}+                    binary (logicBinary xor (binBV xor)))+  , ("complement" , {-# SCC "Prelude::complement" #-}+                    unary  (logicUnary complement (unaryBV complement)))+  , ("<<"         , {-# SCC "Prelude::(<<)" #-}+                    logicShift shiftLW shiftLB shiftLS)+  , (">>"         , {-# SCC "Prelude::(>>)" #-}+                    logicShift shiftRW shiftRB shiftRS)+  , ("<<<"        , {-# SCC "Prelude::(<<<)" #-}+                    logicShift rotateLW rotateLB rotateLS)+  , (">>>"        , {-# SCC "Prelude::(>>>)" #-}+                    logicShift rotateRW rotateRB rotateRS)+  , ("True"       , VBit True)+  , ("False"      , VBit False)++  , ("demote"     , {-# SCC "Prelude::demote" #-}+                    ecDemoteV)++  , ("#"          , {-# SCC "Prelude::(#)" #-}+                    nlam $ \ front ->+                    nlam $ \ back  ->+                    tlam $ \ elty  ->+                    lam  $ \ l     -> return $+                    lam  $ \ r     -> join (ccatV front back elty <$> l <*> r))++  , ("@"          , {-# SCC "Prelude::(@)" #-}+                    indexPrimOne  indexFront_bits indexFront)+  , ("@@"         , {-# SCC "Prelude::(@@)" #-}+                    indexPrimMany indexFront_bits indexFront)+  , ("!"          , {-# SCC "Prelude::(!)" #-}+                    indexPrimOne  indexBack_bits indexBack)+  , ("!!"         , {-# SCC "Prelude::(!!)" #-}+                    indexPrimMany indexBack_bits indexBack)++  , ("update"     , {-# SCC "Prelude::update" #-}+                    updatePrim updateFront_bits updateFront)++  , ("updateEnd"  , {-# SCC "Prelude::updateEnd" #-}+                    updatePrim updateBack_bits updateBack)++  , ("zero"       , {-# SCC "Prelude::zero" #-}+                    tlam zeroV)++  , ("join"       , {-# SCC "Prelude::join" #-}+                    nlam $ \ parts ->+                    nlam $ \ (finNat' -> each)  ->+                    tlam $ \ a     ->+                    lam  $ \ x     ->+                      joinV parts each a =<< x)++  , ("split"      , {-# SCC "Prelude::split" #-}+                    ecSplitV)++  , ("splitAt"    , {-# SCC "Prelude::splitAt" #-}+                    nlam $ \ front ->+                    nlam $ \ back  ->+                    tlam $ \ a     ->+                    lam  $ \ x     ->+                       splitAtV front back a =<< x)++  , ("fromThen"   , {-# SCC "Prelude::fromThen" #-}+                    fromThenV)+  , ("fromTo"     , {-# SCC "Prelude::fromTo" #-}+                    fromToV)+  , ("fromThenTo" , {-# SCC "Prelude::fromThenTo" #-}+                    fromThenToV)+  , ("infFrom"    , {-# SCC "Prelude::infFrom" #-}+                    infFromV)+  , ("infFromThen", {-# SCC "Prelude::infFromThen" #-}+                    infFromThenV)++  , ("error"      , {-# SCC "Prelude::error" #-}+                      tlam $ \a ->+                      nlam $ \_ ->+                       lam $ \s -> errorV a =<< (fromStr =<< s))++  , ("reverse"    , {-# SCC "Prelude::reverse" #-}+                    nlam $ \_a ->+                    tlam $ \_b ->+                     lam $ \xs -> reverseV =<< xs)++  , ("transpose"  , {-# SCC "Prelude::transpose" #-}+                    nlam $ \a ->+                    nlam $ \b ->+                    tlam $ \c ->+                     lam $ \xs -> transposeV a b c =<< xs)++  , ("pmult"       , {-# SCC "Prelude::pmult" #-}+    let mul !res !_ !_ 0 = res+        mul  res bs as n = mul (if even as then res else xor res bs)+                               (bs `shiftL` 1) (as `shiftR` 1) (n-1)+     in nlam $ \(finNat' -> a) ->+        nlam $ \(finNat' -> b) ->+        wlam $ \(bvVal -> x) -> return $+        wlam $ \(bvVal -> y) -> return $ word (1 + a + b) (mul 0 x y (1+b)))++  , ("pdiv"        , {-# SCC "Prelude::pdiv" #-}+                     nlam $ \(fromInteger . finNat' -> a) ->+                     nlam $ \(fromInteger . finNat' -> b) ->+                     wlam $ \(bvVal -> x) -> return $+                     wlam $ \(bvVal -> y) ->+                       if y == 0+                        then divideByZero+                        else return . word (toInteger a) . fst+                               $ divModPoly x a y b)++  , ("pmod"        , {-# SCC "Prelude::pmod" #-}+                     nlam $ \(fromInteger . finNat' -> a) ->+                     nlam $ \(fromInteger . finNat' -> b) ->+                     wlam $ \(bvVal -> x) -> return $+                     wlam $ \(bvVal -> y) ->+                       if y == 0+                         then divideByZero+                         else return . word (toInteger b) . snd+                                $ divModPoly x a y (b+1))++  , ("random"      , {-# SCC "Prelude::random" #-}+                     tlam $ \a ->+                     wlam $ \(bvVal -> x) -> return $ randomV a x)+  , ("trace"       , {-# SCC "Prelude::trace" #-}+                     nlam $ \_n ->+                     tlam $ \_a ->+                     tlam $ \_b ->+                      lam $ \s -> return $+                      lam $ \x -> return $+                      lam $ \y -> do+                         msg <- fromStr =<< s+                         -- FIXME? get PPOPts from elsewhere?+                         doc <- ppValue defaultPPOpts =<< x+                         yv <- y+                         io $ putStrLn $ show $ if null msg then+                                                  doc+                                                else+                                                  text msg <+> doc+                         return yv)+  ]+++-- | Make a numeric constant.+ecDemoteV :: BitWord b w => GenValue b w+ecDemoteV = nlam $ \valT ->+            nlam $ \bitT ->+            case (valT, bitT) of+              (Nat v, Nat bs) -> word bs v+              _ -> evalPanic "Cryptol.Eval.Prim.evalConst"+                       ["Unexpected Inf in constant."+                       , show valT+                       , show bitT+                       ]++--------------------------------------------------------------------------------+divModPoly :: Integer -> Int -> Integer -> Int -> (Integer, Integer)+divModPoly xs xsLen ys ysLen+  | ys == 0         = panic "divModPoly"+                             [ "Uncaught divide-by-zero condition" ]+  | degree <= xsLen = go 0 initR (xsLen - degree) todoBits+  | otherwise       = (0, xs) -- xs is already a residue, just return it++  where+  downIxes n  = [ n - 1, n - 2 .. 0 ]++  degree      = head [ n | n <- downIxes ysLen, testBit ys n ]++  initR       = xs `shiftR` (xsLen - degree)+  nextR r b   = (r `shiftL` 1) .|. (if b then 1 else 0)++  go !res !r !bitN todo =+     let x = xor r ys+         (res',r') | testBit x degree = (res,             r)+                   | otherwise        = (setBit res bitN, x)+     in case todo of+          b : bs -> go res' (nextR r' b) (bitN-1) bs+          []     -> (res',r')++  todoBits  = map (testBit xs) (downIxes (xsLen - degree))+++-- | Create a packed word+modExp :: Integer -- ^ bit size of the resulting word+       -> BV      -- ^ base+       -> BV      -- ^ exponent+       -> Eval BV+modExp bits (BV _ base) (BV _ e)+  | bits == 0            = ready $ BV bits 0+  | base < 0 || bits < 0 = evalPanic "modExp"+                             [ "bad args: "+                             , "  base = " ++ show base+                             , "  e    = " ++ show e+                             , "  bits = " ++ show modulus+                             ]+  | otherwise            = ready $ mkBv bits $ doubleAndAdd base e modulus+  where+  modulus = 0 `setBit` fromInteger bits+++doubleAndAdd :: Integer -- ^ base+             -> Integer -- ^ exponent mask+             -> Integer -- ^ modulus+             -> Integer+doubleAndAdd base0 expMask modulus = go 1 base0 expMask+  where+  go acc base k+    | k > 0     = acc' `seq` base' `seq` go acc' base' (k `shiftR` 1)+    | otherwise = acc+    where+    acc' | k `testBit` 0 = acc `modMul` base+         | otherwise     = acc++    base' = base `modMul` base++    modMul x y = (x * y) `mod` modulus++++-- Operation Lifting -----------------------------------------------------------++type Binary b w = TValue -> GenValue b w -> GenValue b w -> Eval (GenValue b w)++binary :: Binary b w -> GenValue b w+binary f = tlam $ \ ty ->+            lam $ \ a  -> return $+            lam $ \ b  -> do+               --io $ putStrLn "Entering a binary function"+               join (f ty <$> a <*> b)++type Unary b w = TValue -> GenValue b w -> Eval (GenValue b w)++unary :: Unary b w -> GenValue b w+unary f = tlam $ \ ty ->+           lam $ \ a  -> f ty =<< a+++-- Arith -----------------------------------------------------------------------++-- | Turn a normal binop on Integers into one that can also deal with a bitsize.+liftBinArith :: (Integer -> Integer -> Integer) -> BinArith BV+liftBinArith op w (BV _ x) (BV _ y) = ready $ mkBv w $ op x y++-- | Turn a normal binop on Integers into one that can also deal with a bitsize.+--   Generate a thunk that throws a divide by 0 error when forced if the second+--   argument is 0.+liftDivArith :: (Integer -> Integer -> Integer) -> BinArith BV+liftDivArith _  _ _        (BV _ 0) = divideByZero+liftDivArith op w (BV _ x) (BV _ y) = ready $ mkBv w $ op x y++type BinArith w = Integer -> w -> w -> Eval w++arithBinary :: forall b w+             . BitWord b w+            => BinArith w+            -> Binary b w+arithBinary op = loop+  where+  loop' :: TValue+        -> Eval (GenValue b w)+        -> Eval (GenValue b w)+        -> Eval (GenValue b w)+  loop' ty l r = join (loop ty <$> l <*> r)++  loop :: TValue+       -> GenValue b w+       -> GenValue b w+       -> Eval (GenValue b w)+  loop ty l r = case ty of+    TVBit ->+      evalPanic "arithBinary" ["Bit not in class Arith"]++    TVSeq w a+      -- words and finite sequences+      | isTBit a -> do+                  lw <- fromVWord "arithLeft" l+                  rw <- fromVWord "arithRight" r+                  return $ VWord w (WordVal <$> op w lw rw)+      | otherwise -> VSeq w <$> (join (zipSeqMap (loop a) <$>+                                      (fromSeq "arithBinary left" l) <*>+                                      (fromSeq "arithBinary right" r)))++    TVStream a ->+      -- streams+      VStream <$> (join (zipSeqMap (loop a) <$>+                             (fromSeq "arithBinary left" l) <*>+                             (fromSeq "arithBinary right" r)))++    -- functions+    TVFun _ ety ->+      return $ lam $ \ x -> loop' ety (fromVFun l x) (fromVFun r x)++    -- tuples+    TVTuple tys ->+      let ls = fromVTuple l+          rs = fromVTuple r+       in return $ VTuple (zipWith3 loop' tys ls rs)++    -- records+    TVRec fs ->+      return $ VRecord [ (f, loop' fty (lookupRecord f l) (lookupRecord f r))+                       | (f,fty) <- fs ]++type UnaryArith w = Integer -> w -> Eval w++liftUnaryArith :: (Integer -> Integer) -> UnaryArith BV+liftUnaryArith op w (BV _ x) = ready $ mkBv w $ op x++arithUnary :: forall b w+            . BitWord b w+           => UnaryArith w+           -> Unary b w+arithUnary op = loop+  where+  loop' :: TValue -> Eval (GenValue b w) -> Eval (GenValue b w)+  loop' ty x = loop ty =<< x++  loop :: TValue -> GenValue b w -> Eval (GenValue b w)+  loop ty x = case ty of++    TVBit ->+      evalPanic "arithUnary" ["Bit not in class Arith"]++    TVSeq w a+      -- words and finite sequences+      | isTBit a -> do+              wx <- fromVWord "arithUnary" x+              return $ VWord w (WordVal <$> op w wx)+      | otherwise -> VSeq w <$> (mapSeqMap (loop a) =<< fromSeq "arithUnary" x)++    TVStream a ->+      VStream <$> (mapSeqMap (loop a) =<< fromSeq "arithUnary" x)++    -- functions+    TVFun _ ety ->+      return $ lam $ \ y -> loop' ety (fromVFun x y)++    -- tuples+    TVTuple tys ->+      let as = fromVTuple x+       in return $ VTuple (zipWith loop' tys as)++    -- records+    TVRec fs ->+      return $ VRecord [ (f, loop' fty (lookupRecord f x)) | (f,fty) <- fs ]++--    | otherwise = evalPanic "arithUnary" ["Invalid arguments"]+++lg2 :: Integer -> Integer+lg2 i = case genLog i 2 of+  Just (i',isExact) | isExact   -> i'+                    | otherwise -> i' + 1+  Nothing                       -> 0++-- Cmp -------------------------------------------------------------------------++-- | Lexicographic ordering on two values.+lexCompare :: String -> TValue -> Value -> Value -> Eval Ordering+lexCompare nm ty l r = case ty of++  TVBit ->+    return $ compare (fromVBit l) (fromVBit r)++  TVSeq _ TVBit ->+    compare <$> (fromWord "compareLeft" l) <*> (fromWord "compareRight" r)++  TVSeq w e ->+      join (zipLexCompare nm (repeat e) <$>+               (enumerateSeqMap w <$> fromSeq "lexCompare left" l) <*>+               (enumerateSeqMap w <$> fromSeq "lexCompare right" r))++  -- tuples+  TVTuple etys ->+    zipLexCompare nm etys (fromVTuple l) (fromVTuple r)++  -- records+  TVRec fields ->+    let tys    = map snd (sortBy (comparing fst) fields)+        ls     = map snd (sortBy (comparing fst) (fromVRecord l))+        rs     = map snd (sortBy (comparing fst) (fromVRecord r))+     in zipLexCompare nm tys ls rs++  _ -> evalPanic "lexCompare" ["invalid type"]+++-- XXX the lists are expected to be of the same length, as this should only be+-- used with values that come from type-correct expressions.+zipLexCompare :: String -> [TValue] -> [Eval Value] -> [Eval Value] -> Eval Ordering+zipLexCompare nm tys ls rs = foldr choose (return EQ) (zipWith3 lexCompare' tys ls rs)+  where+  lexCompare' t l r = join (lexCompare nm t <$> l <*> r)++  choose c acc = c >>= \c' -> case c' of+    EQ -> acc+    _  -> return c'++-- | Process two elements based on their lexicographic ordering.+cmpOrder :: String -> (Ordering -> Bool) -> Binary Bool BV+cmpOrder nm op ty l r = VBit . op <$> lexCompare nm ty l r++withOrder :: String -> (Ordering -> TValue -> Value -> Value -> Value) -> Binary Bool BV+withOrder nm choose ty l r =+  do ord <- lexCompare nm ty l r+     return $ choose ord ty l r++maxV :: Ordering -> TValue -> Value -> Value -> Value+maxV o _ l r = case o of+  LT -> r+  _  -> l++minV :: Ordering -> TValue -> Value -> Value -> Value+minV o _ l r = case o of+  GT -> r+  _  -> l+++funCmp :: (Ordering -> Bool) -> Value+funCmp op =+  tlam $ \ _a ->+  tlam $ \  b ->+   lam $ \  l -> return $+   lam $ \  r -> return $+   lam $ \  x -> do+      l' <- l+      r' <- r+      x' <- x+      fl <- fromVFun l' (ready x')+      fr <- fromVFun r' (ready x')+      cmpOrder "funCmp" op b fl fr+++-- Logic -----------------------------------------------------------------------++zeroV :: forall b w+       . BitWord b w+      => TValue+      -> GenValue b w+zeroV ty = case ty of++  -- bits+  TVBit ->+    VBit (bitLit False)++  -- sequences+  TVSeq w ety+      | isTBit ety -> word w 0+      | otherwise  -> VSeq w (IndexSeqMap $ \_ -> ready $ zeroV ety)++  TVStream ety ->+    VStream (IndexSeqMap $ \_ -> ready $ zeroV ety)++  -- functions+  TVFun _ bty ->+    lam (\ _ -> ready (zeroV bty))++  -- tuples+  TVTuple tys ->+    VTuple (map (ready . zeroV) tys)++  -- records+  TVRec fields ->+    VRecord [ (f,ready $ zeroV fty) | (f,fty) <- fields ]++--  | otherwise = evalPanic "zeroV" ["invalid type for zero"]+++joinWordVal :: BitWord b w =>+            WordValue b w -> WordValue b w -> WordValue b w+joinWordVal (WordVal w1) (WordVal w2) = WordVal $ joinWord w1 w2+joinWordVal w1 w2 = BitsVal $ (asBitsVal w1) Seq.>< (asBitsVal w2)++joinWords :: forall b w+           . BitWord b w+          => Integer+          -> Integer+          -> SeqMap b w+          -> Eval (GenValue b w)+joinWords nParts nEach xs =+  loop (ready $ WordVal (wordLit 0 0)) (enumerateSeqMap nParts xs)++ where+ loop :: Eval (WordValue b w) -> [Eval (GenValue b w)] -> Eval (GenValue b w)+ loop !wv [] = return $ VWord (nParts * nEach) wv+ loop !wv (w : ws) = do+    w >>= \case+      VWord _ w' -> loop (joinWordVal <$> wv <*> w') ws+      _ -> evalPanic "joinWords: expected word value" []+++joinSeq :: BitWord b w+        => Nat'+        -> Integer+        -> TValue+        -> SeqMap b w+        -> Eval (GenValue b w)++-- Special case for 0 length inner sequences.+joinSeq _parts 0 a _xs+  = return $ zeroV (TVSeq 0 a)++-- finite sequence of words+joinSeq (Nat parts) each TVBit xs+  = joinWords parts each xs++-- infinite sequence of words+joinSeq Inf each TVBit xs+  = return $ VStream $ IndexSeqMap $ \i -> do+      let (q,r) = divMod i each+      ys <- fromWordVal "join seq" =<< lookupSeqMap xs q+      VBit <$> (asBitsVal ys `Seq.index` fromInteger r)++-- finite or infinite sequence of non-words+joinSeq parts each _a xs+  = return $ vSeq $ IndexSeqMap $ \i -> do+      let (q,r) = divMod i each+      ys <- fromSeq "join seq" =<< lookupSeqMap xs q+      lookupSeqMap ys r+  where+  len = parts `nMul` (Nat each)+  vSeq = case len of+           Inf    -> VStream+           Nat n  -> VSeq n+++-- | Join a sequence of sequences into a single sequence.+joinV :: BitWord b w+      => Nat'+      -> Integer+      -> TValue+      -> GenValue b w+      -> Eval (GenValue b w)+joinV parts each a val = joinSeq parts each a =<< fromSeq "joinV" val+++splitWordVal :: BitWord b w+             => Integer+             -> Integer+             -> WordValue b w+             -> (WordValue b w, WordValue b w)+splitWordVal leftWidth rightWidth (WordVal w) =+  let (lw, rw) = splitWord leftWidth rightWidth w+   in (WordVal lw, WordVal rw)+splitWordVal leftWidth _rightWidth (BitsVal bs) =+  let (lbs, rbs) = Seq.splitAt (fromInteger leftWidth) bs+   in (BitsVal lbs, BitsVal rbs)++splitAtV :: BitWord b w+         => Nat'+         -> Nat'+         -> TValue+         -> GenValue b w+         -> Eval (GenValue b w)+splitAtV front back a val =+  case back of++    Nat rightWidth | aBit -> do+          ws <- delay Nothing (splitWordVal leftWidth rightWidth <$> fromWordVal "splitAtV" val)+          return $ VTuple+                   [ VWord leftWidth  . ready . fst <$> ws+                   , VWord rightWidth . ready . snd <$> ws+                   ]++    Inf | aBit -> do+       vs <- delay Nothing (fromSeq "splitAtV" val)+       ls <- delay Nothing (do m <- fst . splitSeqMap leftWidth <$> vs+                               let ms = map (fromVBit <$>) (enumerateSeqMap leftWidth m)+                               return $ Seq.fromList $ ms)+       rs <- delay Nothing (snd . splitSeqMap leftWidth <$> vs)+       return $ VTuple [ return $ VWord leftWidth (BitsVal <$> ls)+                       , VStream <$> rs+                       ]++    _ -> do+       vs <- delay Nothing (fromSeq "splitAtV" val)+       ls <- delay Nothing (fst . splitSeqMap leftWidth <$> vs)+       rs <- delay Nothing (snd . splitSeqMap leftWidth <$> vs)+       return $ VTuple [ VSeq leftWidth <$> ls+                       , mkSeq back a <$> rs+                       ]++  where+  aBit = isTBit a++  leftWidth = case front of+    Nat n -> n+    _     -> evalPanic "splitAtV" ["invalid `front` len"]+++extractWordVal :: BitWord b w+               => Integer+               -> Integer+               -> WordValue b w+               -> WordValue b w+extractWordVal len start (WordVal w) =+   WordVal $ extractWord len start w+extractWordVal len start (BitsVal bs) =+   BitsVal $ Seq.take (fromInteger len) $+     Seq.drop (Seq.length bs - fromInteger start - fromInteger len) bs+++-- | Split implementation.+ecSplitV :: BitWord b w+         => GenValue b w+ecSplitV =+  nlam $ \ parts ->+  nlam $ \ each  ->+  tlam $ \ a     ->+  lam  $ \ val ->+    case (parts, each) of+       (Nat p, Nat e) | isTBit a -> do+          VWord _ val' <- val+          return $ VSeq p $ IndexSeqMap $ \i -> do+            return $ VWord e (extractWordVal e ((p-i-1)*e) <$> val')+       (Inf, Nat e) | isTBit a -> do+          val' <- delay Nothing (fromSeq "ecSplitV" =<< val)+          return $ VStream $ IndexSeqMap $ \i ->+            return $ VWord e $ return $ BitsVal $ Seq.fromFunction (fromInteger e) $ \j ->+              let idx = i*e + toInteger j+               in idx `seq` do+                      xs <- val'+                      fromVBit <$> lookupSeqMap xs idx+       (Nat p, Nat e) -> do+          val' <- delay Nothing (fromSeq "ecSplitV" =<< val)+          return $ VSeq p $ IndexSeqMap $ \i ->+            return $ VSeq e $ IndexSeqMap $ \j -> do+              xs <- val'+              lookupSeqMap xs (e * i + j)+       (Inf  , Nat e) -> do+          val' <- delay Nothing (fromSeq "ecSplitV" =<< val)+          return $ VStream $ IndexSeqMap $ \i ->+            return $ VSeq e $ IndexSeqMap $ \j -> do+              xs <- val'+              lookupSeqMap xs (e * i + j)+       _              -> evalPanic "splitV" ["invalid type arguments to split"]+++reverseV :: forall b w+          . BitWord b w+         => GenValue b w+         -> Eval (GenValue b w)+reverseV (VSeq n xs) =+  return $ VSeq n $ reverseSeqMap n xs+reverseV (VWord n wv) = return (VWord n (revword <$> wv))+ where+ revword (WordVal w)  = BitsVal $ Seq.reverse $ Seq.fromList $ map ready $ unpackWord w+ revword (BitsVal bs) = BitsVal $ Seq.reverse bs+reverseV _ =+  evalPanic "reverseV" ["Not a finite sequence"]+++transposeV :: BitWord b w+           => Nat'+           -> Nat'+           -> TValue+           -> GenValue b w+           -> Eval (GenValue b w)+transposeV a b c xs+  | isTBit c, Nat na <- a = -- Fin a => [a][b]Bit -> [b][a]Bit+      return $ bseq $ IndexSeqMap $ \bi ->+        return $ VWord na $ return $ BitsVal $+          Seq.fromFunction (fromInteger na) $ \ai -> do+            ys <- flip lookupSeqMap (toInteger ai) =<< fromSeq "transposeV" xs+            case ys of+              VStream ys' -> fromVBit <$> lookupSeqMap ys' bi+              VWord _ wv  -> flip bitsSeq bi =<< wv+              _ -> evalPanic "transpose" ["expected sequence of bits"]++  | isTBit c, Inf <- a = -- [inf][b]Bit -> [b][inf]Bit+      return $ bseq $ IndexSeqMap $ \bi ->+        return $ VStream $ IndexSeqMap $ \ai ->+         do ys <- flip lookupSeqMap ai =<< fromSeq "transposeV" xs+            case ys of+              VStream ys' -> VBit . fromVBit <$> lookupSeqMap ys' bi+              VWord _ wv  -> VBit <$> (flip bitsSeq bi =<< wv)+              _ -> evalPanic "transpose" ["expected sequence of bits"]++  | otherwise = -- [a][b]c -> [b][a]c+      return $ bseq $ IndexSeqMap $ \bi ->+        return $ aseq $ IndexSeqMap $ \ai -> do+          ys  <- flip lookupSeqMap ai =<< fromSeq "transposeV 1" xs+          z   <- flip lookupSeqMap bi =<< fromSeq "transposeV 2" ys+          return z++ where+  bseq =+        case b of+          Nat nb -> VSeq nb+          Inf    -> VStream+  aseq =+        case a of+          Nat na -> VSeq na+          Inf    -> VStream+++++ccatV :: (Show b, Show w, BitWord b w)+      => Nat'+      -> Nat'+      -> TValue+      -> (GenValue b w)+      -> (GenValue b w)+      -> Eval (GenValue b w)++ccatV _front _back _elty (VWord m l) (VWord n r) =+  return $ VWord (m+n) (joinWordVal <$> l <*> r)++ccatV _front _back _elty (VWord m l) (VStream r) = do+  l' <- delay Nothing l+  return $ VStream $ IndexSeqMap $ \i ->+    if i < m then+      VBit <$> (flip indexWordValue i =<< l')+    else+      lookupSeqMap r (i-m)++ccatV front back elty l r = do+       l'' <- delay Nothing (fromSeq "ccatV left" l)+       r'' <- delay Nothing (fromSeq "ccatV right" r)+       let Nat n = front+       mkSeq (evalTF TCAdd [front,back]) elty <$> return (IndexSeqMap $ \i ->+        if i < n then do+         ls <- l''+         lookupSeqMap ls i+        else do+         rs <- r''+         lookupSeqMap rs (i-n))++wordValLogicOp :: BitWord b w+               => (b -> b -> b)+               -> (w -> w -> w)+               -> WordValue b w+               -> WordValue b w+               -> WordValue b w+wordValLogicOp _ wop (WordVal w1) (WordVal w2) = WordVal (wop w1 w2)+wordValLogicOp bop _ w1 w2 =+  BitsVal $ Seq.zipWith (\x y -> bop <$> x <*> y) (asBitsVal w1) (asBitsVal w2)++-- | Merge two values given a binop.  This is used for and, or and xor.+logicBinary :: forall b w+             . BitWord b w+            => (b -> b -> b)+            -> (w -> w -> w)+            -> Binary b w+logicBinary opb opw  = loop+  where+  loop' :: TValue+        -> Eval (GenValue b w)+        -> Eval (GenValue b w)+        -> Eval (GenValue b w)+  loop' ty l r = join (loop ty <$> l <*> r)++  loop :: TValue+        -> GenValue b w+        -> GenValue b w+        -> Eval (GenValue b w)++  loop ty l r = case ty of+    TVBit -> return $ VBit (opb (fromVBit l) (fromVBit r))+    TVSeq w aty+         -- words+         | isTBit aty+              -> return $ VWord w (wordValLogicOp opb opw <$>+                                    fromWordVal "logicBinary l" l <*>+                                    fromWordVal "logicBinary r" r)++         -- finite sequences+         | otherwise -> VSeq w <$>+                           (join (zipSeqMap (loop aty) <$>+                                    (fromSeq "logicBinary left" l)+                                    <*> (fromSeq "logicBinary right" r)))++    TVStream aty ->+        VStream <$> (join (zipSeqMap (loop aty) <$>+                          (fromSeq "logicBinary left" l) <*>+                          (fromSeq "logicBinary right" r)))++    TVTuple etys -> do+        let ls = fromVTuple l+        let rs = fromVTuple r+        return $ VTuple $ (zipWith3 loop' etys ls rs)++    TVFun _ bty ->+        return $ lam $ \ a -> loop' bty (fromVFun l a) (fromVFun r a)++    TVRec fields ->+        return $ VRecord [ (f,loop' fty a b)+                         | (f,fty) <- fields+                         , let a = lookupRecord f l+                               b = lookupRecord f r+                         ]+++wordValUnaryOp :: BitWord b w+               => (b -> b)+               -> (w -> w)+               -> WordValue b w+               -> WordValue b w+wordValUnaryOp _ wop (WordVal w)  = WordVal (wop w)+wordValUnaryOp bop _ (BitsVal bs) = BitsVal (fmap (bop <$>) bs)++logicUnary :: forall b w+            . BitWord b w+           => (b -> b)+           -> (w -> w)+           -> Unary b w+logicUnary opb opw = loop+  where+  loop' :: TValue -> Eval (GenValue b w) -> Eval (GenValue b w)+  loop' ty val = loop ty =<< val++  loop :: TValue -> GenValue b w -> Eval (GenValue b w)+  loop ty val = case ty of+    TVBit -> return . VBit . opb $ fromVBit val++    TVSeq w ety+         -- words+         | isTBit ety+              -> do return $ VWord w (wordValUnaryOp opb opw <$> fromWordVal "logicUnary" val)++         -- finite sequences+         | otherwise+              -> VSeq w <$> (mapSeqMap (loop ety) =<< fromSeq "logicUnary" val)++         -- streams+    TVStream ety ->+         VStream <$> (mapSeqMap (loop ety) =<< fromSeq "logicUnary" val)++    TVTuple etys ->+      let as = fromVTuple val+       in return $ VTuple (zipWith loop' etys as)++    TVFun _ bty ->+      return $ lam $ \ a -> loop' bty (fromVFun val a)++    TVRec fields ->+      return $ VRecord [ (f,loop' fty a) | (f,fty) <- fields, let a = lookupRecord f val ]+++logicShift :: (Integer -> Integer -> Integer -> Integer)+              -- ^ The function may assume its arguments are masked.+              -- It is responsible for masking its result if needed.+           -> (Integer -> Seq.Seq (Eval Bool) -> Integer -> Seq.Seq (Eval Bool))+           -> (Nat' -> TValue -> SeqValMap -> Integer -> SeqValMap)+           -> Value+logicShift opW obB opS+  = nlam $ \ a ->+    nlam $ \ _ ->+    tlam $ \ c ->+     lam  $ \ l -> return $+     lam  $ \ r -> do+        BV _ i <- fromVWord "logicShift amount" =<< r+        l >>= \case+          VWord w wv -> return $ VWord w $ wv >>= \case+                          BitsVal bs -> return $ BitsVal (obB w bs i)+                          WordVal (BV _ x) -> return $ WordVal (BV w (opW w x i))++          _ -> mkSeq a c <$> (opS a c <$> (fromSeq "logicShift" =<< l) <*> return i)++-- Left shift for words.+shiftLW :: Integer -> Integer -> Integer -> Integer+shiftLW w ival by+  | by >= w   = 0+  | otherwise = mask w (shiftL ival (fromInteger by))++shiftLB :: Integer -> Seq.Seq (Eval Bool) -> Integer -> Seq.Seq (Eval Bool)+shiftLB w bs by =+  Seq.drop (fromInteger (min w by)) bs+  Seq.><+  Seq.replicate (fromInteger (min w by)) (ready False)++shiftLS :: Nat' -> TValue -> SeqValMap -> Integer -> SeqValMap+shiftLS w ety vs by = IndexSeqMap $ \i ->+  case w of+    Nat len+      | i+by < len -> lookupSeqMap vs (i+by)+      | i    < len -> return $ zeroV ety+      | otherwise  -> evalPanic "shiftLS" ["Index out of bounds"]+    Inf            -> lookupSeqMap vs (i+by)++shiftRW :: Integer -> Integer -> Integer -> Integer+shiftRW w i by+  | by >= w   = 0+  | otherwise = shiftR i (fromInteger by)++shiftRB :: Integer -> Seq.Seq (Eval Bool) -> Integer -> Seq.Seq (Eval Bool)+shiftRB w bs by =+  Seq.replicate (fromInteger (min w by)) (ready False)+  Seq.><+  Seq.take (fromInteger (w - min w by)) bs++shiftRS :: Nat' -> TValue -> SeqValMap -> Integer -> SeqValMap+shiftRS w ety vs by = IndexSeqMap $ \i ->+  case w of+    Nat len+      | i >= by   -> lookupSeqMap vs (i-by)+      | i < len   -> return $ zeroV ety+      | otherwise -> evalPanic "shiftLS" ["Index out of bounds"]+    Inf+      | i >= by   -> lookupSeqMap vs (i-by)+      | otherwise -> return $ zeroV ety+++-- XXX integer doesn't implement rotateL, as there's no bit bound+rotateLW :: Integer -> Integer -> Integer -> Integer+rotateLW 0 i _  = i+rotateLW w i by = mask w $ (i `shiftL` b) .|. (i `shiftR` (fromInteger w - b))+  where b = fromInteger (by `mod` w)++rotateLB :: Integer -> Seq.Seq (Eval Bool) -> Integer -> Seq.Seq (Eval Bool)+rotateLB w bs by =+  let (hd,tl) = Seq.splitAt (fromInteger (by `mod` w)) bs+   in tl Seq.>< hd++rotateLS :: Nat' -> TValue -> SeqValMap -> Integer -> SeqValMap+rotateLS w _ vs by = IndexSeqMap $ \i ->+  case w of+    Nat len -> lookupSeqMap vs ((by + i) `mod` len)+    _ -> panic "Cryptol.Eval.Prim.rotateLS" [ "unexpected infinite sequence" ]++-- XXX integer doesn't implement rotateR, as there's no bit bound+rotateRW :: Integer -> Integer -> Integer -> Integer+rotateRW 0 i _  = i+rotateRW w i by = mask w $ (i `shiftR` b) .|. (i `shiftL` (fromInteger w - b))+  where b = fromInteger (by `mod` w)++rotateRB :: Integer -> Seq.Seq (Eval Bool) -> Integer -> Seq.Seq (Eval Bool)+rotateRB w bs by =+  let (hd,tl) = Seq.splitAt (fromInteger (w - (by `mod` w))) bs+   in tl Seq.>< hd++rotateRS :: Nat' -> TValue -> SeqValMap -> Integer -> SeqValMap+rotateRS w _ vs by = IndexSeqMap $ \i ->+  case w of+    Nat len -> lookupSeqMap vs ((len - by + i) `mod` len)+    _ -> panic "Cryptol.Eval.Prim.rotateRS" [ "unexpected infinite sequence" ]+++-- Sequence Primitives ---------------------------------------------------------++-- | Indexing operations that return one element.+indexPrimOne :: BitWord b w+             => (Maybe Integer -> TValue -> SeqMap b w -> Seq.Seq b -> Eval (GenValue b w))+             -> (Maybe Integer -> TValue -> SeqMap b w -> w -> Eval (GenValue b w))+             -> GenValue b w+indexPrimOne bits_op word_op =+  nlam $ \ n  ->+  tlam $ \ a ->+  nlam $ \ _i ->+   lam $ \ l  -> return $+   lam $ \ r  -> do+      vs <- l >>= \case+               VWord _ w  -> w >>= \w' -> return $ IndexSeqMap (\i -> VBit <$> indexWordValue w' i)+               VSeq _ vs  -> return vs+               VStream vs -> return vs+               _ -> evalPanic "Expected sequence value" ["indexPrimOne"]+      r >>= \case+         VWord _ w -> w >>= \case+           WordVal w' -> word_op (fromNat n) a vs w'+           BitsVal bs -> bits_op (fromNat n) a vs =<< sequence bs+         _ -> evalPanic "Expected word value" ["indexPrimOne"]++indexFront :: Maybe Integer -> TValue -> SeqValMap -> BV -> Eval Value+indexFront mblen _a vs (bvVal -> ix) =+  case mblen of+    Just len | len <= ix -> invalidIndex ix+    _                    -> lookupSeqMap vs ix++indexFront_bits :: Maybe Integer -> TValue -> SeqValMap -> Seq.Seq Bool -> Eval Value+indexFront_bits mblen a vs = indexFront mblen a vs . packWord . Fold.toList++indexBack :: Maybe Integer -> TValue -> SeqValMap -> BV -> Eval Value+indexBack mblen _a vs (bvVal -> ix) =+  case mblen of+    Just len | len > ix  -> lookupSeqMap vs (len - ix - 1)+             | otherwise -> invalidIndex ix+    Nothing              -> evalPanic "indexBack"+                            ["unexpected infinite sequence"]++indexBack_bits :: Maybe Integer -> TValue -> SeqValMap -> Seq.Seq Bool -> Eval Value+indexBack_bits mblen a vs = indexBack mblen a vs . packWord . Fold.toList++-- | Indexing operations that return many elements.+indexPrimMany :: BitWord b w+              => (Maybe Integer -> TValue -> SeqMap b w -> Seq.Seq b -> Eval (GenValue b w))+              -> (Maybe Integer -> TValue -> SeqMap b w -> w -> Eval (GenValue b w))+              -> GenValue b w+indexPrimMany bits_op word_op =+  nlam $ \ n  ->+  tlam $ \ a  ->+  nlam $ \ m  ->+  nlam $ \ _i ->+   lam $ \ l  -> return $+   lam $ \ r  -> do+     vs <- (l >>= \case+               VWord _ w  -> w >>= \w' -> return $ IndexSeqMap (\i -> VBit <$> indexWordValue w' i)+               VSeq _ vs  -> return vs+               VStream vs -> return vs+               _ -> evalPanic "Expected sequence value" ["indexPrimMany"])+     ixs <- fromSeq "indexPrimMany idx" =<< r+     mkSeq m a <$> memoMap (IndexSeqMap $ \i -> do+       lookupSeqMap ixs i >>= \case+         VWord _ w -> w >>= \case+            WordVal w' -> word_op (fromNat n) a vs w'+            BitsVal bs -> bits_op (fromNat n) a vs =<< sequence bs+         _ -> evalPanic "Expected word value" ["indexPrimMany"])+++updateFront+  :: Nat'+  -> TValue+  -> SeqMap Bool BV+  -> WordValue Bool BV+  -> Eval (GenValue Bool BV)+  -> Eval (SeqMap Bool BV)+updateFront len _eltTy vs w val = do+  idx <- bvVal <$> asWordVal w+  case len of+    Inf -> return ()+    Nat n -> unless (idx < n) (invalidIndex idx)+  return $ updateSeqMap vs idx val++updateFront_bits+ :: Nat'+ -> TValue+ -> Seq.Seq (Eval Bool)+ -> WordValue Bool BV+ -> Eval (GenValue Bool BV)+ -> Eval (Seq.Seq (Eval Bool))+updateFront_bits len _eltTy bs w val = do+  idx <- bvVal <$> asWordVal w+  case len of+    Inf -> return ()+    Nat n -> unless (idx < n) (invalidIndex idx)+  return $! Seq.update (fromInteger idx) (fromVBit <$> val) bs+++updateBack+  :: Nat'+  -> TValue+  -> SeqMap Bool BV+  -> WordValue Bool BV+  -> Eval (GenValue Bool BV)+  -> Eval (SeqMap Bool BV)+updateBack Inf _eltTy _vs _w _val =+  evalPanic "Unexpected infinite sequence in updateEnd" []+updateBack (Nat n) _eltTy vs w val = do+  idx <- bvVal <$> asWordVal w+  unless (idx < n) (invalidIndex idx)+  return $ updateSeqMap vs (n - idx - 1) val++updateBack_bits+ :: Nat'+ -> TValue+ -> Seq.Seq (Eval Bool)+ -> WordValue Bool BV+ -> Eval (GenValue Bool BV)+ -> Eval (Seq.Seq (Eval Bool))+updateBack_bits Inf _eltTy _bs _w _val =+  evalPanic "Unexpected infinite sequence in updateEnd" []+updateBack_bits (Nat n) _eltTy bs w val = do+  idx <- bvVal <$> asWordVal w+  unless (idx < n) (invalidIndex idx)+  let idx' = n - idx - 1+  return $! Seq.update (fromInteger idx') (fromVBit <$> val) bs+++updatePrim+     :: BitWord b w+     => (Nat' -> TValue -> Seq.Seq (Eval b) -> WordValue b w -> Eval (GenValue b w) -> Eval (Seq.Seq (Eval b)))+     -> (Nat' -> TValue -> SeqMap b w -> WordValue b w -> Eval (GenValue b w) -> Eval (SeqMap b w))+     -> GenValue b w+updatePrim updateBits updateWord =+  nlam $ \len ->+  tlam $ \eltTy ->+  nlam $ \_idxLen ->+  lam $ \xs  -> return $+  lam $ \idx -> return $+  lam $ \val -> do+    idx' <- fromWordVal "update" =<< idx+    xs >>= \case+      VWord l w -> do+         w' <- asBitsVal <$> w+         return $ VWord l (BitsVal <$> updateBits len eltTy w' idx' val)+      VSeq l vs -> VSeq l <$> updateWord len eltTy vs idx' val+      VStream vs -> VStream <$> updateWord len eltTy vs idx' val+      _ -> evalPanic "Expected sequence value" ["updatePrim"]++++-- @[ 0, 1 .. ]@+fromThenV :: BitWord b w+          => GenValue b w+fromThenV  =+  nlam $ \ first ->+  nlam $ \ next  ->+  nlam $ \ bits  ->+  nlam $ \ len   ->+    case (first, next, len, bits) of+      (_         , _        , _       , Nat bits')+        | bits' >= Arch.maxBigIntWidth -> wordTooWide bits'+      (Nat first', Nat next', Nat len', Nat bits') ->+        let diff = next' - first'+         in VSeq len' $ IndexSeqMap $ \i ->+                ready $ VWord bits' $ return $+                  WordVal $ wordLit bits' (first' + i*diff)+      _ -> evalPanic "fromThenV" ["invalid arguments"]++-- @[ 0 .. 10 ]@+fromToV :: BitWord b w+        => GenValue b w+fromToV  =+  nlam $ \ first ->+  nlam $ \ lst   ->+  nlam $ \ bits  ->+    case (first, lst, bits) of+      (_         , _       , Nat bits')+        | bits' >= Arch.maxBigIntWidth -> wordTooWide bits'+      (Nat first', Nat lst', Nat bits') ->+        let len = 1 + (lst' - first')+         in VSeq len $ IndexSeqMap $ \i ->+               ready $ VWord bits' $ return $+                 WordVal $ wordLit bits' (first' + i)+      _ -> evalPanic "fromToV" ["invalid arguments"]++-- @[ 0, 1 .. 10 ]@+fromThenToV :: BitWord b w+            => GenValue b w+fromThenToV  =+  nlam $ \ first ->+  nlam $ \ next  ->+  nlam $ \ lst   ->+  nlam $ \ bits  ->+  nlam $ \ len   ->+    case (first, next, lst, len, bits) of+      (_         , _        , _       , _       , Nat bits')+        | bits' >= Arch.maxBigIntWidth -> wordTooWide bits'+      (Nat first', Nat next', Nat _lst', Nat len', Nat bits') ->+        let diff = next' - first'+         in VSeq len' $ IndexSeqMap $ \i ->+               ready $ VWord bits' $ return $+                 WordVal $ wordLit bits' (first' + i*diff)+      _ -> evalPanic "fromThenToV" ["invalid arguments"]+++infFromV :: BitWord b w+         => GenValue b w+infFromV =+     nlam $ \(finNat' -> bits)  ->+     wlam $ \first ->+     return $ VStream $ IndexSeqMap $ \i ->+       ready $ VWord bits $ return $+         WordVal $ wordPlus first (wordLit bits i)++infFromThenV :: BitWord b w+             => GenValue b w+infFromThenV =+     nlam $ \(finNat' -> bits)  ->+     wlam $ \first -> return $+     wlam $ \next  -> do+       let diff = wordMinus next first+       return $ VStream $ IndexSeqMap $ \i ->+         ready $ VWord bits $ return $+           WordVal $ wordPlus first (wordMult diff (wordLit bits i))++-- Random Values ---------------------------------------------------------------++-- | Produce a random value with the given seed. If we do not support+-- making values of the given type, return zero of that type.+-- TODO: do better than returning zero+randomV :: TValue -> Integer -> Value+randomV ty seed =+  case randomValue (tValTy ty) of+    Nothing -> zeroV ty+    Just gen ->+      -- unpack the seed into four Word64s+      let mask64 = 0xFFFFFFFFFFFFFFFF+          unpack s = fromIntegral (s .&. mask64) : unpack (s `shiftR` 64)+          [a, b, c, d] = take 4 (unpack seed)+      in fst $ gen 100 $ seedTFGen (a, b, c, d)++-- Miscellaneous ---------------------------------------------------------------++errorV :: forall b w+       . BitWord b w+      => TValue+      -> String+      -> Eval (GenValue b w)+errorV ty msg = case ty of+  -- bits+  TVBit -> cryUserError msg++  -- sequences+  TVSeq w ety+     | isTBit ety -> return $ VWord w $ return $ BitsVal $+                         Seq.replicate (fromInteger w) (cryUserError msg)+     | otherwise  -> return $ VSeq w (IndexSeqMap $ \_ -> errorV ety msg)++  TVStream ety ->+    return $ VStream (IndexSeqMap $ \_ -> errorV ety msg)++  -- functions+  TVFun _ bty ->+    return $ lam (\ _ -> errorV bty msg)++  -- tuples+  TVTuple tys ->+    return $ VTuple (map (flip errorV msg) tys)++  -- records+  TVRec fields ->+    return $ VRecord [ (f,errorV fty msg) | (f,fty) <- fields ]
src/Cryptol/REPL/Command.hs view
@@ -12,7 +12,7 @@ {-# LANGUAGE RecordWildCards #-} module Cryptol.REPL.Command (     -- * Commands-    Command(..), CommandDescr(..), CommandBody(..)+    Command(..), CommandDescr(..), CommandBody(..), CommandExitCode(..)   , parseCommand   , runCommand   , splitCommand@@ -56,7 +56,9 @@ import qualified Cryptol.ModuleSystem.Renamer as M (RenamerWarning(SymbolShadowed)) import qualified Cryptol.Utils.Ident as M +import qualified Cryptol.Eval.Monad as E import qualified Cryptol.Eval.Value as E+import qualified Cryptol.Eval.Reference as R import Cryptol.Testing.Concrete import qualified Cryptol.Testing.Random  as TestR import Cryptol.Parser@@ -72,10 +74,9 @@ import Cryptol.Utils.Panic(panic) import qualified Cryptol.Parser.AST as P import qualified Cryptol.Transform.Specialize as S-import Cryptol.Symbolic (ProverCommand(..), QueryType(..), SatNum(..))+import Cryptol.Symbolic (ProverCommand(..), QueryType(..), SatNum(..),ProverStats) import qualified Cryptol.Symbolic as Symbolic -import Control.DeepSeq import qualified Control.Exception as X import Control.Monad hiding (mapM, mapM_) import qualified Data.ByteString as BS@@ -98,10 +99,14 @@ import Numeric (showFFloat) import qualified Data.Text as ST import qualified Data.Text.Lazy as T+import Data.IORef(newIORef,readIORef)  import Prelude () import Prelude.Compat +import qualified Data.SBV           as SBV (Solver)+import qualified Data.SBV.Internals as SBV (showTDiff)+ -- Commands --------------------------------------------------------------------  -- | Commands.@@ -113,9 +118,9 @@  -- | Command builder. data CommandDescr = CommandDescr-  { cNames :: [String]-  , cBody :: CommandBody-  , cHelp :: String+  { cNames  :: [String]+  , cBody   :: CommandBody+  , cHelp   :: String   }  instance Show CommandDescr where@@ -138,6 +143,10 @@   | NoArg       (REPL ())  +data CommandExitCode = CommandOk+                     | CommandError -- XXX: More?++ -- | REPL command parsing. commands :: CommandMap commands  = foldl insert emptyTrie commandList@@ -173,6 +182,8 @@     "use a solver to find a satisfying assignment for which the argument returns true (if no argument, find an assignment for all properties)"   , CommandDescr [ ":debug_specialize" ] (ExprArg specializeCmd)     "do type specialization on a closed expression"+  , CommandDescr [ ":eval" ] (ExprArg refEvalCmd)+    "evaluate an expression with the reference evaluator"   ]  commandList :: [CommandDescr]@@ -210,18 +221,20 @@ -- Command Evaluation ----------------------------------------------------------  -- | Run a command.-runCommand :: Command -> REPL ()+runCommand :: Command -> REPL CommandExitCode runCommand c = case c of -  Command cmd -> cmd `Cryptol.REPL.Monad.catch` handler+  Command cmd -> (cmd >> return CommandOk) `Cryptol.REPL.Monad.catch` handler     where-    handler re = rPutStrLn "" >> rPrint (pp re)+    handler re = rPutStrLn "" >> rPrint (pp re) >> return CommandError -  Unknown cmd -> rPutStrLn ("Unknown command: " ++ cmd)+  Unknown cmd -> do rPutStrLn ("Unknown command: " ++ cmd)+                    return CommandError    Ambiguous cmd cmds -> do     rPutStrLn (cmd ++ " is ambiguous, it could mean one of:")     rPutStrLn ("\t" ++ intercalate ", " cmds)+    return CommandError   -- Get the setting we should use for displaying values.@@ -245,13 +258,16 @@     P.ExprInput expr -> do       (val,_ty) <- replEvalExpr expr       ppOpts <- getPPValOpts+      valDoc <- io $ rethrowEvalError $ E.runEval $ E.ppValue ppOpts val+       -- This is the point where the value gets forced. We deepseq the       -- pretty-printed representation of it, rather than the value       -- itself, leaving it up to the pretty-printer to determine how       -- much of the value to force-      out <- io $ rethrowEvalError-                $ return $!! show $ pp $ E.WithBase ppOpts val-      rPutStrLn out+      --out <- io $ rethrowEvalError+      --          $ return $!! show $ pp $ E.WithBase ppOpts val++      rPutStrLn (show valDoc)     P.LetInput decl -> do       -- explicitly make this a top-level declaration, so that it will       -- be generalized if mono-binds is enabled@@ -367,13 +383,13 @@         prtLn "FAILED"       FailFalse vs -> do         prtLn "FAILED for the following inputs:"-        mapM_ (rPrint . pp . E.WithBase opts) vs+        mapM_ (\v -> rPrint =<< (io $ E.runEval $ E.ppValue opts v)) vs       FailError err [] -> do         prtLn "ERROR"         rPrint (pp err)       FailError err vs -> do         prtLn "ERROR for the following inputs:"-        mapM_ (rPrint . pp . E.WithBase opts) vs+        mapM_ (\v -> rPrint =<< (io $ E.runEval $ E.ppValue opts v)) vs         rPrint (pp err)       Pass -> panic "Cryptol.REPL.Command" ["unexpected Test.Pass"] @@ -381,6 +397,13 @@ satCmd = cmdProveSat True proveCmd = cmdProveSat False +showProverStats :: Maybe SBV.Solver -> ProverStats -> REPL ()+showProverStats mprover stat = rPutStrLn msg+  where++  msg = "(Total Elapsed Time: " ++ SBV.showTDiff stat +++        maybe "" (\p -> ", using " ++ show p) mprover ++ ")"+ -- | Console-specific version of 'proveSat'. Prints output to the -- console, and binds the @it@ variable to a record whose form depends -- on the expression given. See ticket #66 for a discussion of this@@ -421,7 +444,7 @@             Just path -> io $ writeFile path smtlib             Nothing -> rPutStr smtlib     _ -> do-      result <- onlineProveSat isSat str mfile+      (firstProver,result,stats) <- onlineProveSat isSat str mfile       ppOpts <- getPPValOpts       case result of         Symbolic.EmptyResult         ->@@ -436,8 +459,8 @@               vss  = map (map $ \(_,_,v) -> v)     tevss               ppvs vs = do                 parseExpr <- replParseExpr str-                let docs = map (pp . E.WithBase ppOpts) vs-                    -- function application has precedence 3+                docs <- mapM (io . E.runEval . E.ppValue ppOpts) vs+                let -- function application has precedence 3                     doc = ppPrec 3 parseExpr                 rPrint $ hang doc 2 (sep docs) <+>                   text (if isSat then "= True" else "= False")@@ -460,8 +483,12 @@             (t, [e]) -> bindItVariable t e             (t, es ) -> bindItVariables t es +      seeStats <- getUserShowProverStats+      when seeStats (showProverStats firstProver stats)+ onlineProveSat :: Bool-               -> String -> Maybe FilePath -> REPL Symbolic.ProverResult+               -> String -> Maybe FilePath+               -> REPL (Maybe SBV.Solver,Symbolic.ProverResult,ProverStats) onlineProveSat isSat str mfile = do   EnvString proverName <- getUser "prover"   EnvBool verbose <- getUser "debug"@@ -469,16 +496,20 @@   parseExpr <- replParseExpr str   (_, expr, schema) <- replCheckExpr parseExpr   decls <- fmap M.deDecls getDynEnv+  timing <- io (newIORef 0)   let cmd = Symbolic.ProverCommand {           pcQueryType    = if isSat then SatQuery satNum else ProveQuery         , pcProverName   = proverName         , pcVerbose      = verbose+        , pcProverStats  = timing         , pcExtraDecls   = decls         , pcSmtFile      = mfile         , pcExpr         = expr         , pcSchema       = schema         }-  liftModuleCmd $ Symbolic.satProve cmd+  (firstProver, res) <- liftModuleCmd $ Symbolic.satProve cmd+  stas <- io (readIORef timing)+  return (firstProver,res,stas)  offlineProveSat :: Bool -> String -> Maybe FilePath -> REPL (Either String String) offlineProveSat isSat str mfile = do@@ -486,10 +517,12 @@   parseExpr <- replParseExpr str   (_, expr, schema) <- replCheckExpr parseExpr   decls <- fmap M.deDecls getDynEnv+  timing <- io (newIORef 0)   let cmd = Symbolic.ProverCommand {           pcQueryType    = if isSat then SatQuery (SomeSat 0) else ProveQuery         , pcProverName   = "offline"         , pcVerbose      = verbose+        , pcProverStats  = timing         , pcExtraDecls   = decls         , pcSmtFile      = mfile         , pcExpr         = expr@@ -541,6 +574,13 @@   rPutStrLn  "Specialized expression:"   rPutStrLn $ dump spexpr +refEvalCmd :: String -> REPL ()+refEvalCmd str = do+  parseExpr <- replParseExpr str+  (_, expr, _schema) <- replCheckExpr parseExpr+  val <- liftModuleCmd (rethrowEvalError . R.evaluate expr)+  rPrint $ R.ppValue val+ typeOfCmd :: String -> REPL () typeOfCmd str = do @@ -581,8 +621,9 @@   tIsByte    x = maybe False                        (\(n,b) -> T.tIsBit b && T.tIsNum n == Just 8)                        (T.tIsSeq x)-  serializeValue (E.VSeq _ vs) =-    return $ BS.pack $ map (serializeByte . E.fromVWord) vs+  serializeValue (E.VSeq n vs) = do+    ws <- io $ E.runEval (mapM (>>=E.fromVWord "serializeValue") $ E.enumerateSeqMap n vs)+    return $ BS.pack $ map serializeByte ws   serializeValue _             =     panic "Cryptol.REPL.Command.writeFileCmd"       ["Impossible: Non-VSeq value of type [n][8]."]@@ -760,6 +801,19 @@                            <+> colon                            <+> pp (ifDeclSig) +                  let mbFix = ifDeclFixity `mplus`+                              (guard ifDeclInfix >> return P.defaultFixity)+                  case mbFix of+                    Just f  ->+                      let msg = "Precedence " ++ show (P.fLevel f) ++ ", " +++                                 (case P.fAssoc f of+                                    P.LeftAssoc   -> "associates to the left."+                                    P.RightAssoc  -> "associates to the right."+                                    P.NonAssoc    -> "does not associate.")++                      in rPutStrLn ('\n' : msg)+                    Nothing -> return ()+                   case ifDeclDoc of                     Just str -> rPutStrLn ('\n' : str)                     Nothing  -> return ()@@ -787,8 +841,9 @@ -- C-c Handlings ---------------------------------------------------------------  -- XXX this should probably do something a bit more specific.-handleCtrlC :: REPL ()-handleCtrlC  = rPutStrLn "Ctrl-C"+handleCtrlC :: a -> REPL a+handleCtrlC a = do rPutStrLn "Ctrl-C"+                   return a   -- Utilities -------------------------------------------------------------------@@ -846,6 +901,7 @@       filterDefaults w = Just w        isShadowWarn (M.SymbolShadowed {}) = True+      isShadowWarn _                     = False        filterShadowing w | warnShadowing = Just w       filterShadowing (M.RenamerWarnings xs) =@@ -902,8 +958,7 @@                let su = T.listSubst [ (T.tpVar a, t) | (a,t) <- tys ]                return (def1, T.apSubst su (T.sType sig)) -     val <- liftModuleCmd (M.evalExpr def1)-     _ <- io $ rethrowEvalError $ X.evaluate val+     val <- liftModuleCmd (rethrowEvalError . M.evalExpr def1)      whenDebug (rPutStrLn (dump def1))      -- add "it" to the namespace      bindItVariable ty def1
src/Cryptol/REPL/Monad.hs view
@@ -57,6 +57,7 @@   , setUser, getUser, tryGetUser   , userOptions   , getUserSatNum+  , getUserShowProverStats      -- ** Configurable Output   , getPutStr@@ -304,12 +305,13 @@  -- | Run a computation in batch mode, restoring the previous isBatch -- flag afterwards-asBatch :: REPL () -> REPL ()+asBatch :: REPL a -> REPL a asBatch body = do   wasBatch <- eIsBatch `fmap` getRW   modifyRW_ $ (\ rw -> rw { eIsBatch = True })-  body+  a <- body   modifyRW_ $ (\ rw -> rw { eIsBatch = wasBatch })+  return a  disableLet :: REPL () disableLet  = modifyRW_ (\ rw -> rw { eLetEnabled = False })@@ -487,7 +489,7 @@  -- | Set a user option. setUser :: String -> String -> REPL ()-setUser name val = case lookupTrie name userOptions of+setUser name val = case lookupTrieExact name userOptions of    [opt] -> setUserOpt opt   []    -> io (putStrLn ("Unknown env value `" ++ name ++ "`"))@@ -565,6 +567,11 @@     Just ev -> return ev     Nothing -> panic "[REPL] getUser" ["option `" ++ name ++ "` does not exist"] +getUserShowProverStats :: REPL Bool+getUserShowProverStats =+  do EnvBool yes <- getUser "prover-stats"+     return yes+ -- Environment Options ---------------------------------------------------------  type OptionMap = Trie OptionDescr@@ -640,7 +647,11 @@       in \case EnvBool True  -> setIt M.CoreLint                EnvBool False -> setIt M.NoCoreLint                _             -> return ()++  , simpleOpt "prover-stats" (EnvBool True) (const (return Nothing))+    "Enable prover timing statistics."   ]+  -- | Check the value to the `base` option. checkBase :: EnvVal -> IO (Maybe String)
src/Cryptol/Symbolic.hs view
@@ -16,12 +16,15 @@  module Cryptol.Symbolic where -import Control.Monad (replicateM, when, zipWithM)-import Data.List (transpose, intercalate)-import qualified Data.Map as Map+import Control.Monad.IO.Class+import Control.Monad (replicateM, when, zipWithM, foldM)+import Data.List (intercalate, genericLength)+import Data.IORef(IORef) import qualified Control.Exception as X  import qualified Data.SBV.Dynamic as SBV+import           Data.SBV (Timing(SaveTiming))+import           Data.SBV.Internals (showTDiff)  import qualified Cryptol.ModuleSystem as M hiding (getPrimMap) import qualified Cryptol.ModuleSystem.Env as M@@ -31,11 +34,12 @@ import Cryptol.Symbolic.Prims import Cryptol.Symbolic.Value +import qualified Cryptol.Eval as Eval+import qualified Cryptol.Eval.Monad as Eval+import qualified Cryptol.Eval.Type as Eval import qualified Cryptol.Eval.Value as Eval-import qualified Cryptol.Eval.Type (evalValType, evalNumType)-import qualified Cryptol.Eval.Env (EvalEnv(..))+import           Cryptol.Eval.Env (GenEvalEnv(..)) import Cryptol.TypeCheck.AST-import Cryptol.TypeCheck.Solver.InfNat (Nat'(..)) import Cryptol.Utils.Ident (Ident) import Cryptol.Utils.PP import Cryptol.Utils.Panic(panic)@@ -43,6 +47,11 @@ import Prelude () import Prelude.Compat +import Data.Time (NominalDiffTime)++type EvalEnv = GenEvalEnv SBool SWord++ -- External interface ----------------------------------------------------------  proverConfigs :: [(String, SBV.SMTConfig)]@@ -82,6 +91,8 @@     -- ^ Which prover to use (one of the strings in 'proverConfigs')   , pcVerbose :: Bool     -- ^ Verbosity flag passed to SBV+  , pcProverStats :: !(IORef ProverStats)+    -- ^ Record timing information here   , pcExtraDecls :: [DeclGroup]     -- ^ Extra declarations to bring into scope for symbolic     -- simulation@@ -93,6 +104,8 @@     -- ^ The 'Schema' of @pcExpr@   } +type ProverStats = NominalDiffTime+ -- | A prover result is either an error message, an empty result (eg -- for the offline prover), a counterexample or a lazy list of -- satisfying assignments.@@ -105,16 +118,18 @@ satSMTResults (SBV.SatResult r) = [r]  allSatSMTResults :: SBV.AllSatResult -> [SBV.SMTResult]-allSatSMTResults (SBV.AllSatResult (_, rs)) = rs+allSatSMTResults (SBV.AllSatResult (_, _, rs)) = rs  thmSMTResults :: SBV.ThmResult -> [SBV.SMTResult] thmSMTResults (SBV.ThmResult r) = [r] -proverError :: String -> M.ModuleCmd ProverResult-proverError msg modEnv = return (Right (ProverError msg, modEnv), [])+proverError :: String -> M.ModuleCmd (Maybe SBV.Solver, ProverResult)+proverError msg modEnv =+  return (Right ((Nothing, ProverError msg), modEnv), []) -satProve :: ProverCommand -> M.ModuleCmd ProverResult-satProve ProverCommand {..} = protectStack proverError $ \modEnv ->+satProve :: ProverCommand -> M.ModuleCmd (Maybe SBV.Solver, ProverResult)+satProve ProverCommand {..} =+  protectStack proverError $ \modEnv ->   M.runModuleM modEnv $ do   let (isSat, mSatNum) = case pcQueryType of         ProveQuery -> (False, Nothing)@@ -125,47 +140,54 @@   provers <-     case pcProverName of       "any" -> M.io SBV.sbvAvailableSolvers-      _ -> return [(lookupProver pcProverName) { SBV.smtFile = pcSmtFile }]-  let provers' = [ p { SBV.timing = pcVerbose, SBV.verbose = pcVerbose } | p <- provers ]+      _ -> return [(lookupProver pcProverName) { SBV.transcript = pcSmtFile }]+++  let provers' = [ p { SBV.timing = SaveTiming pcProverStats, SBV.verbose = pcVerbose } | p <- provers ]   let tyFn = if isSat then existsFinType else forallFinType   let runProver fn tag e = do         case provers of           [prover] -> do             when pcVerbose $ M.io $-              putStrLn $ "Trying proof with " ++ show prover+              putStrLn $ "Trying proof with " ++ show (SBV.name (SBV.solver prover))             res <- M.io (fn prover e)             when pcVerbose $ M.io $-              putStrLn $ "Got result from " ++ show prover-            return (tag res)+              putStrLn $ "Got result from " ++ show (SBV.name (SBV.solver prover))+            return (Just (SBV.name (SBV.solver prover)), tag res)           _ ->-            return [ SBV.ProofError-                       prover-                       [":sat with option prover=any requires option satNum=1"]-                   | prover <- provers ]+            return ( Nothing+                   , [ SBV.ProofError+                         prover+                         [":sat with option prover=any requires option satNum=1"]+                     | prover <- provers ]+                   )       runProvers fn tag e = do         when pcVerbose $ M.io $           putStrLn $ "Trying proof with " ++-                     intercalate ", " (map show provers)-        (firstProver, res) <- M.io (fn provers' e)+                     intercalate ", " (map (show . SBV.name . SBV.solver) provers)+        (firstProver, timeElapsed, res) <- M.io (fn provers' e)         when pcVerbose $ M.io $-          putStrLn $ "Got result from " ++ show firstProver-        return (tag res)+          putStrLn $ "Got result from " ++ show firstProver ++ ", time: " ++ showTDiff timeElapsed+        return (Just firstProver, tag res)   let runFn = case pcQueryType of         ProveQuery -> runProvers SBV.proveWithAny thmSMTResults         SatQuery sn -> case sn of           SomeSat 1 -> runProvers SBV.satWithAny satSMTResults           _         -> runProver SBV.allSatWith allSatSMTResults   case predArgTypes pcSchema of-    Left msg -> return (ProverError msg)+    Left msg -> return (Nothing, ProverError msg)     Right ts -> do when pcVerbose $ M.io $ putStrLn "Simulating..."-                   let env = evalDecls mempty extDgs-                   let v = evalExpr env pcExpr+                   v <- M.io $ Eval.runEval $ do+                               env <- Eval.evalDecls extDgs mempty+                               Eval.evalExpr env pcExpr                    prims <- M.getPrimMap-                   results' <- runFn $ do-                                 args <- mapM tyFn ts-                                 b <- return $! fromVBit (foldl fromVFun v args)-                                 return b-                   let results = maybe results' (\n -> take n results') mSatNum+                   runRes <- runFn $ do+                               args <- mapM tyFn ts+                               b <- liftIO $ Eval.runEval+                                      (fromVBit <$> foldM fromVFun v (map Eval.ready args))+                               return b+                   let (firstProver, results') = runRes+                       results = maybe results' (\n -> take n results') mSatNum                    esatexprs <- case results of                      -- allSat can return more than one as long as                      -- they're satisfiable@@ -173,12 +195,13 @@                        tevss <- mapM mkTevs results                        return $ AllSatResult tevss                        where-                         mkTevs result =-                           let Right (_, cws) = SBV.getModel result+                         mkTevs result = do+                           let Right (_, cws) = SBV.getModelAssignment result                                (vs, _) = parseValues ts cws                                sattys = unFinType <$> ts-                               satexprs = zipWithM (Eval.toExpr prims) sattys vs-                           in case zip3 sattys <$> satexprs <*> pure vs of+                           satexprs <- liftIO $ Eval.runEval+                                           (zipWithM (Eval.toExpr prims) sattys vs)+                           case zip3 sattys <$> (sequence satexprs) <*> pure vs of                              Nothing ->                                panic "Cryptol.Symbolic.sat"                                  [ "unable to make assignment into expression" ]@@ -190,11 +213,11 @@                      [] -> return $ ThmResult (unFinType <$> ts)                      -- otherwise something is wrong                      _ -> return $ ProverError (rshow results)-                            where rshow | isSat = show . SBV.AllSatResult . (boom,)+                            where rshow | isSat = show .  SBV.AllSatResult . (False,boom,)                                         | otherwise = show . SBV.ThmResult . head                                   boom = panic "Cryptol.Symbolic.sat"                                            [ "attempted to evaluate bogus boolean for pretty-printing" ]-                   return esatexprs+                   return (firstProver, esatexprs)  satProveOffline :: ProverCommand -> M.ModuleCmd (Either String String) satProveOffline ProverCommand {..} =@@ -208,12 +231,13 @@       Left msg -> return (Right (Left msg, modEnv), [])       Right ts ->         do when pcVerbose $ putStrLn "Simulating..."-           let env = evalDecls mempty extDgs-           let v = evalExpr env pcExpr-           smtlib <- SBV.compileToSMTLib SBV.SMTLib2 isSat $ do+           v <- liftIO $ Eval.runEval $+                   do env <- Eval.evalDecls extDgs mempty+                      Eval.evalExpr env pcExpr+           smtlib <- SBV.generateSMTBenchmark isSat $ do              args <- mapM tyFn ts-             b <- return $! fromVBit (foldl fromVFun v args)-             return b+             liftIO $ Eval.runEval+                    (fromVBit <$> foldM fromVFun v (map Eval.ready args))            return (Right (Right smtlib, modEnv), [])  protectStack :: (String -> M.ModuleCmd a)@@ -235,17 +259,21 @@ parseValue :: FinType -> [SBV.CW] -> (Eval.Value, [SBV.CW]) parseValue FTBit [] = panic "Cryptol.Symbolic.parseValue" [ "empty FTBit" ] parseValue FTBit (cw : cws) = (Eval.VBit (SBV.cwToBool cw), cws)-parseValue (FTSeq 0 FTBit) cws = (Eval.VWord (Eval.BV 0 0), cws)+parseValue (FTSeq 0 FTBit) cws = (Eval.word 0 0, cws) parseValue (FTSeq n FTBit) cws =   case SBV.genParse (SBV.KBounded False n) cws of-    Just (x, cws') -> (Eval.VWord (Eval.BV (toInteger n) x), cws')-    Nothing        -> (Eval.VSeq True vs, cws')+    Just (x, cws') -> (Eval.word (toInteger n) x, cws')+    Nothing        -> (VWord (genericLength vs) $ return $ Eval.WordVal $+                         Eval.packWord (map fromVBit vs), cws')       where (vs, cws') = parseValues (replicate n FTBit) cws-parseValue (FTSeq n t) cws = (Eval.VSeq False vs, cws')+parseValue (FTSeq n t) cws =+                      (Eval.VSeq (toInteger n) $ Eval.finiteSeqMap (map Eval.ready vs)+                      , cws'+                      )   where (vs, cws') = parseValues (replicate n t) cws-parseValue (FTTuple ts) cws = (Eval.VTuple vs, cws')+parseValue (FTTuple ts) cws = (Eval.VTuple (map Eval.ready vs), cws')   where (vs, cws') = parseValues ts cws-parseValue (FTRecord fs) cws = (Eval.VRecord (zip ns vs), cws')+parseValue (FTRecord fs) cws = (Eval.VRecord (zip ns (map Eval.ready vs)), cws')   where (ns, ts) = unzip fs         (vs, cws') = parseValues ts cws @@ -266,11 +294,11 @@ finType :: TValue -> Maybe FinType finType ty =   case ty of-    TVBit        -> Just FTBit-    TVSeq n t    -> FTSeq <$> numType n <*> finType t-    TVTuple ts   -> FTTuple <$> traverse finType ts-    TVRec fields -> FTRecord <$> traverse (traverseSnd finType) fields-    _            -> Nothing+    Eval.TVBit            -> Just FTBit+    Eval.TVSeq n t        -> FTSeq <$> numType n <*> finType t+    Eval.TVTuple ts       -> FTTuple <$> traverse finType ts+    Eval.TVRec fields     -> FTRecord <$> traverse (traverseSnd finType) fields+    _                     -> Nothing  unFinType :: FinType -> Type unFinType fty =@@ -286,218 +314,34 @@ predArgTypes :: Schema -> Either String [FinType] predArgTypes schema@(Forall ts ps ty)   | null ts && null ps =-      case go (Cryptol.Eval.Type.evalValType mempty ty) of-        Just fts -> Right fts-        Nothing  -> Left $ "Not a valid predicate type:\n" ++ show (pp schema)+      case go <$> (Eval.evalType mempty ty) of+        Right (Just fts) -> Right fts+        _                -> Left $ "Not a valid predicate type:\n" ++ show (pp schema)   | otherwise = Left $ "Not a monomorphic type:\n" ++ show (pp schema)   where     go :: TValue -> Maybe [FinType]-    go TVBit           = Just []-    go (TVFun ty1 ty2) = (:) <$> finType ty1 <*> go ty2-    go _               = Nothing+    go Eval.TVBit             = Just []+    go (Eval.TVFun ty1 ty2)   = (:) <$> finType ty1 <*> go ty2+    go _                      = Nothing  forallFinType :: FinType -> SBV.Symbolic Value forallFinType ty =   case ty of     FTBit         -> VBit <$> forallSBool_-    FTSeq 0 FTBit -> return $ VWord (literalSWord 0 0)-    FTSeq n FTBit -> VWord <$> (forallBV_ n)-    FTSeq n t     -> VSeq False <$> replicateM n (forallFinType t)-    FTTuple ts    -> VTuple <$> mapM forallFinType ts-    FTRecord fs   -> VRecord <$> mapM (traverseSnd forallFinType) fs+    FTSeq 0 FTBit -> return $ Eval.word 0 0+    FTSeq n FTBit -> VWord (toInteger n) . return . Eval.WordVal <$> (forallBV_ n)+    FTSeq n t     -> do vs <- replicateM n (forallFinType t)+                        return $ VSeq (toInteger n) $ Eval.finiteSeqMap (map Eval.ready vs)+    FTTuple ts    -> VTuple <$> mapM (fmap Eval.ready . forallFinType) ts+    FTRecord fs   -> VRecord <$> mapM (traverseSnd (fmap Eval.ready . forallFinType)) fs  existsFinType :: FinType -> SBV.Symbolic Value existsFinType ty =   case ty of     FTBit         -> VBit <$> existsSBool_-    FTSeq 0 FTBit -> return $ VWord (literalSWord 0 0)-    FTSeq n FTBit -> VWord <$> existsBV_ n-    FTSeq n t     -> VSeq False <$> replicateM n (existsFinType t)-    FTTuple ts    -> VTuple <$> mapM existsFinType ts-    FTRecord fs   -> VRecord <$> mapM (traverseSnd existsFinType) fs---- Simulation environment --------------------------------------------------------data Env = Env-  { envVars :: Map.Map Name Value-  , envTypes :: Map.Map TVar (Either Nat' TValue)-  }--instance Monoid Env where-  mempty = Env-    { envVars  = Map.empty-    , envTypes = Map.empty-    }--  mappend l r = Env-    { envVars  = Map.union (envVars  l) (envVars  r)-    , envTypes = Map.union (envTypes l) (envTypes r)-    }---- | Bind a variable in the evaluation environment.-bindVar :: (Name, Value) -> Env -> Env-bindVar (n, thunk) env = env { envVars = Map.insert n thunk (envVars env) }---- | Lookup a variable in the environment.-lookupVar :: Name -> Env -> Maybe Value-lookupVar n env = Map.lookup n (envVars env)---- | Bind a type variable of kind *.-bindType :: TVar -> (Either Nat' TValue) -> Env -> Env-bindType p ty env = env { envTypes = Map.insert p ty (envTypes env) }---- | Lookup a type variable.-lookupType :: TVar -> Env -> Maybe (Either Nat' TValue)-lookupType p env = Map.lookup p (envTypes env)---- Expressions -------------------------------------------------------------------evalExpr :: Env -> Expr -> Value-evalExpr env expr =-  case expr of-    EList es ty       -> VSeq (tIsBit ty) (map eval es)-    ETuple es         -> VTuple (map eval es)-    ERec fields       -> VRecord [ (f, eval e) | (f, e) <- fields ]-    ESel e sel        -> evalSel sel (eval e)-    EIf b e1 e2       -> iteValue (fromVBit (eval b)) (eval e1) (eval e2)-    EComp ty e mss    -> evalComp env (evalValType env ty) e mss-    EVar n            -> case lookupVar n env of-                           Just x -> x-                           _ -> panic "Cryptol.Symbolic.evalExpr" [ "Variable " ++ show n ++ " not found" ]-    -- TODO: how to deal with uninterpreted functions?-    ETAbs tv e -> case tpKind tv of-      KType -> VPoly $ \ty -> evalExpr (bindType (tpVar tv) (Right ty) env) e-      KNum  -> VNumPoly $ \n -> evalExpr (bindType (tpVar tv) (Left n) env) e-      k     -> panic "[Symbolic] evalExpr" ["invalid kind on type abstraction", show k]-    ETApp e ty        -> case eval e of-      VPoly f    -> f (evalValType env ty)-      VNumPoly f -> f (evalNumType env ty)-      _          -> panic "[Symbolic] evalExpr"-                         [ "expected a polymorphic value"-                         , show e, show ty-                         ]-    EApp e1 e2        -> fromVFun (eval e1) (eval e2)-    EAbs n _ty e      -> VFun $ \x -> evalExpr (bindVar (n, x) env) e-    EProofAbs _prop e -> eval e-    EProofApp e       -> eval e-    ECast e _ty       -> eval e-    EWhere e ds       -> evalExpr (evalDecls env ds) e-    where-      eval e = evalExpr env e--evalValType :: Env -> Type -> TValue-evalValType env ty = Cryptol.Eval.Type.evalValType env' ty-  where env' = Cryptol.Eval.Env.EvalEnv Map.empty (envTypes env)--evalNumType :: Env -> Type -> Nat'-evalNumType env ty = Cryptol.Eval.Type.evalNumType env' ty-  where env' = Cryptol.Eval.Env.EvalEnv Map.empty (envTypes env)--evalSel :: Selector -> Value -> Value-evalSel sel v =-  case sel of-    TupleSel n _  ->-      case v of-        VTuple xs  -> xs !! n -- 0-based indexing-        VSeq b xs  -> VSeq b (map (evalSel sel) xs)-        VStream xs -> VStream (map (evalSel sel) xs)-        VFun f     -> VFun (\x -> evalSel sel (f x))-        _ -> panic "Cryptol.Symbolic.evalSel" [ "Tuple selector applied to incompatible type" ]--    RecordSel n _ ->-      case v of-        VRecord bs  -> case lookup n bs of-                         Just x -> x-                         _ -> panic "Cryptol.Symbolic.evalSel" [ "Selector " ++ show n ++ " not found" ]-        VSeq b xs   -> VSeq b (map (evalSel sel) xs)-        VStream xs  -> VStream (map (evalSel sel) xs)-        VFun f      -> VFun (\x -> evalSel sel (f x))-        _ -> panic "Cryptol.Symbolic.evalSel" [ "Record selector applied to non-record" ]--    ListSel n _   -> case v of-                       VWord s -> VBit (SBV.svTestBit s i)-                                    where i = SBV.intSizeOf s - 1 - n-                       _       -> fromSeq v !! n  -- 0-based indexing---- Declarations ------------------------------------------------------------------evalDecls :: Env -> [DeclGroup] -> Env-evalDecls = foldl evalDeclGroup--evalDeclGroup :: Env -> DeclGroup -> Env-evalDeclGroup env dg =-  case dg of-    NonRecursive d -> bindVar (evalDecl env d) env-    Recursive ds   -> let env' = foldr bindVar env lazyBindings-                          bindings = map (evalDecl env') ds-                          lazyBindings = [ (qname, copyBySchema env (dSignature d) v)-                                         | (d, (qname, v)) <- zip ds bindings ]-                      in env'--evalDecl :: Env -> Decl -> (Name, Value)-evalDecl env d = (dName d, body)-  where-  body = case dDefinition d of-           DExpr e -> evalExpr env e-           DPrim   -> evalPrim d---- | Make a copy of the given value, building the spine based only on--- the type without forcing the value argument. This lets us avoid--- strictness problems when evaluating recursive definitions.-copyBySchema :: Env -> Schema -> Value -> Value-copyBySchema env0 (Forall params _props ty) = go params env0-  where-    go [] env v = copyByType env (evalValType env ty) v-    go (p : ps) env v =-      case tpKind p of-        KType -> VPoly (\t -> go ps (bindType (tpVar p) (Right t) env) (fromVPoly v t))-        KNum -> VNumPoly (\t -> go ps (bindType (tpVar p) (Left t) env) (fromVNumPoly v t))-        k -> panic "[Eval] copyBySchema" ["invalid kind on type abstraction", show k]--copyByType :: Env -> TValue -> Value -> Value-copyByType env ty v =-  case ty of-    TVBit       -> VBit (fromVBit v)-    TVSeq _ ety -> VSeq (isTBit ety) (fromSeq v)-    TVStream _  -> VStream (fromSeq v)-    TVFun _ bty -> VFun (\x -> copyByType env bty (fromVFun v x))-    TVTuple tys -> VTuple (zipWith (copyByType env) tys (fromVTuple v))-    TVRec fs    -> VRecord [ (f, copyByType env t (lookupRecord f v)) | (f, t) <- fs ]--- copyByType env ty v = logicUnary id id (evalValType env ty) v---- List Comprehensions ------------------------------------------------------------- | Evaluate a comprehension.-evalComp :: Env -> TValue -> Expr -> [[Match]] -> Value-evalComp env seqty body ms =-  case Eval.isTSeq seqty of-    Just (len, el) -> toSeq len el [ evalExpr e body | e <- envs ]-    Nothing -> evalPanic "Cryptol.Eval" ["evalComp given a non sequence", show seqty]--  -- XXX we could potentially print this as a number if the type was available.-  where-  -- generate a new environment for each iteration of each parallel branch-  benvs = map (branchEnvs env) ms--  -- take parallel slices of each environment.  when the length of the list-  -- drops below the number of branches, one branch has terminated.-  allBranches es = length es == length ms-  slices         = takeWhile allBranches (transpose benvs)--  -- join environments to produce environments at each step through the process.-  envs = map mconcat slices---- | Turn a list of matches into the final environments for each iteration of--- the branch.-branchEnvs :: Env -> [Match] -> [Env]-branchEnvs env matches =-  case matches of-    []     -> [env]-    m : ms -> do env' <- evalMatch env m-                 branchEnvs env' ms---- | Turn a match into the list of environments it represents.-evalMatch :: Env -> Match -> [Env]-evalMatch env m = case m of-  From n _ty expr -> [ bindVar (n, v) env | v <- fromSeq (evalExpr env expr) ]-  Let d           -> [ bindVar (evalDecl env d) env ]+    FTSeq 0 FTBit -> return $ Eval.word 0 0+    FTSeq n FTBit -> VWord (toInteger n) . return . Eval.WordVal <$> (existsBV_ n)+    FTSeq n t     -> do vs <- replicateM n (existsFinType t)+                        return $ VSeq (toInteger n) $ Eval.finiteSeqMap (map Eval.ready vs)+    FTTuple ts    -> VTuple <$> mapM (fmap Eval.ready . existsFinType) ts+    FTRecord fs   -> VRecord <$> mapM (traverseSnd (fmap Eval.ready . existsFinType)) fs
src/Cryptol/Symbolic/Prims.hs view
@@ -8,18 +8,40 @@  {-# LANGUAGE RecordWildCards #-} {-# LANGUAGE PatternGuards #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE Rank2Types #-}+{-# LANGUAGE LambdaCase #-} {-# LANGUAGE ViewPatterns #-} {-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE TypeSynonymInstances #-}+{-# OPTIONS_GHC -fno-warn-orphans #-}+ module Cryptol.Symbolic.Prims where -import Data.List (genericDrop, genericReplicate, genericSplitAt, genericTake, sortBy, transpose)+import Control.Monad (unless)+import Data.Bits+import Data.List (genericTake, sortBy) import Data.Ord (comparing)+import qualified Data.Sequence as Seq+import qualified Data.Foldable as Fold -import Cryptol.Eval.Value (BitWord(..))-import Cryptol.Prims.Eval (binary, unary)+import Cryptol.Eval.Monad (Eval(..), ready, invalidIndex)+import Cryptol.Eval.Type  (finNat', TValue(..))+import Cryptol.Eval.Value (BitWord(..), EvalPrims(..), enumerateSeqMap, SeqMap(..),+                          reverseSeqMap, wlam, nlam, WordValue(..),+                          asWordVal, asBitsVal, fromWordVal,+                          updateSeqMap, lookupSeqMap, memoMap )+import Cryptol.Prims.Eval (binary, unary, arithUnary,+                           arithBinary, Binary, BinArith,+                           logicBinary, logicUnary, zeroV,+                           ccatV, splitAtV, joinV, ecSplitV,+                           reverseV, infFromV, infFromThenV,+                           fromThenV, fromToV, fromThenToV,+                           transposeV, indexPrimOne, indexPrimMany,+                           ecDemoteV, updatePrim) import Cryptol.Symbolic.Value import Cryptol.TypeCheck.AST (Decl(..))-import Cryptol.TypeCheck.Solver.InfNat(Nat'(..), nMul)+import Cryptol.TypeCheck.Solver.InfNat(Nat'(..)) import Cryptol.Utils.Panic import Cryptol.ModuleSystem.Name (asPrim) import Cryptol.Utils.Ident (Ident,mkIdent)@@ -31,19 +53,24 @@  import Prelude () import Prelude.Compat+import Control.Monad (join)  traverseSnd :: Functor f => (a -> f b) -> (t, a) -> f (t, b) traverseSnd f (x, y) = (,) x <$> f y  -- Primitives ------------------------------------------------------------------ -evalPrim :: Decl -> Value-evalPrim Decl { dName = n, .. }-  | Just prim <- asPrim n, Just val <- Map.lookup prim primTable = val+instance EvalPrims SBool SWord where+  evalPrim Decl { dName = n, .. }+    | Just prim <- asPrim n, Just val <- Map.lookup prim primTable = val -evalPrim Decl { .. } =-    panic "Eval" [ "Unimplemented primitive", show dName ]+  evalPrim Decl { .. } =+      panic "Eval" [ "Unimplemented primitive", show dName ] +  iteValue b x y+    | Just b' <- SBV.svAsBool b = if b' then x else y+    | otherwise = iteSValue b <$> x <*> y+ -- See also Cryptol.Prims.Eval.primTable primTable :: Map.Map Ident Value primTable  = Map.fromList $ map (\(n, v) -> (mkIdent (T.pack n), v))@@ -51,422 +78,419 @@   , ("False"       , VBit SBV.svFalse)   , ("demote"      , ecDemoteV) -- Converts a numeric type into its corresponding value.                                 -- { val, bits } (fin val, fin bits, bits >= width val) => [bits]-  , ("+"           , binary (arithBinary SBV.svPlus)) -- {a} (Arith a) => a -> a -> a-  , ("-"           , binary (arithBinary SBV.svMinus)) -- {a} (Arith a) => a -> a -> a-  , ("*"           , binary (arithBinary SBV.svTimes)) -- {a} (Arith a) => a -> a -> a-  , ("/"           , binary (arithBinary SBV.svQuot)) -- {a} (Arith a) => a -> a -> a-  , ("%"           , binary (arithBinary SBV.svRem)) -- {a} (Arith a) => a -> a -> a+  , ("+"           , binary (arithBinary (liftBinArith SBV.svPlus))) -- {a} (Arith a) => a -> a -> a+  , ("-"           , binary (arithBinary (liftBinArith SBV.svMinus))) -- {a} (Arith a) => a -> a -> a+  , ("*"           , binary (arithBinary (liftBinArith SBV.svTimes))) -- {a} (Arith a) => a -> a -> a+  , ("/"           , binary (arithBinary (liftBinArith SBV.svQuot))) -- {a} (Arith a) => a -> a -> a+  , ("%"           , binary (arithBinary (liftBinArith SBV.svRem))) -- {a} (Arith a) => a -> a -> a   , ("^^"          , binary (arithBinary sExp)) -- {a} (Arith a) => a -> a -> a   , ("lg2"         , unary (arithUnary sLg2)) -- {a} (Arith a) => a -> a-  , ("negate"      , unary (arithUnary SBV.svUNeg))-+  , ("negate"      , unary (arithUnary (\_ -> ready . SBV.svUNeg)))   , ("<"           , binary (cmpBinary cmpLt cmpLt SBV.svFalse))   , (">"           , binary (cmpBinary cmpGt cmpGt SBV.svFalse))   , ("<="          , binary (cmpBinary cmpLtEq cmpLtEq SBV.svTrue))   , (">="          , binary (cmpBinary cmpGtEq cmpGtEq SBV.svTrue))   , ("=="          , binary (cmpBinary cmpEq cmpEq SBV.svTrue))   , ("!="          , binary (cmpBinary cmpNotEq cmpNotEq SBV.svFalse))-   , ("&&"          , binary (logicBinary SBV.svAnd SBV.svAnd))   , ("||"          , binary (logicBinary SBV.svOr SBV.svOr))   , ("^"           , binary (logicBinary SBV.svXOr SBV.svXOr))   , ("complement"  , unary (logicUnary SBV.svNot SBV.svNot))-  , ("zero"        , VPoly zeroV)--  , ("<<"          ,  -- {m,n,a} (fin n) => [m] a -> [n] -> [m] a-      nlam $ \m ->-      tlam $ \_ ->-      tlam $ \a ->-      VFun $ \xs ->-      VFun $ \y ->-        case xs of-          VWord x -> VWord (SBV.svShiftLeft x (fromVWord y))-          _ ->-            let shl :: Integer -> Value-                shl i =-                  case m of-                    Inf               -> dropV i xs-                    Nat j | i >= j    -> replicateV j a (zeroV a)-                          | otherwise -> catV (dropV i xs) (replicateV i a (zeroV a))--             in selectV shl y)--  , (">>"          , -- {m,n,a} (fin n) => [m] a -> [n] -> [m] a-      nlam $ \m ->-      tlam $ \_ ->-      tlam $ \a ->-      VFun $ \xs ->-      VFun $ \y ->-        case xs of-          VWord x -> VWord (SBV.svShiftRight x (fromVWord y))-          _ ->-           let shr :: Integer -> Value-               shr i =-                 case m of-                   Inf               -> catV (replicateV i a (zeroV a)) xs-                   Nat j | i >= j    -> replicateV j a (zeroV a)-                         | otherwise -> catV (replicateV i a (zeroV a)) (takeV (j - i) xs)-             in selectV shr y)--  , ("<<<"         , -- {m,n,a} (fin m, fin n) => [m] a -> [n] -> [m] a-      nlam $ \m ->-      tlam $ \_ ->-      tlam $ \_ ->-      VFun $ \xs ->-      VFun $ \y ->-        case xs of-          VWord x -> VWord (SBV.svRotateLeft x (fromVWord y))-          _ -> let rol :: Integer -> Value-                   rol i = catV (dropV k xs) (takeV k xs)-                     where k = i `mod` finNat' m-                in selectV rol y)--  , (">>>"         , -- {m,n,a} (fin m, fin n) => [m] a -> [n] -> [m] a-      nlam $ \m ->-      tlam $ \_ ->-      tlam $ \_ ->-      VFun $ \xs ->-      VFun $ \y ->-        case xs of-          VWord x -> VWord (SBV.svRotateRight x (fromVWord y))-          _ ->-            let ror :: Integer -> Value-                ror i = catV (dropV k xs) (takeV k xs)-                  where k = (- i) `mod` finNat' m-             in selectV ror y)+  , ("zero"        , tlam zeroV)+  , ("<<"          , logicShift "<<"+                       SBV.svShiftLeft+                       (\sz i shft ->+                         case sz of+                           Inf             -> Just (i+shft)+                           Nat n+                             | i+shft >= n -> Nothing+                             | otherwise   -> Just (i+shft)))+  , (">>"          , logicShift ">>"+                       SBV.svShiftRight+                       (\_sz i shft ->+                          if i-shft < 0 then Nothing else Just (i-shft)))+  , ("<<<"         , logicShift "<<<"+                       SBV.svRotateLeft+                       (\sz i shft ->+                          case sz of+                            Inf -> evalPanic "cannot rotate infinite sequence" []+                            Nat n -> Just ((i+shft) `mod` n)))+  , (">>>"         , logicShift ">>>"+                       SBV.svRotateRight+                       (\sz i shft ->+                          case sz of+                            Inf -> evalPanic "cannot rotate infinite sequence" []+                            Nat n -> Just ((i+n-shft) `mod` n))) -  , ("#"           , -- {a,b,d} (fin a) => [a] d -> [b] d -> [a + b] d-      tlam $ \_ ->-      tlam $ \_ ->-      tlam $ \_ ->-      VFun $ \v1 ->-      VFun $ \v2 -> catV v1 v2)+  , ("#"          , -- {a,b,d} (fin a) => [a] d -> [b] d -> [a + b] d+     nlam $ \ front ->+     nlam $ \ back  ->+     tlam $ \ elty  ->+     lam  $ \ l     -> return $+     lam  $ \ r     -> join (ccatV front back elty <$> l <*> r)) -  , ("splitAt"     , -- {a,b,c} (fin a) => [a+b] c -> ([a]c,[b]c)-      nlam $ \(finNat' -> a) ->-      nlam $ \_ ->-      tlam $ \_ ->-      VFun $ \v -> VTuple [takeV a v, dropV a v])+  , ("splitAt"    ,+     nlam $ \ front ->+     nlam $ \ back  ->+     tlam $ \ a     ->+     lam  $ \ x     ->+       splitAtV front back a =<< x) -  , ("join"        , nlam $ \ parts ->-                     nlam $ \ each  ->-                     tlam $ \ a     -> lam (joinV parts each a))+  , ("join"       ,+     nlam $ \ parts ->+     nlam $ \ (finNat' -> each)  ->+     tlam $ \ a     ->+     lam  $ \ x     ->+       joinV parts each a =<< x)    , ("split"       , ecSplitV) -  , ("reverse"     ,-      nlam $ \a ->-      tlam $ \b ->-       lam $ \(fromSeq -> xs) -> toSeq a b (reverse xs))--  , ("transpose"    ,-      nlam $ \a ->-      nlam $ \b ->-      tlam $ \c ->-       lam $ \((map fromSeq . fromSeq) -> xs) ->-          case a of-             Nat 0 ->-               let v = toSeq a c []-               in case b of-                    Nat n -> toSeq b (tvSeq a c) $ genericReplicate n v-                    Inf   -> VStream $ repeat v-             _ -> toSeq b (tvSeq a c) $ map (toSeq a c) $ transpose xs)--  , ("@"           , -- {n,a,i} (fin i) => [n]a -> [i] -> a-      tlam $ \_ ->-      tlam $ \a ->-      tlam $ \_ ->-      VFun $ \xs ->-      VFun $ \y ->-        let isInf = case xs of VStream _ -> True; _ -> False-            err = zeroV a -- default for out-of-bounds accesses-        in atV isInf err (fromSeq xs) y)--  , ("@@"          , -- {n,a,m,i} (fin i) => [n]a -> [m][i] -> [m]a-      tlam $ \_ ->-      tlam $ \a ->-      tlam $ \_ ->-      tlam $ \_ ->-      VFun $ \xs ->-      VFun $ \ys ->-        let isInf = case xs of VStream _ -> True; _ -> False-            err = zeroV a -- default for out-of-bounds accesses-        in atV_list (isTBit a) isInf err (fromSeq xs) ys)--  , ("!"           , -- {n,a,i} (fin n, fin i) => [n]a -> [i] -> a-      tlam $ \_ ->-      tlam $ \a ->-      tlam $ \_ ->-      VFun $ \xs ->-      VFun $ \y ->-        let err = zeroV a -- default for out-of-bounds accesses-            isInf = False -- type of (!) guarantess finite sequences-        in atV isInf err (reverse $ fromSeq xs) y)+  , ("reverse"    , nlam $ \_a ->+                    tlam $ \_b ->+                     lam $ \xs -> reverseV =<< xs) -  , ("!!"          , -- {n,a,m,i} (fin n, fin i) => [n]a -> [m][i] -> [m]a-      tlam $ \_ ->-      tlam $ \a ->-      tlam $ \_ ->-      tlam $ \_ ->-      VFun $ \xs ->-      VFun $ \ys ->-        let err = zeroV a -- default for out-of-bounds accesses-            isInf = False -- type of (!!) guarantess finite sequences-        in atV_list (isTBit a) isInf err (reverse $ fromSeq xs) ys)+  , ("transpose"  , nlam $ \a ->+                    nlam $ \b ->+                    tlam $ \c ->+                     lam $ \xs -> transposeV a b c =<< xs)    , ("fromThen"    , fromThenV)   , ("fromTo"      , fromToV)   , ("fromThenTo"  , fromThenToV)--  , ("infFrom"     ,-      nlam $ \(finNat' -> bits)  ->-       lam $ \(fromVWord  -> first) ->-      toStream [ VWord (SBV.svPlus first (literalSWord (fromInteger bits) i)) | i <- [0 ..] ])+  , ("infFrom"     , infFromV)+  , ("infFromThen" , infFromThenV) -  , ("infFromThen" , -- {a} (fin a) => [a] -> [a] -> [inf][a]-      tlam $ \_ ->-       lam $ \(fromVWord -> first) ->-       lam $ \(fromVWord -> next) ->-      toStream (map VWord (iterate (SBV.svPlus (SBV.svMinus next first)) first)))+  , ("@"           , indexPrimOne  indexFront_bits indexFront)+  , ("@@"          , indexPrimMany indexFront_bits indexFront)+  , ("!"           , indexPrimOne  indexBack_bits indexBack)+  , ("!!"          , indexPrimMany indexBack_bits indexBack) -    -- {at,len} (fin len) => [len][8] -> at-  , ("error"       ,-      tlam $ \at ->-      nlam $ \(finNat' -> _len) ->-      VFun $ \_msg -> zeroV at) -- error/undefined, is arbitrarily translated to 0+  , ("update"      , updatePrim updateFrontSym_bits updateFrontSym)+  , ("updateEnd"   , updatePrim updateBackSym_bits updateBackSym) -  , ("pmult"       , -- {a,b} (fin a, fin b) => [a] -> [b] -> [max 1 (a + b) - 1]+  , ("pmult"       , -- {a,b} (fin a, fin b) => [1 + a] -> [1 + b] -> [1 + a + b]       nlam $ \(finNat' -> i) ->       nlam $ \(finNat' -> j) ->-      VFun $ \v1 ->-      VFun $ \v2 ->-        let k = max 1 (i + j) - 1+      VFun $ \v1 -> return $+      VFun $ \v2 -> do+        let k = 1 + i + j             mul _  []     ps = ps             mul as (b:bs) ps = mul (SBV.svFalse : as) bs (ites b (as `addPoly` ps) ps)-            xs = map fromVBit (fromSeq v1)-            ys = map fromVBit (fromSeq v2)-            zs = take (fromInteger k) (mul xs ys [] ++ repeat SBV.svFalse)-        in VSeq True (map VBit zs))+        xs <- sequence . Fold.toList . asBitsVal =<< fromWordVal "pmult 1" =<< v1+        ys <- sequence . Fold.toList . asBitsVal =<< fromWordVal "pmult 2" =<< v2+        let zs = genericTake k (mul xs ys [] ++ repeat SBV.svFalse)+        return $ VWord k $ return $ BitsVal $ Seq.fromList $ map ready zs)    , ("pdiv"        , -- {a,b} (fin a, fin b) => [a] -> [b] -> [a]       nlam $ \(finNat' -> i) ->-      tlam $ \_ ->-      VFun $ \v1 ->-      VFun $ \v2 ->-        let xs = map fromVBit (fromSeq v1)-            ys = map fromVBit (fromSeq v2)-            zs = take (fromInteger i) (fst (mdp (reverse xs) (reverse ys)) ++ repeat SBV.svFalse)-        in VSeq True (map VBit (reverse zs)))+      nlam $ \(finNat' -> _j) ->+      VFun $ \v1 -> return $+      VFun $ \v2 -> do+        xs <- sequence . Fold.toList . Seq.reverse . asBitsVal =<< fromWordVal "pdiv 1" =<< v1+        ys <- sequence . Fold.toList . Seq.reverse . asBitsVal =<< fromWordVal "pdiv 2" =<< v2+        let zs = genericTake i (fst (mdp xs ys) ++ repeat SBV.svFalse)+        return $ VWord i $ return $ BitsVal $ Seq.reverse $ Seq.fromList $ map ready zs)    , ("pmod"        , -- {a,b} (fin a, fin b) => [a] -> [b+1] -> [b]-      nlam $ \_ ->+      nlam $ \(finNat' -> _i) ->       nlam $ \(finNat' -> j) ->-      VFun $ \v1 ->-      VFun $ \v2 ->-        let xs = map fromVBit (fromSeq v1)-            ys = map fromVBit (fromSeq v2)-            zs = take (fromInteger j) (snd (mdp (reverse xs) (reverse ys)) ++ repeat SBV.svFalse)-        in VSeq True (map VBit (reverse zs)))+      VFun $ \v1 -> return $+      VFun $ \v2 -> do+        xs <- sequence . Fold.toList . Seq.reverse . asBitsVal =<< fromWordVal "pmod 1" =<< v1+        ys <- sequence . Fold.toList . Seq.reverse . asBitsVal =<< fromWordVal "pmod 2" =<< v2+        let zs = genericTake j (snd (mdp xs ys) ++ repeat SBV.svFalse)+        return $ VWord j $ return $ BitsVal $ Seq.reverse $ Seq.fromList $ map ready zs) -  , ("random"      , panic "Cryptol.Symbolic.Prims.evalECon"-                       [ "can't symbolically evaluae ECRandom" ])+    -- {at,len} (fin len) => [len][8] -> at+  , ("error"       ,+      tlam $ \at ->+      nlam $ \(finNat' -> _len) ->+      VFun $ \_msg ->+        return $ zeroV at) -- error/undefined, is arbitrarily translated to 0++  , ("random"      ,+      tlam $ \_a ->+      wlam $ \_x ->+         Thunk $ return $ panic+            "Cryptol.Symbolic.Prims.evalECon"+            [ "can't symbolically evaluate ECRandom" ])++     -- The trace function simply forces its first two+     -- values before returing the third in the symbolic+     -- evaluator.+  , ("trace",+      nlam $ \_n ->+      tlam $ \_a ->+      tlam $ \_b ->+       lam $ \s -> return $+       lam $ \x -> return $+       lam $ \y -> do+         _ <- s+         _ <- x+         y)   ]  -selectV :: (Integer -> Value) -> Value -> Value-selectV f v = sel 0 bits+iteWord :: SBool+        -> Eval (WordValue SBool SWord)+        -> Eval (WordValue SBool SWord)+        -> Eval (WordValue SBool SWord)+iteWord c x y = mergeWord True c <$> x <*> y+++-- | Barrel-shifter algorithm. Takes a list of bits in big-endian order.+shifter :: Monad m => (SBool -> a -> a -> a) -> (a -> Integer -> m a) -> a -> [SBool] -> m a+shifter mux op = go   where-    bits = map fromVBit (fromSeq v) -- index bits in big-endian order+    go x [] = return x+    go x (b : bs) = do+      x' <- op x (2 ^ length bs)+      go (mux b x' x) bs -    sel :: Integer -> [SBool] -> Value+logicShift :: String+           -> (SWord -> SWord -> SWord)+           -> (Nat' -> Integer -> Integer -> Maybe Integer)+           -> Value+logicShift nm wop reindex =+      nlam $ \_m ->+      nlam $ \_n ->+      tlam $ \a ->+      VFun $ \xs -> return $+      VFun $ \y -> do+        idx <- fromWordVal "logicShift" =<< y++        xs >>= \case+          VWord w x ->+             return $ VWord w $ do+               x >>= \case+                 WordVal x' -> WordVal . wop x' <$> asWordVal idx+                 wv ->+                   do idx_bits <- sequence $ Fold.toList $ asBitsVal idx+                      let op bs shft = return $ Seq.fromFunction (Seq.length bs) $ \i ->+                                             case reindex (Nat w) (toInteger i) shft of+                                               Nothing -> return $ bitLit False+                                               Just i' -> Seq.index bs (fromInteger i')+                      BitsVal <$> shifter (mergeBits True) op (asBitsVal wv) idx_bits++          VSeq w vs0  ->+             do idx_bits <- sequence $ Fold.toList $ asBitsVal idx+                let op vs shft = memoMap $ IndexSeqMap $ \i ->+                                   case reindex (Nat w) i shft of+                                     Nothing -> return $ zeroV a+                                     Just i' -> lookupSeqMap vs i'+                VSeq w <$> shifter (mergeSeqMap True) op vs0 idx_bits++          VStream vs0 ->+             do idx_bits <- sequence $ Fold.toList $ asBitsVal idx+                let op vs shft = memoMap $ IndexSeqMap $ \i ->+                                   case reindex Inf i shft of+                                     Nothing -> return $ zeroV a+                                     Just i' -> lookupSeqMap vs i'+                VStream <$> shifter (mergeSeqMap True) op vs0 idx_bits++          _ -> evalPanic "expected sequence value in shift operation" [nm]+++selectV :: forall a+         . (SBool -> Eval a -> Eval a -> Eval a)+        -> WordValue SBool SWord+        -> (Integer -> Eval a)+        -> Eval a+selectV mux val f =+   case val of+     WordVal x | Just idx <- SBV.svAsInteger x -> f idx+               | otherwise -> sel 0 (unpackWord x)+     BitsVal bs -> sel 0 =<< sequence (Fold.toList bs)++ where     sel offset []       = f offset-    sel offset (b : bs) = iteValue b m1 m2-      where m1 = sel (offset + 2 ^ length bs) bs+    sel offset (b : bs) = mux b m1 m2+      where m1 = sel (offset + (2 ^ length bs)) bs             m2 = sel offset bs -asWordList :: [Value] -> Maybe [SWord]-asWordList = go id- where go :: ([SWord] -> [SWord]) -> [Value] -> Maybe [SWord]-       go f [] = Just (f [])-       go f (VWord x:vs)      = go (f . (x:)) vs-       go f (VSeq True bs:vs) = go (f . (x:)) vs-              where x = packWord $ map fromVBit bs-       go _ _ = Nothing -atV_list :: Bool -- Are the elements of the resulting sequence bits?-         -> Bool -- Is this an infinite sequence?-         -> Value -- default value-         -> [Value] -- values to select-         -> Value   -- index-         -> Value+indexFront :: Maybe Integer+           -> TValue+           -> SeqMap SBool SWord+           -> SWord+           -> Eval Value+indexFront mblen a xs idx+  | Just i <- SBV.svAsInteger idx+  = lookupSeqMap xs i --- Use SBV selection primitives if possible--- NB: only examine the list if it is finite-atV_list isBit False def (asWordList -> Just ws) v =-  case v of-    VSeq _ ys ->-      VSeq isBit $ map (VWord . SBV.svSelect ws (fromVWord def) . fromVWord) ys-    VStream ys ->-      VStream $ map (VWord . SBV.svSelect ws (fromVWord def) . fromVWord) ys-    _ -> panic "Cryptol.Symbolic.Prims.atV_list" [ "non-mappable value" ]+  | Just n <- mblen+  , TVSeq wlen TVBit <- a+  = do wvs <- traverse (fromWordVal "indexFront" =<<) (enumerateSeqMap n xs)+       case asWordList wvs of+         Just ws ->+           return $ VWord n $ ready $ WordVal $ SBV.svSelect ws (wordLit wlen 0) idx+         Nothing -> foldr f def [0 .. 2^w  - 1] -atV_list isBit _ def xs v =-  case v of-    VSeq _  ys ->-      VSeq isBit $ map (iteAtV def xs) ys-    VStream ys ->-      VStream $ map (iteAtV def xs) ys-    _ -> panic "Cryptol.Symbolic.Prims.atV_list" [ "non-mappable value" ]+  | otherwise+  = foldr f def [0 .. 2^w  - 1] + where+    k = SBV.kindOf idx+    w = SBV.intSizeOf idx+    def = ready $ zeroV a+    f n y = iteValue (SBV.svEqual idx (SBV.svInteger k n)) (lookupSeqMap xs n) y -atV :: Bool -- Is this an infinite sequence?-    -> Value -- default value-    -> [Value] -- values to select-    -> Value   -- index-    -> Value --- When applicable, use the SBV selection operation--- NB: only examine the list if it is finite-atV False def (asWordList -> Just ws) i =-  VWord $ SBV.svSelect ws (fromVWord def) (fromVWord i)+indexBack :: Maybe Integer+          -> TValue+          -> SeqMap SBool SWord+          -> SWord+          -> Eval Value+indexBack (Just n) a xs idx = indexFront (Just n) a (reverseSeqMap n xs) idx+indexBack Nothing _ _ _ = evalPanic "Expected finite sequence" ["indexBack"] --- Otherwise, decompose into a sequence of if/then/else operations-atV _ def vs i = iteAtV def vs i+indexFront_bits :: Maybe Integer+                -> TValue+                -> SeqMap SBool SWord+                -> Seq.Seq SBool+                -> Eval Value+indexFront_bits mblen a xs bits0 = go 0 (length bits0) (Fold.toList bits0)+ where+  go :: Integer -> Int -> [SBool] -> Eval Value+  go i _k []+    -- For indices out of range, return 0 arbitrarily+    | Just n <- mblen+    , i >= n+    = return $ zeroV a --- Select a value at an index by building a sequence of if/then/else operations-iteAtV :: Value -> [Value] -> Value -> Value-iteAtV def vs i =-  case i of-    VSeq True (map fromVBit -> bits) -> -- index bits in big-endian order-      case foldr weave vs bits of-        [] -> def-        y : _ -> y-    VWord x -> foldr f def (zip [0 .. 2 ^ SBV.intSizeOf x - 1] vs)-      where-        k = SBV.kindOf x-        f (n, v) y = iteValue (SBV.svEqual x (SBV.svInteger k n)) v y-    _ -> evalPanic "Cryptol.Symbolic.Prims.selectV" ["Invalid index argument"]-  where-    weave :: SBool -> [Value] -> [Value]-    weave _ [] = []-    weave b [x1] = [iteValue b def x1]-    weave b (x1 : x2 : xs) = iteValue b x2 x1 : weave b xs+    | otherwise+    = lookupSeqMap xs i +  go i k (b:bs)+    | Just n <- mblen+    , (i `shiftL` k) >= n+    = return $ zeroV a +    | otherwise+    = iteValue b (go ((i `shiftL` 1) + 1) (k-1) bs)+                 (go  (i `shiftL` 1)      (k-1) bs) -replicateV :: Integer -- ^ number of elements-           -> TValue  -- ^ type of element-           -> Value   -- ^ element-           -> Value-replicateV n TVBit x = VSeq True  (genericReplicate n x)-replicateV n _     x = VSeq False (genericReplicate n x)+indexBack_bits :: Maybe Integer+               -> TValue+               -> SeqMap SBool SWord+               -> Seq.Seq SBool+               -> Eval Value+indexBack_bits (Just n) a xs idx = indexFront_bits (Just n) a (reverseSeqMap n xs) idx+indexBack_bits Nothing _ _ _ = evalPanic "Expected finite sequence" ["indexBack_bits"] -nth :: a -> [a] -> Int -> a-nth def [] _ = def-nth def (x : xs) n-  | n == 0    = x-  | otherwise = nth def xs (n - 1) -nthV :: Value -> Value -> Integer -> Value-nthV err v n =-  case v of-    VStream xs -> nth err xs (fromInteger n)-    VSeq _ xs  -> nth err xs (fromInteger n)-    VWord x                 -> let i = SBV.intSizeOf x - 1 - fromInteger n-                               in if i < 0 then err else-                                    VBit (SBV.svTestBit x i)-    _                       -> err+updateFrontSym+  :: Nat'+  -> TValue+  -> SeqMap SBool SWord+  -> WordValue SBool SWord+  -> Eval (GenValue SBool SWord)+  -> Eval (SeqMap SBool SWord)+updateFrontSym len _eltTy vs w val = do+  -- TODO? alternate handling if w is a list of bits...+  case w of+    WordVal wv | Just j <- SBV.svAsInteger wv -> do+        case len of+          Inf -> return ()+          Nat n -> unless (j < n) (invalidIndex j)+        return $ updateSeqMap vs j val+    _ ->+        return $ IndexSeqMap $ \i ->+          selectV iteValue w $ \j ->+            if i == j then val else lookupSeqMap vs i -mapV :: Bool -> (Value -> Value) -> Value -> Value-mapV isBit f v =-  case v of-    VSeq _ xs  -> VSeq isBit (map f xs)-    VStream xs -> VStream (map f xs)-    _          -> panic "Cryptol.Symbolic.Prims.mapV" [ "non-mappable value" ]+updateFrontSym_bits+  :: Nat'+  -> TValue+  -> Seq.Seq (Eval SBool)+  -> WordValue SBool SWord+  -> Eval (GenValue SBool SWord)+  -> Eval (Seq.Seq (Eval SBool))+updateFrontSym_bits Inf _ _ _ _ = evalPanic "Expected finite sequence" ["updateFrontSym_bits"]+updateFrontSym_bits (Nat n) _eltTy bs w val = do+  -- TODO? alternate handling if w is a list of bits...+  case w of+    WordVal wv | Just j <- SBV.svAsInteger wv -> do+      unless (j < n) (invalidIndex j)+      return $! Seq.update (fromInteger j) (fromVBit <$> val) bs+    _ -> do+      let mergeBit' c x y = mergeBit True c <$> x <*> y+      return $ Seq.fromFunction (fromInteger n) $ \i ->+        selectV mergeBit' w $ \j ->+          if toInteger i == j then (fromVBit <$> val) else Seq.index bs i -catV :: Value -> Value -> Value-catV xs          (VStream ys) = VStream (fromSeq xs ++ ys)-catV (VWord x)   ys           = VWord (SBV.svJoin x (fromVWord ys))-catV xs          (VWord y)    = VWord (SBV.svJoin (fromVWord xs) y)-catV (VSeq b xs) (VSeq _ ys)  = VSeq b (xs ++ ys)-catV _ _ = panic "Cryptol.Symbolic.Prims.catV" [ "non-concatenable value" ]+updateBackSym+  :: Nat'+  -> TValue+  -> SeqMap SBool SWord+  -> WordValue SBool SWord+  -> Eval (GenValue SBool SWord)+  -> Eval (SeqMap SBool SWord)+updateBackSym Inf _ _ _ _ = evalPanic "Expected finite sequence" ["updateBackSym"]+updateBackSym (Nat n) _eltTy vs w val = do+  -- TODO? alternate handling if w is a list of bits...+  case w of+    WordVal wv | Just j <- SBV.svAsInteger wv -> do+        unless (j < n) (invalidIndex j)+        return $ updateSeqMap vs (n - j - 1) val+    _ ->+        return $ IndexSeqMap $ \i ->+          selectV iteValue w $ \j ->+            if i == (n - j - 1) then val else lookupSeqMap vs i -dropV :: Integer -> Value -> Value-dropV 0 xs = xs-dropV n xs =-  case xs of-    VSeq b xs'  -> VSeq b (genericDrop n xs')-    VStream xs' -> VStream (genericDrop n xs')-    VWord w     -> VWord $ SBV.svExtract (SBV.intSizeOf w - 1 - fromInteger n) 0 w-    _           -> panic "Cryptol.Symbolic.Prims.dropV" [ "non-droppable value" ]+updateBackSym_bits+  :: Nat'+  -> TValue+  -> Seq.Seq (Eval SBool)+  -> WordValue SBool SWord+  -> Eval (GenValue SBool SWord)+  -> Eval (Seq.Seq (Eval SBool))+updateBackSym_bits Inf _ _ _ _ = evalPanic "Expected finite sequence" ["updateBackSym_bits"]+updateBackSym_bits (Nat n) _eltTy bs w val = do+  -- TODO? alternate handling if w is a list of bits...+  case w of+    WordVal wv | Just j <- SBV.svAsInteger wv -> do+      unless (j < n) (invalidIndex j)+      return $! Seq.update (fromInteger (n - j - 1)) (fromVBit <$> val) bs+    _ -> do+      let mergeBit' c x y = mergeBit True c <$> x <*> y+      return $ Seq.fromFunction (fromInteger n) $ \i ->+        selectV mergeBit' w $ \j ->+          if toInteger i == (n - j - 1) then (fromVBit <$> val) else Seq.index bs i -takeV :: Integer -> Value -> Value-takeV n xs =-  case xs of-    VWord w     -> VWord $ SBV.svExtract (SBV.intSizeOf w - 1) (SBV.intSizeOf w - fromInteger n) w-    VSeq b xs'  -> VSeq b (genericTake n xs')-    VStream xs' -> VSeq b (genericTake n xs')-                     where b = case xs' of VBit _ : _ -> True-                                           _          -> False-    _           -> panic "Cryptol.Symbolic.Prims.takeV" [ "non-takeable value" ] --- | Make a numeric constant.--- { val, bits } (fin val, fin bits, bits >= width val) => [bits]-ecDemoteV :: Value-ecDemoteV = nlam $ \valT ->-            nlam $ \bitT ->-            case (valT, bitT) of-              (Nat v, Nat bs) -> VWord (literalSWord (fromInteger bs) v)-              _ -> evalPanic "Cryptol.Prove.evalECon"-                       ["Unexpected Inf in constant."-                       , show valT-                       , show bitT-                       ]+asBitList :: [Eval SBool] -> Maybe [SBool]+asBitList = go id+ where go :: ([SBool] -> [SBool]) -> [Eval SBool] -> Maybe [SBool]+       go f [] = Just (f [])+       go f (Ready b:vs) = go (f . (b:)) vs+       go _ _ = Nothing  --- Arith -----------------------------------------------------------------------+asWordList :: [WordValue SBool SWord] -> Maybe [SWord]+asWordList = go id+ where go :: ([SWord] -> [SWord]) -> [WordValue SBool SWord] -> Maybe [SWord]+       go f [] = Just (f [])+       go f (WordVal x :vs) = go (f . (x:)) vs+       go f (BitsVal bs:vs) =+              case asBitList (Fold.toList bs) of+                  Just xs -> go (f . (packWord xs:)) vs+                  Nothing -> Nothing -type Binary = TValue -> Value -> Value -> Value-type Unary = TValue -> Value -> Value --- | Models functions of type `{a} (Arith a) => a -> a -> a`-arithBinary :: (SWord -> SWord -> SWord) -> Binary-arithBinary op = loop-  where-    loop ty l r =-      case ty of-        TVBit         -> evalPanic "arithBinop" ["Invalid arguments"]-        TVSeq _ TVBit -> VWord (op (fromVWord l) (fromVWord r))-        TVSeq _ t     -> VSeq False (zipWith (loop t) (fromSeq l) (fromSeq r))-        TVStream t    -> VStream (zipWith (loop t) (fromSeq l) (fromSeq r))-        TVTuple ts    -> VTuple (zipWith3 loop ts (fromVTuple l) (fromVTuple r))-        TVRec fs      -> VRecord [ (f, loop t (lookupRecord f l) (lookupRecord f r)) | (f, t) <- fs ]-        TVFun _ t     -> VFun (\x -> loop t (fromVFun l x) (fromVFun r x))---- | Models functions of type `{a} (Arith a) => a -> a`-arithUnary :: (SWord -> SWord) -> Unary-arithUnary op = loop-  where-    loop ty v =-      case ty of-        TVBit         -> evalPanic "arithUnary" ["Invalid arguments"]-        TVSeq _ TVBit -> VWord (op (fromVWord v))-        TVSeq _ t     -> VSeq False (map (loop t) (fromSeq v))-        TVStream t    -> VStream (map (loop t) (fromSeq v))-        TVTuple ts    -> VTuple (zipWith loop ts (fromVTuple v))-        TVRec fs      -> VRecord [ (f, loop t (lookupRecord f v)) | (f, t) <- fs ]-        TVFun _ t     -> VFun (\x -> loop t (fromVFun v x))+liftBinArith :: (SWord -> SWord -> SWord) -> BinArith SWord+liftBinArith op _ x y = ready $ op x y -sExp :: SWord -> SWord -> SWord-sExp x y = go (reverse (unpackWord y)) -- bits in little-endian order+sExp :: Integer -> SWord -> SWord -> Eval SWord+sExp _w x y = ready $ go (reverse (unpackWord y)) -- bits in little-endian order   where go []       = literalSWord (SBV.intSizeOf x) 1         go (b : bs) = SBV.svIte b (SBV.svTimes x s) s             where a = go bs                   s = SBV.svTimes a a  -- | Ceiling (log_2 x)-sLg2 :: SWord -> SWord-sLg2 x = go 0+sLg2 :: Integer -> SWord -> Eval SWord+sLg2 _w x = ready $ go 0   where     lit n = literalSWord (SBV.intSizeOf x) n     go i | i < SBV.intSizeOf x = SBV.svIte (SBV.svLessEq x (lit (2^i))) (lit (toInteger i)) (go (i + 1))@@ -474,9 +498,9 @@  -- Cmp ------------------------------------------------------------------------- -cmpValue :: (SBool -> SBool -> a -> a)-         -> (SWord -> SWord -> a -> a)-         -> (Value -> Value -> a -> a)+cmpValue :: (SBool -> SBool -> Eval a -> Eval a)+         -> (SWord -> SWord -> Eval a -> Eval a)+         -> (Value -> Value -> Eval a -> Eval a) cmpValue fb fw = cmp   where     cmp v1 v2 k =@@ -485,172 +509,44 @@                                       in  cmpValues (vals fs1) (vals fs2) k         (VTuple vs1 , VTuple vs2 ) -> cmpValues vs1 vs2 k         (VBit b1    , VBit b2    ) -> fb b1 b2 k-        (VWord w1   , VWord w2   ) -> fw w1 w2 k-        (VSeq _ vs1 , VSeq _ vs2 ) -> cmpValues vs1 vs2 k+        (VWord _ w1 , VWord _ w2 ) -> join (fw <$> (asWordVal =<< w1)+                                               <*> (asWordVal =<< w2)+                                               <*> return k)+        (VSeq n vs1 , VSeq _ vs2 ) -> cmpValues (enumerateSeqMap n vs1)+                                                (enumerateSeqMap n vs2) k         (VStream {} , VStream {} ) -> panic "Cryptol.Symbolic.Prims.cmpValue"                                         [ "Infinite streams are not comparable" ]         (VFun {}    , VFun {}    ) -> panic "Cryptol.Symbolic.Prims.cmpValue"                                         [ "Functions are not comparable" ]         (VPoly {}   , VPoly {}   ) -> panic "Cryptol.Symbolic.Prims.cmpValue"                                         [ "Polymorphic values are not comparable" ]-        (VWord w1   , _          ) -> fw w1 (fromVWord v2) k-        (_          , VWord w2   ) -> fw (fromVWord v1) w2 k         (_          , _          ) -> panic "Cryptol.Symbolic.Prims.cmpValue"                                         [ "type mismatch" ] -    cmpValues (x1 : xs1) (x2 : xs2) k = cmp x1 x2 (cmpValues xs1 xs2 k)+    cmpValues (x1 : xs1) (x2 : xs2) k = do+          x1' <- x1+          x2' <- x2+          cmp x1' x2' (cmpValues xs1 xs2 k)     cmpValues _ _ k = k -cmpEq :: SWord -> SWord -> SBool -> SBool-cmpEq x y k = SBV.svAnd (SBV.svEqual x y) k--cmpNotEq :: SWord -> SWord -> SBool -> SBool-cmpNotEq x y k = SBV.svOr (SBV.svNotEqual x y) k--cmpLt, cmpGt :: SWord -> SWord -> SBool -> SBool-cmpLt x y k = SBV.svOr (SBV.svLessThan x y) (cmpEq x y k)-cmpGt x y k = SBV.svOr (SBV.svGreaterThan x y) (cmpEq x y k)--cmpLtEq, cmpGtEq :: SWord -> SWord -> SBool -> SBool-cmpLtEq x y k = SBV.svAnd (SBV.svLessEq x y) (cmpNotEq x y k)-cmpGtEq x y k = SBV.svAnd (SBV.svGreaterEq x y) (cmpNotEq x y k)--cmpBinary :: (SBool -> SBool -> SBool -> SBool)-          -> (SWord -> SWord -> SBool -> SBool)-          -> SBool -> Binary-cmpBinary fb fw b _ty v1 v2 = VBit (cmpValue fb fw v1 v2 b)----- Logic -------------------------------------------------------------------------errorV :: String -> TValue -> Value-errorV msg = go-  where-    go ty =-      case ty of-        TVBit         -> VBit (error msg)-        TVSeq n t     -> VSeq False (replicate (fromInteger n) (go t))-        TVStream t    -> VStream (repeat (go t))-        TVTuple ts    -> VTuple [ go t | t <- ts ]-        TVRec fs      -> VRecord [ (n, go t) | (n, t) <- fs ]-        TVFun _ t     -> VFun (const (go t))--zeroV :: TValue -> Value-zeroV = go-  where-    go ty =-      case ty of-        TVBit         -> VBit SBV.svFalse-        TVSeq n TVBit -> VWord (literalSWord (fromInteger n) 0)-        TVSeq n t     -> VSeq False (replicate (fromInteger n) (go t))-        TVStream t    -> VStream (repeat (go t))-        TVTuple ts    -> VTuple [ go t | t <- ts ]-        TVRec fs      -> VRecord [ (n, go t) | (n, t) <- fs ]-        TVFun _ t     -> VFun (const (go t))---- | Join a sequence of sequences into a single sequence.-joinV :: Nat' -> Nat' -> TValue -> Value -> Value-joinV parts each a v =-  let len = parts `nMul` each-  in toSeq len a (concatMap fromSeq (fromSeq v))---- | Split implementation.-ecSplitV :: Value-ecSplitV =-  nlam $ \ parts ->-  nlam $ \ each  ->-  tlam $ \ a     ->-  lam  $ \ v     ->-  let mkChunks f = map (toFinSeq a) $ f $ fromSeq v-  in case (parts, each) of-       (Nat p, Nat e) -> VSeq False $ mkChunks (finChunksOf p e)-       (Inf  , Nat e) -> toStream   $ mkChunks (infChunksOf e)-       _              -> evalPanic "splitV" ["invalid type arguments to split"]---- | Split into infinitely many chunks-infChunksOf :: Integer -> [a] -> [[a]]-infChunksOf each xs = let (as,bs) = genericSplitAt each xs-                      in as : infChunksOf each bs---- | Split into finitely many chunks-finChunksOf :: Integer -> Integer -> [a] -> [[a]]-finChunksOf 0 _ _ = []-finChunksOf parts each xs = let (as,bs) = genericSplitAt each xs-                            in as : finChunksOf (parts - 1) each bs---- | Merge two values given a binop.  This is used for and, or and xor.-logicBinary :: (SBool -> SBool -> SBool) -> (SWord -> SWord -> SWord) -> Binary-logicBinary bop op = loop-  where-    loop ty l r =-      case ty of-        TVBit         -> VBit (bop (fromVBit l) (fromVBit r))-        TVSeq _ TVBit -> VWord (op (fromVWord l) (fromVWord r))-        TVSeq _ t     -> VSeq False (zipWith (loop t) (fromSeq l) (fromSeq r))-        TVStream t    -> VStream (zipWith (loop t) (fromSeq l) (fromSeq r))-        TVTuple ts    -> VTuple (zipWith3 loop ts (fromVTuple l) (fromVTuple r))-        TVRec fs      -> VRecord [ (f, loop t (lookupRecord f l) (lookupRecord f r)) | (f, t) <- fs ]-        TVFun _ t     -> VFun (\x -> loop t (fromVFun l x) (fromVFun r x))--logicUnary :: (SBool -> SBool) -> (SWord -> SWord) -> Unary-logicUnary bop op = loop-  where-    loop ty v =-      case ty of-        TVBit         -> VBit (bop (fromVBit v))-        TVSeq _ TVBit -> VWord (op (fromVWord v))-        TVSeq _ t     -> VSeq False (map (loop t) (fromSeq v))-        TVStream t    -> VStream (map (loop t) (fromSeq v))-        TVTuple ts    -> VTuple (zipWith loop ts (fromVTuple v))-        TVRec fs      -> VRecord [ (f, loop t (lookupRecord f v)) | (f, t) <- fs ]-        TVFun _ t     -> VFun (\x -> loop t (fromVFun v x))---- @[ 0, 1 .. ]@-fromThenV :: Value-fromThenV  =-  nlam $ \ first ->-  nlam $ \ next  ->-  nlam $ \ bits  ->-  nlam $ \ len   ->-    case (first, next, len, bits) of-      (Nat first', Nat next', Nat len', Nat bits') ->-        let nums = enumFromThen first' next'-            lit i = VWord (literalSWord (fromInteger bits') i)-         in VSeq False (genericTake len' (map lit nums))-      _ -> evalPanic "fromThenV" ["invalid arguments"]---- @[ 0 .. 10 ]@-fromToV :: Value-fromToV  =-  nlam $ \ first ->-  nlam $ \ lst   ->-  nlam $ \ bits  ->-    case (first, lst, bits) of--      (Nat first', Nat lst', Nat bits') ->-        let nums = enumFromThenTo first' (first' + 1) lst'-            len  = 1 + (lst' - first')-            lit i = VWord (literalSWord (fromInteger bits') i)-         in VSeq False (genericTake len (map lit nums))+cmpEq :: SWord -> SWord -> Eval SBool -> Eval SBool+cmpEq x y k = SBV.svAnd (SBV.svEqual x y) <$> k -      _ -> evalPanic "fromThenV" ["invalid arguments"]+cmpNotEq :: SWord -> SWord -> Eval SBool -> Eval SBool+cmpNotEq x y k = SBV.svOr (SBV.svNotEqual x y) <$> k --- @[ 0, 1 .. 10 ]@-fromThenToV :: Value-fromThenToV  =-  nlam $ \ first ->-  nlam $ \ next  ->-  nlam $ \ lst   ->-  nlam $ \ bits  ->-  nlam $ \ len   ->-    case (first, next, lst, len, bits) of+cmpLt, cmpGt :: SWord -> SWord -> Eval SBool -> Eval SBool+cmpLt x y k = SBV.svOr (SBV.svLessThan x y) <$> (cmpEq x y k)+cmpGt x y k = SBV.svOr (SBV.svGreaterThan x y) <$> (cmpEq x y k) -      (Nat first', Nat next', Nat lst', Nat len', Nat bits') ->-        let nums = enumFromThenTo first' next' lst'-            lit i = VWord (literalSWord (fromInteger bits') i)-         in VSeq False (genericTake len' (map lit nums))+cmpLtEq, cmpGtEq :: SWord -> SWord -> Eval SBool -> Eval SBool+cmpLtEq x y k = SBV.svAnd (SBV.svLessEq x y) <$> (cmpNotEq x y k)+cmpGtEq x y k = SBV.svAnd (SBV.svGreaterEq x y) <$> (cmpNotEq x y k) -      _ -> evalPanic "fromThenV" ["invalid arguments"]+cmpBinary :: (SBool -> SBool -> Eval SBool -> Eval SBool)+          -> (SWord -> SWord -> Eval SBool -> Eval SBool)+          -> SBool -> Binary SBool SWord+cmpBinary fb fw b _ty v1 v2 = VBit <$> cmpValue fb fw v1 v2 (return b)  -- Polynomials ----------------------------------------------------------------- @@ -698,14 +594,14 @@  -- return the element at index i; if not enough elements, return false -- N.B. equivalent to '(xs ++ repeat false) !! i', but more efficient-idx :: [SBool] -> Int -> SBool-idx []     _ = SBV.svFalse-idx (x:_)  0 = x-idx (_:xs) i = idx xs (i-1)+nth :: [SBool] -> Int -> SBool+nth []     _ = SBV.svFalse+nth (x:_)  0 = x+nth (_:xs) i = nth xs (i-1)  divx :: Int -> Int -> [SBool] -> [SBool] -> ([SBool], [SBool]) divx n _ xs _ | n <= 0 = ([], xs) divx n i xs ys'        = (q:qs, rs)-  where q        = xs `idx` i+  where q        = xs `nth` i         xs'      = ites q (xs `addPoly` ys') xs         (qs, rs) = divx (n-1) (i-1) xs' (tail ys')
src/Cryptol/Symbolic/Value.hs view
@@ -9,6 +9,7 @@ {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE GeneralizedNewtypeDeriving #-} {-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE PatternGuards #-} {-# LANGUAGE TypeSynonymInstances #-} {-# OPTIONS_GHC -fno-warn-orphans #-} module Cryptol.Symbolic.Value@@ -18,26 +19,34 @@   , forallBV_, existsBV_   , forallSBool_, existsSBool_   , Value-  , TValue(..), isTBit, tvSeq-  , GenValue(..), lam, tlam, nlam, toStream, toFinSeq, toSeq, finNat'-  , fromVBit, fromVFun, fromVPoly, fromVNumPoly, fromVTuple, fromVRecord-  , lookupRecord+  , TValue, isTBit, tvSeq+  , GenValue(..), lam, tlam, toStream, toFinSeq, toSeq+  , fromVBit, fromVFun, fromVPoly, fromVTuple, fromVRecord, lookupRecord   , fromSeq, fromVWord   , evalPanic-  , iteValue, mergeValue+  , iteSValue, mergeValue, mergeWord, mergeBit, mergeBits, mergeSeqMap   )   where  import Data.List (foldl')+import qualified Data.Sequence as Seq  import Data.SBV.Dynamic -import Cryptol.Eval.Value (TValue(..), isTBit, tvSeq, finNat', GenValue(..),-                           BitWord(..), lam, tlam, nlam, toStream, toFinSeq, toSeq,+--import Cryptol.Eval.Monad+import Cryptol.Eval.Type   (TValue(..), isTBit, tvSeq)+import Cryptol.Eval.Monad  (Eval)+import Cryptol.Eval.Value  ( GenValue(..), BitWord(..), lam, tlam, toStream,+                           toFinSeq, toSeq, WordValue(..), asBitsVal,                            fromSeq, fromVBit, fromVWord, fromVFun, fromVPoly,-                           fromVNumPoly, fromVTuple, fromVRecord, lookupRecord)+                           fromVTuple, fromVRecord, lookupRecord, SeqMap(..),+                           ppBV,BV(..),integerToChar, lookupSeqMap ) import Cryptol.Utils.Panic (panic)+import Cryptol.Utils.PP +import Control.Monad.Reader (ask)+import Control.Monad.Trans  (liftIO)+ -- SBool and SWord -------------------------------------------------------------  type SBool = SVal@@ -51,16 +60,16 @@ literalSWord w i = svInteger (KBounded False w) i  forallBV_ :: Int -> Symbolic SWord-forallBV_ w = svMkSymVar (Just ALL) (KBounded False w) Nothing+forallBV_ w = ask >>= liftIO . svMkSymVar (Just ALL) (KBounded False w) Nothing  existsBV_ :: Int -> Symbolic SWord-existsBV_ w = svMkSymVar (Just EX) (KBounded False w) Nothing+existsBV_ w = ask >>= liftIO . svMkSymVar (Just EX) (KBounded False w) Nothing  forallSBool_ :: Symbolic SBool-forallSBool_ = svMkSymVar (Just ALL) KBool Nothing+forallSBool_ = ask >>= liftIO . svMkSymVar (Just ALL) KBool Nothing  existsSBool_ :: Symbolic SBool-existsSBool_ = svMkSymVar (Just EX) KBool Nothing+existsSBool_ = ask >>= liftIO . svMkSymVar (Just EX) KBool Nothing  -- Values ---------------------------------------------------------------------- @@ -68,43 +77,93 @@  -- Symbolic Conditionals ------------------------------------------------------- -iteValue :: SBool -> Value -> Value -> Value-iteValue c x y =+iteSValue :: SBool -> Value -> Value -> Value+iteSValue c x y =   case svAsBool c of     Just True  -> x     Just False -> y     Nothing    -> mergeValue True c x y +mergeBit :: Bool+         -> SBool+         -> SBool+         -> SBool+         -> SBool+mergeBit f c b1 b2 = svSymbolicMerge KBool f c b1 b2++mergeWord :: Bool+          -> SBool+          -> WordValue SBool SWord+          -> WordValue SBool SWord+          -> WordValue SBool SWord+mergeWord f c (WordVal w1) (WordVal w2) =+    WordVal $ svSymbolicMerge (kindOf w1) f c w1 w2+mergeWord f c w1 w2 = BitsVal $ mergeBits f c (asBitsVal w1) (asBitsVal w2)++mergeBits :: Bool+          -> SBool+          -> Seq.Seq (Eval SBool)+          -> Seq.Seq (Eval SBool)+          -> Seq.Seq (Eval SBool)+mergeBits f c bs1 bs2 = Seq.zipWith mergeBit' bs1 bs2+ where mergeBit' b1 b2 = mergeBit f c <$> b1 <*> b2+ mergeValue :: Bool -> SBool -> Value -> Value -> Value mergeValue f c v1 v2 =   case (v1, v2) of     (VRecord fs1, VRecord fs2) -> VRecord $ zipWith mergeField fs1 fs2-    (VTuple vs1 , VTuple vs2 ) -> VTuple $ zipWith (mergeValue f c) vs1 vs2-    (VBit b1    , VBit b2    ) -> VBit $ mergeBit b1 b2-    (VWord w1   , VWord w2   ) -> VWord $ mergeWord w1 w2-    (VSeq b1 vs1, VSeq _ vs2 ) -> VSeq b1 $ zipWith (mergeValue f c) vs1 vs2-    (VStream vs1, VStream vs2) -> VStream $ mergeStream vs1 vs2-    (VFun f1    , VFun f2    ) -> VFun $ \x -> mergeValue f c (f1 x) (f2 x)-    (VPoly f1   , VPoly f2   ) -> VPoly $ \x -> mergeValue f c (f1 x) (f2 x)-    (VWord w1   , _          ) -> VWord $ mergeWord w1 (fromVWord v2)-    (_          , VWord w2   ) -> VWord $ mergeWord (fromVWord v1) w2+    (VTuple vs1 , VTuple vs2 ) -> VTuple $ zipWith (\x y -> mergeValue f c <$> x <*> y) vs1 vs2+    (VBit b1    , VBit b2    ) -> VBit $ mergeBit f c b1 b2+    (VWord n1 w1, VWord n2 w2 ) | n1 == n2 -> VWord n1 (mergeWord f c <$> w1 <*> w2)+    (VSeq n1 vs1, VSeq n2 vs2 ) | n1 == n2 -> VSeq n1 $ mergeSeqMap f c vs1 vs2+    (VStream vs1, VStream vs2) -> VStream $ mergeSeqMap f c vs1 vs2+    (VFun f1    , VFun f2    ) -> VFun $ \x -> mergeValue f c <$> (f1 x) <*> (f2 x)+    (VPoly f1   , VPoly f2   ) -> VPoly $ \x -> mergeValue f c <$> (f1 x) <*> (f2 x)     (_          , _          ) -> panic "Cryptol.Symbolic.Value"                                   [ "mergeValue: incompatible values" ]   where-    mergeBit b1 b2 = svSymbolicMerge KBool f c b1 b2-    mergeWord w1 w2 = svSymbolicMerge (kindOf w1) f c w1 w2     mergeField (n1, x1) (n2, x2)-      | n1 == n2  = (n1, mergeValue f c x1 x2)+      | n1 == n2  = (n1, mergeValue f c <$> x1 <*> x2)       | otherwise = panic "Cryptol.Symbolic.Value"                     [ "mergeValue.mergeField: incompatible values" ]-    mergeStream xs ys =-      mergeValue f c (head xs) (head ys) : mergeStream (tail xs) (tail ys) --- Big-endian Words ------------------------------------------------------------ +mergeSeqMap :: Bool -> SBool -> SeqMap SBool SWord -> SeqMap SBool SWord -> SeqMap SBool SWord+mergeSeqMap f c x y =+  IndexSeqMap $ \i -> mergeValue f c <$> lookupSeqMap x i <*> lookupSeqMap y i++-- Symbolic Big-endian Words -------------------------------------------------------+ instance BitWord SBool SWord where+  wordLen v = toInteger (intSizeOf v)+  wordAsChar v = integerToChar <$> svAsInteger v++  ppBit v+     | Just b <- svAsBool v = text $! if b then "True" else "False"+     | otherwise            = text "?"+  ppWord opts v+     | Just x <- svAsInteger v = ppBV opts (BV (wordLen v) x)+     | otherwise               = text "[?]"++  bitLit b    = svBool b+  wordLit n x = svInteger (KBounded False (fromInteger n)) x+   packWord bs = fromBitsLE (reverse bs)   unpackWord x = [ svTestBit x i | i <- reverse [0 .. intSizeOf x - 1] ]++  joinWord x y = svJoin x y++  splitWord _leftW rightW w =+    ( svExtract (intSizeOf w - 1) (fromInteger rightW) w+    , svExtract (fromInteger rightW - 1) 0 w+    )++  extractWord len start w =+    svExtract (fromInteger start + fromInteger len - 1) (fromInteger start) w++  wordPlus  = svPlus+  wordMinus = svMinus+  wordMult  = svTimes  -- Errors ---------------------------------------------------------------------- 
src/Cryptol/Testing/Concrete.hs view
@@ -9,7 +9,9 @@ {-# LANGUAGE RecordWildCards #-} module Cryptol.Testing.Concrete where -import Cryptol.Eval.Error+import Control.Monad (join)++import Cryptol.Eval.Monad import Cryptol.Eval.Value import Cryptol.TypeCheck.AST import Cryptol.Utils.Panic (panic)@@ -39,22 +41,24 @@ runOneTest v0 vs0 = run `X.catch` handle   where     run = do-      result <- X.evaluate (go v0 vs0)+      result <- runEval (go v0 vs0)       if result         then return Pass         else return (FailFalse vs0)     handle e = return (FailError e vs0) -    go :: Value -> [Value] -> Bool-    go (VFun f) (v : vs) = go (f v) vs+    go :: Value -> [Value] -> Eval Bool+    go (VFun f) (v : vs) = join (go <$> (f (ready v)) <*> return vs)     go (VFun _) []       = panic "Not enough arguments while applying function"                            []-    go (VBit b) []       = b-    go v vs              = panic "Type error while running test" $-                           [ "Function:"-                           , show $ ppValue defaultPPOpts v-                           , "Arguments:"-                           ] ++ map (show . ppValue defaultPPOpts) vs+    go (VBit b) []       = return b+    go v vs              = do vdoc    <- ppValue defaultPPOpts v+                              vsdocs  <- mapM (ppValue defaultPPOpts) vs+                              panic "Type error while running test" $+                               [ "Function:"+                               , show vdoc+                               , "Arguments:"+                               ] ++ map show vsdocs  {- | Given a (function) type, compute all possible inputs for it. We also return the total number of test (i.e., the length of the outer list. -}@@ -102,7 +106,7 @@     TVar _      -> []     TUser _ _ t -> typeValues t     TRec fs     -> [ VRecord xs-                   | xs <- sequence [ [ (f,v) | v <- typeValues t ]+                   | xs <- sequence [ [ (f,ready v) | v <- typeValues t ]                                     | (f,t) <- fs ]                    ]     TCon (TC tc) ts ->@@ -113,16 +117,19 @@         (TCSeq, ts1)     ->             case map tNoUser ts1 of               [ TCon (TC (TCNum n)) _, TCon (TC TCBit) [] ] ->-                  [ VWord (BV n x) | x <- [ 0 .. 2^n - 1 ] ]+                  [ VWord n (ready (WordVal (BV n x))) | x <- [ 0 .. 2^n - 1 ] ]                [ TCon (TC (TCNum n)) _, t ] ->-                  [ VSeq False xs | xs <- sequence $ genericReplicate n-                                                   $ typeValues t ]+                  [ VSeq n (finiteSeqMap (map ready xs))+                  | xs <- sequence $ genericReplicate n+                                   $ typeValues t ]               _ -> []           (TCFun, _)       -> []  -- We don't generate function values.-        (TCTuple _, els) -> [ VTuple xs | xs <- sequence (map typeValues els)]+        (TCTuple _, els) -> [ VTuple (map ready xs)+                            | xs <- sequence (map typeValues els)+                            ]         (TCNewtype _, _) -> []      TCon _ _ -> []
src/Cryptol/Testing/Random.hs view
@@ -11,16 +11,18 @@ {-# LANGUAGE BangPatterns #-} module Cryptol.Testing.Random where -import Cryptol.Eval.Value     (BV(..),Value,GenValue(..))+import Cryptol.Eval.Monad     (ready)+import Cryptol.Eval.Value     (BV(..),Value,GenValue(..),SeqMap(..), WordValue(..)) import qualified Cryptol.Testing.Concrete as Conc import Cryptol.TypeCheck.AST  (Type(..),TCon(..),TC(..),tNoUser)-import Cryptol.TypeCheck.Solve(simpType)+import Cryptol.TypeCheck.SimpType(tRebuild')  import Cryptol.Utils.Ident    (Ident)  import Control.Monad          (forM)-import Data.List              (unfoldr, genericTake)+import Data.List              (unfoldr, genericTake, genericIndex) import System.Random          (RandomGen, split, random, randomR)+import qualified Data.Sequence as Seq  type Gen g = Integer -> g -> (Value, g) @@ -64,7 +66,7 @@ randomValue ty =   case ty of     TCon tc ts  ->-      case (tc, map (simpType . tNoUser) ts) of+      case (tc, map (tRebuild' False) ts) of         (TC TCBit, [])                        -> Just randomBit          (TC TCSeq, [TCon (TC TCInf) [], el])  ->@@ -102,21 +104,23 @@ randomWord :: RandomGen g => Integer -> Gen g randomWord w _sz g =    let (val, g1) = randomR (0,2^w-1) g-   in (VWord (BV w val), g1)+   in (VWord w (ready (WordVal (BV w val))), g1)  -- | Generate a random infinite stream value. randomStream :: RandomGen g => Gen g -> Gen g randomStream mkElem sz g =   let (g1,g2) = split g-  in (VStream (unfoldr (Just . mkElem sz) g1), g2)+  in (VStream $ IndexSeqMap $ genericIndex (map ready (unfoldr (Just . mkElem sz) g1)), g2) -{- | Generate a random sequence.  Generally, this should be used for sequences-other than bits.  For sequences of bits use "randomWord".  The difference-is mostly about how the results will be displayed. -}+{- | Generate a random sequence.  This should be used for sequences+other than bits.  For sequences of bits use "randomWord". -} randomSequence :: RandomGen g => Integer -> Gen g -> Gen g-randomSequence w mkElem sz g =-  let (g1,g2) = split g-  in (VSeq False $ genericTake w $ unfoldr (Just . mkElem sz) g1 , g2)+randomSequence w mkElem sz g0 = do+  let (g1,g2) = split g0+  let f g = let (x,g') = mkElem sz g+             in seq x (Just (ready x, g'))+  let xs = Seq.fromList $ genericTake w $ unfoldr f g1+  seq xs (VSeq w $ IndexSeqMap $ (Seq.index xs . fromInteger), g2)  -- | Generate a random tuple value. randomTuple :: RandomGen g => [Gen g] -> Gen g@@ -125,7 +129,7 @@   go els [] g = (VTuple (reverse els), g)   go els (mkElem : more) g =     let (v, g1) = mkElem sz g-    in go (v : els) more g1+    in seq v (go (ready v : els) more g1)  -- | Generate a random record value. randomRecord :: RandomGen g => [(Ident, Gen g)] -> Gen g@@ -134,7 +138,7 @@   go els [] g = (VRecord (reverse els), g)   go els ((l,mkElem) : more) g =     let (v, g1) = mkElem sz g-    in go ((l,v) : els) more g1+    in seq v (go ((l,ready v) : els) more g1)  {- test = do
src/Cryptol/Transform/MonoValues.hs view
@@ -185,7 +185,7 @@       ESel e s        -> ESel    <$> go e  <*> return s       EIf e1 e2 e3    -> EIf     <$> go e1 <*> go e2 <*> go e3 -      EComp t e mss   -> EComp t <$> go e  <*> mapM (mapM (rewM rews)) mss+      EComp len t e mss -> EComp len t <$> go e  <*> mapM (mapM (rewM rews)) mss       EVar _          -> return expr        ETAbs x e       -> ETAbs x  <$> go e@@ -195,7 +195,6 @@        EProofAbs x e   -> EProofAbs x <$> go e -      ECast e t       -> ECast       <$> go e <*> return t       EWhere e dgs    -> EWhere      <$> go e <*> inLocal                                                   (mapM (rewDeclGroup rews) dgs) @@ -203,7 +202,7 @@ rewM :: RewMap -> Match -> M Match rewM rews ma =   case ma of-    From x t e -> From x t <$> rewE rews e+    From x len t e -> From x len t <$> rewE rews e      -- These are not recursive.     Let d      -> Let <$> rewD rews d
src/Cryptol/Transform/Specialize.hs view
@@ -78,7 +78,7 @@     ERec fs       -> ERec <$> traverse (traverseSnd specializeExpr) fs     ESel e s      -> ESel <$> specializeExpr e <*> pure s     EIf e1 e2 e3  -> EIf <$> specializeExpr e1 <*> specializeExpr e2 <*> specializeExpr e3-    EComp t e mss -> EComp t <$> specializeExpr e <*> traverse (traverse specializeMatch) mss+    EComp len t e mss -> EComp len t <$> specializeExpr e <*> traverse (traverse specializeMatch) mss     -- Bindings within list comprehensions always have monomorphic types.     EVar {}       -> specializeConst expr     ETAbs t e     -> do@@ -99,12 +99,10 @@     EAbs qn t e   -> EAbs qn t <$> specializeExpr e     EProofAbs p e -> EProofAbs p <$> specializeExpr e     EProofApp {}  -> specializeConst expr-    ECast e t     -> ECast <$> specializeExpr e <*> pure t-    -- TODO: if typeOf e == t, then drop the coercion.     EWhere e dgs  -> specializeEWhere e dgs  specializeMatch :: Match -> SpecM Match-specializeMatch (From qn t e) = From qn t <$> specializeExpr e+specializeMatch (From qn l t e) = From qn l t <$> specializeExpr e specializeMatch (Let decl)   | null (sVars (dSignature decl)) = return (Let decl)   | otherwise = fail "unimplemented: specializeMatch Let unimplemented"
src/Cryptol/TypeCheck/AST.hs view
@@ -24,29 +24,27 @@   , Pragma(..)   , Fixity(..)   , PrimMap(..)+  , TCErrorMessage(..)+  , module Cryptol.TypeCheck.Type   ) where  import Cryptol.ModuleSystem.Name import Cryptol.Prims.Syntax-import Cryptol.Parser.AST ( Selector(..),Pragma(..), ppSelector+import Cryptol.Parser.AST ( Selector(..),Pragma(..)                           , Import(..), ImportSpec(..), ExportType(..)                           , ExportSpec(..), isExportedBind                           , isExportedType, Fixity(..) ) import Cryptol.Utils.Ident (Ident,isInfixIdent,ModName,packIdent)-import Cryptol.Utils.Panic(panic) import Cryptol.TypeCheck.PP-import Cryptol.TypeCheck.Solver.InfNat+import Cryptol.TypeCheck.Type  import GHC.Generics (Generic) import Control.DeepSeq  import           Data.Map    (Map)-import qualified Data.Map as Map import qualified Data.IntMap as IntMap-import           Data.Set (Set) -{- | A Cryptol module.--}+-- | A Cryptol module. data Module = Module { mName     :: !ModName                      , mExports  :: ExportSpec Name                      , mImports  :: [Import]@@ -55,146 +53,18 @@                      , mDecls    :: [DeclGroup]                      } deriving (Show, Generic, NFData) --- | Kinds, classify types.-data Kind   = KType-            | KNum-            | KProp-            | Kind :-> Kind-              deriving (Eq, Show, Generic, NFData)-infixr 5 :->  --- | The types of polymorphic values.-data Schema = Forall { sVars :: [TParam], sProps :: [Prop], sType :: Type }-              deriving (Eq, Show, Generic, NFData)---- | Type synonym.-data TySyn  = TySyn { tsName        :: Name       -- ^ Name-                    , tsParams      :: [TParam]   -- ^ Parameters-                    , tsConstraints :: [Prop]     -- ^ Ensure body is OK-                    , tsDef         :: Type       -- ^ Definition-                    }-              deriving (Eq, Show, Generic, NFData)---- | Named records-data Newtype  = Newtype { ntName   :: Name-                        , ntParams :: [TParam]-                        , ntConstraints :: [Prop]-                        , ntFields :: [(Ident,Type)]-                        } deriving (Show, Generic, NFData)---- | Type parameters.-data TParam = TParam { tpUnique :: !Int       -- ^ Parameter identifier-                     , tpKind   :: Kind       -- ^ Kind of parameter-                     , tpName   :: Maybe Name -- ^ Name from source, if any.-                     }-              deriving (Show, Generic, NFData)--instance Eq TParam where-  x == y = tpUnique x == tpUnique y--instance Ord TParam where-  compare x y = compare (tpUnique x) (tpUnique y)--tpVar :: TParam -> TVar-tpVar p = TVBound (tpUnique p) (tpKind p)---- | The internal representation of types.--- These are assumed to be kind correct.-data Type   = TCon TCon [Type]-              -- ^ Type constant with args--            | TVar TVar-              -- ^ Type variable (free or bound)--            | TUser Name [Type] Type-              {- ^ This is just a type annotation, for a type that-              was written as a type synonym.  It is useful so that we-              can use it to report nicer errors.-              Example: `TUser T ts t` is really just the type `t` that-              was written as `T ts` by the user. -}--            | TRec [(Ident,Type)]-              -- ^ Record type--              deriving (Show, Eq, Ord, Generic, NFData)---- | The type is supposed to be of kind `KProp`-type Prop   = Type---- | The type is "simple" (i.e., it contains no type functions).-type SType  = Type----- | Type variables.-data TVar   = TVFree !Int Kind (Set TVar) Doc-              -- ^ Unique, kind, ids of bound type variables that are in scope-              -- The `Doc` is a description of how this type came to be.---            | TVBound !Int Kind-              deriving (Show, Generic, NFData)---- | Type constants.-data TCon   = TC TC | PC PC | TF TFun-              deriving (Show, Eq, Ord, Generic, NFData)---- | Built-in type constants.---- | Predicate symbols.-data PC     = PEqual        -- ^ @_ == _@-            | PNeq          -- ^ @_ /= _@-            | PGeq          -- ^ @_ >= _@-            | PFin          -- ^ @fin _@--            -- classes-            | PHas Selector -- ^ @Has sel type field@ does not appear in schemas-            | PArith        -- ^ @Arith _@-            | PCmp          -- ^ @Cmp _@-              deriving (Show, Eq, Ord, Generic, NFData)---- | 1-1 constants.-data TC     = TCNum Integer            -- ^ Numbers-            | TCInf                    -- ^ Inf-            | TCBit                    -- ^ Bit-            | TCSeq                    -- ^ @[_] _@-            | TCFun                    -- ^ @_ -> _@-            | TCTuple Int              -- ^ @(_, _, _)@-            | TCNewtype UserTC         -- ^ user-defined, @T@-              deriving (Show, Eq, Ord, Generic, NFData)--data UserTC = UserTC Name Kind-              deriving (Show, Generic, NFData)--instance Eq UserTC where-  UserTC x _ == UserTC y _ = x == y--instance Ord UserTC where-  compare (UserTC x _) (UserTC y _) = compare x y--instance Eq TVar where-  TVBound x _     == TVBound y _     = x == y-  TVFree  x _ _ _ == TVFree  y _ _ _ = x == y-  _             == _              = False--instance Ord TVar where-  compare (TVFree x _ _ _) (TVFree y _ _ _) = compare x y-  compare (TVFree _ _ _ _) _                = LT-  compare _            (TVFree _ _ _ _)     = GT--  compare (TVBound x _) (TVBound y _)       = compare x y--- data Expr   = EList [Expr] Type         -- ^ List value (with type of elements)             | ETuple [Expr]             -- ^ Tuple value             | ERec [(Ident,Expr)]       -- ^ Record value             | ESel Expr Selector        -- ^ Elimination for tuple/record/list              | EIf Expr Expr Expr        -- ^ If-then-else-            | EComp Type Expr [[Match]] -- ^ List comprehensions-                                        --   The type caches the type of the-                                        --   expr.+            | EComp Type Type Expr [[Match]]+                                        -- ^ List comprehensions+                                        --   The types cache the length of the+                                        --   sequence and its element type.              | EVar Name                 -- ^ Use of a bound variable @@ -222,30 +92,14 @@              | EProofApp Expr {- proof -} -            {- | if e : t1, then cast e : t2-                 as long as we can prove that 't1 = t2'.-                 We could express this in terms of a built-in constant.-                 `cast :: {a,b} (a =*= b) => a -> b`--                 Using the constant is a bit verbose though, because we-                 end up with both the source and target type. So, instead-                 we use this language construct, which only stores the-                 target type, and the source type can be reconstructed-                 from the expression.--                 Another way to think of this is simply as an expression-                 with an explicit type annotation.-              -}-            | ECast Expr Type--             | EWhere Expr [DeclGroup]                deriving (Show, Generic, NFData)  -data Match  = From Name Type Expr -- ^ do we need this type?  it seems like it-                                  --   can be computed from the expr+data Match  = From Name Type Type Expr+                                  -- ^ Type arguments are the length and element+                                  --   type of the sequence expression             | Let Decl               deriving (Show, Generic, NFData) @@ -274,242 +128,7 @@ --------------------------------------------------------------------------------  -isFreeTV :: TVar -> Bool-isFreeTV (TVFree {}) = True-isFreeTV _           = False -isBoundTV :: TVar -> Bool-isBoundTV (TVBound {})  = True-isBoundTV _             = False-------------------------------------------------------------------------------------tIsNat' :: Type -> Maybe Nat'-tIsNat' ty =-  case tNoUser ty of-    TCon (TC (TCNum x)) [] -> Just (Nat x)-    TCon (TC TCInf)     [] -> Just Inf-    _                      -> Nothing--tIsNum :: Type -> Maybe Integer-tIsNum ty = do Nat x <- tIsNat' ty-               return x--tIsInf :: Type -> Bool-tIsInf ty = tIsNat' ty == Just Inf--tIsVar :: Type -> Maybe TVar-tIsVar ty = case tNoUser ty of-              TVar x -> Just x-              _      -> Nothing--tIsFun :: Type -> Maybe (Type, Type)-tIsFun ty = case tNoUser ty of-              TCon (TC TCFun) [a, b] -> Just (a, b)-              _                      -> Nothing--tIsSeq :: Type -> Maybe (Type, Type)-tIsSeq ty = case tNoUser ty of-              TCon (TC TCSeq) [n, a] -> Just (n, a)-              _                      -> Nothing--tIsBit :: Type -> Bool-tIsBit ty = case tNoUser ty of-              TCon (TC TCBit) [] -> True-              _                  -> False--tIsTuple :: Type -> Maybe [Type]-tIsTuple ty = case tNoUser ty of-                TCon (TC (TCTuple _)) ts -> Just ts-                _                        -> Nothing--tIsBinFun :: TFun -> Type -> Maybe (Type,Type)-tIsBinFun f ty = case tNoUser ty of-                   TCon (TF g) [a,b] | f == g -> Just (a,b)-                   _                          -> Nothing---- | Split up repeated occurances of the given binary type-level function.-tSplitFun :: TFun -> Type -> [Type]-tSplitFun f t0 = go t0 []-  where go ty xs = case tIsBinFun f ty of-                     Just (a,b) -> go a (go b xs)-                     Nothing    -> ty : xs---pIsFin :: Prop -> Maybe Type-pIsFin ty = case tNoUser ty of-              TCon (PC PFin) [t1] -> Just t1-              _                   -> Nothing--pIsGeq :: Prop -> Maybe (Type,Type)-pIsGeq ty = case tNoUser ty of-              TCon (PC PGeq) [t1,t2] -> Just (t1,t2)-              _                      -> Nothing--pIsEq :: Prop -> Maybe (Type,Type)-pIsEq ty = case tNoUser ty of-             TCon (PC PEqual) [t1,t2] -> Just (t1,t2)-             _                        -> Nothing--pIsArith :: Prop -> Maybe Type-pIsArith ty = case tNoUser ty of-                TCon (PC PArith) [t1] -> Just t1-                _                     -> Nothing--pIsCmp :: Prop -> Maybe Type-pIsCmp ty = case tNoUser ty of-              TCon (PC PCmp) [t1] -> Just t1-              _                   -> Nothing----pIsNumeric :: Prop -> Bool-pIsNumeric (TCon (PC PEqual) _) = True-pIsNumeric (TCon (PC PNeq) _)   = True-pIsNumeric (TCon (PC PGeq) _)   = True-pIsNumeric (TCon (PC PFin) _)   = True-pIsNumeric (TUser _ _ t)        = pIsNumeric t-pIsNumeric _                    = False---------------------------------------------------------------------------------------tNum     :: Integral a => a -> Type-tNum n    = TCon (TC (TCNum (fromIntegral n))) []--tZero     :: Type-tZero     = tNum (0 :: Int)--tOne     :: Type-tOne      = tNum (1 :: Int)--tTwo     :: Type-tTwo      = tNum (2 :: Int)--tInf     :: Type-tInf      = TCon (TC TCInf) []--tNat'    :: Nat' -> Type-tNat' n'  = case n' of-              Inf   -> tInf-              Nat n -> tNum n--tBit     :: Type-tBit      = TCon (TC TCBit) []--tWord    :: Type -> Type-tWord a   = tSeq a tBit--tSeq     :: Type -> Type -> Type-tSeq a b  = TCon (TC TCSeq) [a,b]--tChar :: Type-tChar = tWord (tNum (8 :: Int))--tString :: Int -> Type-tString len = tSeq (tNum len) tChar--tRec     :: [(Ident,Type)] -> Type-tRec      = TRec--tTuple   :: [Type] -> Type-tTuple ts = TCon (TC (TCTuple (length ts))) ts---infixr 5 `tFun`---- | Make a function type.-tFun     :: Type -> Type -> Type-tFun a b  = TCon (TC TCFun) [a,b]---- | Eliminate outermost type synonyms.-tNoUser  :: Type -> Type-tNoUser t = case t of-              TUser _ _ a -> tNoUser a-              _           -> t--tWidth  :: Type -> Type-tWidth t  = TCon (TF TCWidth) [t]--tLenFromThen :: Type -> Type -> Type -> Type-tLenFromThen t1 t2 t3 = TCon (TF TCLenFromThen) [t1,t2,t3]--tLenFromThenTo :: Type -> Type -> Type -> Type-tLenFromThenTo t1 t2 t3 = TCon (TF TCLenFromThenTo) [t1,t2,t3]--tMax :: Type -> Type -> Type-tMax t1 t2 = TCon (TF TCMax) [t1,t2]--infix 4 =#=, >==-infixl 6 .+.-infixl 7 .*.---- | Equality for numeric types.-(=#=) :: Type -> Type -> Prop-x =#= y = TCon (PC PEqual) [x,y]--(=/=) :: Type -> Type -> Prop-x =/= y = TCon (PC PNeq) [x,y]--pArith :: Type -> Prop-pArith t = TCon (PC PArith) [t]--pCmp :: Type -> Prop-pCmp t = TCon (PC PCmp) [t]---- | Make a greater-than-or-equal-to constraint.-(>==) :: Type -> Type -> Prop-x >== y = TCon (PC PGeq) [x,y]---- | A `Has` constraint, used for tuple and record selection.-pHas :: Selector -> Type -> Type -> Prop-pHas l ty fi = TCon (PC (PHas l)) [ty,fi]--pFin :: Type -> Prop-pFin ty = TCon (PC PFin) [ty]------ | Make multiplication type.-(.*.) :: Type -> Type -> Type-x .*. y = TCon (TF TCMul) [x,y]---- | Make addition type.-(.+.) :: Type -> Type -> Type-x .+. y = TCon (TF TCAdd) [x,y]--(.-.) :: Type -> Type -> Type-x .-. y = TCon (TF TCSub) [x,y]--(.^.) :: Type -> Type -> Type-x .^. y = TCon (TF TCExp) [x,y]--tDiv :: Type -> Type -> Type-tDiv x y = TCon (TF TCDiv) [x,y]--tMod :: Type -> Type -> Type-tMod x y = TCon (TF TCMod) [x,y]---- | Make a @min@ type.-tMin :: Type -> Type -> Type-tMin x y = TCon (TF TCMin) [x,y]---newtypeTyCon :: Newtype -> TCon-newtypeTyCon nt = TC $ TCNewtype $ UserTC (ntName nt) (kindOf nt)--newtypeConType :: Newtype -> Schema-newtypeConType nt =-  Forall as (ntConstraints nt)-    $ TRec (ntFields nt) `tFun` TCon (newtypeTyCon nt) (map (TVar . tpVar) as)-  where-  as = ntParams nt--- -- | Construct a primitive, given a map to the unique names of the Cryptol -- module. ePrim :: PrimMap -> Ident -> Expr@@ -530,248 +149,6 @@         w = 8 :: Int  -----------------------------------------------------------------------------------class HasKind t where-  kindOf :: t -> Kind--instance HasKind TVar where-  kindOf (TVFree  _ k _ _) = k-  kindOf (TVBound _ k) = k--instance HasKind TCon where-  kindOf (TC tc) = kindOf tc-  kindOf (PC pc) = kindOf pc-  kindOf (TF tf) = kindOf tf--instance HasKind UserTC where-  kindOf (UserTC _ k) = k--instance HasKind TC where-  kindOf tcon =-    case tcon of-      TCNum _   -> KNum-      TCInf     -> KNum-      TCBit     -> KType-      TCSeq     -> KNum :-> KType :-> KType-      TCFun     -> KType :-> KType :-> KType-      TCTuple n -> foldr (:->) KType (replicate n KType)-      TCNewtype x -> kindOf x--instance HasKind PC where-  kindOf pc =-    case pc of-      PEqual    -> KNum :-> KNum :-> KProp-      PNeq      -> KNum :-> KNum :-> KProp-      PGeq      -> KNum :-> KNum :-> KProp-      PFin      -> KNum :-> KProp-      PHas _    -> KType :-> KType :-> KProp-      PArith    -> KType :-> KProp-      PCmp      -> KType :-> KProp--instance HasKind TFun where-  kindOf tfun =-    case tfun of-      TCWidth  -> KNum :-> KNum--      TCAdd    -> KNum :-> KNum :-> KNum-      TCSub    -> KNum :-> KNum :-> KNum-      TCMul    -> KNum :-> KNum :-> KNum-      TCDiv    -> KNum :-> KNum :-> KNum-      TCMod    -> KNum :-> KNum :-> KNum-      TCExp    -> KNum :-> KNum :-> KNum-      TCMin    -> KNum :-> KNum :-> KNum-      TCMax    -> KNum :-> KNum :-> KNum--      TCLenFromThen   -> KNum :-> KNum :-> KNum :-> KNum-      TCLenFromThenTo -> KNum :-> KNum :-> KNum :-> KNum--instance HasKind Type where-  kindOf ty =-    case ty of-      TVar a      -> kindOf a-      TCon c ts   -> quickApply (kindOf c) ts-      TUser _ _ t -> kindOf t-      TRec {}     -> KType--instance HasKind TySyn where-  kindOf (TySyn _ as _ t) = foldr (:->) (kindOf t) (map kindOf as)--instance HasKind Newtype where-  kindOf nt = foldr (:->) KType (map kindOf (ntParams nt))--instance HasKind TParam where-  kindOf p = tpKind p--quickApply :: Kind -> [a] -> Kind-quickApply k []               = k-quickApply (_ :-> k) (_ : ts) = quickApply k ts-quickApply k _                = panic "Cryptol.TypeCheck.AST.quickApply"-                                  [ "Applying a non-function kind:", show k ]---- Pretty Printing ---------------------------------------------------------------instance PP Kind where-  ppPrec p k = case k of-    KType   -> char '*'-    KNum    -> char '#'-    KProp   -> text "Prop"-    l :-> r -> optParens (p >= 1) (sep [ppPrec 1 l, text "->", ppPrec 0 r])--instance PP (WithNames TVar) where--  ppPrec _ (WithNames (TVBound x _) mp) =-    case IntMap.lookup x mp of-      Just a  -> text a-      Nothing -> text ("a`" ++ show x)--  ppPrec _ (WithNames (TVFree x _ _ _) _) =-    char '?' <> text (intToName x)--instance PP TVar where-  ppPrec = ppWithNamesPrec IntMap.empty--instance PP TParam where-  ppPrec = ppWithNamesPrec IntMap.empty--instance PP (WithNames TParam) where-  ppPrec _ (WithNames p mp) = ppWithNames mp (tpVar p)--instance PP (WithNames Type) where-  ppPrec prec ty0@(WithNames ty nmMap) =-    case ty of-      TVar a  -> ppWithNames nmMap a-      TRec fs -> braces $ fsep $ punctuate comma-                    [ pp l <+> text ":" <+> go 0 t | (l,t) <- fs ]-      TUser c ts _ -> optParens (prec > 3) $ pp c <+> fsep (map (go 4) ts)--      TCon (TC tc) ts ->-        case (tc,ts) of-          (TCNum n, [])       -> integer n-          (TCInf,   [])       -> text "inf"-          (TCBit,   [])       -> text "Bit"--          (TCSeq,   [t1,TCon (TC TCBit) []]) -> brackets (go 0 t1)-          (TCSeq,   [t1,t2])  -> optParens (prec > 3)-                              $ brackets (go 0 t1) <> go 3 t2--          (TCFun,   [t1,t2])  -> optParens (prec > 1)-                              $ go 2 t1 <+> text "->" <+> go 1 t2--          (TCTuple _, fs)     -> parens $ fsep $ punctuate comma $ map (go 0) fs--          (_, _)              -> pp tc <+> fsep (map (go 4) ts)--      TCon (PC pc) ts ->-        case (pc,ts) of-          (PEqual, [t1,t2])   -> go 0 t1 <+> text "==" <+> go 0 t2-          (PNeq ,  [t1,t2])   -> go 0 t1 <+> text "/=" <+> go 0 t2-          (PGeq,  [t1,t2])    -> go 0 t1 <+> text ">=" <+> go 0 t2-          (PFin,  [t1])       -> text "fin" <+> (go 4 t1)-          (PHas x, [t1,t2])   -> ppSelector x <+> text "of"-                               <+> go 0 t1 <+> text "is" <+> go 0 t2--          (PArith, [t1])      -> pp pc <+> go 4 t1-          (PCmp, [t1])        -> pp pc <+> go 4 t1--          (_, _)              -> pp pc <+> fsep (map (go 4) ts)--      _ | Just tinf <- isTInfix ty0 -> optParens (prec > 2)-                                     $ ppInfix 2 isTInfix tinf--      TCon f ts -> optParens (prec > 3)-                $ pp f <+> fsep (map (go 4) ts)--    where-    go p t = ppWithNamesPrec nmMap p t--    isTInfix (WithNames (TCon (TF ieOp) [ieLeft',ieRight']) _) =-      do let ieLeft  = WithNames ieLeft' nmMap-             ieRight = WithNames ieRight' nmMap-         (ieAssoc,iePrec) <- Map.lookup ieOp tBinOpPrec-         return Infix { .. }-    isTInfix _ = Nothing--addTNames :: [TParam] -> NameMap -> NameMap-addTNames as ns = foldr (uncurry IntMap.insert) ns-                $ named ++ zip unnamed avail--  where avail   = filter (`notElem` used) (nameList [])-        named   = [ (u,show (pp n))-                          | TParam { tpUnique = u, tpName = Just n } <- as ]-        unnamed = [ u     | TParam { tpUnique = u, tpName = Nothing } <- as ]--        used    = map snd named ++ IntMap.elems ns--ppNewtypeShort :: Newtype -> Doc-ppNewtypeShort nt =-  text "newtype" <+> pp (ntName nt) <+> hsep (map (ppWithNamesPrec nm 9) ps)-  where-  ps  = ntParams nt-  nm = addTNames ps emptyNameMap---instance PP Schema where-  ppPrec = ppWithNamesPrec IntMap.empty--instance PP (WithNames Schema) where-  ppPrec _ (WithNames s ns) = vars <+> props <+> ppWithNames ns1 (sType s)-    where-    vars = case sVars s of-      [] -> empty-      vs -> braces $ commaSep $ map (ppWithNames ns1) vs--    props = case sProps s of-      [] -> empty-      ps -> parens (commaSep (map (ppWithNames ns1) ps)) <+> text "=>"--    ns1 = addTNames (sVars s) ns--instance PP TySyn where-  ppPrec = ppWithNamesPrec IntMap.empty--instance PP (WithNames TySyn) where-  ppPrec _ (WithNames (TySyn n ps _ ty) ns) =-    text "type" <+> pp n <+> sep (map (ppWithNames ns1) ps) <+> char '='-                <+> ppWithNames ns1 ty-    where ns1 = addTNames ps ns--instance PP Type where-  ppPrec n t = ppWithNamesPrec IntMap.empty n t---instance PP TCon where-  ppPrec _ (TC tc) = pp tc-  ppPrec _ (PC tc) = pp tc-  ppPrec _ (TF tc) = pp tc--instance PP PC where-  ppPrec _ x =-    case x of-      PEqual    -> text "(==)"-      PNeq      -> text "(/=)"-      PGeq      -> text "(>=)"-      PFin      -> text "fin"-      PHas sel  -> parens (ppSelector sel)-      PArith    -> text "Arith"-      PCmp      -> text "Cmp"--instance PP TC where-  ppPrec _ x =-    case x of-      TCNum n   -> integer n-      TCInf     -> text "inf"-      TCBit     -> text "Bit"-      TCSeq     -> text "[]"-      TCFun     -> text "(->)"-      TCTuple 0 -> text "()"-      TCTuple 1 -> text "(one tuple?)"-      TCTuple n -> parens $ hcat $ replicate (n-1) comma-      TCNewtype u -> pp u--instance PP UserTC where-  ppPrec p (UserTC x _) = ppPrec p x- instance PP (WithNames Expr) where   ppPrec prec (WithNames expr nm) =     case expr of@@ -792,8 +169,8 @@                           , text "then" <+> ppW e2                           , text "else" <+> ppW e3 ] -      EComp _ e mss -> let arm ms = text "|" <+> commaSep (map ppW ms)-                       in brackets $ ppW e <+> vcat (map arm mss)+      EComp _ _ e mss -> let arm ms = text "|" <+> commaSep (map ppW ms)+                          in brackets $ ppW e <+> vcat (map arm mss)        EVar x        -> ppPrefixName x @@ -826,9 +203,6 @@       ETApp e t     -> optParens (prec > 3)                     $ ppWP 3 e <+> ppWP 4 t -      ECast e t     -> optParens (prec > 0)-                     ( ppWP 2 e <+> text ":" <+> ppW t )-       EWhere e ds   -> optParens (prec > 0)                      ( ppW e $$ text "where"                                      $$ nest 2 (vcat (map ppW ds))@@ -882,7 +256,7 @@ instance PP (WithNames Match) where   ppPrec _ (WithNames mat nm) =     case mat of-      From x _ e -> pp x <+> text "<-" <+> ppWithNames nm e+      From x _ _ e -> pp x <+> text "<-" <+> ppWithNames nm e       Let d      -> text "let" <+> ppWithNames nm d  instance PP Match where
src/Cryptol/TypeCheck/Infer.hs view
@@ -19,14 +19,15 @@ import           Cryptol.Parser.Position import qualified Cryptol.Parser.AST as P import qualified Cryptol.Parser.Names as P-import           Cryptol.TypeCheck.AST+import           Cryptol.TypeCheck.AST hiding (tSub,tMul,tExp) import           Cryptol.TypeCheck.Monad import           Cryptol.TypeCheck.Solve+import           Cryptol.TypeCheck.SimpType(tSub,tMul,tExp) import           Cryptol.TypeCheck.Kind(checkType,checkSchema,checkTySyn,                                           checkNewtype) import           Cryptol.TypeCheck.Instantiate import           Cryptol.TypeCheck.Depends-import           Cryptol.TypeCheck.Subst (listSubst,apSubst,fvs,(@@))+import           Cryptol.TypeCheck.Subst (listSubst,apSubst,(@@),emptySubst) import           Cryptol.TypeCheck.Solver.InfNat(genLog) import           Cryptol.Utils.Ident import           Cryptol.Utils.Panic(panic)@@ -107,7 +108,8 @@            ExtVar s   -> instantiateWith (EVar x) s ts            CurSCC e t -> instantiateWith e (Forall [] [] t) ts -         checkHasType e' t tGoal+         checkHasType t tGoal+         return e'      P.ELit l -> do e <- desugarLiteral False l                    appTys e ts tGoal@@ -146,7 +148,8 @@                   (ie,t) <- instantiateWith e' (Forall [] [] tGoal) ts                   -- XXX seems weird to need to do this, as t should be the same                   -- as tGoal-                  checkHasType ie t tGoal+                  checkHasType t tGoal+                  return ie   inferTyParam :: P.TypeInst Name -> InferM (Located (Maybe Ident, Type))@@ -185,7 +188,8 @@            ExtVar s   -> instantiateWith (EVar x) s []            CurSCC e t -> return (e, t) -         checkHasType e' t tGoal+         checkHasType t tGoal+         return e'      P.ELit l -> (`checkE` tGoal) =<< desugarLiteral False l @@ -223,8 +227,8 @@       do rng <- curRange          bit <- newType (text "bit-width of enumeration sequnce") KNum          fstT <- checkTypeOfKind t1 KNum-         let totLen = tNum (2::Int) .^. bit-             lstT   = totLen .-. tNum (1::Int)+         let totLen = tExp (tNum (2::Int)) bit+             lstT   = tSub totLen (tNum (1::Int))           fromToPrim <- mkPrim "fromTo"          appTys fromToPrim@@ -266,13 +270,13 @@      P.EComp e mss ->       do (mss', dss, ts) <- unzip3 `fmap` zipWithM inferCArm [ 1 .. ] mss-         (len,a)<- expectSeq tGoal+         (len,a) <- expectSeq tGoal           newGoals CtComprehension =<< unify len =<< smallest ts           ds     <- combineMaps dss          e'     <- withMonoTypes ds (checkE e a)-         return (EComp tGoal e' mss')+         return (EComp len a e' mss')      P.EAppT e fs ->       do ts <- mapM inferTyParam fs@@ -307,7 +311,8 @@     P.ETyped e t ->       do tSig <- checkTypeOfKind t KType          e'   <- checkE e tSig-         checkHasType e' tSig tGoal+         checkHasType tSig tGoal+         return e'      P.ETypeVal t ->       do l <- curRange@@ -337,12 +342,12 @@      TVar _ ->       do tys@(a,b) <- genTys-         newGoals CtExactType =<< unify (tSeq a b) ty+         newGoals CtExactType =<< unify ty (tSeq a b)          return tys      _ ->       do tys@(a,b) <- genTys-         recordError (TypeMismatch (tSeq a b) ty)+         recordError (TypeMismatch ty (tSeq a b))          return tys   where   genTys =@@ -363,12 +368,12 @@      TVar _ ->       do tys <- genTys-         newGoals CtExactType =<< unify (tTuple tys) ty+         newGoals CtExactType =<< unify ty (tTuple tys)          return tys      _ ->       do tys <- genTys-         recordError (TypeMismatch (tTuple tys) ty)+         recordError (TypeMismatch ty (tTuple tys))          return tys    where@@ -391,9 +396,9 @@     _ ->       do (tys,res) <- genTys          case ty of-           TVar TVFree{} -> do ps <- unify (TRec tys) ty+           TVar TVFree{} -> do ps <- unify ty (TRec tys)                                newGoals CtExactType ps-           _ -> recordError (TypeMismatch (TRec tys) ty)+           _ -> recordError (TypeMismatch ty (TRec tys))          return res    where@@ -422,7 +427,7 @@          return ()      _ ->-      do newGoals CtExactType =<< unify (tNum n) ty+      do newGoals CtExactType =<< unify ty (tNum n)  expectFun :: Int -> Type -> InferM ([Type],Type) expectFun  = go []@@ -442,9 +447,9 @@           do args <- genArgs arity              res  <- newType (text "result of function") KType              case ty of-               TVar TVFree{} -> do ps <- unify (foldr tFun res args) ty+               TVar TVFree{} -> do ps <- unify ty (foldr tFun res args)                                    newGoals CtExactType  ps-               _             -> recordError (TypeMismatch (foldr tFun res args) ty)+               _             -> recordError (TypeMismatch ty (foldr tFun res args))              return (reverse tys ++ args, res)      | otherwise =@@ -454,12 +459,12 @@                       newType (text "argument" <+> ordinal ix) KType  -checkHasType :: Expr -> Type -> Type -> InferM Expr-checkHasType e inferredType givenType =+checkHasType :: Type -> Type -> InferM ()+checkHasType inferredType givenType =   do ps <- unify givenType inferredType      case ps of-       [] -> return e-       _  -> newGoals CtExactType ps >> return (ECast e givenType)+       [] -> return ()+       _  -> newGoals CtExactType ps   checkFun :: Doc -> [P.Pattern Name] -> P.Expr Name -> Type -> InferM Expr@@ -491,7 +496,8 @@   do (x, t) <- inferP desc p      ps <- unify tGoal (thing t)      let rng   = fromMaybe emptyRange $ getLoc p-     let mkErr = recordError . UnsolvedGoal False . Goal (CtPattern desc) rng+     let mkErr = recordError . UnsolvedGoals False . (:[])+                                                   . Goal (CtPattern desc) rng      mapM_ mkErr ps      return (Located (srcRange t) x) @@ -517,10 +523,10 @@ -- | Infer the type of one match in a list comprehension. inferMatch :: P.Match Name -> InferM (Match, Name, Located Type, Type) inferMatch (P.Match p e) =-  do (x,t) <- inferP (text "XXX:MATCH") p-     n     <- newType (text "sequence length of comprehension match") KNum+  do (x,t) <- inferP (text "a value bound by a generator in a comprehension") p+     n     <- newType (text "the length of a generator in a comprehension") KNum      e'    <- checkE e (tSeq n (thing t))-     return (From x (thing t) e', x, t, n)+     return (From x n (thing t) e', x, t, n)  inferMatch (P.MatchLet b)   | P.bMono b =@@ -552,7 +558,7 @@      let src = text "length of" <+> ordinal armNum <+>                                   text "arm of list comprehension"      sz <- newType src KNum-     newGoals CtComprehension [ sz =#= (n .*. n') ]+     newGoals CtComprehension [ sz =#= tMul n n' ]      return (m1 : ms', Map.insertWith (\_ old -> old) x t ds, sz)  -- | @inferBinds isTopLevel isRec binds@ performs inference for a@@ -623,7 +629,7 @@      Nothing       | bMono ->-         do t <- newType (text "defintion of" <+> quotes (pp name)) KType+         do t <- newType (text "definition of" <+> quotes (pp name)) KType             let schema = Forall [] [] t             return ((name, ExtVar schema), Left (checkMonoB b t)) @@ -638,28 +644,8 @@   where   name = thing bName --- | Try to evaluate the inferred type in a binding.-simpBind :: Decl -> Decl-simpBind d =-  case dSignature d of-    Forall as qs t ->-      case simpTypeMaybe t of-        Nothing -> d-        Just t1 -> d { dSignature  = Forall as qs t1-                     , dDefinition = case dDefinition d of-                                       DPrim   -> DPrim-                                       DExpr e -> DExpr (castUnder t1 e)-                     }-  where-  -- Assumes the quantifiers match-  castUnder t (ETAbs a e)     = ETAbs a (castUnder t e)-  castUnder t (EProofAbs p e) = EProofAbs p (castUnder t e)-  castUnder t e               = ECast e t  --- -- | The inputs should be declarations with monomorphic types -- (i.e., of the form `Forall [] [] t`). generalize :: [Decl] -> [Goal] -> InferM [Decl]@@ -676,11 +662,9 @@   do gs <- forM gs0 $ \g -> applySubst g       -- XXX: Why would these bindings have signatures??-     bs1 <- forM bs0 $ \b -> do s <- applySubst (dSignature b)+     bs  <- forM bs0 $ \b -> do s <- applySubst (dSignature b)                                 return b { dSignature = s } -     let bs = map simpBind bs1-      let goalFVS g  = Set.filter isFreeTV $ fvs $ goal g          inGoals    = Set.unions $ map goalFVS gs          inSigs     = Set.filter isFreeTV $ fvs $ map dSignature bs@@ -703,7 +687,14 @@        solver <- getSolver-     (as0,here1,defSu,ws) <- io $ improveByDefaultingWith solver maybeAmbig here0+     (as0,here1,mb_defSu,ws) <- io $ improveByDefaultingWith solver maybeAmbig here0+     defSu <- case mb_defSu of+               Nothing -> do recordError $ UnsolvedGoals True here0+                             return emptySubst+               Just s  -> return s+++      mapM_ recordWarning ws      let here = map goal here1 @@ -724,7 +715,7 @@                     }       addGoals later-     return (map (simpBind . genB) bs)+     return (map genB bs)   @@ -775,7 +766,8 @@   withTParams as $   do (e1,cs0) <- collectGoals $                 do e1 <- checkFun (pp (thing (P.bName b))) (P.bParams b) e0 t0-                   () <- simplifyAllConstraints  -- XXX: using `asmps` also...+                   addGoals validSchema+                   () <- simplifyAllConstraints  -- XXX: using `asmps` also?                    return e1      cs <- applySubst cs0 @@ -791,7 +783,7 @@       asmps1 <- applySubst asmps0 -     defSu1 <- proveImplication (thing (P.bName b)) as asmps1 (validSchema ++ now)+     defSu1 <- proveImplication (thing (P.bName b)) as asmps1 now      let later = apSubst defSu1 later0          asmps = apSubst defSu1 asmps1 @@ -807,7 +799,12 @@                                 $ AmbiguousType [ thing (P.bName b) ]          solver <- getSolver-        (_,_,defSu2,ws) <- io $ improveByDefaultingWith solver maybeAmbig later+        (_,_,mb_defSu2,ws) <-+            io $ improveByDefaultingWith solver maybeAmbig later+        defSu2 <- case mb_defSu2 of+                   Nothing -> do recordError $ UnsolvedGoals True later+                                 return emptySubst+                   Just s -> return s         mapM_ recordWarning ws         extendSubst defSu2 
src/Cryptol/TypeCheck/InferTypes.hs view
@@ -20,7 +20,6 @@  import           Cryptol.TypeCheck.AST import           Cryptol.TypeCheck.Subst-import           Cryptol.TypeCheck.TypeMap import           Cryptol.Parser.Position import qualified Cryptol.Parser.AST as P import           Cryptol.Utils.PP@@ -28,13 +27,15 @@ import           Cryptol.TypeCheck.PP import           Cryptol.Utils.Ident (Ident,identText) import           Cryptol.Utils.Panic(panic)+import           Cryptol.Utils.Misc(anyJust) +import           Data.Set ( Set ) import qualified Data.Set as Set-import qualified Data.Map as Map import qualified Data.IntMap as IntMap  import GHC.Generics (Generic) import Control.DeepSeq+import Data.List ((\\))  data SolverConfig = SolverConfig   { solverPath    :: FilePath   -- ^ The SMT solver to invoke@@ -46,20 +47,24 @@ data VarType = ExtVar Schema      -- ^ Known type              | CurSCC Expr Type   -- ^ Part of current SCC -newtype Goals = Goals (TypeMap Goal)+-- XXX: Temporary, until we figure out:+--    1. How to apply substitutions with normalization to the type Map+--    2. What are the strictness requirements+--        (e.g., using Set results in a black hole)+newtype Goals = Goals (Set Goal) -- Goals (TypeMap Goal)                 deriving (Show)  emptyGoals :: Goals-emptyGoals  = Goals emptyTM+emptyGoals  = Goals Set.empty -- emptyTM  nullGoals :: Goals -> Bool-nullGoals (Goals tm) = nullTM tm+nullGoals (Goals tm) = Set.null tm -- nullTM tm  fromGoals :: Goals -> [Goal]-fromGoals (Goals tm) = membersTM tm+fromGoals (Goals tm) = Set.toList tm -- membersTM tm  insertGoal :: Goal -> Goals -> Goals-insertGoal g (Goals tm) = Goals (insertTM (goal g) g tm)+insertGoal g (Goals tm) = Goals (Set.insert g tm) -- (insertTM (goal g) g tm)  -- | Something that we need to find evidence for. data Goal = Goal@@ -68,6 +73,12 @@   , goal       :: Prop              -- ^ What needs to be proved   } deriving (Show, Generic, NFData) +instance Eq Goal where+  x == y = goal x == goal y++instance Ord Goal where+  compare x y = compare (goal x) (goal y)+ data HasGoal = HasGoal   { hasName :: !Int   , hasGoal :: Goal@@ -81,11 +92,6 @@   , dctGoals  :: [Goal]   } deriving (Show, Generic, NFData) -data Solved = Solved (Maybe Subst) [Goal] -- ^ Solved, assuming the sub-goals.-            | Unsolved                    -- ^ We could not solve the goal.-            | Unsolvable                  -- ^ The goal can never be solved.-              deriving (Show)- data Warning  = DefaultingKind (P.TParam Name) P.Kind               | DefaultingWildType P.Kind               | DefaultingTo Doc Type@@ -135,7 +141,7 @@               | RecursiveType Type Type                 -- ^ Unification results in a recursive type -              | UnsolvedGoal Bool Goal+              | UnsolvedGoals Bool [Goal]                 -- ^ A constraint that we could not solve                 -- The boolean indicates if we know that this constraint                 -- is impossible.@@ -240,7 +246,7 @@       MultipleTypeParamDefs {}  -> err       TypeMismatch t1 t2        -> TypeMismatch (apSubst su t1) (apSubst su t2)       RecursiveType t1 t2       -> RecursiveType (apSubst su t1) (apSubst su t2)-      UnsolvedGoal x g          -> UnsolvedGoal x (apSubst su g)+      UnsolvedGoals x gs        -> UnsolvedGoals x (apSubst su gs)       UnsolvedDelayedCt g       -> UnsolvedDelayedCt (apSubst su g)       UnexpectedTypeWildCard    -> err       TypeVariableEscaped t xs  -> TypeVariableEscaped (apSubst su t) xs@@ -267,7 +273,7 @@       MultipleTypeParamDefs {}  -> Set.empty       TypeMismatch t1 t2        -> fvs (t1,t2)       RecursiveType t1 t2       -> fvs (t1,t2)-      UnsolvedGoal _ g          -> fvs g+      UnsolvedGoals _ gs        -> fvs gs       UnsolvedDelayedCt g       -> fvs g       UnexpectedTypeWildCard    -> Set.empty       TypeVariableEscaped t _   -> fvs t@@ -289,6 +295,18 @@ -- values that remain, as applying the substitution to the keys will only ever -- reduce the number of values that remain. instance TVars Goals where+  apSubst su (Goals gs) = case anyJust apG (Set.toList gs) of+                            Nothing -> Goals gs+                            Just gs1 -> Goals $ Set.fromList+                                              $ concatMap norm gs1+    where+    norm g = [ g { goal = p } | p <- pSplitAnd (goal g) ]+    apG g  = mk g <$> apSubstMaybe su (goal g)+    mk g p = g { goal = p }++{-+  apSubst su (Goals gs) = Goals (Set.fromList . mapAp+   apSubst su (Goals goals) =     Goals (mapWithKeyTM setGoal (apSubstTypeMapKeys su goals))     where@@ -298,6 +316,7 @@     setGoal key g = g { goalSource = apSubst su (goalSource g)                       , goal       = key                       }+-}  instance TVars Goal where   apSubst su g = Goal { goalSource = apSubst su (goalSource g)@@ -313,26 +332,26 @@     | Set.null captured =        DelayedCt { dctSource = dctSource g                  , dctForall = dctForall g-                 , dctAsmps  = apSubst su1 (dctAsmps g)-                 , dctGoals  = apSubst su1 (dctGoals g)+                 , dctAsmps  = apSubst su (dctAsmps g)+                 , dctGoals  = apSubst su (dctGoals g)                  }+     | otherwise = panic "Cryptol.TypeCheck.Subst.apSubst (DelayedCt)"                     [ "Captured quantified variables:"-                    , "Substitution: " ++ show m1+                    , "Substitution: " ++ show su                     , "Variables:    " ++ show captured                     , "Constraint:   " ++ show g                     ]      where-    used  = fvs (dctAsmps g, map goal (dctGoals g)) `Set.difference`-                                          Set.fromList (map tpVar (dctForall g))-    m1    = Map.filterWithKey (\k _ -> k `Set.member` used) (suMap su)-    su1   = S { suMap = m1, suDefaulting = suDefaulting su }--    captured = Set.fromList (map tpVar (dctForall g)) `Set.intersection`-                                                          fvs (Map.elems m1)--+    captured = Set.fromList (map tpVar (dctForall g))+               `Set.intersection`+               subVars+    subVars = Set.unions+                $ map (fvs . applySubstToVar su)+                $ Set.toList used+    used = fvs (dctAsmps g, map goal (dctGoals g)) `Set.difference`+                Set.fromList (map tpVar (dctForall g))  -- | For use in error messages cppKind :: Kind -> Doc@@ -442,10 +461,12 @@       TypeMismatch t1 t2 ->         nested (text "Type mismatch:")           (text "Expected type:" <+> ppWithNames names t1 $$-           text "Inferred type:" <+> ppWithNames names t2)+           text "Inferred type:" <+> ppWithNames names t2 $$+           mismatchHint t1 t2) -      UnsolvedGoal imp g ->-        nested (word <+> text "constraint:") (ppWithNames names g)+      UnsolvedGoals imp gs ->+        nested (word <+> text "constraints:")+               $ vcat $ map (ppWithNames names) gs         where word = if imp then text "Unsolvable" else text "Unsolved"        UnsolvedDelayedCt g ->@@ -494,6 +515,15 @@     multi [x,y]     = [x <> text ", and", y <> text "." ]     multi (x : xs)  = x <> text "," : multi xs +    mismatchHint (TRec fs1) (TRec fs2) =+      hint "Missing" missing $$ hint "Unexpected" extra+      where+        missing = map fst fs1 \\ map fst fs2+        extra   = map fst fs2 \\ map fst fs1+        hint _ []  = mempty+        hint s [x] = text s <+> text "field" <+> pp x+        hint s xs  = text s <+> text "fields" <+> commaSep (map pp xs)+    mismatchHint _ _ = mempty   instance PP ConstraintSource where@@ -549,10 +579,4 @@     ns1 = addTNames (dctForall d) names  -instance PP Solved where-  ppPrec _ res =-    case res of-      Solved mb gs  -> text "solved" $$ nest 2 (suDoc $$ vcat (map (pp . goal) gs))-        where suDoc = maybe empty pp mb-      Unsolved      -> text "unsolved"-      Unsolvable    -> text "unsolvable"+
src/Cryptol/TypeCheck/Instantiate.hs view
@@ -75,15 +75,11 @@ The arguments that are provided will be instantiated as requested, the rest will be instantiated with fresh type variables. -Note that we assume that type parameters are not normalized.-Generally, the resulting expression will look something like this:--ECast (EProofApp (ETApp e t)) t1+EProofApp (ETApp e t)    where   - There will be one `ETApp t` for each insantiated type parameter;   - there will be one `EProofApp` for each constraint on the schema;-  - there will be `ECast` if we had equality constraints from normalization. -} instantiateWithNames :: Expr -> Schema -> [Located (Ident,Type)]                      -> InferM (Expr,Type)
src/Cryptol/TypeCheck/Kind.hs view
@@ -20,6 +20,7 @@ import           Cryptol.Parser.Position import           Cryptol.TypeCheck.AST import           Cryptol.TypeCheck.Monad hiding (withTParams)+import           Cryptol.TypeCheck.SimpType(tRebuild) import           Cryptol.TypeCheck.Solve (simplifyAllConstraints                                          ,wfTypeFunction) import           Cryptol.Utils.PP@@ -42,7 +43,9 @@         do ps1 <- mapM checkProp ps            t1  <- doCheckType t (Just KType)            return (ps1,t1)-     return (Forall xs1 ps1 t1, gs)+     return ( Forall xs1 (map tRebuild ps1) (tRebuild t1)+            , [ g { goal = tRebuild (goal g) } | g <- gs ]+            )    where   rng = case mb of@@ -59,8 +62,8 @@                          return r      return TySyn { tsName   = thing x                   , tsParams = as1-                  , tsConstraints = map goal gs-                  , tsDef = t1+                  , tsConstraints = map (tRebuild . goal) gs+                  , tsDef = tRebuild t1                   }  -- | Check a newtype declaration.@@ -89,7 +92,7 @@ checkType :: P.Type Name -> Maybe Kind -> InferM Type checkType t k =   do (_, t1) <- withTParams True [] $ doCheckType t k-     return t1+     return (tRebuild t1)  {- | Check something with type parameters. @@ -122,10 +125,14 @@  withTParams :: Bool -> [P.TParam Name] -> KindM a -> InferM ([TParam], a) withTParams allowWildCards xs m =-  mdo mapM_ recordError duplicates-      (a, vars) <- runKindM allowWildCards (zip' xs ts) m-      (as, ts)  <- unzip `fmap` mapM (newTP vars) xs-      return (as,a)+  do (as,a,ctrs) <-+        mdo mapM_ recordError duplicates+            (a, vars,ctrs) <- runKindM allowWildCards (zip' xs ts) m+            (as, ts)  <- unzip `fmap` mapM (newTP vars) xs+            return (as,a,ctrs)+     mapM_ (uncurry newGoals) ctrs+     return (as,a)+   where   getKind vs tp =     case Map.lookup (P.tpName tp) vs of
src/Cryptol/TypeCheck/Monad.hs view
@@ -6,11 +6,11 @@ -- Stability   :  provisional -- Portability :  portable {-# LANGUAGE Safe #-}- {-# LANGUAGE DeriveAnyClass #-} {-# LANGUAGE DeriveGeneric #-} {-# LANGUAGE RecordWildCards #-} {-# LANGUAGE RecursiveDo #-}+{-# LANGUAGE PatternGuards #-} module Cryptol.TypeCheck.Monad   ( module Cryptol.TypeCheck.Monad   , module Cryptol.TypeCheck.InferTypes@@ -19,10 +19,12 @@ import           Cryptol.ModuleSystem.Name (FreshM(..),Supply) import           Cryptol.Parser.Position import qualified Cryptol.Parser.AST as P+import           Cryptol.Prelude (writeTcPreludeContents) import           Cryptol.TypeCheck.AST import           Cryptol.TypeCheck.Subst import           Cryptol.TypeCheck.Unify(mgu, Result(..), UnificationError(..)) import           Cryptol.TypeCheck.InferTypes+import qualified Cryptol.TypeCheck.SimpleSolver as Simple import qualified Cryptol.TypeCheck.Solver.CrySAT as CrySAT import           Cryptol.Utils.PP(pp, (<+>), Doc, text, quotes) import           Cryptol.Utils.Panic(panic)@@ -33,11 +35,17 @@ import qualified Data.Set as Set import           Data.Map (Map) import           Data.Set (Set)-import           Data.List(find, minimumBy, groupBy, sortBy)+import           Data.List(find, minimumBy, groupBy, sortBy, foldl') import           Data.Maybe(mapMaybe) import           Data.Function(on) import           MonadLib hiding (mapM) +import           Data.IORef++import           System.FilePath((</>))+import           System.Directory(doesFileExist)++ import GHC.Generics (Generic) import Control.DeepSeq @@ -56,6 +64,8 @@                                       --   signatures be monomorphized?    , inpSolverConfig :: SolverConfig   -- ^ Options for the constraint solver+  , inpSearchPath :: [FilePath]+    -- ^ Where to look for Cryptol theory file.    , inpPrimNames :: !PrimMap          -- ^ The mapping from 'Ident' to 'Name',                                       -- for names that the typechecker@@ -87,9 +97,15 @@      deriving Show +bumpCounter :: InferM ()+bumpCounter = do RO { .. } <- IM ask+                 io $ modifyIORef' iSolveCounter (+1)+ runInferM :: TVars a => InferInput -> InferM a -> IO (InferOutput a) runInferM info (IM m) = CrySAT.withSolver (inpSolverConfig info) $ \solver ->-  do rec ro <- return RO { iRange     = inpRange info+  do loadCryTCPrel solver (inpSearchPath info)+     coutner <- newIORef 0+     rec ro <- return RO { iRange     = inpRange info                      , iVars          = Map.map ExtVar (inpVars info)                      , iTVars         = []                      , iTSyns         = fmap mkExternal (inpTSyns info)@@ -98,6 +114,7 @@                      , iMonoBinds     = inpMonoBinds info                      , iSolver        = solver                      , iPrimNames     = inpPrimNames info+                     , iSolveCounter  = coutner                      }           (result, finalRW) <- runStateT rw@@ -119,7 +136,7 @@            (cts,has) -> return $ InferFailed warns                 $ dropErrorsFromSameLoc                 [ ( goalRange g-                  , UnsolvedGoal False (apSubst theSu g)+                  , UnsolvedGoals False [apSubst theSu g]                   ) | g <- fromGoals cts ++ map hasGoal has                 ]        errs -> return $ InferFailed warns@@ -151,9 +168,20 @@   -- The actual order does not matter   cmpRange (Range x y z) (Range a b c) = compare (x,y,z) (a,b,c) +  loadCryTCPrel s [] =+    do file <- writeTcPreludeContents+       CrySAT.loadFile s file +  loadCryTCPrel s (p : ps) =+    do let file = p </> "CryptolTC.z3"+       yes <- doesFileExist file+       if yes then CrySAT.loadFile s file+              else loadCryTCPrel s ps  +++ newtype InferM a = IM { unIM :: ReaderT RO (StateT RW IO) a }  data DefLoc = IsLocal | IsExternal@@ -193,6 +221,8 @@   , iSolver :: CrySAT.Solver    , iPrimNames :: !PrimMap++  , iSolveCounter :: !(IORef Int)   }  -- | Read-write component of the monad.@@ -311,8 +341,12 @@  -- | Add a bunch of goals that need solving. addGoals :: [Goal] -> InferM ()-addGoals gs = IM $ sets_ $ \s -> s { iCts = foldl (flip insertGoal) (iCts s) gs }+addGoals gs0 = doAdd =<< simpGoals gs0+  where+  doAdd [] = return ()+  doAdd gs = IM $ sets_ $ \s -> s { iCts = foldl' (flip insertGoal) (iCts s) gs } + -- | Collect the goals emitted by the given sub-computation. -- Does not emit any new goals. collectGoals :: InferM a -> InferM (a, [Goal])@@ -331,8 +365,19 @@   -- set the type map directly   setGoals' gs = IM $ sets $ \ RW { .. } -> ((),   RW { iCts = gs, .. }) +simpGoal :: Goal -> InferM [Goal]+simpGoal g =+  case Simple.simplify Map.empty (goal g) of+    p | Just e <- tIsError p ->+        do recordError $ ErrorMsg $ text $ tcErrorMessage e+           return []+      | ps <- pSplitAnd p -> return [ g { goal = pr } | pr <- ps ] +simpGoals :: [Goal] -> InferM [Goal]+simpGoals gs = concat <$> mapM simpGoal gs ++ {- | Record a constraint that when we select from the first type, we should get a value of the second type. The returned function should be used to wrap the expression from@@ -644,6 +689,7 @@                }  data KRW = KRW { typeParams :: Map Name Kind -- ^ kinds of (known) vars.+               , kCtrs      :: [(ConstraintSource,[Prop])]                }  instance Functor KindM where@@ -670,14 +716,16 @@ kinds of the type parameters. -} runKindM :: Bool                          -- Are type-wild cards allowed?          -> [(Name, Maybe Kind, Type)]   -- ^ See comment-         -> KindM a -> InferM (a, Map Name Kind)+         -> KindM a -> InferM (a, Map Name Kind, [(ConstraintSource,[Prop])]) runKindM wildOK vs (KM m) =   do (a,kw) <- runStateT krw (runReaderT kro m)-     return (a, typeParams kw)+     return (a, typeParams kw, kCtrs kw)   where   tys  = Map.fromList [ (x,t) | (x,_,t)      <- vs ]   kro  = KRO { allowWild = wildOK, lazyTVars = tys }-  krw  = KRW { typeParams = Map.fromList [ (x,k) | (x,Just k,_) <- vs ] }+  krw  = KRW { typeParams = Map.fromList [ (x,k) | (x,Just k,_) <- vs ]+             , kCtrs = []+             }  -- | This is what's returned when we lookup variables during kind checking. data LkpTyVar = TLocalVar Type (Maybe Kind) -- ^ Locally bound variable.@@ -705,6 +753,9 @@ kRecordWarning w = kInInferM $ recordWarning w  -- | Generate a fresh unification variable of the given kind.+-- NOTE:  We do not simplify these, because we end up with bottom.+-- See `Kind.hs`+-- XXX: Perhaps we can avoid the recursion? kNewType :: Doc -> Kind -> KindM Type kNewType src k =   do tps <- KM $ do vs <- asks lazyTVars@@ -743,7 +794,8 @@      return a  kNewGoals :: ConstraintSource -> [Prop] -> KindM ()-kNewGoals c ps = kInInferM $ newGoals c ps+kNewGoals _ [] = return ()+kNewGoals c ps = KM $ sets_ $ \s -> s { kCtrs = (c,ps) : kCtrs s }  kInInferM :: InferM a -> KindM a kInInferM m = KM $ lift $ lift m
src/Cryptol/TypeCheck/Sanity.hs view
@@ -16,11 +16,11 @@   import Cryptol.TypeCheck.AST-import Cryptol.TypeCheck.Subst(apSubst, fvs, singleSubst)+import Cryptol.TypeCheck.Subst (apSubst, singleSubst) import Cryptol.Utils.Ident  import qualified Data.Set as Set-import Data.List(sort, sortBy)+import Data.List (sort, sortBy) import Data.Function (on) import MonadLib import qualified Control.Applicative as A@@ -160,8 +160,11 @@                                        return (f,t)          return $ tMono $ TRec fs1 -    ESel e sel ->-      do t <- exprType e+    ESel e sel -> do ty <- exprType e+                     ty1 <- check ty+                     return (tMono ty1)+      where+      check t =          case sel of             TupleSel n mb ->@@ -176,8 +179,14 @@                       unless (n < sz) $                         reportError (TupleSelectorOutOfRange n sz) -                      return $ tMono $ ts !! n+                      return $ ts !! n +                TCon (TC TCSeq) [s,elT] -> do res <- check elT+                                              return (TCon (TC TCSeq) [s,res])++                TCon (TC TCFun) [a,b]   -> do res <- check b+                                              return (TCon (TC TCFun) [a,res])+                 _ -> reportError $ BadSelector sel t  @@ -195,11 +204,19 @@                      case lookup f fs of                       Nothing -> reportError $ MissingField f $ map fst fs-                      Just ft -> return $ tMono ft+                      Just ft -> return ft +               TCon (TC TCSeq) [s,elT] -> do res <- check elT+                                             return (TCon (TC TCSeq) [s,res])++               TCon (TC TCFun) [a,b]   -> do res <- check b+                                             return (TCon (TC TCFun) [a,res])++                _ -> reportError $ BadSelector sel t  +           -- XXX: Remove this?            ListSel _ mb ->              case tNoUser t of                TCon (TC TCSeq) [ n, elT ] ->@@ -212,7 +229,7 @@                             | m == fromIntegral len -> return ()                           _ -> reportError $ UnexpectedSequenceShape len n -                    return $ tMono elT+                    return elT                 _ -> reportError $ BadSelector sel t @@ -229,8 +246,9 @@           return $ tMono t1 -    EComp t e mss ->-      do checkTypeIs KType t+    EComp len t e mss ->+      do checkTypeIs KNum len+         checkTypeIs KType t           (xs,ls) <- unzip `fmap` mapM checkArm mss          -- XXX: check no duplicates@@ -238,9 +256,9 @@           case ls of            [] -> return ()-           _  -> convertible t (tSeq (foldr1 tMin ls) elT)+           _  -> convertible (tSeq len t) (tSeq (foldr1 tMin ls) elT) -         return (tMono t)+         return (tMono (tSeq len t))       EVar x -> lookupVar x@@ -300,12 +318,6 @@            (_,_)      -> reportError (BadProofTyVars as)  -    ECast e t ->-      do checkTypeIs KType t-         t1 <- exprType e-         convertible t t1-         return (tMono t)-     -- XXX: Check that defined things are disitnct?     EWhere e dgs ->       let go []       = exprSchema e@@ -390,13 +402,14 @@ checkMatch :: Match -> TcM ((Name, Schema), Type) checkMatch ma =   case ma of-    From x t e ->-      do checkTypeIs KType t+    From x len elt e ->+      do checkTypeIs KNum len+         checkTypeIs KType elt          t1 <- exprType e          case tNoUser t1 of            TCon (TC TCSeq) [ l, el ]-             | same t el -> return ((x, tMono t), l)-             | otherwise -> reportError $ TypeMismatch (tMono t) (tMono el)+             | same elt el -> return ((x, tMono elt), l)+             | otherwise -> reportError $ TypeMismatch (tMono elt) (tMono el)              _ -> reportError $ BadMatch t1@@ -411,7 +424,7 @@ checkArm (m : ms) =   do (x, l)   <- checkMatch m      (xs, l1) <- withVars [x] $ checkArm ms-     let newLen = l .*. l1+     let newLen = tMul l l1      return $ if fst x `elem` map fst xs                  then (xs, newLen)                  else (x : xs, newLen)
+ src/Cryptol/TypeCheck/SimpType.hs view
@@ -0,0 +1,304 @@+{-# LANGUAGE PatternGuards #-}+module Cryptol.TypeCheck.SimpType where++import Control.Applicative((<|>))+import Cryptol.TypeCheck.Type hiding+  (tSub,tMul,tDiv,tMod,tExp,tMin,tWidth,tLenFromThen,tLenFromThenTo)+import Cryptol.TypeCheck.TypePat+import Cryptol.TypeCheck.Solver.InfNat+import Control.Monad(msum,guard)+import Cryptol.TypeCheck.PP(pp)+++tRebuild' :: Bool -> Type -> Type+tRebuild' withUser = go+  where+  go ty =+    case ty of+      TUser x xs t+        | withUser  -> TUser x xs (go t)+        | otherwise -> go t+      TVar _       -> ty+      TRec xs      -> TRec [ (x,go y) | (x,y) <- xs ]+      TCon tc ts ->+        case (tc, map go ts) of+          (TF f, ts') ->+            case (f,ts') of+              (TCAdd,[x,y]) -> tAdd x y+              (TCSub,[x,y]) -> tSub x y+              (TCMul,[x,y]) -> tMul x y+              (TCExp,[x,y]) -> tExp x y+              (TCDiv,[x,y]) -> tDiv x y+              (TCMod,[x,y]) -> tMod x y+              (TCMin,[x,y]) -> tMin x y+              (TCMax,[x,y]) -> tMax x y+              (TCWidth,[x]) -> tWidth x+              (TCLenFromThen,[x,y,z]) -> tLenFromThen x y z+              (TCLenFromThenTo,[x,y,z]) -> tLenFromThenTo x y z+              _ -> TCon tc ts+          (_,ts') -> TCon tc ts'++tRebuild :: Type -> Type+tRebuild = tRebuild' True++-- Normal: constants to the left+tAdd :: Type -> Type -> Type+tAdd x y+  | Just t <- tOp TCAdd (total (op2 nAdd)) [x,y] = t+  | tIsInf x            = tInf+  | tIsInf y            = tInf+  | Just n <- tIsNum x  = addK n y+  | Just n <- tIsNum y  = addK n x+  | Just (n,x1) <- isSumK x = addK n (tAdd x1 y)+  | Just (n,y1) <- isSumK y = addK n (tAdd x y1)+  | Just v <- matchMaybe (do (a,b) <- (|-|) y+                             guard (x == b)+                             return a) = v+  | Just v <- matchMaybe (do (a,b) <- (|-|) x+                             guard (b == y)+                             return a) = v++  | Just v <- matchMaybe (factor <|> same <|> swapVars) = v++  | otherwise           = tf2 TCAdd x y+  where+  isSumK t = case tNoUser t of+               TCon (TF TCAdd) [ l, r ] ->+                 do n <- tIsNum l+                    return (n, r)+               _ -> Nothing++  addK 0 t = t+  addK n t | Just (m,b) <- isSumK t = tf2 TCAdd (tNum (n + m)) b+           | Just v <- matchMaybe+                     $ do (a,b) <- (|-|) t+                          (do m <- aNat b+                              return $ case compare n m of+                                         GT -> tAdd (tNum (n-m)) a+                                         EQ -> a+                                         LT -> tSub a (tNum (m-n)))+                            <|>+                            (do m <- aNat a+                                return (tSub (tNum (m+n)) b))+                      = v+           -- K + min a b ~> min (K + a) (K + b)+           | Just v <- matchMaybe+                    $ do (a,b) <- aMin t+                         return $ tMin (tAdd (tNum n) a) (tAdd (tNum n) b)+              = v++           | otherwise              = tf2 TCAdd (tNum n) t++  factor = do (a,b1)  <- aMul x+              (a',b2) <- aMul y+              guard (a == a')+              return (tMul a (tAdd b1 b2))++  same = do guard (x == y)+            return (tMul (tNum (2 :: Int)) x)++  swapVars = do a <- aTVar x+                b <- aTVar y+                guard (b < a)+                return (tf2 TCAdd y x)++tSub :: Type -> Type -> Type+tSub x y+  | Just t <- tOp TCSub (op2 nSub) [x,y] = t+  | tIsInf y  = tBadNumber $ TCErrorMessage "Subtraction of `inf`."+  | Just 0 <- yNum = x+  | Just k <- yNum+  , TCon (TF TCAdd) [a,b] <- tNoUser x+  , Just n <- tIsNum a = case compare k n of+                           EQ -> b+                           LT -> tf2 TCAdd (tNum (n - k)) b+                           GT -> tSub b (tNum (k - n))++  | Just v <- matchMaybe (do (a,b) <- anAdd x+                             (guard (a == y) >> return b)+                                <|> (guard (b == y) >> return a))+                       = v++  | Just v <- matchMaybe (do (a,b) <- (|-|) y+                             return (tSub (tAdd x b) a)) = v++  | otherwise = tf2 TCSub x y+  where+  yNum = tIsNum y++++-- Normal: constants to the left+tMul :: Type -> Type -> Type+tMul x y+  | Just t <- tOp TCMul (total (op2 nMul)) [x,y] = t+  | Just n <- tIsNum x  = mulK n y+  | Just n <- tIsNum y  = mulK n x+  | Just v <- matchMaybe swapVars = v+  | otherwise           = tf2 TCMul x y+  where+  mulK 0 _ = tNum (0 :: Int)+  mulK 1 t = t+  mulK n t | TCon (TF TCMul) [a,b] <- t'+           , Just a' <- tIsNat' a = case a' of+                                     Inf   -> t+                                     Nat m -> tf2 TCMul (tNum (n * m)) b+           | TCon (TF TCDiv) [a,b] <- t'+           , Just b' <- tIsNum b+           -- XXX: similar for a = b * k?+           , n == b' = tSub a (tMod a b)+++           | otherwise = tf2 TCMul (tNum n) t+    where t' = tNoUser t++  swapVars = do a <- aTVar x+                b <- aTVar y+                guard (b < a)+                return (tf2 TCMul y x)++++tDiv :: Type -> Type -> Type+tDiv x y+  | Just t <- tOp TCDiv (op2 nDiv) [x,y] = t+  | tIsInf x = tBadNumber $ TCErrorMessage "Division of `inf`."+  | Just 0 <- tIsNum y = tBadNumber $ TCErrorMessage "Division by 0."+  | otherwise = tf2 TCDiv x y+++tMod :: Type -> Type -> Type+tMod x y+  | Just t <- tOp TCMod (op2 nMod) [x,y] = t+  | tIsInf x = tBadNumber $ TCErrorMessage "Modulus of `inf`."+  | Just 0 <- tIsNum x = tBadNumber $ TCErrorMessage "Modulus by 0."+  | otherwise = tf2 TCMod x y++tExp :: Type -> Type -> Type+tExp x y+  | Just t <- tOp TCExp (total (op2 nExp)) [x,y] = t+  | Just 0 <- tIsNum y = tNum (1 :: Int)+  | TCon (TF TCExp) [a,b] <- tNoUser y = tExp x (tMul a b)+  | otherwise = tf2 TCExp x y+++-- Normal: constants to the left+tMin :: Type -> Type -> Type+tMin x y+  | Just t <- tOp TCMin (total (op2 nMin)) [x,y] = t+  | Just n <- tIsNat' x = minK n y+  | Just n <- tIsNat' y = minK n x+  | Just n <- matchMaybe (minPlusK x y <|> minPlusK y x) = n+  | Just n <- matchMaybe $ do (k,a) <- isMinK x+                              return $ minK k (tMin a y)+                          <|>+                          do (k,a) <- isMinK y+                             return $ minK k (tMin x a)+    = n++  | Just n <- matchMaybe $ do (k1,a) <- isAddK x+                              (k2,b) <- isAddK y+                              guard (a == b)+                              return $ tAdd (tNum (min k1 k2)) a+    = n++  | x == y              = x+  -- XXX: min (k + t) t -> t+  | otherwise           = tf2 TCMin x y+  where+  isAddK ty = do (a,b) <- anAdd ty+                 k     <- aNat a+                 return (k,b)++  isMinK ty = do (a,b) <- aMin ty+                 k     <- aNat' a+                 return (k,b)++  minPlusK a b = do (k,r) <- isAddK a+                    guard (k >= 1 && b == r)+                    return b+++  minK Inf t      = t+  minK (Nat 0) _  = tNum (0 :: Int)+  minK (Nat k) t+    | TCon (TF TCMin) [a,b] <- t'+    , Just n <- tIsNum a   = tf2 TCMin (tNum (min k n)) b++    | otherwise = tf2 TCMin (tNum k) t+    where t' = tNoUser t++-- Normal: constants to the left+tMax :: Type -> Type -> Type+tMax x y+  | Just t <- tOp TCMax (total (op2 nMax)) [x,y] = t+  | Just n <- tIsNat' x = maxK n y+  | Just n <- tIsNat' y = maxK n x+  | otherwise           = tf2 TCMax x y+  where+  maxK Inf _     = tInf+  maxK (Nat 0) t = t+  maxK (Nat k) t++    | TCon (TF TCAdd) [a,b] <- t'+    , Just n <- tIsNum a = if k <= n+                             then t+                             else tMax (tNum (k - n)) b++    | TCon (TF TCSub) [a,b] <- t'+    , Just n <- tIsNat' a =+      case n of+        Inf   -> t+        Nat m -> if k >= m then tNum k else tSub a (tMin (tNum (m - k)) b)++    | TCon (TF TCMax) [a,b] <- t'+    , Just n <- tIsNum a  = tf2 TCMax (tNum (max k n)) b++    | otherwise = tf2 TCMax (tNum k) t+    where t' = tNoUser t+++tWidth :: Type -> Type+tWidth x+  | Just t <- tOp TCWidth (total (op1 nWidth)) [x] = t+  | otherwise = tf1 TCWidth x++tLenFromThen :: Type -> Type -> Type -> Type+tLenFromThen x y z+  | Just t <- tOp TCLenFromThen (op3 nLenFromThen) [x,y,z] = t+  -- XXX: rules?+  | otherwise = tf3 TCLenFromThen x y z++tLenFromThenTo :: Type -> Type -> Type -> Type+tLenFromThenTo x y z+  | Just t <- tOp TCLenFromThenTo (op3 nLenFromThenTo) [x,y,z] = t+  | otherwise = tf3 TCLenFromThenTo x y z++total :: ([Nat'] -> Nat') -> ([Nat'] -> Maybe Nat')+total f xs = Just (f xs)++op1 :: (a -> b) -> [a] -> b+op1 f ~[x] = f x++op2 :: (a -> a -> b) -> [a] -> b+op2 f ~[x,y] = f x y++op3 :: (a -> a -> a -> b) -> [a] -> b+op3 f ~[x,y,z] = f x y z++-- | Common checks: check for error, or simple full evaluation.+tOp :: TFun -> ([Nat'] -> Maybe Nat') -> [Type] -> Maybe Type+tOp tf f ts+  | Just e  <- msum (map tIsError ts) = Just (tBadNumber e)+  | Just xs <- mapM tIsNat' ts =+      Just $ case f xs of+               Nothing -> tBadNumber (err xs)+               Just n  -> tNat' n+  | otherwise = Nothing+  where+  err xs = TCErrorMessage $+              "Invalid type: " ++ show (pp (TCon (TF tf) (map tNat' xs)))++++
+ src/Cryptol/TypeCheck/SimpleSolver.hs view
@@ -0,0 +1,50 @@+{-# LANGUAGE PatternGuards, Trustworthy #-}+module Cryptol.TypeCheck.SimpleSolver ( simplify , simplifyStep) where++import Cryptol.TypeCheck.Type hiding+  ( tSub, tMul, tDiv, tMod, tExp, tMin, tWidth+  , tLenFromThen, tLenFromThenTo)+import Cryptol.TypeCheck.Solver.Types+import Cryptol.TypeCheck.Solver.Numeric.Fin(cryIsFinType)+import Cryptol.TypeCheck.Solver.Numeric(cryIsEqual, cryIsNotEqual, cryIsGeq)+import Cryptol.TypeCheck.Solver.Class(solveArithInst,solveCmpInst)++import Cryptol.Utils.Debug(ppTrace)+import Cryptol.TypeCheck.PP++simplify :: Ctxt -> Prop -> Prop+simplify ctxt p =+  case simplifyStep ctxt p of+    Unsolvable e -> pError e+    Unsolved     -> dbg msg p+      where msg = text "unsolved:" <+> pp p+    SolvedIf ps -> dbg msg $ pAnd (map (simplify ctxt) ps)+     where msg = case ps of+                    [] -> text "solved:" <+> pp p+                    _  -> pp p <+> text "~~~>" <+>+                          vcat (punctuate comma (map pp ps))++  where+  dbg msg x+    | False     = ppTrace msg x+    | otherwise = x+++simplifyStep :: Ctxt -> Prop -> Solved+simplifyStep ctxt prop =+  case tNoUser prop of+    TCon (PC PTrue)  []       -> SolvedIf []+    TCon (PC PAnd)   [l,r]    -> SolvedIf [l,r]++    TCon (PC PArith) [ty]     -> solveArithInst ty+    TCon (PC PCmp)   [ty]     -> solveCmpInst   ty++    TCon (PC PFin)   [ty]     -> cryIsFinType ctxt ty++    TCon (PC PEqual) [t1,t2]  -> cryIsEqual ctxt t1 t2+    TCon (PC PNeq)  [t1,t2]   -> cryIsNotEqual ctxt t1 t2+    TCon (PC PGeq)  [t1,t2]   -> cryIsGeq ctxt t1 t2++    _                         -> Unsolved++
src/Cryptol/TypeCheck/Solve.hs view
@@ -15,35 +15,36 @@   , wfTypeFunction   , improveByDefaultingWith   , defaultReplExpr-  , simpType-  , simpTypeMaybe   ) where -import           Cryptol.Parser.Position (emptyRange) import           Cryptol.TypeCheck.PP(pp) import           Cryptol.TypeCheck.AST import           Cryptol.TypeCheck.Monad import           Cryptol.TypeCheck.Subst-                    (apSubst,fvs,singleSubst,substToList, isEmptySubst,+                    (apSubst, singleSubst, isEmptySubst, substToList,                           emptySubst,Subst,listSubst, (@@), Subst,-                           apSubstMaybe)-import           Cryptol.TypeCheck.Solver.Class+                           apSubstMaybe, substBinds)+import qualified Cryptol.TypeCheck.SimpleSolver as Simplify+import           Cryptol.TypeCheck.Solver.Types import           Cryptol.TypeCheck.Solver.Selector(tryHasGoal)+import           Cryptol.TypeCheck.SimpType(tMax)+++import           Cryptol.TypeCheck.Solver.SMT(proveImp,checkUnsolvable)+import           Cryptol.TypeCheck.Solver.Improve(improveProp,improveProps)+import           Cryptol.TypeCheck.Solver.Numeric.Interval import qualified Cryptol.TypeCheck.Solver.Numeric.AST as Num import qualified Cryptol.TypeCheck.Solver.Numeric.ImportExport as Num-import           Cryptol.TypeCheck.Solver.Numeric.Interval (Interval)-import qualified Cryptol.TypeCheck.Solver.Numeric.Simplify1 as Num-import qualified Cryptol.TypeCheck.Solver.Numeric.SimplifyExpr as Num import qualified Cryptol.TypeCheck.Solver.CrySAT as Num-import           Cryptol.TypeCheck.Solver.CrySAT (debugBlock, DebugLog(..))-import           Cryptol.TypeCheck.Solver.Simplify (tryRewritePropAsSubst)-import           Cryptol.Utils.PP (text)+import           Cryptol.TypeCheck.Solver.CrySAT+import           Cryptol.Utils.PP (text,vcat,(<+>)) import           Cryptol.Utils.Panic(panic)-import           Cryptol.Utils.Misc(anyJust)+import           Cryptol.Utils.Patterns(matchMaybe) -import           Control.Monad (unless, guard)+import           Control.Monad (guard, mzero)+import           Control.Applicative ((<|>)) import           Data.Either(partitionEithers)-import           Data.Maybe(catMaybes, fromMaybe, mapMaybe)+import           Data.Maybe(catMaybes) import           Data.Map ( Map ) import qualified Data.Map as Map import           Data.Set ( Set )@@ -82,18 +83,97 @@  -------------------------------------------------------------------------------- ++quickSolverIO :: Ctxt -> [Goal] -> IO (Either Goal (Subst,[Goal]))+quickSolverIO _ [] = return (Right (emptySubst, []))+quickSolverIO ctxt gs =+  case quickSolver ctxt gs of+    Left err ->+      do msg (text "Contradiction:" <+> pp (goal err))+         return (Left err)+    Right (su,gs') ->+      do msg (vcat (map (pp . goal) gs' ++ [pp su]))+         return (Right (su,gs'))+  where+  msg _ = return ()+{-+  shAsmps = case [ pp x <+> text "in" <+> ppInterval i |+               (x,i) <- Map.toList ctxt ] of+              [] -> text ""+              xs -> text "ASMPS:" $$ nest 2 (vcat xs $$ text "===")+  msg d = putStrLn $ show (+             text "quickSolver:" $$ nest 2 (vcat+                [ shAsmps+                , vcat (map (pp.goal) gs)+                , text "==>"+                , d+                ])) -- -}++quickSolver :: Ctxt   -- ^ Facts we can know+            -> [Goal] -- ^ Need to solve these+            -> Either Goal (Subst,[Goal])+            -- ^ Left: contradicting goals,+            --   Right: inferred types, unsolved goals.+quickSolver ctxt gs0 = go emptySubst [] gs0+  where+  go su [] [] = Right (su,[])++  go su unsolved [] =+    case matchMaybe (findImprovement unsolved) of+      Nothing            -> Right (su,unsolved)+      Just (newSu, subs) -> go (newSu @@ su) [] (subs ++ apSubst newSu unsolved)++  go su unsolved (g : gs) =+    case Simplify.simplifyStep ctxt (goal g) of+      Unsolvable _        -> Left g+      Unsolved            -> go su (g : unsolved) gs+      SolvedIf subs       ->+        let cvt x = g { goal = x }+        in go su unsolved (map cvt subs ++ gs)++  -- Probably better to find more than one.+  findImprovement []       = mzero+  findImprovement (g : gs) =+    do (su,ps) <- improveProp False ctxt (goal g)+       return (su, [ g { goal = p } | p <- ps ])+    <|> findImprovement gs++++++--------------------------------------------------------------------------------+ simplifyAllConstraints :: InferM () simplifyAllConstraints =-  do mapM_  tryHasGoal =<< getHasGoals+  do simpHasGoals      gs <- getGoals-     solver <- getSolver-     (mb,su) <- io (simpGoals' solver gs)-     extendSubst su-     case mb of-       Right gs1  -> addGoals gs1-       Left badGs -> mapM_ (recordError . UnsolvedGoal True) badGs+     case gs of+       [] -> return ()+       _ ->+        case quickSolver Map.empty gs of+          Left badG      -> recordError (UnsolvedGoals True [badG])+          Right (su,gs1) ->+            do extendSubst su+               addGoals gs1 +-- | Simplify @Has@ constraints as much as possible.+simpHasGoals :: InferM ()+simpHasGoals = go False [] =<< getHasGoals+  where+  go _     []       []  = return ()+  go True  unsolved []  = go False [] unsolved+  go False unsolved []  = mapM_ addHasGoal unsolved +  go changes unsolved (g : todo) =+    do (ch,solved) <- tryHasGoal g+       let changes'  = ch || changes+           unsolved' = if solved then unsolved else g : unsolved+       changes' `seq` unsolved `seq` go changes' unsolved' todo++++ proveImplication :: Name -> [TParam] -> [Prop] -> [Goal] -> InferM Subst proveImplication lnam as ps gs =   do evars <- varsWithAsmps@@ -114,115 +194,80 @@                    -> [Goal]   -- ^ Collected constraints                    -> IO (Either Error [Warning], Subst) proveImplicationIO _   _     _         _  [] [] = return (Right [], emptySubst)-proveImplicationIO s lname varsInEnv as ps gs =-  debugBlock s "proveImplicationIO" $--  do debugBlock s "assumes" (debugLog s ps)-     debugBlock s "shows"   (debugLog s gs)-     debugLog s "1. ------------------"---     _simpPs <- Num.assumeProps s ps--     mbImps <- Num.check s-     debugLog s "2. ------------------"---     case mbImps of--       Nothing ->-         do debugLog s "(contradiction in assumptions)"-            return (Left $ UnusableFunction lname ps, emptySubst)--       Just (imps,extra) ->-         do let su  = importImps imps-                gs0 = apSubst su gs--            debugBlock s "improvement from assumptions:" $ debugLog s su--            let (scs,invalid) = importSideConds extra-            unless (null invalid) $-              panic "proveImplicationIO" ( "Unable to import all side conditions:"-                                              : map (show . Num.ppProp) invalid )--            let gs1 = filter ((`notElem` ps) . goal) gs0--            debugLog s "3. ---------------------"-            (mb,su1) <- simpGoals' s (scs ++ gs1)--            case mb of-              Left badGs  -> reportUnsolved badGs (su1 @@ su)-              Right []    -> return (Right [], su1 @@ su)--              Right us ->-                 -- Last hope: try to default stuff-                 do let vs    = Set.filter isFreeTV $ fvs $ map goal us-                        dVars = Set.toList (vs `Set.difference` varsInEnv)-                    (_,us1,su2,ws) <- improveByDefaultingWith s dVars us-                    case us1 of-                       [] -> return (Right ws, su2 @@ su1 @@ su)-                       _  -> reportUnsolved us1 (su2 @@ su1 @@ su)+proveImplicationIO s f varsInEnv ps asmps0 gs0 =+  do let ctxt = assumptionIntervals Map.empty asmps+     res <- quickSolverIO ctxt gs+     case res of+       Left bad -> return (Left (UnsolvedGoals True [bad]), emptySubst)+       Right (su,[]) -> return (Right [], su)+       Right (su,gs1) ->+         do gs2 <- proveImp s asmps gs1+            case gs2 of+              [] -> return (Right [], su)+              gs3 ->+                do let free = Set.toList+                            $ Set.difference (fvs (map goal gs3)) varsInEnv+                   case improveByDefaultingWithPure free gs3 of+                     (_,_,newSu,_)+                        | isEmptySubst newSu -> return (err gs3, su) -- XXX: Old?+                     (_,newGs,newSu,ws) ->+                       do let su1 = newSu @@ su+                          (res1,su2) <- proveImplicationIO s f varsInEnv ps+                                                 (apSubst su1 asmps0) newGs+                          let su3 = su2 @@ su1+                          case res1 of+                            Left bad -> return (Left bad, su3)+                            Right ws1 -> return (Right (ws++ws1),su3)   where-  reportUnsolved us su =-    return ( Left $ UnsolvedDelayedCt-                  $ DelayedCt { dctSource = lname-                              , dctForall = as-                              , dctAsmps  = ps+  err us =  Left $ cleanupError+                 $ UnsolvedDelayedCt+                 $ DelayedCt { dctSource = f+                              , dctForall = ps+                              , dctAsmps  = asmps0                               , dctGoals  = us-                              }, su)+                              }   +  (asmps,gs) =+     let gs1 = [ g { goal = p } | g <- gs0, p <- pSplitAnd (goal g)+                                , notElem p asmps0 ]+     in case matchMaybe (improveProps True Map.empty asmps0) of+          Nothing -> (asmps0,gs1)+          Just (newSu,newAsmps) ->+             ( [ TVar x =#= t | (x,t) <- substToList newSu ]+               ++ newAsmps+             , [ g { goal = apSubst newSu (goal g) } | g <- gs1 ]+             )  -{- Constraints and satisfiability: -  1. [Satisfiable] A collection of constraints is _satisfiable_, if there is an-     assignment for the variables that make all constraints true. -  2. [Valid] If a constraint is satisfiable for any assignment of its free-     variables, then it is _valid_, and may be ommited.+cleanupError :: Error -> Error+cleanupError err =+  case err of+    UnsolvedDelayedCt d ->+      let noInferVars = Set.null . Set.filter isFreeTV . fvs . goal+          without = filter noInferVars (dctGoals d)+      in UnsolvedDelayedCt $+            if not (null without) then d { dctGoals = without } else d -  3. [Partial] A constraint may _partial_, which means that under some-     assignment it is neither true nor false.  For example:-     `x - y > 5` is true for `{ x = 15, y = 3 }`, it is false for-     `{ x = 5, y = 4 }`, and it is neither for `{ x = 1, y = 2 }`.+    _ -> err -     Note that constraints that are always true or undefined are NOT-     valid, as there are assignemntes for which they are not true.-     An example of such constraint is `x - y >= 0`. -  4. [Provability] Instead of thinking of three possible values for-     satisfiability (i.e., true, false, and unknown), we could instead-     think of asking: "Is constraint C provable".  This essentailly-     maps "true" to "true", and "false,unknown" to "false", if we-     treat constraints with malformed parameters as unprovable.--}  -{--The plan:-  1. Start with a set of constraints, CS-  2. Compute its well-defined closure, DS.-  3. Simplify constraints: evaluate terms in constraints as much as possible-  4. Solve: eliminate constraints that are true-  5. Check for consistency-  6. Compute improvements-  7. For each type in the improvements, add well-defined constraints-  8. Instantiate constraints with substitution-  9. Goto 3--} -simpGoals' :: Num.Solver -> [Goal] -> IO (Either [Goal] [Goal], Subst)-simpGoals' s gs0 = go emptySubst [] (wellFormed gs0 ++ gs0)++simpGoals' :: Num.Solver -> Ctxt -> [Goal] -> IO (Either [Goal] [Goal], Subst)+simpGoals' s asmps gs0 = go emptySubst [] (wellFormed gs0 ++ gs0)   where   -- Assumes that the well-formed constraints are themselves well-formed.   wellFormed gs = [ g { goal = p } | g <- gs, p <- wfType (goal g) ]    go su old [] = return (Right old, su)   go su old gs =-    do gs1  <- simplifyConstraintTerms s gs-       res  <- solveConstraints s old gs1+    do res  <- solveConstraints s asmps old gs        case res of          Left err -> return (Left err, su)          Right gs2 ->@@ -257,14 +302,20 @@ want to use the fact that `x >= 1` to simplify `x >= 1` to true. -} --- XXX: currently simplify individually-simplifyConstraintTerms :: Num.Solver -> [Goal] -> IO [Goal]-simplifyConstraintTerms s gs =-  debugBlock s "Simplifying terms" $ return (map simpGoal gs)-  where simpGoal g = g { goal = simpProp (goal g) }  ++assumptionIntervals :: Ctxt -> [Prop] -> Ctxt+assumptionIntervals as ps =+  case computePropIntervals as ps of+    NoChange -> as+    InvalidInterval {} -> as -- XXX: say something+    NewIntervals bs -> Map.union bs as+++ solveConstraints :: Num.Solver ->+                    Ctxt ->                     [Goal] {- We may use these, but don't try to solve,                               we already tried and failed. -} ->                     [Goal] {- Need to solve these -} ->@@ -272,32 +323,37 @@                     -- ^ Left: contradiciting goals,                     --   Right: goals that were not solved, or sub-goals                     --          for solved goals.  Does not include "old"-solveConstraints s otherGs gs0 =-  debugBlock s "Solving constraints" $ solveClassCts [] [] gs0+solveConstraints s asmps otherGs gs0 =+  debugBlock s "Solving constraints" $ go ctxt0 [] gs0    where+  ctxt0 = assumptionIntervals asmps (map goal otherGs)+++  go _ unsolved [] =+    do let (cs,nums) = partitionEithers (map Num.numericRight unsolved)+       nums' <- solveNumerics s otherNumerics nums+       return (Right (cs ++ nums'))++  go ctxt unsolved (g : gs) =+    case Simplify.simplifyStep ctxt (goal g) of+      Unsolvable _x       -> return (Left [g])  -- maybe give error?+      Unsolved            -> go ctxt (g : unsolved) gs+      SolvedIf subs       ->+        let cvt x = g { goal = x }+        in  go ctxt unsolved (map cvt subs ++ gs)++   otherNumerics = [ g | Right g <- map Num.numericRight otherGs ] -  solveClassCts unsolvedClass numerics [] =-    do unsolvedNum <- solveNumerics s otherNumerics numerics-       return (Right (unsolvedClass ++ unsolvedNum)) -  solveClassCts unsolved numerics (g : gs) =-    case Num.numericRight g of-      Right n -> solveClassCts unsolved (n : numerics) gs-      Left c  ->-        case classStep c of-          Unsolvable          -> return (Left [g])-          Unsolved            -> solveClassCts (g : unsolved) numerics gs-          Solved Nothing subs -> solveClassCts unsolved numerics (subs ++ gs)-          Solved (Just su) _  -> panic "solveClassCts"-                                          [ "Unexpected substituion", show su ]   solveNumerics :: Num.Solver ->                  [(Goal,Num.Prop)] {- ^ Consult these -} ->                  [(Goal,Num.Prop)] {- ^ Solve these -}   ->                  IO [Goal]+solveNumerics _ _ [] = return [] solveNumerics s consultGs solveGs =   Num.withScope s $     do _   <- Num.assumeProps s (map (goal . fst) consultGs)@@ -320,25 +376,21 @@                   Right ints <- Num.getIntervals s                   return (Just (ints,su))      case res of-       Just (ints,su)+       Just (_ints, su) -> return (Right su) -- ?+{-          | isEmptySubst su          , (x,t) : _ <- mapMaybe (improveByDefn ints) gs ->            do let su' = singleSubst x t               debugLog s ("Improve by definition: " ++ show (pp su'))               return (Right su')-          | otherwise -> return (Right su)-+ -}        Nothing ->          do bad <- Num.minimizeContradictionSimpDef s                                                 (map Num.knownDefined nums)             return (Left bad)  -improveByDefn :: Map TVar Interval -> Goal -> Maybe (TVar,Type)-improveByDefn ints Goal { .. } =-  do (var,ty) <- tryRewritePropAsSubst ints goal-     return (var,simpType ty)   @@ -367,31 +419,8 @@   --- | Import an improving substitution into a Cryptol substitution.--- The substitution will contain both unification and skolem variables,--- so this should be used when processing *givens*.-importImps :: Map Num.Name Num.Expr -> Subst-importImps = listSubst . map imp . Map.toList-  where-  imp (x,e) = case (x, Num.importType e) of-                (Num.UserName tv, Just ty) -> (tv,ty)-                _ -> panic "importImps" [ "Failed to import:", show x, show e ]  --importSideConds :: [Num.Prop] -> ([Goal],[Num.Prop])-importSideConds = go [] []-  where-  go ok bad []     = ([ Goal CtImprovement emptyRange g | g <- ok], bad)-  go ok bad (p:ps) = case Num.importProp p of-                       Just p' -> go (p' ++ ok)    bad  ps-                       Nothing -> go        ok  (p:bad) ps------ --------------------------------------------------------------------------------  -- This is what we use to avoid ambiguity when generalizing.@@ -424,10 +453,50 @@   [Goal] ->   -- constraints     IO  ( [TVar]    -- non-defaulted         , [Goal]    -- new constraints-        , Subst     -- improvements from defaulting+        , Maybe Subst   -- Nothing: improve to False+                        -- Just:    improvements from defaulting         , [Warning] -- warnings about defaulting         )-improveByDefaultingWith s as ps =+-- XXX: Remove this+-- improveByDefaultingWith s as gs = return (as,gs,emptySubst,[])+improveByDefaultingWith s as gs =+  do bad <- checkUnsolvable s gs+     if bad+       then return (as, gs, Nothing, [])+       else tryImp++  where+  tryImp =+    case improveByDefaultingWithPure as gs of+      (xs,gs',su,ws) ->+        do (res,su1) <- simpGoals' s Map.empty gs'+           case res of+             Left err ->+               panic "improveByDefaultingWith"+                    $ [ "Defaulting resulted in unsolvable constraints."+                      , "Before:"+                      ] ++ [ "  " ++ show (pp (goal g)) | g <- gs ] +++                      [ "After:"+                      ] ++ [ "  " ++ show (pp (goal g)) | g <- gs' ] +++                      [ "Contradiction:" ] +++                      [ "  " ++ show (pp (goal g)) | g <- err ]+             Right gs'' ->+               do let su2 = su1 @@ su+                      isDef x = x `Set.member` substBinds su2+                  return ( filter (not . isDef) xs+                         , gs''+                         , Just su2+                         , ws+                         )+++improveByDefaultingWithPure :: [TVar] -> [Goal] ->+    ( [TVar]    -- non-defaulted+    , [Goal]    -- new constraints+    , Subst     -- improvements from defaulting+    , [Warning] -- warnings about defaulting+    )+improveByDefaultingWithPure as ps =   classify (Map.fromList [ (a,([],Set.empty)) | a <- as ]) [] [] ps    where@@ -436,34 +505,23 @@   -- fins: all `fin` constraints   -- others: any other constraints   classify leqs fins others [] =-    do let -- First, we use the `leqs` to choose some definitions.-           (defs, newOthers)  = select [] [] (fvs others) (Map.toList leqs)-           su                 = listSubst defs--       -- Do this to simplify the instantiated "fin" constraints.-       (mb,su1) <- simpGoals' s (newOthers ++ others ++ apSubst su fins)-       case mb of-         Right gs1 ->-           let warn (x,t) =-                 case x of-                   TVFree _ _ _ d -> DefaultingTo d t-                   TVBound {} -> panic "Crypto.TypeCheck.Infer"-                     [ "tryDefault attempted to default a quantified variable."-                     ]--               newSu = su1 @@ su     -- XXX: is that right?-               names = Set.fromList $ map fst $ fromMaybe [] $ substToList newSu--            in return ( [ a | a <- as, not (a `Set.member` names) ]-                      , gs1-                      , newSu-                      , map warn defs-                      )-+    let -- First, we use the `leqs` to choose some definitions.+        (defs, newOthers)  = select [] [] (fvs others) (Map.toList leqs)+        su                 = listSubst defs+        warn (x,t) =+          case x of+            TVFree _ _ _ d -> DefaultingTo d t+            TVBound {} -> panic "Crypto.TypeCheck.Infer"+                 [ "tryDefault attempted to default a quantified variable."+                 ] +        names = substBinds su -         -- Something went wrong, don't default.-         Left _ -> return (as,ps,su1 @@ su,[])+    in ( [ a | a <- as, not (a `Set.member` names) ]+       , newOthers ++ others ++ apSubst su fins+       , su+       , map warn defs+       )     classify leqs fins others (prop : more) =@@ -532,13 +590,14 @@ -- The resulting types should satisfy the constraints of the schema. defaultReplExpr :: Num.Solver -> Expr -> Schema              -> IO (Maybe ([(TParam,Type)], Expr))+-- defaultReplExpr _ _ _ = return Nothing defaultReplExpr so e s =   if all (\v -> kindOf v == KNum) (sVars s)      then do let params = map tpVar (sVars s)              mbSubst <- tryGetModel so params (sProps s)              case mbSubst of                Just su ->-                 do (res,su1) <- simpGoals' so (map (makeGoal su) (sProps s))+                 do (res,su1) <- simpGoals' so Map.empty (map (makeGoal su) (sProps s))                     return $                       case res of                         Right [] | isEmptySubst su1 ->@@ -574,79 +633,5 @@ tryGetModel s xs ps =   -- We are only interested in finite instantiations   Num.getModel s (map (pFin . TVar) xs ++ ps)------------------------------------------------------------------------------------simpType :: Type -> Type-simpType ty = fromMaybe ty (simpTypeMaybe ty)--simpProp :: Prop -> Prop-simpProp p = case p of-              TUser f ts q -> TUser f (map simpType ts) (simpProp q)-              TCon c ts    -> TCon c (map simpType ts)-              TVar {}      -> panic "simpProp" ["variable", show p]-              TRec {}      -> panic "simpProp" ["record", show p]-----simpTypeMaybe :: Type -> Maybe Type-simpTypeMaybe ty =-  case ty of-    TCon c ts ->-      case c of-        TF {}    -> do e  <- Num.exportType ty-                       e1 <- Num.crySimpExprMaybe e-                       Num.importType e1--        _        -> TCon c `fmap` anyJust simpTypeMaybe ts--    TVar _       -> Nothing-    TUser x ts t -> TUser x ts `fmap` simpTypeMaybe t-    TRec fs      ->-      do let (ls,ts) = unzip fs-         ts' <- anyJust simpTypeMaybe ts-         return (TRec (zip ls ts'))-------------------------------------------------------------------------------------_testSimpGoals :: IO ()-_testSimpGoals = Num.withSolver cfg $ \s ->-  do mapM_ dump asmps-     mapM_ (dump .goal) gs--     _ <- Num.assumeProps s asmps-     _mbImps <- Num.check s---     (mb,_) <- simpGoals' s gs-     case mb of-       Right _  -> debugLog s "End of test"-       Left _   -> debugLog s "Impossible"-  where-  cfg = SolverConfig { solverPath = "z3"-                     , solverArgs = [ "-smt2", "-in" ]-                     , solverVerbose = 1-                     }--  asmps = []--  gs    = map fakeGoal [ tv 0 =#= tMin (num 10) (tv 1)-                       , tv 1 =#= num 10-                       ]---  fakeGoal p = Goal { goalSource = undefined, goalRange = undefined, goal = p }-  tv n  = TVar (TVFree n KNum Set.empty (text "test var"))-  _btv n = TVar (TVBound n KNum)-  num x = tNum (x :: Int)--  dump a = do putStrLn "-------------------_"-              case Num.exportProp a of-                Just b     -> do print $ Num.ppProp' $ Num.propToProp' b-                                 putStrLn "-------------------"-                Nothing    -> print "can't export"-  
src/Cryptol/TypeCheck/Solver/Class.hs view
@@ -11,79 +11,85 @@ {-# LANGUAGE PatternGuards #-} module Cryptol.TypeCheck.Solver.Class   ( classStep+  , solveArithInst+  , solveCmpInst   , expandProp   ) where -import Cryptol.TypeCheck.AST-import Cryptol.TypeCheck.InferTypes(Goal(..), Solved(..))+import Cryptol.TypeCheck.Type+import Cryptol.TypeCheck.Solver.Types  -- | Solve class constraints. -- If not, then we return 'Nothing'. -- If solved, ther we return 'Just' a list of sub-goals.-classStep :: Goal -> Solved-classStep g = case goal g of-  TCon (PC PArith) [ty] -> solveArithInst g (tNoUser ty)-  TCon (PC PCmp) [ty]   -> solveCmpInst g   (tNoUser ty)+classStep :: Prop -> Solved+classStep p = case tNoUser p of+  TCon (PC PArith) [ty] -> solveArithInst (tNoUser ty)+  TCon (PC PCmp) [ty]   -> solveCmpInst   (tNoUser ty)   _                     -> Unsolved --- | Solve an original goal in terms of the give sub-goals.-solved :: Goal -> [Prop] -> Solved-solved g ps = Solved Nothing [ g { goal = p } | p <- ps ]- -- | Solve an Arith constraint by instance, if possible.-solveArithInst :: Goal -> Type -> Solved-solveArithInst g ty = case ty of+solveArithInst :: Type -> Solved+solveArithInst ty = case tNoUser ty of +  -- Arith Error -> fails+  TCon (TError _ e) _ -> Unsolvable e+   -- Arith [n]e-  TCon (TC TCSeq) [n, e] -> solveArithSeq g n e+  TCon (TC TCSeq) [n, e] -> solveArithSeq n e    -- Arith b => Arith (a -> b)-  TCon (TC TCFun) [_,b] -> solved g [ pArith b ]+  TCon (TC TCFun) [_,b] -> SolvedIf [ pArith b ]    -- (Arith a, Arith b) => Arith (a,b)-  TCon (TC (TCTuple _)) es -> solved g [ pArith e | e <- es ]+  TCon (TC (TCTuple _)) es -> SolvedIf [ pArith e | e <- es ]    -- Arith Bit fails-  TCon (TC TCBit) [] -> Unsolvable+  TCon (TC TCBit) [] ->+    Unsolvable $ TCErrorMessage "Arithmetic cannot be done on individual bits."    -- (Arith a, Arith b) => Arith { x1 : a, x2 : b }-  TRec fs -> solved g [ pArith ety | (_,ety) <- fs ]+  TRec fs -> SolvedIf [ pArith ety | (_,ety) <- fs ]    _ -> Unsolved  -- | Solve an Arith constraint for a sequence.  The type passed here is the -- element type of the sequence.-solveArithSeq :: Goal -> Type -> Type -> Solved-solveArithSeq g n ty = case ty of+solveArithSeq :: Type -> Type -> Solved+solveArithSeq n ty = case tNoUser ty of    -- fin n => Arith [n]Bit-  TCon (TC TCBit) [] -> solved g [ pFin n ]+  TCon (TC TCBit) [] -> SolvedIf [ pFin n ]    -- variables are not solvable.   TVar {} -> Unsolved    -- Arith ty => Arith [n]ty-  _ -> solved g [ pArith ty ]+  _ -> SolvedIf [ pArith ty ]   -- | Solve Cmp constraints.-solveCmpInst :: Goal -> Type -> Solved-solveCmpInst g ty = case ty of+solveCmpInst :: Type -> Solved+solveCmpInst ty = case tNoUser ty of +  -- Cmp Error -> fails+  TCon (TError _ e) _ -> Unsolvable e+   -- Cmp Bit-  TCon (TC TCBit) [] -> solved g []+  TCon (TC TCBit) [] -> SolvedIf []    -- (fin n, Cmp a) => Cmp [n]a-  TCon (TC TCSeq) [n,a] -> solved g [ pFin n, pCmp a ]+  TCon (TC TCSeq) [n,a] -> SolvedIf [ pFin n, pCmp a ]    -- (Cmp a, Cmp b) => Cmp (a,b)-  TCon (TC (TCTuple _)) es -> solved g (map pCmp es)+  TCon (TC (TCTuple _)) es -> SolvedIf (map pCmp es)    -- Cmp (a -> b) fails-  TCon (TC TCFun) [_,_] -> Unsolvable+  TCon (TC TCFun) [_,_] ->+    Unsolvable $ TCErrorMessage "Comparisons may not be performed on functions."    -- (Cmp a, Cmp b) => Cmp { x:a, y:b }-  TRec fs -> solved g [ pCmp e | (_,e) <- fs ]+  TRec fs -> SolvedIf [ pCmp e | (_,e) <- fs ]    _ -> Unsolved 
src/Cryptol/TypeCheck/Solver/CrySAT.hs view
@@ -21,12 +21,15 @@   , DebugLog(..)   , knownDefined, numericRight   , minimizeContradictionSimpDef+  , loadFile+  , rawSolver   ) where  import qualified Cryptol.TypeCheck.AST as Cry-import           Cryptol.TypeCheck.InferTypes(Goal(..), SolverConfig(..), Solved(..))+import           Cryptol.TypeCheck.InferTypes(Goal(..), SolverConfig(..)) import qualified Cryptol.TypeCheck.Subst as Cry +import           Cryptol.TypeCheck.Solver.Types import           Cryptol.TypeCheck.Solver.Numeric.AST import           Cryptol.TypeCheck.Solver.Numeric.Fin import           Cryptol.TypeCheck.Solver.Numeric.ImportExport@@ -42,6 +45,7 @@ import           Data.Maybe ( fromMaybe ) import           Data.Map (Map) import qualified Data.Map as Map+import           Data.Char(isSpace) import           Data.Foldable ( any, all ) import qualified Data.Set as Set import           Data.IORef ( IORef, newIORef, readIORef, modifyIORef',@@ -124,9 +128,11 @@               Just (ints,False) ->                debugLog s ("Using the fin solver:" ++ show (pp (goal (dpData p)))) >>-               case cryIsFin ints (dpData p) of-                 Solved _ gs' ->+               case cryIsFin ints (goal (dpData p)) of+                 SolvedIf ps' ->                    do debugLog s "solved"+                      let gg = dpData p+                          gs' = [ gg { goal = pr } | pr <- ps' ]                       let more' = [ knownDefined g | Right g <- map numericRight gs' ]                       go survived (more' ++ more)                  Unsolved ->@@ -134,8 +140,8 @@                       assert s p                       go (dpData p : survived) more -                 Unsolvable ->-                   do debugLog s "unsolvable"+                 x@(Unsolvable {}) ->+                   do debugLog s (show (pp x))                       go (dpData p:survived) more               Nothing -> go (dpData p:survived) more@@ -279,7 +285,29 @@     -- ^ For debugging   } +loadFile :: Solver -> FilePath -> IO ()+loadFile s file = do -- txt <- readFile file+                     -- mapM_ putStrLn (lines txt)+                     go . dropComments =<< readFile file+  where+  go txt+    | all isSpace txt = return ()+    | otherwise = case SMT.readSExpr txt of+                    Just (e,rest) -> SMT.command (solver s) e >> go rest+                    Nothing       -> panic "loadFile" [ "Failed to parse SMT file."+                                                      , txt+                                                      ] +  dropComments = unlines . map dropComment . lines+  dropComment xs = case break (== ';') xs of+                     (as,_:_) -> as+                     _ -> xs++rawSolver :: Solver -> SMT.Solver+rawSolver = solver+++ -- | Keeps track of declared variables and non-linear terms. data VarInfo = VarInfo   { curScope    :: Scope@@ -415,7 +443,7 @@      let smtDbg = if solverVerbose > 1 then Just logger else Nothing      solver <- SMT.newSolver solverPath solverArgs smtDbg      _ <- SMT.setOptionMaybe solver ":global-decls" "false"-     SMT.setLogic solver "QF_LIA"+     -- SMT.setLogic solver "QF_LIA"      declared <- newIORef viEmpty      a <- k Solver { .. }      _ <- SMT.stop solver
+ src/Cryptol/TypeCheck/Solver/Improve.hs view
@@ -0,0 +1,217 @@+-- | Look for opportunity to solve goals by instantiating variables.+module Cryptol.TypeCheck.Solver.Improve where++import qualified Data.Set as Set+import Control.Applicative+import Control.Monad++import Cryptol.Utils.Patterns++import Cryptol.TypeCheck.Type+import Cryptol.TypeCheck.SimpType as Mk+import Cryptol.TypeCheck.Solver.Types+import Cryptol.TypeCheck.Solver.Numeric.Interval+import Cryptol.TypeCheck.TypePat+import Cryptol.TypeCheck.Subst++++-- | Improvements from a bunch of propositions.+-- Invariant:+-- the substitions should be already applied to the new sub-goals, if any.+improveProps :: Bool -> Ctxt -> [Prop] -> Match (Subst,[Prop])+improveProps impSkol ctxt ps0 = loop emptySubst ps0+  where+  loop su props = case go emptySubst [] props of+                    (newSu,newProps)+                      | isEmptySubst newSu ->+                        if isEmptySubst su then mzero else return (su,props)+                      | otherwise -> loop (newSu @@ su) newProps++  go su subs [] = (su,subs)+  go su subs (p : ps) =+    case matchMaybe (improveProp impSkol ctxt p) of+      Nothing            -> go su (p:subs) ps+      Just (suNew,psNew) -> go (suNew @@ su) (psNew ++ apSubst suNew subs)+                                             (apSubst su ps)+++-- | Improvements from a proposition.+-- Invariant:+-- the substitions should be already applied to the new sub-goals, if any.+improveProp :: Bool -> Ctxt -> Prop -> Match (Subst,[Prop])+improveProp impSkol ctxt prop =+  improveEq impSkol ctxt prop+  -- XXX: others++++-- | Improvements from euqality constraints.+-- Invariant:+-- the substitions should be already applied to the new sub-goals, if any.+improveEq :: Bool -> Ctxt -> Prop -> Match (Subst,[Prop])+improveEq impSkol fins prop =+  do (lhs,rhs) <- (|=|) prop+     rewrite lhs rhs <|> rewrite rhs lhs+  where+  rewrite this other =+    do x <- aTVar this+       guard (considerVar x && x `Set.notMember` fvs other)+       return (singleSubst x other, [])+    <|>+    do (v,s) <- isSum this+       guard (v `Set.notMember` fvs other)+       return (singleSubst v (Mk.tSub other s), [ other >== s ])+++  isSum t = do (v,s) <- matches t (anAdd, aTVar, __)+               valid v s+        <|> do (s,v) <- matches t (anAdd, __, aTVar)+               valid v s++  valid v s = do let i = typeInterval fins s+                 guard (considerVar v && v `Set.notMember` fvs s && iIsFin i)+                 return (v,s)++  considerVar x = impSkol || isFreeTV x+++--------------------------------------------------------------------------------++-- XXX++{-+-- | When given an equality constraint, attempt to rewrite it to the form `?x =+-- ...`, by moving all occurrences of `?x` to the LHS, and any other variables+-- to the RHS.  This will only work when there's only one unification variable+-- present in the prop.++tryRewrteEqAsSubst :: Ctxt -> Type -> Type -> Maybe (TVar,Type)+tryRewrteEqAsSubst fins t1 t2 =+  do let vars = Set.toList (Set.filter isFreeTV (fvs (t1,t2)))+     listToMaybe $ sortBy (flip compare `on` rank)+                 $ catMaybes [ tryRewriteEq fins var t1 t2 | var <- vars ]+++-- | Rank a rewrite, favoring expressions that have fewer subtractions than+-- additions.+rank :: (TVar,Type) -> Int+rank (_,ty) = go ty+  where++  go (TCon (TF TCAdd) ts) = sum (map go ts) + 1+  go (TCon (TF TCSub) ts) = sum (map go ts) - 1+  go (TCon (TF TCMul) ts) = sum (map go ts) + 1+  go (TCon (TF TCDiv) ts) = sum (map go ts) - 1+  go (TCon _          ts) = sum (map go ts)+  go _                    = 0+++-- | Rewrite an equation with respect to a unification variable ?x, into the+-- form `?x = t`.  There are two interesting cases to consider (four with+-- symmetry):+--+--  * ?x = ty+--  * expr containing ?x = expr+--+-- In the first case, we just return the type variable and the type, but in the+-- second we try to rewrite the equation until it's in the form of the first+-- case.+tryRewriteEq :: Map TVar Interval -> TVar -> Type -> Type -> Maybe (TVar,Type)+tryRewriteEq fins uvar l r =+  msum [ do guard (uvarTy == l && uvar `Set.notMember` rfvs)+            return (uvar, r)++       , do guard (uvarTy == r && uvar `Set.notMember` lfvs)+            return (uvar, l)++       , do guard (uvar `Set.notMember` rfvs)+            ty <- rewriteLHS fins uvar l r+            return (uvar,ty)++       , do guard (uvar `Set.notMember` lfvs)+            ty <- rewriteLHS fins uvar r l+            return (uvar,ty)+       ]++  where++  uvarTy = TVar uvar++  lfvs   = fvs l+  rfvs   = fvs r+++-- | Check that a type contains only finite type variables.+allFin :: Map TVar Interval -> Type -> Bool+allFin ints ty = iIsFin (typeInterval ints ty)+++-- | Rewrite an equality until the LHS is just `uvar`. Return the rewritten RHS.+--+-- There are a few interesting cases when rewriting the equality:+--+--  A o B = R  when `uvar` is only present in A+--  A o B = R  when `uvar` is only present in B+--+-- In the first case, as we only consider addition and subtraction, the+-- rewriting will continue on the left, after moving the `B` side to the RHS of+-- the equation.  In the second case, if the operation is addition, the `A` side+-- will be moved to the RHS, with rewriting continuing in `B`. However, in the+-- case of subtraction, the `B` side is moved to the RHS, and rewriting+-- continues on the RHS instead.+--+-- In both cases, if the operation is addition, rewriting will only continue if+-- the operand being moved to the RHS is known to be finite. If this check was+-- not done, we would end up violating the well-definedness condition for+-- subtraction (for a, b: well defined (a - b) iff fin b).+rewriteLHS :: Map TVar Interval -> TVar -> Type -> Type -> Maybe Type+rewriteLHS fins uvar = go+  where++  go (TVar tv) rhs | tv == uvar = return rhs++  go (TCon (TF tf) [x,y]) rhs =+    do let xfvs = fvs x+           yfvs = fvs y++           inX  = Set.member uvar xfvs+           inY  = Set.member uvar yfvs++       if | inX && inY -> mzero+          | inX        -> balanceR x tf y rhs+          | inY        -> balanceL x tf y rhs+          | otherwise  -> mzero+++  -- discard type synonyms, the rewriting will make them no longer apply+  go (TUser _ _ l) rhs =+       go l rhs++  -- records won't work here.+  go _ _ =+       mzero+++  -- invert the type function to balance the equation, when the variable occurs+  -- on the LHS of the expression `x tf y`+  balanceR x TCAdd y rhs = do guardFin y+                              go x (tSub rhs y)+  balanceR x TCSub y rhs = go x (tAdd rhs y)+  balanceR _ _     _ _   = mzero+++  -- invert the type function to balance the equation, when the variable occurs+  -- on the RHS of the expression `x tf y`+  balanceL x TCAdd y rhs = do guardFin y+                              go y (tSub rhs x)+  balanceL x TCSub y rhs = go (tAdd rhs y) x+  balanceL _ _     _ _   = mzero+++  -- guard that the type is finite+  --+  -- XXX this ignores things like `min x inf` where x is finite, and just+  -- assumes that it won't work.+  guardFin ty = guard (allFin fins ty)+-}
src/Cryptol/TypeCheck/Solver/InfNat.hs view
@@ -31,20 +31,6 @@     Nat i -> Just i     _     -> Nothing -----------------------------------------------------------------------------------nEq :: Maybe Nat' -> Maybe Nat' -> Bool-nEq (Just x) (Just y) = x == y-nEq _ _               = False--nGt :: Maybe Nat' -> Maybe Nat' -> Bool-nGt (Just x) (Just y) = x > y-nGt _ _               = False--nFin :: Maybe Nat' -> Bool-nFin (Just x)         = x /= Inf-nFin _                = False-   
+ src/Cryptol/TypeCheck/Solver/Numeric.hs view
@@ -0,0 +1,295 @@+{-# LANGUAGE Safe, PatternGuards, MultiWayIf #-}+module Cryptol.TypeCheck.Solver.Numeric+  ( cryIsEqual, cryIsNotEqual, cryIsGeq+  ) where++import           Control.Applicative(Alternative(..))+import           Control.Monad (guard,mzero)+import           Data.Foldable (asum)++import Cryptol.Utils.Patterns+import Cryptol.TypeCheck.PP+import Cryptol.TypeCheck.Type hiding (tMul)+import Cryptol.TypeCheck.TypePat+import Cryptol.TypeCheck.Solver.Types+import Cryptol.TypeCheck.Solver.InfNat+import Cryptol.TypeCheck.Solver.Numeric.Interval+import Cryptol.TypeCheck.SimpType+++cryIsEqual :: Ctxt -> Type -> Type -> Solved+cryIsEqual ctxt t1 t2 =+  matchDefault Unsolved $+        (pBin PEqual (==) t1 t2)+    <|> (aNat' t1 >>= tryEqK ctxt t2)+    <|> (aNat' t2 >>= tryEqK ctxt t1)+    <|> (aTVar t1 >>= tryEqVar t2)+    <|> (aTVar t2 >>= tryEqVar t1)+    <|> ( guard (t1 == t2) >> return (SolvedIf []))+    <|> tryEqMin t1 t2+    <|> tryEqMin t2 t1+    <|> tryEqMulConst t1 t2+    <|> tryEqAddInf ctxt t1 t2+    <|> tryAddConst (=#=) t1 t2++++cryIsNotEqual :: Ctxt -> Type -> Type -> Solved+cryIsNotEqual _i t1 t2 = matchDefault Unsolved (pBin PNeq (/=) t1 t2)++cryIsGeq :: Ctxt -> Type -> Type -> Solved+cryIsGeq i t1 t2 =+  matchDefault Unsolved $+        (pBin PGeq (>=) t1 t2)+    <|> (aNat' t1 >>= tryGeqKThan i t2)+    <|> (aNat' t2 >>= tryGeqThanK i t1)+    <|> (aTVar t2 >>= tryGeqThanVar i t1)+    <|> tryGeqThanSub i t1 t2+    <|> (geqByInterval i t1 t2)+    <|> (guard (t1 == t2) >> return (SolvedIf []))+    <|> tryAddConst (>==) t1 t2+    <|> tryMinIsGeq t1 t2+    -- XXX: k >= width e+    -- XXX: width e >= k+++  -- XXX: max a 10 >= 2 --> True+  -- XXX: max a 2 >= 10 --> a >= 10+++pBin :: PC -> (Nat' -> Nat' -> Bool) -> Type -> Type -> Match Solved+pBin tf p t1 t2 =+      Unsolvable <$> anError KNum t1+  <|> Unsolvable <$> anError KNum t2+  <|> (do x <- aNat' t1+          y <- aNat' t2+          return $ if p x y+                      then SolvedIf []+                      else Unsolvable $ TCErrorMessage+                        $ "Unsolvable constraint: " +++                              show (pp (TCon (PC tf) [ tNat' x, tNat' y ])))+++--------------------------------------------------------------------------------+-- GEQ++tryGeqKThan :: Ctxt -> Type -> Nat' -> Match Solved+tryGeqKThan _ _ Inf = return (SolvedIf [])+tryGeqKThan _ ty (Nat n) =+  do (a,b) <- aMul ty+     m     <- aNat' a+     return $ SolvedIf+            $ case m of+                Inf   -> [ b =#= tZero ]+                Nat 0 -> []+                Nat k -> [ tNum (div n k) >== b ]++tryGeqThanK :: Ctxt -> Type -> Nat' -> Match Solved+tryGeqThanK _ t Inf = return (SolvedIf [ t =#= tInf ])+tryGeqThanK _ t (Nat k) =+  do (a,b) <- anAdd t+     n     <- aNat a+     return $ SolvedIf $ if n >= k+                            then []+                            else [ b >== tNum (k - n) ]++++tryGeqThanSub :: Ctxt -> Type -> Type -> Match Solved+tryGeqThanSub _ x y =+  do (a,_) <- (|-|) y+     guard (x == a)+     return (SolvedIf [])++tryGeqThanVar :: Ctxt -> Type -> TVar -> Match Solved+tryGeqThanVar _ctxt ty x =+  do (a,b) <- anAdd ty+     let check y = do x' <- aTVar y+                      guard (x == x')+                      return (SolvedIf [])+     check a <|> check b++geqByInterval :: Ctxt -> Type -> Type -> Match Solved+geqByInterval ctxt x y =+  let ix = typeInterval ctxt x+      iy = typeInterval ctxt y+  in case (iLower ix, iUpper iy) of+       (l,Just n) | l >= n -> return (SolvedIf [])+       _                   -> mzero+++tryMinIsGeq :: Type -> Type -> Match Solved+tryMinIsGeq t1 t2 =+  do (a,b) <- aMin t1+     k1    <- aNat a+     k2    <- aNat t2+     return $ if k1 >= k2+               then SolvedIf [ b >== t2 ]+               else Unsolvable $ TCErrorMessage $+                      show k1 ++ " can't be greater than " ++ show k2++--------------------------------------------------------------------------------+++-- min a b = a ~> a <= b+tryEqMin :: Type -> Type -> Match Solved+tryEqMin x y =+  do (a,b) <- aMin x+     let check m1 m2 = do guard (m1 == y)+                          return $ SolvedIf [ m2 >== m1 ]+     check a b <|> check b a+++tryEqVar :: Type -> TVar -> Match Solved+tryEqVar ty x =++  -- x = K + x --> x = inf+  (do (k,tv) <- matches ty (anAdd, aNat, aTVar)+      guard (tv == x && k >= 1)++      return $ SolvedIf [ TVar x =#= tInf ]+  )+  <|>++  -- x = min (K + x) y --> x = y+  (do (l,r) <- aMin ty+      let check this other =+            do (k,x') <- matches this (anAdd, aNat', aTVar)+               guard (x == x' && k >= Nat 1)+               return $ SolvedIf [ TVar x =#= other ]+      check l r <|> check r l+  )+  <|>+  -- x = K + min a x+  (do (k,(l,r)) <- matches ty (anAdd, aNat, aMin)+      guard (k >= 1)+      let check a b = do x' <- aTVar a+                         guard (x' == x)+                         return (SolvedIf [ TVar x =#= tAdd (tNum k) b ])+      check l r <|> check r l+  )++++++++-- e.g., 10 = t+tryEqK :: Ctxt -> Type -> Nat' -> Match Solved+tryEqK ctxt ty lk =+  do guard (lk == Inf)+     (a,b) <- anAdd ty+     let check x y = do guard (iIsFin (typeInterval ctxt x))+                        return $ SolvedIf [ y =#= tInf ]+     check a b <|> check b a+  <|>+  do (rk, b) <- matches ty (anAdd, aNat', __)+     return $+       case nSub lk rk of+         -- NOTE: (Inf - Inf) shouldn't be possible+         Nothing -> Unsolvable+                      $ TCErrorMessage+                      $ "Adding " ++ show rk ++ " will always exceed "+                                  ++ show lk++         Just r -> SolvedIf [ b =#= tNat' r ]+  <|>+  do (rk, b) <- matches ty (aMul, aNat', __)+     return $+       case (lk,rk) of+         (Inf,Inf)    -> SolvedIf [ b >== tOne ]+         (Inf,Nat _)  -> SolvedIf [ b =#= tInf ]+         (Nat 0, Inf) -> SolvedIf [ b =#= tZero ]+         (Nat k, Inf) -> Unsolvable+                       $ TCErrorMessage+                       $ show k ++ " /= inf * anything"+         (Nat lk', Nat rk')+           | rk' == 0 -> SolvedIf [ tNat' lk =#= tZero ]+              -- shouldn't happen, as `0 * x = x`+           | (q,0) <- divMod lk' rk' -> SolvedIf [ b =#= tNum q ]+           | otherwise ->+               Unsolvable+             $ TCErrorMessage+             $ show lk ++ " /= " ++ show rk ++ " * anything"++  -- XXX: Min, Max, etx+  -- 2  = min (10,y)  --> y = 2+  -- 2  = min (2,y)   --> y >= 2+  -- 10 = min (2,y)   --> impossible++++tryEqMulConst :: Type -> Type -> Match Solved+tryEqMulConst l r =+  do (l1,l2) <- aMul l+     (r1,r2) <- aMul r++     asum [ do l1' <- aNat l1+               r1' <- aNat r1+               return (build l1' l2 r1' r2)++          , do l2' <- aNat l2+               r1' <- aNat r1+               return (build l2' l1 r1' r2)++          , do l1' <- aNat l1+               r2' <- aNat r2+               return (build l1' l2 r2' r1)++          , do l2' <- aNat l2+               r2' <- aNat r2+               return (build l2' l1 r2' r1)++          ]++  where++  build lk l' rk r' =+    let d   = gcd lk rk+        lk' = lk `div` d+        rk' = rk `div` d+    in if d == 1+          then Unsolved+          else (SolvedIf [ tMul (tNum lk') l' =#= tMul (tNum rk') r' ])+++tryEqAddInf :: Ctxt -> Type -> Type -> Match Solved+tryEqAddInf ctxt l r = check l r <|> check r l+  where++  -- check for x = a + b /\ x = inf+  check x y =+    do (x1,x2) <- anAdd x+       aInf y++       let x1Fin = iIsFin (typeInterval ctxt x1)+       let x2Fin = iIsFin (typeInterval ctxt x2)++       return $!+         if | x1Fin ->+              SolvedIf [ x2 =#= y ]++            | x2Fin ->+              SolvedIf [ x1 =#= y ]++            | otherwise ->+              Unsolved++++-- | Check for addition of constants to both sides of a relation.+--+-- This relies on the fact that constants are floated left during+-- simplification.+tryAddConst :: (Type -> Type -> Prop) -> Type -> Type -> Match Solved+tryAddConst rel l r =+  do (x1,x2) <- anAdd l+     (y1,y2) <- anAdd r++     k1 <- aNat x1+     k2 <- aNat y1++     if k1 > k2+        then return (SolvedIf [ tAdd (tNum (k1 - k2)) x2 `rel` y2 ])+        else return (SolvedIf [ x2 `rel` tAdd (tNum (k2 - k1)) y2 ])
src/Cryptol/TypeCheck/Solver/Numeric/Fin.hs view
@@ -12,80 +12,85 @@ module Cryptol.TypeCheck.Solver.Numeric.Fin where  import Data.Map (Map)+import qualified Data.Map as Map -import Cryptol.TypeCheck.AST-import Cryptol.TypeCheck.InferTypes+import Cryptol.TypeCheck.Type+import Cryptol.TypeCheck.Solver.Types import Cryptol.TypeCheck.Solver.Numeric.Interval import Cryptol.TypeCheck.Solver.InfNat  -cryIsFin :: Map TVar Interval -> Goal -> Solved-cryIsFin varInfo g =-  case pIsFin (goal g) of-    Just ty -> cryIsFinType varInfo g ty+cryIsFin :: Map TVar Interval -> Prop -> Solved+cryIsFin varInfo p =+  case pIsFin p of+    Just ty -> cryIsFinType varInfo ty     Nothing -> Unsolved -cryIsFinType :: Map TVar Interval -> Goal -> Type -> Solved-cryIsFinType varInfo g ty =+cryIsFinType :: Map TVar Interval -> Type -> Solved+cryIsFinType varInfo ty =   case tNoUser ty of -    TCon (TC tc) [] | TCNum _ <- tc -> solved []+    TVar x | Just i <- Map.lookup x varInfo+           , iIsFin i -> SolvedIf [] +    TCon (TC tc) []+      | TCNum _ <- tc -> SolvedIf []+      | TCInf   <- tc ->+        Unsolvable $ TCErrorMessage "Expected a finite type, but found `inf`."+     TCon (TF f) ts ->       case (f,ts) of-        (TCAdd,[t1,t2]) -> solved [ pFin t1, pFin t2 ]-        (TCSub,[t1,_ ]) -> solved [ pFin t1 ]+        (TCAdd,[t1,t2]) -> SolvedIf [ pFin t1, pFin t2 ]+        (TCSub,[t1,_ ]) -> SolvedIf [ pFin t1 ]          -- fin (x * y)         (TCMul,[t1,t2])-          | iLower i1 >= Nat 1 && iIsFin i1 -> solved [ pFin t2 ]-          | iLower i2 >= Nat 1 && iIsFin i2 -> solved [ pFin t1 ]+          | iLower i1 >= Nat 1 && iIsFin i1 -> SolvedIf [ pFin t2 ]+          | iLower i2 >= Nat 1 && iIsFin i2 -> SolvedIf [ pFin t1 ]            | iLower i1 >= Nat 1 &&-            iLower i2 >= Nat 1 -> solved [ pFin t1, pFin t2 ]+            iLower i2 >= Nat 1 -> SolvedIf [ pFin t1, pFin t2 ] -          | iIsFin i1 && iIsFin i2 -> solved []+          | iIsFin i1 && iIsFin i2 -> SolvedIf []           where           i1 = typeInterval varInfo t1           i2 = typeInterval varInfo t2  -        (TCDiv, [t1,_])  -> solved [ pFin t1 ]-        (TCMod, [_,_])   -> solved []+        (TCDiv, [t1,_])  -> SolvedIf [ pFin t1 ]+        (TCMod, [_,_])   -> SolvedIf []          -- fin (x ^ y)         (TCExp, [t1,t2])-          | iLower i1 == Inf   -> solved [ t2 =#= tZero ]-          | iLower i2 == Inf   -> solved [ tOne >== t1 ]+          | iLower i1 == Inf   -> SolvedIf [ t2 =#= tZero ]+          | iLower i2 == Inf   -> SolvedIf [ tOne >== t1 ] -          | iLower i1 >= Nat 2 -> solved [ pFin t1, pFin t2 ]-          | iLower i2 >= Nat 1 -> solved [ pFin t1, pFin t2 ]+          | iLower i1 >= Nat 2 -> SolvedIf [ pFin t1, pFin t2 ]+          | iLower i2 >= Nat 1 -> SolvedIf [ pFin t1, pFin t2 ] -          | Just x <- iUpper i1, x <= Nat 1 -> solved []-          | Just (Nat 0) <- iUpper i2       -> solved []+          | Just x <- iUpper i1, x <= Nat 1 -> SolvedIf []+          | Just (Nat 0) <- iUpper i2       -> SolvedIf []           where           i1 = typeInterval varInfo t1           i2 = typeInterval varInfo t2          -- fin (min x y)         (TCMin, [t1,t2])-          | iIsFin i1  -> solved []-          | iIsFin i2  -> solved []-          | Just x <- iUpper i1, x <= iLower i2 -> solved [ pFin t1 ]-          | Just x <- iUpper i2, x <= iLower i1 -> solved [ pFin t2 ]+          | iIsFin i1  -> SolvedIf []+          | iIsFin i2  -> SolvedIf []+          | Just x <- iUpper i1, x <= iLower i2 -> SolvedIf [ pFin t1 ]+          | Just x <- iUpper i2, x <= iLower i1 -> SolvedIf [ pFin t2 ]           where           i1 = typeInterval varInfo t1           i2 = typeInterval varInfo t2 -        (TCMax, [t1,t2])          -> solved [ pFin t1, pFin t2 ]-        (TCWidth, [t1])           -> solved [ pFin t1 ]-        (TCLenFromThen,[_,_,_])   -> solved []-        (TCLenFromThenTo,[_,_,_]) -> solved []+        (TCMax, [t1,t2])          -> SolvedIf [ pFin t1, pFin t2 ]+        (TCWidth, [t1])           -> SolvedIf [ pFin t1 ]+        (TCLenFromThen,[_,_,_])   -> SolvedIf []+        (TCLenFromThenTo,[_,_,_]) -> SolvedIf []          _ -> Unsolved      _ -> Unsolved  -  where-  solved ps = Solved Nothing [ g { goal = p } | p <- ps ]
src/Cryptol/TypeCheck/Solver/Numeric/ImportExport.hs view
@@ -20,6 +20,7 @@  import           Cryptol.TypeCheck.Solver.Numeric.AST import qualified Cryptol.TypeCheck.AST as Cry+import qualified Cryptol.TypeCheck.SimpType as SCry import           MonadLib  exportProp :: Cry.Prop -> Maybe Prop@@ -59,6 +60,8 @@     Cry.TVar x      -> return $ Var $ UserName x     Cry.TCon tc ts  ->       case tc of+        Cry.TError {} -> raise ()+         Cry.TC Cry.TCInf     -> return (K Inf)         Cry.TC (Cry.TCNum x) -> return (K (Nat x))         Cry.TC _             -> raise ()@@ -140,31 +143,29 @@       K n                 -> case n of                                Nat x -> Just (Cry.tNum x)                                Inf   -> Just (Cry.tInf)-      x :+ y              -> op2 Cry.TCAdd x y-      x :- y              -> op2 Cry.TCSub x y-      x :* y              -> op2 Cry.TCMul x y-      Div x y             -> op2 Cry.TCDiv x y-      Mod x y             -> op2 Cry.TCMod x y-      x :^^ y             -> op2 Cry.TCExp x y-      Min x y             -> op2 Cry.TCMin x y-      Max x y             -> op2 Cry.TCMax x y-      Width x             -> op1 Cry.TCWidth x-      LenFromThen   x y z -> op3 Cry.TCLenFromThen x y z-      LenFromThenTo x y z -> op3 Cry.TCLenFromThenTo x y z--  app f xs = Cry.TCon (Cry.TF f) xs+      x :+ y              -> op2 SCry.tAdd x y+      x :- y              -> op2 SCry.tSub x y+      x :* y              -> op2 SCry.tMul x y+      Div x y             -> op2 SCry.tDiv x y+      Mod x y             -> op2 SCry.tMod x y+      x :^^ y             -> op2 SCry.tExp x y+      Min x y             -> op2 SCry.tMin x y+      Max x y             -> op2 SCry.tMax x y+      Width x             -> op1 SCry.tWidth x+      LenFromThen   x y z -> op3 SCry.tLenFromThen x y z+      LenFromThenTo x y z -> op3 SCry.tLenFromThenTo x y z    op1 f x =     do t <- go x-       return (app f [t])+       return (f t)    op2 f x y =     do t1 <- go x        t2 <- go y-       return (app f [t1,t2])+       return (f t1 t2)    op3 f x y z =     do t1 <- go x        t2 <- go y        t3 <- go z-       return (app f [t1,t2,t3])+       return (f t1 t2 t3)
src/Cryptol/TypeCheck/Solver/Numeric/Interval.hs view
@@ -81,20 +81,22 @@     | otherwise = NewIntervals is    go !n new   is (p:ps) =-    case foldr (update is) NoChange (propInterval is p) of+    case add False (propInterval is p) is of       InvalidInterval i -> InvalidInterval i       NewIntervals is'  -> go n True is' ps       NoChange          -> go n new  is  ps +  add ch [] int = if ch then NewIntervals int else NoChange+  add ch (i:is) int = case updateInterval i int of+                        InvalidInterval j -> InvalidInterval j+                        NoChange          -> add ch is int+                        NewIntervals is'  -> add True is is'+   changed a x = case x of                   NoChange -> NewIntervals a                   r        -> r -  update is0 int NoChange            = updateInterval int is0-  update _   _   (InvalidInterval i) = InvalidInterval i-  update _   int (NewIntervals is)   = changed is (updateInterval int is) - -- | What we learn about variables from a single prop. propInterval :: Map TVar Interval -> Prop -> [(TVar,Interval)] propInterval varInts prop = catMaybes@@ -119,7 +121,21 @@        x     <- tIsVar r        let int = typeInterval varInts l        return (x,int { iLower = Nat 0 })++    -- k >= width x+  , do (l,r) <- pIsGeq prop+       x     <- tIsVar =<< pIsWidth r+           -- record the exact upper bound when it produces values within 128+           -- bits+       let ub = case iIsExact (typeInterval varInts l) of+                  Just (Nat val) | val < 128 -> Just (Nat (2 ^ val - 1))+                                 | otherwise -> Nothing+                  upper                      -> upper++       return (x, Interval { iLower = Nat 0, iUpper = ub })+   ]+  -------------------------------------------------------------------------------- 
src/Cryptol/TypeCheck/Solver/Numeric/Simplify.hs view
@@ -210,7 +210,7 @@     (Not (Fin (Var _)), _)                 -> LT     (_, Not (Fin (Var _)))                 -> GT -    -- Next come defintions: `x = e` (with `x` not in `fvs e`)+    -- Next come definitions: `x = e` (with `x` not in `fvs e`)     -- XXX: Inefficient, because we keep recomputing free variables     -- (here, and then when actually applying the substitution)     _ | Just (x,_) <- mbL
− src/Cryptol/TypeCheck/Solver/Numeric/Simplify1.hs
@@ -1,511 +0,0 @@--- |--- Module      :  $Header$--- Copyright   :  (c) 2015-2016 Galois, Inc.--- License     :  BSD3--- Maintainer  :  cryptol@galois.com--- Stability   :  provisional--- Portability :  portable------ Simplification.--- The rules in this module are all conditional on the expressions being--- well-defined.------ So, for example, consider the formula `P`, which corresponds to `fin e`.--- `P` says the following:------     if e is well-formed, then will evaluate to a finite natural number.------ More concretely, consider `fin (3 - 5)`.  This will be simplified to `True`,--- which does not mean that `3 - 5` is actually finite.--{-# LANGUAGE Safe, PatternGuards, BangPatterns #-}-{-# LANGUAGE TypeSynonymInstances, FlexibleInstances #-}--module Cryptol.TypeCheck.Solver.Numeric.Simplify1 (propToProp', ppProp') where--import           Cryptol.TypeCheck.Solver.Numeric.SimplifyExpr-                   (crySimpExpr, splitSum, normSum, Sign(..))-import           Cryptol.TypeCheck.Solver.Numeric.AST-import           Cryptol.TypeCheck.Solver.InfNat(genLog,rootExact)-import           Cryptol.Utils.Misc ( anyJust )-import           Cryptol.Utils.Panic-import           Cryptol.Utils.PP--import           Control.Monad ( liftM2 )-import           Data.Maybe ( fromMaybe )-import qualified Data.Map as Map-import           Data.Either(partitionEithers)----data Atom = AFin Name-          | AGt Expr Expr   -- on naturals-          | AEq Expr Expr   -- on naturals-            deriving Eq--type I    = IfExpr' Atom----- tmp-propToProp' :: Prop -> I Bool-propToProp' prop =-  case prop of-    Fin e     -> pFin e-    x :== y   -> pEq x y-    x :>= y   -> pGeq x y-    x :>  y   -> pGt  x y-    x :>: y   -> pAnd (pFin x) (pAnd (pFin y) (pGt x y))-    x :==: y  -> pAnd (pFin x) (pAnd (pFin y) (pEq x y))-    p :&& q   -> pAnd (propToProp' p) (propToProp' q)-    p :|| q   -> pOr  (propToProp' p) (propToProp' q)-    Not p     -> pNot (propToProp' p)-    PFalse    -> pFalse-    PTrue     -> pTrue---instance (Eq a, HasVars a) => HasVars (I a) where-  apSubst su prop =-    case prop of-      Impossible -> Nothing-      Return _   -> Nothing-      If a t e   ->-        case apSubstAtom su a of-          Nothing -> do [x,y] <- branches-                        return (If a x y)-          Just a' -> Just $ fromMaybe (pIf a' t e)-                          $ do [x,y] <- branches-                               return (pIf a' x y)--        where branches = anyJust (apSubst su) [t,e]---- | Apply a substituition to an atom-apSubstAtom :: Subst -> Atom -> Maybe (I Bool)-apSubstAtom su atom =-  case atom of-    AFin x    -> do e <- Map.lookup x su-                    return (pFin e)-    AEq e1 e2 -> do [x,y] <- anyJust (apSubst su) [e1,e2]-                    return (pEq x y)-    AGt e1 e2 -> do [x,y] <- anyJust (apSubst su) [e1,e2]-                    return (pGt x y)---{- TODO: Unused--- | The various way in which the given proposition may be true.--- The Boolean indicates if the atom is +ve:--- 'True' for positive, 'False' for -ve.-truePaths :: I Bool -> [ [(Bool,Atom)] ]-truePaths prop =-  case prop of-    Impossible    -> []-    Return False  -> []-    Return True   -> [ [] ]-    If a t e      -> map ((True,a):)  (truePaths t) ++-                     map ((False,a):) (truePaths e)--}-------------------------------------------------------------------------------------- Pretty print--ppAtom :: Atom -> Doc-ppAtom atom =-  case atom of-    AFin x  -> text "fin" <+> ppName x-    AGt x y -> ppExpr x <+> text ">" <+> ppExpr y-    AEq x y -> ppExpr x <+> text "=" <+> ppExpr y--ppProp' :: I Bool -> Doc-ppProp' = ppIf ppAtom (text . show)------------------------------------------------------------------------------------- General logic stuff---- | False-pFalse :: I Bool-pFalse = Return False---- | True-pTrue :: I Bool-pTrue = Return True---- | Negation-pNot :: I Bool -> I Bool-pNot p =-  case p of-    Impossible -> Impossible-    Return a   -> Return (not a)-    If c t e   -> If c (pNot t) (pNot e)---- | And-pAnd :: I Bool -> I Bool -> I Bool-pAnd p q = pIf p q pFalse---- | Or-pOr :: I Bool -> I Bool -> I Bool-pOr p q = pIf p pTrue q---mkIf :: (Eq a, HasVars a) => Atom -> I a -> I a -> I a-mkIf a t e-  | t == e    = t-  | otherwise = case a of-                  AFin x -> If a (pKnownFin x t) (pKnownInf x e)-                  _ | If b@(AFin y) _ _ <- t -> If b (mkFinIf y) (mkInfIf y)-                    | If b@(AFin y) _ _ <- e -> If b (mkFinIf y) (mkInfIf y)--                  AEq x' y'-                    | x == y    -> t-                    | otherwise -> If (AEq x y) t e-                    where (x,y) = balanceEq x' y'---                  _      -> If a t e--  where-  mkFinIf y = mkIf a (pKnownFin y t) (pKnownFin y e)-  mkInfIf y = case apSubstAtom (Map.singleton y (K Inf)) a of-                Nothing -> mkIf a (pKnownInf y t) (pKnownInf y t)-                Just a' -> pIf a' (pKnownInf y t) (pKnownInf y t)----- | If-then-else with non-atom at decision.-pIf :: (Eq a, HasVars a) => I Bool -> I a -> I a -> I a-pIf c t e =-  case c of-    Impossible    -> Impossible-    Return True   -> t-    Return False  -> e-    If p t1 e1-      | t2 == e2  -> t2-      | otherwise -> mkIf p t2 e2-      where-      t2 = pIf t1 t e-      e2 = pIf e1 t e---- | Atoms to propositions.-pAtom :: Atom -> I Bool-pAtom p = do a <- case p of-                    AFin _  -> return p-                    AEq x y -> bin AEq x y-                    AGt x y -> bin AGt x y-             If a pTrue pFalse-  where-  prep x    = do y <- eNoInf x-                 case y of-                   K Inf -> Impossible-                   _     -> return (crySimpExpr y)-  bin f x y = liftM2 f (prep x) (prep y)---------------------------------------------------------------------------------------- Implementation of Cryptol constraints---- | Implementation of `==`-pEq :: Expr -> Expr -> I Bool-pEq x (K (Nat n)) = pIsNat n x-pEq (K (Nat n)) y = pIsNat n y-pEq x y = pIf (pInf x) (pInf y) (pAnd (pFin y) (pAtom (AEq x y)))---- | Implementation of `>=`-pGeq :: Expr -> Expr -> I Bool-pGeq x y = pIf (pInf x) pTrue (pAnd (pFin y) (pAtom (AGt (one :+ x) y)))---- | Implementation `e1 > e2`.-pGt :: Expr -> Expr -> I Bool-pGt x y = pNot (pGeq y x)------ | Implementation of `Fin`-pFin :: Expr -> I Bool-pFin expr =-  case expr of-    K Inf                -> pFalse-    K (Nat _)            -> pTrue-    Var x                -> pAtom (AFin x)-    t1 :+ t2             -> pAnd (pFin t1) (pFin t2)-    t1 :- _              -> pFin t1-    t1 :* t2             -> pIf (pInf t1) (pEq t2 zero)-                          $ pIf (pInf t2) (pEq t1 zero)-                          $ pTrue--    Div t1 _             -> pFin t1-    Mod _ _              -> pTrue--    t1 :^^ t2            -> pIf (pInf t1) (pEq t2 zero)-                          $ pIf (pInf t2) (pOr (pEq t1 zero) (pEq t1 one))-                          $ pTrue---    Min t1 t2            -> pOr (pFin t1) (pFin t2)-    Max t1 t2            -> pAnd (pFin t1) (pFin t2)-    Width t1             -> pFin t1-    LenFromThen  _ _ _   -> pTrue-    LenFromThenTo  _ _ _ -> pTrue---- | Implementation of `e == inf`-pInf :: Expr -> I Bool-pInf = pNot . pFin--pIsNat :: Integer -> Expr -> I Bool-pIsNat n expr =-  case expr of-    K Inf               -> pFalse-    K (Nat m)           -> if m == n then pTrue else pFalse-    Var _               -> nothing--    K (Nat m) :+ e2     -> if n < m then pFalse-                                    else pIsNat (n - m) e2-    x :+ y-      | n == 0          -> pAnd (pIsNat 0 x) (pIsNat 0 y)-      | n == 1          -> pOr  (pAnd (pIsNat 0 x) (pIsNat 1 y))-                                (pAnd (pIsNat 1 x) (pIsNat 0 y))-      | otherwise       -> nothing--    e1 :- e2            -> pEq (K (Nat n) :+ e1) e2--    K (Nat m) :* e2     ->-      if m == 0-        then if n == 0 then pTrue else pFalse-        else case divMod n m of-                    (q,r) -> if r == 0 then pIsNat q e2-                                       else pFalse-    e1 :* e2-      | n == 0          -> pOr  (pIsNat 0 e1) (pIsNat 0 e2)-      | n == 1          -> pAnd (pIsNat 1 e1) (pIsNat 1 e2)-      | otherwise       -> nothing--    -- (x >= n * y) /\ ((n+1) * y > x)-    Div x y             -> pAnd (pGt (one :+ x) (K (Nat n) :* y))-                                (pGt (K (Nat (n + 1)) :* y) x)---    Mod _ _             -> nothing--    K (Nat m) :^^ y     -> case genLog n m of-                             Just (a, exact) | exact -> pIsNat a y-                             _                       -> pFalse-    x :^^ K (Nat m)     -> case rootExact n m of-                             Just a  -> pIsNat a x-                             Nothing -> pFalse-    x :^^ y-      | n == 0          -> pAnd (pIsNat 0 x) (pGt y zero)-      | n == 1          -> pOr  (pIsNat 1 x) (pIsNat 0 y)-      | otherwise       -> nothing--    Min x y-      | n == 0          -> pOr (pIsNat 0 x) (pIsNat 0 y)-      | otherwise       -> pOr (pAnd (pIsNat n x) (pGt y (K (Nat (n - 1)))))-                               (pAnd (pIsNat n y) (pGt x (K (Nat (n - 1)))))--    Max x y             -> pOr (pAnd (pIsNat n x) (pGt (K (Nat (n + 1))) y))-                               (pAnd (pIsNat n y) (pGt (K (Nat (n + 1))) y))---    Width x-      | n == 0          -> pIsNat 0 x-      | otherwise       -> pAnd (pGt x (K (Nat (2^(n-1) - 1))))-                                (pGt (K (Nat (2 ^ n))) x)--    x                   ->-      panic "Cryptol.TypeCheck.Solver.Numeric.Simplify1.pIsNat"-        [ "unexpected expression ", show x ]-{--    LenFromThen x y w-      | n == 0          -> Just PFalse--      -- See Note [Sequences of Length 1] in 'Cryptol.TypeCheck.Solver.InfNat'-      | n == 1          -> Just (gt y x :&& gt (y :+ one) (two :^^ w))-      | otherwise       -> Nothing -- XXX: maybe some more?---    -- See `nLenFromThenTo` in 'Cryptol.TypeCheck.Solver.InfNat'-    LenFromThenTo x y z-      | n == 0          -> Just ( gt x y :&& gt z x-                              :|| gt y x :&& gt x z-                                )--      -- See Note [Sequences of Length 1] in 'Cryptol.TypeCheck.Solver.InfNat'-      | n == 1          -> Just (gt z y :&& gt (x :+ one) z     :||-                                 gt y z :&& gt (z :+ one) x)-      | otherwise       -> Nothing -- XXX: maybe some more?----}-  where-  nothing = pAnd (pFin expr) (pAtom (AEq expr (K (Nat n))))---_pIsGtThanNat :: Integer -> Expr -> I Bool-_pIsGtThanNat = undefined--_pNatIsGtThan :: Integer -> Expr -> I Bool-_pNatIsGtThan = undefined------------------------------------------------------------------------------------pKnownFin :: (HasVars a, Eq a) => Name -> I a -> I a-pKnownFin x prop =-  case prop of-    If (AFin y) t _-      | x == y  -> pKnownFin x t-    If p t e    -> mkIf p (pKnownFin x t) (pKnownFin x e)-    _ -> prop--pKnownInf :: (Eq a, HasVars a) => Name -> I a -> I a-pKnownInf x prop = fromMaybe prop (apSubst (Map.singleton x (K Inf)) prop)--------- Cancel constants--- If the original equation was valid, it continues to be valid.-balanceEq :: Expr -> Expr -> (Expr, Expr)-balanceEq (K (Nat a) :+ e1) (K (Nat b) :+ e2)-  | a >= b    = balanceEq e2 (K (Nat (a - b)) :+ e1)-  | otherwise = balanceEq e1 (K (Nat (b - a)) :+ e2)---- Move subtraction to the other side.--- If the original equation was valid, this will continue to be valid.-balanceEq e1 e2-  | not (null neg_es1 && null neg_es2) = balanceEq (mk neg_es2 pos_es1)-                                                   (mk neg_es1 pos_es2)--  where-  (pos_es1, neg_es1)  = partitionEithers (map classify (splitSum e1))-  (pos_es2, neg_es2)  = partitionEithers (map classify (splitSum e2))--  classify (sign,e)   = case sign of-                          Pos -> Left e-                          Neg -> Right e--  mk as bs = normSum (foldr (:+) zero (as ++ bs))---- fallback-balanceEq x y = (x,y)----{- TODO: unused-balanceGt (K (Nat a) :+ e1) (K (Nat b) :+ e2)-  | a >= b    = balanceGt (K (Nat (a - b)) :+ e1) e2-  | otherwise = balanceGt e1                      (K (Nat (b - a)) :+ e2)--}------------------------------------------------------------------------------------------ | Eliminate `inf`, except at the top level.-eNoInf :: Expr -> I Expr-eNoInf expr =-  case expr of--    -- These are the interesting cases where we have to branch--    x :* y ->-      do x' <- eNoInf x-         y' <- eNoInf y-         case (x', y') of-           (K Inf, K Inf) -> return inf-           (K Inf, _)     -> pIf (pEq y' zero) (return zero) (return inf)-           (_, K Inf)     -> pIf (pEq x' zero) (return zero) (return inf)-           _              -> return (x' :* y')--    x :^^ y ->-      do x' <- eNoInf x-         y' <- eNoInf y-         case (x', y') of-           (K Inf, K Inf) -> return inf-           (K Inf, _)     -> pIf (pEq y' zero) (return one) (return inf)-           (_, K Inf)     -> pIf (pEq x' zero) (return zero)-                           $ pIf (pEq x' one)  (return one)-                           $ return inf-           _              -> return (x' :^^ y')---    -- The rest just propagates--    K _     -> return expr-    Var _   -> return expr--    x :+ y  ->-      do x' <- eNoInf x-         y' <- eNoInf y-         case (x', y') of-           (K Inf, _)  -> return inf-           (_, K Inf)  -> return inf-           _           -> return (x' :+ y')--    x :- y  ->-      do x' <- eNoInf x-         y' <- eNoInf y-         case (x', y') of-           (_, K Inf)  -> Impossible-           (K Inf, _)  -> return inf-           _           -> return (x' :- y')--    Div x y ->-      do x' <- eNoInf x-         y' <- eNoInf y-         case (x', y') of-           (K Inf, _) -> Impossible-           (_, K Inf) -> return zero-           _          -> return (Div x' y')--    Mod x y ->-      do x' <- eNoInf x-         -- `Mod x y` is finite, even if `y` is `inf`, so first check-         -- for finiteness.-         pIf (pFin y)-              (do y' <- eNoInf y-                  case (x',y') of-                    (K Inf, _) -> Impossible-                    (_, K Inf) -> Impossible-                    _          -> return (Mod x' y')-              )-              (return x')--    Min x y ->-      do x' <- eNoInf x-         y' <- eNoInf y-         case (x',y') of-           (K Inf, _) -> return y'-           (_, K Inf) -> return x'-           _          -> return (Min x' y')--    Max x y ->-      do x' <- eNoInf x-         y' <- eNoInf y-         case (x', y') of-           (K Inf, _) -> return inf-           (_, K Inf) -> return inf-           _          -> return (Max x' y')--    Width x ->-      do x' <- eNoInf x-         case x' of-           K Inf      -> return inf-           _          -> return (Width x')--    LenFromThen x y w   -> fun3 LenFromThen x y w-    LenFromThenTo x y z -> fun3 LenFromThenTo x y z---  where-  fun3 f x y z =-    do x' <- eNoInf x-       y' <- eNoInf y-       z' <- eNoInf z-       case (x',y',z') of-         (K Inf, _, _) -> Impossible-         (_, K Inf, _) -> Impossible-         (_, _, K Inf) -> Impossible-         _             -> return (f x' y' z')
+ src/Cryptol/TypeCheck/Solver/SMT.hs view
@@ -0,0 +1,171 @@+{-# Language FlexibleInstances #-}+module Cryptol.TypeCheck.Solver.SMT (proveImp,checkUnsolvable) where++import           SimpleSMT (SExpr)+import qualified SimpleSMT as SMT+import           Data.Map ( Map )+import qualified Data.Map as Map+import qualified Data.Set as Set+import           Data.Maybe(catMaybes)+import           Data.List(partition)+import           Control.Monad(msum,zipWithM)++import Cryptol.TypeCheck.Type+import Cryptol.TypeCheck.Solver.CrySAT+import Cryptol.TypeCheck.InferTypes+import Cryptol.TypeCheck.TypePat hiding ((~>),(~~>))+import Cryptol.Utils.Panic+++-- | Returns goals that were not proved+proveImp :: Solver -> [Prop] -> [Goal] -> IO [Goal]+proveImp sol ps gs0 =+  debugBlock sol "PROVE IMP" $+  do let s = rawSolver sol+     let (gs,rest) = partition (isNumeric . goal) gs0+         numAsmp   = filter isNumeric ps+         vs        = Set.toList (fvs (numAsmp, map goal gs))+     tvs <- debugBlock sol "VARIABLES" $+       do SMT.push s+          Map.fromList <$> zipWithM (declareVar s) [ 0 .. ] vs+     debugBlock sol "ASSUMPTIONS" $+       mapM_ (assume s tvs) numAsmp+     gs' <- mapM (prove sol tvs) gs+     SMT.pop s+     return (catMaybes gs' ++ rest)++-- | Check if the given goals are known to be unsolvable.+checkUnsolvable :: Solver -> [Goal] -> IO Bool+checkUnsolvable sol gs0 =+  debugBlock sol "CHECK UNSOLVABLE" $+  do let s  = rawSolver sol+         ps = filter isNumeric (map goal gs0)+         vs = Set.toList (fvs ps)+     tvs <- debugBlock sol "VARIABLES" $+       do SMT.push s+          Map.fromList <$> zipWithM (declareVar s) [ 0 .. ] vs+     ans <- unsolvable sol tvs ps+     SMT.pop s+     return ans++--------------------------------------------------------------------------------++declareVar :: SMT.Solver -> Int -> TVar -> IO (TVar, SExpr)+declareVar s x v = do let name = (if isFreeTV v then "fv" else "kv") ++ show x+                      e <- SMT.declare s name cryInfNat+                      SMT.assert s (SMT.fun "cryVar" [ e ])+                      return (v,e)++assume :: SMT.Solver -> TVars -> Prop -> IO ()+assume s tvs p = SMT.assert s (SMT.fun "cryAssume" [ toSMT tvs p ])++prove :: Solver -> TVars -> Goal -> IO (Maybe Goal)+prove sol tvs g =+  debugBlock sol "PROVE" $+  do let s = rawSolver sol+     SMT.push s+     SMT.assert s (SMT.fun "cryProve" [ toSMT tvs (goal g) ])+     res <- SMT.check s+     SMT.pop s+     case res of+       SMT.Unsat -> return Nothing+       _         -> return (Just g)+++-- | Check if some numeric goals are known to be unsolvable.+unsolvable :: Solver -> TVars -> [Prop] -> IO Bool+unsolvable sol tvs ps =+  debugBlock sol "UNSOLVABLE" $+  do let s = rawSolver sol+     SMT.push s+     mapM_ (assume s tvs) ps+     res <- SMT.check s+     SMT.pop s+     case res of+       SMT.Unsat -> return True+       _         -> return False++++--------------------------------------------------------------------------------++isNumeric :: Prop -> Bool+isNumeric ty = matchDefault False+             $ msum [ is (|=|), is (|>=|), is aFin, is aTrue, andNum ty ]+  where+  andNum t = anAdd t >>= \(x,y) -> return (isNumeric x && isNumeric y)+  is f = f ty >> return True++--------------------------------------------------------------------------------++type TVars = Map TVar SExpr++cryInfNat :: SExpr+cryInfNat = SMT.const "InfNat"+++toSMT :: TVars -> Type -> SExpr+toSMT tvs ty = matchDefault (panic "toSMT" [ "Unexpected type", show ty ])+  $ msum $ map (\f -> f tvs ty)+  [ aInf            ~> "cryInf"+  , aNat            ~> "cryNat"++  , aFin            ~> "cryFin"+  , (|=|)           ~> "cryEq"+  , (|>=|)          ~> "cryGeq"+  , aAnd            ~> "cryAnd"+  , aTrue           ~> "cryTrue"++  , anAdd           ~> "cryAdd"+  , (|-|)           ~> "crySub"+  , aMul            ~> "cryMul"+  , (|^|)           ~> "cryExp"+  , (|/|)           ~> "cryDiv"+  , (|%|)           ~> "cryMod"+  , aMin            ~> "cryMin"+  , aMax            ~> "cryMax"+  , aWidth          ~> "cryWidth"+  , aLenFromThen    ~> "cryLenFromThen"+  , aLenFromThenTo  ~> "cryLenFromThenTo"++  , anError KNum    ~> "cryErr"+  , anError KProp   ~> "cryErrProp"++  , aTVar           ~> "(unused)"+  ]++--------------------------------------------------------------------------------++(~>) :: Mk a => (Type -> Match a) -> String -> TVars -> Type -> Match SExpr+(m ~> f) tvs t = m t >>= \a -> return (mk tvs f a)++class Mk t where+  mk :: TVars -> String -> t -> SExpr++instance Mk () where+  mk _ f _ = SMT.const f++instance Mk Integer where+  mk _ f x = SMT.fun f [ SMT.int x ]++instance Mk TVar where+  mk tvs _ x = tvs Map.! x++instance Mk Type where+  mk tvs f x = SMT.fun f [toSMT tvs x]++instance Mk TCErrorMessage where+  mk _ f _ = SMT.fun f []++instance Mk (Type,Type) where+  mk tvs f (x,y) = SMT.fun f [ toSMT tvs x, toSMT tvs y]++instance Mk (Type,Type,Type) where+  mk tvs f (x,y,z) = SMT.fun f [ toSMT tvs x, toSMT tvs y, toSMT tvs z ]++--------------------------------------------------------------------------------+++++
src/Cryptol/TypeCheck/Solver/Selector.hs view
@@ -11,7 +11,7 @@ import Cryptol.TypeCheck.AST import Cryptol.TypeCheck.InferTypes import Cryptol.TypeCheck.Monad( InferM, unify, newGoals, lookupNewtype-                              , newType, applySubst, addHasGoal, solveHasGoal+                              , newType, applySubst, solveHasGoal                               ) import Cryptol.TypeCheck.Subst(listSubst,apSubst) import Cryptol.Utils.Ident (Ident)@@ -40,20 +40,17 @@      return (tSeq (tNum n) elems)  -improveSelector :: Selector -> Type -> InferM (Expr -> Expr)+improveSelector :: Selector -> Type -> InferM Bool improveSelector sel outerT =   case sel of     RecordSel _ mb -> cvt recordType mb     TupleSel  _ mb -> cvt tupleType  mb     ListSel   _ mb -> cvt listType   mb   where-  cvt _ Nothing   = return id+  cvt _ Nothing   = return False   cvt f (Just a)  = do ty <- f a-                       cs <- unify ty outerT-                       case cs of-                         [] -> return id-                         _  -> do newGoals CtExactType cs-                                  return (`ECast` ty)+                       newGoals CtExactType =<< unify ty outerT+                       return True   {- | Compute the type of a field based on the selector.@@ -96,11 +93,10 @@         _ -> return Nothing  ----    (ListSel n _, TCon (TC TCSeq) [l,t])  ->-       do newGoals CtSelector [ (l .+. tNum (1::Int)) >== tNum n ]+    (ListSel n _, TCon (TC TCSeq) [l,t])+      | n < 2 -> return (Just t)+      | otherwise ->+       do newGoals CtSelector [ l >== tNum (n - 1) ]           return (Just t)      _ -> return Nothing@@ -118,26 +114,26 @@   -- | Solve has-constraints.-tryHasGoal :: HasGoal -> InferM ()+tryHasGoal :: HasGoal -> InferM (Bool, Bool) -- ^ changes, solved tryHasGoal has   | TCon (PC (PHas sel)) [ th, ft ] <- goal (hasGoal has) =-    do outerCast <- improveSelector sel th+    do imped     <- improveSelector sel th        outerT    <- tNoUser `fmap` applySubst th        mbInnerT  <- solveSelector sel outerT        case mbInnerT of-         Nothing -> addHasGoal has+         Nothing -> return (imped, False)          Just innerT ->-           do cs <- unify innerT ft-              innerCast <- case cs of-                             [] -> return id-                             _  -> do newGoals CtExactType cs-                                      return (`ECast` ft)-              solveHasGoal (hasName has) (innerCast . (`ESel` sel) . outerCast)+           do newGoals CtExactType =<< unify innerT ft+              solveHasGoal (hasName has) (`ESel` sel)+              return (True, True)    | otherwise = panic "hasGoalSolved"                   [ "Unexpected selector proposition:"                   , show (hasGoal has)                   ]+++   
− src/Cryptol/TypeCheck/Solver/Simplify.hs
@@ -1,164 +0,0 @@--- |--- Module      :  $Header$--- Copyright   :  (c) 2015-2016 Galois, Inc.--- License     :  BSD3--- Maintainer  :  cryptol@galois.com--- Stability   :  provisional--- Portability :  portable--{-# LANGUAGE RecordWildCards #-}-{-# LANGUAGE MultiWayIf #-}--module Cryptol.TypeCheck.Solver.Simplify (-    tryRewritePropAsSubst-  ) where---import Cryptol.Prims.Syntax (TFun(..))-import Cryptol.TypeCheck.AST (Type(..),Prop,TVar,pIsEq,isFreeTV,TCon(..))-import Cryptol.TypeCheck.Solver.Numeric.Interval (Interval,iIsFin,typeInterval)-import Cryptol.TypeCheck.Subst (fvs)--import           Control.Monad (msum,guard,mzero)-import           Data.Function (on)-import           Data.List (sortBy)-import           Data.Maybe (catMaybes,listToMaybe)-import           Data.Map (Map)-import qualified Data.Set as Set----- | When given an equality constraint, attempt to rewrite it to the form `?x =--- ...`, by moving all occurrences of `?x` to the LHS, and any other variables--- to the RHS.  This will only work when there's only one unification variable--- present in the prop.-tryRewritePropAsSubst :: Map TVar Interval -> Prop -> Maybe (TVar,Type)-tryRewritePropAsSubst fins p =-  do (x,y) <- pIsEq p--     let vars = Set.toList (Set.filter isFreeTV (fvs p))--     listToMaybe $ sortBy (flip compare `on` rank)-                 $ catMaybes [ tryRewriteEq fins var x y | var <- vars ]----- | Rank a rewrite, favoring expressions that have fewer subtractions than--- additions.-rank :: (TVar,Type) -> Int-rank (_,ty) = go ty-  where--  go (TCon (TF TCAdd) ts) = sum (map go ts) + 1-  go (TCon (TF TCSub) ts) = sum (map go ts) - 1-  go (TCon (TF TCMul) ts) = sum (map go ts) + 1-  go (TCon (TF TCDiv) ts) = sum (map go ts) - 1-  go (TCon _          ts) = sum (map go ts)-  go _                    = 0----- | Rewrite an equation with respect to a unification variable ?x, into the--- form `?x = t`.  There are two interesting cases to consider (four with--- symmetry):------  * ?x = ty---  * expr containing ?x = expr------ In the first case, we just return the type variable and the type, but in the--- second we try to rewrite the equation until it's in the form of the first--- case.-tryRewriteEq :: Map TVar Interval -> TVar -> Type -> Type -> Maybe (TVar,Type)-tryRewriteEq fins uvar l r =-  msum [ do guard (uvarTy == l && uvar `Set.notMember` rfvs)-            return (uvar, r)--       , do guard (uvarTy == r && uvar `Set.notMember` lfvs)-            return (uvar, l)--       , do guard (uvar `Set.notMember` rfvs)-            ty <- rewriteLHS fins uvar l r-            return (uvar,ty)--       , do guard (uvar `Set.notMember` lfvs)-            ty <- rewriteLHS fins uvar r l-            return (uvar,ty)-       ]--  where--  uvarTy = TVar uvar--  lfvs   = fvs l-  rfvs   = fvs r----- | Check that a type contains only finite type variables.-allFin :: Map TVar Interval -> Type -> Bool-allFin ints ty = iIsFin (typeInterval ints ty)----- | Rewrite an equality until the LHS is just `uvar`. Return the rewritten RHS.------ There are a few interesting cases when rewriting the equality:------  A o B = R  when `uvar` is only present in A---  A o B = R  when `uvar` is only present in B------ In the first case, as we only consider addition and subtraction, the--- rewriting will continue on the left, after moving the `B` side to the RHS of--- the equation.  In the second case, if the operation is addition, the `A` side--- will be moved to the RHS, with rewriting continuing in `B`. However, in the--- case of subtraction, the `B` side is moved to the RHS, and rewriting--- continues on the RHS instead.------ In both cases, if the operation is addition, rewriting will only continue if--- the operand being moved to the RHS is known to be finite. If this check was--- not done, we would end up violating the well-definedness condition for--- subtraction (for a, b: well defined (a - b) iff fin b).-rewriteLHS :: Map TVar Interval -> TVar -> Type -> Type -> Maybe Type-rewriteLHS fins uvar = go-  where--  go (TVar tv) rhs | tv == uvar = return rhs--  go (TCon (TF tf) [x,y]) rhs =-    do let xfvs = fvs x-           yfvs = fvs y--           inX  = Set.member uvar xfvs-           inY  = Set.member uvar yfvs--       if | inX && inY -> mzero-          | inX        -> balanceR x tf y rhs-          | inY        -> balanceL x tf y rhs-          | otherwise  -> mzero---  -- discard type synonyms, the rewriting will make them no longer apply-  go (TUser _ _ l) rhs =-       go l rhs--  -- records won't work here.-  go _ _ =-       mzero---  -- invert the type function to balance the equation, when the variable occurs-  -- on the LHS of the expression `x tf y`-  balanceR x TCAdd y rhs = do guardFin y-                              go x (TCon (TF TCSub) [rhs,y])-  balanceR x TCSub y rhs = go x (TCon (TF TCAdd) [rhs,y])-  balanceR _ _     _ _   = mzero---  -- invert the type function to balance the equation, when the variable occurs-  -- on the RHS of the expression `x tf y`-  balanceL x TCAdd y rhs = do guardFin y-                              go y (TCon (TF TCSub) [rhs,x])-  balanceL x TCSub y rhs = go (TCon (TF TCAdd) [rhs,y]) x-  balanceL _ _     _ _   = mzero---  -- guard that the type is finite-  ---  -- XXX this ignores things like `min x inf` where x is finite, and just-  -- assumes that it won't work.-  guardFin ty = guard (allFin fins ty)
+ src/Cryptol/TypeCheck/Solver/Types.hs view
@@ -0,0 +1,39 @@+module Cryptol.TypeCheck.Solver.Types where++import Data.Map(Map)++import Cryptol.TypeCheck.Type+import Cryptol.TypeCheck.PP+import Cryptol.TypeCheck.Solver.Numeric.Interval++type Ctxt = Map TVar Interval++data Solved = SolvedIf [Prop]           -- ^ Solved, assuming the sub-goals.+            | Unsolved                  -- ^ We could not solve the goal.+            | Unsolvable TCErrorMessage -- ^ The goal can never be solved.+              deriving (Show)+++elseTry :: Solved -> Solved -> Solved+Unsolved `elseTry` x = x+x        `elseTry` _ = x++solveOpts :: [Solved] -> Solved+solveOpts [] = Unsolved+solveOpts (x : xs) = x `elseTry` solveOpts xs++matchThen :: Maybe a -> (a -> Solved) -> Solved+matchThen Nothing _  = Unsolved+matchThen (Just a) f = f a++guarded :: Bool -> Solved -> Solved+guarded True x = x+guarded False _ = Unsolved+++instance PP Solved where+  ppPrec _ res =+    case res of+      SolvedIf ps  -> text "solved" $$ nest 2 (vcat (map pp ps))+      Unsolved     -> text "unsolved"+      Unsolvable e -> text "unsolvable" <> colon <+> text (tcErrorMessage e)
src/Cryptol/TypeCheck/Solver/Utils.hs view
@@ -8,7 +8,8 @@  module Cryptol.TypeCheck.Solver.Utils where -import Cryptol.TypeCheck.AST+import Cryptol.TypeCheck.AST hiding (tMul)+import Cryptol.TypeCheck.SimpType(tAdd,tMul) import Control.Monad(mplus,guard) import Data.Maybe(listToMaybe) @@ -24,10 +25,10 @@             TUser _ _ t -> go t             TCon (TF TCAdd) [t1,t2] ->               do (a,yes) <- go t1-                 return (a, yes .+. t2)+                 return (a, tAdd yes t2)               `mplus`               do (a,yes) <- go t2-                 return (a, t1 .+. yes)+                 return (a, tAdd t1 yes)             TCon _ _    -> [] -- XXX: we could do some distributivity etc  @@ -49,7 +50,7 @@       do (k,t1') <- splitConstSummand t1          case t1' of            TCon (TC (TCNum 0)) [] -> return (k, t2)-           _                      -> return (k, t1' .+. t2)+           _                      -> return (k, tAdd t1' t2)     TCon (TC (TCNum k)) [] -> guard (k > 0) >> return (k, tNum (0::Int))     TCon {}     -> Nothing @@ -65,7 +66,7 @@     TUser _ _ t -> splitConstFactor t     TCon (TF TCMul) [t1,t2] ->       do (k,t1') <- splitConstFactor t1-         return (k, t1' .*. t2)+         return (k, tMul t1' t2)     TCon (TC (TCNum k)) [] -> guard (k > 1) >> return (k, tNum (1::Int))     TCon {}     -> Nothing 
src/Cryptol/TypeCheck/Subst.hs view
@@ -11,8 +11,24 @@ {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE Safe #-}-module Cryptol.TypeCheck.Subst where+module Cryptol.TypeCheck.Subst+  ( Subst+  , emptySubst+  , singleSubst+  , (@@)+  , defaultingSubst+  , listSubst+  , isEmptySubst+  , FVS(..)+  , apSubstMaybe+  , TVars(..)+  , apSubstTypeMapKeys+  , substBinds+  , applySubstToVar+  , substToList+  ) where +import           Data.Maybe import           Data.Either (partitionEithers) import qualified Data.Map.Strict as Map import qualified Data.IntMap as IntMap@@ -22,6 +38,8 @@ import Cryptol.TypeCheck.AST import Cryptol.TypeCheck.PP import Cryptol.TypeCheck.TypeMap+import qualified Cryptol.TypeCheck.SimpType as Simp+import qualified Cryptol.TypeCheck.SimpleSolver as Simp import Cryptol.Utils.Panic(panic) import Cryptol.Utils.Misc(anyJust) @@ -37,16 +55,18 @@ singleSubst x t = S { suMap = Map.singleton x t, suDefaulting = False }  (@@) :: Subst -> Subst -> Subst-s2 @@ s1 | Map.null (suMap s2) =-  if (suDefaulting s1 || not (suDefaulting s2)) then-    s1-  else-    s1{ suDefaulting = True }+s2 @@ s1+  | Map.null (suMap s2) =+    if suDefaulting s1 || not (suDefaulting s2) then+      s1+    else+      s1{ suDefaulting = True }  s2 @@ s1 = S { suMap = Map.map (apSubst s2) (suMap s1) `Map.union` suMap s2              , suDefaulting = suDefaulting s1 || suDefaulting s2              } + defaultingSubst :: Subst -> Subst defaultingSubst s = s { suDefaulting = True } @@ -54,16 +74,23 @@ -- WARNING: We do not validate the list in any way, so the caller should -- ensure that we end up with a valid (e.g., idempotent) substitution. listSubst :: [(TVar,Type)] -> Subst-listSubst xs = S { suMap = Map.fromList xs, suDefaulting = False }+listSubst xs+  | null xs   = emptySubst+  | otherwise = S { suMap = Map.fromList xs, suDefaulting = False }  isEmptySubst :: Subst -> Bool-isEmptySubst su = Map.null (suMap su)+isEmptySubst su = Map.null $ suMap su --- Returns `Nothing` if this is a deaulting substitution-substToList :: Subst -> Maybe [ (TVar, Type) ]-substToList su | suDefaulting su = Nothing-               | otherwise       = Just $ Map.toList $ suMap su+-- Returns the empty set if this is a deaulting substitution+substBinds :: Subst -> Set TVar+substBinds su+  | suDefaulting su = Set.empty+  | otherwise       = Map.keysSet $ suMap su +substToList :: Subst -> [(TVar,Type)]+substToList s+  | suDefaulting s = panic "substToList" ["Defaulting substitution."]+  | otherwise = Map.toList (suMap s)  instance PP (WithNames Subst) where   ppPrec _ (WithNames s mp)@@ -78,53 +105,50 @@   -class FVS t where-  fvs :: t -> Set TVar -instance FVS Type where-  fvs = go-    where-    go ty =-      case ty of-        TCon _ ts   -> Set.unions (map go ts)-        TVar x      -> Set.singleton x-        TUser _ _ t -> go t-        TRec fs     -> Set.unions (map (go . snd) fs)--instance FVS a => FVS [a] where-  fvs xs    = Set.unions (map fvs xs)--instance (FVS a, FVS b) => FVS (a,b) where-  fvs (x,y) = Set.union (fvs x) (fvs y)--instance FVS Schema where-  fvs (Forall as ps t) =-      Set.difference (Set.union (fvs ps) (fvs t)) bound-    where bound = Set.fromList (map tpVar as)-- -- | Apply a substitution.  Returns `Nothing` if nothing changed. apSubstMaybe :: Subst -> Type -> Maybe Type apSubstMaybe su ty =   case ty of-    TCon t ts     -> TCon t `fmap` anyJust (apSubstMaybe su) ts+    TCon t ts ->+      do ss <- anyJust (apSubstMaybe su) ts+         case t of++           TF f ->+             Just $!+             case (f,ss) of+               (TCAdd,[t1,t2])               -> Simp.tAdd t1 t2+               (TCSub,[t1,t2])               -> Simp.tSub t1 t2+               (TCMul,[t1,t2])               -> Simp.tMul t1 t2+               (TCDiv,[t1,t2])               -> Simp.tDiv t1 t2+               (TCMod,[t1,t2])               -> Simp.tMod t1 t2+               (TCExp,[t1,t2])               -> Simp.tExp t1 t2+               (TCMin,[t1,t2])               -> Simp.tMin t1 t2+               (TCMax,[t1,t2])               -> Simp.tMax t1 t2+               (TCWidth,[t1])                -> Simp.tWidth t1+               (TCLenFromThen,[t1,t2,t3])    -> Simp.tLenFromThen t1 t2 t3+               (TCLenFromThenTo,[t1,t2,t3])  -> Simp.tLenFromThenTo t1 t2 t3+               _ -> panic "apSubstMaybe" ["Unexpected type function", show t]++           PC _ ->Just $! Simp.simplify Map.empty (TCon t ss)++           _ -> return (TCon t ss)+     TUser f ts t  -> do t1 <- apSubstMaybe su t                         return (TUser f (map (apSubst su) ts) t1)     TRec fs       -> TRec `fmap` anyJust fld fs       where fld (x,t) = do t1 <- apSubstMaybe su t                            return (x,t1)-    TVar x ->-      case Map.lookup x (suMap su) of-        Just t -> Just $ if suDefaulting su-                            then apSubst (defaultingSubst emptySubst) t-                            else t-        Nothing -> if suDefaulting su-                    then Just (defaultFreeVar x)-                    else Nothing--+    TVar x -> applySubstToVar su x  +applySubstToVar :: Subst -> TVar -> Maybe Type+applySubstToVar su x =+  case Map.lookup x (suMap su) of+    Just t  -> Just t+    Nothing+      | suDefaulting su -> Just $! defaultFreeVar x+      | otherwise       -> Nothing  class TVars t where   apSubst :: Subst -> t -> t      -- ^ replaces free vars@@ -139,18 +163,7 @@   apSubst s (x,y)       = (apSubst s x, apSubst s y)  instance TVars Type where-  apSubst su ty =-    case ty of-      TCon t ts     -> TCon t (apSubst su ts)-      TUser f ts t  -> TUser f (apSubst su ts) (apSubst su t)-      TRec fs       -> TRec [ (x,apSubst su s) | (x,s) <- fs ]-      TVar x-        | Just t    <- Map.lookup x (suMap su) ->-                       if suDefaulting su-                          then apSubst (defaultingSubst emptySubst) t-                          else t-        | suDefaulting su -> defaultFreeVar x-        | otherwise -> ty+  apSubst su ty = fromMaybe ty (apSubstMaybe su ty)  -- | Pick types for unconstrained unification variables. defaultFreeVar :: TVar -> Type@@ -188,7 +201,7 @@      -- partition out variables that have been replaced with more specific types     (vars,tys) = partitionEithers-                 [ case Map.lookup v (suMap su) of+                 [ case applySubstToVar su v of                      Just ty -> Right (ty,a')                      Nothing -> Left  (v, a') @@ -212,21 +225,23 @@  instance TVars Schema where   apSubst su sch@(Forall xs ps t)-    | Set.null captured = Forall xs (apSubst su1 ps) (apSubst su1 t)+    | Set.null captured = Forall xs (apSubst su ps) (apSubst su t)     | otherwise = panic "Cryptol.TypeCheck.Subst.apSubst (Schema)"                     [ "Captured quantified variables:"-                    , "Substitution: " ++ show (brackets (commaSep (map ppBinding $ Map.toList m1)))+                    , "Substitution: " ++ show (brackets (commaSep (map ppBinding su_binds)))                     , "Schema:       " ++ show (pp sch)                     , "Variables:    " ++ show (commaSep (map pp (Set.toList captured)))                     ]     where     ppBinding (v,x) = pp v <+> text ":=" <+> pp x+    captured = Set.fromList (map tpVar xs)+               `Set.intersection`+               subVars+    su_binds = Map.toList $ suMap su     used = fvs sch-    m1   = Map.filterWithKey (\k _ -> k `Set.member` used) (suMap su)-    su1  = S { suMap = m1, suDefaulting = suDefaulting su }--    captured = Set.fromList (map tpVar xs) `Set.intersection`-               fvs (Map.elems m1)+    subVars = Set.unions+                $ map (fvs . applySubstToVar su)+                $ Set.toList used   instance TVars Expr where@@ -240,7 +255,6 @@         ETApp e t     -> ETApp (go e) (apSubst su t)         EProofAbs p e -> EProofAbs (apSubst su p) (go e)         EProofApp e   -> EProofApp (go e)-        ECast e t     -> ECast (go e) (apSubst su t)          EVar {}       -> expr @@ -248,13 +262,13 @@         ERec fs       -> ERec [ (f, go e) | (f,e) <- fs ]         EList es t    -> EList (map go es) (apSubst su t)         ESel e s      -> ESel (go e) s-        EComp t e mss -> EComp (apSubst su t) (go e) (apSubst su mss)+        EComp len t e mss -> EComp (apSubst su len) (apSubst su t) (go e) (apSubst su mss)         EIf e1 e2 e3  -> EIf (go e1) (go e2) (go e3)          EWhere e ds   -> EWhere (go e) (apSubst su ds)  instance TVars Match where-  apSubst su (From x t e) = From x (apSubst su t) (apSubst su e)+  apSubst su (From x len t e) = From x (apSubst su len) (apSubst su t) (apSubst su e)   apSubst su (Let b)      = Let (apSubst su b)  instance TVars DeclGroup where
+ src/Cryptol/TypeCheck/Type.hs view
@@ -0,0 +1,802 @@+{-# Language Safe, DeriveGeneric, DeriveAnyClass, RecordWildCards #-}+{-# Language FlexibleInstances, FlexibleContexts #-}+{-# Language PatternGuards #-}+module Cryptol.TypeCheck.Type+  (module Cryptol.TypeCheck.Type, TFun(..)) where+++import GHC.Generics (Generic)+import Control.DeepSeq++import qualified Data.Map as Map+import qualified Data.IntMap as IntMap+import           Data.Set (Set)+import qualified Data.Set as Set+import           Data.List(sortBy)+import           Data.Ord(comparing)++import Cryptol.Parser.AST ( Selector(..), ppSelector )+import Cryptol.ModuleSystem.Name+import Cryptol.Prims.Syntax+import Cryptol.Utils.Ident (Ident)+import Cryptol.TypeCheck.PP+import Cryptol.TypeCheck.Solver.InfNat+import Cryptol.Utils.Panic(panic)++infix  4 =#=, >==+infixr 5 `tFun`+infixr 5 :->++++-- | Kinds, classify types.+data Kind   = KType+            | KNum+            | KProp+            | Kind :-> Kind+              deriving (Eq, Ord, Show, Generic, NFData)++-- | The types of polymorphic values.+data Schema = Forall { sVars :: [TParam], sProps :: [Prop], sType :: Type }+              deriving (Eq, Show, Generic, NFData)++-- | Type parameters.+data TParam = TParam { tpUnique :: !Int       -- ^ Parameter identifier+                     , tpKind   :: Kind       -- ^ Kind of parameter+                     , tpName   :: Maybe Name -- ^ Name from source, if any.+                     }+              deriving (Show, Generic, NFData)+++-- | The internal representation of types.+-- These are assumed to be kind correct.+data Type   = TCon !TCon ![Type]+              -- ^ Type constant with args++            | TVar TVar+              -- ^ Type variable (free or bound)++            | TUser !Name ![Type] !Type+              {- ^ This is just a type annotation, for a type that+              was written as a type synonym.  It is useful so that we+              can use it to report nicer errors.+              Example: `TUser T ts t` is really just the type `t` that+              was written as `T ts` by the user. -}++            | TRec ![(Ident,Type)]+              -- ^ Record type++              deriving (Show, Generic, NFData)++++-- | Type variables.+data TVar   = TVFree !Int Kind (Set TVar) Doc+              -- ^ Unique, kind, ids of bound type variables that are in scope+              -- The `Doc` is a description of how this type came to be.+++            | TVBound !Int Kind+              deriving (Show, Generic, NFData)+++-- | The type is supposed to be of kind `KProp`+type Prop   = Type+++-- | Type constants.+data TCon   = TC TC | PC PC | TF TFun | TError Kind TCErrorMessage+              deriving (Show, Eq, Ord, Generic, NFData)+++-- | Predicate symbols.+data PC     = PEqual        -- ^ @_ == _@+            | PNeq          -- ^ @_ /= _@+            | PGeq          -- ^ @_ >= _@+            | PFin          -- ^ @fin _@++            -- classes+            | PHas Selector -- ^ @Has sel type field@ does not appear in schemas+            | PArith        -- ^ @Arith _@+            | PCmp          -- ^ @Cmp _@++            | PAnd          -- ^ This is useful when simplifying things in place+            | PTrue         -- ^ Ditto+              deriving (Show, Eq, Ord, Generic, NFData)++-- | 1-1 constants.+data TC     = TCNum Integer            -- ^ Numbers+            | TCInf                    -- ^ Inf+            | TCBit                    -- ^ Bit+            | TCSeq                    -- ^ @[_] _@+            | TCFun                    -- ^ @_ -> _@+            | TCTuple Int              -- ^ @(_, _, _)@+            | TCNewtype UserTC         -- ^ user-defined, @T@+              deriving (Show, Eq, Ord, Generic, NFData)+++data UserTC = UserTC Name Kind+              deriving (Show, Generic, NFData)+++data TCErrorMessage = TCErrorMessage+  { tcErrorMessage :: !String+    -- XXX: Add location?+  } deriving (Show, Eq, Ord, Generic, NFData)+++++-- | Type synonym.+data TySyn  = TySyn { tsName        :: Name       -- ^ Name+                    , tsParams      :: [TParam]   -- ^ Parameters+                    , tsConstraints :: [Prop]     -- ^ Ensure body is OK+                    , tsDef         :: Type       -- ^ Definition+                    }+              deriving (Show, Generic, NFData)++++++-- | Named records+data Newtype  = Newtype { ntName   :: Name+                        , ntParams :: [TParam]+                        , ntConstraints :: [Prop]+                        , ntFields :: [(Ident,Type)]+                        } deriving (Show, Generic, NFData)+++++--------------------------------------------------------------------------------+++class HasKind t where+  kindOf :: t -> Kind++instance HasKind TVar where+  kindOf (TVFree  _ k _ _) = k+  kindOf (TVBound _ k) = k++instance HasKind TCon where+  kindOf (TC tc)      = kindOf tc+  kindOf (PC pc)      = kindOf pc+  kindOf (TF tf)      = kindOf tf+  kindOf (TError k _) = k++instance HasKind UserTC where+  kindOf (UserTC _ k) = k++instance HasKind TC where+  kindOf tcon =+    case tcon of+      TCNum _   -> KNum+      TCInf     -> KNum+      TCBit     -> KType+      TCSeq     -> KNum :-> KType :-> KType+      TCFun     -> KType :-> KType :-> KType+      TCTuple n -> foldr (:->) KType (replicate n KType)+      TCNewtype x -> kindOf x++instance HasKind PC where+  kindOf pc =+    case pc of+      PEqual    -> KNum :-> KNum :-> KProp+      PNeq      -> KNum :-> KNum :-> KProp+      PGeq      -> KNum :-> KNum :-> KProp+      PFin      -> KNum :-> KProp+      PHas _    -> KType :-> KType :-> KProp+      PArith    -> KType :-> KProp+      PCmp      -> KType :-> KProp+      PAnd      -> KProp :-> KProp :-> KProp+      PTrue     -> KProp++instance HasKind TFun where+  kindOf tfun =+    case tfun of+      TCWidth  -> KNum :-> KNum++      TCAdd    -> KNum :-> KNum :-> KNum+      TCSub    -> KNum :-> KNum :-> KNum+      TCMul    -> KNum :-> KNum :-> KNum+      TCDiv    -> KNum :-> KNum :-> KNum+      TCMod    -> KNum :-> KNum :-> KNum+      TCExp    -> KNum :-> KNum :-> KNum+      TCMin    -> KNum :-> KNum :-> KNum+      TCMax    -> KNum :-> KNum :-> KNum++      TCLenFromThen   -> KNum :-> KNum :-> KNum :-> KNum+      TCLenFromThenTo -> KNum :-> KNum :-> KNum :-> KNum++instance HasKind Type where+  kindOf ty =+    case ty of+      TVar a      -> kindOf a+      TCon c ts   -> quickApply (kindOf c) ts+      TUser _ _ t -> kindOf t+      TRec {}     -> KType++instance HasKind TySyn where+  kindOf (TySyn _ as _ t) = foldr (:->) (kindOf t) (map kindOf as)++instance HasKind Newtype where+  kindOf nt = foldr (:->) KType (map kindOf (ntParams nt))++instance HasKind TParam where+  kindOf p = tpKind p++quickApply :: Kind -> [a] -> Kind+quickApply k []               = k+quickApply (_ :-> k) (_ : ts) = quickApply k ts+quickApply k _                = panic "Cryptol.TypeCheck.AST.quickApply"+                                  [ "Applying a non-function kind:", show k ]++kindResult :: Kind -> Kind+kindResult (_ :-> k) = kindResult k+kindResult k         = k++--------------------------------------------------------------------------------++-- Syntactic equality, ignoring type synonyms and record order+instance Eq Type where+  TUser _ _ x == y        = x == y+  x == TUser _ _ y        = y == x++  TCon x xs == TCon y ys  = x == y && xs == ys+  TVar x    == TVar y     = x == y++  TRec xs   == TRec ys    = norm xs == norm ys+    where norm = sortBy (comparing fst)++  _         == _          = False++instance Ord Type where+  compare x0 y0 =+    case (x0,y0) of+      (TUser _ _ t, _)        -> compare t y0+      (_, TUser _ _ t)        -> compare x0 t++      (TVar x, TVar y)        -> compare x y+      (TVar {}, _)            -> LT+      (_, TVar {})            -> GT++      (TCon x xs, TCon y ys)  -> compare (x,xs) (y,ys)+      (TCon {}, _)            -> LT+      (_,TCon {})             -> GT++      (TRec xs, TRec ys)      -> compare (norm xs) (norm ys)+        where norm = sortBy (comparing fst)++++instance Eq TParam where+  x == y = tpUnique x == tpUnique y++instance Ord TParam where+  compare x y = compare (tpUnique x) (tpUnique y)++tpVar :: TParam -> TVar+tpVar p = TVBound (tpUnique p) (tpKind p)++-- | The type is "simple" (i.e., it contains no type functions).+type SType  = Type++++newtypeConType :: Newtype -> Schema+newtypeConType nt =+  Forall as (ntConstraints nt)+    $ TRec (ntFields nt) `tFun` TCon (newtypeTyCon nt) (map (TVar . tpVar) as)+  where+  as = ntParams nt+++++instance Eq UserTC where+  UserTC x _ == UserTC y _ = x == y++instance Ord UserTC where+  compare (UserTC x _) (UserTC y _) = compare x y++instance Eq TVar where+  TVBound x _     == TVBound y _     = x == y+  TVFree  x _ _ _ == TVFree  y _ _ _ = x == y+  _             == _              = False++instance Ord TVar where+  compare (TVFree x _ _ _) (TVFree y _ _ _) = compare x y+  compare (TVFree _ _ _ _) _                = LT+  compare _            (TVFree _ _ _ _)     = GT++  compare (TVBound x _) (TVBound y _)       = compare x y++--------------------------------------------------------------------------------+-- Queries++isFreeTV :: TVar -> Bool+isFreeTV (TVFree {}) = True+isFreeTV _           = False++isBoundTV :: TVar -> Bool+isBoundTV (TVBound {})  = True+isBoundTV _             = False+++tIsError :: Type -> Maybe TCErrorMessage+tIsError ty = case tNoUser ty of+                TCon (TError _ x) _ -> Just x+                _                   -> Nothing++tIsNat' :: Type -> Maybe Nat'+tIsNat' ty =+  case tNoUser ty of+    TCon (TC (TCNum x)) [] -> Just (Nat x)+    TCon (TC TCInf)     [] -> Just Inf+    _                      -> Nothing++tIsNum :: Type -> Maybe Integer+tIsNum ty = do Nat x <- tIsNat' ty+               return x++tIsInf :: Type -> Bool+tIsInf ty = tIsNat' ty == Just Inf++tIsVar :: Type -> Maybe TVar+tIsVar ty = case tNoUser ty of+              TVar x -> Just x+              _      -> Nothing++tIsFun :: Type -> Maybe (Type, Type)+tIsFun ty = case tNoUser ty of+              TCon (TC TCFun) [a, b] -> Just (a, b)+              _                      -> Nothing++tIsSeq :: Type -> Maybe (Type, Type)+tIsSeq ty = case tNoUser ty of+              TCon (TC TCSeq) [n, a] -> Just (n, a)+              _                      -> Nothing++tIsBit :: Type -> Bool+tIsBit ty = case tNoUser ty of+              TCon (TC TCBit) [] -> True+              _                  -> False++tIsTuple :: Type -> Maybe [Type]+tIsTuple ty = case tNoUser ty of+                TCon (TC (TCTuple _)) ts -> Just ts+                _                        -> Nothing++tIsBinFun :: TFun -> Type -> Maybe (Type,Type)+tIsBinFun f ty = case tNoUser ty of+                   TCon (TF g) [a,b] | f == g -> Just (a,b)+                   _                          -> Nothing++-- | Split up repeated occurances of the given binary type-level function.+tSplitFun :: TFun -> Type -> [Type]+tSplitFun f t0 = go t0 []+  where go ty xs = case tIsBinFun f ty of+                     Just (a,b) -> go a (go b xs)+                     Nothing    -> ty : xs+++pIsFin :: Prop -> Maybe Type+pIsFin ty = case tNoUser ty of+              TCon (PC PFin) [t1] -> Just t1+              _                   -> Nothing++pIsGeq :: Prop -> Maybe (Type,Type)+pIsGeq ty = case tNoUser ty of+              TCon (PC PGeq) [t1,t2] -> Just (t1,t2)+              _                      -> Nothing++pIsEq :: Prop -> Maybe (Type,Type)+pIsEq ty = case tNoUser ty of+             TCon (PC PEqual) [t1,t2] -> Just (t1,t2)+             _                        -> Nothing++pIsArith :: Prop -> Maybe Type+pIsArith ty = case tNoUser ty of+                TCon (PC PArith) [t1] -> Just t1+                _                     -> Nothing++pIsCmp :: Prop -> Maybe Type+pIsCmp ty = case tNoUser ty of+              TCon (PC PCmp) [t1] -> Just t1+              _                   -> Nothing++pIsTrue :: Prop -> Bool+pIsTrue ty  = case tNoUser ty of+                TCon (PC PTrue) _ -> True+                _                 -> False++pIsWidth :: Prop -> Maybe Type+pIsWidth ty = case tNoUser ty of+                TCon (TF TCWidth) [t1] -> Just t1+                _                      -> Nothing++--------------------------------------------------------------------------------+++tNum     :: Integral a => a -> Type+tNum n    = TCon (TC (TCNum (fromIntegral n))) []++tZero     :: Type+tZero     = tNum (0 :: Int)++tOne     :: Type+tOne      = tNum (1 :: Int)++tTwo     :: Type+tTwo      = tNum (2 :: Int)++tInf     :: Type+tInf      = TCon (TC TCInf) []++tNat'    :: Nat' -> Type+tNat' n'  = case n' of+              Inf   -> tInf+              Nat n -> tNum n++tBit     :: Type+tBit      = TCon (TC TCBit) []++tWord    :: Type -> Type+tWord a   = tSeq a tBit++tSeq     :: Type -> Type -> Type+tSeq a b  = TCon (TC TCSeq) [a,b]++tChar :: Type+tChar = tWord (tNum (8 :: Int))++tString :: Int -> Type+tString len = tSeq (tNum len) tChar++tRec     :: [(Ident,Type)] -> Type+tRec      = TRec++tTuple   :: [Type] -> Type+tTuple ts = TCon (TC (TCTuple (length ts))) ts++newtypeTyCon :: Newtype -> TCon+newtypeTyCon nt = TC $ TCNewtype $ UserTC (ntName nt) (kindOf nt)+++-- | Make a function type.+tFun     :: Type -> Type -> Type+tFun a b  = TCon (TC TCFun) [a,b]++-- | Eliminate outermost type synonyms.+tNoUser  :: Type -> Type+tNoUser t = case t of+              TUser _ _ a -> tNoUser a+              _           -> t+++--------------------------------------------------------------------------------+-- Construction of type functions++-- | Make a malformed numeric type.+tBadNumber :: TCErrorMessage -> Type+tBadNumber msg = TCon (TError KNum msg) []++tf1 :: TFun -> Type -> Type+tf1 f x = TCon (TF f) [x]++tf2 :: TFun -> Type -> Type -> Type+tf2 f x y = TCon (TF f) [x,y]++tf3 :: TFun -> Type -> Type -> Type -> Type+tf3 f x y z = TCon (TF f) [x,y,z]++{-+tAdd :: Type -> Type -> Type+tAdd x y+  | Just x' <- tIsNum x+  , Just y' <- tIsNum y = error (show x' ++ " + " ++ show y')+  | otherwise = tf2 TCAdd x y+-}++tSub :: Type -> Type -> Type+tSub = tf2 TCSub++tMul :: Type -> Type -> Type+tMul = tf2 TCMul++tDiv :: Type -> Type -> Type+tDiv = tf2 TCDiv++tMod :: Type -> Type -> Type+tMod = tf2 TCMod++tExp :: Type -> Type -> Type+tExp = tf2 TCExp++tMin :: Type -> Type -> Type+tMin = tf2 TCMin++tWidth :: Type -> Type+tWidth = tf1 TCWidth++tLenFromThen :: Type -> Type -> Type -> Type+tLenFromThen = tf3 TCLenFromThen++tLenFromThenTo :: Type -> Type -> Type -> Type+tLenFromThenTo = tf3 TCLenFromThenTo+++++++++--------------------------------------------------------------------------------+-- Construction of constraints.++-- | Equality for numeric types.+(=#=) :: Type -> Type -> Prop+x =#= y = TCon (PC PEqual) [x,y]++(=/=) :: Type -> Type -> Prop+x =/= y = TCon (PC PNeq) [x,y]++pArith :: Type -> Prop+pArith t = TCon (PC PArith) [t]++pCmp :: Type -> Prop+pCmp t = TCon (PC PCmp) [t]++-- | Make a greater-than-or-equal-to constraint.+(>==) :: Type -> Type -> Prop+x >== y = TCon (PC PGeq) [x,y]++-- | A `Has` constraint, used for tuple and record selection.+pHas :: Selector -> Type -> Type -> Prop+pHas l ty fi = TCon (PC (PHas l)) [ty,fi]++pTrue :: Prop+pTrue = TCon (PC PTrue) []++pAnd :: [Prop] -> Prop+pAnd []       = pTrue+pAnd [x]      = x+pAnd (x : xs)+  | Just _ <- tIsError x    = x+  | pIsTrue x               = rest+  | Just _ <- tIsError rest = rest+  | pIsTrue rest            = x+  | otherwise               = TCon (PC PAnd) [x, rest]+  where rest = pAnd xs++pSplitAnd :: Prop -> [Prop]+pSplitAnd p0 = go [p0]+  where+  go [] = []+  go (q : qs) =+    case tNoUser q of+      TCon (PC PAnd) [l,r] -> go (l : r : qs)+      TCon (PC PTrue) _    -> go qs+      _                    -> q : go qs++pFin :: Type -> Prop+pFin ty =+  case tNoUser ty of+    TCon (TC (TCNum _)) _ -> pTrue+    TCon (TC TCInf)     _ -> pError (TCErrorMessage "`inf` is not finite.")+    _                     -> TCon (PC PFin) [ty]++-- | Make a malformed property.+pError :: TCErrorMessage -> Prop+pError msg = TCon (TError KProp msg) []++--------------------------------------------------------------------------------+++class FVS t where+  fvs :: t -> Set TVar++instance FVS Type where+  fvs = go+    where+    go ty =+      case ty of+        TCon _ ts   -> Set.unions (map go ts)+        TVar x      -> Set.singleton x+        TUser _ _ t -> go t+        TRec fs     -> Set.unions (map (go . snd) fs)++instance FVS a => FVS (Maybe a) where+  fvs Nothing  = Set.empty+  fvs (Just x) = fvs x++instance FVS a => FVS [a] where+  fvs xs    = Set.unions (map fvs xs)++instance (FVS a, FVS b) => FVS (a,b) where+  fvs (x,y) = Set.union (fvs x) (fvs y)++instance FVS Schema where+  fvs (Forall as ps t) =+      Set.difference (Set.union (fvs ps) (fvs t)) bound+    where bound = Set.fromList (map tpVar as)++++-- Pretty Printing -------------------------------------------------------------++instance PP TParam where+  ppPrec = ppWithNamesPrec IntMap.empty++instance PP (WithNames TParam) where+  ppPrec _ (WithNames p mp) = ppWithNames mp (tpVar p)++addTNames :: [TParam] -> NameMap -> NameMap+addTNames as ns = foldr (uncurry IntMap.insert) ns+                $ named ++ zip unnamed avail++  where avail   = filter (`notElem` used) (nameList [])+        named   = [ (u,show (pp n))+                          | TParam { tpUnique = u, tpName = Just n } <- as ]+        unnamed = [ u     | TParam { tpUnique = u, tpName = Nothing } <- as ]++        used    = map snd named ++ IntMap.elems ns++ppNewtypeShort :: Newtype -> Doc+ppNewtypeShort nt =+  text "newtype" <+> pp (ntName nt) <+> hsep (map (ppWithNamesPrec nm 9) ps)+  where+  ps  = ntParams nt+  nm = addTNames ps emptyNameMap+++instance PP Schema where+  ppPrec = ppWithNamesPrec IntMap.empty++instance PP (WithNames Schema) where+  ppPrec _ (WithNames s ns) = vars <+> props <+> ppWithNames ns1 (sType s)+    where+    vars = case sVars s of+      [] -> empty+      vs -> braces $ commaSep $ map (ppWithNames ns1) vs++    props = case sProps s of+      [] -> empty+      ps -> parens (commaSep (map (ppWithNames ns1) ps)) <+> text "=>"++    ns1 = addTNames (sVars s) ns++instance PP TySyn where+  ppPrec = ppWithNamesPrec IntMap.empty++instance PP (WithNames TySyn) where+  ppPrec _ (WithNames (TySyn n ps _ ty) ns) =+    text "type" <+> pp n <+> sep (map (ppWithNames ns1) ps) <+> char '='+                <+> ppWithNames ns1 ty+    where ns1 = addTNames ps ns+++instance PP (WithNames Type) where+  ppPrec prec ty0@(WithNames ty nmMap) =+    case ty of+      TVar a  -> ppWithNames nmMap a+      TRec fs -> braces $ fsep $ punctuate comma+                    [ pp l <+> text ":" <+> go 0 t | (l,t) <- fs ]+      TUser c ts _ -> optParens (prec > 3) $ pp c <+> fsep (map (go 4) ts)+      -- TUser _ _ t -> ppPrec prec t -- optParens (prec > 3) $ pp c <+> fsep (map (go 4) ts)++      TCon (TC tc) ts ->+        case (tc,ts) of+          (TCNum n, [])       -> integer n+          (TCInf,   [])       -> text "inf"+          (TCBit,   [])       -> text "Bit"++          (TCSeq,   [t1,TCon (TC TCBit) []]) -> brackets (go 0 t1)+          (TCSeq,   [t1,t2])  -> optParens (prec > 3)+                              $ brackets (go 0 t1) <> go 3 t2++          (TCFun,   [t1,t2])  -> optParens (prec > 1)+                              $ go 2 t1 <+> text "->" <+> go 1 t2++          (TCTuple _, fs)     -> parens $ fsep $ punctuate comma $ map (go 0) fs++          (_, _)              -> pp tc <+> fsep (map (go 4) ts)++      TCon (PC pc) ts ->+        case (pc,ts) of+          (PEqual, [t1,t2])   -> go 0 t1 <+> text "==" <+> go 0 t2+          (PNeq ,  [t1,t2])   -> go 0 t1 <+> text "/=" <+> go 0 t2+          (PGeq,  [t1,t2])    -> go 0 t1 <+> text ">=" <+> go 0 t2+          (PFin,  [t1])       -> text "fin" <+> (go 4 t1)+          (PHas x, [t1,t2])   -> ppSelector x <+> text "of"+                               <+> go 0 t1 <+> text "is" <+> go 0 t2++          (PArith, [t1])      -> pp pc <+> go 4 t1+          (PCmp, [t1])        -> pp pc <+> go 4 t1++          (_, _)              -> pp pc <+> fsep (map (go 4) ts)++      _ | Just tinf <- isTInfix ty0 -> optParens (prec > 2)+                                     $ ppInfix 2 isTInfix tinf++      TCon f ts -> optParens (prec > 3)+                $ pp f <+> fsep (map (go 4) ts)++    where+    go p t = ppWithNamesPrec nmMap p t++    isTInfix (WithNames (TCon (TF ieOp) [ieLeft',ieRight']) _) =+      do let ieLeft  = WithNames ieLeft' nmMap+             ieRight = WithNames ieRight' nmMap+         (ieAssoc,iePrec) <- Map.lookup ieOp tBinOpPrec+         return Infix { .. }+    isTInfix _ = Nothing++++instance PP Kind where+  ppPrec p k = case k of+    KType   -> char '*'+    KNum    -> char '#'+    KProp   -> text "Prop"+    l :-> r -> optParens (p >= 1) (sep [ppPrec 1 l, text "->", ppPrec 0 r])++instance PP (WithNames TVar) where++  ppPrec _ (WithNames (TVBound x _) mp) =+    case IntMap.lookup x mp of+      Just a  -> text a+      Nothing -> text ("a`" ++ show x)++  ppPrec _ (WithNames (TVFree x _ _ _) _) =+    char '?' <> text (intToName x)++instance PP TVar where+  ppPrec = ppWithNamesPrec IntMap.empty+++instance PP Type where+  ppPrec n t = ppWithNamesPrec IntMap.empty n t+++instance PP TCon where+  ppPrec _ (TC tc)        = pp tc+  ppPrec _ (PC tc)        = pp tc+  ppPrec _ (TF tc)        = pp tc+  ppPrec _ (TError _ msg) = pp msg++instance PP TCErrorMessage where+  ppPrec _ tc = parens (text "error:" <+> text (tcErrorMessage tc))++instance PP PC where+  ppPrec _ x =+    case x of+      PEqual    -> text "(==)"+      PNeq      -> text "(/=)"+      PGeq      -> text "(>=)"+      PFin      -> text "fin"+      PHas sel  -> parens (ppSelector sel)+      PArith    -> text "Arith"+      PCmp      -> text "Cmp"+      PTrue     -> text "True"+      PAnd      -> text "(&&)"++instance PP TC where+  ppPrec _ x =+    case x of+      TCNum n   -> integer n+      TCInf     -> text "inf"+      TCBit     -> text "Bit"+      TCSeq     -> text "[]"+      TCFun     -> text "(->)"+      TCTuple 0 -> text "()"+      TCTuple 1 -> text "(one tuple?)"+      TCTuple n -> parens $ hcat $ replicate (n-1) comma+      TCNewtype u -> pp u++instance PP UserTC where+  ppPrec p (UserTC x _) = ppPrec p x++
src/Cryptol/TypeCheck/TypeOf.hs view
@@ -34,13 +34,12 @@     ERec fields   -> tRec [ (name, fastTypeOf tyenv e) | (name, e) <- fields ]     ESel e sel    -> typeSelect (fastTypeOf tyenv e) sel     EIf _ e _     -> fastTypeOf tyenv e-    EComp t _ _   -> t+    EComp len t _ _ -> tSeq len t     EAbs x t e    -> tFun t (fastTypeOf (Map.insert x (Forall [] [] t) tyenv) e)     EApp e _      -> case tIsFun (fastTypeOf tyenv e) of                         Just (_, t) -> t                         Nothing     -> panic "Cryptol.TypeCheck.TypeOf.fastTypeOf"                                          [ "EApp with non-function operator" ]-    ECast _ t     -> t     -- Polymorphic fragment     EVar      {}  -> polymorphic     ETAbs     {}  -> polymorphic@@ -93,16 +92,18 @@     EComp  {}      -> monomorphic     EApp   {}      -> monomorphic     EAbs   {}      -> monomorphic-    ECast  {}      -> monomorphic   where     monomorphic = Forall [] [] (fastTypeOf tyenv expr)  -- | Yields the return type of the selector on the given argument type. typeSelect :: Type -> Selector -> Type typeSelect (TUser _ _ ty) sel = typeSelect ty sel-typeSelect (TCon _tctuple ts) (TupleSel i _) = ts !! i+typeSelect (tIsTuple -> Just ts) (TupleSel i _)+  | i < length ts = ts !! i typeSelect (TRec fields) (RecordSel n _)-     | Just ty <- lookup n fields = ty-typeSelect (TCon _tcseq [_, a]) (ListSel _ _) = a+  | Just ty <- lookup n fields = ty+typeSelect (tIsSeq -> Just (_, a)) ListSel{} = a+typeSelect (tIsSeq -> Just (n, a)) sel@TupleSel{} = tSeq n (typeSelect a sel)+typeSelect (tIsSeq -> Just (n, a)) sel@RecordSel{} = tSeq n (typeSelect a sel) typeSelect ty _ = panic "Cryptol.TypeCheck.TypeOf.typeSelect"                     [ "cannot apply selector to value of type", render (pp ty) ]
+ src/Cryptol/TypeCheck/TypePat.hs view
@@ -0,0 +1,172 @@+module Cryptol.TypeCheck.TypePat+  ( aInf, aNat, aNat'++  , anAdd, (|-|), aMul, (|^|), (|/|), (|%|)+  , aMin, aMax+  , aWidth+  , aLenFromThen, aLenFromThenTo++  , aTVar+  , aBit+  , aSeq+  , aWord+  , aChar+  , aTuple+  , (|->|)++  , aFin, (|=|), (|/=|), (|>=|)+  , aCmp, aArith++  , aAnd+  , aTrue++  , anError++  , module Cryptol.Utils.Patterns+  ) where++import Control.Applicative((<|>))+import Control.Monad+import Cryptol.Utils.Patterns+import Cryptol.TypeCheck.Type+import Cryptol.TypeCheck.Solver.InfNat+++tcon :: TCon -> ([Type] -> a) -> Pat Type a+tcon f p = \ty -> case tNoUser ty of+                    TCon c ts | f == c -> return (p ts)+                    _                  -> mzero++ar0 :: [a] -> ()+ar0 ~[] = ()++ar1 :: [a] -> a+ar1 ~[a] = a++ar2 :: [a] -> (a,a)+ar2 ~[a,b] = (a,b)++ar3 :: [a] -> (a,a,a)+ar3 ~[a,b,c] = (a,b,c)++tf :: TFun -> ([Type] -> a) -> Pat Type a+tf f ar = tcon (TF f) ar++tc :: TC -> ([Type] -> a) -> Pat Type a+tc f ar = tcon (TC f) ar++tp :: PC -> ([Type] -> a) -> Pat Prop a+tp f ar = tcon (PC f) ar+++--------------------------------------------------------------------------------++aInf :: Pat Type ()+aInf = tc TCInf ar0++aNat :: Pat Type Integer+aNat = \a -> case tNoUser a of+               TCon (TC (TCNum n)) _ -> return n+               _                     -> mzero++aNat' :: Pat Type Nat'+aNat' = \a -> (Inf <$  aInf a)+          <|> (Nat <$> aNat a)++anAdd :: Pat Type (Type,Type)+anAdd = tf TCAdd ar2++(|-|) :: Pat Type (Type,Type)+(|-|) = tf TCSub ar2++aMul :: Pat Type (Type,Type)+aMul = tf TCMul ar2++(|^|) :: Pat Type (Type,Type)+(|^|) = tf TCExp ar2++(|/|) :: Pat Type (Type,Type)+(|/|) = tf TCDiv ar2++(|%|) :: Pat Type (Type,Type)+(|%|) = tf TCMod ar2++aMin :: Pat Type (Type,Type)+aMin = tf TCMin ar2++aMax :: Pat Type (Type,Type)+aMax = tf TCMax ar2++aWidth :: Pat Type Type+aWidth = tf TCWidth ar1++aLenFromThen :: Pat Type (Type,Type,Type)+aLenFromThen = tf TCLenFromThen ar3++aLenFromThenTo :: Pat Type (Type,Type,Type)+aLenFromThenTo = tf TCLenFromThenTo ar3++--------------------------------------------------------------------------------+aTVar :: Pat Type TVar+aTVar = \a -> case tNoUser a of+                TVar x -> return x+                _      -> mzero++aBit :: Pat Type ()+aBit = tc TCBit ar0++aSeq :: Pat Type (Type,Type)+aSeq = tc TCSeq ar2++aWord :: Pat Type Type+aWord = \a -> do (l,t) <- aSeq a+                 aBit t+                 return l++aChar :: Pat Type ()+aChar = \a -> do (l,t) <- aSeq a+                 n     <- aNat l+                 guard (n == 8)+                 aBit t++aTuple :: Pat Type [Type]+aTuple = \a -> case tNoUser a of+                 TCon (TC (TCTuple _)) ts -> return ts+                 _                        -> mzero++(|->|) :: Pat Type (Type,Type)+(|->|) = tc TCFun ar2+--------------------------------------------------------------------------------++aFin :: Pat Prop Type+aFin = tp PFin ar1++(|=|) :: Pat Prop (Type,Type)+(|=|) = tp PEqual ar2++(|/=|) :: Pat Prop (Type,Type)+(|/=|) = tp PNeq ar2++(|>=|) :: Pat Prop (Type,Type)+(|>=|) = tp PGeq ar2++aCmp :: Pat Prop Type+aCmp = tp PCmp ar1++aArith :: Pat Prop Type+aArith = tp PArith ar1++aAnd :: Pat Prop (Prop,Prop)+aAnd = tp PAnd ar2++aTrue :: Pat Prop ()+aTrue = tp PTrue ar0++--------------------------------------------------------------------------------+anError :: Kind -> Pat Type TCErrorMessage+anError k = \a -> case tNoUser a of+                    TCon (TError k1 err) _ | k == k1 -> return err+                    _                     -> mzero+++
src/Cryptol/Utils/Ident.hs view
@@ -86,5 +86,8 @@ preludeName :: ModName preludeName  = packModName ["Cryptol"] +preludeExtrasName :: ModName+preludeExtrasName = packModName ["Cryptol", "Extras"]+ interactiveName :: ModName interactiveName  = packModName ["<interactive>"]
+ src/Cryptol/Utils/Patterns.hs view
@@ -0,0 +1,136 @@+{-# Language Safe, RankNTypes, MultiParamTypeClasses #-}+{-# Language FunctionalDependencies #-}+{-# Language FlexibleInstances #-}+{-# Language TypeFamilies, UndecidableInstances #-}+module Cryptol.Utils.Patterns where++import Control.Monad(liftM,liftM2,ap,MonadPlus(..),guard)+import Control.Applicative(Alternative(..))++newtype Match b = Match (forall r. r -> (b -> r) -> r)++instance Functor Match where+  fmap = liftM++instance Applicative Match where+  pure a = Match $ \_no yes -> yes a+  (<*>)  = ap++instance Monad Match where+  fail _ = empty+  Match m >>= f = Match $ \no yes -> m no $ \a ->+                                     let Match n = f a in+                                     n no yes++instance Alternative Match where+  empty = Match $ \no _ -> no+  Match m <|> Match n = Match $ \no yes -> m (n no yes) yes++instance MonadPlus Match where++type Pat a b = a -> Match b+++(|||) :: Pat a b -> Pat a b -> Pat a b+p ||| q = \a -> p a <|> q a++-- | Check that a value satisfies multiple patterns.+-- For example, an "as" pattern is @(__ &&& p)@.+(&&&) :: Pat a b -> Pat a c -> Pat a (b,c)+p &&& q = \a -> liftM2 (,) (p a) (q a)++-- | Match a value, and modify the result.+(~>) :: Pat a b -> (b -> c) -> Pat a c+p ~> f = \a -> f <$> p a++-- | Match a value, and return the given result+(~~>) :: Pat a b -> c -> Pat a c+p ~~> f = \a -> f <$ p a++-- | View pattern.+(<~) :: (a -> b) -> Pat b c -> Pat a c+f <~ p = \a -> p (f a)++-- | Variable pattern.+__ :: Pat a a+__ = return++-- | Constant pattern.+succeed :: a -> Pat x a+succeed = const . return++-- | Predicate pattern+checkThat :: (a -> Bool) -> Pat a ()+checkThat p = \a -> guard (p a)++-- | Check for exact value.+lit :: Eq a => a -> Pat a ()+lit x = checkThat (x ==)+{-# Inline lit #-}+++-- | Match a pattern, using the given default if valure.+matchDefault :: a -> Match a -> a+matchDefault a (Match m) = m a id+{-# Inline matchDefault #-}++-- | Match an irrefutable pattern.  Crashes on faliure.+match :: Match a -> a+match m = matchDefault (error "Pattern match failure.") m+{-# Inline match #-}++matchMaybe :: Match a -> Maybe a+matchMaybe (Match m) = m Nothing Just+++list :: [Pat a b] -> Pat [a] [b]+list [] = \a ->+  case a of+    [] -> return []+    _  -> mzero+list (p : ps) = \as ->+  case as of+    []     -> mzero+    x : xs ->+      do a  <- p x+         bs <- list ps xs+         return (a : bs)+++(><) :: Pat a b -> Pat x y -> Pat (a,x) (b,y)+p >< q = \(a,x) -> do b <- p a+                      y <- q x+                      return (b,y)++class Matches thing pats res | pats -> thing res where+  matches :: thing -> pats -> Match res++instance ( f  ~ Pat a a1'+         , a1 ~ Pat a1' r1+         ) => Matches a (f,a1) r1 where+  matches ty (f,a1) = do a1' <- f ty+                         a1 a1'++instance ( op ~ Pat a (a1',a2')+         , a1 ~ Pat a1' r1+         , a2 ~ Pat a2' r2+         ) => Matches a (op,a1,a2) (r1,r2)+  where+  matches ty (f,a1,a2) = do (a1',a2') <- f ty+                            r1 <- a1 a1'+                            r2 <- a2 a2'+                            return (r1,r2)++instance ( op ~ Pat a (a1',a2',a3')+         , a1 ~ Pat a1' r1+         , a2 ~ Pat a2' r2+         , a3 ~ Pat a3' r3+         ) => Matches a (op,a1,a2,a3) (r1,r2,r3) where+  matches ty (f,a1,a2,a3) = do (a1',a2',a3') <- f ty+                               r1 <- a1 a1'+                               r2 <- a2 a2'+                               r3 <- a3 a3'+                               return (r1,r2,r3)+++